diff --git a/Cargo.lock b/Cargo.lock index 674fd4f33f..78dde56106 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9acbfca36652500c911ddb767ed433e3ed99b032b5d935be73c6923662db1d43" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli 0.32.3", ] @@ -1443,7 +1443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml", + "toml 0.8.19", ] [[package]] @@ -1682,7 +1682,7 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml", + "toml 0.8.19", "yaml-rust2", ] @@ -1822,36 +1822,36 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c088d3406f0c0252efa7445adfd2d05736bfb5218838f64eaf79d567077aed14" +checksum = "30054f4aef4d614d37f27d5b77e36e165f0b27a71563be348e7c9fcfac41eed8" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c03f887a763abb9c1dc08f722aa82b69067fda623b6f0273050f45f8b1a6776" +checksum = "0beab56413879d4f515e08bcf118b1cb85f294129bb117057f573d37bfbb925a" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206887a11a43f507fee320a218dc365980bfc42ec2696792079a9f8c9369e90" +checksum = "6d054747549a69b264d5299c8ca1b0dd45dc6bd0ee43f1edfcc42a8b12952c7a" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac0790c83cfdab95709c5d0105fd888221e3af9049a7d7ec376ec901ab4e4dba" +checksum = "98b92d481b77a7dc9d07c96e24a16f29e0c9c27d042828fdf7e49e54ee9819bf" dependencies = [ "serde", "serde_derive", @@ -1859,9 +1859,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a98aed2d262eda69310e84bae8e053ee4f17dbdd3347b8d9156aa618ba2de0a" +checksum = "6eeccfc043d599b0ef1806942707fc51cdd1c3965c343956dc975a55d82a920f" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -1886,9 +1886,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6906852826988563e9b0a9232ad951f53a47aa41ffd02f8ac852d3f41aae836a" +checksum = "1174cdb9d9d43b2bdaa612a07ed82af13db9b95526bc2c286c2aec4689bcc038" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -1899,24 +1899,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a50105aab667b5cc845f2be37c78475d7cc127cd8ec0a31f7b2b71d526099a7" +checksum = "7d572be73fae802eb115f45e7e67a9ed16acb4ee683b67c4086768786545419a" [[package]] name = "cranelift-control" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6adcc7aa7c0bc1727176a6f2d99c28a9e79a541ccd5ca911a0cb352da8befa36" +checksum = "e1587465cc84c5cc793b44add928771945f3132bbf6b3621ee9473c631a87156" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981b56af777f9a34ea6dcce93255125776d391410c2a68b75bed5941b714fa15" +checksum = "063b83448b1343e79282c3c7cbda7ed5f0816f0b763a4c15f7cecb0a17d87ea6" dependencies = [ "cranelift-bitset", "serde", @@ -1925,9 +1925,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea982589684dfb71afecb9fc09555c3a266300a1162a60d7fa39d41a5705b1c" +checksum = "aa4461c2d2ca48bc72883f5f5c3129d9aefac832df1db824af9db8db3efee109" dependencies = [ "cranelift-codegen", "log", @@ -1937,15 +1937,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0422686b22ed6a1f33cc40e3c43eb84b67155788568d1a5cac8439d3dca1783" +checksum = "acd811b25e18f14810d09c504e06098acc1d9dbfa24879bf0d6b6fb44415fc66" [[package]] name = "cranelift-native" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f697bbbe135c655ea1deb7af0bae4a5c4fae2c88fdfc0fa57b34ae58c91040" +checksum = "2417046989d8d6367a55bbab2e406a9195d176f4779be4aa484d645887217d37" dependencies = [ "cranelift-codegen", "libc", @@ -1954,9 +1954,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718efe674f3df645462677e22a3128e890d88ba55821bb091083d257707be76c" +checksum = "8d039de901c8d928222b8128e1b9a9ab27b82a7445cb749a871c75d9cb25c57d" [[package]] name = "crc32fast" @@ -6722,9 +6722,9 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beafc309a2d35e16cc390644d88d14dfa45e45e15075ec6a9e37f6dfb43e926f" +checksum = "0a09eb45f768f3a0396e85822790d867000c8b5f11551e7268c279e991457b16" dependencies = [ "cranelift-bitset", "log", @@ -6734,9 +6734,9 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885fbb6c07454cfc8725a18a1da3cfc328ee8c53fb8d0671ea313edc8567947" +checksum = "e29368432b8b7a8a343b75a6914621fad905c95d5c5297449a6546c127224f7a" dependencies = [ "proc-macro2", "quote", @@ -7950,6 +7950,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -8232,7 +8241,7 @@ dependencies = [ "spin-factors-test", "spin-locked-app", "tokio", - "toml", + "toml 0.8.19", ] [[package]] @@ -8248,7 +8257,7 @@ dependencies = [ "subprocess", "terminal", "tokio", - "toml", + "toml 0.8.19", "topological-sort", "tracing", ] @@ -8283,6 +8292,7 @@ dependencies = [ "openssl", "path-absolutize", "pretty_assertions", + "rand 0.9.1", "redis", "regex", "reqwest 0.12.9", @@ -8319,7 +8329,7 @@ dependencies = [ "test-environment", "testing-framework", "tokio", - "toml", + "toml 0.8.19", "tracing", "url", "uuid", @@ -8355,7 +8365,7 @@ dependencies = [ "serde_json", "tempfile", "tokio", - "toml", + "toml 0.8.19", "tracing", "wasm-encoder 0.240.0", "wasm-metadata 0.240.0", @@ -8417,7 +8427,7 @@ dependencies = [ "tempfile", "terminal", "tokio", - "toml", + "toml 0.8.19", "toml_edit", "tracing", "ui-testing", @@ -8446,7 +8456,7 @@ dependencies = [ "spin-manifest", "spin-serde", "tokio", - "toml", + "toml 0.8.19", "tracing", "wac-graph", "wac-types", @@ -8467,7 +8477,7 @@ dependencies = [ "spin-locked-app", "thiserror 2.0.17", "tokio", - "toml", + "toml 0.8.19", ] [[package]] @@ -8488,7 +8498,7 @@ dependencies = [ "tempfile", "thiserror 2.0.17", "tokio", - "toml", + "toml 0.8.19", "tracing", ] @@ -8507,7 +8517,7 @@ dependencies = [ "spin-telemetry", "spin-world", "tokio", - "toml", + "toml 0.8.19", "tracing", "url", ] @@ -8599,7 +8609,7 @@ dependencies = [ "spin-serde", "tempfile", "tokio", - "toml", + "toml 0.8.19", "tracing", "url", "wasmtime-wasi", @@ -8700,7 +8710,7 @@ dependencies = [ "spin-app", "spin-factors-derive", "thiserror 2.0.17", - "toml", + "toml 0.8.19", "wasmtime", ] @@ -8736,7 +8746,7 @@ dependencies = [ "spin-loader", "spin-telemetry", "tempfile", - "toml", + "toml 0.8.19", ] [[package]] @@ -8755,7 +8765,7 @@ dependencies = [ "spin-factor-outbound-http", "spin-http-routes", "terminal", - "toml", + "toml 0.8.19", "tracing", "wasmtime", "wasmtime-wasi", @@ -8885,7 +8895,7 @@ dependencies = [ "tempfile", "terminal", "tokio", - "toml", + "toml 0.8.19", "tracing", "ui-testing", "wasm-pkg-client", @@ -8918,7 +8928,7 @@ dependencies = [ "spin-serde", "terminal", "thiserror 2.0.17", - "toml", + "toml 0.8.19", "ui-testing", "url", "wasm-pkg-common", @@ -9036,7 +9046,7 @@ dependencies = [ "spin-world", "tempfile", "tokio", - "toml", + "toml 0.8.19", ] [[package]] @@ -9088,7 +9098,7 @@ dependencies = [ "spin-factors", "spin-sqlite-inproc", "spin-sqlite-libsql", - "toml", + "toml 0.8.19", ] [[package]] @@ -9160,7 +9170,7 @@ dependencies = [ "tempfile", "terminal", "tokio", - "toml", + "toml 0.8.19", "toml_edit", "url", "walkdir", @@ -9207,6 +9217,7 @@ dependencies = [ "hyper 1.8.1", "hyper-util", "pin-project-lite", + "rand 0.9.1", "rustls 0.23.18", "rustls-pki-types", "serde", @@ -9285,7 +9296,7 @@ dependencies = [ "spin-expressions", "spin-factors", "tempfile", - "toml", + "toml 0.8.19", ] [[package]] @@ -10005,11 +10016,26 @@ checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "indexmap 2.12.0", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "toml_edit", ] +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap 2.12.0", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow 0.7.13", +] + [[package]] name = "toml_datetime" version = "0.6.8" @@ -10019,6 +10045,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.22.22" @@ -10027,11 +10062,26 @@ checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.12.0", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "winnow 0.6.20", ] +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow 0.7.13", +] + +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tonic" version = "0.12.3" @@ -10624,7 +10674,7 @@ dependencies = [ "warg-crypto", "warg-protocol", "warg-transparency", - "wasm-compose", + "wasm-compose 0.5.5", "wasm-encoder 0.41.2", "wasmparser 0.121.2", "wasmprinter 0.2.80", @@ -10823,6 +10873,27 @@ dependencies = [ "wat", ] +[[package]] +name = "wasm-compose" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feeb9a231e63bd5d5dfe07e9f8daa53d5c85e4f7de5ef756d3b4e6a5f501c578" +dependencies = [ + "anyhow", + "heck 0.4.1", + "im-rc", + "indexmap 2.12.0", + "log", + "petgraph", + "serde", + "serde_derive", + "serde_yaml", + "smallvec", + "wasm-encoder 0.240.0", + "wasmparser 0.240.0", + "wat", +] + [[package]] name = "wasm-encoder" version = "0.41.2" @@ -10980,7 +11051,7 @@ dependencies = [ "thiserror 1.0.69", "tokio", "tokio-util", - "toml", + "toml 0.8.19", "tracing", "tracing-subscriber", "url", @@ -11009,7 +11080,7 @@ dependencies = [ "sha2", "thiserror 1.0.69", "tokio", - "toml", + "toml 0.8.19", ] [[package]] @@ -11109,22 +11180,22 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.239.0" +version = "0.240.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3981f3d51f39f24f5fc90f93049a90f08dbbca8deba602cd46bb8ca67a94718" +checksum = "a84d6e25c198da67d0150ee7c2c62d33d784f0a565d1e670bdf1eeccca8158bc" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.239.0", + "wasmparser 0.240.0", ] [[package]] name = "wasmtime" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81eafc07c867be94c47e0dc66355d9785e09107a18901f76a20701ba0663ad7" +checksum = "511bc19c2d48f338007dc941cb40c833c4707023fdaf9ec9b97cf1d5a62d26bb" dependencies = [ - "addr2line 0.25.0", + "addr2line 0.25.1", "anyhow", "async-trait", "bitflags 2.10.0", @@ -11155,8 +11226,10 @@ dependencies = [ "serde_json", "smallvec", "target-lexicon", - "wasm-encoder 0.239.0", - "wasmparser 0.239.0", + "tempfile", + "wasm-compose 0.240.0", + "wasm-encoder 0.240.0", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-cache", "wasmtime-internal-component-macro", @@ -11176,9 +11249,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78587abe085a44a13c90fa16fea6db014e9883e627a7044d7f0cb397ad08d1da" +checksum = "c3b0d53657fea2a8cee8ed1866ad45d2e5bc21be958a626a1dd9b7de589851b3" dependencies = [ "anyhow", "cpp_demangle", @@ -11195,17 +11268,17 @@ dependencies = [ "serde_derive", "smallvec", "target-lexicon", - "wasm-encoder 0.239.0", - "wasmparser 0.239.0", - "wasmprinter 0.239.0", + "wasm-encoder 0.240.0", + "wasmparser 0.240.0", + "wasmprinter 0.240.0", "wasmtime-internal-component-util", ] [[package]] name = "wasmtime-internal-cache" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78fb9299e318b0af3efb75d88321515a20a5ccb040bcde1f0f7d46d656fa8fef" +checksum = "35e065628d2a6eccb722de71c6d9b58771f5c3c4f9d35f6cb6d9d92370f4c2b4" dependencies = [ "anyhow", "base64 0.22.1", @@ -11216,16 +11289,16 @@ dependencies = [ "serde", "serde_derive", "sha2", - "toml", + "toml 0.9.8", "windows-sys 0.60.2", "zstd", ] [[package]] name = "wasmtime-internal-component-macro" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d843bb444f2d1509ea9304ad749242d1fa5de95cde67665bfcdcafa0f360925c" +checksum = "c933104f57d27dd1e6c7bd9ee5df3242bdd1962d9381bc08fa5d4e60e1f5ebdf" dependencies = [ "anyhow", "proc-macro2", @@ -11233,20 +11306,20 @@ dependencies = [ "syn 2.0.108", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser 0.239.0", + "wit-parser 0.240.0", ] [[package]] name = "wasmtime-internal-component-util" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801ee1a80ab66f065a88c6a62f2d495d5540d027b366757c6a53e9c42f153aef" +checksum = "63ef2a95a5dbaa70fc3ef682ea8997e51cdd819b4d157a1100477cf43949d454" [[package]] name = "wasmtime-internal-cranelift" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb50f1c50365c32e557266ca85acdf77696c44a3f98797ba6af58cebc6d6d1e" +checksum = "73122df6a8cf417ce486a94e844d3a60797217ce7ae69653e0ee9e28269e0fa5" dependencies = [ "anyhow", "cfg-if", @@ -11263,7 +11336,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.17", - "wasmparser 0.239.0", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-math", "wasmtime-internal-unwinder", @@ -11272,9 +11345,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9308cdb17f8d51e3164185616d809e28c29a6515c03b9dd95c89436b71f6d154" +checksum = "54ead059e58b54a7abbe0bfb9457b3833ebd2ad84326c248a835ff76d64c7c6f" dependencies = [ "anyhow", "cc", @@ -11287,9 +11360,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-debug" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c9b63a22bf2a8b6a149a41c6768bc17a8b2e3288a249cb8216987fbd7128e81" +checksum = "3af620a4ac1623298c90d3736644e12d66974951d1e38d0464798de85c984e17" dependencies = [ "cc", "object 0.37.3", @@ -11299,9 +11372,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e042b6e3de2f3d708279f89f50b4b9aa1b9bab177300cdffb0ffcd2816df5" +checksum = "b97ccd36e25390258ce6720add639ffe5a7d81a5c904350aa08f5bbc60433d22" dependencies = [ "anyhow", "cfg-if", @@ -11311,24 +11384,24 @@ dependencies = [ [[package]] name = "wasmtime-internal-math" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c1f0674f38cd7d014eb1a49ea1d1766cca1a64459e8856ee118a10005302e16" +checksum = "cd1b856e1bbf0230ab560ba4204e944b141971adc4e6cdf3feb6979c1a7b7953" dependencies = [ "libm", ] [[package]] name = "wasmtime-internal-slab" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb24b7535306713e7a250f8b71e35f05b6a5031bf9c3ed7330c308e899cbe7d3" +checksum = "8908e71a780b97cbd3d8f3a0c446ac8df963069e0f3f38c9eace4f199d4d3e65" [[package]] name = "wasmtime-internal-unwinder" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d5a80e2623a49cb8e8c419542337b8fe0260b162c40dcc201080a84cbe9b7c" +checksum = "fb9c2f8223a0ef96527f0446b80c7d0d9bb0577c7b918e3104bd6d4cdba1d101" dependencies = [ "anyhow", "cfg-if", @@ -11339,9 +11412,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e277f734b9256359b21517c3b0c26a2a9de6c53a51b670ae55cdcde548bf4e" +checksum = "2b0fb82cdbffd6cafc812c734a22fa753102888b8760ecf6a08cbb50367a458a" dependencies = [ "proc-macro2", "quote", @@ -11350,9 +11423,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-winch" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4dc9333737142f6ece4369c8bcdda03a11edbd43d8fbd3e15004c194b9b743" +checksum = "f1cfd68149cef86afd9a6c9b51e461266dfa66b37b4c6fdf1201ddbf7f906271" dependencies = [ "anyhow", "cranelift-codegen", @@ -11360,7 +11433,7 @@ dependencies = [ "log", "object 0.37.3", "target-lexicon", - "wasmparser 0.239.0", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-cranelift", "winch-codegen", @@ -11368,22 +11441,22 @@ dependencies = [ [[package]] name = "wasmtime-internal-wit-bindgen" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f758625553fe33fdce0713f63bb7784c4f5fecb7f7cd4813414519ec24b6a4c" +checksum = "a628437073400148f1ba2b55beb60eb376dc5ca538745994c83332b037d1f3fa" dependencies = [ "anyhow", "bitflags 2.10.0", "heck 0.5.0", "indexmap 2.12.0", - "wit-parser 0.239.0", + "wit-parser 0.240.0", ] [[package]] name = "wasmtime-wasi" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55abdad51f519217927f45eaae73ca0cd46eb76688628a49784f41b5b19b8ed6" +checksum = "517604b1ce13a56ae3e360217095d7d4db90e84deaa3fba078877c2b80cc5851" dependencies = [ "anyhow", "async-trait", @@ -11412,9 +11485,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-http" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570346788aba8c1196829ae922f766ebf87b2882facabd618d7946670332d081" +checksum = "63d735c8a0ef1bb49810f4da75acfdba2390cb4e9de7385bffb8cda77d20d401" dependencies = [ "anyhow", "async-trait", @@ -11437,9 +11510,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-io" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d7f6e8ea0c4842e31b01721527a825f55ae73a2fa095d8b3f7ddbd75e3661" +checksum = "7ec66fc94ceb9497d62a3d082bd2cce10348975795516553df4cd89f7d5fc14b" dependencies = [ "anyhow", "async-trait", @@ -11617,12 +11690,11 @@ dependencies = [ [[package]] name = "wiggle" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ee0c6dd73bdf0aff4404059bdc24ca61ad92056d20f4e59b8b0780789cafb4" +checksum = "bb9c745158119785cf3098c97151cfcc33104ade6489bfa158b73d3f5979fa24" dependencies = [ "anyhow", - "async-trait", "bitflags 2.10.0", "thiserror 2.0.17", "tracing", @@ -11632,9 +11704,9 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e415549583fd492ccab881076fa5c41590362d3b5e99df793f619d67333c97b" +checksum = "b8a98d02cd1ba87ca6039f28f4f4c0b53a9ff2684f5f2640f471af9bc608b9d9" dependencies = [ "anyhow", "heck 0.5.0", @@ -11646,9 +11718,9 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a533b4fdc593bf9c4bf52ae0b3a126f15babfb25fce03bfe0bcc84e1172222" +checksum = "6a111938ed6e662d5f5036bb3cac8d10d5bea77a536885d6d4a4667c9cba97a2" dependencies = [ "proc-macro2", "quote", @@ -11689,9 +11761,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c0bb17ae9bf89ebc74512150e6ee0a27b1eac5ff3b54d8cec264f4b4255022d" +checksum = "b1de5a648102e39c8e817ed25e3820f4b9772f3c9c930984f32737be60e3156b" dependencies = [ "anyhow", "cranelift-assembler-x64", @@ -11701,7 +11773,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.17", - "wasmparser 0.239.0", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-cranelift", "wasmtime-internal-math", @@ -12254,24 +12326,6 @@ dependencies = [ "wasmparser 0.235.0", ] -[[package]] -name = "wit-parser" -version = "0.239.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c92c939d667b7bf0c6bf2d1f67196529758f99a2a45a3355cc56964fd5315d" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.12.0", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser 0.239.0", -] - [[package]] name = "wit-parser" version = "0.240.0" diff --git a/Cargo.toml b/Cargo.toml index 215c41ecb3..8a6bd78017 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,6 +74,7 @@ spin-trigger = { path = "crates/trigger" } spin-trigger-http = { path = "crates/trigger-http" } spin-trigger-redis = { path = "crates/trigger-redis" } terminal = { path = "crates/terminal" } +rand.workspace = true [target.'cfg(target_os = "linux")'.dependencies] # This needs to be an explicit dependency to enable @@ -179,9 +180,9 @@ wasm-metadata = "0.240.0" wasm-pkg-client = "0.11" wasm-pkg-common = "0.11" wasmparser = "0.240.0" -wasmtime = { version = "38.0.4", features = ["component-model-async"] } -wasmtime-wasi = { version = "38.0.4", features = ["p3"] } -wasmtime-wasi-http = { version = "38.0.4", features = ["p3"] } +wasmtime = { version = "39.0.1", features = ["component-model-async"] } +wasmtime-wasi = { version = "39.0.1", features = ["p3"] } +wasmtime-wasi-http = { version = "39.0.1", features = ["p3", "component-model-async"] } wit-component = "0.240.0" wit-parser = "0.240.0" diff --git a/crates/core/src/store.rs b/crates/core/src/store.rs index 2e56d76710..f1424f0506 100644 --- a/crates/core/src/store.rs +++ b/crates/core/src/store.rs @@ -48,6 +48,11 @@ impl Store { pub fn data_mut(&mut self) -> &mut T { self.inner.data_mut() } + + /// Convert `self` to the inner [`wasmtime::Store`]. + pub fn into_inner(self) -> wasmtime::Store { + self.inner + } } impl AsRef> for Store { diff --git a/crates/factor-outbound-http/src/lib.rs b/crates/factor-outbound-http/src/lib.rs index 094b9a21ef..efcb9195d7 100644 --- a/crates/factor-outbound-http/src/lib.rs +++ b/crates/factor-outbound-http/src/lib.rs @@ -32,7 +32,7 @@ pub use wasmtime_wasi_http::{ HttpResult, }; -pub use wasi::{p2_to_p3_error_code, p3_to_p2_error_code}; +pub use wasi::{p2_to_p3_error_code, p3_to_p2_error_code, MutexBody}; #[derive(Default)] pub struct OutboundHttpFactor { diff --git a/crates/factor-outbound-http/src/wasi.rs b/crates/factor-outbound-http/src/wasi.rs index ef8ec62a7d..6383e15827 100644 --- a/crates/factor-outbound-http/src/wasi.rs +++ b/crates/factor-outbound-http/src/wasi.rs @@ -3,8 +3,9 @@ use std::{ future::Future, io::IoSlice, net::SocketAddr, + ops::DerefMut, pin::Pin, - sync::Arc, + sync::{Arc, Mutex}, task::{self, Context, Poll}, time::Duration, }; @@ -12,7 +13,7 @@ use std::{ use bytes::Bytes; use http::{header::HOST, uri::Scheme, Uri}; use http_body::{Body, Frame, SizeHint}; -use http_body_util::{combinators::BoxBody, BodyExt}; +use http_body_util::{combinators::UnsyncBoxBody, BodyExt}; use hyper_util::{ client::legacy::{ connect::{Connected, Connection}, @@ -51,6 +52,34 @@ use crate::{ const DEFAULT_TIMEOUT: Duration = Duration::from_secs(600); +pub struct MutexBody(Mutex); + +impl MutexBody { + pub fn new(body: T) -> Self { + Self(Mutex::new(body)) + } +} + +impl Body for MutexBody { + type Data = T::Data; + type Error = T::Error; + + fn poll_frame( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll, Self::Error>>> { + Pin::new(self.0.lock().unwrap().deref_mut()).poll_frame(cx) + } + + fn is_end_stream(&self) -> bool { + self.0.lock().unwrap().is_end_stream() + } + + fn size_hint(&self) -> SizeHint { + self.0.lock().unwrap().size_hint() + } +} + pub(crate) struct HasHttp; impl HasData for HasHttp { @@ -60,14 +89,14 @@ impl HasData for HasHttp { impl p3::WasiHttpCtx for InstanceState { fn send_request( &mut self, - request: http::Request>, + request: http::Request>, options: Option, fut: Box> + Send>, ) -> Box< dyn Future< Output = Result< ( - http::Response>, + http::Response>, Box> + Send>, ), TrappableError, @@ -84,6 +113,8 @@ impl p3::WasiHttpCtx for InstanceState { // connection). _ = fut; + let request = request.map(|body| MutexBody::new(body).boxed()); + let request_sender = RequestSender { allowed_hosts: self.allowed_hosts.clone(), component_tls_configs: self.component_tls_configs.clone(), @@ -126,7 +157,7 @@ impl p3::WasiHttpCtx for InstanceState { sleep: None, timeout: between_bytes_timeout, } - .boxed() + .boxed_unsync() }), Box::new(async { // TODO: Can we plumb connection errors through to here, or diff --git a/crates/factor-outbound-http/src/wasi_2023_10_18.rs b/crates/factor-outbound-http/src/wasi_2023_10_18.rs index 642781f4e7..6252768ee2 100644 --- a/crates/factor-outbound-http/src/wasi_2023_10_18.rs +++ b/crates/factor-outbound-http/src/wasi_2023_10_18.rs @@ -12,20 +12,20 @@ mod bindings { imports: { default: trappable }, exports: { default: async }, with: { - "wasi:io/poll/pollable": latest::io::poll::Pollable, - "wasi:io/streams/input-stream": latest::io::streams::InputStream, - "wasi:io/streams/output-stream": latest::io::streams::OutputStream, - "wasi:io/streams/error": latest::io::streams::Error, - "wasi:http/types/incoming-response": latest::http::types::IncomingResponse, - "wasi:http/types/incoming-request": latest::http::types::IncomingRequest, - "wasi:http/types/incoming-body": latest::http::types::IncomingBody, - "wasi:http/types/outgoing-response": latest::http::types::OutgoingResponse, - "wasi:http/types/outgoing-request": latest::http::types::OutgoingRequest, - "wasi:http/types/outgoing-body": latest::http::types::OutgoingBody, - "wasi:http/types/fields": latest::http::types::Fields, - "wasi:http/types/response-outparam": latest::http::types::ResponseOutparam, - "wasi:http/types/future-incoming-response": latest::http::types::FutureIncomingResponse, - "wasi:http/types/future-trailers": latest::http::types::FutureTrailers, + "wasi:io/poll.pollable": latest::io::poll::Pollable, + "wasi:io/streams.input-stream": latest::io::streams::InputStream, + "wasi:io/streams.output-stream": latest::io::streams::OutputStream, + "wasi:io/streams.error": latest::io::streams::Error, + "wasi:http/types.incoming-response": latest::http::types::IncomingResponse, + "wasi:http/types.incoming-request": latest::http::types::IncomingRequest, + "wasi:http/types.incoming-body": latest::http::types::IncomingBody, + "wasi:http/types.outgoing-response": latest::http::types::OutgoingResponse, + "wasi:http/types.outgoing-request": latest::http::types::OutgoingRequest, + "wasi:http/types.outgoing-body": latest::http::types::OutgoingBody, + "wasi:http/types.fields": latest::http::types::Fields, + "wasi:http/types.response-outparam": latest::http::types::ResponseOutparam, + "wasi:http/types.future-incoming-response": latest::http::types::FutureIncomingResponse, + "wasi:http/types.future-trailers": latest::http::types::FutureTrailers, }, }); } diff --git a/crates/factor-outbound-http/src/wasi_2023_11_10.rs b/crates/factor-outbound-http/src/wasi_2023_11_10.rs index 0dac3797f4..22ee2d6166 100644 --- a/crates/factor-outbound-http/src/wasi_2023_11_10.rs +++ b/crates/factor-outbound-http/src/wasi_2023_11_10.rs @@ -15,21 +15,21 @@ mod bindings { imports: { default: trappable }, exports: { default: async }, with: { - "wasi:io/poll/pollable": latest::io::poll::Pollable, - "wasi:io/streams/input-stream": latest::io::streams::InputStream, - "wasi:io/streams/output-stream": latest::io::streams::OutputStream, - "wasi:io/error/error": latest::io::error::Error, - "wasi:http/types/incoming-response": latest::http::types::IncomingResponse, - "wasi:http/types/incoming-request": latest::http::types::IncomingRequest, - "wasi:http/types/incoming-body": latest::http::types::IncomingBody, - "wasi:http/types/outgoing-response": latest::http::types::OutgoingResponse, - "wasi:http/types/outgoing-request": latest::http::types::OutgoingRequest, - "wasi:http/types/outgoing-body": latest::http::types::OutgoingBody, - "wasi:http/types/fields": latest::http::types::Fields, - "wasi:http/types/response-outparam": latest::http::types::ResponseOutparam, - "wasi:http/types/future-incoming-response": latest::http::types::FutureIncomingResponse, - "wasi:http/types/future-trailers": latest::http::types::FutureTrailers, - "wasi:http/types/request-options": latest::http::types::RequestOptions, + "wasi:io/poll.pollable": latest::io::poll::Pollable, + "wasi:io/streams.input-stream": latest::io::streams::InputStream, + "wasi:io/streams.output-stream": latest::io::streams::OutputStream, + "wasi:io/error.error": latest::io::error::Error, + "wasi:http/types.incoming-response": latest::http::types::IncomingResponse, + "wasi:http/types.incoming-request": latest::http::types::IncomingRequest, + "wasi:http/types.incoming-body": latest::http::types::IncomingBody, + "wasi:http/types.outgoing-response": latest::http::types::OutgoingResponse, + "wasi:http/types.outgoing-request": latest::http::types::OutgoingRequest, + "wasi:http/types.outgoing-body": latest::http::types::OutgoingBody, + "wasi:http/types.fields": latest::http::types::Fields, + "wasi:http/types.response-outparam": latest::http::types::ResponseOutparam, + "wasi:http/types.future-incoming-response": latest::http::types::FutureIncomingResponse, + "wasi:http/types.future-trailers": latest::http::types::FutureTrailers, + "wasi:http/types.request-options": latest::http::types::RequestOptions, }, }); } diff --git a/crates/factor-wasi/src/wasi_2023_10_18.rs b/crates/factor-wasi/src/wasi_2023_10_18.rs index d32032efdf..09739d2072 100644 --- a/crates/factor-wasi/src/wasi_2023_10_18.rs +++ b/crates/factor-wasi/src/wasi_2023_10_18.rs @@ -21,72 +21,72 @@ mod bindings { path: "../../wit", world: "wasi:cli/reactor@0.2.0-rc-2023-10-18", imports: { - "wasi:io/streams/[drop]output-stream": async | trappable, - "wasi:io/streams/[drop]input-stream": async | trappable, - "wasi:filesystem/types/[method]descriptor.access-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.advise": async | trappable, - "wasi:filesystem/types/[method]descriptor.change-directory-permissions-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.change-file-permissions-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.create-directory-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.get-flags": async | trappable, - "wasi:filesystem/types/[method]descriptor.get-type": async | trappable, - "wasi:filesystem/types/[method]descriptor.is-same-object": async | trappable, - "wasi:filesystem/types/[method]descriptor.link-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.lock-exclusive": async | trappable, - "wasi:filesystem/types/[method]descriptor.lock-shared": async | trappable, - "wasi:filesystem/types/[method]descriptor.metadata-hash": async | trappable, - "wasi:filesystem/types/[method]descriptor.metadata-hash-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.open-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.read": async | trappable, - "wasi:filesystem/types/[method]descriptor.read-directory": async | trappable, - "wasi:filesystem/types/[method]descriptor.readlink-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.remove-directory-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.rename-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.set-size": async | trappable, - "wasi:filesystem/types/[method]descriptor.set-times": async | trappable, - "wasi:filesystem/types/[method]descriptor.set-times-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.stat": async | trappable, - "wasi:filesystem/types/[method]descriptor.stat-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.symlink-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.sync": async | trappable, - "wasi:filesystem/types/[method]descriptor.sync-data": async | trappable, - "wasi:filesystem/types/[method]descriptor.try-lock-exclusive": async | trappable, - "wasi:filesystem/types/[method]descriptor.try-lock-shared": async | trappable, - "wasi:filesystem/types/[method]descriptor.unlink-file-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.unlock": async | trappable, - "wasi:filesystem/types/[method]descriptor.write": async | trappable, - "wasi:filesystem/types/[method]directory-entry-stream.read-directory-entry": async | trappable, - "wasi:io/streams/[method]input-stream.blocking-read": async | trappable, - "wasi:io/streams/[method]input-stream.blocking-skip": async | trappable, - "wasi:io/streams/[method]output-stream.forward": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-splice": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-flush": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-write-and-flush": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-write-zeroes-and-flush": async | trappable, - "wasi:io/poll/poll-list": async | trappable, - "wasi:io/poll/poll-one": async | trappable, - - "wasi:sockets/tcp/[method]tcp-socket.start-bind": async | trappable, - "wasi:sockets/tcp/[method]tcp-socket.start-connect": async | trappable, - "wasi:sockets/udp/[method]udp-socket.finish-connect": async | trappable, - "wasi:sockets/udp/[method]udp-socket.receive": async | trappable, - "wasi:sockets/udp/[method]udp-socket.send": async | trappable, - "wasi:sockets/udp/[method]udp-socket.start-bind": async | trappable, + "wasi:io/streams.[drop]output-stream": async | trappable, + "wasi:io/streams.[drop]input-stream": async | trappable, + "wasi:filesystem/types.[method]descriptor.access-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.advise": async | trappable, + "wasi:filesystem/types.[method]descriptor.change-directory-permissions-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.change-file-permissions-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.create-directory-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.get-flags": async | trappable, + "wasi:filesystem/types.[method]descriptor.get-type": async | trappable, + "wasi:filesystem/types.[method]descriptor.is-same-object": async | trappable, + "wasi:filesystem/types.[method]descriptor.link-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.lock-exclusive": async | trappable, + "wasi:filesystem/types.[method]descriptor.lock-shared": async | trappable, + "wasi:filesystem/types.[method]descriptor.metadata-hash": async | trappable, + "wasi:filesystem/types.[method]descriptor.metadata-hash-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.open-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.read": async | trappable, + "wasi:filesystem/types.[method]descriptor.read-directory": async | trappable, + "wasi:filesystem/types.[method]descriptor.readlink-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.remove-directory-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.rename-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.set-size": async | trappable, + "wasi:filesystem/types.[method]descriptor.set-times": async | trappable, + "wasi:filesystem/types.[method]descriptor.set-times-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.stat": async | trappable, + "wasi:filesystem/types.[method]descriptor.stat-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.symlink-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.sync": async | trappable, + "wasi:filesystem/types.[method]descriptor.sync-data": async | trappable, + "wasi:filesystem/types.[method]descriptor.try-lock-exclusive": async | trappable, + "wasi:filesystem/types.[method]descriptor.try-lock-shared": async | trappable, + "wasi:filesystem/types.[method]descriptor.unlink-file-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.unlock": async | trappable, + "wasi:filesystem/types.[method]descriptor.write": async | trappable, + "wasi:filesystem/types.[method]directory-entry-stream.read-directory-entry": async | trappable, + "wasi:io/streams.[method]input-stream.blocking-read": async | trappable, + "wasi:io/streams.[method]input-stream.blocking-skip": async | trappable, + "wasi:io/streams.[method]output-stream.forward": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-splice": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-flush": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-write-and-flush": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-write-zeroes-and-flush": async | trappable, + "wasi:io/poll.poll-list": async | trappable, + "wasi:io/poll.poll-one": async | trappable, + + "wasi:sockets/tcp.[method]tcp-socket.start-bind": async | trappable, + "wasi:sockets/tcp.[method]tcp-socket.start-connect": async | trappable, + "wasi:sockets/udp.[method]udp-socket.finish-connect": async | trappable, + "wasi:sockets/udp.[method]udp-socket.receive": async | trappable, + "wasi:sockets/udp.[method]udp-socket.send": async | trappable, + "wasi:sockets/udp.[method]udp-socket.start-bind": async | trappable, default: trappable, }, with: { - "wasi:io/poll/pollable": latest::io::poll::Pollable, - "wasi:io/streams/input-stream": latest::io::streams::InputStream, - "wasi:io/streams/output-stream": latest::io::streams::OutputStream, - "wasi:io/streams/error": latest::io::streams::Error, - "wasi:filesystem/types/directory-entry-stream": latest::filesystem::types::DirectoryEntryStream, - "wasi:filesystem/types/descriptor": latest::filesystem::types::Descriptor, - "wasi:cli/terminal-input/terminal-input": latest::cli::terminal_input::TerminalInput, - "wasi:cli/terminal-output/terminal-output": latest::cli::terminal_output::TerminalOutput, - "wasi:sockets/tcp/tcp-socket": latest::sockets::tcp::TcpSocket, - "wasi:sockets/udp/udp-socket": UdpSocket, - "wasi:sockets/network/network": latest::sockets::network::Network, - "wasi:sockets/ip-name-lookup/resolve-address-stream": latest::sockets::ip_name_lookup::ResolveAddressStream, + "wasi:io/poll.pollable": latest::io::poll::Pollable, + "wasi:io/streams.input-stream": latest::io::streams::InputStream, + "wasi:io/streams.output-stream": latest::io::streams::OutputStream, + "wasi:io/streams.error": latest::io::streams::Error, + "wasi:filesystem/types.directory-entry-stream": latest::filesystem::types::DirectoryEntryStream, + "wasi:filesystem/types.descriptor": latest::filesystem::types::Descriptor, + "wasi:cli/terminal-input.terminal-input": latest::cli::terminal_input::TerminalInput, + "wasi:cli/terminal-output.terminal-output": latest::cli::terminal_output::TerminalOutput, + "wasi:sockets/tcp.tcp-socket": latest::sockets::tcp::TcpSocket, + "wasi:sockets/udp.udp-socket": UdpSocket, + "wasi:sockets/network.network": latest::sockets::network::Network, + "wasi:sockets/ip-name-lookup.resolve-address-stream": latest::sockets::ip_name_lookup::ResolveAddressStream, }, }); } diff --git a/crates/factor-wasi/src/wasi_2023_11_10.rs b/crates/factor-wasi/src/wasi_2023_11_10.rs index 6380427008..e967d28cf9 100644 --- a/crates/factor-wasi/src/wasi_2023_11_10.rs +++ b/crates/factor-wasi/src/wasi_2023_11_10.rs @@ -18,65 +18,65 @@ mod bindings { path: "../../wit", world: "wasi:cli/reactor@0.2.0-rc-2023-11-10", imports: { - "wasi:io/streams/[drop]input-stream": async | trappable, - "wasi:io/streams/[drop]output-stream": async | trappable, - "wasi:filesystem/types/[method]descriptor.advise": async | trappable, - "wasi:filesystem/types/[method]descriptor.create-directory-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.get-flags": async | trappable, - "wasi:filesystem/types/[method]descriptor.get-type": async | trappable, - "wasi:filesystem/types/[method]descriptor.is-same-object": async | trappable, - "wasi:filesystem/types/[method]descriptor.link-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.metadata-hash": async | trappable, - "wasi:filesystem/types/[method]descriptor.metadata-hash-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.open-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.read": async | trappable, - "wasi:filesystem/types/[method]descriptor.read-directory": async | trappable, - "wasi:filesystem/types/[method]descriptor.readlink-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.remove-directory-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.rename-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.set-size": async | trappable, - "wasi:filesystem/types/[method]descriptor.set-times": async | trappable, - "wasi:filesystem/types/[method]descriptor.set-times-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.stat": async | trappable, - "wasi:filesystem/types/[method]descriptor.stat-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.symlink-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.sync": async | trappable, - "wasi:filesystem/types/[method]descriptor.sync-data": async | trappable, - "wasi:filesystem/types/[method]descriptor.unlink-file-at": async | trappable, - "wasi:filesystem/types/[method]descriptor.write": async | trappable, - "wasi:io/streams/[method]input-stream.blocking-read": async | trappable, - "wasi:io/streams/[method]input-stream.blocking-skip": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-splice": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-flush": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-write-and-flush": async | trappable, - "wasi:io/streams/[method]output-stream.blocking-write-zeroes-and-flush": async | trappable, - "wasi:filesystem/types/[method]directory-entry-stream.read-directory-entry": async | trappable, - "wasi:io/poll/[method]pollable.block": async | trappable, - "wasi:io/poll/[method]pollable.ready": async | trappable, - "wasi:io/poll/poll": async | trappable, - - "wasi:sockets/tcp/[method]tcp-socket.start-bind": async | trappable, - "wasi:sockets/tcp/[method]tcp-socket.start-connect": async | trappable, - "wasi:sockets/udp/[method]udp-socket.start-bind": async | trappable, - "wasi:sockets/udp/[method]udp-socket.stream": async | trappable, - "wasi:sockets/udp/[method]outgoing-datagram-stream.send": async | trappable, + "wasi:io/streams.[drop]input-stream": async | trappable, + "wasi:io/streams.[drop]output-stream": async | trappable, + "wasi:filesystem/types.[method]descriptor.advise": async | trappable, + "wasi:filesystem/types.[method]descriptor.create-directory-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.get-flags": async | trappable, + "wasi:filesystem/types.[method]descriptor.get-type": async | trappable, + "wasi:filesystem/types.[method]descriptor.is-same-object": async | trappable, + "wasi:filesystem/types.[method]descriptor.link-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.metadata-hash": async | trappable, + "wasi:filesystem/types.[method]descriptor.metadata-hash-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.open-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.read": async | trappable, + "wasi:filesystem/types.[method]descriptor.read-directory": async | trappable, + "wasi:filesystem/types.[method]descriptor.readlink-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.remove-directory-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.rename-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.set-size": async | trappable, + "wasi:filesystem/types.[method]descriptor.set-times": async | trappable, + "wasi:filesystem/types.[method]descriptor.set-times-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.stat": async | trappable, + "wasi:filesystem/types.[method]descriptor.stat-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.symlink-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.sync": async | trappable, + "wasi:filesystem/types.[method]descriptor.sync-data": async | trappable, + "wasi:filesystem/types.[method]descriptor.unlink-file-at": async | trappable, + "wasi:filesystem/types.[method]descriptor.write": async | trappable, + "wasi:io/streams.[method]input-stream.blocking-read": async | trappable, + "wasi:io/streams.[method]input-stream.blocking-skip": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-splice": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-flush": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-write-and-flush": async | trappable, + "wasi:io/streams.[method]output-stream.blocking-write-zeroes-and-flush": async | trappable, + "wasi:filesystem/types.[method]directory-entry-stream.read-directory-entry": async | trappable, + "wasi:io/poll.[method]pollable.block": async | trappable, + "wasi:io/poll.[method]pollable.ready": async | trappable, + "wasi:io/poll.poll": async | trappable, + + "wasi:sockets/tcp.[method]tcp-socket.start-bind": async | trappable, + "wasi:sockets/tcp.[method]tcp-socket.start-connect": async | trappable, + "wasi:sockets/udp.[method]udp-socket.start-bind": async | trappable, + "wasi:sockets/udp.[method]udp-socket.stream": async | trappable, + "wasi:sockets/udp.[method]outgoing-datagram-stream.send": async | trappable, default: trappable, }, with: { - "wasi:io/poll/pollable": latest::io::poll::Pollable, - "wasi:io/streams/input-stream": latest::io::streams::InputStream, - "wasi:io/streams/output-stream": latest::io::streams::OutputStream, - "wasi:io/error/error": latest::io::error::Error, - "wasi:filesystem/types/directory-entry-stream": latest::filesystem::types::DirectoryEntryStream, - "wasi:filesystem/types/descriptor": latest::filesystem::types::Descriptor, - "wasi:cli/terminal-input/terminal-input": latest::cli::terminal_input::TerminalInput, - "wasi:cli/terminal-output/terminal-output": latest::cli::terminal_output::TerminalOutput, - "wasi:sockets/tcp/tcp-socket": latest::sockets::tcp::TcpSocket, - "wasi:sockets/udp/udp-socket": latest::sockets::udp::UdpSocket, - "wasi:sockets/udp/outgoing-datagram-stream": latest::sockets::udp::OutgoingDatagramStream, - "wasi:sockets/udp/incoming-datagram-stream": latest::sockets::udp::IncomingDatagramStream, - "wasi:sockets/network/network": latest::sockets::network::Network, - "wasi:sockets/ip-name-lookup/resolve-address-stream": latest::sockets::ip_name_lookup::ResolveAddressStream, + "wasi:io/poll.pollable": latest::io::poll::Pollable, + "wasi:io/streams.input-stream": latest::io::streams::InputStream, + "wasi:io/streams.output-stream": latest::io::streams::OutputStream, + "wasi:io/error.error": latest::io::error::Error, + "wasi:filesystem/types.directory-entry-stream": latest::filesystem::types::DirectoryEntryStream, + "wasi:filesystem/types.descriptor": latest::filesystem::types::Descriptor, + "wasi:cli/terminal-input.terminal-input": latest::cli::terminal_input::TerminalInput, + "wasi:cli/terminal-output.terminal-output": latest::cli::terminal_output::TerminalOutput, + "wasi:sockets/tcp.tcp-socket": latest::sockets::tcp::TcpSocket, + "wasi:sockets/udp.udp-socket": latest::sockets::udp::UdpSocket, + "wasi:sockets/udp.outgoing-datagram-stream": latest::sockets::udp::OutgoingDatagramStream, + "wasi:sockets/udp.incoming-datagram-stream": latest::sockets::udp::IncomingDatagramStream, + "wasi:sockets/network.network": latest::sockets::network::Network, + "wasi:sockets/ip-name-lookup.resolve-address-stream": latest::sockets::ip_name_lookup::ResolveAddressStream, }, }); } diff --git a/crates/factors-executor/src/lib.rs b/crates/factors-executor/src/lib.rs index 17feeb138f..04734fd5b5 100644 --- a/crates/factors-executor/src/lib.rs +++ b/crates/factors-executor/src/lib.rs @@ -260,6 +260,18 @@ impl FactorsInstanceBuilder<'_, T, U> { let instance = self.instance_pre.instantiate_async(&mut store).await?; Ok((instance, store)) } + + pub fn instantiate_store( + self, + executor_instance_state: U, + ) -> anyhow::Result>> { + let instance_state = InstanceState { + core: Default::default(), + factors: self.factors.build_instance_state(self.factor_builders)?, + executor: executor_instance_state, + }; + self.store_builder.build(instance_state) + } } /// InstanceState is the [`spin_core::Store`] `data` for an instance. diff --git a/crates/http/src/trigger.rs b/crates/http/src/trigger.rs index 18b9283008..359c6637ca 100644 --- a/crates/http/src/trigger.rs +++ b/crates/http/src/trigger.rs @@ -4,7 +4,8 @@ use spin_factor_outbound_http::wasi_2023_11_10::ProxyIndices as ProxyIndices2023 use wasmtime::component::InstancePre; use wasmtime_wasi::p2::bindings::CommandIndices; use wasmtime_wasi_http::bindings::ProxyIndices; -use wasmtime_wasi_http::p3::bindings::ProxyIndices as P3ProxyIndices; +use wasmtime_wasi_http::handler::{HandlerState, ProxyHandler, ProxyPre}; +use wasmtime_wasi_http::p3::bindings::ProxyPre as P3ProxyPre; use crate::config::HttpExecutorType; @@ -21,11 +22,11 @@ pub fn default_base() -> String { } /// The type of http handler export used by a component. -pub enum HandlerType { +pub enum HandlerType { Spin, Wagi(CommandIndices), Wasi0_2(ProxyIndices), - Wasi0_3(P3ProxyIndices), + Wasi0_3(ProxyHandler), Wasi2023_11_10(ProxyIndices2023_11_10), Wasi2023_10_18(ProxyIndices2023_10_18), } @@ -41,15 +42,18 @@ const WASI_HTTP_EXPORT_0_3_0_RC_2025_09_16: &str = "wasi:http/handler@0.3.0-rc-2 /// The `inbound-http` export for `fermyon:spin` const SPIN_HTTP_EXPORT: &str = "fermyon:spin/inbound-http"; -impl HandlerType { +impl> HandlerType { /// Determine the handler type from the exports of a component. - pub fn from_instance_pre(pre: &InstancePre) -> anyhow::Result { + pub fn from_instance_pre(pre: &InstancePre, handler_state: S) -> anyhow::Result { let mut candidates = Vec::new(); if let Ok(indices) = ProxyIndices::new(pre) { candidates.push(HandlerType::Wasi0_2(indices)); } - if let Ok(indices) = P3ProxyIndices::new(pre) { - candidates.push(HandlerType::Wasi0_3(indices)); + if let Ok(pre) = P3ProxyPre::new(pre.clone()) { + candidates.push(HandlerType::Wasi0_3(ProxyHandler::new( + handler_state, + ProxyPre::P3(pre), + ))); } if let Ok(indices) = ProxyIndices2023_10_18::new(pre) { candidates.push(HandlerType::Wasi2023_10_18(indices)); diff --git a/crates/trigger-http/Cargo.toml b/crates/trigger-http/Cargo.toml index 62637df8d3..2bce144d6d 100644 --- a/crates/trigger-http/Cargo.toml +++ b/crates/trigger-http/Cargo.toml @@ -17,6 +17,7 @@ http-body-util = { workspace = true } hyper = { workspace = true } hyper-util = { workspace = true } pin-project-lite = { workspace = true } +rand.workspace = true rustls = { workspace = true } rustls-pki-types = { workspace = true } serde = { workspace = true } diff --git a/crates/trigger-http/src/lib.rs b/crates/trigger-http/src/lib.rs index 2aaeb9582d..aea876b3ae 100644 --- a/crates/trigger-http/src/lib.rs +++ b/crates/trigger-http/src/lib.rs @@ -12,13 +12,20 @@ mod wasip3; use std::{ error::Error, + fmt::Display, net::{Ipv4Addr, SocketAddr, ToSocketAddrs}, path::PathBuf, + str::FromStr, sync::Arc, + time::Duration, }; use anyhow::{bail, Context}; use clap::Args; +use rand::{ + distr::uniform::{SampleRange, SampleUniform}, + RngCore, +}; use serde::Deserialize; use spin_app::App; use spin_factors::RuntimeFactors; @@ -31,6 +38,11 @@ pub use tls::TlsConfig; pub(crate) use wasmtime_wasi_http::body::HyperIncomingBody as Body; +const DEFAULT_WASIP3_MAX_INSTANCE_REUSE_COUNT: usize = 128; +const DEFAULT_WASIP3_MAX_INSTANCE_CONCURRENT_REUSE_COUNT: usize = 16; +const DEFAULT_REQUEST_TIMEOUT: Option> = None; +const DEFAULT_IDLE_INSTANCE_TIMEOUT: Range = Range::Value(Duration::from_secs(1)); + /// A [`spin_trigger::TriggerApp`] for the HTTP trigger. pub(crate) type TriggerApp = spin_trigger::TriggerApp; @@ -58,6 +70,59 @@ pub struct CliArgs { #[clap(long = "find-free-port")] pub find_free_port: bool, + + /// Maximum number of requests to send to a single component instance before + /// dropping it. + /// + /// This defaults to 1 for WASIp2 components and 128 for WASIp3 components. + /// As of this writing, setting it to more than 1 will have no effect for + /// WASIp2 components, but that may change in the future. + /// + /// This may be specified either as an integer value or as a range, + /// e.g. 1..8. If it's a range, a number will be selected from that range + /// at random for each new instance. + #[clap(long, value_parser = parse_usize_range)] + max_instance_reuse_count: Option>, + + /// Maximum number of concurrent requests to send to a single component + /// instance. + /// + /// This defaults to 1 for WASIp2 components and 16 for WASIp3 components. + /// Note that setting it to more than 1 will have no effect for WASIp2 + /// components since they cannot be called concurrently. + /// + /// This may be specified either as an integer value or as a range, + /// e.g. 1..8. If it's a range, a number will be selected from that range + /// at random for each new instance. + #[clap(long, value_parser = parse_usize_range)] + max_instance_concurrent_reuse_count: Option>, + + /// Request timeout to enforce. + /// + /// As of this writing, this only affects WASIp3 components. + /// + /// A number with no suffix or with an `s` suffix is interpreted as seconds; + /// other accepted suffixes include `ms` (milliseconds), `us` or `μs` + /// (microseconds), and `ns` (nanoseconds). + /// + /// This may be specified either as a single time value or as a range, + /// e.g. 1..8s. If it's a range, a value will be selected from that range + /// at random for each new instance. + #[clap(long, value_parser = parse_duration_range)] + request_timeout: Option>, + + /// Time to hold an idle component instance for possible reuse before + /// dropping it. + /// + /// A number with no suffix or with an `s` suffix is interpreted as seconds; + /// other accepted suffixes include `ms` (milliseconds), `us` or `μs` + /// (microseconds), and `ns` (nanoseconds). + /// + /// This may be specified either as a single time value or as a range, + /// e.g. 1..8s. If it's a range, a value will be selected from that range + /// at random for each new instance. + #[clap(long, default_value = "1s", value_parser = parse_duration_range)] + idle_instance_timeout: Range, } impl CliArgs { @@ -73,6 +138,112 @@ impl CliArgs { } } +#[derive(Copy, Clone)] +enum Range { + Value(T), + Bounds(T, T), +} + +impl Range { + fn map(self, fun: impl Fn(T) -> V) -> Range { + match self { + Self::Value(v) => Range::Value(fun(v)), + Self::Bounds(a, b) => Range::Bounds(fun(a), fun(b)), + } + } +} + +impl SampleRange for Range { + fn sample_single( + self, + rng: &mut R, + ) -> Result { + match self { + Self::Value(v) => Ok(v), + Self::Bounds(a, b) => (a..b).sample_single(rng), + } + } + + fn is_empty(&self) -> bool { + match self { + Self::Value(_) => false, + Self::Bounds(a, b) => (a..b).is_empty(), + } + } +} + +fn parse_range(s: &str) -> Result, String> +where + T::Err: Display, +{ + let error = |e| format!("expected integer or range; got {s:?}; {e}"); + if let Some((start, end)) = s.split_once("..") { + Ok(Range::Bounds( + start.parse().map_err(error)?, + end.parse().map_err(error)?, + )) + } else { + Ok(Range::Value(s.parse().map_err(error)?)) + } +} + +fn parse_usize_range(s: &str) -> Result, String> { + parse_range(s) +} + +struct ParsedDuration(Duration); + +impl FromStr for ParsedDuration { + type Err = String; + + fn from_str(s: &str) -> Result { + let error = |e| { + format!("expected integer suffixed by `s`, `ms`, `us`, `μs`, or `ns`; got {s:?}; {e}") + }; + Ok(Self(match s.parse() { + Ok(val) => Duration::from_secs(val), + Err(err) => { + if let Some(num) = s.strip_suffix("s") { + Duration::from_secs(num.parse().map_err(error)?) + } else if let Some(num) = s.strip_suffix("ms") { + Duration::from_millis(num.parse().map_err(error)?) + } else if let Some(num) = s.strip_suffix("us").or(s.strip_suffix("μs")) { + Duration::from_micros(num.parse().map_err(error)?) + } else if let Some(num) = s.strip_suffix("ns") { + Duration::from_nanos(num.parse().map_err(error)?) + } else { + return Err(error(err)); + } + } + })) + } +} + +fn parse_duration_range(s: &str) -> Result, String> { + parse_range::(s).map(|v| v.map(|v| v.0)) +} + +#[derive(Clone, Copy)] +pub struct InstanceReuseConfig { + max_instance_reuse_count: Range, + max_instance_concurrent_reuse_count: Range, + request_timeout: Option>, + idle_instance_timeout: Range, +} + +impl Default for InstanceReuseConfig { + fn default() -> Self { + Self { + max_instance_reuse_count: Range::Value(DEFAULT_WASIP3_MAX_INSTANCE_REUSE_COUNT), + max_instance_concurrent_reuse_count: Range::Value( + DEFAULT_WASIP3_MAX_INSTANCE_CONCURRENT_REUSE_COUNT, + ), + request_timeout: DEFAULT_REQUEST_TIMEOUT, + idle_instance_timeout: DEFAULT_IDLE_INSTANCE_TIMEOUT, + } + } +} + /// The Spin HTTP trigger. pub struct HttpTrigger { /// The address the server should listen on. @@ -83,6 +254,7 @@ pub struct HttpTrigger { tls_config: Option, find_free_port: bool, http1_max_buf_size: Option, + reuse_config: InstanceReuseConfig, } impl Trigger for HttpTrigger { @@ -94,6 +266,18 @@ impl Trigger for HttpTrigger { fn new(cli_args: Self::CliArgs, app: &spin_app::App) -> anyhow::Result { let find_free_port = cli_args.find_free_port; let http1_max_buf_size = cli_args.http1_max_buf_size; + let reuse_config = InstanceReuseConfig { + max_instance_reuse_count: cli_args + .max_instance_reuse_count + .unwrap_or(Range::Value(DEFAULT_WASIP3_MAX_INSTANCE_REUSE_COUNT)), + max_instance_concurrent_reuse_count: cli_args + .max_instance_concurrent_reuse_count + .unwrap_or(Range::Value( + DEFAULT_WASIP3_MAX_INSTANCE_CONCURRENT_REUSE_COUNT, + )), + request_timeout: cli_args.request_timeout, + idle_instance_timeout: cli_args.idle_instance_timeout, + }; Self::new( app, @@ -101,6 +285,7 @@ impl Trigger for HttpTrigger { cli_args.into_tls_config(), find_free_port, http1_max_buf_size, + reuse_config, ) } @@ -125,6 +310,7 @@ impl HttpTrigger { tls_config: Option, find_free_port: bool, http1_max_buf_size: Option, + reuse_config: InstanceReuseConfig, ) -> anyhow::Result { Self::validate_app(app)?; @@ -133,6 +319,7 @@ impl HttpTrigger { tls_config, find_free_port, http1_max_buf_size, + reuse_config, }) } @@ -146,6 +333,7 @@ impl HttpTrigger { tls_config, find_free_port, http1_max_buf_size, + reuse_config, } = self; let server = Arc::new(HttpServer::new( listen_addr, @@ -153,6 +341,7 @@ impl HttpTrigger { find_free_port, trigger_app, http1_max_buf_size, + reuse_config, )?); Ok(server) } diff --git a/crates/trigger-http/src/server.rs b/crates/trigger-http/src/server.rs index 6aa53f6fa2..507a134f12 100644 --- a/crates/trigger-http/src/server.rs +++ b/crates/trigger-http/src/server.rs @@ -4,6 +4,7 @@ use std::{ io::{ErrorKind, IsTerminal}, net::SocketAddr, sync::Arc, + time::Duration, }; use anyhow::{bail, Context}; @@ -20,9 +21,11 @@ use hyper_util::{ rt::{TokioExecutor, TokioIo}, server::conn::auto::Builder, }; +use rand::Rng; use spin_app::{APP_DESCRIPTION_KEY, APP_NAME_KEY}; use spin_factor_outbound_http::{OutboundHttpFactor, SelfRequestOrigin}; use spin_factors::RuntimeFactors; +use spin_factors_executor::InstanceState; use spin_http::{ app_info::AppInfo, body, @@ -38,6 +41,7 @@ use tokio::{ use tracing::Instrument; use wasmtime_wasi::p2::bindings::CommandIndices; use wasmtime_wasi_http::body::HyperOutgoingBody; +use wasmtime_wasi_http::handler::{HandlerState, StoreBundle}; use crate::{ headers::strip_forbidden_headers, @@ -47,7 +51,7 @@ use crate::{ wagi::WagiHttpExecutor, wasi::WasiHttpExecutor, wasip3::Wasip3HttpExecutor, - Body, NotFoundRouteKind, TlsConfig, TriggerApp, TriggerInstanceBuilder, + Body, InstanceReuseConfig, NotFoundRouteKind, TlsConfig, TriggerApp, TriggerInstanceBuilder, }; pub const MAX_RETRIES: u16 = 10; @@ -65,11 +69,11 @@ pub struct HttpServer { /// Request router. router: Router, /// The app being triggered. - trigger_app: TriggerApp, + trigger_app: Arc>, // Component ID -> component trigger config component_trigger_configs: HashMap, // Component ID -> handler type - component_handler_types: HashMap, + component_handler_types: HashMap>>, } impl HttpServer { @@ -80,6 +84,7 @@ impl HttpServer { find_free_port: bool, trigger_app: TriggerApp, http1_max_buf_size: Option, + reuse_config: InstanceReuseConfig, ) -> anyhow::Result { // This needs to be a vec before building the router to handle duplicate routes let component_trigger_configs = trigger_app @@ -122,6 +127,8 @@ impl HttpServer { // Now that router is built we can merge duplicate routes by component let component_trigger_configs = HashMap::from_iter(component_trigger_configs); + let trigger_app = Arc::new(trigger_app); + let component_handler_types = component_trigger_configs .iter() .filter_map(|(key, trigger_config)| match key { @@ -130,6 +137,7 @@ impl HttpServer { &trigger_app, component, &trigger_config.executor, + reuse_config, ) .map(|ht| (component.clone(), ht)), ), @@ -149,14 +157,22 @@ impl HttpServer { } fn handler_type_for_component( - trigger_app: &TriggerApp, + trigger_app: &Arc>, component_id: &str, executor: &Option, - ) -> anyhow::Result { + reuse_config: InstanceReuseConfig, + ) -> anyhow::Result>> { let pre = trigger_app.get_instance_pre(component_id)?; let handler_type = match executor { None | Some(HttpExecutorType::Http) | Some(HttpExecutorType::Wasip3Unstable) => { - let handler_type = HandlerType::from_instance_pre(pre)?; + let handler_type = HandlerType::from_instance_pre( + pre, + HttpHandlerState { + trigger_app: trigger_app.clone(), + component_id: component_id.into(), + reuse_config, + }, + )?; handler_type.validate_executor(executor)?; handler_type } @@ -334,12 +350,16 @@ impl HttpServer { ) .await } - (None, Some(static_response)) => { - Self::respond_static_response(static_response) - }, + (None, Some(static_response)) => Self::respond_static_response(static_response), // These error cases should have been ruled out by this point but belt and braces - (None, None) => Err(anyhow::anyhow!("Triggers must specify either component or static_response - neither is specified for {}", route_match.raw_route())), - (Some(_), Some(_)) => Err(anyhow::anyhow!("Triggers must specify either component or static_response - both are specified for {}", route_match.raw_route())), + (None, None) => Err(anyhow::anyhow!( + "Triggers must specify either component or static_response - neither is specified for {}", + route_match.raw_route() + )), + (Some(_), Some(_)) => Err(anyhow::anyhow!( + "Triggers must specify either component or static_response - both are specified for {}", + route_match.raw_route() + )), } } @@ -381,9 +401,9 @@ impl HttpServer { .execute(instance_builder, &route_match, req, client_addr) .await } - HandlerType::Wasi0_3(indices) => { - Wasip3HttpExecutor(indices) - .execute(instance_builder, &route_match, req, client_addr) + HandlerType::Wasi0_3(handler) => { + Wasip3HttpExecutor(handler) + .execute(&route_match, req, client_addr) .await } HandlerType::Wasi0_2(_) @@ -617,3 +637,47 @@ pub(crate) trait HttpExecutor { client_addr: SocketAddr, ) -> impl Future>>; } + +pub(crate) struct HttpHandlerState { + trigger_app: Arc>, + component_id: String, + reuse_config: InstanceReuseConfig, +} + +impl HandlerState for HttpHandlerState { + type StoreData = InstanceState; + + fn new_store(&self, _req_id: Option) -> anyhow::Result> { + Ok(StoreBundle { + store: self + .trigger_app + .prepare(&self.component_id)? + .instantiate_store(())? + .into_inner(), + write_profile: Box::new(|_| ()), + }) + } + + fn request_timeout(&self) -> Duration { + self.reuse_config + .request_timeout + .map(|range| rand::rng().random_range(range)) + .unwrap_or(Duration::MAX) + } + + fn idle_instance_timeout(&self) -> Duration { + rand::rng().random_range(self.reuse_config.idle_instance_timeout) + } + + fn max_instance_reuse_count(&self) -> usize { + rand::rng().random_range(self.reuse_config.max_instance_reuse_count) + } + + fn max_instance_concurrent_reuse_count(&self) -> usize { + rand::rng().random_range(self.reuse_config.max_instance_concurrent_reuse_count) + } + + fn handle_worker_error(&self, error: anyhow::Error) { + tracing::warn!("worker error: {error:?}") + } +} diff --git a/crates/trigger-http/src/wasi.rs b/crates/trigger-http/src/wasi.rs index f506f08591..f44169e2eb 100644 --- a/crates/trigger-http/src/wasi.rs +++ b/crates/trigger-http/src/wasi.rs @@ -13,7 +13,9 @@ use spin_http::trigger::HandlerType; use tokio::{sync::oneshot, task}; use tracing::{instrument, Instrument, Level}; use wasmtime_wasi_http::bindings::http::types::Scheme; -use wasmtime_wasi_http::{bindings::Proxy, body::HyperIncomingBody as Body, WasiHttpView}; +use wasmtime_wasi_http::{ + bindings::Proxy, body::HyperIncomingBody as Body, handler::HandlerState, WasiHttpView, +}; use crate::{headers::prepare_request_headers, server::HttpExecutor, TriggerInstanceBuilder}; @@ -46,11 +48,11 @@ pub(super) fn prepare_request( } /// An [`HttpExecutor`] that uses the `wasi:http/incoming-handler` interface. -pub struct WasiHttpExecutor<'a> { - pub handler_type: &'a HandlerType, +pub struct WasiHttpExecutor<'a, S: HandlerState> { + pub handler_type: &'a HandlerType, } -impl HttpExecutor for WasiHttpExecutor<'_> { +impl HttpExecutor for WasiHttpExecutor<'_, S> { #[instrument(name = "spin_trigger_http.execute_wasm", skip_all, err(level = Level::INFO), fields(otel.name = format!("execute_wasm_component {}", route_match.lookup_key().to_string())))] async fn execute( &self, diff --git a/crates/trigger-http/src/wasip3.rs b/crates/trigger-http/src/wasip3.rs index 416b61ca55..a622416361 100644 --- a/crates/trigger-http/src/wasip3.rs +++ b/crates/trigger-http/src/wasip3.rs @@ -1,42 +1,35 @@ -use crate::{server::HttpExecutor, TriggerInstanceBuilder}; +use crate::server::HttpHandlerState; use anyhow::{Context as _, Result}; use futures::{channel::oneshot, FutureExt}; use http_body_util::BodyExt; +use spin_factor_outbound_http::MutexBody; use spin_factors::RuntimeFactors; use spin_factors_executor::InstanceState; use spin_http::routes::RouteMatch; -use std::{ - net::SocketAddr, - pin::Pin, - task::{Context, Poll}, -}; -use tokio::task; +use std::net::SocketAddr; use tracing::{instrument, Instrument, Level}; -use wasmtime::Trap; +use wasmtime::component::Accessor; use wasmtime_wasi_http::{ body::HyperIncomingBody as Body, - p3::{ - bindings::{http::types, ProxyIndices}, - WasiHttpCtxView, - }, + handler::{Proxy, ProxyHandler}, + p3::{bindings::http::types, WasiHttpCtxView}, }; /// An [`HttpExecutor`] that uses the `wasi:http@0.3.*/handler` interface. -pub(super) struct Wasip3HttpExecutor<'a>(pub(super) &'a ProxyIndices); +pub(super) struct Wasip3HttpExecutor<'a, F: RuntimeFactors>( + pub(super) &'a ProxyHandler>, +); -impl HttpExecutor for Wasip3HttpExecutor<'_> { +impl Wasip3HttpExecutor<'_, F> { #[instrument(name = "spin_trigger_http.execute_wasm", skip_all, err(level = Level::INFO), fields(otel.name = format!("execute_wasm_component {}", route_match.lookup_key().to_string())))] - async fn execute( + pub async fn execute( &self, - instance_builder: TriggerInstanceBuilder<'_, F>, route_match: &RouteMatch<'_, '_>, mut req: http::Request, client_addr: SocketAddr, ) -> Result> { super::wasi::prepare_request(route_match, &mut req, client_addr)?; - let (instance, mut store) = instance_builder.instantiate(()).await?; - let getter = (|data| wasi_http::(data).unwrap()) as fn(&mut InstanceState) -> WasiHttpCtxView<'_>; @@ -44,15 +37,21 @@ impl HttpExecutor for Wasip3HttpExecutor<'_> { let body = body.map_err(spin_factor_outbound_http::p2_to_p3_error_code); let request = http::Request::from_parts(request, body); let (request, request_io_result) = types::Request::from_http(request); - let request = wasi_http::(store.data_mut())?.table.push(request)?; - - let guest = self.0.load(&mut store, &instance)?; let (tx, rx) = oneshot::channel(); - task::spawn( - async move { - instance - .run_concurrent(&mut store, async move |store| { + self.0.spawn( + None, + Box::new(move |store: &Accessor<_>, guest: &Proxy| { + Box::pin( + async move { + let Proxy::P3(guest) = guest else { + unreachable!(); + }; + + let request = store.with(|mut store| { + anyhow::Ok(wasi_http::(store.data_mut())?.table.push(request)?) + })?; + let (response, task) = guest .wasi_http_handler() .call_handle(store, request) @@ -64,81 +63,28 @@ impl HttpExecutor for Wasip3HttpExecutor<'_> { response.into_http_with_getter(&mut store, request_io_result, getter) })?; - let (response_tx, response_rx) = oneshot::channel::<()>(); - _ = tx.send(response.map(|body| BodyWithAttachment { - body, - _attachment: response_tx, - })); + _ = tx.send(response); task.block(store).await; - // TODO: This is a temporary workaround for - // https://github.com/bytecodealliance/wasmtime/issues/11703. - // Remove this (and `BodyWithAttachment`) once that - // issue is addressed: - _ = response_rx.await; - anyhow::Ok(()) - }) - .await? - } - .in_current_span() - .inspect(|result| { - if let Err(error) = result { - // TODO: Remove this check once we've updated to Wasmtime - // 38+. - // - // Wasmtime 37's implementation of - // `Instance::run_concurrent` returns `Trap::AsyncDeadlock` - // if the `AsyncFnOnce` it was given does not resolve by the - // time all outstanding tasks have finished. In this case, - // it's harmless and we can ignore it. See - // https://github.com/bytecodealliance/wasmtime/pull/11756 - // for details. - if let Some(Trap::AsyncDeadlock) = error.downcast_ref::() { - // ignore - } else { - tracing::error!("Component error handling request: {error:?}"); } - } + .in_current_span() + .map(|result| { + if let Err(error) = result { + tracing::error!("Component error handling request: {error:?}"); + } + }), + ) }), ); Ok(rx.await?.map(|body| { - body.map_err(spin_factor_outbound_http::p3_to_p2_error_code) - .boxed() + MutexBody::new(body.map_err(spin_factor_outbound_http::p3_to_p2_error_code)).boxed() })) } } -pin_project_lite::pin_project! { - struct BodyWithAttachment { - #[pin] - body: B, - _attachment: A, - } -} - -impl http_body::Body for BodyWithAttachment { - type Data = B::Data; - type Error = B::Error; - - fn poll_frame( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll, Self::Error>>> { - self.project().body.poll_frame(cx) - } - - fn is_end_stream(&self) -> bool { - self.body.is_end_stream() - } - - fn size_hint(&self) -> http_body::SizeHint { - self.body.size_hint() - } -} - fn wasi_http( data: &mut InstanceState, ) -> Result> { diff --git a/crates/world/src/lib.rs b/crates/world/src/lib.rs index 52c8a5e63f..e3809ab53d 100644 --- a/crates/world/src/lib.rs +++ b/crates/world/src/lib.rs @@ -21,25 +21,25 @@ wasmtime::component::bindgen!({ exports: { default: async }, // The following is a roundabout way of saying "the host implementations for these interfaces don't trap" trappable_error_type: { - "fermyon:spin/config/error" => v1::config::Error, - "fermyon:spin/http-types/http-error" => v1::http_types::HttpError, - "fermyon:spin/llm@2.0.0/error" => v2::llm::Error, - "fermyon:spin/llm/error" => v1::llm::Error, - "fermyon:spin/mqtt@2.0.0/error" => v2::mqtt::Error, - "fermyon:spin/mysql/mysql-error" => v1::mysql::MysqlError, - "fermyon:spin/postgres/pg-error" => v1::postgres::PgError, - "fermyon:spin/rdbms-types@2.0.0/error" => v2::rdbms_types::Error, - "fermyon:spin/redis-types/error" => v1::redis_types::Error, - "fermyon:spin/redis@2.0.0/error" => v2::redis::Error, - "fermyon:spin/sqlite@2.0.0/error" => v2::sqlite::Error, - "fermyon:spin/sqlite/error" => v1::sqlite::Error, - "fermyon:spin/variables@2.0.0/error" => v2::variables::Error, - "spin:postgres/postgres@3.0.0/error" => spin::postgres3_0_0::postgres::Error, - "spin:postgres/postgres@4.0.0/error" => spin::postgres4_0_0::postgres::Error, - "spin:sqlite/sqlite/error" => spin::sqlite::sqlite::Error, - "wasi:config/store@0.2.0-draft-2024-09-27/error" => wasi::config::store::Error, - "wasi:keyvalue/store/error" => wasi::keyvalue::store::Error, - "wasi:keyvalue/atomics/cas-error" => wasi::keyvalue::atomics::CasError, + "fermyon:spin/config.error" => v1::config::Error, + "fermyon:spin/http-types.http-error" => v1::http_types::HttpError, + "fermyon:spin/llm@2.0.0.error" => v2::llm::Error, + "fermyon:spin/llm.error" => v1::llm::Error, + "fermyon:spin/mqtt@2.0.0.error" => v2::mqtt::Error, + "fermyon:spin/mysql.mysql-error" => v1::mysql::MysqlError, + "fermyon:spin/postgres.pg-error" => v1::postgres::PgError, + "fermyon:spin/rdbms-types@2.0.0.error" => v2::rdbms_types::Error, + "fermyon:spin/redis-types.error" => v1::redis_types::Error, + "fermyon:spin/redis@2.0.0.error" => v2::redis::Error, + "fermyon:spin/sqlite@2.0.0.error" => v2::sqlite::Error, + "fermyon:spin/sqlite.error" => v1::sqlite::Error, + "fermyon:spin/variables@2.0.0.error" => v2::variables::Error, + "spin:postgres/postgres@3.0.0.error" => spin::postgres3_0_0::postgres::Error, + "spin:postgres/postgres@4.0.0.error" => spin::postgres4_0_0::postgres::Error, + "spin:sqlite/sqlite.error" => spin::sqlite::sqlite::Error, + "wasi:config/store@0.2.0-draft-2024-09-27.error" => wasi::config::store::Error, + "wasi:keyvalue/store.error" => wasi::keyvalue::store::Error, + "wasi:keyvalue/atomics.cas-error" => wasi::keyvalue::atomics::CasError, }, }); diff --git a/examples/spin-timer/Cargo.lock b/examples/spin-timer/Cargo.lock index 54d62b6518..e6756c536b 100644 --- a/examples/spin-timer/Cargo.lock +++ b/examples/spin-timer/Cargo.lock @@ -4,20 +4,11 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli 0.31.1", -] - -[[package]] -name = "addr2line" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9acbfca36652500c911ddb767ed433e3ed99b032b5d935be73c6923662db1d43" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ - "gimli 0.32.0", + "gimli", ] [[package]] @@ -75,15 +66,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arc-swap" @@ -225,7 +216,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -236,13 +227,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -787,21 +778,6 @@ dependencies = [ "fastrand 2.3.0", ] -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line 0.24.2", - "cfg-if", - "libc", - "miniz_oxide", - "object 0.36.7", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.13.1" @@ -838,9 +814,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] [[package]] name = "bitvec" @@ -896,7 +881,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -966,9 +951,9 @@ dependencies = [ [[package]] name = "cap-fs-ext" -version = "3.4.4" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e41cc18551193fe8fa6f15c1e3c799bc5ec9e2cfbfaa8ed46f37013e3e6c173c" +checksum = "d5528f85b1e134ae811704e41ef80930f56e795923f866813255bc342cc20654" dependencies = [ "cap-primitives", "cap-std", @@ -978,21 +963,21 @@ dependencies = [ [[package]] name = "cap-net-ext" -version = "3.4.4" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f83833816c66c986e913b22ac887cec216ea09301802054316fc5301809702c" +checksum = "20a158160765c6a7d0d8c072a53d772e4cb243f38b04bfcf6b4939cfbe7482e7" dependencies = [ "cap-primitives", "cap-std", - "rustix 1.0.5", + "rustix 1.1.2", "smallvec", ] [[package]] name = "cap-primitives" -version = "3.4.4" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1e394ed14f39f8bc26f59d4c0c010dbe7f0a1b9bafff451b1f98b67c8af62a" +checksum = "b6cf3aea8a5081171859ef57bc1606b1df6999df4f1110f8eef68b30098d1d3a" dependencies = [ "ambient-authority", "fs-set-times", @@ -1000,7 +985,7 @@ dependencies = [ "io-lifetimes", "ipnet", "maybe-owned", - "rustix 1.0.5", + "rustix 1.1.2", "rustix-linux-procfs", "windows-sys 0.59.0", "winx", @@ -1008,9 +993,9 @@ dependencies = [ [[package]] name = "cap-rand" -version = "3.4.4" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0acb89ccf798a28683f00089d0630dfaceec087234eae0d308c05ddeaa941b40" +checksum = "d8144c22e24bbcf26ade86cb6501a0916c46b7e4787abdb0045a467eb1645a1d" dependencies = [ "ambient-authority", "rand 0.8.5", @@ -1018,36 +1003,37 @@ dependencies = [ [[package]] name = "cap-std" -version = "3.4.4" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0355ca583dd58f176c3c12489d684163861ede3c9efa6fd8bba314c984189" +checksum = "b6dc3090992a735d23219de5c204927163d922f42f575a0189b005c62d37549a" dependencies = [ "cap-primitives", "io-extras", "io-lifetimes", - "rustix 1.0.5", + "rustix 1.1.2", ] [[package]] name = "cap-time-ext" -version = "3.4.4" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "491af520b8770085daa0466978c75db90368c71896523f2464214e38359b1a5b" +checksum = "def102506ce40c11710a9b16e614af0cde8e76ae51b1f48c04b8d79f4b671a80" dependencies = [ "ambient-authority", "cap-primitives", "iana-time-zone", "once_cell", - "rustix 1.0.5", + "rustix 1.1.2", "winx", ] [[package]] name = "cc" -version = "1.2.18" +version = "1.2.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" +checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -1077,7 +1063,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -1130,9 +1116,12 @@ dependencies = [ [[package]] name = "cobs" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.17", +] [[package]] name = "combine" @@ -1199,36 +1188,36 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c088d3406f0c0252efa7445adfd2d05736bfb5218838f64eaf79d567077aed14" +checksum = "30054f4aef4d614d37f27d5b77e36e165f0b27a71563be348e7c9fcfac41eed8" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c03f887a763abb9c1dc08f722aa82b69067fda623b6f0273050f45f8b1a6776" +checksum = "0beab56413879d4f515e08bcf118b1cb85f294129bb117057f573d37bfbb925a" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206887a11a43f507fee320a218dc365980bfc42ec2696792079a9f8c9369e90" +checksum = "6d054747549a69b264d5299c8ca1b0dd45dc6bd0ee43f1edfcc42a8b12952c7a" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac0790c83cfdab95709c5d0105fd888221e3af9049a7d7ec376ec901ab4e4dba" +checksum = "98b92d481b77a7dc9d07c96e24a16f29e0c9c27d042828fdf7e49e54ee9819bf" dependencies = [ "serde", "serde_derive", @@ -1236,9 +1225,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a98aed2d262eda69310e84bae8e053ee4f17dbdd3347b8d9156aa618ba2de0a" +checksum = "6eeccfc043d599b0ef1806942707fc51cdd1c3965c343956dc975a55d82a920f" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -1249,7 +1238,7 @@ dependencies = [ "cranelift-control", "cranelift-entity", "cranelift-isle", - "gimli 0.32.0", + "gimli", "hashbrown 0.15.2", "log", "pulley-interpreter", @@ -1263,9 +1252,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6906852826988563e9b0a9232ad951f53a47aa41ffd02f8ac852d3f41aae836a" +checksum = "1174cdb9d9d43b2bdaa612a07ed82af13db9b95526bc2c286c2aec4689bcc038" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -1276,24 +1265,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a50105aab667b5cc845f2be37c78475d7cc127cd8ec0a31f7b2b71d526099a7" +checksum = "7d572be73fae802eb115f45e7e67a9ed16acb4ee683b67c4086768786545419a" [[package]] name = "cranelift-control" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6adcc7aa7c0bc1727176a6f2d99c28a9e79a541ccd5ca911a0cb352da8befa36" +checksum = "e1587465cc84c5cc793b44add928771945f3132bbf6b3621ee9473c631a87156" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981b56af777f9a34ea6dcce93255125776d391410c2a68b75bed5941b714fa15" +checksum = "063b83448b1343e79282c3c7cbda7ed5f0816f0b763a4c15f7cecb0a17d87ea6" dependencies = [ "cranelift-bitset", "serde", @@ -1302,9 +1291,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea982589684dfb71afecb9fc09555c3a266300a1162a60d7fa39d41a5705b1c" +checksum = "aa4461c2d2ca48bc72883f5f5c3129d9aefac832df1db824af9db8db3efee109" dependencies = [ "cranelift-codegen", "log", @@ -1314,15 +1303,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0422686b22ed6a1f33cc40e3c43eb84b67155788568d1a5cac8439d3dca1783" +checksum = "acd811b25e18f14810d09c504e06098acc1d9dbfa24879bf0d6b6fb44415fc66" [[package]] name = "cranelift-native" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f697bbbe135c655ea1deb7af0bae4a5c4fae2c88fdfc0fa57b34ae58c91040" +checksum = "2417046989d8d6367a55bbab2e406a9195d176f4779be4aa484d645887217d37" dependencies = [ "cranelift-codegen", "libc", @@ -1331,9 +1320,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.125.4" +version = "0.126.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718efe674f3df645462677e22a3128e890d88ba55821bb091083d257707be76c" +checksum = "8d039de901c8d928222b8128e1b9a9ab27b82a7445cb749a871c75d9cb25c57d" [[package]] name = "crc32fast" @@ -1600,7 +1589,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -1725,10 +1714,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 1.0.5", + "rustix 1.1.2", "windows-sys 0.59.0", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1799,7 +1794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" dependencies = [ "io-lifetimes", - "rustix 1.0.5", + "rustix 1.1.2", "windows-sys 0.59.0", ] @@ -1893,7 +1888,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -1932,7 +1927,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25234f20a3ec0a962a61770cfe39ecf03cb529a6e474ad8cff025ed497eda557" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "debugid", "rustc-hash", "serde", @@ -2004,18 +1999,12 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "gimli" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93563d740bc9ef04104f9ed6f86f1e3275c2cdafb95664e26584b9ca807a8ffe" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" dependencies = [ "fallible-iterator 0.3.0", - "indexmap 2.9.0", + "indexmap 2.12.1", "stable_deref_trait", ] @@ -2037,7 +2026,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.9.0", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -2056,7 +2045,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.9.0", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -2084,6 +2073,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hashlink" version = "0.10.0" @@ -2255,13 +2250,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2 0.4.8", "http 1.3.1", "http-body 1.0.1", @@ -2269,6 +2265,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -2316,7 +2313,7 @@ checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.3.1", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-util", "rustls 0.23.25", "rustls-pki-types", @@ -2332,7 +2329,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.6.0", + "hyper 1.8.1", "hyper-util", "pin-project-lite", "tokio", @@ -2347,7 +2344,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-util", "native-tls", "tokio", @@ -2366,7 +2363,7 @@ dependencies = [ "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.6.0", + "hyper 1.8.1", "libc", "pin-project-lite", "socket2 0.5.9", @@ -2514,7 +2511,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -2550,6 +2547,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 = "indexmap" version = "1.9.3" @@ -2562,13 +2573,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.1", "serde", + "serde_core", ] [[package]] @@ -2700,7 +2712,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.12.1", ] [[package]] @@ -2723,15 +2735,15 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" @@ -2739,7 +2751,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "libc", ] @@ -2752,7 +2764,7 @@ dependencies = [ "async-stream", "async-trait", "base64 0.21.7", - "bitflags 2.9.0", + "bitflags 2.10.0", "bytes", "fallible-iterator 0.3.0", "futures", @@ -2788,10 +2800,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15a90128c708356af8f7d767c9ac2946692c9112b4f74f07b99a01a60680e413" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cc", "fallible-iterator 0.3.0", - "indexmap 2.9.0", + "indexmap 2.12.1", "log", "memchr", "phf", @@ -2819,9 +2831,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -2841,9 +2853,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -2915,11 +2927,11 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memfd" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 0.38.44", + "rustix 1.1.2", ] [[package]] @@ -2990,7 +3002,7 @@ dependencies = [ "serde", "serde_json", "socket2 0.5.9", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-native-tls", "tokio-util", @@ -3005,7 +3017,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34a9141e735d5bb02414a7ac03add09522466d4db65bdd827069f76ae0850e58" dependencies = [ "base64 0.22.1", - "bitflags 2.9.0", + "bitflags 2.10.0", "btoi", "byteorder", "bytes", @@ -3052,7 +3064,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -3140,15 +3152,6 @@ dependencies = [ "url", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "object" version = "0.37.3" @@ -3157,7 +3160,7 @@ checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "crc32fast", "hashbrown 0.15.2", - "indexmap 2.9.0", + "indexmap 2.12.1", "memchr", ] @@ -3173,7 +3176,7 @@ version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", @@ -3190,7 +3193,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -3221,7 +3224,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -3266,7 +3269,7 @@ dependencies = [ "opentelemetry_sdk", "prost 0.13.5", "reqwest", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tonic", "tracing", @@ -3299,7 +3302,7 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -3387,7 +3390,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.9.0", + "indexmap 2.12.1", ] [[package]] @@ -3446,7 +3449,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -3501,9 +3504,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "postcard" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" dependencies = [ "cobs", "embedded-io 0.4.0", @@ -3617,9 +3620,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -3654,7 +3657,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -3667,7 +3670,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -3692,9 +3695,9 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beafc309a2d35e16cc390644d88d14dfa45e45e15075ec6a9e37f6dfb43e926f" +checksum = "0a09eb45f768f3a0396e85822790d867000c8b5f11551e7268c279e991457b16" dependencies = [ "cranelift-bitset", "log", @@ -3704,13 +3707,13 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885fbb6c07454cfc8725a18a1da3cfc328ee8c53fb8d0671ea313edc8567947" +checksum = "e29368432b8b7a8a343b75a6914621fad905c95d5c5297449a6546c127224f7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -3727,7 +3730,7 @@ dependencies = [ "rustc-hash", "rustls 0.23.25", "socket2 0.5.9", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -3747,7 +3750,7 @@ dependencies = [ "rustls 0.23.25", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -3769,9 +3772,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -3889,6 +3892,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 = "rayon" version = "1.10.0" @@ -3951,7 +3963,7 @@ version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", ] [[package]] @@ -3973,7 +3985,7 @@ checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -4066,7 +4078,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-rustls 0.27.5", "hyper-tls", "hyper-util", @@ -4170,7 +4182,7 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37e34486da88d8e051c7c0e23c3f15fd806ea8546260aa2fec247e97242ec143" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "fallible-iterator 0.3.0", "fallible-streaming-iterator", "hashlink", @@ -4256,7 +4268,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4265,15 +4277,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.9.3", - "windows-sys 0.59.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.60.2", ] [[package]] @@ -4283,7 +4295,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" dependencies = [ "once_cell", - "rustix 1.0.5", + "rustix 1.1.2", ] [[package]] @@ -4456,7 +4468,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", - "indexmap 2.9.0", + "indexmap 2.12.1", "schemars_derive", "semver", "serde", @@ -4472,7 +4484,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -4509,7 +4521,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -4528,31 +4540,42 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.219" +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 = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -4563,7 +4586,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -4608,6 +4631,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4620,6 +4652,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 2.12.1", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4684,6 +4729,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +[[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 = "slab" version = "0.4.9" @@ -4695,9 +4750,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] @@ -4772,7 +4827,7 @@ dependencies = [ "wasm-metadata 0.240.0", "wasmparser 0.240.0", "wit-component", - "wit-parser 0.240.0", + "wit-parser", ] [[package]] @@ -4781,13 +4836,13 @@ version = "3.6.0-pre0" dependencies = [ "anyhow", "async-trait", - "indexmap 2.9.0", + "indexmap 2.12.1", "semver", "spin-app", "spin-common", "spin-componentize", "spin-serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "wac-graph", ] @@ -4810,7 +4865,7 @@ dependencies = [ "async-trait", "futures", "spin-locked-app", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -4825,9 +4880,9 @@ dependencies = [ "spin-resource-table", "spin-telemetry", "spin-world", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", - "toml", + "toml 0.8.20", "tracing", ] @@ -4844,7 +4899,7 @@ dependencies = [ "spin-telemetry", "spin-world", "tokio", - "toml", + "toml 0.8.20", "tracing", "url", ] @@ -4858,7 +4913,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-util", "pin-project-lite", "reqwest", @@ -5016,8 +5071,8 @@ dependencies = [ "serde", "spin-app", "spin-factors-derive", - "thiserror 2.0.12", - "toml", + "thiserror 2.0.17", + "toml 0.8.20", "wasmtime", ] @@ -5027,7 +5082,7 @@ version = "3.6.0-pre0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -5118,7 +5173,7 @@ dependencies = [ "serde", "serde_json", "spin-serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -5126,14 +5181,14 @@ name = "spin-manifest" version = "3.6.0-pre0" dependencies = [ "anyhow", - "indexmap 2.9.0", + "indexmap 2.12.1", "schemars", "semver", "serde", "spin-serde", "terminal", - "thiserror 2.0.12", - "toml", + "thiserror 2.0.17", + "toml 0.8.20", "url", "wasm-pkg-common", ] @@ -5187,7 +5242,7 @@ dependencies = [ "spin-variables-env", "spin-variables-static", "spin-variables-vault", - "toml", + "toml 0.8.20", ] [[package]] @@ -5238,7 +5293,7 @@ dependencies = [ "spin-factors", "spin-sqlite-inproc", "spin-sqlite-libsql", - "toml", + "toml 0.8.20", ] [[package]] @@ -5344,7 +5399,7 @@ dependencies = [ "spin-common", "spin-expressions", "spin-factors", - "toml", + "toml 0.8.20", ] [[package]] @@ -5418,9 +5473,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -5456,7 +5511,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -5465,7 +5520,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "core-foundation", "system-configuration-sys", ] @@ -5486,7 +5541,7 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cap-fs-ext", "cap-std", "fd-lock", @@ -5516,15 +5571,15 @@ checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "tempfile" -version = "3.19.1" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand 2.3.0", "getrandom 0.3.2", "once_cell", - "rustix 1.0.5", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.60.2", ] [[package]] @@ -5560,11 +5615,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -5575,18 +5630,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -5660,31 +5715,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.9", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -5777,9 +5831,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -5794,13 +5848,28 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.12.1", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "toml_edit", ] +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap 2.12.1", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow", +] + [[package]] name = "toml_datetime" version = "0.6.8" @@ -5810,19 +5879,43 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.12.1", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "winnow", ] +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tonic" version = "0.12.3" @@ -5838,7 +5931,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-timeout", "hyper-util", "percent-encoding", @@ -5926,7 +6019,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -6088,6 +6181,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[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" @@ -6185,7 +6284,7 @@ checksum = "d511e0c9462a5f6369e7e17e9f0f3b566eab2a235076a23f2db19ca7bf36d32c" dependencies = [ "anyhow", "id-arena", - "indexmap 2.9.0", + "indexmap 2.12.1", "log", "petgraph", "semver", @@ -6204,7 +6303,7 @@ checksum = "64fdef742a5198856c7c754944b329ed684f703dca477d0a77b474b37d990121" dependencies = [ "anyhow", "id-arena", - "indexmap 2.9.0", + "indexmap 2.12.1", "semver", "wasm-encoder 0.239.0", "wasmparser 0.239.0", @@ -6274,7 +6373,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", "wasm-bindgen-shared", ] @@ -6309,7 +6408,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6323,6 +6422,27 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-compose" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feeb9a231e63bd5d5dfe07e9f8daa53d5c85e4f7de5ef756d3b4e6a5f501c578" +dependencies = [ + "anyhow", + "heck 0.4.1", + "im-rc", + "indexmap 2.12.1", + "log", + "petgraph", + "serde", + "serde_derive", + "serde_yaml", + "smallvec", + "wasm-encoder 0.240.0", + "wasmparser 0.240.0", + "wat", +] + [[package]] name = "wasm-encoder" version = "0.239.0" @@ -6343,6 +6463,16 @@ dependencies = [ "wasmparser 0.240.0", ] +[[package]] +name = "wasm-encoder" +version = "0.241.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01164c9dda68301e34fdae536c23ed6fe90ce6d97213ccc171eebbd3d02d6b8" +dependencies = [ + "leb128fmt", + "wasmparser 0.241.2", +] + [[package]] name = "wasm-metadata" version = "0.239.0" @@ -6352,7 +6482,7 @@ dependencies = [ "anyhow", "auditable-serde", "flate2", - "indexmap 2.9.0", + "indexmap 2.12.1", "serde", "serde_derive", "serde_json", @@ -6371,7 +6501,7 @@ dependencies = [ "anyhow", "auditable-serde", "flate2", - "indexmap 2.9.0", + "indexmap 2.12.1", "serde", "serde_derive", "serde_json", @@ -6417,9 +6547,9 @@ version = "0.239.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "hashbrown 0.15.2", - "indexmap 2.9.0", + "indexmap 2.12.1", "semver", "serde", ] @@ -6430,34 +6560,45 @@ version = "0.240.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "hashbrown 0.15.2", - "indexmap 2.9.0", + "indexmap 2.12.1", "semver", "serde", ] +[[package]] +name = "wasmparser" +version = "0.241.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" +dependencies = [ + "bitflags 2.10.0", + "indexmap 2.12.1", + "semver", +] + [[package]] name = "wasmprinter" -version = "0.239.0" +version = "0.240.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3981f3d51f39f24f5fc90f93049a90f08dbbca8deba602cd46bb8ca67a94718" +checksum = "a84d6e25c198da67d0150ee7c2c62d33d784f0a565d1e670bdf1eeccca8158bc" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.239.0", + "wasmparser 0.240.0", ] [[package]] name = "wasmtime" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81eafc07c867be94c47e0dc66355d9785e09107a18901f76a20701ba0663ad7" +checksum = "511bc19c2d48f338007dc941cb40c833c4707023fdaf9ec9b97cf1d5a62d26bb" dependencies = [ - "addr2line 0.25.0", + "addr2line", "anyhow", "async-trait", - "bitflags 2.9.0", + "bitflags 2.10.0", "bumpalo", "bytes", "cc", @@ -6465,28 +6606,30 @@ dependencies = [ "encoding_rs", "futures", "fxprof-processed-profile", - "gimli 0.32.0", + "gimli", "hashbrown 0.15.2", - "indexmap 2.9.0", + "indexmap 2.12.1", "ittapi", "libc", "log", "mach2", "memfd", - "object 0.37.3", + "object", "once_cell", "postcard", "pulley-interpreter", "rayon", - "rustix 1.0.5", + "rustix 1.1.2", "semver", "serde", "serde_derive", "serde_json", "smallvec", "target-lexicon", - "wasm-encoder 0.239.0", - "wasmparser 0.239.0", + "tempfile", + "wasm-compose", + "wasm-encoder 0.240.0", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-cache", "wasmtime-internal-component-macro", @@ -6506,18 +6649,18 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78587abe085a44a13c90fa16fea6db014e9883e627a7044d7f0cb397ad08d1da" +checksum = "c3b0d53657fea2a8cee8ed1866ad45d2e5bc21be958a626a1dd9b7de589851b3" dependencies = [ "anyhow", "cpp_demangle", "cranelift-bitset", "cranelift-entity", - "gimli 0.32.0", - "indexmap 2.9.0", + "gimli", + "indexmap 2.12.1", "log", - "object 0.37.3", + "object", "postcard", "rustc-demangle", "semver", @@ -6525,58 +6668,58 @@ dependencies = [ "serde_derive", "smallvec", "target-lexicon", - "wasm-encoder 0.239.0", - "wasmparser 0.239.0", + "wasm-encoder 0.240.0", + "wasmparser 0.240.0", "wasmprinter", "wasmtime-internal-component-util", ] [[package]] name = "wasmtime-internal-cache" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78fb9299e318b0af3efb75d88321515a20a5ccb040bcde1f0f7d46d656fa8fef" +checksum = "35e065628d2a6eccb722de71c6d9b58771f5c3c4f9d35f6cb6d9d92370f4c2b4" dependencies = [ "anyhow", "base64 0.22.1", "directories-next", "log", "postcard", - "rustix 1.0.5", + "rustix 1.1.2", "serde", "serde_derive", "sha2", - "toml", + "toml 0.9.8", "windows-sys 0.60.2", "zstd", ] [[package]] name = "wasmtime-internal-component-macro" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d843bb444f2d1509ea9304ad749242d1fa5de95cde67665bfcdcafa0f360925c" +checksum = "c933104f57d27dd1e6c7bd9ee5df3242bdd1962d9381bc08fa5d4e60e1f5ebdf" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser 0.239.0", + "wit-parser", ] [[package]] name = "wasmtime-internal-component-util" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801ee1a80ab66f065a88c6a62f2d495d5540d027b366757c6a53e9c42f153aef" +checksum = "63ef2a95a5dbaa70fc3ef682ea8997e51cdd819b4d157a1100477cf43949d454" [[package]] name = "wasmtime-internal-cranelift" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb50f1c50365c32e557266ca85acdf77696c44a3f98797ba6af58cebc6d6d1e" +checksum = "73122df6a8cf417ce486a94e844d3a60797217ce7ae69653e0ee9e28269e0fa5" dependencies = [ "anyhow", "cfg-if", @@ -6585,15 +6728,15 @@ dependencies = [ "cranelift-entity", "cranelift-frontend", "cranelift-native", - "gimli 0.32.0", + "gimli", "itertools 0.14.0", "log", - "object 0.37.3", + "object", "pulley-interpreter", "smallvec", "target-lexicon", - "thiserror 2.0.12", - "wasmparser 0.239.0", + "thiserror 2.0.17", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-math", "wasmtime-internal-unwinder", @@ -6602,36 +6745,36 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9308cdb17f8d51e3164185616d809e28c29a6515c03b9dd95c89436b71f6d154" +checksum = "54ead059e58b54a7abbe0bfb9457b3833ebd2ad84326c248a835ff76d64c7c6f" dependencies = [ "anyhow", "cc", "cfg-if", "libc", - "rustix 1.0.5", + "rustix 1.1.2", "wasmtime-internal-versioned-export-macros", "windows-sys 0.60.2", ] [[package]] name = "wasmtime-internal-jit-debug" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c9b63a22bf2a8b6a149a41c6768bc17a8b2e3288a249cb8216987fbd7128e81" +checksum = "3af620a4ac1623298c90d3736644e12d66974951d1e38d0464798de85c984e17" dependencies = [ "cc", - "object 0.37.3", - "rustix 1.0.5", + "object", + "rustix 1.1.2", "wasmtime-internal-versioned-export-macros", ] [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb8e042b6e3de2f3d708279f89f50b4b9aa1b9bab177300cdffb0ffcd2816df5" +checksum = "b97ccd36e25390258ce6720add639ffe5a7d81a5c904350aa08f5bbc60433d22" dependencies = [ "anyhow", "cfg-if", @@ -6641,56 +6784,56 @@ dependencies = [ [[package]] name = "wasmtime-internal-math" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c1f0674f38cd7d014eb1a49ea1d1766cca1a64459e8856ee118a10005302e16" +checksum = "cd1b856e1bbf0230ab560ba4204e944b141971adc4e6cdf3feb6979c1a7b7953" dependencies = [ "libm", ] [[package]] name = "wasmtime-internal-slab" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb24b7535306713e7a250f8b71e35f05b6a5031bf9c3ed7330c308e899cbe7d3" +checksum = "8908e71a780b97cbd3d8f3a0c446ac8df963069e0f3f38c9eace4f199d4d3e65" [[package]] name = "wasmtime-internal-unwinder" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d5a80e2623a49cb8e8c419542337b8fe0260b162c40dcc201080a84cbe9b7c" +checksum = "fb9c2f8223a0ef96527f0446b80c7d0d9bb0577c7b918e3104bd6d4cdba1d101" dependencies = [ "anyhow", "cfg-if", "cranelift-codegen", "log", - "object 0.37.3", + "object", ] [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e277f734b9256359b21517c3b0c26a2a9de6c53a51b670ae55cdcde548bf4e" +checksum = "2b0fb82cdbffd6cafc812c734a22fa753102888b8760ecf6a08cbb50367a458a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] name = "wasmtime-internal-winch" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4dc9333737142f6ece4369c8bcdda03a11edbd43d8fbd3e15004c194b9b743" +checksum = "f1cfd68149cef86afd9a6c9b51e461266dfa66b37b4c6fdf1201ddbf7f906271" dependencies = [ "anyhow", "cranelift-codegen", - "gimli 0.32.0", + "gimli", "log", - "object 0.37.3", + "object", "target-lexicon", - "wasmparser 0.239.0", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-cranelift", "winch-codegen", @@ -6698,26 +6841,26 @@ dependencies = [ [[package]] name = "wasmtime-internal-wit-bindgen" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f758625553fe33fdce0713f63bb7784c4f5fecb7f7cd4813414519ec24b6a4c" +checksum = "a628437073400148f1ba2b55beb60eb376dc5ca538745994c83332b037d1f3fa" dependencies = [ "anyhow", - "bitflags 2.9.0", + "bitflags 2.10.0", "heck 0.5.0", - "indexmap 2.9.0", - "wit-parser 0.239.0", + "indexmap 2.12.1", + "wit-parser", ] [[package]] name = "wasmtime-wasi" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55abdad51f519217927f45eaae73ca0cd46eb76688628a49784f41b5b19b8ed6" +checksum = "517604b1ce13a56ae3e360217095d7d4db90e84deaa3fba078877c2b80cc5851" dependencies = [ "anyhow", "async-trait", - "bitflags 2.9.0", + "bitflags 2.10.0", "bytes", "cap-fs-ext", "cap-net-ext", @@ -6728,9 +6871,9 @@ dependencies = [ "futures", "io-extras", "io-lifetimes", - "rustix 1.0.5", + "rustix 1.1.2", "system-interface", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "url", @@ -6742,9 +6885,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-http" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570346788aba8c1196829ae922f766ebf87b2882facabd618d7946670332d081" +checksum = "63d735c8a0ef1bb49810f4da75acfdba2390cb4e9de7385bffb8cda77d20d401" dependencies = [ "anyhow", "async-trait", @@ -6753,7 +6896,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "rustls 0.22.4", "tokio", "tokio-rustls 0.25.0", @@ -6767,9 +6910,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-io" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489d7f6e8ea0c4842e31b01721527a825f55ae73a2fa095d8b3f7ddbd75e3661" +checksum = "7ec66fc94ceb9497d62a3d082bd2cce10348975795516553df4cd89f7d5fc14b" dependencies = [ "anyhow", "async-trait", @@ -6789,24 +6932,24 @@ dependencies = [ [[package]] name = "wast" -version = "239.0.0" +version = "241.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9139176fe8a2590e0fb174cdcaf373b224cb93c3dde08e4297c1361d2ba1ea5d" +checksum = "63f66e07e2ddf531fef6344dbf94d112df7c2f23ed6ffb10962e711500b8d816" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width", - "wasm-encoder 0.239.0", + "wasm-encoder 0.241.2", ] [[package]] name = "wat" -version = "1.239.0" +version = "1.241.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e1c941927d34709f255558166f8901a2005f8ab4a9650432e9281b7cc6f3b75" +checksum = "45f923705c40830af909c5dec2352ec2821202e4a66008194585e1917458a26d" dependencies = [ - "wast 239.0.0", + "wast 241.0.2", ] [[package]] @@ -6851,14 +6994,13 @@ dependencies = [ [[package]] name = "wiggle" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ee0c6dd73bdf0aff4404059bdc24ca61ad92056d20f4e59b8b0780789cafb4" +checksum = "bb9c745158119785cf3098c97151cfcc33104ade6489bfa158b73d3f5979fa24" dependencies = [ "anyhow", - "async-trait", - "bitflags 2.9.0", - "thiserror 2.0.12", + "bitflags 2.10.0", + "thiserror 2.0.17", "tracing", "wasmtime", "wiggle-macro", @@ -6866,27 +7008,27 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e415549583fd492ccab881076fa5c41590362d3b5e99df793f619d67333c97b" +checksum = "b8a98d02cd1ba87ca6039f28f4f4c0b53a9ff2684f5f2640f471af9bc608b9d9" dependencies = [ "anyhow", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", "witx", ] [[package]] name = "wiggle-macro" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a533b4fdc593bf9c4bf52ae0b3a126f15babfb25fce03bfe0bcc84e1172222" +checksum = "6a111938ed6e662d5f5036bb3cac8d10d5bea77a536885d6d4a4667c9cba97a2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", "wiggle-generate", ] @@ -6923,19 +7065,19 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "38.0.4" +version = "39.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c0bb17ae9bf89ebc74512150e6ee0a27b1eac5ff3b54d8cec264f4b4255022d" +checksum = "b1de5a648102e39c8e817ed25e3820f4b9772f3c9c930984f32737be60e3156b" dependencies = [ "anyhow", "cranelift-assembler-x64", "cranelift-codegen", - "gimli 0.32.0", + "gimli", "regalloc2", "smallvec", "target-lexicon", - "thiserror 2.0.12", - "wasmparser 0.239.0", + "thiserror 2.0.17", + "wasmparser 0.240.0", "wasmtime-environ", "wasmtime-internal-cranelift", "wasmtime-internal-math", @@ -6950,7 +7092,7 @@ dependencies = [ "windows-collections", "windows-core", "windows-future", - "windows-link", + "windows-link 0.1.3", "windows-numerics", ] @@ -6971,7 +7113,7 @@ checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.1.3", "windows-result", "windows-strings 0.4.0", ] @@ -6983,7 +7125,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" dependencies = [ "windows-core", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -6994,7 +7136,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -7005,7 +7147,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -7014,6 +7156,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-numerics" version = "0.2.0" @@ -7021,7 +7169,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ "windows-core", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -7041,7 +7189,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -7050,7 +7198,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -7059,7 +7207,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -7089,6 +7237,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -7111,7 +7268,7 @@ version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -7220,9 +7377,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -7233,7 +7390,7 @@ version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "windows-sys 0.52.0", ] @@ -7243,7 +7400,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", ] [[package]] @@ -7253,8 +7410,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dc5474b078addc5fe8a72736de8da3acfb3ff324c2491133f8b59594afa1a20" dependencies = [ "anyhow", - "bitflags 2.9.0", - "indexmap 2.9.0", + "bitflags 2.10.0", + "indexmap 2.12.1", "log", "serde", "serde_derive", @@ -7262,25 +7419,7 @@ dependencies = [ "wasm-encoder 0.240.0", "wasm-metadata 0.240.0", "wasmparser 0.240.0", - "wit-parser 0.240.0", -] - -[[package]] -name = "wit-parser" -version = "0.239.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c92c939d667b7bf0c6bf2d1f67196529758f99a2a45a3355cc56964fd5315d" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.9.0", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser 0.239.0", + "wit-parser", ] [[package]] @@ -7291,7 +7430,7 @@ checksum = "9875ea3fa272f57cc1fc50f225a7b94021a7878c484b33792bccad0d93223439" dependencies = [ "anyhow", "id-arena", - "indexmap 2.9.0", + "indexmap 2.12.1", "log", "semver", "serde", @@ -7360,7 +7499,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", "synstructure 0.13.1", ] @@ -7381,7 +7520,7 @@ checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] @@ -7401,7 +7540,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", "synstructure 0.13.1", ] @@ -7430,7 +7569,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.111", ] [[package]] diff --git a/examples/spin-timer/Cargo.toml b/examples/spin-timer/Cargo.toml index 162caaff86..24ea2885d3 100644 --- a/examples/spin-timer/Cargo.toml +++ b/examples/spin-timer/Cargo.toml @@ -13,6 +13,6 @@ spin-runtime-factors = { path = "../../crates/runtime-factors" } spin-trigger = { path = "../../crates/trigger" } tokio = { version = "1", features = ["full"] } tokio-scoped = "0.2.0" -wasmtime = "38.0.4" +wasmtime = "39.0.1" [workspace] diff --git a/src/bin/spin.rs b/src/bin/spin.rs index 5e8ba37ef0..7000be6b53 100644 --- a/src/bin/spin.rs +++ b/src/bin/spin.rs @@ -109,6 +109,7 @@ fn version() -> &'static str { name = "spin", version = version() )] +#[expect(clippy::large_enum_variant)] enum SpinApp { #[clap(subcommand, alias = "template")] Templates(TemplateCommands), @@ -141,6 +142,7 @@ enum SpinApp { } #[derive(Subcommand)] +#[expect(clippy::large_enum_variant)] enum TriggerCommands { Http(FactorsTriggerCommand), Redis(FactorsTriggerCommand), diff --git a/tests/testing-framework/src/runtimes/in_process_spin.rs b/tests/testing-framework/src/runtimes/in_process_spin.rs index 4656d272fa..1dab2dfd14 100644 --- a/tests/testing-framework/src/runtimes/in_process_spin.rs +++ b/tests/testing-framework/src/runtimes/in_process_spin.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use anyhow::Context as _; use spin_runtime_factors::{FactorsBuilder, TriggerAppArgs, TriggerFactors}; use spin_trigger::{cli::TriggerAppBuilder, loader::ComponentLoader}; -use spin_trigger_http::{HttpServer, HttpTrigger}; +use spin_trigger_http::{HttpServer, HttpTrigger, InstanceReuseConfig}; use test_environment::{ http::{Request, Response}, services::ServicesConfig, @@ -104,7 +104,14 @@ async fn initialize_trigger( .await?; let app = spin_app::App::new("my-app", locked_app); - let trigger = HttpTrigger::new(&app, "127.0.0.1:80".parse().unwrap(), None, false, None)?; + let trigger = HttpTrigger::new( + &app, + "127.0.0.1:80".parse().unwrap(), + None, + false, + None, + InstanceReuseConfig::default(), + )?; let mut builder = TriggerAppBuilder::<_, FactorsBuilder>::new(trigger); let trigger_app = builder .build(