wascc-host 0.14.0

WebAssembly Secure Capabilities Connector (waSCC) Host Runtime
Documentation
use std::io::{Read, Write};
use std::{collections::HashMap, error::Error};
use wascc_host::{Actor, Host, NativeCapability};

pub fn get_hello_actor() -> Result<Actor, Box<dyn Error>> {
    Actor::from_file("./examples/.assets/echo.wasm").map_err(|e| e.into())
}

pub fn get_hello2_actor() -> Result<Actor, Box<dyn Error>> {
    Actor::from_file("./examples/.assets/echo2.wasm").map_err(|e| e.into())
}

pub fn gen_stock_host(first_port: u16) -> Result<Host, Box<dyn Error>> {
    let host = Host::new();
    host.add_actor(get_hello_actor()?)?;
    host.add_actor(get_hello2_actor()?)?;
    host.add_native_capability(NativeCapability::from_file(
        "./examples/.assets/libwascc_httpsrv.so",
        Some("stockhost".to_string()),
    )?)?;

    host.set_binding(
        "MDFD7XZ5KBOPLPHQKHJEMPR54XIW6RAG5D7NNKN22NP7NSEWNTJZP7JN",
        "wascc:http_server",
        Some("stockhost".to_string()),
        generate_port_config(first_port),
    )?;

    host.set_binding(
        "MB4OLDIC3TCZ4Q4TGGOVAZC43VXFE2JQVRAXQMQFXUCREOOFEKOKZTY2",
        "wascc:http_server",
        Some("stockhost".to_string()),
        generate_port_config(first_port + 1),
    )?;

    Ok(host)
}

pub fn gen_kvcounter_host(port: u16, host: Host) -> Result<Host, Box<dyn Error>> {
    host.add_actor(Actor::from_file("./examples/.assets/kvcounter.wasm")?)?;
    host.add_native_capability(NativeCapability::from_file(
        "./examples/.assets/libwascc_httpsrv.so",
        None,
    )?)?;
    host.add_native_capability(NativeCapability::from_file(
        "./examples/.assets/libwascc_redis.so",
        None,
    )?)?;

    host.set_binding(
        "MASCXFM4R6X63UD5MSCDZYCJNPBVSIU6RKMXUPXRKAOSBQ6UY3VT3NPZ",
        "wascc:keyvalue",
        None,
        redis_config(),
    )?;
    host.set_binding(
        "MASCXFM4R6X63UD5MSCDZYCJNPBVSIU6RKMXUPXRKAOSBQ6UY3VT3NPZ",
        "wascc:http_server",
        None,
        generate_port_config(port),
    )?;

    Ok(host)
}

pub fn redis_config() -> HashMap<String, String> {
    let mut hm = HashMap::new();
    hm.insert("URL".to_string(), "redis://127.0.0.1:6379".to_string());

    hm
}

pub fn empty_config() -> HashMap<String, String> {
    HashMap::new()
}

pub fn generate_port_config(port: u16) -> HashMap<String, String> {
    let mut hm = HashMap::new();
    hm.insert("PORT".to_string(), port.to_string());

    hm
}

pub fn generate_resigned_actor(bytes: &[u8]) -> Result<Actor, Box<dyn Error>> {
    use wascap::prelude::*;

    let (issuer, module) = (KeyPair::new_account(), KeyPair::new_module());
    let claims = ClaimsBuilder::<Actor>::new()
        .issuer(&issuer.public_key())
        .subject(&module.public_key())
        .with_metadata(Actor {
            name: Some("test".to_string()),
            caps: Some(vec![
                caps::HTTP_SERVER.to_string(),
                caps::KEY_VALUE.to_string(),
            ]),
            ..Default::default()
        })
        .build();
    let embedded = wasm::embed_claims(&bytes, &claims, &issuer)?;

    Ok(wascc_host::Actor::from_slice(&embedded)?)
}