Skip to content

Commit c588414

Browse files
authored
Support wasm32-wasip2 (#44)
* Support wasm32-wasip2 * Fix random unit test
1 parent b12ca7b commit c588414

File tree

13 files changed

+1345
-710
lines changed

13 files changed

+1345
-710
lines changed

app/Cargo.lock

+1,215-603
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/Cargo.toml

+17-16
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,34 @@ license-file = "LICENSE"
1010
common = { path = "../common" }
1111

1212
# General
13-
anyhow = "1.0.68"
14-
tokio = { version = "1.28.1", features = ["full"] }
13+
anyhow = "1.0.89"
14+
tokio = { version = "1.40.0", features = ["full"] }
1515

1616
# Widgets
17-
openssl = { version = "0.10", features = ["vendored"] }
18-
async-trait = "0.1.58"
19-
futures = "0.3.25"
20-
wasmtime = { version = "12.0.1", features = ["component-model"] }
21-
log = "0.4.17"
22-
simple_logger = "4.1.0"
23-
reqwest = { version = "0.11.16", features = ["blocking", "json"] }
24-
serde_json = "1.0.96"
17+
openssl = { version = "0.10.67", features = ["vendored"] }
18+
async-trait = "0.1.83"
19+
futures = "0.3.31"
20+
wasmtime = { version = "27.0.0", features = ["component-model"] }
21+
wasmtime-wasi = "27.0.0"
22+
log = "0.4.22"
23+
simple_logger = "5.0.0"
24+
reqwest = { version = "0.12.8", features = ["blocking", "json"] }
25+
serde_json = "1.0.128"
2526
bincode = "1.3.3"
2627
rand = "0.8.5"
2728

2829
# Rendering
2930
cursive = { git = "https://github.com/gyscos/cursive", features = [
3031
"termion-backend",
3132
], default-features = false }
32-
hostname = "0.3.1"
33+
hostname = "0.4.0"
3334

3435
# Server
35-
time = { version = "0.3.17", features = ["serde-well-known"] }
36-
rocket = { version = "0.5.0-rc.3", features = ["json"] }
37-
serde = { version = "1.0", features = ["derive"] }
38-
rust-embed = { version = "8.0.0", features = ["include-exclude"] }
36+
time = { version = "0.3.36", features = ["serde-well-known"] }
37+
rocket = { version = "0.5.1", features = ["json"] }
38+
serde = { version = "1.0.210", features = ["derive"] }
39+
rust-embed = { version = "8.5.0", features = ["include-exclude"] }
3940

4041
# Persistence
4142
sled = "0.34.7"
42-
lazy_static = "1.4.0"
43+
lazy_static = "1.5.0"

app/src/server/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ async fn install_widget(action: json::Json<InstallAction>) -> Result<(), Custom<
6868
Err(err) => {
6969
let err = format!(
7070
"Could not install widget from URL {}: {}",
71-
download_url,
72-
err.root_cause()
71+
download_url, err
7372
);
7473
log::error!("{}", err);
7574
Err(Custom(rocket::http::Status::InternalServerError, err))

app/src/widgets/host_api/clocks.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ use crate::widgets::running::runtime::widget::widget::clocks;
44
use crate::widgets::running::runtime::WidgetState;
55

66
impl clocks::Host for WidgetState {
7-
fn now(&mut self) -> wasmtime::Result<clocks::Datetime> {
7+
fn now(&mut self) -> clocks::Datetime {
88
let now = std::time::SystemTime::now();
99
let now = now.duration_since(UNIX_EPOCH).unwrap();
10-
Ok(clocks::Datetime {
10+
clocks::Datetime {
1111
seconds: now.as_secs(),
1212
nanoseconds: now.subsec_nanos(),
13-
})
13+
}
1414
}
1515
}

app/src/widgets/host_api/http.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ impl http::Host for WidgetState {
77
method: http::Method,
88
url: String,
99
body: Option<Vec<u8>>,
10-
) -> wasmtime::Result<Result<http::Response, ()>> {
10+
) -> Result<http::Response, ()> {
1111
let client = reqwest::blocking::Client::new();
1212
let response = match method {
1313
http::Method::Get => client.get(url).send(),
@@ -23,12 +23,15 @@ impl http::Host for WidgetState {
2323
http::Method::Delete => client.delete(url).send(),
2424
};
2525
match response {
26-
Ok(response) => Ok(Ok(http::Response {
26+
Ok(response) => Ok(http::Response {
2727
content_length: response.content_length(),
2828
status: response.status().as_u16(),
29-
bytes: response.bytes()?.to_vec(),
30-
})),
31-
Err(_) => Ok(Err(())),
29+
bytes: match response.bytes() {
30+
Ok(bytes) => bytes.to_vec(),
31+
Err(_) => Vec::new(),
32+
},
33+
}),
34+
Err(_) => Err(()),
3235
}
3336
}
3437
}

app/src/widgets/host_api/logging.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@ impl logging::Host for WidgetState {
77
level: logging::Level,
88
context: String,
99
message: String,
10-
) -> wasmtime::Result<()> {
10+
) {
1111
const PREFIX: &str = "WIDGET";
1212
match level {
1313
logging::Level::Debug => log::debug!("{}: {}: {}", PREFIX, context, message),
1414
logging::Level::Info => log::info!("{}: {}: {}", PREFIX, context, message),
1515
logging::Level::Warn => log::warn!("{}: {}: {}", PREFIX, context, message),
1616
logging::Level::Error => log::error!("{}: {}: {}", PREFIX, context, message),
1717
}
18-
Ok(())
1918
}
2019
}

app/src/widgets/host_api/random.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,24 @@ use crate::widgets::running::runtime::widget::widget::random;
22
use crate::widgets::running::runtime::WidgetState;
33
use rand::prelude::*;
44

5+
fn get_random() -> u64 {
6+
let mut rng = thread_rng();
7+
rng.next_u64()
8+
}
9+
510
impl random::Host for WidgetState {
6-
fn get_random(&mut self) -> wasmtime::Result<u64> {
7-
let mut rng = thread_rng();
8-
Ok(rng.next_u64())
11+
fn get_random(&mut self) -> u64 {
12+
get_random()
913
}
1014
}
1115

1216
#[cfg(test)]
1317
mod tests {
1418
use super::*;
15-
use crate::widgets::running::runtime::widget::widget::random::Host;
1619

1720
#[test]
1821
fn test_get_random() {
19-
let mut widget_state = WidgetState {};
20-
let result = widget_state.get_random().unwrap();
22+
let result = get_random();
2123
assert!(result > 0);
2224
}
2325
}

app/src/widgets/running/runtime.rs

+20-5
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,28 @@ use wasmtime::{
1111
component::{Component, Linker},
1212
Config, Engine, Store,
1313
};
14+
use wasmtime_wasi::{ResourceTable, WasiCtx, WasiCtxBuilder, WasiView};
1415

1516
use crate::widgets::running::runtime::widget::widget::clocks::Datetime;
1617
use crate::widgets::utils::logging::LOGGING_PREFIX;
1718

18-
wasmtime::component::bindgen!({ path: "../wg_display_widget_wit/wit", world: "widget" });
19+
wasmtime::component::bindgen!({ path: "../wg_display_widget_wit/wit" });
1920

2021
#[derive(Serialize, Deserialize, PartialEq, Debug)]
2122
pub struct CompiledWidget {
2223
pub data: Vec<u8>,
2324
compatibility_hash: u64,
2425
}
2526

26-
pub struct WidgetState;
27+
pub struct WidgetState {
28+
ctx: WasiCtx,
29+
table: ResourceTable,
30+
}
31+
32+
impl WasiView for WidgetState {
33+
fn ctx(&mut self) -> &mut WasiCtx { &mut self.ctx }
34+
fn table(&mut self) -> &mut ResourceTable { &mut self.table }
35+
}
2736

2837
pub struct Runtime {
2938
engine: Engine,
@@ -38,8 +47,14 @@ impl Runtime {
3847
Config::wasm_component_model(&mut config, true);
3948

4049
let engine = Engine::new(&config).expect("Could not create engine");
41-
let store = Store::new(&engine, WidgetState {});
42-
let mut linker = Linker::new(&engine);
50+
let mut linker = Linker::<WidgetState>::new(&engine);
51+
wasmtime_wasi::add_to_linker_sync(&mut linker).expect("Could not link WASI functions");
52+
let mut builder = WasiCtxBuilder::new();
53+
let state = WidgetState {
54+
ctx: builder.build(),
55+
table: ResourceTable::new(),
56+
};
57+
let store = Store::new(&engine, state);
4358
Widget::add_to_linker(&mut linker, |state: &mut WidgetState| state)
4459
.expect("Could not link host API");
4560

@@ -87,7 +102,7 @@ impl Runtime {
87102
// https://docs.rs/wasmtime/9.0.2/wasmtime/component/struct.Component.html#method.deserialize
88103
let start = std::time::Instant::now();
89104
let component = unsafe { Component::deserialize(&self.engine, &widget.data) }?;
90-
let (widget, _) = Widget::instantiate(&mut self.store, &component, &self.linker)?;
105+
let widget = Widget::instantiate(&mut self.store, &component, &self.linker)?;
91106
let duration = start.elapsed();
92107
log::info!(
93108
"{}: Deserialized and instantiated widget in {} ms",

0 commit comments

Comments
 (0)