#worker #wasi #yew #agent

wasi-worker-yew

WASM/WASI browser service worker for yew (Agent<Reach=Public>)

5 releases

0.5.2 Feb 7, 2020
0.5.1 Feb 7, 2020
0.5.0 Feb 7, 2020
0.4.1 Nov 18, 2019
0.4.0 Nov 18, 2019

#122 in #agent

MIT/Apache

23KB
231 lines

Yew worker compiled to wasm32-wasi

This library allows to compile and deploy yew worker with wasm32-wasi target. It allows to compile and run POSIX-like applications, having access to timer, random numbers and to emulated file system (memfs).

On some operations wasi workers run faster than wasm-bindgen or stdweb.

Example usage:

In your Cargo.toml

wasi-worker-yew = "0.4"

In src/bin/worker.rs

use wasi_worker_yew::{ThreadedWASI, WASIAgent};
use yew::agent::*;
use wasi_worker::{FileOptions, ServiceOptions, ServiceWorker};

pub struct MyAgent;
impl Agent for MyAgent {
    type Reach = Public;
    type Message = String;
    type Input = String;
    type Output = String;
    fn create(_link: AgentLink<Self>) -> Self { MyAgent { } }
    fn update(&mut self, _msg: Self::Message) { /* ... */ }
    fn handle(&mut self, _msg: Self::Input, _who: HandlerId) { /* */ }
    fn name_of_resource() -> &'static str {
        "worker.js"
    }
};

fn main() {
  let opt = ServiceOptions::default().with_cleanup();
  ServiceWorker::initialize(opt)
    .expect("ServiceWorker::initialize");
  ServiceWorker::set_message_handler(Box::new(WASIAgent::<MyAgent>::new()));
}

Deploy

To simplify build and deploy you may use wasi-worker-cli:

cargo install wasi-worker-cli --force

Deployment script will place compiled and optimized worker target and JS glue code under ./dist:

wasiworker deploy

Dependencies

~4–6.5MB
~122K SLoC