From 5ff946af8f96de15e28a88ac984eb3879d594875 Mon Sep 17 00:00:00 2001 From: didier amyot Date: Sat, 11 Feb 2023 08:54:54 -0500 Subject: [PATCH] Added channel and worker. --- Cargo.lock | 36 ++++++++++ Cargo.toml | 1 + .../partials/actions/create_user.html | 17 +++-- src/webui/mod.rs | 67 ++++++++++--------- src/webui/views.rs | 2 + 5 files changed, 85 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 076f985..9991f62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -353,6 +353,17 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" +[[package]] +name = "async-channel" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + [[package]] name = "async-trait" version = "0.1.63" @@ -529,6 +540,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "concurrent-queue" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -564,6 +584,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -643,6 +672,7 @@ dependencies = [ "actix-web", "actix-web-lab", "apache-avro", + "async-channel", "clap", "clap-verbosity-flag", "fraction", @@ -664,6 +694,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fallible-iterator" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 6db9a5d..da5930e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ actix-web-lab = "0.18.9" minijinja-autoreload = "0.30.2" futures = "0.3.26" actix-files = "0.6.2" +async-channel = "1.8.0" [dependencies.apache-avro] version = "0.14.0" diff --git a/resources/templates/partials/actions/create_user.html b/resources/templates/partials/actions/create_user.html index 0df37e0..ecb83a4 100644 --- a/resources/templates/partials/actions/create_user.html +++ b/resources/templates/partials/actions/create_user.html @@ -1,10 +1,15 @@
- - + +
+ +
+
{%include "partials/actions/submit_button.html"%} diff --git a/src/webui/mod.rs b/src/webui/mod.rs index 09da31c..1d73635 100644 --- a/src/webui/mod.rs +++ b/src/webui/mod.rs @@ -1,29 +1,28 @@ #![feature(future_join)] +use std::{collections::HashMap, env, fs, io, path::PathBuf}; +use std::io::{Error, ErrorKind}; +use std::path::Path; + +use actix_files; +use actix_utils::future::{ready, Ready}; +use actix_web::{ + App, + dev::ServiceResponse, + error, + FromRequest, + http::{header::ContentType, StatusCode}, HttpRequest, HttpResponse, HttpServer, middleware::{ErrorHandlerResponse, ErrorHandlers, Logger}, Responder, Result, web, +}; +use actix_web_lab::respond::Html; +use async_channel; +use futures::{FutureExt, pin_mut, select}; +use minijinja; +use minijinja_autoreload::AutoReloader; +use tokio::time::{Duration, sleep}; + mod views; mod config; -use actix_utils::future::{ready, Ready}; -use minijinja; -use minijinja_autoreload::AutoReloader; -use std::io::{Error, ErrorKind}; -use std::path::Path; -use std::{collections::HashMap, env, fs, io, path::PathBuf}; -use tokio::time::{sleep, Duration}; -use futures::{pin_mut, select, FutureExt}; -use actix_files; - - - -use actix_web::{ - dev::ServiceResponse, - error, - http::{header::ContentType, StatusCode}, - middleware::{ErrorHandlerResponse, ErrorHandlers, Logger}, - web, App, FromRequest, HttpRequest, HttpResponse, HttpServer, Responder, Result, -}; -use actix_web_lab::respond::Html; - struct MiniJinjaRenderer { tmpl_env: web::Data, } @@ -62,12 +61,16 @@ impl FromRequest for MiniJinjaRenderer { } } -async fn print_shit() -> std::io::Result<()>{ - let mut i = 0; +async fn worker_loop(r: async_channel::Receiver) -> io::Result<()> { loop { - sleep(Duration::from_millis(10_000)).await; - println!("Loop on a different thread {:?}", i); - i +=1; + let x = r.recv().await; + match x { + Ok(v) => println!("Processed value: {:?}", v), + Err(e) => { + println!("Error: {:?}", e); + return Ok(()) + } + } } } @@ -88,16 +91,16 @@ pub async fn web_ui_main(port: u16, enable_template_autoreload: bool) -> std::io Ok(env) }); + let (s, r) = async_channel::unbounded::(); + let tmpl_reloader = web::Data::new(tmpl_reloader); let server = HttpServer::new(move || { App::new() .app_data(tmpl_reloader.clone()) - .service( - actix_files::Files::new("/static", "./resources/static/") - .show_files_listing() - .use_last_modified(true), - ) + .app_data(web::Data::new(s.clone())) + .service(actix_files::Files::new("/static", "./resources/static/") + .use_last_modified(true)) .service(views::index) .service(views::actions) .service(views::overview) @@ -111,7 +114,7 @@ pub async fn web_ui_main(port: u16, enable_template_autoreload: bool) -> std::io .bind(("0.0.0.0", port))?; let t1 = server.run().fuse(); - let t2 = print_shit().fuse(); + let t2 = worker_loop(r).fuse(); pin_mut!(t1, t2); select!{ diff --git a/src/webui/views.rs b/src/webui/views.rs index 36e71ff..86047a4 100644 --- a/src/webui/views.rs +++ b/src/webui/views.rs @@ -84,10 +84,12 @@ struct CreateEventPayload { pub async fn push_event( req: HttpRequest, tmpl_env: MiniJinjaRenderer, + event_channel: web::Data>, web::Json(form): web::Json, ) -> actix_web::Result { let shit = req.match_info().get("event_type").unwrap(); println!("payload: {:?}", form); + let _ = event_channel.send(56).await; let ctx = context! { event_type => shit, };