From 794f6c222510607c5f377b6d35001313f1ddbd6c Mon Sep 17 00:00:00 2001 From: Marco Allegretti Date: Thu, 12 Mar 2026 15:31:20 +0100 Subject: [PATCH] feat(examples): add counter and notes demo apps - examples/org.weft.demo.counter: stateless counter Wasm component using weft:app/ipc for increment/decrement/reset; built for wasm32-wasip2 with wit-bindgen 0.53; dark-themed HTML UI - examples/org.weft.demo.notes: persistent notes Wasm component using weft:app/ipc + WASI preopened /data dir (fs:rw:app-data); save/load via newline-delimited IPC protocol; HTML textarea UI - examples/keys/: committed demo Ed25519 keypair; both packages signed with weft-pack sign - workspace Cargo.toml: exclude examples from workspace members (they target wasm32-wasip2, not the host toolchain) - SERVO_PIN.md: update deps section and document shell-client display sharing resolved in full description of connect_with_display implementation --- Cargo.toml | 4 + crates/weft-servo-shell/SERVO_PIN.md | 34 +- examples/keys/weft-sign.key | 1 + examples/keys/weft-sign.pub | 1 + .../org.weft.demo.counter/.cargo/config.toml | 2 + examples/org.weft.demo.counter/Cargo.lock | 321 ++++++++++++++++++ examples/org.weft.demo.counter/Cargo.toml | 17 + examples/org.weft.demo.counter/app.wasm | Bin 0 -> 54056 bytes examples/org.weft.demo.counter/signature.sig | 1 + examples/org.weft.demo.counter/src/main.rs | 42 +++ examples/org.weft.demo.counter/ui/index.html | 144 ++++++++ examples/org.weft.demo.counter/wapp.toml | 12 + .../wit/deps/weft-app/weft-app.wit | 38 +++ examples/org.weft.demo.counter/wit/world.wit | 6 + .../org.weft.demo.notes/.cargo/config.toml | 2 + examples/org.weft.demo.notes/Cargo.lock | 321 ++++++++++++++++++ examples/org.weft.demo.notes/Cargo.toml | 17 + examples/org.weft.demo.notes/app.wasm | Bin 0 -> 107705 bytes examples/org.weft.demo.notes/signature.sig | 1 + examples/org.weft.demo.notes/src/main.rs | 59 ++++ examples/org.weft.demo.notes/ui/index.html | 164 +++++++++ examples/org.weft.demo.notes/wapp.toml | 13 + .../wit/deps/weft-app/weft-app.wit | 38 +++ examples/org.weft.demo.notes/wit/world.wit | 6 + 24 files changed, 1227 insertions(+), 17 deletions(-) create mode 100644 examples/keys/weft-sign.key create mode 100644 examples/keys/weft-sign.pub create mode 100644 examples/org.weft.demo.counter/.cargo/config.toml create mode 100644 examples/org.weft.demo.counter/Cargo.lock create mode 100644 examples/org.weft.demo.counter/Cargo.toml create mode 100644 examples/org.weft.demo.counter/app.wasm create mode 100644 examples/org.weft.demo.counter/signature.sig create mode 100644 examples/org.weft.demo.counter/src/main.rs create mode 100644 examples/org.weft.demo.counter/ui/index.html create mode 100644 examples/org.weft.demo.counter/wapp.toml create mode 100644 examples/org.weft.demo.counter/wit/deps/weft-app/weft-app.wit create mode 100644 examples/org.weft.demo.counter/wit/world.wit create mode 100644 examples/org.weft.demo.notes/.cargo/config.toml create mode 100644 examples/org.weft.demo.notes/Cargo.lock create mode 100644 examples/org.weft.demo.notes/Cargo.toml create mode 100644 examples/org.weft.demo.notes/app.wasm create mode 100644 examples/org.weft.demo.notes/signature.sig create mode 100644 examples/org.weft.demo.notes/src/main.rs create mode 100644 examples/org.weft.demo.notes/ui/index.html create mode 100644 examples/org.weft.demo.notes/wapp.toml create mode 100644 examples/org.weft.demo.notes/wit/deps/weft-app/weft-app.wit create mode 100644 examples/org.weft.demo.notes/wit/world.wit diff --git a/Cargo.toml b/Cargo.toml index afae137..e8cfff7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,10 @@ members = [ "crates/weft-runtime", "crates/weft-servo-shell", ] +exclude = [ + "examples/org.weft.demo.counter", + "examples/org.weft.demo.notes", +] resolver = "2" [workspace.package] diff --git a/crates/weft-servo-shell/SERVO_PIN.md b/crates/weft-servo-shell/SERVO_PIN.md index 0b527b3..c5511a2 100644 --- a/crates/weft-servo-shell/SERVO_PIN.md +++ b/crates/weft-servo-shell/SERVO_PIN.md @@ -10,12 +10,14 @@ | Crate | `servo` (package name as of 2026-03-11; previously `libservo`) | | Feature | `servo-embed` (optional; off by default) | -## Adding the Cargo dependencies +## Cargo dependencies -The Servo deps are **not** in `Cargo.toml` by default to avoid pulling the -Servo monorepo (~1 GB) into every `cargo check` cycle. To activate, add the -following to `crates/weft-servo-shell/Cargo.toml` and change the `servo-embed` -feature line to declare `dep:servo`, `dep:winit`, and `dep:softbuffer`: +The Servo deps are wired in `crates/weft-servo-shell/Cargo.toml` and +`crates/weft-app-shell/Cargo.toml` under the `servo-embed` optional feature. +They are off by default to avoid pulling the Servo monorepo (~1 GB) into every +`cargo check` cycle. + +Current `Cargo.toml` block (already committed): ```toml [features] @@ -37,7 +39,7 @@ version = "0.4" optional = true ``` -Then build: +To build: ```sh cargo build -p weft-servo-shell --features servo-embed @@ -75,17 +77,15 @@ DMA-BUF buffer sharing with the compositor transparently. - **GAP-1**: ~~Wayland input events not forwarded to Servo~~ **Resolved** — keyboard and mouse events forwarded via `webview.notify_input_event`; key mapping in `keyutils.rs`. -- **GAP-2**: EGL `WindowRenderingContext` path scaffolded (`WEFT_EGL_RENDERING=1`). - When EGL is active, Servo presents frames via surfman's `eglSwapBuffers`; Mesa handles - DMA-BUF buffer sharing with the compositor transparently — no explicit - `zwp_linux_dmabuf_v1` code is needed in the shell for basic rendering. - The `zweft_shell_manager_v1` event queue is now dispatched each frame so `configure`, - `focus_changed`, and `window_closed` events are processed; `window_closed` triggers a - clean Servo shutdown. - Remaining gap: the `ZweftShellWindowV1` is created with `surface = null`; the winit - `wl_surface` is not yet associated with the shell window slot (requires sharing a single - Wayland connection between winit and the shell client, which is not currently feasible - without significant refactoring). +- **GAP-2**: ~~`ZweftShellWindowV1` created with `surface = null`~~ **Resolved** — + `ShellClient::connect_with_display(display_ptr, surface_ptr)` uses + `Backend::from_foreign_display` to share winit's `wl_display` connection; the winit + `wl_surface` pointer is passed directly to `create_window`, associating the compositor + shell slot with the actual rendered surface. `ShellClient` is now constructed inside + `resumed()` after the winit window exists, not before the event loop. EGL path and + per-frame event dispatch are unchanged. + Protocol note: `wayland-scanner 0.31` generates `_type` (not `r#type`) for the + `navigation_gesture` event arg named `type`. - **GAP-3**: WebGPU adapter on Mesa may fail CTS — validation task, requires Mesa GPU hardware. - **GAP-4**: ~~CSS Grid~~ **Grid resolved** (Taffy-backed, fully wired). ~~CSS `backdrop-filter` unimplemented~~ **`backdrop-filter` resolved** (servo/servo issue diff --git a/examples/keys/weft-sign.key b/examples/keys/weft-sign.key new file mode 100644 index 0000000..2f8e510 --- /dev/null +++ b/examples/keys/weft-sign.key @@ -0,0 +1 @@ +6322e10dadbbe0f0d95fa113278392eac87768826167dd1cfcb3cc1cb7e43312 \ No newline at end of file diff --git a/examples/keys/weft-sign.pub b/examples/keys/weft-sign.pub new file mode 100644 index 0000000..46363ed --- /dev/null +++ b/examples/keys/weft-sign.pub @@ -0,0 +1 @@ +470490314923b5f51d96196a6dee67e831f0b758119b8558d83cf415088fe062 \ No newline at end of file diff --git a/examples/org.weft.demo.counter/.cargo/config.toml b/examples/org.weft.demo.counter/.cargo/config.toml new file mode 100644 index 0000000..f68f33c --- /dev/null +++ b/examples/org.weft.demo.counter/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target = "wasm32-wasip2" diff --git a/examples/org.weft.demo.counter/Cargo.lock b/examples/org.weft.demo.counter/Cargo.lock new file mode 100644 index 0000000..3732df2 --- /dev/null +++ b/examples/org.weft.demo.counter/Cargo.lock @@ -0,0 +1,321 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "org-weft-demo-counter" +version = "0.1.0" +dependencies = [ + "serde_json", + "wit-bindgen", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "wasm-encoder" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da55e60097e8b37b475a0fa35c3420dd71d9eb7bd66109978ab55faf56a57efb" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +dependencies = [ + "bitflags", + "hashbrown", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e915216dde3e818093168df8380a64fba25df468d626c80dd5d6a184c87e7c7" +dependencies = [ + "bitflags", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deda4b7e9f522d994906f6e6e0fc67965ea8660306940a776b76732be8f3933" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863a7ab3c4dfee58db196811caeb0718b88412a0aef3d1c2b02fcbae1e37c688" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d14f3a9bfa3804bb0e9ab7f66da047f210eded6a1297ae3ba5805b384d64797f" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4894f10d2d5cbc17c77e91f86a1e48e191a788da4425293b55c98b44ba3fcac9" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929" +dependencies = [ + "anyhow", + "hashbrown", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/examples/org.weft.demo.counter/Cargo.toml b/examples/org.weft.demo.counter/Cargo.toml new file mode 100644 index 0000000..a111dc6 --- /dev/null +++ b/examples/org.weft.demo.counter/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "org-weft-demo-counter" +version = "0.1.0" +edition = "2024" + +[[bin]] +name = "app" +path = "src/main.rs" + +[dependencies] +wit-bindgen = "0.53" +serde_json = "1" + +[profile.release] +opt-level = "z" +strip = true +lto = true diff --git a/examples/org.weft.demo.counter/app.wasm b/examples/org.weft.demo.counter/app.wasm new file mode 100644 index 0000000000000000000000000000000000000000..4bc685472eb481e1af73be8d498e2129ed5ca684 GIT binary patch literal 54056 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 E1BJc=7ytkO literal 0 HcmV?d00001 diff --git a/examples/org.weft.demo.counter/signature.sig b/examples/org.weft.demo.counter/signature.sig new file mode 100644 index 0000000..daeb4c1 --- /dev/null +++ b/examples/org.weft.demo.counter/signature.sig @@ -0,0 +1 @@ +4d26abef46af41b1992c0592313ea6aeb39b21eb4a31b978c13ed7c46b444f4d3469819eec1e9d3a00ef40898b77cc3391edfac55fcc50e13817a9eaf126ec0a \ No newline at end of file diff --git a/examples/org.weft.demo.counter/src/main.rs b/examples/org.weft.demo.counter/src/main.rs new file mode 100644 index 0000000..57067be --- /dev/null +++ b/examples/org.weft.demo.counter/src/main.rs @@ -0,0 +1,42 @@ +wit_bindgen::generate!({ + path: "wit", + world: "app", + with: { + "weft:app/notify@0.1.0": generate, + "weft:app/ipc@0.1.0": generate, + }, +}); + +use weft::app::{ipc, notify}; + +fn main() { + notify::ready(); + + let mut count: i32 = 0; + + loop { + if let Some(raw) = ipc::recv() { + let reply = match raw.trim() { + "increment" => { + count += 1; + format!("{{\"count\":{count}}}") + } + "decrement" => { + count -= 1; + format!("{{\"count\":{count}}}") + } + "reset" => { + count = 0; + format!("{{\"count\":{count}}}") + } + "get" => { + format!("{{\"count\":{count}}}") + } + _ => continue, + }; + let _ = ipc::send(&reply); + } else { + std::thread::sleep(std::time::Duration::from_millis(10)); + } + } +} diff --git a/examples/org.weft.demo.counter/ui/index.html b/examples/org.weft.demo.counter/ui/index.html new file mode 100644 index 0000000..50e535d --- /dev/null +++ b/examples/org.weft.demo.counter/ui/index.html @@ -0,0 +1,144 @@ + + + + + +Counter + + + +
+

