From dd80ebb577f2a7ba67eb72c98dd8daabbee54848 Mon Sep 17 00:00:00 2001 From: kjuulh Date: Mon, 28 Aug 2023 21:13:50 +0200 Subject: [PATCH] feat: with wasm executor Signed-off-by: kjuulh --- Cargo.lock | 1336 +++++++++++++++++++++--- Cargo.toml | 6 +- adapt.sh | 12 + crates/churn-agent/Cargo.toml | 3 +- crates/churn-agent/src/main.rs | 52 +- crates/churning/src/main.rs | 2 +- examples/agent-ping/.cargo/config.toml | 2 + examples/agent-ping/Cargo.toml | 15 + examples/agent-ping/src/lib.rs | 15 + examples/agent-ping/wit/host.wit | 7 + includes/wasi_snapshot_preview1.wasm | Bin 0 -> 87806 bytes 11 files changed, 1320 insertions(+), 130 deletions(-) create mode 100755 adapt.sh create mode 100644 examples/agent-ping/.cargo/config.toml create mode 100644 examples/agent-ping/Cargo.toml create mode 100644 examples/agent-ping/src/lib.rs create mode 100644 examples/agent-ping/wit/host.wit create mode 100755 includes/wasi_snapshot_preview1.wasm diff --git a/Cargo.lock b/Cargo.lock index b8cb50d..aa4ca6e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,13 +2,22 @@ # 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli", + "gimli 0.28.0", ] [[package]] @@ -17,6 +26,33 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "agent-ping" +version = "0.1.0" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "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 = "android-tzdata" version = "0.1.1" @@ -34,30 +70,29 @@ dependencies = [ [[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.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" dependencies = [ "utf8parse", ] @@ -73,9 +108,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" dependencies = [ "anstyle", "windows-sys", @@ -83,9 +118,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "arbitrary" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" [[package]] name = "ascii" @@ -112,9 +153,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", @@ -178,20 +219,29 @@ version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "addr2line", + "addr2line 0.21.0", "cc", "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.32.0", "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" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] [[package]] name = "bitflags" @@ -249,9 +299,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] [[package]] name = "cfg-if" @@ -306,6 +360,7 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", + "wasmtime", ] [[package]] @@ -348,7 +403,7 @@ dependencies = [ "churn-domain", "clap", "dotenv", - "itertools", + "itertools 0.11.0", "serde", "serde_json", "sled", @@ -370,9 +425,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.4" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80672091db20273a15cf9fdd4e47ed43b5091ec9841bf4c6145c9dfbbcae09ed" +checksum = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d" dependencies = [ "clap_builder", "clap_derive", @@ -381,22 +436,21 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.4" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1458a1df40e1e2afebb7ab60ce55c1fa8f431146205aa5f4887e0b111c27636" +checksum = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6" dependencies = [ "anstream", "anstyle", - "bitflags 1.3.2", "clap_lex", "strsim", ] [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a" dependencies = [ "heck", "proc-macro2", @@ -406,9 +460,9 @@ dependencies = [ [[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 = "colorchoice" @@ -445,6 +499,15 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpufeatures" version = "0.2.9" @@ -454,6 +517,114 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-bforest" +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.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38849e3b19bc9a6dbf8bc188876b76e6ba288089a5567be573de50f44801375c" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli 0.27.3", + "hashbrown 0.13.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +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.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75f869ae826055a5064d4a400abde7806eb86d89765dbae51d42846df23121a" + +[[package]] +name = "cranelift-control" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf6631316ad6ccfd60055740ad25326330d31407a983a454e45c5a62f64d101" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1d6a38935ee64551a7c8da4cc759fdcaba1d951ec56336737c0459ed5a05d2" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73c410c2d52e28fc4b49aab955a1c2f58580ff37a3b0641e23bccd6049e4b5" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61acaa7646020e0444bb3a22d212a5bae0e3b3969b18e1276a037ccd6493a8fd" + +[[package]] +name = "cranelift-native" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "543f52ef487498253ebe5df321373c5c314da74ada0e92f13451b6f887194f87" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.99.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "788c27f41f31a50a9a3546b91253ad9495cd54df0d6533b3f3dcb4fb7a988f69" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools 0.10.5", + "log", + "smallvec", + "wasmparser 0.110.0", + "wasmtime-types", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -463,6 +634,27 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + [[package]] name = "crossbeam-epoch" version = "0.9.15" @@ -585,6 +777,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + [[package]] name = "derive_builder" version = "0.12.0" @@ -626,6 +827,16 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + [[package]] name = "dirs" version = "4.0.0" @@ -646,6 +857,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "dotenv" version = "0.15.0" @@ -668,10 +890,29 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.1" +name = "env_logger" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -698,12 +939,28 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fastrand" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +[[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 = "filetime" version = "0.2.22" @@ -864,6 +1121,19 @@ dependencies = [ "byteorder", ] +[[package]] +name = "fxprof-processed-profile" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" +dependencies = [ + "bitflags 2.4.0", + "debugid", + "fxhash", + "serde", + "serde_json", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -885,6 +1155,17 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +dependencies = [ + "fallible-iterator", + "indexmap 1.9.3", + "stable_deref_trait", +] + [[package]] name = "gimli" version = "0.28.0" @@ -962,7 +1243,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -975,26 +1256,35 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" dependencies = [ - "libc", + "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -1038,15 +1328,21 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -1116,6 +1412,12 @@ dependencies = [ "cc", ] +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "ident_case" version = "1.0.1" @@ -1145,7 +1447,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", + "serde", ] [[package]] @@ -1163,7 +1476,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "libc", "windows-sys", ] @@ -1176,16 +1489,24 @@ checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix 0.37.20", + "hermit-abi", + "rustix 0.38.9", "windows-sys", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.11.0" @@ -1197,9 +1518,38 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "ittapi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e0d0b7b3b53d92a7e8b80ede3400112a6b8b4c98d1f5b8b16bb787c780582c" +dependencies = [ + "anyhow", + "ittapi-sys", + "log", +] + +[[package]] +name = "ittapi-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f8763c96e54e6d6a0dccc2990d8b5e33e3313aaeae6185921a3f4c1614a77c" +dependencies = [ + "cc", +] + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] [[package]] name = "js-sys" @@ -1216,6 +1566,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "libc" version = "0.2.147" @@ -1246,15 +1602,24 @@ dependencies = [ [[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" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" [[package]] name = "memchr" @@ -1262,6 +1627,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memfd" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +dependencies = [ + "rustix 0.37.23", +] + [[package]] name = "memoffset" version = "0.9.0" @@ -1336,14 +1710,26 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "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" @@ -1361,11 +1747,11 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.56" +version = "0.10.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" +checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if", "foreign-types", "libc", @@ -1393,9 +1779,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.91" +version = "0.9.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" +checksum = "db7e971c2c2bba161b2d2fdf37080177eff520b3bc044787c7f1f5f9e78d869b" dependencies = [ "cc", "libc", @@ -1457,6 +1843,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1465,18 +1857,18 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", @@ -1485,9 +1877,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" @@ -1511,6 +1903,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.66" @@ -1520,6 +1918,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +dependencies = [ + "bitflags 1.3.2", + "memchr", + "unicase", +] + [[package]] name = "quote" version = "1.0.33" @@ -1529,6 +1947,58 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -1558,6 +2028,48 @@ dependencies = [ "thiserror", ] +[[package]] +name = "regalloc2" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b4dcbd3a2ae7fb94b5813fa0e957c6ab51bf5d0a8ee1b69e0c2d0f1e6eb8485" +dependencies = [ + "hashbrown 0.13.2", + "log", + "rustc-hash", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + [[package]] name = "reqwest" version = "0.11.20" @@ -1624,10 +2136,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] -name = "rustix" -version = "0.37.20" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" dependencies = [ "bitflags 1.3.2", "errno", @@ -1639,9 +2157,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", @@ -1683,15 +2201,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" @@ -1704,9 +2222,9 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -1742,19 +2260,25 @@ dependencies = [ ] [[package]] -name = "serde" -version = "1.0.164" +name = "semver" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "serde" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", @@ -1763,9 +2287,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.97" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -1774,10 +2298,11 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0" +checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" dependencies = [ + "itoa", "serde", ] @@ -1848,10 +2373,16 @@ dependencies = [ ] [[package]] -name = "smallvec" -version = "1.10.0" +name = "slice-group-by" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" @@ -1873,12 +2404,33 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "spdx" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b19b32ed6d899ab23174302ff105c1577e45a06b08d4fe0a9dd13ce804bbbf71" +dependencies = [ + "smallvec", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.10.0" @@ -1924,6 +2476,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" + [[package]] name = "tempfile" version = "3.8.0" @@ -1933,10 +2491,19 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.38.8", + "rustix 0.38.9", "windows-sys", ] +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.47" @@ -2057,6 +2624,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "tower" version = "0.4.13" @@ -2100,9 +2676,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", @@ -2157,6 +2733,15 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -2165,9 +2750,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -2178,6 +2763,24 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "unreachable" version = "1.0.0" @@ -2331,6 +2934,39 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +[[package]] +name = "wasm-encoder" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41763f20eafed1399fff1afb466496d3a959f58241436cfdc17e3f5ca954de16" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-encoder" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-metadata" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08dc59d1fa569150851542143ca79438ca56845ccb31696c70225c638e063471" +dependencies = [ + "anyhow", + "indexmap 2.0.0", + "serde", + "serde_json", + "spdx", + "wasm-encoder 0.32.0", + "wasmparser 0.112.0", +] + [[package]] name = "wasm-streams" version = "0.3.0" @@ -2344,6 +2980,328 @@ dependencies = [ "web-sys", ] +[[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.111.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad71036aada3f6b09251546e97e4f4f176dd6b41cf6fa55e7e0f65e86aec319a" +dependencies = [ + "indexmap 2.0.0", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.112.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e986b010f47fcce49cf8ea5d5f9e5d2737832f12b53ae8ae785bbe895d0877bf" +dependencies = [ + "indexmap 2.0.0", + "semver", +] + +[[package]] +name = "wasmtime" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e38ee12eaafb34198cce001e2ea0a83d3884db5cf8e3af08864f108a2fb57c85" +dependencies = [ + "anyhow", + "async-trait", + "bincode", + "bumpalo", + "cfg-if", + "fxprof-processed-profile", + "indexmap 2.0.0", + "libc", + "log", + "object 0.31.1", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "serde_json", + "target-lexicon", + "wasm-encoder 0.31.1", + "wasmparser 0.110.0", + "wasmtime-cache", + "wasmtime-component-macro", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-fiber", + "wasmtime-jit", + "wasmtime-runtime", + "wat", + "windows-sys", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82313f9dce6f64dd08a7b51bef57411741b7eaef6b4611f77b91b6213a99808b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cache" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d22677d863d88d0ee05a07bfe28fdc5525149b6ea5a108f1fa2796fa86d75b8" +dependencies = [ + "anyhow", + "base64", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix 0.38.9", + "serde", + "sha2", + "toml", + "windows-sys", + "zstd", +] + +[[package]] +name = "wasmtime-component-macro" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b6da03d55c656066ebc93d27ce54de11fcd2d3157e7490c6196a65aa1e9bc0" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.29", + "wasmtime-component-util", + "wasmtime-wit-bindgen", + "wit-parser 0.9.2", +] + +[[package]] +name = "wasmtime-component-util" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b54327f9ce6a46c6841c43d93c4fa366cd0beb0f075743b120d31a3d6afe34fd" + +[[package]] +name = "wasmtime-cranelift" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d52e14e5453e82708816e992140c59e511bbf7c0868ee654100e2792483f56" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli 0.27.3", + "log", + "object 0.31.1", + "target-lexicon", + "thiserror", + "wasmparser 0.110.0", + "wasmtime-cranelift-shared", + "wasmtime-environ", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-cranelift-shared" +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 0.31.1", + "target-lexicon", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +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 0.31.1", + "serde", + "target-lexicon", + "thiserror", + "wasmparser 0.110.0", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-fiber" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc69f0a316db37482ebc83669236ea7c943d0b49a1a23f763061c9fc9d07d0b" +dependencies = [ + "cc", + "cfg-if", + "rustix 0.38.9", + "wasmtime-asm-macros", + "wasmtime-versioned-export-macros", + "windows-sys", +] + +[[package]] +name = "wasmtime-jit" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2004b30ea1ad9fd288bce54af19ef08281250e1087f0b5ffc6ca06bacd821edb" +dependencies = [ + "addr2line 0.20.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli 0.27.3", + "ittapi", + "log", + "object 0.31.1", + "rustc-demangle", + "rustix 0.38.9", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54aa8081162b13a96f47ab40f9aa03fc02dad38ee10b1418243ac8517c5af6d3" +dependencies = [ + "object 0.31.1", + "once_cell", + "rustix 0.38.9", + "wasmtime-versioned-export-macros", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2922462d01f5c112bbc4e6eb95ee68447a6031c0b90cc2ad69b890060b3842d9" +dependencies = [ + "cfg-if", + "libc", + "windows-sys", +] + +[[package]] +name = "wasmtime-runtime" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "536c34c4abbe22c40f631067b57ca14d719faf3f63ae0d504014a4d15a4b980b" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap 2.0.0", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand", + "rustix 0.38.9", + "sptr", + "wasm-encoder 0.31.1", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-fiber", + "wasmtime-jit-debug", + "wasmtime-versioned-export-macros", + "windows-sys", +] + +[[package]] +name = "wasmtime-types" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec6f1e74eb5ef817043b243eae37cc0e424c256c4069ab2c5afd9f3fe91a12ee" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser 0.110.0", +] + +[[package]] +name = "wasmtime-versioned-export-macros" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ca36fa6cad8ef885bc27d7d50c8b1cb7da0534251188a824f4953b07875703" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "wasmtime-wit-bindgen" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd55caadebae32cf18541e5077b3f042a171bb9988ea0040d0569f26a63227d" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.0.0", + "wit-parser 0.9.2", +] + +[[package]] +name = "wast" +version = "64.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a259b226fd6910225aa7baeba82f9d9933b6d00f2ce1b49b80fa4214328237cc" +dependencies = [ + "leb128", + "memchr", + "unicode-width", + "wasm-encoder 0.32.0", +] + +[[package]] +name = "wat" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53253d920ab413fca1c7dc2161d601c79b4fdf631d0ba51dd4343bf9b556c3f6" +dependencies = [ + "wast", +] + [[package]] name = "web-sys" version = "0.3.64" @@ -2376,6 +3334,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2402,9 +3369,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -2417,45 +3384,45 @@ 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 = "winreg" @@ -2467,6 +3434,109 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "wit-bindgen" +version = "0.10.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=wit-bindgen-0.10.0#e32a150f876c291784d9cead97c58fac97cf216c" +dependencies = [ + "bitflags 2.4.0", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.10.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=wit-bindgen-0.10.0#e32a150f876c291784d9cead97c58fac97cf216c" +dependencies = [ + "anyhow", + "wit-component", + "wit-parser 0.10.0", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.10.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=wit-bindgen-0.10.0#e32a150f876c291784d9cead97c58fac97cf216c" +dependencies = [ + "anyhow", + "heck", + "wasm-metadata", + "wit-bindgen-core", + "wit-bindgen-rust-lib", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-lib" +version = "0.10.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=wit-bindgen-0.10.0#e32a150f876c291784d9cead97c58fac97cf216c" +dependencies = [ + "heck", + "wit-bindgen-core", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.10.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=wit-bindgen-0.10.0#e32a150f876c291784d9cead97c58fac97cf216c" +dependencies = [ + "anyhow", + "proc-macro2", + "syn 2.0.29", + "wit-bindgen-core", + "wit-bindgen-rust", + "wit-bindgen-rust-lib", + "wit-component", +] + +[[package]] +name = "wit-component" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9eb6179c5a26adc38fa5a22e263e7a3812c6777ca2e75d1717fd3789f82b64" +dependencies = [ + "anyhow", + "bitflags 2.4.0", + "indexmap 2.0.0", + "log", + "wasm-encoder 0.31.1", + "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", +] + +[[package]] +name = "wit-parser" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d6926af931f285e206ea71f9b67681f00a65d79097f81da7f9f285de006ba2" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.0.0", + "log", + "pulldown-cmark", + "semver", + "unicode-xid", + "url", +] + [[package]] name = "xattr" version = "1.0.1" @@ -2475,3 +3545,33 @@ checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" dependencies = [ "libc", ] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index d4fe45b..ed5d864 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/*"] +members = ["crates/*", "examples/*"] resolver = "2" [workspace.package] @@ -32,6 +32,6 @@ serde_json = "1" reqwest = {version = "0.11.20", features = ["json"]} uuid = {version = "1.4.1", features = ["v4", "serde"]} itertools = {version = "0.11.0"} - sled = "0.34.7" -chrono = {version = "0.4.26", features = ["serde"]} \ No newline at end of file +chrono = {version = "0.4.26", features = ["serde"]} +wasmtime = "12.0.1" diff --git a/adapt.sh b/adapt.sh new file mode 100755 index 0000000..3d7bbbf --- /dev/null +++ b/adapt.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e + +crate=$1 + +cargo build -p "$crate" --target wasm32-wasi --release + +crate_target=$(echo $crate | sed "s/-/_/g") + +#wasm-tools component new ./target/wasm32-wasi/debug/$crate_target.wasm \ +# -o $crate_target.wasm #--adapt ./includes/wasi_snapshot_preview1.wasm \ No newline at end of file diff --git a/crates/churn-agent/Cargo.toml b/crates/churn-agent/Cargo.toml index 52657d4..327881b 100644 --- a/crates/churn-agent/Cargo.toml +++ b/crates/churn-agent/Cargo.toml @@ -7,8 +7,6 @@ version= "0.1.0" edition.workspace = true publish.workspace = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] churn-domain.workspace = true @@ -22,3 +20,4 @@ axum.workspace = true serde.workspace = true serde_json.workspace = true reqwest.workspace = true +wasmtime.workspace = true diff --git a/crates/churn-agent/src/main.rs b/crates/churn-agent/src/main.rs index 7a7bcd8..97e09f6 100644 --- a/crates/churn-agent/src/main.rs +++ b/crates/churn-agent/src/main.rs @@ -1,6 +1,6 @@ mod agent; -use std::net::SocketAddr; +use std::{net::SocketAddr, path::PathBuf}; use agent::AgentService; use anyhow::Error; @@ -14,6 +14,7 @@ use axum::{ use churn_domain::AgentEnrollReq; use clap::{Parser, Subcommand}; use serde_json::json; +use wasmtime::{Caller, Engine, Linker, Module, Store}; #[derive(Parser)] #[command(author, version, about, long_about = None, subcommand_required = true)] @@ -40,6 +41,19 @@ enum Commands { #[arg(env = "CHURN_TOKEN", long)] token: String, }, + + Execute { + #[arg(env = "CHURN_AGENT_EXE", long)] + exe: PathBuf, + + #[command(subcommand)] + commands: Option, + }, +} + +#[derive(Subcommand)] +enum ExecuteCommands { + Source, } #[derive(Clone, Default)] @@ -60,8 +74,8 @@ async fn main() -> anyhow::Result<()> { } async fn handle_command(cmd: Command) -> anyhow::Result<()> { - match cmd.command { - Some(Commands::Daemon { host }) => { + match cmd.command.unwrap() { + Commands::Daemon { host } => { tracing::info!("Starting churn server"); let app = Router::new() @@ -77,12 +91,38 @@ async fn handle_command(cmd: Command) -> anyhow::Result<()> { Ok(()) } - Some(Commands::Connect { + Commands::Connect { host: _, token: _, agent_name: _, - }) => todo!(), - None => todo!(), + } => todo!(), + Commands::Execute { exe, commands } => match commands { + Some(ExecuteCommands::Source) => Ok(()), + None => { + let engine = Engine::default(); + let module = Module::from_file(&engine, exe)?; + + // Create a `Linker` which will be later used to instantiate this module. + // Host functionality is defined by name within the `Linker`. + let mut linker = Linker::new(&engine); + linker.func_wrap("print", "print", |caller: Caller<'_, u32>, param: i32| { + println!("Got {} from WebAssembly", param); + println!("my host state is: {}", caller.data()); + })?; + + // All wasm objects operate within the context of a "store". Each + // `Store` has a type parameter to store host-specific data, which in + // this case we're using `4` for. + let mut store = Store::new(&engine, 4); + let instance = linker.instantiate(&mut store, &module)?; + let hello = instance.get_typed_func::<(), ()>(&mut store, "hello")?; + + // And finally we can call the wasm! + hello.call(&mut store, ())?; + + Ok(()) + } + }, } } diff --git a/crates/churning/src/main.rs b/crates/churning/src/main.rs index ef96a29..663ed42 100644 --- a/crates/churning/src/main.rs +++ b/crates/churning/src/main.rs @@ -105,7 +105,7 @@ async fn build_container( client: Arc, bin_name: &str, ) -> eyre::Result { - let crates = &["crates/*", "ci"]; + let crates = &["crates/*", "ci", "examples/*"]; let debian_deps = &[ "libssl-dev", "pkg-config", diff --git a/examples/agent-ping/.cargo/config.toml b/examples/agent-ping/.cargo/config.toml new file mode 100644 index 0000000..6b77899 --- /dev/null +++ b/examples/agent-ping/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target = "wasm32-wasi" diff --git a/examples/agent-ping/Cargo.toml b/examples/agent-ping/Cargo.toml new file mode 100644 index 0000000..54c4850 --- /dev/null +++ b/examples/agent-ping/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "agent-ping" +repository.workspace = true +description.workspace = true +readme.workspace = true +license-file.workspace = true +authors.workspace = true +version.workspace = true +edition.workspace = true + +[lib] +crate-type = ["cdylib"] + +[dependencies] +wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen", tag = "wit-bindgen-0.10.0" } \ No newline at end of file diff --git a/examples/agent-ping/src/lib.rs b/examples/agent-ping/src/lib.rs new file mode 100644 index 0000000..73d7e61 --- /dev/null +++ b/examples/agent-ping/src/lib.rs @@ -0,0 +1,15 @@ +wit_bindgen::generate!({ + world: "host", + + exports: { + world: MyHost, + }, +}); + +struct MyHost; + +impl Host for MyHost { + fn run() { + print("Hello, world!"); + } +} diff --git a/examples/agent-ping/wit/host.wit b/examples/agent-ping/wit/host.wit new file mode 100644 index 0000000..1fb8617 --- /dev/null +++ b/examples/agent-ping/wit/host.wit @@ -0,0 +1,7 @@ +package example:host + +world host { + import print: func(msg: string) + + export run: func() +} diff --git a/includes/wasi_snapshot_preview1.wasm b/includes/wasi_snapshot_preview1.wasm new file mode 100755 index 0000000000000000000000000000000000000000..ccb0fb923caf9a82d763efe803c229689ef53e47 GIT binary patch literal 87806 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 z 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 literal 0 HcmV?d00001