use std::collections::HashMap; use wascc_host::middleware::{InvocationHandler, MiddlewareResponse}; use wascc_host::{Actor, Host, Invocation, InvocationResponse, Middleware, NativeCapability}; #[macro_use] extern crate log; type Result = std::result::Result; fn main() -> std::result::Result<(), Box> { env_logger::init(); let host = Host::new(); host.add_actor(Actor::from_file("./examples/.assets/echo.wasm")?)?; host.add_actor(Actor::from_file("./examples/.assets/echo2.wasm")?)?; host.add_native_capability(NativeCapability::from_file( "./examples/.assets/libwascc_httpsrv.so", None, )?)?; host.add_middleware(CachingMiddleware::default()); host.add_middleware(LoggingMiddleware::default()); host.set_binding( "MB4OLDIC3TCZ4Q4TGGOVAZC43VXFE2JQVRAXQMQFXUCREOOFEKOKZTY2", "wascc:http_server", None, generate_port_config(8081), )?; host.set_binding( "MDFD7XZ5KBOPLPHQKHJEMPR54XIW6RAG5D7NNKN22NP7NSEWNTJZP7JN", "wascc:http_server", None, generate_port_config(8082), )?; std::thread::park(); Ok(()) } fn generate_port_config(port: u16) -> HashMap { let mut hm = HashMap::new(); hm.insert("PORT".to_string(), port.to_string()); hm } #[derive(Default)] struct CachingMiddleware {} impl Middleware for CachingMiddleware { fn actor_pre_invoke(&self, inv: Invocation) -> wascc_host::Result { info!("CachingMiddleware-ACTOR(PRE): {}", inv.operation); Ok(inv) } fn actor_invoke( &self, inv: Invocation, _handler: InvocationHandler, ) -> Result { info!("CachingMiddleware-ACTOR(INV): cached response returned, execution halted"); Ok(MiddlewareResponse::Halt(InvocationResponse::success( &inv, "cached actor response".as_bytes().to_vec(), ))) } fn actor_post_invoke( &self, response: InvocationResponse, ) -> wascc_host::Result { info!( "CachingMiddleware-ACTOR(POST): success: {}", response.error.is_none() ); Ok(response) } fn capability_pre_invoke(&self, inv: Invocation) -> wascc_host::Result { info!("CachingMiddleware-CAP(PRE): {}", inv.operation); Ok(inv) } fn capability_invoke( &self, inv: Invocation, _handler: InvocationHandler, ) -> Result { info!("CachingMiddleware-CAP(INV): cached response returned, execution halted"); Ok(MiddlewareResponse::Halt(InvocationResponse::success( &inv, "cached capability response".as_bytes().to_vec(), ))) } fn capability_post_invoke( &self, response: InvocationResponse, ) -> wascc_host::Result { info!( "CachingMiddleware-CAP(POST): success: {}", response.error.is_none() ); Ok(response) } } #[derive(Default)] struct LoggingMiddleware {} impl Middleware for LoggingMiddleware { fn actor_pre_invoke(&self, inv: Invocation) -> wascc_host::Result { info!("LoggingMiddleware-ACTOR(PRE): {}", inv.operation); Ok(inv) } fn actor_invoke( &self, inv: Invocation, handler: InvocationHandler, ) -> Result { // Will not be invoked since the 'CachingMiddleware' halts the middleware execution info!("LoggingMiddleware-ACTOR(INV): {}", inv.operation); Ok(MiddlewareResponse::Continue(handler.invoke(inv))) } fn actor_post_invoke( &self, response: InvocationResponse, ) -> wascc_host::Result { info!( "LoggingMiddleware-ACTOR(POST): success: {}", response.error.is_none() ); Ok(response) } fn capability_pre_invoke(&self, inv: Invocation) -> wascc_host::Result { info!("LoggingMiddleware-CAP(PRE): {}", inv.operation); Ok(inv) } fn capability_invoke( &self, inv: Invocation, handler: InvocationHandler, ) -> Result { // Will not be invoked since the 'CachingMiddleware' halts the middleware execution info!("LoggingMiddleware-CAP(INV): {}", inv.operation); Ok(MiddlewareResponse::Continue(handler.invoke(inv))) } fn capability_post_invoke( &self, response: InvocationResponse, ) -> wascc_host::Result { info!( "LoggingMiddleware-CAP(POST): success: {}", response.error.is_none() ); Ok(response) } }