Counter

+
0
+
+ + + +
+
connecting…
+
+ + + + diff --git a/examples/org.weft.demo.counter/wapp.toml b/examples/org.weft.demo.counter/wapp.toml new file mode 100644 index 0000000..41440e0 --- /dev/null +++ b/examples/org.weft.demo.counter/wapp.toml @@ -0,0 +1,12 @@ +[package] +id = "org.weft.demo.counter" +name = "Counter" +version = "0.1.0" +description = "Stateless counter demonstrating weft:app/ipc" +author = "WEFT OS" + +[runtime] +module = "app.wasm" + +[ui] +entry = "ui/index.html" diff --git a/examples/org.weft.demo.counter/wit/deps/weft-app/weft-app.wit b/examples/org.weft.demo.counter/wit/deps/weft-app/weft-app.wit new file mode 100644 index 0000000..7d7e746 --- /dev/null +++ b/examples/org.weft.demo.counter/wit/deps/weft-app/weft-app.wit @@ -0,0 +1,38 @@ +package weft:app@0.1.0; + +interface notify { + ready: func(); +} + +interface ipc { + send: func(payload: string) -> result<_, string>; + recv: func() -> option; +} + +interface fetch { + record response { + status: u16, + content-type: string, + body: list, + } + + fetch: func( + url: string, + method: string, + headers: list>, + body: option>, + ) -> result; +} + +interface notifications { + notify: func( + title: string, + body: string, + icon: option, + ) -> result<_, string>; +} + +interface clipboard { + read: func() -> result; + write: func(text: string) -> result<_, string>; +} diff --git a/examples/org.weft.demo.counter/wit/world.wit b/examples/org.weft.demo.counter/wit/world.wit new file mode 100644 index 0000000..37c2d3c --- /dev/null +++ b/examples/org.weft.demo.counter/wit/world.wit @@ -0,0 +1,6 @@ +package org:weft-demo-counter@0.1.0; + +world app { + import weft:app/notify@0.1.0; + import weft:app/ipc@0.1.0; +} diff --git a/examples/org.weft.demo.notes/.cargo/config.toml b/examples/org.weft.demo.notes/.cargo/config.toml new file mode 100644 index 0000000..f68f33c --- /dev/null +++ b/examples/org.weft.demo.notes/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target = "wasm32-wasip2" diff --git a/examples/org.weft.demo.notes/Cargo.lock b/examples/org.weft.demo.notes/Cargo.lock new file mode 100644 index 0000000..1300684 --- /dev/null +++ b/examples/org.weft.demo.notes/Cargo.lock @@ -0,0 +1,321 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "org-weft-demo-notes" +version = "0.1.0" +dependencies = [ + "serde_json", + "wit-bindgen", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "wasm-encoder" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da55e60097e8b37b475a0fa35c3420dd71d9eb7bd66109978ab55faf56a57efb" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +dependencies = [ + "bitflags", + "hashbrown", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e915216dde3e818093168df8380a64fba25df468d626c80dd5d6a184c87e7c7" +dependencies = [ + "bitflags", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deda4b7e9f522d994906f6e6e0fc67965ea8660306940a776b76732be8f3933" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863a7ab3c4dfee58db196811caeb0718b88412a0aef3d1c2b02fcbae1e37c688" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d14f3a9bfa3804bb0e9ab7f66da047f210eded6a1297ae3ba5805b384d64797f" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4894f10d2d5cbc17c77e91f86a1e48e191a788da4425293b55c98b44ba3fcac9" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929" +dependencies = [ + "anyhow", + "hashbrown", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/examples/org.weft.demo.notes/Cargo.toml b/examples/org.weft.demo.notes/Cargo.toml new file mode 100644 index 0000000..8f9731a --- /dev/null +++ b/examples/org.weft.demo.notes/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "org-weft-demo-notes" +version = "0.1.0" +edition = "2024" + +[[bin]] +name = "app" +path = "src/main.rs" + +[dependencies] +wit-bindgen = "0.53" +serde_json = "1" + +[profile.release] +opt-level = "z" +strip = true +lto = true diff --git a/examples/org.weft.demo.notes/app.wasm b/examples/org.weft.demo.notes/app.wasm new file mode 100644 index 0000000000000000000000000000000000000000..bd523ab5e41704300fffcae9ed555df67a0a595e GIT binary patch literal 107705 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 V{Qv8bb7;i0CDhX+&-&Eq{{@E`0`~v_ literal 0 HcmV?d00001 diff --git a/examples/org.weft.demo.notes/signature.sig b/examples/org.weft.demo.notes/signature.sig new file mode 100644 index 0000000..feb4212 --- /dev/null +++ b/examples/org.weft.demo.notes/signature.sig @@ -0,0 +1 @@ +e781544104eee4538e17f953ea3223903e2b2a46a78705cd1ffa8d6946a62d0385c76eab2cc1c2533eecbeff7600e76a4205abc66915be8851fe2e71316ebc0d \ No newline at end of file diff --git a/examples/org.weft.demo.notes/src/main.rs b/examples/org.weft.demo.notes/src/main.rs new file mode 100644 index 0000000..485544e --- /dev/null +++ b/examples/org.weft.demo.notes/src/main.rs @@ -0,0 +1,59 @@ +wit_bindgen::generate!({ + path: "wit", + world: "app", + with: { + "weft:app/notify@0.1.0": generate, + "weft:app/ipc@0.1.0": generate, + }, +}); + +use weft::app::{ipc, notify}; + +const NOTES_PATH: &str = "/data/notes.txt"; + +fn load_notes() -> String { + std::fs::read_to_string(NOTES_PATH).unwrap_or_default() +} + +fn save_notes(text: &str) -> Result<(), String> { + std::fs::write(NOTES_PATH, text).map_err(|e| e.to_string()) +} + +fn json_text(text: &str) -> String { + let escaped = text + .replace('\\', "\\\\") + .replace('"', "\\\"") + .replace('\n', "\\n") + .replace('\r', "\\r") + .replace('\t', "\\t"); + format!("{{\"text\":\"{escaped}\"}}") +} + +fn json_error(msg: &str) -> String { + let escaped = msg.replace('"', "\\\""); + format!("{{\"error\":\"{escaped}\"}}") +} + +fn main() { + notify::ready(); + + loop { + if let Some(raw) = ipc::recv() { + let raw = raw.trim().to_owned(); + let reply = if raw == "load" { + json_text(&load_notes()) + } else if let Some(rest) = raw.strip_prefix("save:") { + let text = rest.replace("\\n", "\n"); + match save_notes(&text) { + Ok(()) => json_text(&text), + Err(e) => json_error(&e), + } + } else { + continue; + }; + let _ = ipc::send(&reply); + } else { + std::thread::sleep(std::time::Duration::from_millis(10)); + } + } +} diff --git a/examples/org.weft.demo.notes/ui/index.html b/examples/org.weft.demo.notes/ui/index.html new file mode 100644 index 0000000..e0592e5 --- /dev/null +++ b/examples/org.weft.demo.notes/ui/index.html @@ -0,0 +1,164 @@ + + + + + +Notes + + + +
+

