From 70055e699f5b8276380d96dc177618bcb1a7065a Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 22 Aug 2023 22:03:45 -0700 Subject: [PATCH 1/3] wip: toolchain upgrade --- Cargo.lock | 612 ++++++++++-------- Cargo.toml | 14 +- lib/virtual_adapter.wasm | Bin 175836 -> 182357 bytes lib/wasi_snapshot_preview1.reactor.wasm | Bin 105306 -> 101607 bytes src/virt_io.rs | 16 +- tests/components/get-env/src/lib.rs | 2 +- tests/virt.rs | 4 +- virtual-adapter/src/env.rs | 8 +- virtual-adapter/src/io.rs | 210 +++--- virtual-adapter/src/lib.rs | 15 +- wit/deps/{preview => cli}/command.wit | 19 +- .../{wasi-cli-base => cli}/environment.wit | 6 +- wit/deps/cli/exit.wit | 4 + wit/deps/cli/run.wit | 4 + wit/deps/{wasi-cli-base => cli}/stdio.wit | 0 wit/deps/cli/terminal.wit | 59 ++ wit/deps/http/proxy.wit | 34 + wit/deps/http/types.wit | 22 +- wit/deps/io/streams.wit | 127 ++-- wit/deps/logging/{handler.wit => logging.wit} | 5 +- wit/deps/preview/command-extended.wit | 36 -- wit/deps/preview/proxy.wit | 9 - wit/deps/preview/reactor.wit | 24 - wit/deps/sockets/ip-name-lookup.wit | 22 +- wit/deps/sockets/network.wit | 6 +- wit/deps/sockets/tcp-create-socket.wit | 10 +- wit/deps/sockets/tcp.wit | 92 +-- wit/deps/sockets/udp-create-socket.wit | 10 +- wit/deps/sockets/udp.wit | 93 +-- wit/deps/wasi-cli-base/exit.wit | 4 - wit/virt.wit | 71 +- 31 files changed, 843 insertions(+), 695 deletions(-) rename wit/deps/{preview => cli}/command.wit (70%) rename wit/deps/{wasi-cli-base => cli}/environment.wit (75%) create mode 100644 wit/deps/cli/exit.wit create mode 100644 wit/deps/cli/run.wit rename wit/deps/{wasi-cli-base => cli}/stdio.wit (100%) create mode 100644 wit/deps/cli/terminal.wit create mode 100644 wit/deps/http/proxy.wit rename wit/deps/logging/{handler.wit => logging.wit} (91%) delete mode 100644 wit/deps/preview/command-extended.wit delete mode 100644 wit/deps/preview/proxy.wit delete mode 100644 wit/deps/preview/reactor.wit delete mode 100644 wit/deps/wasi-cli-base/exit.wit diff --git a/Cargo.lock b/Cargo.lock index 0d9fdfa..f385ad7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,15 @@ dependencies = [ "gimli 0.27.3", ] +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli 0.28.0", +] + [[package]] name = "adler" version = "1.0.2" @@ -30,9 +39,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -45,24 +54,23 @@ checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" [[package]] name = "anstream" -version = "0.3.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" [[package]] name = "anstyle-parse" @@ -84,9 +92,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" +checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" dependencies = [ "anstyle", "windows-sys", @@ -94,9 +102,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "arbitrary" @@ -106,13 +114,13 @@ checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" [[package]] name = "async-trait" -version = "0.1.72" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -123,16 +131,16 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "addr2line", + "addr2line 0.21.0", "cc", "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.32.0", "rustc-demangle", ] @@ -159,9 +167,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "block-buffer" @@ -231,7 +239,7 @@ dependencies = [ "io-lifetimes 2.0.2", "ipnet", "maybe-owned", - "rustix 0.38.7", + "rustix 0.38.8", "windows-sys", "winx 0.36.1", ] @@ -267,7 +275,7 @@ dependencies = [ "cap-primitives 2.0.0", "io-extras 0.18.0", "io-lifetimes 2.0.2", - "rustix 0.38.7", + "rustix 0.38.8", ] [[package]] @@ -278,15 +286,15 @@ checksum = "f8f52b3c8f4abfe3252fd0a071f3004aaa3b18936ec97bdbd8763ce03aff6247" dependencies = [ "cap-primitives 2.0.0", "once_cell", - "rustix 0.38.7", + "rustix 0.38.8", "winx 0.36.1", ] [[package]] name = "cc" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", "libc", @@ -300,9 +308,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.3.21" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c27cdf28c0f604ba3f512b0c9a409f8de8513e4816705deb0498b627e7c3a3fd" +checksum = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d" dependencies = [ "clap_builder", "clap_derive", @@ -311,9 +319,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.21" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a9f1ab5e9f01a9b81f202e8562eb9a10de70abf9eaeac1be465c28b75aa4aa" +checksum = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6" dependencies = [ "anstream", "anstyle", @@ -323,21 +331,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "codespan-reporting" @@ -375,16 +383,18 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7348010242a23d0285e5f852f13b07f9540a50f13ab6e92fd047b88490bf5ee" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38849e3b19bc9a6dbf8bc188876b76e6ba288089a5567be573de50f44801375c" dependencies = [ "bumpalo", "cranelift-bforest", @@ -403,37 +413,42 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3de51da572e65cb712a47b7413c50208cac61a4201560038de929d9a7f4fadf" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75f869ae826055a5064d4a400abde7806eb86d89765dbae51d42846df23121a" [[package]] name = "cranelift-control" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf6631316ad6ccfd60055740ad25326330d31407a983a454e45c5a62f64d101" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1d6a38935ee64551a7c8da4cc759fdcaba1d951ec56336737c0459ed5a05d2" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73c410c2d52e28fc4b49aab955a1c2f58580ff37a3b0641e23bccd6049e4b5" dependencies = [ "cranelift-codegen", "log", @@ -443,13 +458,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61acaa7646020e0444bb3a22d212a5bae0e3b3969b18e1276a037ccd6493a8fd" [[package]] name = "cranelift-native" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "543f52ef487498253ebe5df321373c5c314da74ada0e92f13451b6f887194f87" dependencies = [ "cranelift-codegen", "libc", @@ -458,8 +475,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "788c27f41f31a50a9a3546b91253ad9495cd54df0d6533b3f3dcb4fb7a988f69" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -535,9 +553,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.104" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ba0a82363c553ecb7b4cd58ba6e1c017baef8e3cca4e7d66ca17879201144" +checksum = "28403c86fc49e3401fdf45499ba37fad6493d9329449d6449d7f0e10f4654d28" dependencies = [ "cc", "cxxbridge-flags", @@ -547,9 +565,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.104" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9ec8372f860c6ee7c6463b96a26d08dd590bcbcd9bf2d1894db09ae81410d3" +checksum = "78da94fef01786dc3e0c76eafcd187abcaa9972c78e05ff4041e24fdf059c285" dependencies = [ "cc", "codespan-reporting", @@ -557,24 +575,24 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] name = "cxxbridge-flags" -version = "1.0.104" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "409667bbb937bae87f7cfa91ca29e1415bb92d415371e3344b5269c10d90d595" +checksum = "e2a6f5e1dfb4b34292ad4ea1facbfdaa1824705b231610087b00b17008641809" [[package]] name = "cxxbridge-macro" -version = "1.0.104" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb2a9757fb085d6d97856b28d4f049141ca4a61a64c697f4426433b5f6caa1f" +checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -654,9 +672,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] @@ -720,7 +738,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b0377f1edc77dbd1118507bc7a66e4ab64d2b90c66f90726dc801e73a8c68f9" dependencies = [ "cfg-if", - "rustix 0.38.7", + "rustix 0.38.8", "windows-sys", ] @@ -764,7 +782,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d167b646a876ba8fda6b50ac645cfd96242553cbaf0ca4fccaa39afcbf0801f" dependencies = [ "io-lifetimes 1.0.11", - "rustix 0.38.7", + "rustix 0.38.8", "windows-sys", ] @@ -775,7 +793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd738b84894214045e8414eaded76359b4a5773f0a0a56b16575110739cdcf39" dependencies = [ "io-lifetimes 2.0.2", - "rustix 0.38.7", + "rustix 0.38.8", "windows-sys", ] @@ -855,7 +873,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "debugid", "fxhash", "serde", @@ -913,6 +931,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + [[package]] name = "hashbrown" version = "0.12.3" @@ -1051,7 +1075,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", - "rustix 0.38.7", + "rustix 0.38.8", "windows-sys", ] @@ -1134,9 +1158,9 @@ checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "mach" @@ -1219,6 +1243,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "object" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -1239,12 +1272,12 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 1.9.3", + "indexmap 2.0.0", ] [[package]] @@ -1302,9 +1335,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1462,11 +1495,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.7" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172891ebdceb05aa0005f533a6cbfca599ddd7d966f6f5d4d9b2e70478e70399" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "errno", "itoa", "libc", @@ -1507,29 +1540,29 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.183" +version = "1.0.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" +checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.183" +version = "1.0.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" +checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -1659,9 +1692,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.28" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -1674,12 +1707,12 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27ce32341b2c0b70c144bbf35627fdc1ef18c76ced5e5e7b3ee8b5ba6b2ab6a0" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "cap-fs-ext", "cap-std 2.0.0", "fd-lock", "io-lifetimes 2.0.2", - "rustix 0.38.7", + "rustix 0.38.8", "windows-sys", "winx 0.36.1", ] @@ -1692,14 +1725,14 @@ checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" [[package]] name = "tempfile" -version = "3.7.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.38.7", + "rustix 0.38.8", "windows-sys", ] @@ -1714,22 +1747,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -1749,9 +1782,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.30.0" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3ce25f50619af8b0aec2eb23deebe84249e19e2ddd393a6e16e3300a6dadfd" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ "backtrace", "bytes", @@ -1772,7 +1805,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -1839,7 +1872,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -1859,9 +1892,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -1984,8 +2017,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi-cap-std-sync" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cef338a20bd9e5e469a37b192b2a954c4dde83ea896c8eaf45df8c84cdf7be5" dependencies = [ "anyhow", "async-trait", @@ -1998,7 +2032,7 @@ dependencies = [ "io-lifetimes 2.0.2", "is-terminal", "once_cell", - "rustix 0.38.7", + "rustix 0.38.8", "system-interface", "tracing", "wasi-common", @@ -2007,16 +2041,17 @@ dependencies = [ [[package]] name = "wasi-common" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb9c753bdf98fdc592fc729bda2248996f5dd1be71f4e01bf8c08225acb7b6bb" dependencies = [ "anyhow", - "bitflags 2.3.3", + "bitflags 2.4.0", "cap-rand", "cap-std 2.0.0", "io-extras 0.18.0", "log", - "rustix 0.38.7", + "rustix 0.38.8", "thiserror", "tracing", "wasmtime", @@ -2037,17 +2072,17 @@ dependencies = [ "toml 0.7.6", "walrus", "wasm-compose", - "wasm-metadata 0.10.1 (git+https://github.com/bytecodealliance/wasm-tools)", + "wasm-metadata", "wasm-opt", "wasmtime", "wasmtime-wasi", - "wit-component 0.13.1 (git+https://github.com/bytecodealliance/wasm-tools)", + "wit-component", ] [[package]] name = "wasm-compose" version = "0.4.0" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" +source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" dependencies = [ "anyhow", "heck 0.4.1", @@ -2057,9 +2092,9 @@ dependencies = [ "serde", "serde_yaml", "smallvec", - "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools)", - "wasmparser 0.110.0 (git+https://github.com/bytecodealliance/wasm-tools)", - "wat 1.0.69 (git+https://github.com/bytecodealliance/wasm-tools)", + "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f)", + "wasmparser 0.110.0 (git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f)", + "wat 1.0.69", ] [[package]] @@ -2083,16 +2118,16 @@ dependencies = [ [[package]] name = "wasm-encoder" version = "0.31.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" +source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" dependencies = [ "leb128", ] [[package]] name = "wasm-metadata" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be44e148f09a188971ec512250b3ae136029e2df586dd740586ce76a17ee657d" +checksum = "7ac8d3bcbbb5081489f35966b86d127596e9cdacfb3824b79f43344662226178" dependencies = [ "anyhow", "indexmap 2.0.0", @@ -2100,28 +2135,14 @@ dependencies = [ "serde_json", "spdx", "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wasm-metadata" -version = "0.10.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" -dependencies = [ - "anyhow", - "indexmap 2.0.0", - "serde", - "serde_json", - "spdx", - "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools)", - "wasmparser 0.110.0 (git+https://github.com/bytecodealliance/wasm-tools)", + "wasmparser 0.111.0", ] [[package]] name = "wasm-opt" -version = "0.113.0" +version = "0.114.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65a2799e08026234b07b44da6363703974e75be21430cef00756bbc438c8ff8a" +checksum = "4d005a95f934878a1fb446a816d51c3601a0120ff929005ba3bab3c749cfd1c7" dependencies = [ "anyhow", "libc", @@ -2135,9 +2156,9 @@ dependencies = [ [[package]] name = "wasm-opt-cxx-sys" -version = "0.113.0" +version = "0.114.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d26f86d1132245e8bcea8fac7f02b10fb885b6696799969c94d7d3c14db5e1" +checksum = "6d04e240598162810fad3b2e96fa0dec6dba1eb65a03f3bd99a9248ab8b56caa" dependencies = [ "anyhow", "cxx", @@ -2147,9 +2168,9 @@ dependencies = [ [[package]] name = "wasm-opt-sys" -version = "0.113.0" +version = "0.114.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497d069cd3420cdd52154a320b901114a20946878e2de62c670f9d906e472370" +checksum = "2efd2aaca519d64098c4faefc8b7433a97ed511caf4c9e516384eb6aef1ff4f9" dependencies = [ "anyhow", "cc", @@ -2176,7 +2197,17 @@ dependencies = [ [[package]] name = "wasmparser" version = "0.110.0" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" +source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" +dependencies = [ + "indexmap 2.0.0", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.111.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad71036aada3f6b09251546e97e4f4f176dd6b41cf6fa55e7e0f65e86aec319a" dependencies = [ "indexmap 2.0.0", "semver", @@ -2184,18 +2215,19 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.2.62" +version = "0.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd12ed4d96a984e4b598a17457f1126d01640cc7461afbb319642111ff9e7f" +checksum = "eeb8cc41d341939dce08ee902b50e36cd35add940f6044c94b144e8f73fe07a6" dependencies = [ "anyhow", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", ] [[package]] name = "wasmtime" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e38ee12eaafb34198cce001e2ea0a83d3884db5cf8e3af08864f108a2fb57c85" dependencies = [ "anyhow", "async-trait", @@ -2207,7 +2239,7 @@ dependencies = [ "indexmap 2.0.0", "libc", "log", - "object", + "object 0.31.1", "once_cell", "paste", "psm", @@ -2226,22 +2258,24 @@ dependencies = [ "wasmtime-jit", "wasmtime-runtime", "wasmtime-winch", - "wat 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "wat 1.0.70", "windows-sys", ] [[package]] name = "wasmtime-asm-macros" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82313f9dce6f64dd08a7b51bef57411741b7eaef6b4611f77b91b6213a99808b" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d22677d863d88d0ee05a07bfe28fdc5525149b6ea5a108f1fa2796fa86d75b8" dependencies = [ "anyhow", "base64", @@ -2249,7 +2283,7 @@ dependencies = [ "directories-next", "file-per-thread-logger", "log", - "rustix 0.38.7", + "rustix 0.38.8", "serde", "sha2", "toml 0.5.11", @@ -2259,27 +2293,30 @@ dependencies = [ [[package]] name = "wasmtime-component-macro" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b6da03d55c656066ebc93d27ce54de11fcd2d3157e7490c6196a65aa1e9bc0" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", "wasmtime-component-util", "wasmtime-wit-bindgen", - "wit-parser 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wit-parser 0.9.2", ] [[package]] name = "wasmtime-component-util" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b54327f9ce6a46c6841c43d93c4fa366cd0beb0f075743b120d31a3d6afe34fd" [[package]] name = "wasmtime-cranelift" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d52e14e5453e82708816e992140c59e511bbf7c0868ee654100e2792483f56" dependencies = [ "anyhow", "cranelift-codegen", @@ -2290,7 +2327,7 @@ dependencies = [ "cranelift-wasm", "gimli 0.27.3", "log", - "object", + "object 0.31.1", "target-lexicon", "thiserror", "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2301,30 +2338,32 @@ dependencies = [ [[package]] name = "wasmtime-cranelift-shared" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ddb7f34fff5b4a01aa2e55373fceb1b59d5f981abca44afdd63d7dd39689047" dependencies = [ "anyhow", "cranelift-codegen", "cranelift-control", "cranelift-native", "gimli 0.27.3", - "object", + "object 0.31.1", "target-lexicon", "wasmtime-environ", ] [[package]] name = "wasmtime-environ" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad336809866b743410ac86ec0bdc34899d6f1af5d3deed97188e90503ff527d7" dependencies = [ "anyhow", "cranelift-entity", "gimli 0.27.3", "indexmap 2.0.0", "log", - "object", + "object 0.31.1", "serde", "target-lexicon", "thiserror", @@ -2337,12 +2376,13 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc69f0a316db37482ebc83669236ea7c943d0b49a1a23f763061c9fc9d07d0b" dependencies = [ "cc", "cfg-if", - "rustix 0.38.7", + "rustix 0.38.8", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", "windows-sys", @@ -2350,10 +2390,11 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2004b30ea1ad9fd288bce54af19ef08281250e1087f0b5ffc6ca06bacd821edb" dependencies = [ - "addr2line", + "addr2line 0.20.0", "anyhow", "bincode", "cfg-if", @@ -2361,9 +2402,9 @@ dependencies = [ "gimli 0.27.3", "ittapi", "log", - "object", + "object 0.31.1", "rustc-demangle", - "rustix 0.38.7", + "rustix 0.38.8", "serde", "target-lexicon", "wasmtime-environ", @@ -2375,19 +2416,21 @@ dependencies = [ [[package]] name = "wasmtime-jit-debug" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54aa8081162b13a96f47ab40f9aa03fc02dad38ee10b1418243ac8517c5af6d3" dependencies = [ - "object", + "object 0.31.1", "once_cell", - "rustix 0.38.7", + "rustix 0.38.8", "wasmtime-versioned-export-macros", ] [[package]] name = "wasmtime-jit-icache-coherence" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2922462d01f5c112bbc4e6eb95ee68447a6031c0b90cc2ad69b890060b3842d9" dependencies = [ "cfg-if", "libc", @@ -2396,8 +2439,9 @@ dependencies = [ [[package]] name = "wasmtime-runtime" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "536c34c4abbe22c40f631067b57ca14d719faf3f63ae0d504014a4d15a4b980b" dependencies = [ "anyhow", "cc", @@ -2411,7 +2455,7 @@ dependencies = [ "memoffset", "paste", "rand", - "rustix 0.38.7", + "rustix 0.38.8", "sptr", "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-asm-macros", @@ -2424,8 +2468,9 @@ dependencies = [ [[package]] name = "wasmtime-types" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec6f1e74eb5ef817043b243eae37cc0e424c256c4069ab2c5afd9f3fe91a12ee" dependencies = [ "cranelift-entity", "serde", @@ -2435,22 +2480,24 @@ dependencies = [ [[package]] name = "wasmtime-versioned-export-macros" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ca36fa6cad8ef885bc27d7d50c8b1cb7da0534251188a824f4953b07875703" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] name = "wasmtime-wasi" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269f4f2192b18037729b617eadb512e95510f1b0cd8fb4990aef286c9bb3dfb9" dependencies = [ "anyhow", "async-trait", - "bitflags 2.3.3", + "bitflags 2.4.0", "bytes", "cap-fs-ext", "cap-rand", @@ -2461,7 +2508,7 @@ dependencies = [ "io-extras 0.18.0", "libc", "once_cell", - "rustix 0.38.7", + "rustix 0.38.8", "system-interface", "thiserror", "tokio", @@ -2475,13 +2522,14 @@ dependencies = [ [[package]] name = "wasmtime-winch" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d016c3f1d0c8ac905bfda51936cb6dae040e0d8edc75b7a1ef9f21773a19f6" dependencies = [ "anyhow", "cranelift-codegen", "gimli 0.27.3", - "object", + "object 0.31.1", "target-lexicon", "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime-cranelift-shared", @@ -2491,13 +2539,14 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd55caadebae32cf18541e5077b3f042a171bb9988ea0040d0569f26a63227d" dependencies = [ "anyhow", "heck 0.4.1", "indexmap 2.0.0", - "wit-parser 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wit-parser 0.9.2", ] [[package]] @@ -2512,51 +2561,52 @@ dependencies = [ [[package]] name = "wast" version = "62.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ae06f09dbe377b889fbd620ff8fa21e1d49d1d9d364983c0cdbf9870cb9f1f" +source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" dependencies = [ "leb128", "memchr", "unicode-width", - "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f)", ] [[package]] name = "wast" -version = "62.0.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" +version = "63.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2560471f60a48b77fccefaf40796fda61c97ce1e790b59dfcec9dc3995c9f63a" dependencies = [ "leb128", "memchr", "unicode-width", - "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools)", + "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wat" version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842e15861d203fb4a96d314b0751cdeaf0f6f8b35e8d81d2953af2af5e44e637" +source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" dependencies = [ - "wast 62.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wast 62.0.1", ] [[package]] name = "wat" -version = "1.0.69" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdc306c2c4c2f2bf2ba69e083731d0d2a77437fc6a350a19db139636e7e416c" dependencies = [ - "wast 62.0.1 (git+https://github.com/bytecodealliance/wasm-tools)", + "wast 63.0.0", ] [[package]] name = "wiggle" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "166189cd49163adc9a1e2a33b33625eb934d06e518c318905c3a5140d9bc1d45" dependencies = [ "anyhow", "async-trait", - "bitflags 2.3.3", + "bitflags 2.4.0", "thiserror", "tracing", "wasmtime", @@ -2565,26 +2615,28 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a67571bd77bff962190744adb29e72a1157d30e8d34fbb2c1c7b0ad7627be020" dependencies = [ "anyhow", "heck 0.4.1", "proc-macro2", "quote", "shellexpand", - "syn 2.0.28", + "syn 2.0.29", "witx", ] [[package]] name = "wiggle-macro" -version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5677f7d740bc41f9f6af4a6a719a07fbe1aa8ec66e0ec1ca4d3617f2b27d5361" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", "wiggle-generate", ] @@ -2621,8 +2673,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "0.11.0" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e6f2f344ec89998f047d0aa3aec77088eb8e33c91f5efdd191b140fda6fa40" dependencies = [ "anyhow", "cranelift-codegen", @@ -2645,9 +2698,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -2660,51 +2713,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.4" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acaaa1190073b2b101e15083c38ee8ec891b5e05cbee516521e94ec008f61e64" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" dependencies = [ "memchr", ] @@ -2726,46 +2779,46 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4857cedf8371f690bb6782a3e2b065c54d1b6661be068aaf3eac8b45e813fdf8" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "windows-sys", ] [[package]] name = "wit-bindgen" -version = "0.9.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen#03154cb3de538d068ba9f37f28abe762c7574132" +version = "0.10.0" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "wit-bindgen-rust-macro", ] [[package]] name = "wit-bindgen-core" -version = "0.9.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen#03154cb3de538d068ba9f37f28abe762c7574132" +version = "0.10.0" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" dependencies = [ "anyhow", - "wit-component 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wit-parser 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wit-component", + "wit-parser 0.10.0", ] [[package]] name = "wit-bindgen-rust" -version = "0.9.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen#03154cb3de538d068ba9f37f28abe762c7574132" +version = "0.10.0" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" dependencies = [ "anyhow", "heck 0.4.1", - "wasm-metadata 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-metadata", "wit-bindgen-core", "wit-bindgen-rust-lib", - "wit-component 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wit-component", ] [[package]] name = "wit-bindgen-rust-lib" -version = "0.9.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen#03154cb3de538d068ba9f37f28abe762c7574132" +version = "0.10.0" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" dependencies = [ "heck 0.4.1", "wit-bindgen-core", @@ -2773,47 +2826,32 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-macro" -version = "0.9.0" -source = "git+https://github.com/bytecodealliance/wit-bindgen#03154cb3de538d068ba9f37f28abe762c7574132" +version = "0.10.0" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" dependencies = [ "anyhow", "proc-macro2", - "syn 2.0.28", + "syn 2.0.29", "wit-bindgen-core", "wit-bindgen-rust", "wit-bindgen-rust-lib", - "wit-component 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wit-component", ] [[package]] name = "wit-component" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d843f4dfead0d465b09e8bfba4d3dcb1a1bcc857f87917d348c7fa401158bc5" +checksum = "4a9eb6179c5a26adc38fa5a22e263e7a3812c6777ca2e75d1717fd3789f82b64" dependencies = [ "anyhow", - "bitflags 2.3.3", + "bitflags 2.4.0", "indexmap 2.0.0", "log", "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-metadata 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wit-parser 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wit-component" -version = "0.13.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" -dependencies = [ - "anyhow", - "bitflags 2.3.3", - "indexmap 2.0.0", - "log", - "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools)", - "wasm-metadata 0.10.1 (git+https://github.com/bytecodealliance/wasm-tools)", - "wasmparser 0.110.0 (git+https://github.com/bytecodealliance/wasm-tools)", - "wit-parser 0.9.2 (git+https://github.com/bytecodealliance/wasm-tools)", + "wasm-metadata", + "wasmparser 0.111.0", + "wit-parser 0.10.0", ] [[package]] @@ -2834,8 +2872,9 @@ dependencies = [ [[package]] name = "wit-parser" -version = "0.9.2" -source = "git+https://github.com/bytecodealliance/wasm-tools#4678a61ae428da21299aeae016bd56d5e248248f" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d6926af931f285e206ea71f9b67681f00a65d79097f81da7f9f285de006ba2" dependencies = [ "anyhow", "id-arena", @@ -2850,7 +2889,8 @@ dependencies = [ [[package]] name = "witx" version = "0.9.1" -source = "git+https://github.com/bytecodealliance/wasmtime#f32993002bc523083b7d7cca49179a3285c44c03" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" dependencies = [ "anyhow", "log", diff --git a/Cargo.toml b/Cargo.toml index c811f36..5ea11bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,10 +33,10 @@ clap = { version = "4", features = ["derive"] } serde = { version = "1", features = ["derive"] } toml = "0.7" walrus = "0.20.1" -wasm-compose = { git = "https://github.com/bytecodealliance/wasm-tools" } -wasm-metadata = { git = "https://github.com/bytecodealliance/wasm-tools" } -wasm-opt = "0.113.0" -wit-component = { git = "https://github.com/bytecodealliance/wasm-tools" } +wasm-compose = { git = "https://github.com/bytecodealliance/wasm-tools", rev = "4678a61ae428da21299aeae016bd56d5e248248f" } +wasm-metadata = "0.10.2" +wasm-opt = "0.114.1" +wit-component = "0.13.2" [build-dependencies] anyhow = "1" @@ -46,9 +46,9 @@ anyhow = "1" cap-std = "1.0.12" heck = { version = "0.4" } tokio = { version = "1.30.0", features = ["macros"] } -wasmtime = { git = "https://github.com/bytecodealliance/wasmtime", features = ["component-model"] } -wasmtime-wasi = { git = "https://github.com/bytecodealliance/wasmtime" } +wasmtime = { version = "12.0.0", features = ["component-model"] } +wasmtime-wasi = "12.0.0" [workspace.dependencies] anyhow = "1" -wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen" } +wit-bindgen = { git = "https://github.com/alexcrichton/witx-bindgen", branch = "fix-name-clashes" } \ No newline at end of file diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index 5d59a3f463c6bb86afad17aa64aeb9bd5f54e11b..47194fcbe61e2661a3ca7ba19d3764e129e8c6d6 100755 GIT binary patch literal 182357 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 delta 46933 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

$|MGMFy48eVD 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 a3yaTQXUahhB`>a0Rlv&C^64M)EB_zT4fh%V diff --git a/lib/wasi_snapshot_preview1.reactor.wasm b/lib/wasi_snapshot_preview1.reactor.wasm index 6c31e35131a145bc47defb4f4b5d821db1f56248..67249265ddf60f0483486fd60e3331da44cb52a3 100644 GIT binary patch delta 22817 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 diff --git a/src/virt_io.rs b/src/virt_io.rs index a592199..b023376 100644 --- a/src/virt_io.rs +++ b/src/virt_io.rs @@ -525,9 +525,10 @@ pub(crate) fn create_io_virt<'a>( Ok(virtual_files) } -// stubs must be _comprehensive_ in order to act as full deny over entire subsystem +// Stubs must be _comprehensive_ in order to act as full deny over entire subsystem // when stubbing functions that are not part of the virtual adapter exports, we therefore -// have to create this functions fresh +// have to create this functions fresh. +// Ideally, we should generate these stubs automatically from WASI definitions. pub(crate) fn stub_fs_virt(module: &mut Module) -> Result<()> { stub_imported_func(module, "wasi:filesystem/preopens", "get-directories", true)?; stub_imported_func(module, "wasi:filesystem/types", "read-via-stream", true)?; @@ -780,8 +781,7 @@ pub(crate) fn strip_http_virt(module: &mut Module) -> Result<()> { remove_exported_func(module, "wasi:http/types#drop-incoming-request")?; remove_exported_func(module, "wasi:http/types#drop-outgoing-request")?; remove_exported_func(module, "wasi:http/types#incoming-request-method")?; - remove_exported_func(module, "wasi:http/types#incoming-request-path")?; - remove_exported_func(module, "wasi:http/types#incoming-request-query")?; + remove_exported_func(module, "wasi:http/types#incoming-request-path-with-query")?; remove_exported_func(module, "wasi:http/types#incoming-request-scheme")?; remove_exported_func(module, "wasi:http/types#incoming-request-authority")?; remove_exported_func(module, "wasi:http/types#incoming-request-headers")?; @@ -817,8 +817,12 @@ pub(crate) fn stub_http_virt(module: &mut Module) -> Result<()> { stub_imported_func(module, "wasi:http/types", "drop-incoming-request", false)?; stub_imported_func(module, "wasi:http/types", "drop-outgoing-request", false)?; stub_imported_func(module, "wasi:http/types", "incoming-request-method", false)?; - stub_imported_func(module, "wasi:http/types", "incoming-request-path", false)?; - stub_imported_func(module, "wasi:http/types", "incoming-request-query", false)?; + stub_imported_func( + module, + "wasi:http/types", + "incoming-request-path-with-query", + false, + )?; stub_imported_func(module, "wasi:http/types", "incoming-request-scheme", false)?; stub_imported_func( module, diff --git a/tests/components/get-env/src/lib.rs b/tests/components/get-env/src/lib.rs index a5e91c2..3aa0f48 100644 --- a/tests/components/get-env/src/lib.rs +++ b/tests/components/get-env/src/lib.rs @@ -10,7 +10,7 @@ wit_bindgen::generate!({ struct VirtTestComponent; -impl VirtTest for VirtTestComponent { +impl Guest for VirtTestComponent { fn test_get_env() -> Vec<(String, String)> { env::vars().collect() } diff --git a/tests/virt.rs b/tests/virt.rs index 05e7a2c..e71fc31 100644 --- a/tests/virt.rs +++ b/tests/virt.rs @@ -144,7 +144,7 @@ async fn virt_test() -> Result<()> { // execute the composed virtualized component test function let mut builder = WasiCtxBuilder::new(); - builder.inherit_stdio().preopened_dir( + builder = builder.inherit_stdio().push_preopened_dir( Dir::open_ambient_dir(".", ambient_authority())?, DirPerms::READ, FilePerms::READ, @@ -152,7 +152,7 @@ async fn virt_test() -> Result<()> { ); if let Some(host_env) = &test.host_env { for (k, v) in host_env { - builder.env(k, v); + builder = builder.push_env(k, v); } } let mut table = Table::new(); diff --git a/virtual-adapter/src/env.rs b/virtual-adapter/src/env.rs index 677ab54..862bbbe 100644 --- a/virtual-adapter/src/env.rs +++ b/virtual-adapter/src/env.rs @@ -1,5 +1,5 @@ -use crate::exports::wasi::cli_base::environment::Environment; -use crate::wasi::cli_base::environment; +use crate::exports::wasi::cli::environment::Guest as Environment; +use crate::wasi::cli::environment; use crate::VirtAdapter; #[repr(C)] @@ -81,8 +81,10 @@ impl Environment for VirtAdapter { } environment } - fn get_arguments() -> Vec { environment::get_arguments() } + fn initial_cwd() -> Option { + environment::initial_cwd() + } } diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 50b072c..80f663e 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -1,30 +1,40 @@ -use crate::exports::wasi::cli_base::stderr::Stderr; -use crate::exports::wasi::cli_base::stdin::Stdin; -use crate::exports::wasi::cli_base::stdout::Stdout; -use crate::exports::wasi::clocks::monotonic_clock::MonotonicClock; -use crate::exports::wasi::filesystem::preopens::Preopens; +use crate::exports::wasi::cli::stderr::Guest as Stderr; +use crate::exports::wasi::cli::stdin::Guest as Stdin; +use crate::exports::wasi::cli::stdout::Guest as Stdout; +use crate::exports::wasi::cli::terminal_input::Guest as TerminalInput; +use crate::exports::wasi::cli::terminal_output::Guest as TerminalOutput; +use crate::exports::wasi::cli::terminal_stderr::Guest as TerminalStderr; +use crate::exports::wasi::cli::terminal_stdin::Guest as TerminalStdin; +use crate::exports::wasi::cli::terminal_stdout::Guest as TerminalStdout; +use crate::exports::wasi::clocks::monotonic_clock::Guest as MonotonicClock; +use crate::exports::wasi::filesystem::preopens::Guest as Preopens; use crate::exports::wasi::filesystem::types::{ AccessType, Advice, Datetime, DescriptorFlags, DescriptorStat, DescriptorType, DirectoryEntry, - ErrorCode, MetadataHashValue, Modes, NewTimestamp, OpenFlags, PathFlags, - Types as FilesystemTypes, + ErrorCode, Guest as FilesystemTypes, MetadataHashValue, Modes, NewTimestamp, OpenFlags, + PathFlags, }; use crate::exports::wasi::http::types::{ - Error, Fields, Headers, Method, Scheme, StatusCode, Trailers, Types as HttpTypes, + Error, Fields, Guest as HttpTypes, Headers, Method, Scheme, StatusCode, Trailers, }; use crate::exports::wasi::io::streams::{ - InputStream, OutputStream, StreamError, StreamStatus, Streams, + Guest as Streams, InputStream, OutputStream, StreamStatus, }; -use crate::exports::wasi::poll::poll::Poll; +use crate::exports::wasi::poll::poll::Guest as Poll; use crate::exports::wasi::sockets::ip_name_lookup::{ - IpAddress, IpAddressFamily, IpNameLookup, Network, ResolveAddressStream, + Guest as IpNameLookup, IpAddress, IpAddressFamily, Network, ResolveAddressStream, }; use crate::exports::wasi::sockets::tcp::ErrorCode as NetworkErrorCode; -use crate::exports::wasi::sockets::tcp::{IpSocketAddress, ShutdownType, Tcp, TcpSocket}; -use crate::exports::wasi::sockets::udp::{Datagram, Udp, UdpSocket}; - -use crate::wasi::cli_base::stderr; -use crate::wasi::cli_base::stdin; -use crate::wasi::cli_base::stdout; +use crate::exports::wasi::sockets::tcp::{Guest as Tcp, IpSocketAddress, ShutdownType, TcpSocket}; +use crate::exports::wasi::sockets::udp::{Datagram, Guest as Udp, UdpSocket}; + +use crate::wasi::cli::stderr; +use crate::wasi::cli::stdin; +use crate::wasi::cli::stdout; +use crate::wasi::cli::terminal_input; +use crate::wasi::cli::terminal_output; +use crate::wasi::cli::terminal_stderr; +use crate::wasi::cli::terminal_stdin; +use crate::wasi::cli::terminal_stdout; use crate::wasi::filesystem::preopens; use crate::wasi::filesystem::types as filesystem_types; use crate::wasi::io::streams; @@ -481,19 +491,13 @@ struct StaticDirStream { idx: usize, } -fn stream_err() -> StreamError { - StreamError { dummy: 0 } -} - impl StaticFileStream { fn new(fd: u32) -> Self { Self { fd, offset: 0 } } - fn read(&mut self, len: u64) -> Result<(Vec, StreamStatus), StreamError> { - let descriptor = IoState::get_descriptor(self.fd).map_err(|_| stream_err())?; - let (bytes, done) = descriptor - .read(self.offset, len) - .map_err(|_| stream_err())?; + fn read(&mut self, len: u64) -> Result<(Vec, StreamStatus), ()> { + let descriptor = IoState::get_descriptor(self.fd).map_err(|_| ())?; + let (bytes, done) = descriptor.read(self.offset, len).map_err(|_| ())?; self.offset += bytes.len() as u64; Ok(( bytes, @@ -640,10 +644,10 @@ impl IoState { unsafe { STATE.stream_table.insert(sid, stream.into()) }; sid } - fn get_stream<'a>(sid: u32) -> Result<&'a mut Stream, StreamError> { + fn get_stream<'a>(sid: u32) -> Result<&'a mut Stream, ()> { match unsafe { STATE.stream_table.get_mut(&sid) } { Some(stream) => Ok(stream), - None => Err(stream_err()), + None => Err(()), } } fn new_poll(target: PollTarget) -> u32 { @@ -1045,40 +1049,38 @@ fn metadata_hash_map(value: filesystem_types::MetadataHashValue) -> MetadataHash } } -fn stream_res_map( - res: Result<(T, streams::StreamStatus), streams::StreamError>, -) -> Result<(T, StreamStatus), StreamError> { +fn stream_res_map(res: Result<(T, streams::StreamStatus), ()>) -> Result<(T, StreamStatus), ()> { match res { Ok((data, streams::StreamStatus::Ended)) => Ok((data, StreamStatus::Ended)), Ok((data, streams::StreamStatus::Open)) => Ok((data, StreamStatus::Open)), - Err(_) => Err(stream_err()), + Err(_) => Err(()), } } impl Streams for VirtAdapter { - fn read(sid: u32, len: u64) -> Result<(Vec, StreamStatus), StreamError> { + fn read(sid: u32, len: u64) -> Result<(Vec, StreamStatus), ()> { VirtAdapter::blocking_read(sid, len) } - fn blocking_read(sid: u32, len: u64) -> Result<(Vec, StreamStatus), StreamError> { + fn blocking_read(sid: u32, len: u64) -> Result<(Vec, StreamStatus), ()> { let stream = IoState::get_stream(sid)?; match stream { Stream::StaticFile(filestream) => filestream.read(len), Stream::Host(sid) => stream_res_map(streams::blocking_read(*sid, len)), Stream::Null => Ok((vec![], StreamStatus::Ended)), - Stream::Err | Stream::StaticDir(_) => Err(stream_err()), + Stream::Err | Stream::StaticDir(_) => Err(()), } } - fn skip(sid: u32, offset: u64) -> Result<(u64, StreamStatus), StreamError> { + fn skip(sid: u32, offset: u64) -> Result<(u64, StreamStatus), ()> { match IoState::get_stream(sid)? { Stream::Null => Ok((0, StreamStatus::Ended)), - Stream::Err | Stream::StaticDir(_) | Stream::StaticFile(_) => Err(stream_err()), + Stream::Err | Stream::StaticDir(_) | Stream::StaticFile(_) => Err(()), Stream::Host(sid) => stream_res_map(streams::skip(*sid, offset)), } } - fn blocking_skip(sid: u32, offset: u64) -> Result<(u64, StreamStatus), StreamError> { + fn blocking_skip(sid: u32, offset: u64) -> Result<(u64, StreamStatus), ()> { match IoState::get_stream(sid)? { Stream::Null => Ok((0, StreamStatus::Ended)), - Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(stream_err()), + Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(()), Stream::Host(sid) => stream_res_map(streams::blocking_skip(*sid, offset)), } } @@ -1104,41 +1106,41 @@ impl Streams for VirtAdapter { } unsafe { STATE.stream_table.remove(&sid) }; } - fn write(sid: u32, bytes: Vec) -> Result<(u64, StreamStatus), StreamError> { + fn write(sid: u32, bytes: Vec) -> Result<(u64, StreamStatus), ()> { match IoState::get_stream(sid)? { Stream::Null => Ok((bytes.len() as u64, StreamStatus::Ended)), - Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(stream_err()), + Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(()), Stream::Host(sid) => stream_res_map(streams::write(*sid, bytes.as_slice())), } } - fn blocking_write(sid: u32, bytes: Vec) -> Result<(u64, StreamStatus), StreamError> { + fn blocking_write(sid: u32, bytes: Vec) -> Result<(u64, StreamStatus), ()> { match IoState::get_stream(sid)? { Stream::Null => Ok((bytes.len() as u64, StreamStatus::Ended)), - Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(stream_err()), + Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(()), Stream::Host(sid) => stream_res_map(streams::blocking_write(*sid, bytes.as_slice())), } } - fn write_zeroes(sid: u32, len: u64) -> Result<(u64, StreamStatus), StreamError> { + fn write_zeroes(sid: u32, len: u64) -> Result<(u64, StreamStatus), ()> { match IoState::get_stream(sid)? { Stream::Null => Ok((len, StreamStatus::Ended)), - Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(stream_err()), + Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(()), Stream::Host(sid) => stream_res_map(streams::write_zeroes(*sid, len)), } } - fn blocking_write_zeroes(sid: u32, len: u64) -> Result<(u64, StreamStatus), StreamError> { + fn blocking_write_zeroes(sid: u32, len: u64) -> Result<(u64, StreamStatus), ()> { match IoState::get_stream(sid)? { Stream::Null => Ok((len, StreamStatus::Ended)), - Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(stream_err()), + Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => Err(()), Stream::Host(sid) => stream_res_map(streams::blocking_write_zeroes(*sid, len)), } } - fn splice(to_sid: u32, from_sid: u32, len: u64) -> Result<(u64, StreamStatus), StreamError> { + fn splice(to_sid: u32, from_sid: u32, len: u64) -> Result<(u64, StreamStatus), ()> { let to_sid = match IoState::get_stream(to_sid)? { Stream::Null => { return Ok((len, StreamStatus::Ended)); } Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => { - return Err(stream_err()); + return Err(()); } Stream::Host(sid) => *sid, }; @@ -1147,23 +1149,19 @@ impl Streams for VirtAdapter { return Ok((len, StreamStatus::Ended)); } Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => { - return Err(stream_err()); + return Err(()); } Stream::Host(sid) => *sid, }; stream_res_map(streams::splice(to_sid, from_sid, len)) } - fn blocking_splice( - to_sid: u32, - from_sid: u32, - len: u64, - ) -> Result<(u64, StreamStatus), StreamError> { + fn blocking_splice(to_sid: u32, from_sid: u32, len: u64) -> Result<(u64, StreamStatus), ()> { let to_sid = match IoState::get_stream(to_sid)? { Stream::Null => { return Ok((len, StreamStatus::Ended)); } Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => { - return Err(stream_err()); + return Err(()); } Stream::Host(sid) => *sid, }; @@ -1172,19 +1170,19 @@ impl Streams for VirtAdapter { return Ok((len, StreamStatus::Ended)); } Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => { - return Err(stream_err()); + return Err(()); } Stream::Host(sid) => *sid, }; stream_res_map(streams::blocking_splice(to_sid, from_sid, len)) } - fn forward(to_sid: u32, from_sid: u32) -> Result<(u64, StreamStatus), StreamError> { + fn forward(to_sid: u32, from_sid: u32) -> Result<(u64, StreamStatus), ()> { let to_sid = match IoState::get_stream(to_sid)? { Stream::Null => { return Ok((0, StreamStatus::Ended)); } Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => { - return Err(stream_err()); + return Err(()); } Stream::Host(sid) => *sid, }; @@ -1193,7 +1191,7 @@ impl Streams for VirtAdapter { return Ok((0, StreamStatus::Ended)); } Stream::Err | Stream::StaticFile(_) | Stream::StaticDir(_) => { - return Err(stream_err()); + return Err(()); } Stream::Host(sid) => *sid, }; @@ -1243,6 +1241,32 @@ impl Stderr for VirtAdapter { } } +impl TerminalInput for VirtAdapter { + fn drop_terminal_input(_: u32) {} +} + +impl TerminalOutput for VirtAdapter { + fn drop_terminal_output(_: u32) {} +} + +impl TerminalStdin for VirtAdapter { + fn get_terminal_stdin() -> Option { + Some(0) + } +} + +impl TerminalStdout for VirtAdapter { + fn get_terminal_stdout() -> Option { + Some(1) + } +} + +impl TerminalStderr for VirtAdapter { + fn get_terminal_stderr() -> Option { + Some(2) + } +} + impl Poll for VirtAdapter { fn drop_pollable(pid: u32) { let Some(poll) = IoState::get_poll(pid) else { @@ -1313,19 +1337,19 @@ impl HttpTypes for VirtAdapter { fn new_fields(entries: Vec<(String, String)>) -> Fields { http_types::new_fields(&entries) } - fn fields_get(fields: Fields, name: String) -> Vec { + fn fields_get(fields: Fields, name: String) -> Vec> { http_types::fields_get(fields, &name) } - fn fields_set(fields: Fields, name: String, value: Vec) { + fn fields_set(fields: Fields, name: String, value: Vec>) { http_types::fields_set(fields, &name, value.as_slice()) } fn fields_delete(fields: Fields, name: String) { http_types::fields_delete(fields, &name) } - fn fields_append(fields: Fields, name: String, value: String) { + fn fields_append(fields: Fields, name: String, value: Vec) { http_types::fields_append(fields, &name, &value) } - fn fields_entries(fields: Fields) -> Vec<(String, String)> { + fn fields_entries(fields: Fields) -> Vec<(String, Vec)> { http_types::fields_entries(fields) } fn fields_clone(fields: Fields) -> Fields { @@ -1346,16 +1370,13 @@ impl HttpTypes for VirtAdapter { fn incoming_request_method(request: u32) -> Method { method_map_rev(http_types::incoming_request_method(request)) } - fn incoming_request_path(request: u32) -> String { - http_types::incoming_request_path(request) - } - fn incoming_request_query(request: u32) -> String { - http_types::incoming_request_query(request) + fn incoming_request_path_with_query(request: u32) -> Option { + http_types::incoming_request_path_with_query(request) } fn incoming_request_scheme(request: u32) -> Option { http_types::incoming_request_scheme(request).map(scheme_map_rev) } - fn incoming_request_authority(request: u32) -> String { + fn incoming_request_authority(request: u32) -> Option { http_types::incoming_request_authority(request) } fn incoming_request_headers(request: u32) -> Headers { @@ -1366,18 +1387,16 @@ impl HttpTypes for VirtAdapter { } fn new_outgoing_request( method: Method, - path: String, - query: String, + path_with_query: Option, scheme: Option, - authority: String, + authority: Option, headers: Headers, ) -> u32 { http_types::new_outgoing_request( &method_map(method), - &path, - &query, + path_with_query.as_deref(), scheme.map(|s| scheme_map(s)).as_ref(), - &authority, + authority.as_deref(), headers, ) } @@ -1387,12 +1406,12 @@ impl HttpTypes for VirtAdapter { fn drop_response_outparam(response: u32) { http_types::drop_response_outparam(response) } - fn set_response_outparam(response: Result) -> Result<(), ()> { + fn set_response_outparam(param: u32, response: Result) -> Result<(), ()> { match response { - Ok(res) => http_types::set_response_outparam(Ok(res)), + Ok(res) => http_types::set_response_outparam(param, Ok(res)), Err(err) => { let err = http_err_map(err); - http_types::set_response_outparam(Err(&err)) + http_types::set_response_outparam(param, Err(&err)) } } } @@ -1535,8 +1554,8 @@ impl Tcp for VirtAdapter { fn finish_connect(this: TcpSocket) -> Result<(InputStream, OutputStream), NetworkErrorCode> { tcp::finish_connect(this) } - fn start_listen(this: TcpSocket, network: Network) -> Result<(), NetworkErrorCode> { - tcp::start_listen(this, network) + fn start_listen(this: TcpSocket) -> Result<(), NetworkErrorCode> { + tcp::start_listen(this) } fn finish_listen(this: TcpSocket) -> Result<(), NetworkErrorCode> { tcp::finish_listen(this) @@ -1633,22 +1652,29 @@ impl Udp for VirtAdapter { fn finish_connect(this: UdpSocket) -> Result<(), NetworkErrorCode> { udp::finish_connect(this) } - fn receive(this: UdpSocket) -> Result { - match udp::receive(this) { - Ok(datagram) => Ok(Datagram { - data: datagram.data, - remote_address: datagram.remote_address, - }), + fn receive(this: UdpSocket, max_results: u64) -> Result, NetworkErrorCode> { + match udp::receive(this, max_results) { + Ok(mut datagrams) => Ok(datagrams + .drain(..) + .map(|d| Datagram { + data: d.data, + remote_address: d.remote_address, + }) + .collect::>()), Err(err) => Err(err), } } - fn send(this: UdpSocket, datagram: Datagram) -> Result<(), NetworkErrorCode> { + fn send(this: UdpSocket, mut datagrams: Vec) -> Result { udp::send( this, - &udp::Datagram { - data: datagram.data, - remote_address: datagram.remote_address, - }, + datagrams + .drain(..) + .map(|d| udp::Datagram { + data: d.data, + remote_address: d.remote_address, + }) + .collect::>() + .as_slice(), ) } fn local_address(this: UdpSocket) -> Result { diff --git a/virtual-adapter/src/lib.rs b/virtual-adapter/src/lib.rs index dbdea1a..e96638d 100644 --- a/virtual-adapter/src/lib.rs +++ b/virtual-adapter/src/lib.rs @@ -12,14 +12,19 @@ wit_bindgen::generate!({ exports: { "wasi:poll/poll": VirtAdapter, "wasi:io/streams": VirtAdapter, - "wasi:cli-base/environment": VirtAdapter, "wasi:filesystem/filesystem": VirtAdapter, "wasi:filesystem/preopens": VirtAdapter, "wasi:filesystem/types": VirtAdapter, - "wasi:cli-base/stdin": VirtAdapter, - "wasi:cli-base/stdout": VirtAdapter, - "wasi:cli-base/stderr": VirtAdapter, - "wasi:cli-base/stderr": VirtAdapter, + "wasi:cli/environment": VirtAdapter, + "wasi:cli/stdin": VirtAdapter, + "wasi:cli/stdout": VirtAdapter, + "wasi:cli/stderr": VirtAdapter, + "wasi:cli/stderr": VirtAdapter, + "wasi:cli/terminal-input": VirtAdapter, + "wasi:cli/terminal-output": VirtAdapter, + "wasi:cli/terminal-stdin": VirtAdapter, + "wasi:cli/terminal-stdout": VirtAdapter, + "wasi:cli/terminal-stderr": VirtAdapter, "wasi:poll/poll": VirtAdapter, "wasi:clocks/monotonic-clock": VirtAdapter, "wasi:http/types": VirtAdapter, diff --git a/wit/deps/preview/command.wit b/wit/deps/cli/command.wit similarity index 70% rename from wit/deps/preview/command.wit rename to wit/deps/cli/command.wit index dcd06d7..3cd17be 100644 --- a/wit/deps/preview/command.wit +++ b/wit/deps/cli/command.wit @@ -1,3 +1,5 @@ +package wasi:cli + world command { import wasi:clocks/wall-clock import wasi:clocks/monotonic-clock @@ -16,11 +18,16 @@ world command { import wasi:random/insecure-seed import wasi:poll/poll import wasi:io/streams - import wasi:cli-base/environment - import wasi:cli-base/exit - import wasi:cli-base/stdin - import wasi:cli-base/stdout - import wasi:cli-base/stderr - export run: func() -> result + import environment + import exit + import stdin + import stdout + import stderr + import terminal-input + import terminal-output + import terminal-stdin + import terminal-stdout + import terminal-stderr + export run } diff --git a/wit/deps/wasi-cli-base/environment.wit b/wit/deps/cli/environment.wit similarity index 75% rename from wit/deps/wasi-cli-base/environment.wit rename to wit/deps/cli/environment.wit index 4c97c85..36790fe 100644 --- a/wit/deps/wasi-cli-base/environment.wit +++ b/wit/deps/cli/environment.wit @@ -1,5 +1,3 @@ -package wasi:cli-base - interface environment { /// Get the POSIX-style environment variables. /// @@ -13,4 +11,8 @@ interface environment { /// Get the POSIX-style arguments to the program. get-arguments: func() -> list + + /// Return a path that programs should use as their initial current working + /// directory, interpreting `.` as shorthand for this. + initial-cwd: func() -> option } diff --git a/wit/deps/cli/exit.wit b/wit/deps/cli/exit.wit new file mode 100644 index 0000000..4831d50 --- /dev/null +++ b/wit/deps/cli/exit.wit @@ -0,0 +1,4 @@ +interface exit { + /// Exit the current instance and any linked instances. + exit: func(status: result) +} diff --git a/wit/deps/cli/run.wit b/wit/deps/cli/run.wit new file mode 100644 index 0000000..45a1ca5 --- /dev/null +++ b/wit/deps/cli/run.wit @@ -0,0 +1,4 @@ +interface run { + /// Run the program. + run: func() -> result +} diff --git a/wit/deps/wasi-cli-base/stdio.wit b/wit/deps/cli/stdio.wit similarity index 100% rename from wit/deps/wasi-cli-base/stdio.wit rename to wit/deps/cli/stdio.wit diff --git a/wit/deps/cli/terminal.wit b/wit/deps/cli/terminal.wit new file mode 100644 index 0000000..f32e744 --- /dev/null +++ b/wit/deps/cli/terminal.wit @@ -0,0 +1,59 @@ +interface terminal-input { + /// The input side of a terminal. + /// + /// This [represents a resource](https://github.com/WebAssembly/WASI/blob/main/docs/WitInWasi.md#Resources). + type terminal-input = u32 + + // In the future, this may include functions for disabling echoing, + // disabling input buffering so that keyboard events are sent through + // immediately, querying supported features, and so on. + + /// Dispose of the specified terminal-input after which it may no longer + /// be used. + drop-terminal-input: func(this: terminal-input) +} + +interface terminal-output { + /// The output side of a terminal. + /// + /// This [represents a resource](https://github.com/WebAssembly/WASI/blob/main/docs/WitInWasi.md#Resources). + type terminal-output = u32 + + // In the future, this may include functions for querying the terminal + // size, being notified of terminal size changes, querying supported + // features, and so on. + + /// Dispose of the specified terminal-output, after which it may no longer + /// be used. + drop-terminal-output: func(this: terminal-output) +} + +/// An interface providing an optional `terminal-input` for stdin as a +/// link-time authority. +interface terminal-stdin { + use terminal-input.{terminal-input} + + /// If stdin is connected to a terminal, return a `terminal-input` handle + /// allowing further interaction with it. + get-terminal-stdin: func() -> option +} + +/// An interface providing an optional `terminal-output` for stdout as a +/// link-time authority. +interface terminal-stdout { + use terminal-output.{terminal-output} + + /// If stdout is connected to a terminal, return a `terminal-output` handle + /// allowing further interaction with it. + get-terminal-stdout: func() -> option +} + +/// An interface providing an optional `terminal-output` for stderr as a +/// link-time authority. +interface terminal-stderr { + use terminal-output.{terminal-output} + + /// If stderr is connected to a terminal, return a `terminal-output` handle + /// allowing further interaction with it. + get-terminal-stderr: func() -> option +} diff --git a/wit/deps/http/proxy.wit b/wit/deps/http/proxy.wit new file mode 100644 index 0000000..162ab32 --- /dev/null +++ b/wit/deps/http/proxy.wit @@ -0,0 +1,34 @@ +package wasi:http + +// The `wasi:http/proxy` world captures a widely-implementable intersection of +// hosts that includes HTTP forward and reverse proxies. Components targeting +// this world may concurrently stream in and out any number of incoming and +// outgoing HTTP requests. +world proxy { + // HTTP proxies have access to time and randomness. + import wasi:clocks/wall-clock + import wasi:clocks/monotonic-clock + import wasi:clocks/timezone + import wasi:random/random + + // Proxies have standard output and error streams which are expected to + // terminate in a developer-facing console provided by the host. + import wasi:cli/stdout + import wasi:cli/stderr + + // TODO: this is a temporary workaround until component tooling is able to + // gracefully handle the absence of stdin. Hosts must return an eof stream + // for this import, which is what wasi-libc + tooling will do automatically + // when this import is properly removed. + import wasi:cli/stdin + + // This is the default handler to use when user code simply wants to make an + // HTTP request (e.g., via `fetch()`). + import outgoing-handler + + // The host delivers incoming HTTP requests to a component by calling the + // `handle` function of this exported interface. A host may arbitrarily reuse + // or not reuse component instance when delivering incoming HTTP requests and + // thus a component must be able to handle 0..N calls to `handle`. + export incoming-handler +} diff --git a/wit/deps/http/types.wit b/wit/deps/http/types.wit index ee4227f..7b7b015 100644 --- a/wit/deps/http/types.wit +++ b/wit/deps/http/types.wit @@ -1,5 +1,3 @@ -package wasi:http - // The `wasi:http/types` interface is meant to be imported by components to // define the HTTP resource types and operations used by the component's // imported and exported interfaces. @@ -45,11 +43,11 @@ interface types { type fields = u32 drop-fields: func(fields: fields) new-fields: func(entries: list>) -> fields - fields-get: func(fields: fields, name: string) -> list - fields-set: func(fields: fields, name: string, value: list) + fields-get: func(fields: fields, name: string) -> list> + fields-set: func(fields: fields, name: string, value: list>) fields-delete: func(fields: fields, name: string) - fields-append: func(fields: fields, name: string, value: string) - fields-entries: func(fields: fields) -> list> + fields-append: func(fields: fields, name: string, value: list) + fields-entries: func(fields: fields) -> list>> fields-clone: func(fields: fields) -> fields type headers = fields @@ -80,18 +78,16 @@ interface types { drop-incoming-request: func(request: incoming-request) drop-outgoing-request: func(request: outgoing-request) incoming-request-method: func(request: incoming-request) -> method - incoming-request-path: func(request: incoming-request) -> string - incoming-request-query: func(request: incoming-request) -> string + incoming-request-path-with-query: func(request: incoming-request) -> option incoming-request-scheme: func(request: incoming-request) -> option - incoming-request-authority: func(request: incoming-request) -> string + incoming-request-authority: func(request: incoming-request) -> option incoming-request-headers: func(request: incoming-request) -> headers incoming-request-consume: func(request: incoming-request) -> result new-outgoing-request: func( method: method, - path: string, - query: string, + path-with-query: option, scheme: option, - authority: string, + authority: option, headers: headers ) -> outgoing-request outgoing-request-write: func(request: outgoing-request) -> result @@ -120,7 +116,7 @@ interface types { // simply return a `stream`). type response-outparam = u32 drop-response-outparam: func(response: response-outparam) - set-response-outparam: func(response: result) -> result + set-response-outparam: func(param: response-outparam, response: result) -> result // This type corresponds to the HTTP standard Status Code. type status-code = u16 diff --git a/wit/deps/io/streams.wit b/wit/deps/io/streams.wit index 011bde0..98df181 100644 --- a/wit/deps/io/streams.wit +++ b/wit/deps/io/streams.wit @@ -8,16 +8,6 @@ package wasi:io interface streams { use wasi:poll/poll.{pollable} - /// An error type returned from a stream operation. - /// - /// TODO: need to figure out the actual contents of this error. Used to be - /// an empty record but that's no longer allowed. The `dummy` field is - /// only here to have this be a valid in the component model by being - /// non-empty. - record stream-error { - dummy: u32, - } - /// Streams provide a sequence of data and then end; once they end, they /// no longer provide any further data. /// @@ -37,15 +27,12 @@ interface streams { /// An input bytestream. In the future, this will be replaced by handle /// types. /// - /// This conceptually represents a `stream`. It's temporary - /// scaffolding until component-model's async features are ready. - /// /// `input-stream`s are *non-blocking* to the extent practical on underlying /// platforms. I/O operations always return promptly; if fewer bytes are /// promptly available than requested, they return the number of bytes promptly /// available, which could even be zero. To wait for data to be available, /// use the `subscribe-to-input-stream` function to obtain a `pollable` which - /// can be polled for using `wasi_poll`. + /// can be polled for using `wasi:poll/poll.poll_oneoff`. /// /// And at present, it is a `u32` instead of being an actual handle, until /// the wit-bindgen implementation of handles and resources is ready. @@ -58,40 +45,36 @@ interface streams { /// This function returns a list of bytes containing the data that was /// read, along with a `stream-status` which, indicates whether further /// reads are expected to produce data. The returned list will contain up to - /// `len` bytes; it may return fewer than requested, but not more. - /// - /// Once a stream has reached the end, subsequent calls to read or - /// `skip` will always report end-of-stream rather than producing more + /// `len` bytes; it may return fewer than requested, but not more. An + /// empty list and `stream-status:open` indicates no more data is + /// available at this time, and that the pollable given by + /// `subscribe-to-input-stream` will be ready when more data is available. + /// + /// Once a stream has reached the end, subsequent calls to `read` or + /// `skip` will always report `stream-status:ended` rather than producing more /// data. /// - /// If `len` is 0, it represents a request to read 0 bytes, which should - /// always succeed, assuming the stream hasn't reached its end yet, and - /// return an empty list. - /// - /// The len here is a `u64`, but some callees may not be able to allocate - /// a buffer as large as that would imply. - /// FIXME: describe what happens if allocation fails. + /// When the caller gives a `len` of 0, it represents a request to read 0 + /// bytes. This read should always succeed and return an empty list and + /// the current `stream-status`. /// - /// When the returned `stream-status` is `open`, the length of the returned - /// value may be less than `len`. When an empty list is returned, this - /// indicates that no more bytes were available from the stream at that - /// time. In that case the subscribe-to-input-stream pollable will indicate - /// when additional bytes are available for reading. + /// The `len` parameter is a `u64`, which could represent a list of u8 which + /// is not possible to allocate in wasm32, or not desirable to allocate as + /// as a return value by the callee. The callee may return a list of bytes + /// less than `len` in size while more bytes are available for reading. read: func( this: input-stream, /// The maximum number of bytes to read len: u64 - ) -> result, stream-status>, stream-error> + ) -> result, stream-status>> - /// Read bytes from a stream, with blocking. - /// - /// This is similar to `read`, except that it blocks until at least one - /// byte can be read. + /// Read bytes from a stream, after blocking until at least one byte can + /// be read. Except for blocking, identical to `read`. blocking-read: func( this: input-stream, /// The maximum number of bytes to read len: u64 - ) -> result, stream-status>, stream-error> + ) -> result, stream-status>> /// Skip bytes from a stream. /// @@ -102,40 +85,42 @@ interface streams { /// `skip` will always report end-of-stream rather than producing more /// data. /// - /// This function returns the number of bytes skipped, along with a bool - /// indicating whether the end of the stream was reached. The returned - /// value will be at most `len`; it may be less. + /// This function returns the number of bytes skipped, along with a + /// `stream-status` indicating whether the end of the stream was + /// reached. The returned value will be at most `len`; it may be less. skip: func( this: input-stream, /// The maximum number of bytes to skip. len: u64, - ) -> result, stream-error> + ) -> result> - /// Skip bytes from a stream, with blocking. - /// - /// This is similar to `skip`, except that it blocks until at least one - /// byte can be consumed. + /// Skip bytes from a stream, after blocking until at least one byte + /// can be skipped. Except for blocking behavior, identical to `skip`. blocking-skip: func( this: input-stream, /// The maximum number of bytes to skip. len: u64, - ) -> result, stream-error> + ) -> result> /// Create a `pollable` which will resolve once either the specified stream /// has bytes available to read or the other end of the stream has been /// closed. + /// The created `pollable` is a child resource of the `input-stream`. + /// Implementations may trap if the `input-stream` is dropped before + /// all derived `pollable`s created with this function are dropped. subscribe-to-input-stream: func(this: input-stream) -> pollable /// Dispose of the specified `input-stream`, after which it may no longer /// be used. + /// Implementations may trap if this `input-stream` is dropped while child + /// `pollable` resources are still alive. + /// After this `input-stream` is dropped, implementations may report any + /// corresponding `output-stream` has `stream-state.closed`. drop-input-stream: func(this: input-stream) /// An output bytestream. In the future, this will be replaced by handle /// types. /// - /// This conceptually represents a `stream`. It's temporary - /// scaffolding until component-model's async features are ready. - /// /// `output-stream`s are *non-blocking* to the extent practical on /// underlying platforms. Except where specified otherwise, I/O operations also /// always return promptly, after the number of bytes that can be written @@ -159,17 +144,18 @@ interface streams { /// When the returned `stream-status` is `open`, the `u64` return value may /// be less than the length of `buf`. This indicates that no more bytes may /// be written to the stream promptly. In that case the - /// subscribe-to-output-stream pollable will indicate when additional bytes + /// `subscribe-to-output-stream` pollable will indicate when additional bytes /// may be promptly written. /// - /// TODO: document what happens when an empty list is written + /// Writing an empty list must return a non-error result with `0` for the + /// `u64` return value, and the current `stream-status`. write: func( this: output-stream, /// Data to write buf: list - ) -> result, stream-error> + ) -> result> - /// Write bytes to a stream, with blocking. + /// Blocking write of bytes to a stream. /// /// This is similar to `write`, except that it blocks until at least one /// byte can be written. @@ -177,27 +163,29 @@ interface streams { this: output-stream, /// Data to write buf: list - ) -> result, stream-error> + ) -> result> - /// Write multiple zero bytes to a stream. + /// Write multiple zero-bytes to a stream. /// - /// This function returns a `u64` indicating the number of zero bytes - /// that were written; it may be less than `len`. + /// This function returns a `u64` indicating the number of zero-bytes + /// that were written; it may be less than `len`. Equivelant to a call to + /// `write` with a list of zeroes of the given length. write-zeroes: func( this: output-stream, - /// The number of zero bytes to write + /// The number of zero-bytes to write len: u64 - ) -> result, stream-error> + ) -> result> /// Write multiple zero bytes to a stream, with blocking. /// /// This is similar to `write-zeroes`, except that it blocks until at least - /// one byte can be written. + /// one byte can be written. Equivelant to a call to `blocking-write` with + /// a list of zeroes of the given length. blocking-write-zeroes: func( this: output-stream, /// The number of zero bytes to write len: u64 - ) -> result, stream-error> + ) -> result> /// Read from one stream and write to another. /// @@ -212,7 +200,7 @@ interface streams { src: input-stream, /// The number of bytes to splice len: u64, - ) -> result, stream-error> + ) -> result> /// Read from one stream and write to another, with blocking. /// @@ -224,7 +212,7 @@ interface streams { src: input-stream, /// The number of bytes to splice len: u64, - ) -> result, stream-error> + ) -> result> /// Forward the entire contents of an input stream to an output stream. /// @@ -242,13 +230,24 @@ interface streams { this: output-stream, /// The stream to read from src: input-stream - ) -> result, stream-error> + ) -> result> /// Create a `pollable` which will resolve once either the specified stream - /// is ready to accept bytes or the other end of the stream has been closed. + /// is ready to accept bytes or the `stream-state` has become closed. + /// + /// Once the stream-state is closed, this pollable is always ready + /// immediately. + /// + /// The created `pollable` is a child resource of the `output-stream`. + /// Implementations may trap if the `output-stream` is dropped before + /// all derived `pollable`s created with this function are dropped. subscribe-to-output-stream: func(this: output-stream) -> pollable /// Dispose of the specified `output-stream`, after which it may no longer /// be used. + /// Implementations may trap if this `output-stream` is dropped while + /// child `pollable` resources are still alive. + /// After this `output-stream` is dropped, implementations may report any + /// corresponding `input-stream` has `stream-state.closed`. drop-output-stream: func(this: output-stream) } diff --git a/wit/deps/logging/handler.wit b/wit/deps/logging/logging.wit similarity index 91% rename from wit/deps/logging/handler.wit rename to wit/deps/logging/logging.wit index e6b077b..b0cc451 100644 --- a/wit/deps/logging/handler.wit +++ b/wit/deps/logging/logging.wit @@ -2,7 +2,7 @@ package wasi:logging /// WASI Logging is a logging API intended to let users emit log messages with /// simple priority levels and context values. -interface handler { +interface logging { /// A log level, describing a kind of message. enum level { /// Describes messages about the values of variables and the flow of @@ -22,6 +22,9 @@ interface handler { /// Describes messages indicating serious errors. error, + + /// Describes messages indicating fatal errors. + critical, } /// Emit a log message. diff --git a/wit/deps/preview/command-extended.wit b/wit/deps/preview/command-extended.wit deleted file mode 100644 index 8fe7160..0000000 --- a/wit/deps/preview/command-extended.wit +++ /dev/null @@ -1,36 +0,0 @@ -package wasi:preview - -world command-extended { - import wasi:clocks/wall-clock - import wasi:clocks/monotonic-clock - import wasi:clocks/timezone - import wasi:filesystem/types - import wasi:filesystem/preopens - import wasi:sockets/instance-network - import wasi:sockets/ip-name-lookup - import wasi:sockets/network - import wasi:sockets/tcp-create-socket - import wasi:sockets/tcp - import wasi:sockets/udp-create-socket - import wasi:sockets/udp - import wasi:random/random - import wasi:random/insecure - import wasi:random/insecure-seed - import wasi:poll/poll - import wasi:io/streams - import wasi:cli-base/environment - import wasi:cli-base/exit - import wasi:cli-base/stdin - import wasi:cli-base/stdout - import wasi:cli-base/stderr - - // We should replace all others with `include self.command` - // as soon as the unioning of worlds is available: - // https://github.com/WebAssembly/component-model/issues/169 - import wasi:logging/handler - import wasi:http/outgoing-handler - - export run: func( - args: list, - ) -> result -} diff --git a/wit/deps/preview/proxy.wit b/wit/deps/preview/proxy.wit deleted file mode 100644 index a616daa..0000000 --- a/wit/deps/preview/proxy.wit +++ /dev/null @@ -1,9 +0,0 @@ -world proxy { - import wasi:random/random - import wasi:random/insecure - import wasi:random/insecure-seed - import wasi:logging/handler - import wasi:http/outgoing-handler - - export wasi:http/incoming-handler -} diff --git a/wit/deps/preview/reactor.wit b/wit/deps/preview/reactor.wit deleted file mode 100644 index aff49ea..0000000 --- a/wit/deps/preview/reactor.wit +++ /dev/null @@ -1,24 +0,0 @@ -world reactor { - import wasi:clocks/wall-clock - import wasi:clocks/monotonic-clock - import wasi:clocks/timezone - import wasi:filesystem/types - import wasi:filesystem/preopens - import wasi:sockets/instance-network - import wasi:sockets/ip-name-lookup - import wasi:sockets/network - import wasi:sockets/tcp-create-socket - import wasi:sockets/tcp - import wasi:sockets/udp-create-socket - import wasi:sockets/udp - import wasi:random/random - import wasi:poll/poll - import wasi:io/streams - import wasi:logging/handler - import wasi:http/outgoing-handler - import wasi:cli-base/environment - import wasi:cli-base/exit - import wasi:cli-base/stdin - import wasi:cli-base/stdout - import wasi:cli-base/stderr -} diff --git a/wit/deps/sockets/ip-name-lookup.wit b/wit/deps/sockets/ip-name-lookup.wit index 6c64b46..f15d19d 100644 --- a/wit/deps/sockets/ip-name-lookup.wit +++ b/wit/deps/sockets/ip-name-lookup.wit @@ -5,9 +5,9 @@ interface ip-name-lookup { /// Resolve an internet host name to a list of IP addresses. - /// + /// /// See the wasi-socket proposal README.md for a comparison with getaddrinfo. - /// + /// /// # Parameters /// - `name`: The name to look up. IP addresses are not allowed. Unicode domain names are automatically converted /// to ASCII using IDNA encoding. @@ -17,18 +17,18 @@ interface ip-name-lookup { /// systems without an active IPv6 interface. Notes: /// - Even when no public IPv6 interfaces are present or active, names like "localhost" can still resolve to an IPv6 address. /// - Whatever is "available" or "unavailable" is volatile and can change everytime a network cable is unplugged. - /// + /// /// This function never blocks. It either immediately fails or immediately returns successfully with a `resolve-address-stream` /// that can be used to (asynchronously) fetch the results. - /// + /// /// At the moment, the stream never completes successfully with 0 items. Ie. the first call /// to `resolve-next-address` never returns `ok(none)`. This may change in the future. - /// + /// /// # Typical errors /// - `invalid-name`: `name` is a syntactically invalid domain name. /// - `invalid-name`: `name` is an IP address. /// - `address-family-not-supported`: The specified `address-family` is not supported. (EAI_FAMILY) - /// + /// /// # References: /// - /// - @@ -41,14 +41,14 @@ interface ip-name-lookup { type resolve-address-stream = u32 /// Returns the next address from the resolver. - /// + /// /// This function should be called multiple times. On each call, it will /// return the next address in connection order preference. If all /// addresses have been exhausted, this function returns `none`. /// After which, you should release the stream with `drop-resolve-address-stream`. - /// + /// /// This function never returns IPv4-mapped IPv6 addresses. - /// + /// /// # Typical errors /// - `name-unresolvable`: Name does not exist or has no suitable associated IP addresses. (EAI_NONAME, EAI_NODATA, EAI_ADDRFAMILY) /// - `temporary-resolver-failure`: A temporary failure in name resolution occurred. (EAI_AGAIN) @@ -57,12 +57,12 @@ interface ip-name-lookup { resolve-next-address: func(this: resolve-address-stream) -> result, error-code> /// Dispose of the specified `resolve-address-stream`, after which it may no longer be used. - /// + /// /// Note: this function is scheduled to be removed when Resources are natively supported in Wit. drop-resolve-address-stream: func(this: resolve-address-stream) /// Create a `pollable` which will resolve once the stream is ready for I/O. - /// + /// /// Note: this function is here for WASI Preview2 only. /// It's planned to be removed when `future` is natively supported in Preview3. subscribe: func(this: resolve-address-stream) -> pollable diff --git a/wit/deps/sockets/network.wit b/wit/deps/sockets/network.wit index c370214..a198ea8 100644 --- a/wit/deps/sockets/network.wit +++ b/wit/deps/sockets/network.wit @@ -4,12 +4,12 @@ interface network { /// An opaque resource that represents access to (a subset of) the network. /// This enables context-based security for networking. /// There is no need for this to map 1:1 to a physical network interface. - /// + /// /// FYI, In the future this will be replaced by handle types. type network = u32 /// Dispose of the specified `network`, after which it may no longer be used. - /// + /// /// Note: this function is scheduled to be removed when Resources are natively supported in Wit. drop-network: func(this: network) @@ -153,7 +153,7 @@ interface network { enum ip-address-family { /// Similar to `AF_INET` in POSIX. - ipv4, + ipv4, /// Similar to `AF_INET6` in POSIX. ipv6, diff --git a/wit/deps/sockets/tcp-create-socket.wit b/wit/deps/sockets/tcp-create-socket.wit index f467d28..f43bc89 100644 --- a/wit/deps/sockets/tcp-create-socket.wit +++ b/wit/deps/sockets/tcp-create-socket.wit @@ -4,20 +4,20 @@ interface tcp-create-socket { use tcp.{tcp-socket} /// Create a new TCP socket. - /// + /// /// Similar to `socket(AF_INET or AF_INET6, SOCK_STREAM, IPPROTO_TCP)` in POSIX. - /// + /// /// This function does not require a network capability handle. This is considered to be safe because /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`listen`/`connect` /// is called, the socket is effectively an in-memory configuration object, unable to communicate with the outside world. - /// + /// /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. - /// + /// /// # Typical errors /// - `not-supported`: The host does not support TCP sockets. (EOPNOTSUPP) /// - `address-family-not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) - /// + /// /// # References /// - /// - diff --git a/wit/deps/sockets/tcp.wit b/wit/deps/sockets/tcp.wit index 7ed46a6..4edb1db 100644 --- a/wit/deps/sockets/tcp.wit +++ b/wit/deps/sockets/tcp.wit @@ -6,7 +6,7 @@ interface tcp { /// A TCP socket handle. type tcp-socket = u32 - + enum shutdown-type { /// Similar to `SHUT_RD` in POSIX. @@ -25,24 +25,24 @@ interface tcp { /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which /// network interface(s) to bind to. /// If the TCP/UDP port is zero, the socket will be bound to a random free port. - /// + /// /// When a socket is not explicitly bound, the first invocation to a listen or connect operation will /// implicitly bind the socket. - /// + /// /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// + /// /// # Typical `start` errors /// - `address-family-mismatch`: The `local-address` has the wrong address family. (EINVAL) /// - `already-bound`: The socket is already bound. (EINVAL) /// - `concurrency-conflict`: Another `bind`, `connect` or `listen` operation is already in progress. (EALREADY) - /// + /// /// # Typical `finish` errors /// - `ephemeral-ports-exhausted`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) /// - `address-in-use`: Address is already in use. (EADDRINUSE) /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) /// - `not-in-progress`: A `bind` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// + /// /// # References /// - /// - @@ -52,11 +52,11 @@ interface tcp { finish-bind: func(this: tcp-socket) -> result<_, error-code> /// Connect to a remote endpoint. - /// + /// /// On success: /// - the socket is transitioned into the Connection state /// - a pair of streams is returned that can be used to read & write to the connection - /// + /// /// # Typical `start` errors /// - `address-family-mismatch`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) /// - `invalid-remote-address`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EADDRNOTAVAIL on Windows) @@ -65,7 +65,7 @@ interface tcp { /// - `already-connected`: The socket is already in the Connection state. (EISCONN) /// - `already-listening`: The socket is already in the Listener state. (EOPNOTSUPP, EINVAL on Windows) /// - `concurrency-conflict`: Another `bind`, `connect` or `listen` operation is already in progress. (EALREADY) - /// + /// /// # Typical `finish` errors /// - `timeout`: Connection timed out. (ETIMEDOUT) /// - `connection-refused`: The connection was forcefully rejected. (ECONNREFUSED) @@ -74,7 +74,7 @@ interface tcp { /// - `ephemeral-ports-exhausted`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) /// - `not-in-progress`: A `connect` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// + /// /// # References /// - /// - @@ -84,13 +84,15 @@ interface tcp { finish-connect: func(this: tcp-socket) -> result, error-code> /// Start listening for new connections. - /// + /// /// Transitions the socket into the Listener state. - /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// + /// + /// Unlike POSIX: + /// - this function is async. This enables interactive WASI hosts to inject permission prompts. + /// - the socket must already be explicitly bound. + /// /// # Typical `start` errors - /// - `already-attached`: The socket is already attached to a different network. The `network` passed to `listen` must be identical to the one passed to `bind`. + /// - `not-bound`: The socket is not bound to any local address. (EDESTADDRREQ) /// - `already-connected`: The socket is already in the Connection state. (EISCONN, EINVAL on BSD) /// - `already-listening`: The socket is already in the Listener state. /// - `concurrency-conflict`: Another `bind`, `connect` or `listen` operation is already in progress. (EINVAL on BSD) @@ -105,22 +107,22 @@ interface tcp { /// - /// - /// - - start-listen: func(this: tcp-socket, network: network) -> result<_, error-code> + start-listen: func(this: tcp-socket) -> result<_, error-code> finish-listen: func(this: tcp-socket) -> result<_, error-code> /// Accept a new client socket. - /// + /// /// The returned socket is bound and in the Connection state. - /// + /// /// On success, this function returns the newly accepted client socket along with /// a pair of streams that can be used to read & write to the connection. - /// + /// /// # Typical errors /// - `not-listening`: Socket is not in the Listener state. (EINVAL) /// - `would-block`: No pending connections at the moment. (EWOULDBLOCK, EAGAIN) - /// + /// /// Host implementations must skip over transient errors returned by the native accept syscall. - /// + /// /// # References /// - /// - @@ -129,10 +131,10 @@ interface tcp { accept: func(this: tcp-socket) -> result, error-code> /// Get the bound local address. - /// + /// /// # Typical errors /// - `not-bound`: The socket is not bound to any local address. - /// + /// /// # References /// - /// - @@ -141,10 +143,10 @@ interface tcp { local-address: func(this: tcp-socket) -> result /// Get the bound remote address. - /// + /// /// # Typical errors /// - `not-connected`: The socket is not connected to a remote address. (ENOTCONN) - /// + /// /// # References /// - /// - @@ -153,14 +155,14 @@ interface tcp { remote-address: func(this: tcp-socket) -> result /// Whether this is a IPv4 or IPv6 socket. - /// + /// /// Equivalent to the SO_DOMAIN socket option. address-family: func(this: tcp-socket) -> ip-address-family - + /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// + /// /// Equivalent to the IPV6_V6ONLY socket option. - /// + /// /// # Typical errors /// - `ipv6-only-operation`: (get/set) `this` socket is an IPv4 socket. /// - `already-bound`: (set) The socket is already bound. @@ -170,28 +172,28 @@ interface tcp { set-ipv6-only: func(this: tcp-socket, value: bool) -> result<_, error-code> /// Hints the desired listen queue size. Implementations are free to ignore this. - /// + /// /// # Typical errors /// - `already-connected`: (set) The socket is already in the Connection state. /// - `concurrency-conflict`: (set) A `bind`, `connect` or `listen` operation is already in progress. (EALREADY) set-listen-backlog-size: func(this: tcp-socket, value: u64) -> result<_, error-code> /// Equivalent to the SO_KEEPALIVE socket option. - /// + /// /// # Typical errors /// - `concurrency-conflict`: (set) A `bind`, `connect` or `listen` operation is already in progress. (EALREADY) keep-alive: func(this: tcp-socket) -> result set-keep-alive: func(this: tcp-socket, value: bool) -> result<_, error-code> /// Equivalent to the TCP_NODELAY socket option. - /// + /// /// # Typical errors /// - `concurrency-conflict`: (set) A `bind`, `connect` or `listen` operation is already in progress. (EALREADY) no-delay: func(this: tcp-socket) -> result set-no-delay: func(this: tcp-socket, value: bool) -> result<_, error-code> - + /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. - /// + /// /// # Typical errors /// - `already-connected`: (set) The socket is already in the Connection state. /// - `already-listening`: (set) The socket is already in the Listener state. @@ -200,16 +202,16 @@ interface tcp { set-unicast-hop-limit: func(this: tcp-socket, value: u8) -> result<_, error-code> /// The kernel buffer space reserved for sends/receives on this socket. - /// + /// /// Note #1: an implementation may choose to cap or round the buffer size when setting the value. /// In other words, after setting a value, reading the same setting back may return a different value. - /// + /// /// Note #2: there is not necessarily a direct relationship between the kernel buffer size and the bytes of /// actual data to be sent/received by the application, because the kernel might also use the buffer space /// for internal metadata structures. - /// + /// /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. - /// + /// /// # Typical errors /// - `already-connected`: (set) The socket is already in the Connection state. /// - `already-listening`: (set) The socket is already in the Listener state. @@ -220,25 +222,25 @@ interface tcp { set-send-buffer-size: func(this: tcp-socket, value: u64) -> result<_, error-code> /// Create a `pollable` which will resolve once the socket is ready for I/O. - /// + /// /// Note: this function is here for WASI Preview2 only. /// It's planned to be removed when `future` is natively supported in Preview3. subscribe: func(this: tcp-socket) -> pollable /// Initiate a graceful shutdown. - /// + /// /// - receive: the socket is not expecting to receive any more data from the peer. All subsequent read /// operations on the `input-stream` associated with this socket will return an End Of Stream indication. /// Any data still in the receive queue at time of calling `shutdown` will be discarded. /// - send: the socket is not expecting to send any more data to the peer. All subsequent write /// operations on the `output-stream` associated with this socket will return an error. /// - both: same effect as receive & send combined. - /// + /// /// The shutdown function does not close (drop) the socket. - /// + /// /// # Typical errors /// - `not-connected`: The socket is not in the Connection state. (ENOTCONN) - /// + /// /// # References /// - /// - @@ -247,9 +249,9 @@ interface tcp { shutdown: func(this: tcp-socket, shutdown-type: shutdown-type) -> result<_, error-code> /// Dispose of the specified `tcp-socket`, after which it may no longer be used. - /// + /// /// Similar to the POSIX `close` function. - /// + /// /// Note: this function is scheduled to be removed when Resources are natively supported in Wit. drop-tcp-socket: func(this: tcp-socket) } diff --git a/wit/deps/sockets/udp-create-socket.wit b/wit/deps/sockets/udp-create-socket.wit index 1cfbd7f..cd4c08f 100644 --- a/wit/deps/sockets/udp-create-socket.wit +++ b/wit/deps/sockets/udp-create-socket.wit @@ -4,20 +4,20 @@ interface udp-create-socket { use udp.{udp-socket} /// Create a new UDP socket. - /// + /// /// Similar to `socket(AF_INET or AF_INET6, SOCK_DGRAM, IPPROTO_UDP)` in POSIX. - /// + /// /// This function does not require a network capability handle. This is considered to be safe because /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`connect` is called, /// the socket is effectively an in-memory configuration object, unable to communicate with the outside world. - /// + /// /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. - /// + /// /// # Typical errors /// - `not-supported`: The host does not support UDP sockets. (EOPNOTSUPP) /// - `address-family-not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) - /// + /// /// # References: /// - /// - diff --git a/wit/deps/sockets/udp.wit b/wit/deps/sockets/udp.wit index 9dd4573..700b9e2 100644 --- a/wit/deps/sockets/udp.wit +++ b/wit/deps/sockets/udp.wit @@ -27,23 +27,23 @@ interface udp { /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which /// network interface(s) to bind to. /// If the TCP/UDP port is zero, the socket will be bound to a random free port. - /// + /// /// When a socket is not explicitly bound, the first invocation to connect will implicitly bind the socket. - /// + /// /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// + /// /// # Typical `start` errors /// - `address-family-mismatch`: The `local-address` has the wrong address family. (EINVAL) /// - `already-bound`: The socket is already bound. (EINVAL) /// - `concurrency-conflict`: Another `bind` or `connect` operation is already in progress. (EALREADY) - /// + /// /// # Typical `finish` errors /// - `ephemeral-ports-exhausted`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) /// - `address-in-use`: Address is already in use. (EADDRINUSE) /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) /// - `not-in-progress`: A `bind` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// + /// /// # References /// - /// - @@ -53,29 +53,29 @@ interface udp { finish-bind: func(this: udp-socket) -> result<_, error-code> /// Set the destination address. - /// + /// /// The local-address is updated based on the best network path to `remote-address`. - /// + /// /// When a destination address is set: /// - all receive operations will only return datagrams sent from the provided `remote-address`. /// - the `send` function can only be used to send to this destination. - /// + /// /// Note that this function does not generate any network traffic and the peer is not aware of this "connection". - /// + /// /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// + /// /// # Typical `start` errors /// - `address-family-mismatch`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) /// - `invalid-remote-address`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-remote-address`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) /// - `already-attached`: The socket is already bound to a different network. The `network` passed to `connect` must be identical to the one passed to `bind`. /// - `concurrency-conflict`: Another `bind` or `connect` operation is already in progress. (EALREADY) - /// + /// /// # Typical `finish` errors /// - `ephemeral-ports-exhausted`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) /// - `not-in-progress`: A `connect` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) - /// + /// /// # References /// - /// - @@ -84,32 +84,42 @@ interface udp { start-connect: func(this: udp-socket, network: network, remote-address: ip-socket-address) -> result<_, error-code> finish-connect: func(this: udp-socket) -> result<_, error-code> - /// Receive a message. - /// - /// Returns: - /// - The sender address of the datagram - /// - The number of bytes read. - /// + /// Receive messages on the socket. + /// + /// This function attempts to receive up to `max-results` datagrams on the socket without blocking. + /// The returned list may contain fewer elements than requested, but never more. + /// If `max-results` is 0, this function returns successfully with an empty list. + /// /// # Typical errors /// - `not-bound`: The socket is not bound to any local address. (EINVAL) /// - `remote-unreachable`: The remote address is not reachable. (ECONNREFUSED, ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN) /// - `would-block`: There is no pending data available to be read at the moment. (EWOULDBLOCK, EAGAIN) - /// + /// /// # References /// - /// - /// - + /// - /// - /// - /// - /// - - receive: func(this: udp-socket) -> result - - /// Send a message to a specific destination address. - /// + receive: func(this: udp-socket, max-results: u64) -> result, error-code> + + /// Send messages on the socket. + /// + /// This function attempts to send all provided `datagrams` on the socket without blocking and + /// returns how many messages were actually sent (or queued for sending). + /// + /// This function semantically behaves the same as iterating the `datagrams` list and sequentially + /// sending each individual datagram until either the end of the list has been reached or the first error occurred. + /// If at least one datagram has been sent successfully, this function never returns an error. + /// + /// If the input list is empty, the function returns `ok(0)`. + /// /// The remote address option is required. To send a message to the "connected" peer, /// call `remote-address` to get their address. - /// + /// /// # Typical errors /// - `address-family-mismatch`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) /// - `invalid-remote-address`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) @@ -119,22 +129,23 @@ interface udp { /// - `remote-unreachable`: The remote address is not reachable. (ECONNREFUSED, ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN) /// - `datagram-too-large`: The datagram is too large. (EMSGSIZE) /// - `would-block`: The send buffer is currently full. (EWOULDBLOCK, EAGAIN) - /// + /// /// # References /// - /// - /// - + /// - /// - /// - /// - /// - - send: func(this: udp-socket, datagram: datagram) -> result<_, error-code> + send: func(this: udp-socket, datagrams: list) -> result /// Get the current bound address. - /// + /// /// # Typical errors /// - `not-bound`: The socket is not bound to any local address. - /// + /// /// # References /// - /// - @@ -143,10 +154,10 @@ interface udp { local-address: func(this: udp-socket) -> result /// Get the address set with `connect`. - /// + /// /// # Typical errors /// - `not-connected`: The socket is not connected to a remote address. (ENOTCONN) - /// + /// /// # References /// - /// - @@ -155,14 +166,14 @@ interface udp { remote-address: func(this: udp-socket) -> result /// Whether this is a IPv4 or IPv6 socket. - /// + /// /// Equivalent to the SO_DOMAIN socket option. address-family: func(this: udp-socket) -> ip-address-family /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// + /// /// Equivalent to the IPV6_V6ONLY socket option. - /// + /// /// # Typical errors /// - `ipv6-only-operation`: (get/set) `this` socket is an IPv4 socket. /// - `already-bound`: (set) The socket is already bound. @@ -172,25 +183,23 @@ interface udp { set-ipv6-only: func(this: udp-socket, value: bool) -> result<_, error-code> /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. - /// + /// /// # Typical errors /// - `concurrency-conflict`: (set) Another `bind` or `connect` operation is already in progress. (EALREADY) unicast-hop-limit: func(this: udp-socket) -> result set-unicast-hop-limit: func(this: udp-socket, value: u8) -> result<_, error-code> /// The kernel buffer space reserved for sends/receives on this socket. - /// + /// /// Note #1: an implementation may choose to cap or round the buffer size when setting the value. /// In other words, after setting a value, reading the same setting back may return a different value. - /// + /// /// Note #2: there is not necessarily a direct relationship between the kernel buffer size and the bytes of /// actual data to be sent/received by the application, because the kernel might also use the buffer space /// for internal metadata structures. - /// - /// Fails when this socket is in the Listening state. - /// + /// /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. - /// + /// /// # Typical errors /// - `concurrency-conflict`: (set) Another `bind` or `connect` operation is already in progress. (EALREADY) receive-buffer-size: func(this: udp-socket) -> result @@ -199,13 +208,13 @@ interface udp { set-send-buffer-size: func(this: udp-socket, value: u64) -> result<_, error-code> /// Create a `pollable` which will resolve once the socket is ready for I/O. - /// + /// /// Note: this function is here for WASI Preview2 only. /// It's planned to be removed when `future` is natively supported in Preview3. subscribe: func(this: udp-socket) -> pollable /// Dispose of the specified `udp-socket`, after which it may no longer be used. - /// + /// /// Note: this function is scheduled to be removed when Resources are natively supported in Wit. drop-udp-socket: func(this: udp-socket) } diff --git a/wit/deps/wasi-cli-base/exit.wit b/wit/deps/wasi-cli-base/exit.wit deleted file mode 100644 index 66835aa..0000000 --- a/wit/deps/wasi-cli-base/exit.wit +++ /dev/null @@ -1,4 +0,0 @@ -interface exit { - /// Exit the curerent instance and any linked instances. - exit: func(status: result) -} diff --git a/wit/virt.wit b/wit/virt.wit index 0a85788..b88fcbd 100644 --- a/wit/virt.wit +++ b/wit/virt.wit @@ -3,7 +3,7 @@ package local:virt // in future this should be defined as a union world of the various // virtual subsystems, when union syntax lands world virtual-adapter { - import wasi:cli-base/environment + import wasi:cli/environment import wasi:filesystem/preopens import wasi:filesystem/types import wasi:io/streams @@ -11,15 +11,25 @@ world virtual-adapter { log: func(msg: string) -> () } export wasi:io/streams - export wasi:cli-base/environment + export wasi:cli/environment export wasi:filesystem/types export wasi:filesystem/preopens - import wasi:cli-base/stdin - import wasi:cli-base/stdout - import wasi:cli-base/stderr - export wasi:cli-base/stdin - export wasi:cli-base/stdout - export wasi:cli-base/stderr + import wasi:cli/stdin + import wasi:cli/stdout + import wasi:cli/stderr + import wasi:cli/terminal-input + import wasi:cli/terminal-output + import wasi:cli/terminal-stdin + import wasi:cli/terminal-stdout + import wasi:cli/terminal-stderr + export wasi:cli/stdin + export wasi:cli/stdout + export wasi:cli/stderr + export wasi:cli/terminal-input + export wasi:cli/terminal-output + export wasi:cli/terminal-stdin + export wasi:cli/terminal-stdout + export wasi:cli/terminal-stderr import wasi:poll/poll export wasi:poll/poll import wasi:clocks/monotonic-clock @@ -77,18 +87,28 @@ world virtual-fs { } world virtual-stdio { - import wasi:cli-base/stdin - import wasi:cli-base/stdout - import wasi:cli-base/stderr - export wasi:cli-base/stdin - export wasi:cli-base/stdout - export wasi:cli-base/stderr + import wasi:cli/stdin + import wasi:cli/stdout + import wasi:cli/stderr + import wasi:cli/terminal-input + import wasi:cli/terminal-output + import wasi:cli/terminal-stdin + import wasi:cli/terminal-stdout + import wasi:cli/terminal-stderr + export wasi:cli/stdin + export wasi:cli/stdout + export wasi:cli/stderr + export wasi:cli/terminal-input + export wasi:cli/terminal-output + export wasi:cli/terminal-stdin + export wasi:cli/terminal-stdout + export wasi:cli/terminal-stderr } // remaining subsystems world virtual-env { - import wasi:cli-base/environment - export wasi:cli-base/environment + import wasi:cli/environment + export wasi:cli/environment } world virtual-clocks { @@ -134,8 +154,8 @@ world virtual-http { } world virtual-exit { - import wasi:cli-base/exit - export wasi:cli-base/exit + import wasi:cli/exit + export wasi:cli/exit } world virt-test { @@ -155,12 +175,17 @@ world virt-test { import wasi:random/insecure-seed import wasi:poll/poll import wasi:io/streams - import wasi:cli-base/environment + import wasi:cli/environment import wasi:filesystem/preopens - import wasi:cli-base/exit - import wasi:cli-base/stdin - import wasi:cli-base/stdout - import wasi:cli-base/stderr + import wasi:cli/exit + import wasi:cli/stdin + import wasi:cli/stdout + import wasi:cli/stderr + import wasi:cli/terminal-input + import wasi:cli/terminal-output + import wasi:cli/terminal-stdin + import wasi:cli/terminal-stdout + import wasi:cli/terminal-stderr export test-get-env: func() -> list> export test-file-read: func(path: string) -> string From dc81fa7789ecdfcabbf38ef1d32f1f6ac0d2c1bb Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Thu, 24 Aug 2023 17:54:22 -0700 Subject: [PATCH 2/3] fix up tests --- Cargo.lock | 255 +++++++++------------- Cargo.toml | 4 +- lib/virtual_adapter.wasm | Bin 182357 -> 182364 bytes src/virt_deny.rs | 23 +- src/virt_env.rs | 10 +- src/virt_io.rs | 122 ++++++++--- tests/components/do-everything/src/lib.rs | 2 +- tests/components/file-read/src/lib.rs | 2 +- tests/virt.rs | 43 ++-- virtual-adapter/src/io.rs | 18 +- 10 files changed, 254 insertions(+), 225 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f385ad7..b8f3399 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -210,6 +210,18 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "cap-net-ext" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ffc30dee200c20b4dcb80572226f42658e1d9c4b668656d7cc59c33d50e396e" +dependencies = [ + "cap-primitives 2.0.0", + "cap-std 2.0.0", + "rustix 0.38.8", + "smallvec", +] + [[package]] name = "cap-primitives" version = "1.0.15" @@ -383,18 +395,16 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7348010242a23d0285e5f852f13b07f9540a50f13ab6e92fd047b88490bf5ee" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38849e3b19bc9a6dbf8bc188876b76e6ba288089a5567be573de50f44801375c" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "bumpalo", "cranelift-bforest", @@ -413,42 +423,37 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3de51da572e65cb712a47b7413c50208cac61a4201560038de929d9a7f4fadf" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75f869ae826055a5064d4a400abde7806eb86d89765dbae51d42846df23121a" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" [[package]] name = "cranelift-control" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf6631316ad6ccfd60055740ad25326330d31407a983a454e45c5a62f64d101" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1d6a38935ee64551a7c8da4cc759fdcaba1d951ec56336737c0459ed5a05d2" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73c410c2d52e28fc4b49aab955a1c2f58580ff37a3b0641e23bccd6049e4b5" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cranelift-codegen", "log", @@ -458,15 +463,13 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61acaa7646020e0444bb3a22d212a5bae0e3b3969b18e1276a037ccd6493a8fd" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" [[package]] name = "cranelift-native" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "543f52ef487498253ebe5df321373c5c314da74ada0e92f13451b6f887194f87" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cranelift-codegen", "libc", @@ -475,9 +478,8 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788c27f41f31a50a9a3546b91253ad9495cd54df0d6533b3f3dcb4fb7a988f69" +version = "0.100.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -485,7 +487,7 @@ dependencies = [ "itertools", "log", "smallvec", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", "wasmtime-types", ] @@ -2017,9 +2019,8 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi-cap-std-sync" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cef338a20bd9e5e469a37b192b2a954c4dde83ea896c8eaf45df8c84cdf7be5" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "async-trait", @@ -2041,9 +2042,8 @@ dependencies = [ [[package]] name = "wasi-common" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb9c753bdf98fdc592fc729bda2248996f5dd1be71f4e01bf8c08225acb7b6bb" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "bitflags 2.4.0", @@ -2093,7 +2093,7 @@ dependencies = [ "serde_yaml", "smallvec", "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f)", - "wasmparser 0.110.0 (git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f)", + "wasmparser 0.110.0", "wat 1.0.69", ] @@ -2184,16 +2184,6 @@ version = "0.80.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "449167e2832691a1bff24cde28d2804e90e09586a448c8e76984792c44334a6b" -[[package]] -name = "wasmparser" -version = "0.110.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dfcdb72d96f01e6c85b6bf20102e7423bdbaad5c337301bab2bbf253d26413c" -dependencies = [ - "indexmap 2.0.0", - "semver", -] - [[package]] name = "wasmparser" version = "0.110.0" @@ -2225,9 +2215,8 @@ dependencies = [ [[package]] name = "wasmtime" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e38ee12eaafb34198cce001e2ea0a83d3884db5cf8e3af08864f108a2fb57c85" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "async-trait", @@ -2248,7 +2237,7 @@ dependencies = [ "serde_json", "target-lexicon", "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", "wasmtime-cache", "wasmtime-component-macro", "wasmtime-component-util", @@ -2264,18 +2253,16 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82313f9dce6f64dd08a7b51bef57411741b7eaef6b4611f77b91b6213a99808b" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d22677d863d88d0ee05a07bfe28fdc5525149b6ea5a108f1fa2796fa86d75b8" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "base64", @@ -2293,9 +2280,8 @@ dependencies = [ [[package]] name = "wasmtime-component-macro" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b6da03d55c656066ebc93d27ce54de11fcd2d3157e7490c6196a65aa1e9bc0" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "proc-macro2", @@ -2303,22 +2289,21 @@ dependencies = [ "syn 2.0.29", "wasmtime-component-util", "wasmtime-wit-bindgen", - "wit-parser 0.9.2", + "wit-parser", ] [[package]] name = "wasmtime-component-util" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b54327f9ce6a46c6841c43d93c4fa366cd0beb0f075743b120d31a3d6afe34fd" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" [[package]] name = "wasmtime-cranelift" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d52e14e5453e82708816e992140c59e511bbf7c0868ee654100e2792483f56" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", + "cfg-if", "cranelift-codegen", "cranelift-control", "cranelift-entity", @@ -2330,7 +2315,7 @@ dependencies = [ "object 0.31.1", "target-lexicon", "thiserror", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", "wasmtime-cranelift-shared", "wasmtime-environ", "wasmtime-versioned-export-macros", @@ -2338,9 +2323,8 @@ dependencies = [ [[package]] name = "wasmtime-cranelift-shared" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ddb7f34fff5b4a01aa2e55373fceb1b59d5f981abca44afdd63d7dd39689047" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "cranelift-codegen", @@ -2354,9 +2338,8 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad336809866b743410ac86ec0bdc34899d6f1af5d3deed97188e90503ff527d7" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "cranelift-entity", @@ -2368,7 +2351,7 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", "wasmprinter", "wasmtime-component-util", "wasmtime-types", @@ -2376,9 +2359,8 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc69f0a316db37482ebc83669236ea7c943d0b49a1a23f763061c9fc9d07d0b" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cc", "cfg-if", @@ -2390,9 +2372,8 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2004b30ea1ad9fd288bce54af19ef08281250e1087f0b5ffc6ca06bacd821edb" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "addr2line 0.20.0", "anyhow", @@ -2416,9 +2397,8 @@ dependencies = [ [[package]] name = "wasmtime-jit-debug" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54aa8081162b13a96f47ab40f9aa03fc02dad38ee10b1418243ac8517c5af6d3" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "object 0.31.1", "once_cell", @@ -2428,9 +2408,8 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2922462d01f5c112bbc4e6eb95ee68447a6031c0b90cc2ad69b890060b3842d9" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cfg-if", "libc", @@ -2439,9 +2418,8 @@ dependencies = [ [[package]] name = "wasmtime-runtime" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "536c34c4abbe22c40f631067b57ca14d719faf3f63ae0d504014a4d15a4b980b" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "cc", @@ -2463,26 +2441,25 @@ dependencies = [ "wasmtime-fiber", "wasmtime-jit-debug", "wasmtime-versioned-export-macros", + "wasmtime-wmemcheck", "windows-sys", ] [[package]] name = "wasmtime-types" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec6f1e74eb5ef817043b243eae37cc0e424c256c4069ab2c5afd9f3fe91a12ee" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "cranelift-entity", "serde", "thiserror", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", ] [[package]] name = "wasmtime-versioned-export-macros" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ca36fa6cad8ef885bc27d7d50c8b1cb7da0534251188a824f4953b07875703" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "proc-macro2", "quote", @@ -2491,21 +2468,23 @@ dependencies = [ [[package]] name = "wasmtime-wasi" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269f4f2192b18037729b617eadb512e95510f1b0cd8fb4990aef286c9bb3dfb9" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "async-trait", "bitflags 2.4.0", "bytes", "cap-fs-ext", + "cap-net-ext", "cap-rand", "cap-std 2.0.0", "cap-time-ext", "fs-set-times 0.20.0", "futures", "io-extras 0.18.0", + "io-lifetimes 2.0.2", + "is-terminal", "libc", "once_cell", "rustix 0.38.8", @@ -2522,16 +2501,15 @@ dependencies = [ [[package]] name = "wasmtime-winch" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d016c3f1d0c8ac905bfda51936cb6dae040e0d8edc75b7a1ef9f21773a19f6" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "cranelift-codegen", "gimli 0.27.3", "object 0.31.1", "target-lexicon", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", "wasmtime-cranelift-shared", "wasmtime-environ", "winch-codegen", @@ -2539,16 +2517,20 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd55caadebae32cf18541e5077b3f042a171bb9988ea0040d0569f26a63227d" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "heck 0.4.1", "indexmap 2.0.0", - "wit-parser 0.9.2", + "wit-parser", ] +[[package]] +name = "wasmtime-wmemcheck" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" + [[package]] name = "wast" version = "35.0.2" @@ -2600,9 +2582,8 @@ dependencies = [ [[package]] name = "wiggle" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166189cd49163adc9a1e2a33b33625eb934d06e518c318905c3a5140d9bc1d45" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "async-trait", @@ -2615,9 +2596,8 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a67571bd77bff962190744adb29e72a1157d30e8d34fbb2c1c7b0ad7627be020" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "heck 0.4.1", @@ -2630,9 +2610,8 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "12.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5677f7d740bc41f9f6af4a6a719a07fbe1aa8ec66e0ec1ca4d3617f2b27d5361" +version = "13.0.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "proc-macro2", "quote", @@ -2673,9 +2652,8 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e6f2f344ec89998f047d0aa3aec77088eb8e33c91f5efdd191b140fda6fa40" +version = "0.11.0" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "cranelift-codegen", @@ -2683,7 +2661,7 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon", - "wasmparser 0.110.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.111.0", "wasmtime-environ", ] @@ -2786,7 +2764,7 @@ dependencies = [ [[package]] name = "wit-bindgen" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" dependencies = [ "bitflags 2.4.0", "wit-bindgen-rust-macro", @@ -2795,17 +2773,17 @@ dependencies = [ [[package]] name = "wit-bindgen-core" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" dependencies = [ "anyhow", "wit-component", - "wit-parser 0.10.0", + "wit-parser", ] [[package]] name = "wit-bindgen-rust" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" dependencies = [ "anyhow", "heck 0.4.1", @@ -2818,7 +2796,7 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-lib" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" dependencies = [ "heck 0.4.1", "wit-bindgen-core", @@ -2827,7 +2805,7 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-macro" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#9853f955ede39598209844cabbb1f096600270fe" +source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" dependencies = [ "anyhow", "proc-macro2", @@ -2851,23 +2829,7 @@ dependencies = [ "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-metadata", "wasmparser 0.111.0", - "wit-parser 0.10.0", -] - -[[package]] -name = "wit-parser" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "541efa2046e544de53a9da1e2f6299e63079840360c9e106f1f8275a97771318" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.0.0", - "log", - "pulldown-cmark", - "semver", - "unicode-xid", - "url", + "wit-parser", ] [[package]] @@ -2889,8 +2851,7 @@ dependencies = [ [[package]] name = "witx" version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" dependencies = [ "anyhow", "log", diff --git a/Cargo.toml b/Cargo.toml index 5ea11bb..502d332 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,8 +46,8 @@ anyhow = "1" cap-std = "1.0.12" heck = { version = "0.4" } tokio = { version = "1.30.0", features = ["macros"] } -wasmtime = { version = "12.0.0", features = ["component-model"] } -wasmtime-wasi = "12.0.0" +wasmtime = { git = "https://github.com/bytecodealliance/wasmtime", features = ["component-model"] } +wasmtime-wasi = { git = "https://github.com/bytecodealliance/wasmtime" } [workspace.dependencies] anyhow = "1" diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index 47194fcbe61e2661a3ca7ba19d3764e129e8c6d6..68a73a64d8e7f8b59779341e5fba27111e17548b 100755 GIT binary patch delta 119 zcmcaQf&0z`?hSgnj9)hE>z2etmN7EdGdVChC@^X;u{g37Ix@NQGAJ-QGH5WpX*$rr zpv08z$WjK9<;YTE21@W`X)rM;v1BPRDlmKUGD4KT04enb@)#6Y%$Qh!6jSrp?)Iz2d?c+F(@&C zggKO$vy>PWm^^tIff5WFOfQ-aG%$Gcg4u6CY(+)|1_dTFCKe#Y*!-uv{ZBXJ_CMWB G2{r)H0vkyH diff --git a/src/virt_deny.rs b/src/virt_deny.rs index 426e9c5..bacfffa 100644 --- a/src/virt_deny.rs +++ b/src/virt_deny.rs @@ -185,13 +185,7 @@ pub(crate) fn deny_http_virt(module: &mut Module) -> Result<()> { )?; add_stub_exported_func( module, - "wasi:http/types#incoming-request-path", - vec![ValType::I32], - vec![ValType::I32], - )?; - add_stub_exported_func( - module, - "wasi:http/types#incoming-request-query", + "wasi:http/types#incoming-request-path-with-query", vec![ValType::I32], vec![ValType::I32], )?; @@ -255,7 +249,13 @@ pub(crate) fn deny_http_virt(module: &mut Module) -> Result<()> { add_stub_exported_func( module, "wasi:http/types#set-response-outparam", - vec![ValType::I32, ValType::I32, ValType::I32, ValType::I32], + vec![ + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ValType::I32, + ], vec![ValType::I32], )?; add_stub_exported_func( @@ -368,12 +368,7 @@ pub(crate) fn deny_random_virt(module: &mut Module) -> Result<()> { } pub(crate) fn deny_exit_virt(module: &mut Module) -> Result<()> { - add_stub_exported_func( - module, - "wasi:cli-base/exit#exit", - vec![ValType::I32], - vec![], - )?; + add_stub_exported_func(module, "wasi:cli/exit#exit", vec![ValType::I32], vec![])?; Ok(()) } diff --git a/src/virt_env.rs b/src/virt_env.rs index 78cece3..28f494c 100644 --- a/src/virt_env.rs +++ b/src/virt_env.rs @@ -214,14 +214,16 @@ pub(crate) fn create_env_virt<'a>(module: &'a mut Module, env: &VirtEnv) -> Resu } pub(crate) fn stub_env_virt(module: &mut Module) -> Result<()> { - stub_imported_func(module, "wasi:cli-base/environment", "get-arguments", true)?; - stub_imported_func(module, "wasi:cli-base/environment", "get-environment", true)?; + stub_imported_func(module, "wasi:cli/environment", "get-arguments", true)?; + stub_imported_func(module, "wasi:cli/environment", "get-environment", true)?; + stub_imported_func(module, "wasi:cli/environment", "initial-cwd", true)?; Ok(()) } pub(crate) fn strip_env_virt(module: &mut Module) -> Result<()> { stub_env_virt(module)?; - remove_exported_func(module, "wasi:cli-base/environment#get-arguments")?; - remove_exported_func(module, "wasi:cli-base/environment#get-environment")?; + remove_exported_func(module, "wasi:cli/environment#get-arguments")?; + remove_exported_func(module, "wasi:cli/environment#get-environment")?; + remove_exported_func(module, "wasi:cli/environment#initial-cwd")?; Ok(()) } diff --git a/src/virt_io.rs b/src/virt_io.rs index b023376..5a69b87 100644 --- a/src/virt_io.rs +++ b/src/virt_io.rs @@ -248,30 +248,55 @@ impl FsEntry { Ok(()) } - pub fn visit_pre<'a, Visitor>(&'a self, base_path: &str, visit: &mut Visitor) -> Result<()> + pub fn visit_bfs<'a, Visitor>(&'a self, base_path: &str, visit: &mut Visitor) -> Result<()> where Visitor: FnMut(&FsEntry, &str, &str, usize) -> Result<()>, { - visit(self, base_path, "", 0)?; - self.visit_pre_inner(visit, base_path) + visit(self, base_path, "", 1)?; + let mut children_of = vec![(base_path.to_string(), self)]; + let mut next_children_of; + while children_of.len() > 0 { + next_children_of = Vec::new(); + FsEntry::visit_bfs_level(children_of, visit, &mut next_children_of)?; + children_of = next_children_of; + } + Ok(()) } - fn visit_pre_inner<'a, Visitor>(&'a self, visit: &mut Visitor, base_path: &str) -> Result<()> + fn visit_bfs_level<'a, Visitor>( + children_of: Vec<(String, &'a FsEntry)>, + visit: &mut Visitor, + next_children_of: &mut Vec<(String, &'a FsEntry)>, + ) -> Result<()> where Visitor: FnMut(&FsEntry, &str, &str, usize) -> Result<()>, { - match self { - FsEntry::Dir(dir) => { - let len = dir.iter().len(); - for (idx, (name, sub_entry)) in dir.iter().enumerate() { - visit(sub_entry, name, base_path, len - idx - 1)?; + // first we do a full len count at this depth to be able to predict the + // next depth offset position for children of this item from the current index + let mut child_offset = 0; + for (_, parent) in &children_of { + match parent { + FsEntry::Dir(dir) => { + child_offset += dir.iter().len(); } - for (name, sub_entry) in dir { - let path = format!("{base_path}/{name}"); - sub_entry.visit_pre_inner(visit, &path)?; + _ => {} + } + } + for (base_path, parent) in children_of { + match parent { + FsEntry::Dir(dir) => { + for (name, sub_entry) in dir.iter() { + visit(sub_entry, name, &base_path, child_offset)?; + child_offset -= 1; + let path = format!("{base_path}/{name}"); + next_children_of.push((path, sub_entry)); + if let FsEntry::Dir(dir) = sub_entry { + child_offset += dir.iter().len(); + } + } } + _ => {} } - _ => {} } Ok(()) } @@ -386,7 +411,8 @@ pub(crate) fn create_io_virt<'a>( if let Some(fs) = &fs { for (name, entry) in &fs.preopens { preopen_indices.push(static_fs_data.len() as u32); - entry.visit_pre(name, &mut |entry, name, _path, remaining_siblings| { + let mut cur_idx = 0; + entry.visit_bfs(name, &mut |entry, name, _path, child_offset| { let name_str_ptr = data_section.string(name)?; let (ty, data) = match &entry { // removed during previous step @@ -408,20 +434,12 @@ pub(crate) fn create_io_virt<'a>( StaticFileData { host_path: str }, ) } - FsEntry::Dir(dir) => { - let child_cnt = dir.len() as u32; - // children will be visited next in preorder and contiguously - // therefore the child index in the static fs data is known - // to be the next index - let start_idx = static_fs_data.len() as u32 + 1; - let child_idx = start_idx + remaining_siblings as u32; - ( - StaticIndexType::Dir, - StaticFileData { - dir: (child_idx, child_cnt), - }, - ) - } + FsEntry::Dir(dir) => ( + StaticIndexType::Dir, + StaticFileData { + dir: (child_offset as u32, dir.len() as u32), + }, + ), FsEntry::File(bytes) => { let byte_len = bytes.len(); if byte_len > fs.passive_cutoff.unwrap_or(1024) as usize { @@ -448,6 +466,7 @@ pub(crate) fn create_io_virt<'a>( ty, data, }); + cur_idx += 1; Ok(()) })?; } @@ -636,9 +655,39 @@ pub(crate) fn stub_clocks_virt(module: &mut Module) -> Result<()> { } pub(crate) fn stub_stdio_virt(module: &mut Module) -> Result<()> { - stub_imported_func(module, "wasi:cli-base/stdin", "get-stdin", true)?; - stub_imported_func(module, "wasi:cli-base/stdout", "get-stdout", true)?; - stub_imported_func(module, "wasi:cli-base/stderr", "get-stderr", true)?; + stub_imported_func(module, "wasi:cli/stdin", "get-stdin", true)?; + stub_imported_func(module, "wasi:cli/stdout", "get-stdout", true)?; + stub_imported_func(module, "wasi:cli/stderr", "get-stderr", true)?; + stub_imported_func( + module, + "wasi:cli/terminal-stdin", + "get-terminal-stdin", + false, + )?; + stub_imported_func( + module, + "wasi:cli/terminal-stdout", + "get-terminal-stdout", + false, + )?; + stub_imported_func( + module, + "wasi:cli/terminal-stderr", + "get-terminal-stderr", + false, + )?; + stub_imported_func( + module, + "wasi:cli/terminal-input", + "drop-terminal-input", + false, + )?; + stub_imported_func( + module, + "wasi:cli/terminal-output", + "drop-terminal-output", + false, + )?; Ok(()) } @@ -876,9 +925,14 @@ pub(crate) fn stub_http_virt(module: &mut Module) -> Result<()> { pub(crate) fn strip_stdio_virt(module: &mut Module) -> Result<()> { stub_stdio_virt(module)?; - remove_exported_func(module, "wasi:cli-base/stdin#get-stdin")?; - remove_exported_func(module, "wasi:cli-base/stdout#get-stdout")?; - remove_exported_func(module, "wasi:cli-base/stderr#get-stderr")?; + remove_exported_func(module, "wasi:cli/stdin#get-stdin")?; + remove_exported_func(module, "wasi:cli/stdout#get-stdout")?; + remove_exported_func(module, "wasi:cli/stderr#get-stderr")?; + remove_exported_func(module, "wasi:cli/terminal-stdin#get-terminal-stdin")?; + remove_exported_func(module, "wasi:cli/terminal-stdout#get-terminal-stdout")?; + remove_exported_func(module, "wasi:cli/terminal-stderr#get-terminal-stderr")?; + remove_exported_func(module, "wasi:cli/terminal-input#drop-terminal-input")?; + remove_exported_func(module, "wasi:cli/terminal-output#drop-terminal-output")?; Ok(()) } diff --git a/tests/components/do-everything/src/lib.rs b/tests/components/do-everything/src/lib.rs index 21a7f42..37936a7 100644 --- a/tests/components/do-everything/src/lib.rs +++ b/tests/components/do-everything/src/lib.rs @@ -15,7 +15,7 @@ wit_bindgen::generate!({ struct VirtTestComponent; -impl VirtTest for VirtTestComponent { +impl Guest for VirtTestComponent { fn test_get_env() -> Vec<(String, String)> { unreachable!(); } diff --git a/tests/components/file-read/src/lib.rs b/tests/components/file-read/src/lib.rs index 6c2d4fa..e974520 100644 --- a/tests/components/file-read/src/lib.rs +++ b/tests/components/file-read/src/lib.rs @@ -10,7 +10,7 @@ wit_bindgen::generate!({ struct VirtTestComponent; -impl VirtTest for VirtTestComponent { +impl Guest for VirtTestComponent { fn test_get_env() -> Vec<(String, String)> { Vec::new() } diff --git a/tests/virt.rs b/tests/virt.rs index e71fc31..f93c268 100644 --- a/tests/virt.rs +++ b/tests/virt.rs @@ -73,7 +73,7 @@ async fn virt_test() -> Result<()> { let test_case_name = test_case_file_name.strip_suffix(".toml").unwrap(); // Filtering... - // if test_case_name == "encapsulate" { + // if test_case_name != "fs-nested-dir-read" { // continue; // } @@ -89,6 +89,10 @@ async fn virt_test() -> Result<()> { let generated_path = PathBuf::from("tests/generated"); fs::create_dir_all(&generated_path)?; + if DEBUG { + println!("- Building test component"); + } + let mut generated_component_path = generated_path.join(component_name); generated_component_path.set_extension("component.wasm"); cmd(&format!( @@ -96,6 +100,10 @@ async fn virt_test() -> Result<()> { if DEBUG { "" } else { "--release" } ))?; + if DEBUG { + println!("- Encoding test component"); + } + // encode the component let component_core = fs::read(&format!( "target/wasm32-wasi/{}/{}.wasm", @@ -112,6 +120,10 @@ async fn virt_test() -> Result<()> { )?; // create the test case specific virtualization + if DEBUG { + println!("- Creating virtualization"); + } + let mut virt_component_path = generated_path.join(test_case_name); virt_component_path.set_extension("virt.wasm"); let mut virt_opts = test.virt_opts.clone().unwrap_or_default(); @@ -127,6 +139,9 @@ async fn virt_test() -> Result<()> { fs::write(&virt_component_path, virt_component.adapter)?; // compose the test component with the defined test virtualization + if DEBUG { + println!("- Composing virtualization"); + } let component_bytes = ComponentComposer::new( &generated_component_path, &wasm_compose::config::Config { @@ -143,8 +158,11 @@ async fn virt_test() -> Result<()> { } // execute the composed virtualized component test function + if DEBUG { + println!("- Executing composition"); + } let mut builder = WasiCtxBuilder::new(); - builder = builder.inherit_stdio().push_preopened_dir( + builder.inherit_stdio().preopened_dir( Dir::open_ambient_dir(".", ambient_authority())?, DirPerms::READ, FilePerms::READ, @@ -152,7 +170,7 @@ async fn virt_test() -> Result<()> { ); if let Some(host_env) = &test.host_env { for (k, v) in host_env { - builder = builder.push_env(k, v); + builder.env(k, v); } } let mut table = Table::new(); @@ -201,6 +219,10 @@ async fn virt_test() -> Result<()> { let (instance, _instance) = VirtTest::instantiate_async(&mut store, &component, &linker).await?; + if DEBUG { + println!("- Checking expectations"); + } + // env var expectation check if let Some(expect_env) = &test.expect.env { let env_vars = instance.call_test_get_env(&mut store).await?; @@ -225,18 +247,13 @@ async fn virt_test() -> Result<()> { let file_read = instance .call_test_file_read(&mut store, test.host_fs_path.as_ref().unwrap()) .await?; + if file_read.starts_with("ERR") { + eprintln!("> {}", file_read); + } if !file_read.eq(expect_file_read) { return Err(anyhow!( - "Unexpected file read result testing {:?}: - - \x1b[1mExpected:\x1b[0m {:?} - \x1b[1mActual:\x1b[0m {:?} - - {:?}", - test_case_path, - expect_file_read, - file_read, - test + "Unexpected file read result testing {:?}", + test_case_path )); } } diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 80f663e..0b0061c 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -30,11 +30,11 @@ use crate::exports::wasi::sockets::udp::{Datagram, Guest as Udp, UdpSocket}; use crate::wasi::cli::stderr; use crate::wasi::cli::stdin; use crate::wasi::cli::stdout; -use crate::wasi::cli::terminal_input; -use crate::wasi::cli::terminal_output; -use crate::wasi::cli::terminal_stderr; -use crate::wasi::cli::terminal_stdin; -use crate::wasi::cli::terminal_stdout; +// use crate::wasi::cli::terminal_input; +// use crate::wasi::cli::terminal_output; +// use crate::wasi::cli::terminal_stderr; +// use crate::wasi::cli::terminal_stdin; +// use crate::wasi::cli::terminal_stdout; use crate::wasi::filesystem::preopens; use crate::wasi::filesystem::types as filesystem_types; use crate::wasi::io::streams; @@ -138,7 +138,7 @@ enum DescriptorTarget { HostDescriptor(u32), } -// #[derive(Debug)] +#[derive(Debug)] struct Descriptor { // the descriptor index of this descriptor fd: u32, @@ -345,9 +345,9 @@ impl StaticIndexEntry { if !matches!(self.ty(), DescriptorType::Directory) { return Err(ErrorCode::NotDirectory); } - let (child_list_idx, child_list_len) = unsafe { (*self).data.dir }; + let (child_offset, child_list_len) = unsafe { (*self).data.dir }; let static_index = Io::static_index(); - Ok(&static_index[child_list_idx..child_list_idx + child_list_len]) + Ok(&static_index[self.idx() + child_offset..self.idx() + child_offset + child_list_len]) } fn dir_lookup(&self, path: &str) -> Result<&'static StaticIndexEntry, ErrorCode> { assert!(path.len() > 0); @@ -400,7 +400,7 @@ union StaticFileData { // } // } -// #[derive(Debug)] +#[derive(Debug)] #[allow(dead_code)] #[repr(u32)] enum StaticIndexType { From 1283bd33092e332926291b8e16217a893d46687c Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 28 Aug 2023 10:02:22 -0700 Subject: [PATCH 3/3] latest bumps --- Cargo.lock | 424 +++++++++++++++++++---------------------------------- Cargo.toml | 8 +- 2 files changed, 158 insertions(+), 274 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8f3399..790a7bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "gimli 0.27.3", -] - [[package]] name = "addr2line" version = "0.21.0" @@ -37,15 +28,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "aho-corasick" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" -dependencies = [ - "memchr", -] - [[package]] name = "ambient-authority" version = "0.0.2" @@ -135,20 +117,20 @@ version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "addr2line 0.21.0", + "addr2line", "cc", "cfg-if", "libc", "miniz_oxide", - "object 0.32.0", + "object", "rustc-demangle", ] [[package]] name = "base64" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "bincode" @@ -218,7 +200,7 @@ checksum = "6ffc30dee200c20b4dcb80572226f42658e1d9c4b668656d7cc59c33d50e396e" dependencies = [ "cap-primitives 2.0.0", "cap-std 2.0.0", - "rustix 0.38.8", + "rustix 0.38.9", "smallvec", ] @@ -251,7 +233,7 @@ dependencies = [ "io-lifetimes 2.0.2", "ipnet", "maybe-owned", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", "winx 0.36.1", ] @@ -287,7 +269,7 @@ dependencies = [ "cap-primitives 2.0.0", "io-extras 0.18.0", "io-lifetimes 2.0.2", - "rustix 0.38.8", + "rustix 0.38.9", ] [[package]] @@ -298,7 +280,7 @@ checksum = "f8f52b3c8f4abfe3252fd0a071f3004aaa3b18936ec97bdbd8763ce03aff6247" dependencies = [ "cap-primitives 2.0.0", "once_cell", - "rustix 0.38.8", + "rustix 0.38.9", "winx 0.36.1", ] @@ -320,9 +302,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.0" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d" +checksum = "7c8d502cbaec4595d2e7d5f61e318f05417bd2b66fdc3809498f0d3fdf0bea27" dependencies = [ "clap_builder", "clap_derive", @@ -331,9 +313,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.0" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6" +checksum = "5891c7bc0edb3e1c2204fc5e94009affabeb1821c9e5fdc3959536c5c0bb984d" dependencies = [ "anstream", "anstyle", @@ -396,7 +378,7 @@ dependencies = [ [[package]] name = "cranelift-bforest" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cranelift-entity", ] @@ -404,7 +386,7 @@ dependencies = [ [[package]] name = "cranelift-codegen" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "bumpalo", "cranelift-bforest", @@ -413,8 +395,8 @@ dependencies = [ "cranelift-control", "cranelift-entity", "cranelift-isle", - "gimli 0.27.3", - "hashbrown 0.13.2", + "gimli 0.28.0", + "hashbrown 0.14.0", "log", "regalloc2", "smallvec", @@ -424,7 +406,7 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cranelift-codegen-shared", ] @@ -432,12 +414,12 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" [[package]] name = "cranelift-control" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "arbitrary", ] @@ -445,7 +427,7 @@ dependencies = [ [[package]] name = "cranelift-entity" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "serde", ] @@ -453,7 +435,7 @@ dependencies = [ [[package]] name = "cranelift-frontend" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cranelift-codegen", "log", @@ -464,12 +446,12 @@ dependencies = [ [[package]] name = "cranelift-isle" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" [[package]] name = "cranelift-native" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cranelift-codegen", "libc", @@ -479,7 +461,7 @@ dependencies = [ [[package]] name = "cranelift-wasm" version = "0.100.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -487,7 +469,7 @@ dependencies = [ "itertools", "log", "smallvec", - "wasmparser 0.111.0", + "wasmparser 0.112.0", "wasmtime-types", ] @@ -681,19 +663,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -727,6 +696,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + [[package]] name = "fastrand" version = "2.0.0" @@ -740,20 +715,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b0377f1edc77dbd1118507bc7a66e4ab64d2b90c66f90726dc801e73a8c68f9" dependencies = [ "cfg-if", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", ] -[[package]] -name = "file-per-thread-logger" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3cc21c33af89af0930c8cae4ade5e6fdc17b5d2c97b3d2e2edb67a1cf683f3" -dependencies = [ - "env_logger", - "log", -] - [[package]] name = "file-read" version = "0.1.0" @@ -784,7 +749,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d167b646a876ba8fda6b50ac645cfd96242553cbaf0ca4fccaa39afcbf0801f" dependencies = [ "io-lifetimes 1.0.11", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", ] @@ -795,7 +760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd738b84894214045e8414eaded76359b4a5773f0a0a56b16575110739cdcf39" dependencies = [ "io-lifetimes 2.0.2", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", ] @@ -917,28 +882,22 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" dependencies = [ - "fallible-iterator", + "fallible-iterator 0.2.0", "indexmap 1.9.3", "stable_deref_trait", ] [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" dependencies = [ - "fallible-iterator", - "indexmap 1.9.3", + "fallible-iterator 0.3.0", + "indexmap 2.0.0", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - [[package]] name = "hashbrown" version = "0.12.3" @@ -959,6 +918,9 @@ name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash", +] [[package]] name = "heck" @@ -984,12 +946,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "id-arena" version = "2.2.1" @@ -1077,7 +1033,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", ] @@ -1181,9 +1137,9 @@ checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "76fc44e2588d5b436dbc3c6cf62aef290f90dab6235744a93dfe1cc18f451e2c" [[package]] name = "memfd" @@ -1233,24 +1189,15 @@ dependencies = [ "libc", ] -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "crc32fast", - "hashbrown 0.13.2", - "indexmap 1.9.3", - "memchr", -] - [[package]] name = "object" version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" dependencies = [ + "crc32fast", + "hashbrown 0.14.0", + "indexmap 2.0.0", "memchr", ] @@ -1284,9 +1231,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1438,35 +1385,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "regex" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1497,9 +1415,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.8" +version = "0.38.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +checksum = "9bfe0f2582b4931a45d1fa608f8a8722e8b3c7ac54dd6d5f3b3212791fedef49" dependencies = [ "bitflags 2.4.0", "errno", @@ -1542,18 +1460,18 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.186" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.186" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", @@ -1714,7 +1632,7 @@ dependencies = [ "cap-std 2.0.0", "fd-lock", "io-lifetimes 2.0.2", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", "winx 0.36.1", ] @@ -1734,7 +1652,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", ] @@ -1948,9 +1866,9 @@ checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -2020,7 +1938,7 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi-cap-std-sync" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "async-trait", @@ -2033,7 +1951,7 @@ dependencies = [ "io-lifetimes 2.0.2", "is-terminal", "once_cell", - "rustix 0.38.8", + "rustix 0.38.9", "system-interface", "tracing", "wasi-common", @@ -2043,7 +1961,7 @@ dependencies = [ [[package]] name = "wasi-common" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "bitflags 2.4.0", @@ -2051,7 +1969,7 @@ dependencies = [ "cap-std 2.0.0", "io-extras 0.18.0", "log", - "rustix 0.38.8", + "rustix 0.38.9", "thiserror", "tracing", "wasmtime", @@ -2081,8 +1999,9 @@ dependencies = [ [[package]] name = "wasm-compose" -version = "0.4.0" -source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a395de8ddf91f118a21e233c16afcf3d41ad9d945fc9578cb054cb3f72aebba6" dependencies = [ "anyhow", "heck 0.4.1", @@ -2092,9 +2011,9 @@ dependencies = [ "serde", "serde_yaml", "smallvec", - "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f)", - "wasmparser 0.110.0", - "wat 1.0.69", + "wasm-encoder 0.32.0", + "wasmparser 0.112.0", + "wat", ] [[package]] @@ -2108,34 +2027,26 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41763f20eafed1399fff1afb466496d3a959f58241436cfdc17e3f5ca954de16" -dependencies = [ - "leb128", -] - -[[package]] -name = "wasm-encoder" -version = "0.31.1" -source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" dependencies = [ "leb128", ] [[package]] name = "wasm-metadata" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ac8d3bcbbb5081489f35966b86d127596e9cdacfb3824b79f43344662226178" +checksum = "08dc59d1fa569150851542143ca79438ca56845ccb31696c70225c638e063471" dependencies = [ "anyhow", "indexmap 2.0.0", "serde", "serde_json", "spdx", - "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.111.0", + "wasm-encoder 0.32.0", + "wasmparser 0.112.0", ] [[package]] @@ -2186,18 +2097,9 @@ checksum = "449167e2832691a1bff24cde28d2804e90e09586a448c8e76984792c44334a6b" [[package]] name = "wasmparser" -version = "0.110.0" -source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" -dependencies = [ - "indexmap 2.0.0", - "semver", -] - -[[package]] -name = "wasmparser" -version = "0.111.0" +version = "0.112.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad71036aada3f6b09251546e97e4f4f176dd6b41cf6fa55e7e0f65e86aec319a" +checksum = "e986b010f47fcce49cf8ea5d5f9e5d2737832f12b53ae8ae785bbe895d0877bf" dependencies = [ "indexmap 2.0.0", "semver", @@ -2205,18 +2107,18 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.2.63" +version = "0.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8cc41d341939dce08ee902b50e36cd35add940f6044c94b144e8f73fe07a6" +checksum = "34ddf5892036cd4b780d505eff1194a0cbc10ed896097656fdcea3744b5e7c2f" dependencies = [ "anyhow", - "wasmparser 0.111.0", + "wasmparser 0.112.0", ] [[package]] name = "wasmtime" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "async-trait", @@ -2228,7 +2130,7 @@ dependencies = [ "indexmap 2.0.0", "libc", "log", - "object 0.31.1", + "object", "once_cell", "paste", "psm", @@ -2236,8 +2138,8 @@ dependencies = [ "serde", "serde_json", "target-lexicon", - "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.111.0", + "wasm-encoder 0.32.0", + "wasmparser 0.112.0", "wasmtime-cache", "wasmtime-component-macro", "wasmtime-component-util", @@ -2247,14 +2149,14 @@ dependencies = [ "wasmtime-jit", "wasmtime-runtime", "wasmtime-winch", - "wat 1.0.70", + "wat", "windows-sys", ] [[package]] name = "wasmtime-asm-macros" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cfg-if", ] @@ -2262,15 +2164,14 @@ dependencies = [ [[package]] name = "wasmtime-cache" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "base64", "bincode", "directories-next", - "file-per-thread-logger", "log", - "rustix 0.38.8", + "rustix 0.38.9", "serde", "sha2", "toml 0.5.11", @@ -2281,7 +2182,7 @@ dependencies = [ [[package]] name = "wasmtime-component-macro" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "proc-macro2", @@ -2295,12 +2196,12 @@ dependencies = [ [[package]] name = "wasmtime-component-util" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" [[package]] name = "wasmtime-cranelift" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "cfg-if", @@ -2310,12 +2211,12 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.27.3", + "gimli 0.28.0", "log", - "object 0.31.1", + "object", "target-lexicon", "thiserror", - "wasmparser 0.111.0", + "wasmparser 0.112.0", "wasmtime-cranelift-shared", "wasmtime-environ", "wasmtime-versioned-export-macros", @@ -2324,14 +2225,14 @@ dependencies = [ [[package]] name = "wasmtime-cranelift-shared" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "cranelift-codegen", "cranelift-control", "cranelift-native", - "gimli 0.27.3", - "object 0.31.1", + "gimli 0.28.0", + "object", "target-lexicon", "wasmtime-environ", ] @@ -2339,19 +2240,19 @@ dependencies = [ [[package]] name = "wasmtime-environ" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "cranelift-entity", - "gimli 0.27.3", + "gimli 0.28.0", "indexmap 2.0.0", "log", - "object 0.31.1", + "object", "serde", "target-lexicon", "thiserror", - "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.111.0", + "wasm-encoder 0.32.0", + "wasmparser 0.112.0", "wasmprinter", "wasmtime-component-util", "wasmtime-types", @@ -2360,11 +2261,11 @@ dependencies = [ [[package]] name = "wasmtime-fiber" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cc", "cfg-if", - "rustix 0.38.8", + "rustix 0.38.9", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", "windows-sys", @@ -2373,19 +2274,19 @@ dependencies = [ [[package]] name = "wasmtime-jit" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ - "addr2line 0.20.0", + "addr2line", "anyhow", "bincode", "cfg-if", "cpp_demangle", - "gimli 0.27.3", + "gimli 0.28.0", "ittapi", "log", - "object 0.31.1", + "object", "rustc-demangle", - "rustix 0.38.8", + "rustix 0.38.9", "serde", "target-lexicon", "wasmtime-environ", @@ -2398,18 +2299,18 @@ dependencies = [ [[package]] name = "wasmtime-jit-debug" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ - "object 0.31.1", + "object", "once_cell", - "rustix 0.38.8", + "rustix 0.38.9", "wasmtime-versioned-export-macros", ] [[package]] name = "wasmtime-jit-icache-coherence" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cfg-if", "libc", @@ -2419,7 +2320,7 @@ dependencies = [ [[package]] name = "wasmtime-runtime" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "cc", @@ -2433,9 +2334,9 @@ dependencies = [ "memoffset", "paste", "rand", - "rustix 0.38.8", + "rustix 0.38.9", "sptr", - "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-encoder 0.32.0", "wasmtime-asm-macros", "wasmtime-environ", "wasmtime-fiber", @@ -2448,18 +2349,18 @@ dependencies = [ [[package]] name = "wasmtime-types" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "cranelift-entity", "serde", "thiserror", - "wasmparser 0.111.0", + "wasmparser 0.112.0", ] [[package]] name = "wasmtime-versioned-export-macros" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "proc-macro2", "quote", @@ -2469,7 +2370,7 @@ dependencies = [ [[package]] name = "wasmtime-wasi" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "async-trait", @@ -2487,7 +2388,7 @@ dependencies = [ "is-terminal", "libc", "once_cell", - "rustix 0.38.8", + "rustix 0.38.9", "system-interface", "thiserror", "tokio", @@ -2502,14 +2403,14 @@ dependencies = [ [[package]] name = "wasmtime-winch" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "cranelift-codegen", - "gimli 0.27.3", - "object 0.31.1", + "gimli 0.28.0", + "object", "target-lexicon", - "wasmparser 0.111.0", + "wasmparser 0.112.0", "wasmtime-cranelift-shared", "wasmtime-environ", "winch-codegen", @@ -2518,7 +2419,7 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "heck 0.4.1", @@ -2529,7 +2430,7 @@ dependencies = [ [[package]] name = "wasmtime-wmemcheck" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" [[package]] name = "wast" @@ -2542,48 +2443,29 @@ dependencies = [ [[package]] name = "wast" -version = "62.0.1" -source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" -dependencies = [ - "leb128", - "memchr", - "unicode-width", - "wasm-encoder 0.31.1 (git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f)", -] - -[[package]] -name = "wast" -version = "63.0.0" +version = "64.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2560471f60a48b77fccefaf40796fda61c97ce1e790b59dfcec9dc3995c9f63a" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" dependencies = [ "leb128", "memchr", "unicode-width", - "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wat" -version = "1.0.69" -source = "git+https://github.com/bytecodealliance/wasm-tools?rev=4678a61ae428da21299aeae016bd56d5e248248f#4678a61ae428da21299aeae016bd56d5e248248f" -dependencies = [ - "wast 62.0.1", + "wasm-encoder 0.32.0", ] [[package]] name = "wat" -version = "1.0.70" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdc306c2c4c2f2bf2ba69e083731d0d2a77437fc6a350a19db139636e7e416c" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" dependencies = [ - "wast 63.0.0", + "wast 64.0.0", ] [[package]] name = "wiggle" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "async-trait", @@ -2597,7 +2479,7 @@ dependencies = [ [[package]] name = "wiggle-generate" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "heck 0.4.1", @@ -2611,7 +2493,7 @@ dependencies = [ [[package]] name = "wiggle-macro" version = "13.0.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "proc-macro2", "quote", @@ -2653,15 +2535,15 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" version = "0.11.0" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "cranelift-codegen", - "gimli 0.27.3", + "gimli 0.28.0", "regalloc2", "smallvec", "target-lexicon", - "wasmparser 0.111.0", + "wasmparser 0.112.0", "wasmtime-environ", ] @@ -2764,7 +2646,7 @@ dependencies = [ [[package]] name = "wit-bindgen" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" +source = "git+https://github.com/bytecodealliance/wit-bindgen#f84e0297961623d778f6eaaf04ceecf9540034fd" dependencies = [ "bitflags 2.4.0", "wit-bindgen-rust-macro", @@ -2773,7 +2655,7 @@ dependencies = [ [[package]] name = "wit-bindgen-core" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" +source = "git+https://github.com/bytecodealliance/wit-bindgen#f84e0297961623d778f6eaaf04ceecf9540034fd" dependencies = [ "anyhow", "wit-component", @@ -2783,7 +2665,7 @@ dependencies = [ [[package]] name = "wit-bindgen-rust" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" +source = "git+https://github.com/bytecodealliance/wit-bindgen#f84e0297961623d778f6eaaf04ceecf9540034fd" dependencies = [ "anyhow", "heck 0.4.1", @@ -2796,7 +2678,7 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-lib" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" +source = "git+https://github.com/bytecodealliance/wit-bindgen#f84e0297961623d778f6eaaf04ceecf9540034fd" dependencies = [ "heck 0.4.1", "wit-bindgen-core", @@ -2805,7 +2687,7 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-macro" version = "0.10.0" -source = "git+https://github.com/alexcrichton/witx-bindgen?branch=fix-name-clashes#41b6fd2bb5ed952c26550b39e742fe865b05b386" +source = "git+https://github.com/bytecodealliance/wit-bindgen#f84e0297961623d778f6eaaf04ceecf9540034fd" dependencies = [ "anyhow", "proc-macro2", @@ -2818,25 +2700,27 @@ dependencies = [ [[package]] name = "wit-component" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9eb6179c5a26adc38fa5a22e263e7a3812c6777ca2e75d1717fd3789f82b64" +checksum = "66d9f2d16dd55d1a372dcfd4b7a466ea876682a5a3cb97e71ec9eef04affa876" dependencies = [ "anyhow", "bitflags 2.4.0", "indexmap 2.0.0", "log", - "wasm-encoder 0.31.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", + "serde_json", + "wasm-encoder 0.32.0", "wasm-metadata", - "wasmparser 0.111.0", + "wasmparser 0.112.0", "wit-parser", ] [[package]] name = "wit-parser" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d6926af931f285e206ea71f9b67681f00a65d79097f81da7f9f285de006ba2" +checksum = "61e8b849bea13cc2315426b16efe6eb6813466d78f5fde69b0bb150c9c40e0dc" dependencies = [ "anyhow", "id-arena", @@ -2851,7 +2735,7 @@ dependencies = [ [[package]] name = "witx" version = "0.9.1" -source = "git+https://github.com/bytecodealliance/wasmtime#deea625167b5395885a6099b3b418fd07b38cc48" +source = "git+https://github.com/bytecodealliance/wasmtime#0c7bf47f0e608a8b68c4abd20cf52107e09cf9b5" dependencies = [ "anyhow", "log", diff --git a/Cargo.toml b/Cargo.toml index 502d332..8eeb6f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,10 +33,10 @@ clap = { version = "4", features = ["derive"] } serde = { version = "1", features = ["derive"] } toml = "0.7" walrus = "0.20.1" -wasm-compose = { git = "https://github.com/bytecodealliance/wasm-tools", rev = "4678a61ae428da21299aeae016bd56d5e248248f" } -wasm-metadata = "0.10.2" +wasm-compose = "0.4.2" +wasm-metadata = "0.10.3" wasm-opt = "0.114.1" -wit-component = "0.13.2" +wit-component = "0.14.0" [build-dependencies] anyhow = "1" @@ -51,4 +51,4 @@ wasmtime-wasi = { git = "https://github.com/bytecodealliance/wasmtime" } [workspace.dependencies] anyhow = "1" -wit-bindgen = { git = "https://github.com/alexcrichton/witx-bindgen", branch = "fix-name-clashes" } \ No newline at end of file +wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen" } \ No newline at end of file