From 87d68c5b6f652a3045d40a604a9f0cf140d91ad6 Mon Sep 17 00:00:00 2001 From: Bradley Nelson Date: Tue, 16 Jun 2026 17:57:57 -0600 Subject: [PATCH] init plugins --- .github/workflows/ci.yml | 31 + Cargo.lock | 1421 ++++++++++++++++- Cargo.toml | 5 + devenv.nix | 4 + example.env | 19 + justfile | 15 + scripts/build-plugin-hello.sh | 46 + src/application/adapters/mod.rs | 1 + .../adapters/plugin_lifecycle_hook.rs | 100 ++ src/application/ports/mod.rs | 1 + src/application/ports/plugin_ports.rs | 80 + src/common/config.rs | 69 + src/common/di.rs | 84 +- src/infrastructure/services/mod.rs | 2 + .../services/plugins/manager.rs | 193 +++ .../services/plugins/manifest.rs | 103 ++ src/infrastructure/services/plugins/mod.rs | 15 + .../services/plugins/runtime.rs | 230 +++ .../services/plugins/runtime_test.rs | 219 +++ tests/fixtures/plugins/hello.wasm | Bin 0 -> 125590 bytes tests/fixtures/plugins/net.wasm | Bin 0 -> 145608 bytes tests/fixtures/plugins/panic.wasm | Bin 0 -> 76122 bytes tests/fixtures/plugins/sleep.wasm | Bin 0 -> 76063 bytes tests/fixtures/plugins/wrong_abi.wasm | Bin 0 -> 125590 bytes wasm/oxicloud-plugin-hello/Cargo.lock | 379 +++++ wasm/oxicloud-plugin-hello/Cargo.toml | 31 + wasm/oxicloud-plugin-hello/src/lib.rs | 75 + 27 files changed, 3099 insertions(+), 24 deletions(-) create mode 100755 scripts/build-plugin-hello.sh create mode 100644 src/application/adapters/plugin_lifecycle_hook.rs create mode 100644 src/application/ports/plugin_ports.rs create mode 100644 src/infrastructure/services/plugins/manager.rs create mode 100644 src/infrastructure/services/plugins/manifest.rs create mode 100644 src/infrastructure/services/plugins/mod.rs create mode 100644 src/infrastructure/services/plugins/runtime.rs create mode 100644 src/infrastructure/services/plugins/runtime_test.rs create mode 100755 tests/fixtures/plugins/hello.wasm create mode 100755 tests/fixtures/plugins/net.wasm create mode 100755 tests/fixtures/plugins/panic.wasm create mode 100755 tests/fixtures/plugins/sleep.wasm create mode 100755 tests/fixtures/plugins/wrong_abi.wasm create mode 100644 wasm/oxicloud-plugin-hello/Cargo.lock create mode 100644 wasm/oxicloud-plugin-hello/Cargo.toml create mode 100644 wasm/oxicloud-plugin-hello/src/lib.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd793c29..9e3a9339 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,7 @@ jobs: frontend: ${{ steps.filter.outputs.frontend }} backend: ${{ steps.filter.outputs.backend }} wasm: ${{ steps.filter.outputs.wasm }} + plugins: ${{ steps.filter.outputs.plugins }} steps: - uses: actions/checkout@v4 - uses: dorny/paths-filter@v3 @@ -48,6 +49,13 @@ jobs: wasm: - 'wasm/**' - 'scripts/build-wasm.sh' + plugins: + - 'wasm/oxicloud-plugin-hello/**' + - 'scripts/build-plugin-hello.sh' + - 'tests/fixtures/plugins/**' + - 'src/infrastructure/services/plugins/**' + - 'src/application/ports/plugin_ports.rs' + - 'src/application/adapters/plugin_lifecycle_hook.rs' frontend-check: name: Frontend — CSS and JS checks (format, lint, css-rules, types) @@ -171,6 +179,29 @@ jobs: workspaces: wasm/oxicloud-hash - run: cargo test --release + # Plugin runtime (Extism). Rebuilds the committed .wasm fixtures from + # wasm/oxicloud-plugin-hello/ and fails if they drift from what is + # committed (staleness guard), then runs the plugin-runtime tests with + # the `plugins` feature. The wasm32 target is needed only to rebuild the + # fixtures; the host tests themselves do not need it. + plugins: + name: Plugins — fixtures + runtime tests + needs: changes + if: needs.changes.outputs.plugins == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + targets: wasm32-unknown-unknown + - uses: Swatinem/rust-cache@v2 + - name: Rebuild committed wasm fixtures + run: bash scripts/build-plugin-hello.sh + - name: Fail if fixtures are stale (rebuild + commit them) + run: git diff --exit-code tests/fixtures/plugins/ + - name: Run plugin runtime tests + run: cargo test --features plugins plugins:: + rust-test: name: Server Unit and Functionnal Tests needs: changes diff --git a/Cargo.lock b/Cargo.lock index 9144fd87..a23beaa9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,15 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f27d075294830fcab6f66e320dab524bc6d048f4a151698e153205559113772" +[[package]] +name = "addr2line" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" @@ -118,6 +127,12 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -148,6 +163,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + [[package]] name = "arc-swap" version = "1.9.1" @@ -231,7 +252,7 @@ dependencies = [ "serde", "serde_derive", "unicode-ident", - "winnow", + "winnow 1.0.3", ] [[package]] @@ -1023,6 +1044,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + [[package]] name = "bitpacking" version = "0.9.3" @@ -1157,6 +1187,9 @@ name = "bumpalo" version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +dependencies = [ + "allocator-api2", +] [[package]] name = "bytecheck" @@ -1220,6 +1253,72 @@ dependencies = [ "either", ] +[[package]] +name = "cap-fs-ext" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5528f85b1e134ae811704e41ef80930f56e795923f866813255bc342cc20654" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "cap-primitives" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cf3aea8a5081171859ef57bc1606b1df6999df4f1110f8eef68b30098d1d3a" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix 1.1.4", + "rustix-linux-procfs", + "windows-sys 0.59.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8144c22e24bbcf26ade86cb6501a0916c46b7e4787abdb0045a467eb1645a1d" +dependencies = [ + "ambient-authority", + "rand 0.8.6", +] + +[[package]] +name = "cap-std" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6dc3090992a735d23219de5c204927163d922f42f575a0189b005c62d37549a" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "rustix 1.1.4", +] + +[[package]] +name = "cap-time-ext" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def102506ce40c11710a9b16e614af0cde8e76ae51b1f48c04b8d79f4b671a80" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix 1.1.4", + "winx", +] + [[package]] name = "castaway" version = "0.2.4" @@ -1238,6 +1337,24 @@ dependencies = [ "cipher", ] +[[package]] +name = "cbindgen" +version = "0.29.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ecb53484c9c167ba674026b656d8a27d7657a58e6066aa902bfb1a4aa00ae20" +dependencies = [ + "heck", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.117", + "tempfile", + "toml 0.9.12+spec-1.1.0", +] + [[package]] name = "cc" version = "1.2.61" @@ -1449,6 +1566,15 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" +[[package]] +name = "cpp_demangle" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1467,6 +1593,148 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-assembler-x64" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc822414b18d1f5b1b33ce1441534e311e62fef86ebb5b9d382af857d0272c9" +dependencies = [ + "cranelift-assembler-x64-meta", +] + +[[package]] +name = "cranelift-assembler-x64-meta" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c646808b06f4532478d8d6057d74f15c3322f10d995d9486e7dcea405bf521a" +dependencies = [ + "cranelift-srcgen", +] + +[[package]] +name = "cranelift-bforest" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5996f01a686b2349cdb379083ec5ad3e8cb8767fb2d495d3a4f2ee4163a18d" +dependencies = [ + "cranelift-entity", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-bitset" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523fea83273f6a985520f57788809a4de2165794d9ab00fb1254fceb4f5aa00c" +dependencies = [ + "serde", + "serde_derive", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-codegen" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d73d1e372730b5f64ed1a2bd9f01fe4686c8ec14a28034e3084e530c8d951878" +dependencies = [ + "bumpalo", + "cranelift-assembler-x64", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli", + "hashbrown 0.16.1", + "libm", + "log", + "pulley-interpreter", + "regalloc2", + "rustc-hash", + "serde", + "smallvec", + "target-lexicon", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0319c18165e93dc1ebf78946a8da0b1c341c95b4a39729a69574671639bdb5f" +dependencies = [ + "cranelift-assembler-x64-meta", + "cranelift-codegen-shared", + "cranelift-srcgen", + "heck", + "pulley-interpreter", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9195cd8aeecb55e401aa96b2eaa55921636e8246c127ed7908f7ef7e0d40f270" + +[[package]] +name = "cranelift-control" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8976c2154b74136322befc74222ab5c7249edd7e2604f8cbef2b94975541ffb9" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6038b3147c7982f4951150d5f96c7c06c1e7214b99d4b4a98607aadf8ded89d1" +dependencies = [ + "cranelift-bitset", + "serde", + "serde_derive", + "wasmtime-internal-core", +] + +[[package]] +name = "cranelift-frontend" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbd294abe236e23cc3d907b0936226b6a8342db7636daa9c7c72be1e323420e" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a90b6ed3aba84189352a87badeb93b2126d3724225a42dc67fdce53d1b139c" + +[[package]] +name = "cranelift-native" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ec0cc1a54e22925eacf4fc3dc815f907734d3b377899d19d52bec04863e853" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-srcgen" +version = "0.130.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "948865622f87f30907bb46fbb081b235ae63c1896a99a83c26a003305c1fa82d" + [[package]] name = "crc" version = "3.3.0" @@ -1743,6 +2011,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c286de4e81ea2590afc24d754e0f83810c566f50a1388fa75ebd57928c0d9745" +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + [[package]] name = "der" version = "0.7.10" @@ -1788,6 +2065,27 @@ dependencies = [ "ctutils", ] +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2038,6 +2336,73 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "extism" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b66cd9ac5c64b49c9bac69db3d1b10d8f9386e7caab73489c2f197ba43d5e05" +dependencies = [ + "anyhow", + "async-trait", + "cbindgen", + "extism-convert", + "extism-manifest", + "glob", + "libc", + "serde", + "serde_json", + "sha2 0.10.9", + "toml 0.9.12+spec-1.1.0", + "tracing", + "tracing-subscriber", + "ureq", + "url", + "uuid", + "wasi-common", + "wasmtime", + "wiggle", +] + +[[package]] +name = "extism-convert" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad19858c4c462309a8f3a20abec53e8603bda1eefda26c8bfab51d5516b40cbb" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bytemuck", + "extism-convert-macros", + "prost", + "rmp-serde", + "serde", + "serde_json", +] + +[[package]] +name = "extism-convert-macros" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2932799f6d9f9646f97b65287f6bb2addc75a0ee61e40fb24559a7540dd928" +dependencies = [ + "manyhow", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "extism-manifest" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2f59c8dadb5e0bde9a48c6ed45312e6ef625cbcd5f67c28459dbc8fe8bc0383" +dependencies = [ + "base64 0.22.1", + "serde", + "serde_json", +] + [[package]] name = "fastcdc" version = "4.0.1" @@ -2070,6 +2435,17 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +[[package]] +name = "fd-lock" +version = "4.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" +dependencies = [ + "cfg-if", + "rustix 1.1.4", + "windows-sys 0.59.0", +] + [[package]] name = "fdeflate" version = "0.3.7" @@ -2101,6 +2477,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.1.9" @@ -2159,6 +2541,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "fs-set-times" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" +dependencies = [ + "io-lifetimes", + "rustix 1.1.4", + "windows-sys 0.59.0", +] + [[package]] name = "fs2" version = "0.4.3" @@ -2175,7 +2568,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" dependencies = [ - "rustix", + "rustix 1.1.4", "windows-sys 0.59.0", ] @@ -2318,6 +2711,20 @@ dependencies = [ "slab", ] +[[package]] +name = "fxprof-processed-profile" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25234f20a3ec0a962a61770cfe39ecf03cb529a6e474ad8cff025ed497eda557" +dependencies = [ + "bitflags", + "debugid", + "rustc-hash", + "serde", + "serde_derive", + "serde_json", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -2411,6 +2818,18 @@ dependencies = [ "weezl", ] +[[package]] +name = "gimli" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c" +dependencies = [ + "fnv", + "hashbrown 0.16.1", + "indexmap", + "stable_deref_trait", +] + [[package]] name = "glob" version = "0.3.3" @@ -2501,6 +2920,8 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash 0.2.0", + "serde", + "serde_core", ] [[package]] @@ -2772,7 +3193,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.4", "tokio", "tower-service", "tracing", @@ -2928,6 +3349,20 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "im-rc" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "sized-chunks", + "typenum", + "version_check", +] + [[package]] name = "image" version = "0.25.10" @@ -3011,6 +3446,22 @@ dependencies = [ "rustversion", ] +[[package]] +name = "io-extras" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" +dependencies = [ + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" + [[package]] name = "ipnet" version = "2.12.0" @@ -3051,6 +3502,26 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "ittapi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" +dependencies = [ + "anyhow", + "ittapi-sys", + "log", +] + +[[package]] +name = "ittapi-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" +dependencies = [ + "cc", +] + [[package]] name = "jobserver" version = "0.1.34" @@ -3121,6 +3592,12 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "leb128" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -3244,6 +3721,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -3320,6 +3803,38 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + [[package]] name = "matchers" version = "0.2.0" @@ -3341,6 +3856,12 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + [[package]] name = "md-5" version = "0.10.6" @@ -3376,6 +3897,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memfd" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +dependencies = [ + "rustix 1.1.4", +] + [[package]] name = "memmap2" version = "0.9.10" @@ -3653,6 +4183,18 @@ dependencies = [ "libm", ] +[[package]] +name = "object" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc" +dependencies = [ + "crc32fast", + "hashbrown 0.16.1", + "indexmap", + "memchr", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -4099,6 +4641,7 @@ dependencies = [ "chrono", "dashmap 6.2.1", "dotenvy", + "extism", "fastcdc", "flate2", "fs2", @@ -4147,6 +4690,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", + "toml 1.1.2+spec-1.1.0", "tower", "tower-http", "tracing", @@ -4312,6 +4856,16 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "phf" version = "0.11.3" @@ -4602,6 +5156,26 @@ dependencies = [ "elliptic-curve", ] +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -4611,6 +5185,29 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -4631,6 +5228,29 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "pulley-interpreter" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ec12fe19a9588315a49fe5704502a9c02d6a198303314b0c7c86123b06d29e5" +dependencies = [ + "cranelift-bitset", + "log", + "pulley-macros", + "wasmtime-internal-core", +] + +[[package]] +name = "pulley-macros" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f7d5ef31ebf1b46cd7e722ffef934e670d7e462f49aa01cde07b9b76dca580" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "pxfm" version = "0.1.29" @@ -4675,7 +5295,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls 0.23.40", - "socket2 0.5.10", + "socket2 0.6.4", "thiserror 2.0.18", "tokio", "tracing", @@ -4712,7 +5332,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.4", "tracing", "windows-sys 0.60.2", ] @@ -4850,6 +5470,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rangemap" version = "1.7.1" @@ -4894,6 +5523,31 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regalloc2" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de2c52737737f8609e94f975dee22854a2d5c125772d4b1cf292120f4d45c186" +dependencies = [ + "allocator-api2", + "bumpalo", + "hashbrown 0.17.0", + "log", + "rustc-hash", + "smallvec", +] + [[package]] name = "regex" version = "1.12.3" @@ -5032,6 +5686,25 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + [[package]] name = "rsa" version = "0.9.10" @@ -5062,6 +5735,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + [[package]] name = "rustc-hash" version = "2.1.2" @@ -5077,6 +5756,19 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.1.4" @@ -5086,10 +5778,20 @@ dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] +[[package]] +name = "rustix-linux-procfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" +dependencies = [ + "once_cell", + "rustix 1.1.4", +] + [[package]] name = "rustls" version = "0.21.12" @@ -5253,6 +5955,10 @@ name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "seq-macro" @@ -5334,6 +6040,15 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -5346,6 +6061,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "sha1" version = "0.10.6" @@ -5464,6 +6192,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + [[package]] name = "sketches-ddsketch" version = "0.4.0" @@ -5824,6 +6562,22 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "system-interface" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745" +dependencies = [ + "bitflags", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes", + "rustix 0.38.44", + "windows-sys 0.59.0", + "winx", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -5984,6 +6738,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + [[package]] name = "tempfile" version = "3.27.0" @@ -5993,10 +6753,19 @@ dependencies = [ "fastrand 2.4.1", "getrandom 0.4.2", "once_cell", - "rustix", + "rustix 1.1.4", "windows-sys 0.61.2", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "termtree" version = "0.5.1" @@ -6192,6 +6961,81 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + [[package]] name = "tower" version = "0.5.3" @@ -6448,12 +7292,47 @@ dependencies = [ "subtle", ] +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "percent-encoding", + "rustls 0.23.40", + "rustls-pki-types", + "ureq-proto", + "utf8-zero", + "webpki-roots 1.0.7", +] + +[[package]] +name = "ureq-proto" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +dependencies = [ + "base64 0.22.1", + "http 1.4.0", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.8" @@ -6479,6 +7358,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" +[[package]] +name = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -6579,6 +7464,32 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi-common" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46137f5bcc41a0f002ed14688e463665388a6f3a6662a12a8c315d4b8849791c" +dependencies = [ + "async-trait", + "bitflags", + "cap-fs-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "io-extras", + "io-lifetimes", + "log", + "rustix 1.1.4", + "system-interface", + "thiserror 2.0.18", + "tracing", + "wasmtime", + "wasmtime-environ", + "wiggle", + "windows-sys 0.61.2", +] + [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" @@ -6658,6 +7569,27 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-compose" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd23d12cc95c451c1306db5bc63075fbebb612bb70c53b4237b1ce5bc178343" +dependencies = [ + "anyhow", + "heck", + "im-rc", + "indexmap", + "log", + "petgraph", + "serde", + "serde_derive", + "serde_yaml", + "smallvec", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", + "wat", +] + [[package]] name = "wasm-encoder" version = "0.244.0" @@ -6665,7 +7597,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ "leb128fmt", - "wasmparser", + "wasmparser 0.244.0", +] + +[[package]] +name = "wasm-encoder" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +dependencies = [ + "leb128fmt", + "wasmparser 0.245.1", +] + +[[package]] +name = "wasm-encoder" +version = "0.252.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8185ae345fa5687c054626ff9a50e7089797a343d9904d1dc9820eb4c4d3196f" +dependencies = [ + "leb128fmt", + "wasmparser 0.252.0", ] [[package]] @@ -6676,8 +7628,8 @@ checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", "indexmap", - "wasm-encoder", - "wasmparser", + "wasm-encoder 0.244.0", + "wasmparser 0.244.0", ] [[package]] @@ -6705,6 +7657,329 @@ dependencies = [ "semver", ] +[[package]] +name = "wasmparser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +dependencies = [ + "bitflags", + "hashbrown 0.16.1", + "indexmap", + "semver", + "serde", +] + +[[package]] +name = "wasmparser" +version = "0.252.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3eb099dcadcde5be9eef55e3a337128efd4e44b4c93122487e4d2e4e1c6627c" +dependencies = [ + "bitflags", + "indexmap", + "semver", +] + +[[package]] +name = "wasmprinter" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41517a3716fbb8ccf46daa9c1325f760fcbff5168e75c7392288e410b91ac8" +dependencies = [ + "anyhow", + "termcolor", + "wasmparser 0.245.1", +] + +[[package]] +name = "wasmtime" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb1ed5899dde98357cfdcf647a4614498798719793898245b4b34e663addabf" +dependencies = [ + "addr2line", + "async-trait", + "bitflags", + "bumpalo", + "cc", + "cfg-if", + "encoding_rs", + "futures", + "fxprof-processed-profile", + "gimli", + "ittapi", + "libc", + "log", + "mach2", + "memfd", + "object", + "once_cell", + "postcard", + "pulley-interpreter", + "rayon", + "rustix 1.1.4", + "semver", + "serde", + "serde_derive", + "serde_json", + "smallvec", + "target-lexicon", + "tempfile", + "wasm-compose", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", + "wasmtime-environ", + "wasmtime-internal-cache", + "wasmtime-internal-component-macro", + "wasmtime-internal-component-util", + "wasmtime-internal-core", + "wasmtime-internal-cranelift", + "wasmtime-internal-fiber", + "wasmtime-internal-jit-debug", + "wasmtime-internal-jit-icache-coherence", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", + "wasmtime-internal-winch", + "wat", + "windows-sys 0.61.2", +] + +[[package]] +name = "wasmtime-environ" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4172382dcc785c31d0e862c6780a18f5dd437914d22c4691351f965ef751c821" +dependencies = [ + "anyhow", + "cpp_demangle", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-entity", + "gimli", + "hashbrown 0.16.1", + "indexmap", + "log", + "object", + "postcard", + "rustc-demangle", + "semver", + "serde", + "serde_derive", + "sha2 0.10.9", + "smallvec", + "target-lexicon", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", + "wasmprinter", + "wasmtime-internal-component-util", + "wasmtime-internal-core", +] + +[[package]] +name = "wasmtime-internal-cache" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ed398988226d7aa0505ac6bb576e09532ad722d702ec4e66365d78ed695c95f" +dependencies = [ + "base64 0.22.1", + "directories-next", + "log", + "postcard", + "rustix 1.1.4", + "serde", + "serde_derive", + "sha2 0.10.9", + "toml 0.9.12+spec-1.1.0", + "wasmtime-environ", + "windows-sys 0.61.2", + "zstd", +] + +[[package]] +name = "wasmtime-internal-component-macro" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae5ec9fff073ff13b81732d56a9515d761c245750bcda09093827f84130ebc25" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasmtime-internal-component-util", + "wasmtime-internal-wit-bindgen", + "wit-parser 0.245.1", +] + +[[package]] +name = "wasmtime-internal-component-util" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "935d9ab293ba27d1ec9aa7bc1b3a43993dbe961af2a8f23f90a11e1331b4c13f" + +[[package]] +name = "wasmtime-internal-core" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3820b174f477d2a7083209d1ad5353fcdb11eaea434b2137b8681029460dd3" +dependencies = [ + "anyhow", + "hashbrown 0.16.1", + "libm", + "serde", +] + +[[package]] +name = "wasmtime-internal-cranelift" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1679d205caf9766c6aa309d45bb3e7c634d7725e3164404df33824b9f7c4fb7" +dependencies = [ + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "gimli", + "itertools 0.14.0", + "log", + "object", + "pulley-interpreter", + "smallvec", + "target-lexicon", + "thiserror 2.0.18", + "wasmparser 0.245.1", + "wasmtime-environ", + "wasmtime-internal-core", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", +] + +[[package]] +name = "wasmtime-internal-fiber" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e505254058be5b0df458d670ee42d9eafe2349d04c1296e9dc01071dc20a85" +dependencies = [ + "cc", + "cfg-if", + "libc", + "rustix 1.1.4", + "wasmtime-environ", + "wasmtime-internal-versioned-export-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "wasmtime-internal-jit-debug" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c2e05b345f1773e59c20e6ad7298fd6857cdea245023d88bb659c96d8f0ea72" +dependencies = [ + "cc", + "object", + "rustix 1.1.4", + "wasmtime-internal-versioned-export-macros", +] + +[[package]] +name = "wasmtime-internal-jit-icache-coherence" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86701b234a4643e3f111869aa792b3a05a06e02d486ee9cb6c04dae16b52dab" +dependencies = [ + "cfg-if", + "libc", + "wasmtime-internal-core", + "windows-sys 0.61.2", +] + +[[package]] +name = "wasmtime-internal-unwinder" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63558d801beb83dde9b336eb4ae049019aee26627926edb32cd119d7e4c83cd" +dependencies = [ + "cfg-if", + "cranelift-codegen", + "log", + "object", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-internal-versioned-export-macros" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "737c4d956fc3a848541a064afb683dd2771132a6b125be5baaf95c4379aa47df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "wasmtime-internal-winch" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f599b79545e3bba0b7913406055ebede5bb0dabee9ba2015ef25a9f4c9f47807" +dependencies = [ + "cranelift-codegen", + "gimli", + "log", + "object", + "target-lexicon", + "wasmparser 0.245.1", + "wasmtime-environ", + "wasmtime-internal-cranelift", + "winch-codegen", +] + +[[package]] +name = "wasmtime-internal-wit-bindgen" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2192a77a00b9a67800c2b4e1c70fb6abca79d6b529e53a2ef9dcdcc36090330d" +dependencies = [ + "anyhow", + "bitflags", + "heck", + "indexmap", + "wit-parser 0.245.1", +] + +[[package]] +name = "wast" +version = "35.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + +[[package]] +name = "wast" +version = "252.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942a3449d6a593fccc111a6241c8df52bda168af30e40bf9580d4394d7374c65" +dependencies = [ + "bumpalo", + "leb128fmt", + "memchr", + "unicode-width", + "wasm-encoder 0.252.0", +] + +[[package]] +name = "wat" +version = "1.252.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c72a4ba7088f7bac94cf516e49882bdf97068904a563768cf249efc839ec42cb" +dependencies = [ + "wast 252.0.0", +] + [[package]] name = "web-sys" version = "0.3.97" @@ -6759,6 +8034,47 @@ dependencies = [ "wasite", ] +[[package]] +name = "wiggle" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8cfd3db2f05619c6f36f257d84327c11546e28d61e3a1c1220aaad553bc4b0" +dependencies = [ + "bitflags", + "thiserror 2.0.18", + "tracing", + "wasmtime", + "wasmtime-environ", + "wiggle-macro", + "witx", +] + +[[package]] +name = "wiggle-generate" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd7a197903e5b4ff5e13aef9c891960d71e92073600ecf4c86c7e795ac1c803" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasmtime-environ", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6410b86fcec207070d9372b215d3470bad67215e6bbac46981a16999c4abbc28" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "wiggle-generate", +] + [[package]] name = "winapi" version = "0.3.9" @@ -6775,12 +8091,40 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winch-codegen" +version = "43.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dbb0cf07b0dfe7b7a1ca8efb8f94ba98bd0fb144c411ea1665c78f0449e958" +dependencies = [ + "cranelift-assembler-x64", + "cranelift-codegen", + "gimli", + "regalloc2", + "smallvec", + "target-lexicon", + "thiserror 2.0.18", + "wasmparser 0.245.1", + "wasmtime-environ", + "wasmtime-internal-core", + "wasmtime-internal-cranelift", +] + [[package]] name = "windows-core" version = "0.62.2" @@ -7071,6 +8415,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + [[package]] name = "winnow" version = "1.0.3" @@ -7080,6 +8430,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winx" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" +dependencies = [ + "bitflags", + "windows-sys 0.59.0", +] + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -7103,7 +8463,7 @@ checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ "anyhow", "heck", - "wit-parser", + "wit-parser 0.244.0", ] [[package]] @@ -7150,10 +8510,10 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "wasm-encoder", + "wasm-encoder 0.244.0", "wasm-metadata", - "wasmparser", - "wit-parser", + "wasmparser 0.244.0", + "wit-parser 0.244.0", ] [[package]] @@ -7171,7 +8531,38 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser", + "wasmparser 0.244.0", +] + +[[package]] +name = "wit-parser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929" +dependencies = [ + "anyhow", + "hashbrown 0.16.1", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.245.1", +] + +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror 1.0.69", + "wast 35.0.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 962cf1cf..09a2e9eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,11 +78,16 @@ tantivy = "0.26.1" zip = { version = "8.6.0", default-features = false, features = ["deflate"] } pdf-extract = "0.10.0" nom-exif = "3.6.1" +extism = { version = "1.30.0", optional = true } +toml = { version = "1.1.2", optional = true } [features] default = [] test_utils = ["mockall"] integration_tests = [] +# WASM plugin runtime (Extism). Opt-in: bundles wasmtime, a large engine most +# deployments won't use. Activation also requires OXICLOUD_ENABLE_PLUGINS=true. +plugins = ["dep:extism", "dep:toml"] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(integration_tests)'] } diff --git a/devenv.nix b/devenv.nix index 89711562..fb5e4ee2 100644 --- a/devenv.nix +++ b/devenv.nix @@ -5,6 +5,10 @@ enable = true; channel = "stable"; # edition 2024 needs a recent stable (CLAUDE.md: Rust 1.93+) components = [ "rustc" "cargo" "clippy" "rustfmt" "rust-analyzer" "rust-src" ]; + # wasm32 std for building the WASM plugin fixtures and the vendored BLAKE3 + # module (scripts/build-plugin-hello.sh, scripts/build-wasm.sh). Only needed + # to *rebuild* those committed artifacts, not for normal server builds/tests. + targets = [ "wasm32-unknown-unknown" ]; }; # Native build deps + the full justfile toolchain. diff --git a/example.env b/example.env index ea78f21a..10bd1a99 100644 --- a/example.env +++ b/example.env @@ -224,6 +224,25 @@ DATABASE_URL=postgres://postgres:postgres@localhost:5432/oxicloud # Set to false to prevent users from browsing the user directory. #OXICLOUD_EXPOSE_SYSTEM_USERS=true +# WASM plugin runtime (Extism). Requires a binary built with the `plugins` +# cargo feature (`cargo run --features plugins`); without that feature these +# vars are inert. Untrusted plugins run sandboxed: no filesystem, no network, +# capped memory, per-invocation timeout. (default: false) +#OXICLOUD_ENABLE_PLUGINS=false + +# Directory scanned for plugins at startup; each plugin is a subdirectory with +# a plugin.toml + its .wasm. (default: {OXICLOUD_STORAGE_PATH}/.plugins) +#OXICLOUD_PLUGINS_DIR= + +# Per-invocation wall-clock timeout in ms (default: 250) +#OXICLOUD_PLUGIN_TIMEOUT_MS=250 + +# Max linear memory per plugin instance, in 64 KiB WASM pages (default: 256 = 16 MiB) +#OXICLOUD_PLUGIN_MAX_MEMORY_PAGES=256 + +# Max serialized event payload handed to a plugin, in bytes (default: 262144 = 256 KiB) +#OXICLOUD_PLUGIN_MAX_INPUT_BYTES=262144 + # ----------------------------------------------------------------------------- # STORAGE BACKEND # ----------------------------------------------------------------------------- diff --git a/justfile b/justfile index f16df0fa..f223fea9 100644 --- a/justfile +++ b/justfile @@ -65,6 +65,21 @@ wasm-check: wasm-test: cd wasm/oxicloud-hash; cargo test --release +# Run the host plugin-runtime tests (compiles the Extism/wasmtime runtime). +test-plugins: + cargo test --features plugins + +# Rebuild the committed plugin .wasm fixtures from wasm/oxicloud-plugin-hello/. +# Requires the wasm32 target (devenv provides it; else `rustup target add +# wasm32-unknown-unknown`). Commit the regenerated files; CI fails on drift. +plugin-build: + bash scripts/build-plugin-hello.sh + +# fmt + clippy the example plugin crate (standalone workspace, wasm32 target). +plugin-check: + cd wasm/oxicloud-plugin-hello; cargo fmt --all + cd wasm/oxicloud-plugin-hello; cargo clippy --target wasm32-unknown-unknown --release -- -D warnings + # audit security (condition: cargo install cargo-audit) audit: cargo audit diff --git a/scripts/build-plugin-hello.sh b/scripts/build-plugin-hello.sh new file mode 100755 index 00000000..4e7212fd --- /dev/null +++ b/scripts/build-plugin-hello.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# Rebuild the committed plugin .wasm fixtures used by the plugin-runtime tests +# (src/infrastructure/services/plugins/runtime_test.rs). +# +# The generated artifacts ARE committed — like the vendored BLAKE3 module — so +# regular builds and `cargo test --features plugins` never need the wasm +# toolchain. Re-run this only when wasm/oxicloud-plugin-hello/ changes, and +# commit the regenerated files. CI rebuilds them and fails on any diff. +# +# Requirements (one-time): +# - the wasm32-unknown-unknown target. In the devenv this is provided by +# `languages.rust.targets` in devenv.nix; otherwise: +# rustup target add wasm32-unknown-unknown + +set -euo pipefail +cd "$(dirname "$0")/.." + +CRATE=wasm/oxicloud-plugin-hello +OUT=tests/fixtures/plugins +ARTIFACT="$CRATE/target/wasm32-unknown-unknown/release/oxicloud_plugin_hello.wasm" + +# Needs the wasm32-unknown-unknown target's std. In the devenv this comes from +# `languages.rust.targets` in devenv.nix; otherwise run +# `rustup target add wasm32-unknown-unknown`. cargo emits a clear "can't find +# crate for `std`" error below if it is missing. + +mkdir -p "$OUT" + +build() { + local variant="$1"; shift + echo "building $variant.wasm ${*:+(features: ${*#--features })}" + cargo build \ + --manifest-path "$CRATE/Cargo.toml" \ + --target wasm32-unknown-unknown \ + --release "$@" + cp "$ARTIFACT" "$OUT/$variant.wasm" +} + +build hello +build panic --features panic +build sleep --features sleep +build net --features net +build wrong_abi --features wrong_abi + +echo "Built fixtures:" +ls -la "$OUT"/*.wasm | awk '{print " " $9 " (" $5 " bytes)"}' diff --git a/src/application/adapters/mod.rs b/src/application/adapters/mod.rs index 08fbab7f..89a7dd00 100644 --- a/src/application/adapters/mod.rs +++ b/src/application/adapters/mod.rs @@ -2,6 +2,7 @@ pub mod caldav_adapter; pub mod carddav_adapter; +pub mod plugin_lifecycle_hook; pub mod webdav_adapter; #[cfg(test)] diff --git a/src/application/adapters/plugin_lifecycle_hook.rs b/src/application/adapters/plugin_lifecycle_hook.rs new file mode 100644 index 00000000..2892db56 --- /dev/null +++ b/src/application/adapters/plugin_lifecycle_hook.rs @@ -0,0 +1,100 @@ +//! Bridges the existing [`FileLifecycleHook`] fan-out to the plugin runtime. +//! +//! `FileLifecycleService` already notifies hooks on every file create/update. +//! This adapter turns those notifications into `file.uploaded` plugin events. +//! Because the hook signature carries only `file_id` (not path/size), it looks +//! the metadata up via [`FileRetrievalUseCase::get_file`] — off the request +//! path, and skipped entirely when no plugin subscribes. + +use std::sync::Arc; + +use uuid::Uuid; + +use crate::application::ports::file_lifecycle::FileLifecycleHook; +use crate::application::ports::file_ports::FileRetrievalUseCase; +use crate::application::ports::plugin_ports::{ + EVENT_FILE_UPLOADED, FileUploadedEvent, PluginDispatchPort, +}; +use crate::application::services::FileRetrievalService; + +/// Lifecycle hook that forwards file create/update events to subscribed plugins. +pub struct PluginLifecycleHook { + dispatch: Arc, + retrieval: Arc, +} + +impl PluginLifecycleHook { + pub fn new( + dispatch: Arc, + retrieval: Arc, + ) -> Self { + Self { + dispatch, + retrieval, + } + } + + /// Look up the file's metadata and dispatch a `file.uploaded` event. Cheap + /// early-out when nothing subscribes; otherwise the DB read and the plugin + /// run happen on a background task, never blocking the caller. + fn dispatch_upload(&self, file_id: &str) { + if !self.dispatch.has_subscribers(EVENT_FILE_UPLOADED) { + return; + } + let dispatch = self.dispatch.clone(); + let retrieval = self.retrieval.clone(); + let file_id = file_id.to_string(); + + tokio::spawn(async move { + let dto = match retrieval.get_file(&file_id).await { + Ok(dto) => dto, + Err(e) => { + tracing::warn!( + target: "oxicloud::plugins", + file_id = %file_id, + error = %e, + "plugin bridge: file metadata lookup failed; skipping dispatch" + ); + return; + } + }; + + dispatch.dispatch_file_uploaded(FileUploadedEvent { + path: dto.path, + size: dto.size, + mime: dto.mime_type.to_string(), + user_id: dto.owner_id, + invocation_id: Uuid::new_v4().to_string(), + }); + }); + } +} + +impl FileLifecycleHook for PluginLifecycleHook { + fn on_file_created( + &self, + file_id: &str, + _blob_hash: &str, + _content_type: &str, + _is_new_blob: bool, + ) { + self.dispatch_upload(file_id); + } + + fn on_file_updated(&self, file_id: &str, _blob_hash: &str, _content_type: &str) { + self.dispatch_upload(file_id); + } + + // A copy creates a new file record, but its content already existed and was + // already observed on its original upload; M0 does not re-dispatch for it. + fn on_file_copied( + &self, + _file_id: &str, + _blob_hash: &str, + _content_type: &str, + _source_file_id: &str, + ) { + } + + fn on_file_deleted(&self, _file_id: &str) {} +} diff --git a/src/application/ports/mod.rs b/src/application/ports/mod.rs index 163cb70c..5e6c39be 100644 --- a/src/application/ports/mod.rs +++ b/src/application/ports/mod.rs @@ -17,6 +17,7 @@ pub mod folder_ports; pub mod inbound; pub mod music_ports; pub mod outbound; +pub mod plugin_ports; pub mod recent_ports; pub mod share_ports; pub mod storage_ports; diff --git a/src/application/ports/plugin_ports.rs b/src/application/ports/plugin_ports.rs new file mode 100644 index 00000000..475fcdac --- /dev/null +++ b/src/application/ports/plugin_ports.rs @@ -0,0 +1,80 @@ +//! WASM plugin runtime ports (ABI v0 — M0 walking skeleton). +//! +//! This module is the *entire* contract surface the rest of the application +//! talks to. Concrete Extism types live in the infrastructure layer behind +//! [`PluginDispatchPort`], keeping the hexagonal boundary intact: nothing in +//! `application/` or `domain/` depends on the WASM runtime. +//! +//! The ABI is intentionally tiny (see the M0 spec): +//! - constant [`OXICLOUD_PLUGIN_ABI`] / namespace [`HOST_NAMESPACE`]; +//! - plugin exports `abi_version` + `handle`; +//! - one host import `log` (observe-only — the only authority a plugin has). + +use serde::{Deserialize, Serialize}; + +/// The single ABI version this host speaks. A breaking change bumps this and +/// the namespace suffix ([`HOST_NAMESPACE`]); plugins built against a different +/// value are rejected at load, never silently mis-run. +pub const OXICLOUD_PLUGIN_ABI: u32 = 0; + +/// Namespace of the host functions a plugin may import. The `:v0` suffix is +/// part of the import path so a future `v1` is a *different* symbol. +pub const HOST_NAMESPACE: &str = "oxicloud:host:v0"; + +/// The only event emitted in M0. +pub const EVENT_FILE_UPLOADED: &str = "file.uploaded"; + +/// Outbound port: the application asks the (infrastructure) plugin runtime to +/// dispatch an event to every subscribed plugin. Dispatch is fire-and-forget — +/// the implementation owns all isolation, timeouts, and fault handling, and the +/// caller (a `FileLifecycleHook`) never awaits it. +pub trait PluginDispatchPort: Send + Sync + 'static { + /// Dispatch a `file.uploaded` event (metadata only) to subscribed plugins. + fn dispatch_file_uploaded(&self, event: FileUploadedEvent); + + /// Cheap predicate so the bridge hook can skip the metadata lookup entirely + /// when no plugin subscribes to `event`. + fn has_subscribers(&self, event: &str) -> bool; +} + +/// Metadata describing a freshly committed file. Carries **no file contents** — +/// only path, size, and MIME (privacy goal). +#[derive(Debug, Clone)] +pub struct FileUploadedEvent { + pub path: String, + pub size: u64, + pub mime: String, + /// Opaque owner id of the file, when known. + pub user_id: Option, + /// Unique id minted per dispatch, correlating host logs with plugin output. + pub invocation_id: String, +} + +// ---- Wire DTOs (ABI v0 JSON shapes, §3.4 of the spec) ---------------------- + +/// Serialized host → plugin and handed to `handle` as a UTF-8 JSON string. +#[derive(Debug, Clone, Serialize)] +pub struct PluginInput { + pub abi: u32, + pub event: String, + pub context: PluginContext, + pub payload: serde_json::Value, +} + +/// Invocation context. `user_id` is the owner of the event; because each +/// invocation is a fresh instance, a plugin never sees two users at once. +#[derive(Debug, Clone, Serialize)] +pub struct PluginContext { + pub plugin_id: String, + pub user_id: Option, + pub invocation_id: String, +} + +/// Returned from `handle`. M0 has no `actions` array — the plugin cannot ask the +/// host to do anything (observe-only). Unknown fields are ignored. +#[derive(Debug, Clone, Deserialize)] +pub struct PluginOutput { + pub ok: bool, + #[serde(default)] + pub error: Option, +} diff --git a/src/common/config.rs b/src/common/config.rs index 1c7e0a93..a4a4c7eb 100644 --- a/src/common/config.rs +++ b/src/common/config.rs @@ -936,6 +936,45 @@ impl Default for ContentSearchConfig { } } +/// WASM plugin runtime configuration (M0 walking skeleton). +/// +/// The runtime is doubly gated: it is only compiled when the `plugins` cargo +/// feature is enabled, and only activated when `enabled` is `true`. The limits +/// below are conservative starting defaults, not part of the plugin ABI — each +/// deployment may tune them. +#[derive(Debug, Clone)] +pub struct PluginConfig { + /// Master switch. When disabled, no plugins are loaded and the lifecycle + /// bridge hook is never registered. Env: `OXICLOUD_ENABLE_PLUGINS`. + pub enabled: bool, + /// Directory scanned for plugins at startup; each plugin is a subdirectory + /// containing `plugin.toml` + its `.wasm`. Default: `{storage_path}/.plugins`. + /// Env: `OXICLOUD_PLUGINS_DIR`. + pub plugins_dir: Option, + /// Wall-clock timeout for a single `handle` invocation. A runaway plugin + /// cannot stall the upload path beyond this. Default: 250. + /// Env: `OXICLOUD_PLUGIN_TIMEOUT_MS`. + pub invocation_timeout_ms: u64, + /// Max linear memory per plugin instance, in WASM pages (64 KiB each). + /// Default: 256 (≈ 16 MiB). Env: `OXICLOUD_PLUGIN_MAX_MEMORY_PAGES`. + pub max_memory_pages: u32, + /// Hard cap on the serialized event payload handed to a plugin. Default: + /// 256 KiB. Env: `OXICLOUD_PLUGIN_MAX_INPUT_BYTES`. + pub max_input_bytes: usize, +} + +impl Default for PluginConfig { + fn default() -> Self { + Self { + enabled: false, + plugins_dir: None, + invocation_timeout_ms: 250, + max_memory_pages: 256, + max_input_bytes: 256 * 1024, + } + } +} + /// Global application configuration #[derive(Debug, Clone)] pub struct AppConfig { @@ -977,6 +1016,8 @@ pub struct AppConfig { pub i18n: I18nConfig, /// Content-search configuration (embedded full-text index) pub content_search: ContentSearchConfig, + /// WASM plugin runtime configuration + pub plugins: PluginConfig, } /// Server-side i18n knobs. @@ -1029,6 +1070,7 @@ impl Default for AppConfig { magic_link: MagicLinkConfig::default(), i18n: I18nConfig::default(), content_search: ContentSearchConfig::default(), + plugins: PluginConfig::default(), } } } @@ -1318,6 +1360,33 @@ impl AppConfig { config.content_search.max_text_bytes = val; } + // WASM plugin runtime + if let Ok(v) = env::var("OXICLOUD_ENABLE_PLUGINS").map(|v| v.parse::()) + && let Ok(val) = v + { + config.plugins.enabled = val; + } + if let Ok(dir) = env::var("OXICLOUD_PLUGINS_DIR") + && !dir.trim().is_empty() + { + config.plugins.plugins_dir = Some(PathBuf::from(dir.trim())); + } + if let Ok(v) = env::var("OXICLOUD_PLUGIN_TIMEOUT_MS").map(|v| v.parse::()) + && let Ok(val) = v + { + config.plugins.invocation_timeout_ms = val; + } + if let Ok(v) = env::var("OXICLOUD_PLUGIN_MAX_MEMORY_PAGES").map(|v| v.parse::()) + && let Ok(val) = v + { + config.plugins.max_memory_pages = val; + } + if let Ok(v) = env::var("OXICLOUD_PLUGIN_MAX_INPUT_BYTES").map(|v| v.parse::()) + && let Ok(val) = v + { + config.plugins.max_input_bytes = val; + } + if let Ok(v) = env::var("OXICLOUD_EXPOSE_SYSTEM_USERS").map(|v| v.parse::()) && let Ok(val) = v { diff --git a/src/common/di.rs b/src/common/di.rs index 87de31b3..259a8158 100644 --- a/src/common/di.rs +++ b/src/common/di.rs @@ -457,13 +457,28 @@ impl AppServiceFactory { authz.clone(), )); + // Built before the upload/management services so the plugin lifecycle + // bridge (which looks file metadata up by id) can be wired into the + // dispatcher they receive. It depends only on repos + core, never on + // the upload service, so the reorder is safe. + let file_retrieval_service = Arc::new(FileRetrievalService::new_with_cache( + repos.file_read_repository.clone(), + core.file_content_cache.clone(), + core.image_transcode_service.clone(), + authz.clone(), + )); + + // Effective lifecycle dispatcher: the core hooks (thumbnails, metadata) + // plus, when the plugins feature is enabled, the WASM plugin bridge. + let file_lifecycle = self.effective_file_lifecycle(core, &file_retrieval_service); + let file_upload_service = Arc::new( FileUploadService::new_with_read( repos.file_write_repository.clone(), repos.file_read_repository.clone(), ) .with_content_cache(core.file_content_cache.clone()) - .with_file_lifecycle_hook(core.file_lifecycle.clone()) + .with_file_lifecycle_hook(file_lifecycle.clone()) .with_instant_upload( authz.clone(), core.dedup_service.clone(), @@ -485,13 +500,6 @@ impl AppServiceFactory { ), ); - let file_retrieval_service = Arc::new(FileRetrievalService::new_with_cache( - repos.file_read_repository.clone(), - core.file_content_cache.clone(), - core.image_transcode_service.clone(), - authz.clone(), - )); - // FileManagementService — ref_count handled by PG trigger, no dedup port needed let file_management_service = Arc::new( FileManagementService::with_trash( @@ -502,7 +510,7 @@ impl AppServiceFactory { Some(core.file_content_cache.clone()), authz.clone(), ) - .with_file_lifecycle_hook(core.file_lifecycle.clone()), + .with_file_lifecycle_hook(file_lifecycle.clone()), ); let file_use_case_factory = Arc::new(AppFileUseCaseFactory::new( @@ -549,6 +557,64 @@ impl AppServiceFactory { } } + /// Builds the file lifecycle dispatcher handed to the upload/management + /// services. By default this is just the core dispatcher (thumbnails, + /// metadata). When the `plugins` feature is built and enabled, it wraps the + /// core dispatcher together with the WASM plugin bridge so plugins observe + /// `file.uploaded` events without any of the core hooks being aware of them. + fn effective_file_lifecycle( + &self, + core: &CoreServices, + file_retrieval: &Arc, + ) -> Arc { + #[cfg(feature = "plugins")] + if self.config.plugins.enabled + && let Some(manager) = self.create_plugin_manager() + { + use crate::application::adapters::plugin_lifecycle_hook::PluginLifecycleHook; + use crate::application::ports::plugin_ports::PluginDispatchPort; + + let dispatch: Arc = manager; + let bridge = Arc::new(PluginLifecycleHook::new(dispatch, file_retrieval.clone())); + let composite = FileLifecycleService::new() + .with_hook(core.file_lifecycle.clone()) + .with_hook(bridge); + return Arc::new(composite); + } + + let _ = file_retrieval; + core.file_lifecycle.clone() + } + + /// Discovers and loads WASM plugins when the `plugins` feature is enabled and + /// `OXICLOUD_ENABLE_PLUGINS=true`. Plugins live under + /// `OXICLOUD_PLUGINS_DIR` (default `{storage_path}/.plugins`); a missing or + /// empty directory simply yields no plugins. + #[cfg(feature = "plugins")] + fn create_plugin_manager( + &self, + ) -> Option> { + if !self.config.plugins.enabled { + return None; + } + let dir = self + .config + .plugins + .plugins_dir + .clone() + .unwrap_or_else(|| self.config.storage_path.join(".plugins")); + let manager = crate::infrastructure::services::plugins::ExtismPluginManager::load_from_dir( + self.config.plugins.clone(), + &dir, + ); + tracing::info!( + target: "oxicloud::plugins", + loaded = manager.loaded_count(), + "plugin manager initialized" + ); + Some(Arc::new(manager)) + } + /// Creates the audio metadata service (extracts ID3 tags from audio files) pub fn create_audio_metadata_service( &self, diff --git a/src/infrastructure/services/mod.rs b/src/infrastructure/services/mod.rs index 2e989b0e..788ab933 100644 --- a/src/infrastructure/services/mod.rs +++ b/src/infrastructure/services/mod.rs @@ -22,6 +22,8 @@ pub mod password_hasher; pub mod path_resolver_service; pub mod path_service; pub mod pg_acl_engine; +#[cfg(feature = "plugins")] +pub mod plugins; pub mod retry_blob_backend; pub mod s3_blob_backend; pub mod search_index; diff --git a/src/infrastructure/services/plugins/manager.rs b/src/infrastructure/services/plugins/manager.rs new file mode 100644 index 00000000..4d6e9118 --- /dev/null +++ b/src/infrastructure/services/plugins/manager.rs @@ -0,0 +1,193 @@ +//! Plugin discovery + dispatch. Implements [`PluginDispatchPort`] over the +//! Extism [`PluginRuntime`]. +//! +//! Discovery scans a directory of plugin subdirectories (each `plugin.toml` + +//! `.wasm`) at startup; a plugin that fails validation or load is audit-logged +//! and skipped, never fatal. Dispatch builds a fresh sandbox per invocation on +//! the blocking pool, so a slow or hostile plugin never stalls async workers or +//! the upload path that triggered it. + +use std::collections::HashSet; +use std::path::Path; +use std::sync::Arc; + +use serde_json::json; + +use super::manifest; +use super::runtime::{InvokeOutcome, PluginRuntime}; +use crate::application::ports::plugin_ports::{ + EVENT_FILE_UPLOADED, FileUploadedEvent, OXICLOUD_PLUGIN_ABI, PluginContext, PluginDispatchPort, + PluginInput, +}; +use crate::common::config::PluginConfig; + +/// A validated, loadable plugin held in memory. +struct LoadedPlugin { + id: String, + subscribe: HashSet, + runtime: Arc, +} + +/// Owns all loaded plugins and dispatches events to them. +pub struct ExtismPluginManager { + config: PluginConfig, + plugins: Vec, +} + +impl ExtismPluginManager { + /// Scan `dir` for plugins and build a manager from those that validate and + /// load. Returns an empty manager (logging the cause) if `dir` is absent or + /// unreadable — a missing plugins directory is normal, not an error. + pub fn load_from_dir(config: PluginConfig, dir: &Path) -> Self { + let mut plugins = Vec::new(); + let mut rejected = 0usize; + + let entries = match std::fs::read_dir(dir) { + Ok(e) => e, + Err(e) => { + tracing::info!( + target: "oxicloud::plugins", + dir = %dir.display(), + error = %e, + "plugins directory not readable; no plugins loaded" + ); + return Self { config, plugins }; + } + }; + + for entry in entries.flatten() { + let path = entry.path(); + if !path.is_dir() { + continue; + } + match Self::load_one(&config, &path) { + Ok(loaded) => { + tracing::info!( + target: "oxicloud::plugins", + plugin_id = %loaded.id, + dir = %path.display(), + "plugin loaded" + ); + plugins.push(loaded); + } + Err(reason) => { + rejected += 1; + tracing::warn!( + target: "audit", + event = "plugin.load_rejected", + reason = reason, + plugin_dir = %path.display(), + "👮🏻‍♂️ plugin rejected at load" + ); + } + } + } + + tracing::info!( + target: "oxicloud::plugins", + loaded = plugins.len(), + rejected, + dir = %dir.display(), + "plugin discovery complete" + ); + Self { config, plugins } + } + + /// Validate and load a single plugin directory. Returns a stable audit + /// `reason` key on rejection. + fn load_one(config: &PluginConfig, dir: &Path) -> Result { + let manifest_path = dir.join("plugin.toml"); + if !manifest_path.exists() { + return Err("no_manifest"); + } + let toml_str = + std::fs::read_to_string(&manifest_path).map_err(|_| "manifest_unreadable")?; + let manifest = manifest::parse_and_validate(&toml_str).map_err(|e| e.reason())?; + + let wasm_path = dir.join(&manifest.plugin.entrypoint); + let wasm_bytes = std::fs::read(&wasm_path).map_err(|_| "wasm_unreadable")?; + + let runtime = PluginRuntime::new(manifest.plugin.id.clone(), wasm_bytes); + // Probe abi_version on a throwaway instance; rejects lying/unloadable wasm. + match runtime.check_loadable(config) { + InvokeOutcome::Ok => {} + InvokeOutcome::AbiMismatch { .. } => return Err("abi_mismatch"), + _ => return Err("not_loadable"), + } + + Ok(LoadedPlugin { + id: manifest.plugin.id, + subscribe: manifest.events.subscribe.into_iter().collect(), + runtime: Arc::new(runtime), + }) + } + + /// Number of successfully loaded plugins (used by DI for the startup summary + /// and by tests). + pub fn loaded_count(&self) -> usize { + self.plugins.len() + } +} + +impl PluginDispatchPort for ExtismPluginManager { + fn dispatch_file_uploaded(&self, event: FileUploadedEvent) { + for plugin in &self.plugins { + if !plugin.subscribe.contains(EVENT_FILE_UPLOADED) { + continue; + } + + let input = PluginInput { + abi: OXICLOUD_PLUGIN_ABI, + event: EVENT_FILE_UPLOADED.to_string(), + context: PluginContext { + plugin_id: plugin.id.clone(), + user_id: event.user_id.clone(), + invocation_id: event.invocation_id.clone(), + }, + payload: json!({ + "path": event.path, + "size": event.size, + "mime": event.mime, + }), + }; + let input_json = match serde_json::to_string(&input) { + Ok(j) => j, + Err(e) => { + tracing::warn!( + target: "oxicloud::plugins", + plugin_id = %plugin.id, + error = %e, + "failed to serialize plugin input; skipping" + ); + continue; + } + }; + + let runtime = plugin.runtime.clone(); + let config = self.config.clone(); + let plugin_id = plugin.id.clone(); + let invocation_id = event.invocation_id.clone(); + + // Run the synchronous wasm call off the async workers. Fire-and-forget: + // the upload already succeeded; plugins are post-hoc observers. + tokio::task::spawn_blocking(move || { + let result = runtime.invoke(&config, &invocation_id, &input_json); + if !result.outcome.is_ok() { + tracing::warn!( + target: "audit", + event = "plugin.invocation_failed", + reason = result.outcome.reason(), + plugin_id = %plugin_id, + invocation_id = %invocation_id, + detail = ?result.outcome, + "👮🏻‍♂️ plugin invocation failed" + ); + } + }); + } + } + + fn has_subscribers(&self, event: &str) -> bool { + self.plugins.iter().any(|p| p.subscribe.contains(event)) + } +} diff --git a/src/infrastructure/services/plugins/manifest.rs b/src/infrastructure/services/plugins/manifest.rs new file mode 100644 index 00000000..9f4b4456 --- /dev/null +++ b/src/infrastructure/services/plugins/manifest.rs @@ -0,0 +1,103 @@ +//! `plugin.toml` parsing + load-time validation (ABI v0). +//! +//! The manifest is the host's source of truth for *what to load and when to +//! call it*. Validation fails closed: unknown sections/keys, a mismatched ABI, +//! an unknown subscribed event, or any non-empty `[permissions]` (M0 grants +//! none) all reject the plugin. A rejected plugin is skipped, never fatal. + +use std::collections::BTreeMap; + +use crate::application::ports::plugin_ports::{EVENT_FILE_UPLOADED, OXICLOUD_PLUGIN_ABI}; + +/// Parsed `plugin.toml`. `#[serde(deny_unknown_fields)]` on every struct turns +/// stray keys into load errors rather than silently ignored config. +#[derive(Debug, Clone, serde::Deserialize)] +#[serde(deny_unknown_fields)] +pub struct PluginManifest { + pub plugin: PluginSection, + pub events: EventsSection, + /// M0: must be empty. Any key here rejects the plugin (no grantable + /// permissions exist yet). Kept as a free map so future keys are *detected*, + /// not parsed. + #[serde(default)] + pub permissions: BTreeMap, +} + +#[derive(Debug, Clone, serde::Deserialize)] +#[serde(deny_unknown_fields)] +pub struct PluginSection { + /// Reverse-DNS, unique per instance. + pub id: String, + pub name: String, + /// The plugin's own semver. + pub version: String, + /// Must equal [`OXICLOUD_PLUGIN_ABI`]. + pub abi: u32, + /// Path to the `.wasm`, relative to the manifest. + pub entrypoint: String, +} + +#[derive(Debug, Clone, serde::Deserialize)] +#[serde(deny_unknown_fields)] +pub struct EventsSection { + /// Events this plugin wants. M0 accepts only `"file.uploaded"`. + pub subscribe: Vec, +} + +/// Why a manifest was rejected. `reason()` yields the stable, machine-readable +/// key used in audit logs. +#[derive(Debug, thiserror::Error)] +pub enum ManifestError { + #[error("failed to parse plugin.toml: {0}")] + Parse(String), + #[error("plugin declares ABI {got}, host speaks {want}")] + AbiMismatch { got: u32, want: u32 }, + #[error("events.subscribe must not be empty")] + NoEvents, + #[error("unknown event '{0}' in events.subscribe")] + UnknownEvent(String), + #[error("permissions must be empty in ABI v0 (found key '{0}')")] + PermissionsNotEmpty(String), +} + +impl ManifestError { + /// Stable key for `tracing` audit lines; never reworded across releases. + pub fn reason(&self) -> &'static str { + match self { + ManifestError::Parse(_) => "parse_error", + ManifestError::AbiMismatch { .. } => "abi_mismatch", + ManifestError::NoEvents => "no_events", + ManifestError::UnknownEvent(_) => "unknown_event", + ManifestError::PermissionsNotEmpty(_) => "permissions_not_empty", + } + } +} + +/// Parse and validate a `plugin.toml` body. Does not touch the `.wasm`; the +/// caller probes `abi_version` separately after a successful parse. +pub fn parse_and_validate(toml_str: &str) -> Result { + let manifest: PluginManifest = + toml::from_str(toml_str).map_err(|e| ManifestError::Parse(e.to_string()))?; + + if manifest.plugin.abi != OXICLOUD_PLUGIN_ABI { + return Err(ManifestError::AbiMismatch { + got: manifest.plugin.abi, + want: OXICLOUD_PLUGIN_ABI, + }); + } + + if manifest.events.subscribe.is_empty() { + return Err(ManifestError::NoEvents); + } + for event in &manifest.events.subscribe { + if event != EVENT_FILE_UPLOADED { + return Err(ManifestError::UnknownEvent(event.clone())); + } + } + + if let Some((key, _)) = manifest.permissions.iter().next() { + return Err(ManifestError::PermissionsNotEmpty(key.clone())); + } + + Ok(manifest) +} diff --git a/src/infrastructure/services/plugins/mod.rs b/src/infrastructure/services/plugins/mod.rs new file mode 100644 index 00000000..76a2dc24 --- /dev/null +++ b/src/infrastructure/services/plugins/mod.rs @@ -0,0 +1,15 @@ +//! WASM plugin runtime (Extism) — M0 walking skeleton. +//! +//! Compiled only under the `plugins` cargo feature. The application layer talks +//! to [`manager::ExtismPluginManager`] through the +//! [`crate::application::ports::plugin_ports::PluginDispatchPort`] trait, so the +//! Extism types here never leak past the infrastructure boundary. + +pub mod manager; +pub mod manifest; +pub mod runtime; + +pub use manager::ExtismPluginManager; + +#[cfg(test)] +mod runtime_test; diff --git a/src/infrastructure/services/plugins/runtime.rs b/src/infrastructure/services/plugins/runtime.rs new file mode 100644 index 00000000..09e526ef --- /dev/null +++ b/src/infrastructure/services/plugins/runtime.rs @@ -0,0 +1,230 @@ +//! The Extism runtime wrapper — one sandboxed, per-invocation WASM instance. +//! +//! Isolation is the point: no WASI, no filesystem, no network, a memory cap, and +//! a wall-clock timeout. The only authority a plugin has is the host `log` +//! function. Every boundary crossing is wrapped so a trap/timeout/OOM/malformed +//! output is captured as an [`InvokeOutcome`] and never propagates to the caller. + +use std::time::Duration; + +use extism::{Manifest as ExtismManifest, PTR, PluginBuilder, UserData, Wasm}; + +use crate::application::ports::plugin_ports::{HOST_NAMESPACE, OXICLOUD_PLUGIN_ABI, PluginOutput}; +use crate::common::config::PluginConfig; + +/// Per-invocation host state: the plugin's identity (for log attribution) plus +/// the buffer the `log` host function appends to. Shared with the running +/// instance via [`UserData`]; read back after the call via [`drain`]. +#[derive(Default)] +pub struct LogContext { + pub plugin_id: String, + pub invocation_id: String, + pub lines: Vec<(String, String)>, +} + +// The entire authority surface: log(level, message) -> (). Observe-only — it +// reads nothing and mutates no host state. Unknown levels clamp to "info". +extism::host_fn!(oxi_log(user_data: LogContext; level: String, message: String) { + let level = match level.as_str() { + "debug" | "info" | "warn" | "error" => level, + _ => "info".to_string(), + }; + let ud = user_data.get()?; + let mut ctx = ud.lock().unwrap(); + tracing::info!( + target: "oxicloud::plugins", + plugin_id = %ctx.plugin_id, + invocation_id = %ctx.invocation_id, + plugin_level = %level, + "plugin log: {message}" + ); + ctx.lines.push((level, message)); + Ok(()) +}); + +/// The result of one boundary crossing. Only `Ok` is a success; every other +/// variant is a contained failure the host audit-logs and moves past. +#[derive(Debug)] +pub enum InvokeOutcome { + /// `handle` returned `{"ok": true}`. + Ok, + /// `handle` returned `{"ok": false, "error": ...}`. + PluginError(String), + /// A wasm trap (panic/`unreachable`/OOM/etc.). + Trap(String), + /// The wall-clock timeout cancelled the call. + Timeout, + /// The instance could not be built (bad/unloadable wasm, unresolved import). + LoadError(String), + /// `abi_version` returned a value the host does not speak. + AbiMismatch { got: u32 }, + /// `handle` returned bytes that are not a valid `PluginOutput`. + MalformedOutput(String), + /// The serialized input exceeded the configured cap; nothing was invoked. + MalformedInput { size: usize, max: usize }, +} + +impl InvokeOutcome { + pub fn is_ok(&self) -> bool { + matches!(self, InvokeOutcome::Ok) + } + + /// Stable, machine-readable key for audit logs. + pub fn reason(&self) -> &'static str { + match self { + InvokeOutcome::Ok => "ok", + InvokeOutcome::PluginError(_) => "plugin_error", + InvokeOutcome::Trap(_) => "trap", + InvokeOutcome::Timeout => "timeout", + InvokeOutcome::LoadError(_) => "load_error", + InvokeOutcome::AbiMismatch { .. } => "abi_mismatch", + InvokeOutcome::MalformedOutput(_) => "malformed_output", + InvokeOutcome::MalformedInput { .. } => "malformed_input", + } + } +} + +/// Outcome plus whatever the plugin logged (for tests and tracing). +pub struct InvokeResult { + pub outcome: InvokeOutcome, + pub logs: Vec<(String, String)>, +} + +/// A loaded-but-not-instantiated plugin: the wasm bytes plus identity. A fresh +/// instance is built for every invocation (no reuse → no cross-user state). +pub struct PluginRuntime { + plugin_id: String, + wasm_bytes: Vec, +} + +impl PluginRuntime { + pub fn new(plugin_id: impl Into, wasm_bytes: Vec) -> Self { + Self { + plugin_id: plugin_id.into(), + wasm_bytes, + } + } + + pub fn plugin_id(&self) -> &str { + &self.plugin_id + } + + /// Build a fresh, fully locked-down instance for one invocation. + fn build( + &self, + cfg: &PluginConfig, + logs: UserData, + ) -> Result { + let manifest = ExtismManifest::new([Wasm::data(self.wasm_bytes.clone())]) + .with_memory_max(cfg.max_memory_pages) // pages × 64 KiB + .with_timeout(Duration::from_millis(cfg.invocation_timeout_ms)) + .disallow_all_hosts(); // no outbound network + // No allowed_paths -> no filesystem. with_wasi(false) -> no ambient authority. + PluginBuilder::new(manifest) + .with_wasi(false) + .with_function_in_namespace(HOST_NAMESPACE, "log", [PTR, PTR], [], logs, oxi_log) + .build() + } + + /// Probe `abi_version` on a throwaway instance. Used at load time so a lying + /// or unloadable plugin is rejected before it is ever registered. + pub fn check_loadable(&self, cfg: &PluginConfig) -> InvokeOutcome { + let logs = UserData::new(LogContext::default()); + let mut plugin = match self.build(cfg, logs) { + Ok(p) => p, + Err(e) => return InvokeOutcome::LoadError(e.to_string()), + }; + match plugin.call::<(), u32>("abi_version", ()) { + Ok(v) if v == OXICLOUD_PLUGIN_ABI => InvokeOutcome::Ok, + Ok(v) => InvokeOutcome::AbiMismatch { got: v }, + Err(e) => classify_call_error(e), + } + } + + /// Run one `handle` invocation, fully fault-isolated. + pub fn invoke( + &self, + cfg: &PluginConfig, + invocation_id: &str, + input_json: &str, + ) -> InvokeResult { + if input_json.len() > cfg.max_input_bytes { + return InvokeResult { + outcome: InvokeOutcome::MalformedInput { + size: input_json.len(), + max: cfg.max_input_bytes, + }, + logs: Vec::new(), + }; + } + + let logs = UserData::new(LogContext { + plugin_id: self.plugin_id.clone(), + invocation_id: invocation_id.to_string(), + lines: Vec::new(), + }); + + let mut plugin = match self.build(cfg, logs.clone()) { + Ok(p) => p, + Err(e) => { + return InvokeResult { + outcome: InvokeOutcome::LoadError(e.to_string()), + logs: drain(&logs), + }; + } + }; + + // Version negotiation at the door. + match plugin.call::<(), u32>("abi_version", ()) { + Ok(v) if v == OXICLOUD_PLUGIN_ABI => {} + Ok(v) => { + return InvokeResult { + outcome: InvokeOutcome::AbiMismatch { got: v }, + logs: drain(&logs), + }; + } + Err(e) => { + return InvokeResult { + outcome: classify_call_error(e), + logs: drain(&logs), + }; + } + } + + // The actual call. Traps, timeouts, and OOM all surface here as Err. + let outcome = match plugin.call::<&str, String>("handle", input_json) { + Ok(out) => match serde_json::from_str::(&out) { + Ok(parsed) if parsed.ok => InvokeOutcome::Ok, + Ok(parsed) => { + InvokeOutcome::PluginError(parsed.error.unwrap_or_else(|| "unspecified".into())) + } + Err(e) => InvokeOutcome::MalformedOutput(e.to_string()), + }, + Err(e) => classify_call_error(e), + }; + + InvokeResult { + outcome, + logs: drain(&logs), + } + // `plugin` dropped here -> sandbox memory reclaimed. + } +} + +/// Extism signals a wall-clock timeout with `Error::msg("timeout")`; everything +/// else from a `call` is a trap (panic, `unreachable`, OOM, etc.). +fn classify_call_error(e: extism::Error) -> InvokeOutcome { + let msg = e.to_string(); + if msg.to_ascii_lowercase().contains("timeout") { + InvokeOutcome::Timeout + } else { + InvokeOutcome::Trap(msg) + } +} + +fn drain(logs: &UserData) -> Vec<(String, String)> { + logs.get() + .ok() + .map(|m| m.lock().unwrap().lines.clone()) + .unwrap_or_default() +} diff --git a/src/infrastructure/services/plugins/runtime_test.rs b/src/infrastructure/services/plugins/runtime_test.rs new file mode 100644 index 00000000..c377aa1e --- /dev/null +++ b/src/infrastructure/services/plugins/runtime_test.rs @@ -0,0 +1,219 @@ +//! Plugin-runtime acceptance + failure-isolation tests, plus manifest-validation +//! unit tests. +//! +//! The `.wasm` fixtures are built and committed by `scripts/build-plugin-hello.sh` +//! from `wasm/oxicloud-plugin-hello/`. Run with `cargo test --features plugins`. + +use std::time::{Duration, Instant}; + +use super::ExtismPluginManager; +use super::manifest; +use super::runtime::{InvokeOutcome, PluginRuntime}; +use crate::common::config::PluginConfig; + +fn cfg() -> PluginConfig { + PluginConfig::default() +} + +/// Load a committed `.wasm` fixture, failing with a build hint if it's missing. +fn fixture(name: &str) -> Vec { + let path = format!( + "{}/tests/fixtures/plugins/{}", + env!("CARGO_MANIFEST_DIR"), + name + ); + std::fs::read(&path).unwrap_or_else(|e| { + panic!("missing fixture {path}: {e}\n run scripts/build-plugin-hello.sh to (re)build it") + }) +} + +fn sample_input() -> String { + serde_json::json!({ + "abi": 0, + "event": "file.uploaded", + "context": { + "plugin_id": "com.example.hello", + "user_id": "u_test", + "invocation_id": "inv_test_0001" + }, + "payload": { "path": "/photos/2026/cat.jpg", "size": 81234, "mime": "image/jpeg" } + }) + .to_string() +} + +// ---- The M0 exit criterion: the full loop ----------------------------------- + +#[test] +fn acceptance_hello_returns_ok_and_calls_host_log() { + let rt = PluginRuntime::new("com.example.hello", fixture("hello.wasm")); + let result = rt.invoke(&cfg(), "inv_test_0001", &sample_input()); + + // 1. handle returned a well-formed PluginOutput with ok = true. + assert!( + result.outcome.is_ok(), + "plugin did not complete: {:?}", + result.outcome + ); + + // 2. The plugin called the host `log` function (plugin -> host). + assert!( + result.logs.iter().any(|(level, msg)| level == "info" + && msg.contains("hello plugin saw upload: /photos/2026/cat.jpg")), + "expected the plugin's host log line, got: {:?}", + result.logs + ); +} + +// ---- The guarantees, not just the happy path -------------------------------- + +#[test] +fn rejects_wrong_abi() { + let rt = PluginRuntime::new("com.example.wrong-abi", fixture("wrong_abi.wasm")); + assert!( + matches!( + rt.check_loadable(&cfg()), + InvokeOutcome::AbiMismatch { got: 1 } + ), + "wrong-abi plugin should be rejected at load" + ); +} + +#[test] +fn contains_a_panicking_plugin() { + let rt = PluginRuntime::new("com.example.panic", fixture("panic.wasm")); + let result = rt.invoke(&cfg(), "inv", &sample_input()); + assert!( + matches!(result.outcome, InvokeOutcome::Trap(_)), + "expected a contained trap, got {:?}", + result.outcome + ); + // Reaching this line at all proves the host process survived the trap. +} + +#[test] +fn enforces_timeout() { + let rt = PluginRuntime::new("com.example.sleep", fixture("sleep.wasm")); + let start = Instant::now(); + let result = rt.invoke(&cfg(), "inv", &sample_input()); + let elapsed = start.elapsed(); + + assert!( + matches!(result.outcome, InvokeOutcome::Timeout), + "expected a timeout, got {:?}", + result.outcome + ); + assert!( + elapsed < Duration::from_secs(2), + "timeout took too long to fire: {elapsed:?}" + ); +} + +#[test] +fn no_network() { + let rt = PluginRuntime::new("com.example.net", fixture("net.wasm")); + let result = rt.invoke(&cfg(), "inv", &sample_input()); + // No allowed_hosts are granted, so the outbound call is denied and the + // plugin cannot complete successfully. + assert!( + !result.outcome.is_ok(), + "network access should be denied, got {:?}", + result.outcome + ); +} + +#[tokio::test] +async fn manager_loads_and_dispatches() { + use crate::application::ports::plugin_ports::{FileUploadedEvent, PluginDispatchPort}; + + let tmp = tempfile::tempdir().unwrap(); + let plugin_dir = tmp.path().join("hello"); + std::fs::create_dir_all(&plugin_dir).unwrap(); + std::fs::write(plugin_dir.join("hello.wasm"), fixture("hello.wasm")).unwrap(); + std::fs::write( + plugin_dir.join("plugin.toml"), + r#" +[plugin] +id = "com.example.hello" +name = "Hello" +version = "0.1.0" +abi = 0 +entrypoint = "hello.wasm" + +[events] +subscribe = ["file.uploaded"] +"#, + ) + .unwrap(); + + let manager = ExtismPluginManager::load_from_dir(cfg(), tmp.path()); + assert_eq!(manager.loaded_count(), 1, "the valid plugin should load"); + assert!(manager.has_subscribers("file.uploaded")); + assert!(!manager.has_subscribers("file.deleted")); + + // Dispatch runs the plugin on the blocking pool; it must not panic or block. + manager.dispatch_file_uploaded(FileUploadedEvent { + path: "/a.txt".into(), + size: 3, + mime: "text/plain".into(), + user_id: Some("u_test".into()), + invocation_id: "inv_dispatch".into(), + }); + // Give the spawned task time to complete before the test runtime shuts down. + tokio::time::sleep(Duration::from_millis(300)).await; +} + +// ---- Manifest validation (no wasm needed) ----------------------------------- + +const VALID_MANIFEST: &str = r#" +[plugin] +id = "com.example.hello" +name = "Hello" +version = "0.1.0" +abi = 0 +entrypoint = "hello.wasm" + +[events] +subscribe = ["file.uploaded"] +"#; + +#[test] +fn manifest_accepts_valid() { + let m = manifest::parse_and_validate(VALID_MANIFEST).expect("valid manifest"); + assert_eq!(m.plugin.id, "com.example.hello"); +} + +#[test] +fn manifest_rejects_unknown_field() { + let toml = format!("{VALID_MANIFEST}\nbogus_top_level = true\n"); + assert_eq!( + manifest::parse_and_validate(&toml).unwrap_err().reason(), + "parse_error" + ); +} + +#[test] +fn manifest_rejects_abi_mismatch() { + let toml = VALID_MANIFEST.replace("abi = 0", "abi = 1"); + assert_eq!( + manifest::parse_and_validate(&toml).unwrap_err().reason(), + "abi_mismatch" + ); +} + +#[test] +fn manifest_rejects_unknown_event() { + let toml = VALID_MANIFEST.replace(r#"["file.uploaded"]"#, r#"["file.deleted"]"#); + assert_eq!( + manifest::parse_and_validate(&toml).unwrap_err().reason(), + "unknown_event" + ); +} + +#[test] +fn manifest_rejects_nonempty_permissions() { + let toml = format!("{VALID_MANIFEST}\n[permissions]\nfs = \"/tmp\"\n"); + assert_eq!( + manifest::parse_and_validate(&toml).unwrap_err().reason(), + "permissions_not_empty" + ); +} diff --git a/tests/fixtures/plugins/hello.wasm b/tests/fixtures/plugins/hello.wasm new file mode 100755 index 0000000000000000000000000000000000000000..8502b66d5d49694d8bef16fdbcccf9965d159a03 GIT binary patch literal 125590 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�-w{+w_NIdu%kWj{?WcVmXFabpYq+cv` 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/plugins/sleep.wasm b/tests/fixtures/plugins/sleep.wasm new file mode 100755 index 0000000000000000000000000000000000000000..18c4ef8e915b739cd3c4a8eb0a631abf3e2acb57 GIT binary patch literal 76063 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�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Ξ)W( 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/plugins/wrong_abi.wasm b/tests/fixtures/plugins/wrong_abi.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c9b163f6eee5ec3ef5435c52cd23dc4ca11a562c GIT binary patch literal 125590 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 a0Mq~s0UQCs0I~r}0XhLj0TuwZ0R9)=DK}XF literal 0 HcmV?d00001 diff --git a/wasm/oxicloud-plugin-hello/Cargo.lock b/wasm/oxicloud-plugin-hello/Cargo.lock new file mode 100644 index 00000000..a26c6824 --- /dev/null +++ b/wasm/oxicloud-plugin-hello/Cargo.lock @@ -0,0 +1,379 @@ +# 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 = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "extism-convert" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad19858c4c462309a8f3a20abec53e8603bda1eefda26c8bfab51d5516b40cbb" +dependencies = [ + "anyhow", + "base64", + "bytemuck", + "extism-convert-macros", + "prost", + "rmp-serde", + "serde", + "serde_json", +] + +[[package]] +name = "extism-convert-macros" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2932799f6d9f9646f97b65287f6bb2addc75a0ee61e40fb24559a7540dd928" +dependencies = [ + "manyhow", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "extism-manifest" +version = "1.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2f59c8dadb5e0bde9a48c6ed45312e6ef625cbcd5f67c28459dbc8fe8bc0383" +dependencies = [ + "base64", + "serde", + "serde_json", +] + +[[package]] +name = "extism-pdk" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352fcb5a66eb74145a1c4a01f2bd15d59c62c85be73aac8471880c65b26b798f" +dependencies = [ + "anyhow", + "base64", + "extism-convert", + "extism-manifest", + "extism-pdk-derive", + "serde", + "serde_json", +] + +[[package]] +name = "extism-pdk-derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d086daea5fd844e3c5ac69ddfe36df4a9a43e7218cf7d1f888182b089b09806c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oxicloud-plugin-hello" +version = "0.1.0" +dependencies = [ + "extism-pdk", + "serde_json", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[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 = "prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[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.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "syn" +version = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/wasm/oxicloud-plugin-hello/Cargo.toml b/wasm/oxicloud-plugin-hello/Cargo.toml new file mode 100644 index 00000000..0ad59401 --- /dev/null +++ b/wasm/oxicloud-plugin-hello/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "oxicloud-plugin-hello" +version = "0.1.0" +edition = "2021" +description = "Example OxiCloud plugin (ABI v0) — the artifact the plugin-runtime acceptance test loads. Cargo features build the misbehaving variants used by the failure-isolation tests." +publish = false + +# Standalone workspace root: built only by scripts/build-plugin-hello.sh on the +# wasm32 target, never by the server's `cargo test --workspace` / clippy. +[workspace] + +[lib] +crate-type = ["cdylib"] + +[dependencies] +extism-pdk = "1" +serde_json = "1" + +[features] +default = [] +# Misbehaving variants for the failure-isolation tests. Each builds a separate +# fixture under tests/fixtures/plugins/ via the build script. +panic = [] # `handle` panics -> host must contain the trap +sleep = [] # `handle` busy-loops past the timeout +net = [] # `handle` attempts an outbound HTTP call (denied: no allowed_hosts) +wrong_abi = [] # `abi_version` returns 1 -> host must reject at load + +[profile.release] +opt-level = "s" +lto = true +strip = true diff --git a/wasm/oxicloud-plugin-hello/src/lib.rs b/wasm/oxicloud-plugin-hello/src/lib.rs new file mode 100644 index 00000000..3e9c2983 --- /dev/null +++ b/wasm/oxicloud-plugin-hello/src/lib.rs @@ -0,0 +1,75 @@ +//! Example OxiCloud plugin — ABI v0 (M0 walking skeleton). +//! +//! The default build is the well-behaved "hello" plugin: it reads the +//! `file.uploaded` event metadata, calls the host `log` function (the only +//! authority a plugin has), and returns `{"ok": true}`. +//! +//! Cargo features select the misbehaving variants the host's failure-isolation +//! tests load (`panic`, `sleep`, `net`, `wrong_abi`). See +//! `scripts/build-plugin-hello.sh`. + +use extism_pdk::*; + +/// The one host function OxiCloud exposes, imported from its namespaced module. +#[host_fn("oxicloud:host:v0")] +extern "ExtismHost" { + fn log(level: String, message: String); +} + +/// Required export: which ABI this plugin was built against. The host rejects +/// the plugin at load if this does not equal its own `OXICLOUD_PLUGIN_ABI`. +#[cfg(not(feature = "wrong_abi"))] +#[plugin_fn] +pub fn abi_version() -> FnResult { + Ok(0) +} + +/// `wrong_abi` variant: claim an ABI the host does not speak. +#[cfg(feature = "wrong_abi")] +#[plugin_fn] +pub fn abi_version() -> FnResult { + Ok(1) +} + +/// Required export: the single event entry point. +#[plugin_fn] +pub fn handle(input: String) -> FnResult { + // --- misbehaving variants (compiled in only under their feature) --------- + #[cfg(feature = "panic")] + panic!("intentional panic: exercises host failure isolation"); + + #[cfg(feature = "sleep")] + { + // Busy-loop forever; the host's wall-clock timeout must cancel us. + let mut spin: u64 = 0; + loop { + spin = spin.wrapping_add(1); + std::hint::black_box(spin); + } + } + + #[cfg(feature = "net")] + { + // Attempt an outbound HTTP call. The host grants no `allowed_hosts`, so + // Extism denies this before any socket is opened (offline-deterministic) + // and the error propagates out of `handle`. + let req = HttpRequest::new("https://example.com/"); + let _ = http::request::<()>(&req, None)?; + } + + // --- well-behaved "hello" path ------------------------------------------ + let ev: serde_json::Value = serde_json::from_str(&input)?; + let path = ev["payload"]["path"].as_str().unwrap_or(""); + let size = ev["payload"]["size"].as_u64().unwrap_or(0); + + // Prove plugin -> host: call the only authority we have. + unsafe { + log( + "info".to_string(), + format!("hello plugin saw upload: {path} ({size} bytes)"), + )?; + } + + // Prove plugin -> host return path. + Ok(serde_json::json!({ "ok": true }).to_string()) +}