Notes

+
+ + +
+
+ +
+ connecting… + 0 chars +
+ + + + diff --git a/examples/org.weft.demo.notes/wapp.toml b/examples/org.weft.demo.notes/wapp.toml new file mode 100644 index 0000000..a052d45 --- /dev/null +++ b/examples/org.weft.demo.notes/wapp.toml @@ -0,0 +1,13 @@ +[package] +id = "org.weft.demo.notes" +name = "Notes" +version = "0.1.0" +description = "Persistent notes demonstrating fs:rw:app-data via weft:app/ipc" +author = "WEFT OS" +capabilities = ["fs:rw:app-data"] + +[runtime] +module = "app.wasm" + +[ui] +entry = "ui/index.html" diff --git a/examples/org.weft.demo.notes/wit/deps/weft-app/weft-app.wit b/examples/org.weft.demo.notes/wit/deps/weft-app/weft-app.wit new file mode 100644 index 0000000..7d7e746 --- /dev/null +++ b/examples/org.weft.demo.notes/wit/deps/weft-app/weft-app.wit @@ -0,0 +1,38 @@ +package weft:app@0.1.0; + +interface notify { + ready: func(); +} + +interface ipc { + send: func(payload: string) -> result<_, string>; + recv: func() -> option; +} + +interface fetch { + record response { + status: u16, + content-type: string, + body: list, + } + + fetch: func( + url: string, + method: string, + headers: list>, + body: option>, + ) -> result; +} + +interface notifications { + notify: func( + title: string, + body: string, + icon: option, + ) -> result<_, string>; +} + +interface clipboard { + read: func() -> result; + write: func(text: string) -> result<_, string>; +} diff --git a/examples/org.weft.demo.notes/wit/world.wit b/examples/org.weft.demo.notes/wit/world.wit new file mode 100644 index 0000000..0f10f78 --- /dev/null +++ b/examples/org.weft.demo.notes/wit/world.wit @@ -0,0 +1,6 @@ +package org:weft-demo-notes@0.1.0; + +world app { + import weft:app/notify@0.1.0; + import weft:app/ipc@0.1.0; +}