feat(runtime): add resident Wasmtime actor runtime

- define versioned service and clock WIT contracts\n- enforce import allowlists, fuel, epoch, memory, I/O, and mailbox limits\n- keep one Store and Component Instance resident per serial Actor\n- add echo, counter, fault, spin, and capability probe components\n- cover lifecycle, concurrency, sandbox, and fault recovery behavior
This commit is contained in:
Maofeng
2026-07-27 04:59:33 +08:00
parent 892fc96f71
commit b63cf8c9eb
41 changed files with 3240 additions and 18 deletions
+16
View File
@@ -0,0 +1,16 @@
[package]
name = "spin-component"
version = "0.1.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
[package.metadata.wasmeld]
id = "spin"
world = "component:spin/spin-component@0.1.0"
[lib]
crate-type = ["cdylib"]
[dependencies]
wit-bindgen.workspace = true
+43
View File
@@ -0,0 +1,43 @@
mod bindings {
wit_bindgen::generate!({
path: "wit",
world: "spin-component",
});
}
static mut SPIN_STATE: u64 = 0;
struct Spin;
impl bindings::Guest for Spin {
fn init(config: Vec<u8>) -> Result<(), bindings::ServiceError> {
if config == b"spin" {
burn(u64::MAX);
}
Ok(())
}
fn invoke(input: Vec<u8>) -> Result<Vec<u8>, bindings::ServiceError> {
let steps = input
.get(..size_of::<u64>())
.and_then(|bytes| bytes.try_into().ok())
.map(u64::from_le_bytes)
.unwrap_or_default();
burn(steps);
Ok(Vec::new())
}
}
// The volatile write makes every loop iteration observable to the optimizer.
fn burn(steps: u64) {
let mut state = unsafe { core::ptr::read_volatile(&raw const SPIN_STATE) };
for _ in 0..steps {
state = state.rotate_left(7).wrapping_add(0x9e37_79b9_7f4a_7c15);
unsafe { core::ptr::write_volatile(&raw mut SPIN_STATE, state) };
}
}
bindings::export!(Spin with_types_in bindings);
+7
View File
@@ -0,0 +1,7 @@
schema_version = 1
[dependencies]
"wasmeld:service" = "0.1.0"
[replace."wasmeld:service"]
path = "../../wit/service"
+8
View File
@@ -0,0 +1,8 @@
schema_version = 1
[[package]]
name = "wasmeld:service"
version = "0.1.0"
source = "path+../../wit/service"
sha256 = "d5497307bbcd1e159f7707f385b488a6f2e26362d5256d5bc1080ac603a51305"
replaced = true
+5
View File
@@ -0,0 +1,5 @@
package component:spin@0.1.0;
world spin-component {
include wasmeld:service/service-component@0.1.0;
}