diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3a65dfe..bd9f666 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ on: env: CARGO_TERM_COLOR: always CARGO_COMPONENT_VERSION: 0.14.0 - RUST_VERSION: 1.79 + RUST_VERSION: "1.80" WASI_SDK_VERSION: "22.0" WASI_SDK_RELEASE: wasi-sdk-22 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8c19c5d..61a2fab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ concurrency: ${{ github.workflow }} env: CARGO_TERM_COLOR: always CARGO_COMPONENT_VERSION: 0.14.0 - RUST_VERSION: 1.79 + RUST_VERSION: "1.80" WASI_SDK_VERSION: "22.0" WASI_SDK_RELEASE: wasi-sdk-22 diff --git a/crates/spin-test-virt/src/bindings.rs b/crates/spin-test-virt/src/bindings.rs index 4ad3de1..8048b52 100644 --- a/crates/spin-test-virt/src/bindings.rs +++ b/crates/spin-test-virt/src/bindings.rs @@ -15747,6 +15747,48 @@ pub mod exports { struct _RetArea([::core::mem::MaybeUninit; 20]); static mut _RET_AREA: _RetArea = _RetArea([::core::mem::MaybeUninit::uninit(); 20]); } + + #[allow(dead_code, clippy::all)] + pub mod variables { + #[used] + #[doc(hidden)] + #[cfg(target_arch = "wasm32")] + static __FORCE_SECTION_REF: fn() = + super::super::super::super::__link_custom_section_describing_imports; + use super::super::super::super::_rt; + #[doc(hidden)] + #[allow(non_snake_case)] + pub unsafe fn _export_set_cabi( + arg0: *mut u8, + arg1: usize, + arg2: *mut u8, + arg3: usize, + ) { + #[cfg(target_arch = "wasm32")] + _rt::run_ctors_once(); + let len0 = arg1; + let bytes0 = _rt::Vec::from_raw_parts(arg0.cast(), len0, len0); + let len1 = arg3; + let bytes1 = _rt::Vec::from_raw_parts(arg2.cast(), len1, len1); + T::set(_rt::string_lift(bytes0), _rt::string_lift(bytes1)); + } + pub trait Guest { + fn set(key: _rt::String, value: _rt::String); + } + #[doc(hidden)] + + macro_rules! __export_fermyon_spin_test_virt_variables_cabi{ + ($ty:ident with_types_in $($path_to_types:tt)*) => (const _: () = { + + #[export_name = "fermyon:spin-test-virt/variables#set"] + unsafe extern "C" fn export_set(arg0: *mut u8,arg1: usize,arg2: *mut u8,arg3: usize,) { + $($path_to_types)*::_export_set_cabi::<$ty>(arg0, arg1, arg2, arg3) + } + };); +} + #[doc(hidden)] + pub(crate) use __export_fermyon_spin_test_virt_variables_cabi; + } } #[allow(dead_code)] pub mod spin_wasi_virt { @@ -34679,6 +34721,7 @@ macro_rules! __export_env_impl { $($path_to_types_root)*::exports::fermyon::spin::variables::__export_fermyon_spin_variables_2_0_0_cabi!($ty with_types_in $($path_to_types_root)*::exports::fermyon::spin::variables); $($path_to_types_root)*::exports::fermyon::spin_test_virt::key_value::__export_fermyon_spin_test_virt_key_value_cabi!($ty with_types_in $($path_to_types_root)*::exports::fermyon::spin_test_virt::key_value); $($path_to_types_root)*::exports::fermyon::spin_test_virt::sqlite::__export_fermyon_spin_test_virt_sqlite_cabi!($ty with_types_in $($path_to_types_root)*::exports::fermyon::spin_test_virt::sqlite); + $($path_to_types_root)*::exports::fermyon::spin_test_virt::variables::__export_fermyon_spin_test_virt_variables_cabi!($ty with_types_in $($path_to_types_root)*::exports::fermyon::spin_test_virt::variables); $($path_to_types_root)*::exports::wasi::io::poll::__export_wasi_io_poll_0_2_0_cabi!($ty with_types_in $($path_to_types_root)*::exports::wasi::io::poll); $($path_to_types_root)*::exports::wasi::clocks::monotonic_clock::__export_wasi_clocks_monotonic_clock_0_2_0_cabi!($ty with_types_in $($path_to_types_root)*::exports::wasi::clocks::monotonic_clock); $($path_to_types_root)*::exports::wasi::clocks::wall_clock::__export_wasi_clocks_wall_clock_0_2_0_cabi!($ty with_types_in $($path_to_types_root)*::exports::wasi::clocks::wall_clock); @@ -34719,9 +34762,9 @@ pub(crate) use __export_env_impl as export; #[cfg(target_arch = "wasm32")] #[link_section = "component-type:wit-bindgen:0.25.0:env:encoded world"] #[doc(hidden)] -pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 28087] = *b"\ -\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\xbc\xda\x01\x01A\x02\ -\x01A\xa0\x01\x01B\x0a\x04\0\x08pollable\x03\x01\x01h\0\x01@\x01\x04self\x01\0\x7f\ +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 28152] = *b"\ +\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07\xfd\xda\x01\x01A\x02\ +\x01A\xa2\x01\x01B\x0a\x04\0\x08pollable\x03\x01\x01h\0\x01@\x01\x04self\x01\0\x7f\ \x04\0\x16[method]pollable.ready\x01\x02\x01@\x01\x04self\x01\x01\0\x04\0\x16[me\ thod]pollable.block\x01\x03\x01p\x01\x01py\x01@\x01\x02in\x04\0\x05\x04\0\x04pol\ l\x01\x06\x03\x01\x12wasi:io/poll@0.2.0\x05\0\x02\x03\0\0\x08pollable\x01B\x0f\x02\ @@ -34968,329 +35011,331 @@ set-calls\x01\x11\x04\x01\x20fermyon:spin-test-virt/key-value\x05(\x02\x03\0\x1a \x01\x07\x01\x05\x01@\x01\x08databases\0\x08\x04\0\x17[static]connection.open\x01\ \x09\x01h\x06\x01p\x01\x01j\x01\x03\x01\x05\x01@\x03\x04self\x0a\x09statements\x0a\ parameters\x0b\0\x0c\x04\0\x1a[method]connection.execute\x01\x0d\x04\x01\x1dferm\ -yon:spin-test-virt/sqlite\x05,\x01B\x0a\x04\0\x08pollable\x03\x01\x01h\0\x01@\x01\ -\x04self\x01\0\x7f\x04\0\x16[method]pollable.ready\x01\x02\x01@\x01\x04self\x01\x01\ -\0\x04\0\x16[method]pollable.block\x01\x03\x01p\x01\x01py\x01@\x01\x02in\x04\0\x05\ -\x04\0\x04poll\x01\x06\x04\x01\x12wasi:io/poll@0.2.0\x05-\x01B\x0f\x02\x03\x02\x01\ -\x01\x04\0\x08pollable\x03\0\0\x01w\x04\0\x07instant\x03\0\x02\x01w\x04\0\x08dur\ -ation\x03\0\x04\x01@\0\0\x03\x04\0\x03now\x01\x06\x01@\0\0\x05\x04\0\x0aresoluti\ -on\x01\x07\x01i\x01\x01@\x01\x04when\x03\0\x08\x04\0\x11subscribe-instant\x01\x09\ -\x01@\x01\x04when\x05\0\x08\x04\0\x12subscribe-duration\x01\x0a\x04\x01!wasi:clo\ -cks/monotonic-clock@0.2.0\x05.\x01B\x05\x01r\x02\x07secondsw\x0bnanosecondsy\x04\ -\0\x08datetime\x03\0\0\x01@\0\0\x01\x04\0\x03now\x01\x02\x04\0\x0aresolution\x01\ -\x02\x04\x01\x1cwasi:clocks/wall-clock@0.2.0\x05/\x01B\x05\x01p}\x01@\x01\x03len\ -w\0\0\x04\0\x10get-random-bytes\x01\x01\x01@\0\0w\x04\0\x0eget-random-u64\x01\x02\ -\x04\x01\x18wasi:random/random@0.2.0\x050\x01B\x05\x01p}\x01@\x01\x03lenw\0\0\x04\ -\0\x19get-insecure-random-bytes\x01\x01\x01@\0\0w\x04\0\x17get-insecure-random-u\ -64\x01\x02\x04\x01\x1awasi:random/insecure@0.2.0\x051\x01B\x03\x01o\x02ww\x01@\0\ -\0\0\x04\0\x0dinsecure-seed\x01\x01\x04\x01\x1fwasi:random/insecure-seed@0.2.0\x05\ -2\x01B\x04\x04\0\x05error\x03\x01\x01h\0\x01@\x01\x04self\x01\0s\x04\0\x1d[metho\ -d]error.to-debug-string\x01\x02\x04\x01\x13wasi:io/error@0.2.0\x053\x01B(\x02\x03\ -\x02\x01\x08\x04\0\x05error\x03\0\0\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\x02\ -\x01i\x01\x01q\x02\x15last-operation-failed\x01\x04\0\x06closed\0\0\x04\0\x0cstr\ -eam-error\x03\0\x05\x04\0\x0cinput-stream\x03\x01\x04\0\x0doutput-stream\x03\x01\ -\x01h\x07\x01p}\x01j\x01\x0a\x01\x06\x01@\x02\x04self\x09\x03lenw\0\x0b\x04\0\x19\ -[method]input-stream.read\x01\x0c\x04\0\"[method]input-stream.blocking-read\x01\x0c\ -\x01j\x01w\x01\x06\x01@\x02\x04self\x09\x03lenw\0\x0d\x04\0\x19[method]input-str\ -eam.skip\x01\x0e\x04\0\"[method]input-stream.blocking-skip\x01\x0e\x01i\x03\x01@\ -\x01\x04self\x09\0\x0f\x04\0\x1e[method]input-stream.subscribe\x01\x10\x01h\x08\x01\ -@\x01\x04self\x11\0\x0d\x04\0![method]output-stream.check-write\x01\x12\x01j\0\x01\ -\x06\x01@\x02\x04self\x11\x08contents\x0a\0\x13\x04\0\x1b[method]output-stream.w\ -rite\x01\x14\x04\0.[method]output-stream.blocking-write-and-flush\x01\x14\x01@\x01\ -\x04self\x11\0\x13\x04\0\x1b[method]output-stream.flush\x01\x15\x04\0$[method]ou\ -tput-stream.blocking-flush\x01\x15\x01@\x01\x04self\x11\0\x0f\x04\0\x1f[method]o\ -utput-stream.subscribe\x01\x16\x01@\x02\x04self\x11\x03lenw\0\x13\x04\0\"[method\ -]output-stream.write-zeroes\x01\x17\x04\05[method]output-stream.blocking-write-z\ -eroes-and-flush\x01\x17\x01@\x03\x04self\x11\x03src\x09\x03lenw\0\x0d\x04\0\x1c[\ -method]output-stream.splice\x01\x18\x04\0%[method]output-stream.blocking-splice\x01\ -\x18\x04\x01\x15wasi:io/streams@0.2.0\x054\x02\x03\0%\x05error\x02\x03\0\x20\x08\ -datetime\x01Br\x02\x03\x02\x01\x0c\x04\0\x0cinput-stream\x03\0\0\x02\x03\x02\x01\ -\x0a\x04\0\x0doutput-stream\x03\0\x02\x02\x03\x02\x015\x04\0\x05error\x03\0\x04\x02\ -\x03\x02\x016\x04\0\x08datetime\x03\0\x06\x01w\x04\0\x08filesize\x03\0\x08\x01m\x08\ -\x07unknown\x0cblock-device\x10character-device\x09directory\x04fifo\x0dsymbolic\ --link\x0cregular-file\x06socket\x04\0\x0fdescriptor-type\x03\0\x0a\x01n\x06\x04r\ -ead\x05write\x13file-integrity-sync\x13data-integrity-sync\x14requested-write-sy\ -nc\x10mutate-directory\x04\0\x10descriptor-flags\x03\0\x0c\x01n\x01\x0esymlink-f\ -ollow\x04\0\x0apath-flags\x03\0\x0e\x01n\x04\x06create\x09directory\x09exclusive\ -\x08truncate\x04\0\x0aopen-flags\x03\0\x10\x01w\x04\0\x0alink-count\x03\0\x12\x01\ -k\x07\x01r\x06\x04type\x0b\x0alink-count\x13\x04size\x09\x15data-access-timestam\ -p\x14\x1bdata-modification-timestamp\x14\x17status-change-timestamp\x14\x04\0\x0f\ -descriptor-stat\x03\0\x15\x01q\x03\x09no-change\0\0\x03now\0\0\x09timestamp\x01\x07\ -\0\x04\0\x0dnew-timestamp\x03\0\x17\x01r\x02\x04type\x0b\x04names\x04\0\x0fdirec\ -tory-entry\x03\0\x19\x01m%\x06access\x0bwould-block\x07already\x0ebad-descriptor\ -\x04busy\x08deadlock\x05quota\x05exist\x0efile-too-large\x15illegal-byte-sequenc\ -e\x0bin-progress\x0binterrupted\x07invalid\x02io\x0cis-directory\x04loop\x0etoo-\ -many-links\x0cmessage-size\x0dname-too-long\x09no-device\x08no-entry\x07no-lock\x13\ -insufficient-memory\x12insufficient-space\x0dnot-directory\x09not-empty\x0fnot-r\ -ecoverable\x0bunsupported\x06no-tty\x0eno-such-device\x08overflow\x0dnot-permitt\ -ed\x04pipe\x09read-only\x0cinvalid-seek\x0etext-file-busy\x0ccross-device\x04\0\x0a\ -error-code\x03\0\x1b\x01m\x06\x06normal\x0asequential\x06random\x09will-need\x09\ -dont-need\x08no-reuse\x04\0\x06advice\x03\0\x1d\x01r\x02\x05lowerw\x05upperw\x04\ -\0\x13metadata-hash-value\x03\0\x1f\x04\0\x0adescriptor\x03\x01\x04\0\x16directo\ -ry-entry-stream\x03\x01\x01h!\x01i\x01\x01j\x01$\x01\x1c\x01@\x02\x04self#\x06of\ -fset\x09\0%\x04\0\"[method]descriptor.read-via-stream\x01&\x01i\x03\x01j\x01'\x01\ -\x1c\x01@\x02\x04self#\x06offset\x09\0(\x04\0#[method]descriptor.write-via-strea\ -m\x01)\x01@\x01\x04self#\0(\x04\0$[method]descriptor.append-via-stream\x01*\x01j\ -\0\x01\x1c\x01@\x04\x04self#\x06offset\x09\x06length\x09\x06advice\x1e\0+\x04\0\x19\ -[method]descriptor.advise\x01,\x01@\x01\x04self#\0+\x04\0\x1c[method]descriptor.\ -sync-data\x01-\x01j\x01\x0d\x01\x1c\x01@\x01\x04self#\0.\x04\0\x1c[method]descri\ -ptor.get-flags\x01/\x01j\x01\x0b\x01\x1c\x01@\x01\x04self#\00\x04\0\x1b[method]d\ -escriptor.get-type\x011\x01@\x02\x04self#\x04size\x09\0+\x04\0\x1b[method]descri\ -ptor.set-size\x012\x01@\x03\x04self#\x15data-access-timestamp\x18\x1bdata-modifi\ -cation-timestamp\x18\0+\x04\0\x1c[method]descriptor.set-times\x013\x01p}\x01o\x02\ -4\x7f\x01j\x015\x01\x1c\x01@\x03\x04self#\x06length\x09\x06offset\x09\06\x04\0\x17\ -[method]descriptor.read\x017\x01j\x01\x09\x01\x1c\x01@\x03\x04self#\x06buffer4\x06\ -offset\x09\08\x04\0\x18[method]descriptor.write\x019\x01i\"\x01j\x01:\x01\x1c\x01\ -@\x01\x04self#\0;\x04\0![method]descriptor.read-directory\x01<\x04\0\x17[method]\ -descriptor.sync\x01-\x01@\x02\x04self#\x04paths\0+\x04\0&[method]descriptor.crea\ -te-directory-at\x01=\x01j\x01\x16\x01\x1c\x01@\x01\x04self#\0>\x04\0\x17[method]\ -descriptor.stat\x01?\x01@\x03\x04self#\x0apath-flags\x0f\x04paths\0>\x04\0\x1a[m\ -ethod]descriptor.stat-at\x01@\x01@\x05\x04self#\x0apath-flags\x0f\x04paths\x15da\ -ta-access-timestamp\x18\x1bdata-modification-timestamp\x18\0+\x04\0\x1f[method]d\ -escriptor.set-times-at\x01A\x01@\x05\x04self#\x0eold-path-flags\x0f\x08old-paths\ -\x0enew-descriptor#\x08new-paths\0+\x04\0\x1a[method]descriptor.link-at\x01B\x01\ -i!\x01j\x01\xc3\0\x01\x1c\x01@\x05\x04self#\x0apath-flags\x0f\x04paths\x0aopen-f\ -lags\x11\x05flags\x0d\0\xc4\0\x04\0\x1a[method]descriptor.open-at\x01E\x01j\x01s\ -\x01\x1c\x01@\x02\x04self#\x04paths\0\xc6\0\x04\0\x1e[method]descriptor.readlink\ --at\x01G\x04\0&[method]descriptor.remove-directory-at\x01=\x01@\x04\x04self#\x08\ -old-paths\x0enew-descriptor#\x08new-paths\0+\x04\0\x1c[method]descriptor.rename-\ -at\x01H\x01@\x03\x04self#\x08old-paths\x08new-paths\0+\x04\0\x1d[method]descript\ -or.symlink-at\x01I\x04\0![method]descriptor.unlink-file-at\x01=\x01@\x02\x04self\ -#\x05other#\0\x7f\x04\0![method]descriptor.is-same-object\x01J\x01j\x01\x20\x01\x1c\ -\x01@\x01\x04self#\0\xcb\0\x04\0\x20[method]descriptor.metadata-hash\x01L\x01@\x03\ -\x04self#\x0apath-flags\x0f\x04paths\0\xcb\0\x04\0#[method]descriptor.metadata-h\ -ash-at\x01M\x01h\"\x01k\x1a\x01j\x01\xcf\0\x01\x1c\x01@\x01\x04self\xce\0\0\xd0\0\ -\x04\03[method]directory-entry-stream.read-directory-entry\x01Q\x01h\x05\x01k\x1c\ -\x01@\x01\x03err\xd2\0\0\xd3\0\x04\0\x15filesystem-error-code\x01T\x04\x01\x1bwa\ -si:filesystem/types@0.2.0\x057\x02\x03\0&\x0adescriptor\x01B\x07\x02\x03\x02\x01\ -8\x04\0\x0adescriptor\x03\0\0\x01i\x01\x01o\x02\x02s\x01p\x03\x01@\0\0\x04\x04\0\ -\x0fget-directories\x01\x05\x04\x01\x1ewasi:filesystem/preopens@0.2.0\x059\x01B\x05\ -\x02\x03\x02\x01\x0a\x04\0\x0doutput-stream\x03\0\0\x01i\x01\x01@\0\0\x02\x04\0\x0a\ -get-stdout\x01\x03\x04\x01\x15wasi:cli/stdout@0.2.0\x05:\x01B\x05\x02\x03\x02\x01\ -\x0c\x04\0\x0cinput-stream\x03\0\0\x01i\x01\x01@\0\0\x02\x04\0\x09get-stdin\x01\x03\ -\x04\x01\x14wasi:cli/stdin@0.2.0\x05;\x01B\x05\x02\x03\x02\x01\x0a\x04\0\x0doutp\ -ut-stream\x03\0\0\x01i\x01\x01@\0\0\x02\x04\0\x0aget-stderr\x01\x03\x04\x01\x15w\ -asi:cli/stderr@0.2.0\x05<\x01B\x01\x04\0\x0eterminal-input\x03\x01\x04\x01\x1dwa\ -si:cli/terminal-input@0.2.0\x05=\x01B\x01\x04\0\x0fterminal-output\x03\x01\x04\x01\ -\x1ewasi:cli/terminal-output@0.2.0\x05>\x01B\x06\x02\x03\x02\x01\x11\x04\0\x0ete\ -rminal-input\x03\0\0\x01i\x01\x01k\x02\x01@\0\0\x03\x04\0\x12get-terminal-stdin\x01\ -\x04\x04\x01\x1dwasi:cli/terminal-stdin@0.2.0\x05?\x01B\x06\x02\x03\x02\x01\x13\x04\ -\0\x0fterminal-output\x03\0\0\x01i\x01\x01k\x02\x01@\0\0\x03\x04\0\x13get-termin\ -al-stdout\x01\x04\x04\x01\x1ewasi:cli/terminal-stdout@0.2.0\x05@\x01B\x06\x02\x03\ -\x02\x01\x13\x04\0\x0fterminal-output\x03\0\0\x01i\x01\x01k\x02\x01@\0\0\x03\x04\ -\0\x13get-terminal-stderr\x01\x04\x04\x01\x1ewasi:cli/terminal-stderr@0.2.0\x05A\ -\x01B\x0a\x01o\x02ss\x01p\0\x01@\0\0\x01\x04\0\x0fget-environment\x01\x02\x01ps\x01\ -@\0\0\x03\x04\0\x0dget-arguments\x01\x04\x01ks\x01@\0\0\x05\x04\0\x0binitial-cwd\ -\x01\x06\x04\x01\x1awasi:cli/environment@0.2.0\x05B\x01B\x03\x01j\0\0\x01@\x01\x06\ -status\0\x01\0\x04\0\x04exit\x01\x01\x04\x01\x13wasi:cli/exit@0.2.0\x05C\x01B\x11\ -\x04\0\x07network\x03\x01\x01m\x15\x07unknown\x0daccess-denied\x0dnot-supported\x10\ -invalid-argument\x0dout-of-memory\x07timeout\x14concurrency-conflict\x0fnot-in-p\ -rogress\x0bwould-block\x0dinvalid-state\x10new-socket-limit\x14address-not-binda\ -ble\x0eaddress-in-use\x12remote-unreachable\x12connection-refused\x10connection-\ -reset\x12connection-aborted\x12datagram-too-large\x11name-unresolvable\x1atempor\ -ary-resolver-failure\x1apermanent-resolver-failure\x04\0\x0aerror-code\x03\0\x01\ -\x01m\x02\x04ipv4\x04ipv6\x04\0\x11ip-address-family\x03\0\x03\x01o\x04}}}}\x04\0\ -\x0cipv4-address\x03\0\x05\x01o\x08{{{{{{{{\x04\0\x0cipv6-address\x03\0\x07\x01q\ -\x02\x04ipv4\x01\x06\0\x04ipv6\x01\x08\0\x04\0\x0aip-address\x03\0\x09\x01r\x02\x04\ -port{\x07address\x06\x04\0\x13ipv4-socket-address\x03\0\x0b\x01r\x04\x04port{\x09\ -flow-infoy\x07address\x08\x08scope-idy\x04\0\x13ipv6-socket-address\x03\0\x0d\x01\ -q\x02\x04ipv4\x01\x0c\0\x04ipv6\x01\x0e\0\x04\0\x11ip-socket-address\x03\0\x0f\x04\ -\x01\x1awasi:sockets/network@0.2.0\x05D\x02\x03\02\x07network\x01B\x05\x02\x03\x02\ -\x01E\x04\0\x07network\x03\0\0\x01i\x01\x01@\0\0\x02\x04\0\x10instance-network\x01\ -\x03\x04\x01#wasi:sockets/instance-network@0.2.0\x05F\x02\x03\02\x0aerror-code\x02\ -\x03\02\x11ip-socket-address\x02\x03\02\x11ip-address-family\x01BD\x02\x03\x02\x01\ -\x01\x04\0\x08pollable\x03\0\0\x02\x03\x02\x01E\x04\0\x07network\x03\0\x02\x02\x03\ -\x02\x01G\x04\0\x0aerror-code\x03\0\x04\x02\x03\x02\x01H\x04\0\x11ip-socket-addr\ -ess\x03\0\x06\x02\x03\x02\x01I\x04\0\x11ip-address-family\x03\0\x08\x01p}\x01r\x02\ -\x04data\x0a\x0eremote-address\x07\x04\0\x11incoming-datagram\x03\0\x0b\x01k\x07\ -\x01r\x02\x04data\x0a\x0eremote-address\x0d\x04\0\x11outgoing-datagram\x03\0\x0e\ -\x04\0\x0audp-socket\x03\x01\x04\0\x18incoming-datagram-stream\x03\x01\x04\0\x18\ -outgoing-datagram-stream\x03\x01\x01h\x10\x01h\x03\x01j\0\x01\x05\x01@\x03\x04se\ -lf\x13\x07network\x14\x0dlocal-address\x07\0\x15\x04\0\x1d[method]udp-socket.sta\ -rt-bind\x01\x16\x01@\x01\x04self\x13\0\x15\x04\0\x1e[method]udp-socket.finish-bi\ -nd\x01\x17\x01i\x11\x01i\x12\x01o\x02\x18\x19\x01j\x01\x1a\x01\x05\x01@\x02\x04s\ -elf\x13\x0eremote-address\x0d\0\x1b\x04\0\x19[method]udp-socket.stream\x01\x1c\x01\ -j\x01\x07\x01\x05\x01@\x01\x04self\x13\0\x1d\x04\0\x20[method]udp-socket.local-a\ -ddress\x01\x1e\x04\0![method]udp-socket.remote-address\x01\x1e\x01@\x01\x04self\x13\ -\0\x09\x04\0![method]udp-socket.address-family\x01\x1f\x01j\x01}\x01\x05\x01@\x01\ -\x04self\x13\0\x20\x04\0$[method]udp-socket.unicast-hop-limit\x01!\x01@\x02\x04s\ -elf\x13\x05value}\0\x15\x04\0([method]udp-socket.set-unicast-hop-limit\x01\"\x01\ -j\x01w\x01\x05\x01@\x01\x04self\x13\0#\x04\0&[method]udp-socket.receive-buffer-s\ -ize\x01$\x01@\x02\x04self\x13\x05valuew\0\x15\x04\0*[method]udp-socket.set-recei\ -ve-buffer-size\x01%\x04\0#[method]udp-socket.send-buffer-size\x01$\x04\0'[method\ -]udp-socket.set-send-buffer-size\x01%\x01i\x01\x01@\x01\x04self\x13\0&\x04\0\x1c\ -[method]udp-socket.subscribe\x01'\x01h\x11\x01p\x0c\x01j\x01)\x01\x05\x01@\x02\x04\ -self(\x0bmax-resultsw\0*\x04\0([method]incoming-datagram-stream.receive\x01+\x01\ -@\x01\x04self(\0&\x04\0*[method]incoming-datagram-stream.subscribe\x01,\x01h\x12\ -\x01@\x01\x04self-\0#\x04\0+[method]outgoing-datagram-stream.check-send\x01.\x01\ -p\x0f\x01@\x02\x04self-\x09datagrams/\0#\x04\0%[method]outgoing-datagram-stream.\ -send\x010\x01@\x01\x04self-\0&\x04\0*[method]outgoing-datagram-stream.subscribe\x01\ -1\x04\x01\x16wasi:sockets/udp@0.2.0\x05J\x02\x03\04\x0audp-socket\x01B\x0c\x02\x03\ -\x02\x01E\x04\0\x07network\x03\0\0\x02\x03\x02\x01G\x04\0\x0aerror-code\x03\0\x02\ -\x02\x03\x02\x01I\x04\0\x11ip-address-family\x03\0\x04\x02\x03\x02\x01K\x04\0\x0a\ -udp-socket\x03\0\x06\x01i\x07\x01j\x01\x08\x01\x03\x01@\x01\x0eaddress-family\x05\ -\0\x09\x04\0\x11create-udp-socket\x01\x0a\x04\x01$wasi:sockets/udp-create-socket\ -@0.2.0\x05L\x01BT\x02\x03\x02\x01\x0c\x04\0\x0cinput-stream\x03\0\0\x02\x03\x02\x01\ -\x0a\x04\0\x0doutput-stream\x03\0\x02\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\ -\x04\x02\x03\x02\x01\x18\x04\0\x08duration\x03\0\x06\x02\x03\x02\x01E\x04\0\x07n\ -etwork\x03\0\x08\x02\x03\x02\x01G\x04\0\x0aerror-code\x03\0\x0a\x02\x03\x02\x01H\ -\x04\0\x11ip-socket-address\x03\0\x0c\x02\x03\x02\x01I\x04\0\x11ip-address-famil\ -y\x03\0\x0e\x01m\x03\x07receive\x04send\x04both\x04\0\x0dshutdown-type\x03\0\x10\ -\x04\0\x0atcp-socket\x03\x01\x01h\x12\x01h\x09\x01j\0\x01\x0b\x01@\x03\x04self\x13\ -\x07network\x14\x0dlocal-address\x0d\0\x15\x04\0\x1d[method]tcp-socket.start-bin\ -d\x01\x16\x01@\x01\x04self\x13\0\x15\x04\0\x1e[method]tcp-socket.finish-bind\x01\ -\x17\x01@\x03\x04self\x13\x07network\x14\x0eremote-address\x0d\0\x15\x04\0\x20[m\ -ethod]tcp-socket.start-connect\x01\x18\x01i\x01\x01i\x03\x01o\x02\x19\x1a\x01j\x01\ -\x1b\x01\x0b\x01@\x01\x04self\x13\0\x1c\x04\0![method]tcp-socket.finish-connect\x01\ -\x1d\x04\0\x1f[method]tcp-socket.start-listen\x01\x17\x04\0\x20[method]tcp-socke\ -t.finish-listen\x01\x17\x01i\x12\x01o\x03\x1e\x19\x1a\x01j\x01\x1f\x01\x0b\x01@\x01\ -\x04self\x13\0\x20\x04\0\x19[method]tcp-socket.accept\x01!\x01j\x01\x0d\x01\x0b\x01\ -@\x01\x04self\x13\0\"\x04\0\x20[method]tcp-socket.local-address\x01#\x04\0![meth\ -od]tcp-socket.remote-address\x01#\x01@\x01\x04self\x13\0\x7f\x04\0\x1f[method]tc\ -p-socket.is-listening\x01$\x01@\x01\x04self\x13\0\x0f\x04\0![method]tcp-socket.a\ -ddress-family\x01%\x01@\x02\x04self\x13\x05valuew\0\x15\x04\0*[method]tcp-socket\ -.set-listen-backlog-size\x01&\x01j\x01\x7f\x01\x0b\x01@\x01\x04self\x13\0'\x04\0\ -%[method]tcp-socket.keep-alive-enabled\x01(\x01@\x02\x04self\x13\x05value\x7f\0\x15\ -\x04\0)[method]tcp-socket.set-keep-alive-enabled\x01)\x01j\x01\x07\x01\x0b\x01@\x01\ -\x04self\x13\0*\x04\0'[method]tcp-socket.keep-alive-idle-time\x01+\x01@\x02\x04s\ -elf\x13\x05value\x07\0\x15\x04\0+[method]tcp-socket.set-keep-alive-idle-time\x01\ -,\x04\0&[method]tcp-socket.keep-alive-interval\x01+\x04\0*[method]tcp-socket.set\ --keep-alive-interval\x01,\x01j\x01y\x01\x0b\x01@\x01\x04self\x13\0-\x04\0#[metho\ -d]tcp-socket.keep-alive-count\x01.\x01@\x02\x04self\x13\x05valuey\0\x15\x04\0'[m\ -ethod]tcp-socket.set-keep-alive-count\x01/\x01j\x01}\x01\x0b\x01@\x01\x04self\x13\ -\00\x04\0\x1c[method]tcp-socket.hop-limit\x011\x01@\x02\x04self\x13\x05value}\0\x15\ -\x04\0\x20[method]tcp-socket.set-hop-limit\x012\x01j\x01w\x01\x0b\x01@\x01\x04se\ -lf\x13\03\x04\0&[method]tcp-socket.receive-buffer-size\x014\x04\0*[method]tcp-so\ -cket.set-receive-buffer-size\x01&\x04\0#[method]tcp-socket.send-buffer-size\x014\ -\x04\0'[method]tcp-socket.set-send-buffer-size\x01&\x01i\x05\x01@\x01\x04self\x13\ -\05\x04\0\x1c[method]tcp-socket.subscribe\x016\x01@\x02\x04self\x13\x0dshutdown-\ -type\x11\0\x15\x04\0\x1b[method]tcp-socket.shutdown\x017\x04\x01\x16wasi:sockets\ -/tcp@0.2.0\x05M\x02\x03\06\x0atcp-socket\x01B\x0c\x02\x03\x02\x01E\x04\0\x07netw\ -ork\x03\0\0\x02\x03\x02\x01G\x04\0\x0aerror-code\x03\0\x02\x02\x03\x02\x01I\x04\0\ -\x11ip-address-family\x03\0\x04\x02\x03\x02\x01N\x04\0\x0atcp-socket\x03\0\x06\x01\ -i\x07\x01j\x01\x08\x01\x03\x01@\x01\x0eaddress-family\x05\0\x09\x04\0\x11create-\ -tcp-socket\x01\x0a\x04\x01$wasi:sockets/tcp-create-socket@0.2.0\x05O\x02\x03\02\x0a\ -ip-address\x01B\x16\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\0\x02\x03\x02\x01\ -E\x04\0\x07network\x03\0\x02\x02\x03\x02\x01G\x04\0\x0aerror-code\x03\0\x04\x02\x03\ -\x02\x01P\x04\0\x0aip-address\x03\0\x06\x04\0\x16resolve-address-stream\x03\x01\x01\ -h\x08\x01k\x07\x01j\x01\x0a\x01\x05\x01@\x01\x04self\x09\0\x0b\x04\03[method]res\ -olve-address-stream.resolve-next-address\x01\x0c\x01i\x01\x01@\x01\x04self\x09\0\ -\x0d\x04\0([method]resolve-address-stream.subscribe\x01\x0e\x01h\x03\x01i\x08\x01\ -j\x01\x10\x01\x05\x01@\x02\x07network\x0f\x04names\0\x11\x04\0\x11resolve-addres\ -ses\x01\x12\x04\x01!wasi:sockets/ip-name-lookup@0.2.0\x05Q\x01B\xc0\x01\x02\x03\x02\ -\x01\x18\x04\0\x08duration\x03\0\0\x02\x03\x02\x01\x0c\x04\0\x0cinput-stream\x03\ -\0\x02\x02\x03\x02\x01\x0a\x04\0\x0doutput-stream\x03\0\x04\x02\x03\x02\x01\x08\x04\ -\0\x08io-error\x03\0\x06\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\x08\x01q\x0a\ -\x03get\0\0\x04head\0\0\x04post\0\0\x03put\0\0\x06delete\0\0\x07connect\0\0\x07o\ -ptions\0\0\x05trace\0\0\x05patch\0\0\x05other\x01s\0\x04\0\x06method\x03\0\x0a\x01\ -q\x03\x04HTTP\0\0\x05HTTPS\0\0\x05other\x01s\0\x04\0\x06scheme\x03\0\x0c\x01ks\x01\ -k{\x01r\x02\x05rcode\x0e\x09info-code\x0f\x04\0\x11DNS-error-payload\x03\0\x10\x01\ -k}\x01r\x02\x08alert-id\x12\x0dalert-message\x0e\x04\0\x1aTLS-alert-received-pay\ -load\x03\0\x13\x01ky\x01r\x02\x0afield-name\x0e\x0afield-size\x15\x04\0\x12field\ --size-payload\x03\0\x16\x01kw\x01k\x17\x01q'\x0bDNS-timeout\0\0\x09DNS-error\x01\ -\x11\0\x15destination-not-found\0\0\x17destination-unavailable\0\0\x19destinatio\ -n-IP-prohibited\0\0\x19destination-IP-unroutable\0\0\x12connection-refused\0\0\x15\ -connection-terminated\0\0\x12connection-timeout\0\0\x17connection-read-timeout\0\ -\0\x18connection-write-timeout\0\0\x18connection-limit-reached\0\0\x12TLS-protoc\ -ol-error\0\0\x15TLS-certificate-error\0\0\x12TLS-alert-received\x01\x14\0\x13HTT\ -P-request-denied\0\0\x1cHTTP-request-length-required\0\0\x16HTTP-request-body-si\ -ze\x01\x18\0\x1bHTTP-request-method-invalid\0\0\x18HTTP-request-URI-invalid\0\0\x19\ -HTTP-request-URI-too-long\0\0\x20HTTP-request-header-section-size\x01\x15\0\x18H\ -TTP-request-header-size\x01\x19\0!HTTP-request-trailer-section-size\x01\x15\0\x19\ -HTTP-request-trailer-size\x01\x17\0\x18HTTP-response-incomplete\0\0!HTTP-respons\ -e-header-section-size\x01\x15\0\x19HTTP-response-header-size\x01\x17\0\x17HTTP-r\ -esponse-body-size\x01\x18\0\"HTTP-response-trailer-section-size\x01\x15\0\x1aHTT\ -P-response-trailer-size\x01\x17\0\x1dHTTP-response-transfer-coding\x01\x0e\0\x1c\ -HTTP-response-content-coding\x01\x0e\0\x15HTTP-response-timeout\0\0\x13HTTP-upgr\ -ade-failed\0\0\x13HTTP-protocol-error\0\0\x0dloop-detected\0\0\x13configuration-\ -error\0\0\x0einternal-error\x01\x0e\0\x04\0\x0aerror-code\x03\0\x1a\x01q\x03\x0e\ -invalid-syntax\0\0\x09forbidden\0\0\x09immutable\0\0\x04\0\x0cheader-error\x03\0\ -\x1c\x01s\x04\0\x09field-key\x03\0\x1e\x01p}\x04\0\x0bfield-value\x03\0\x20\x04\0\ -\x06fields\x03\x01\x04\0\x07headers\x03\0\"\x04\0\x08trailers\x03\0\"\x04\0\x10i\ -ncoming-request\x03\x01\x04\0\x10outgoing-request\x03\x01\x04\0\x0frequest-optio\ -ns\x03\x01\x04\0\x11response-outparam\x03\x01\x01{\x04\0\x0bstatus-code\x03\0)\x04\ -\0\x11incoming-response\x03\x01\x04\0\x0dincoming-body\x03\x01\x04\0\x0ffuture-t\ -railers\x03\x01\x04\0\x11outgoing-response\x03\x01\x04\0\x0doutgoing-body\x03\x01\ -\x04\0\x18future-incoming-response\x03\x01\x01i\"\x01@\0\01\x04\0\x13[constructo\ -r]fields\x012\x01o\x02\x1f!\x01p3\x01j\x011\x01\x1d\x01@\x01\x07entries4\05\x04\0\ -\x18[static]fields.from-list\x016\x01h\"\x01p!\x01@\x02\x04self7\x04name\x1f\08\x04\ -\0\x12[method]fields.get\x019\x01@\x02\x04self7\x04name\x1f\0\x7f\x04\0\x12[meth\ -od]fields.has\x01:\x01j\0\x01\x1d\x01@\x03\x04self7\x04name\x1f\x05value8\0;\x04\ -\0\x12[method]fields.set\x01<\x01@\x02\x04self7\x04name\x1f\0;\x04\0\x15[method]\ -fields.delete\x01=\x01@\x03\x04self7\x04name\x1f\x05value!\0;\x04\0\x15[method]f\ -ields.append\x01>\x01@\x01\x04self7\04\x04\0\x16[method]fields.entries\x01?\x01@\ -\x01\x04self7\01\x04\0\x14[method]fields.clone\x01@\x01h%\x01@\x01\x04self\xc1\0\ -\0\x0b\x04\0\x1f[method]incoming-request.method\x01B\x01@\x01\x04self\xc1\0\0\x0e\ -\x04\0([method]incoming-request.path-with-query\x01C\x01k\x0d\x01@\x01\x04self\xc1\ -\0\0\xc4\0\x04\0\x1f[method]incoming-request.scheme\x01E\x04\0\"[method]incoming\ --request.authority\x01C\x01i#\x01@\x01\x04self\xc1\0\0\xc6\0\x04\0\x20[method]in\ -coming-request.headers\x01G\x01i,\x01j\x01\xc8\0\0\x01@\x01\x04self\xc1\0\0\xc9\0\ -\x04\0\x20[method]incoming-request.consume\x01J\x01i&\x01@\x01\x07headers\xc6\0\0\ -\xcb\0\x04\0\x1d[constructor]outgoing-request\x01L\x01h&\x01i/\x01j\x01\xce\0\0\x01\ -@\x01\x04self\xcd\0\0\xcf\0\x04\0\x1d[method]outgoing-request.body\x01P\x01@\x01\ -\x04self\xcd\0\0\x0b\x04\0\x1f[method]outgoing-request.method\x01Q\x01j\0\0\x01@\ -\x02\x04self\xcd\0\x06method\x0b\0\xd2\0\x04\0#[method]outgoing-request.set-meth\ -od\x01S\x01@\x01\x04self\xcd\0\0\x0e\x04\0([method]outgoing-request.path-with-qu\ -ery\x01T\x01@\x02\x04self\xcd\0\x0fpath-with-query\x0e\0\xd2\0\x04\0,[method]out\ -going-request.set-path-with-query\x01U\x01@\x01\x04self\xcd\0\0\xc4\0\x04\0\x1f[\ -method]outgoing-request.scheme\x01V\x01@\x02\x04self\xcd\0\x06scheme\xc4\0\0\xd2\ -\0\x04\0#[method]outgoing-request.set-scheme\x01W\x04\0\"[method]outgoing-reques\ -t.authority\x01T\x01@\x02\x04self\xcd\0\x09authority\x0e\0\xd2\0\x04\0&[method]o\ -utgoing-request.set-authority\x01X\x01@\x01\x04self\xcd\0\0\xc6\0\x04\0\x20[meth\ -od]outgoing-request.headers\x01Y\x01i'\x01@\0\0\xda\0\x04\0\x1c[constructor]requ\ -est-options\x01[\x01h'\x01k\x01\x01@\x01\x04self\xdc\0\0\xdd\0\x04\0'[method]req\ -uest-options.connect-timeout\x01^\x01@\x02\x04self\xdc\0\x08duration\xdd\0\0\xd2\ -\0\x04\0+[method]request-options.set-connect-timeout\x01_\x04\0*[method]request-\ -options.first-byte-timeout\x01^\x04\0.[method]request-options.set-first-byte-tim\ -eout\x01_\x04\0-[method]request-options.between-bytes-timeout\x01^\x04\01[method\ -]request-options.set-between-bytes-timeout\x01_\x01i(\x01i.\x01j\x01\xe1\0\x01\x1b\ -\x01@\x02\x05param\xe0\0\x08response\xe2\0\x01\0\x04\0\x1d[static]response-outpa\ -ram.set\x01c\x01h+\x01@\x01\x04self\xe4\0\0*\x04\0\x20[method]incoming-response.\ -status\x01e\x01@\x01\x04self\xe4\0\0\xc6\0\x04\0![method]incoming-response.heade\ -rs\x01f\x01@\x01\x04self\xe4\0\0\xc9\0\x04\0![method]incoming-response.consume\x01\ -g\x01h,\x01i\x03\x01j\x01\xe9\0\0\x01@\x01\x04self\xe8\0\0\xea\0\x04\0\x1c[metho\ -d]incoming-body.stream\x01k\x01i-\x01@\x01\x04this\xc8\0\0\xec\0\x04\0\x1c[stati\ -c]incoming-body.finish\x01m\x01h-\x01i\x09\x01@\x01\x04self\xee\0\0\xef\0\x04\0!\ -[method]future-trailers.subscribe\x01p\x01i$\x01k\xf1\0\x01j\x01\xf2\0\x01\x1b\x01\ -j\x01\xf3\0\0\x01k\xf4\0\x01@\x01\x04self\xee\0\0\xf5\0\x04\0\x1b[method]future-\ -trailers.get\x01v\x01@\x01\x07headers\xc6\0\0\xe1\0\x04\0\x1e[constructor]outgoi\ -ng-response\x01w\x01h.\x01@\x01\x04self\xf8\0\0*\x04\0%[method]outgoing-response\ -.status-code\x01y\x01@\x02\x04self\xf8\0\x0bstatus-code*\0\xd2\0\x04\0)[method]o\ -utgoing-response.set-status-code\x01z\x01@\x01\x04self\xf8\0\0\xc6\0\x04\0![meth\ -od]outgoing-response.headers\x01{\x01@\x01\x04self\xf8\0\0\xcf\0\x04\0\x1e[metho\ -d]outgoing-response.body\x01|\x01h/\x01i\x05\x01j\x01\xfe\0\0\x01@\x01\x04self\xfd\ -\0\0\xff\0\x04\0\x1b[method]outgoing-body.write\x01\x80\x01\x01j\0\x01\x1b\x01@\x02\ -\x04this\xce\0\x08trailers\xf2\0\0\x81\x01\x04\0\x1c[static]outgoing-body.finish\ -\x01\x82\x01\x01h0\x01@\x01\x04self\x83\x01\0\xef\0\x04\0*[method]future-incomin\ -g-response.subscribe\x01\x84\x01\x01i+\x01j\x01\x85\x01\x01\x1b\x01j\x01\x86\x01\ -\0\x01k\x87\x01\x01@\x01\x04self\x83\x01\0\x88\x01\x04\0$[method]future-incoming\ --response.get\x01\x89\x01\x01h\x07\x01k\x1b\x01@\x01\x03err\x8a\x01\0\x8b\x01\x04\ -\0\x0fhttp-error-code\x01\x8c\x01\x04\x01\x15wasi:http/types@0.2.0\x05R\x02\x03\0\ -9\x10outgoing-request\x02\x03\09\x0frequest-options\x02\x03\09\x18future-incomin\ -g-response\x02\x03\09\x0aerror-code\x01B\x0f\x02\x03\x02\x01S\x04\0\x10outgoing-\ -request\x03\0\0\x02\x03\x02\x01T\x04\0\x0frequest-options\x03\0\x02\x02\x03\x02\x01\ -U\x04\0\x18future-incoming-response\x03\0\x04\x02\x03\x02\x01V\x04\0\x0aerror-co\ -de\x03\0\x06\x01i\x01\x01i\x03\x01k\x09\x01i\x05\x01j\x01\x0b\x01\x07\x01@\x02\x07\ -request\x08\x07options\x0a\0\x0c\x04\0\x06handle\x01\x0d\x04\x01\x20wasi:http/ou\ -tgoing-handler@0.2.0\x05W\x02\x03\09\x11outgoing-response\x01B\x07\x02\x03\x02\x01\ -X\x04\0\x11outgoing-response\x03\0\0\x01i\x01\x01q\x02\x04echo\0\0\x08response\x01\ -\x02\0\x04\0\x10response-handler\x03\0\x03\x01@\x02\x03urls\x08response\x04\x01\0\ -\x04\0\x0cset-response\x01\x05\x04\x01#fermyon:spin-wasi-virt/http-handler\x05Y\x02\ -\x03\09\x10incoming-request\x02\x03\09\x11incoming-response\x02\x03\09\x11respon\ -se-outparam\x02\x03\09\x0dincoming-body\x01B\x1f\x02\x03\x02\x01Z\x04\0\x10incom\ -ing-request\x03\0\0\x02\x03\x02\x01[\x04\0\x11incoming-response\x03\0\x02\x02\x03\ -\x02\x01X\x04\0\x11outgoing-response\x03\0\x04\x02\x03\x02\x01S\x04\0\x10outgoin\ -g-request\x03\0\x06\x02\x03\x02\x01\\\x04\0\x11response-outparam\x03\0\x08\x02\x03\ -\x02\x01U\x04\0\x18future-incoming-response\x03\0\x0a\x02\x03\x02\x01]\x04\0\x0d\ -incoming-body\x03\0\x0c\x04\0\x11response-receiver\x03\x01\x01h\x0e\x01i\x03\x01\ -k\x10\x01@\x01\x04self\x0f\0\x11\x04\0\x1d[method]response-receiver.get\x01\x12\x01\ -i\x07\x01i\x0d\x01k\x14\x01i\x01\x01@\x02\x07request\x13\x0dincoming-body\x15\0\x16\ -\x04\0\x0bnew-request\x01\x17\x01i\x09\x01i\x0e\x01o\x02\x18\x19\x01@\0\0\x1a\x04\ -\0\x0cnew-response\x01\x1b\x04\x01\"fermyon:spin-wasi-virt/http-helper\x05^\x01B\ -\x03\x01p}\x01@\x02\x04paths\x08contents\0\x01\0\x04\0\x08add-file\x01\x01\x04\x01\ -!fermyon:spin-wasi-virt/fs-handler\x05_\x04\x01\x1afermyon:spin-test-virt/env\x04\ -\0\x0b\x09\x01\0\x03env\x03\0\0\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-c\ -omponent\x070.208.1\x10wit-bindgen-rust\x060.25.0"; +yon:spin-test-virt/sqlite\x05,\x01B\x02\x01@\x02\x03keys\x05values\x01\0\x04\0\x03\ +set\x01\0\x04\x01\x20fermyon:spin-test-virt/variables\x05-\x01B\x0a\x04\0\x08pol\ +lable\x03\x01\x01h\0\x01@\x01\x04self\x01\0\x7f\x04\0\x16[method]pollable.ready\x01\ +\x02\x01@\x01\x04self\x01\x01\0\x04\0\x16[method]pollable.block\x01\x03\x01p\x01\ +\x01py\x01@\x01\x02in\x04\0\x05\x04\0\x04poll\x01\x06\x04\x01\x12wasi:io/poll@0.\ +2.0\x05.\x01B\x0f\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\0\x01w\x04\0\x07in\ +stant\x03\0\x02\x01w\x04\0\x08duration\x03\0\x04\x01@\0\0\x03\x04\0\x03now\x01\x06\ +\x01@\0\0\x05\x04\0\x0aresolution\x01\x07\x01i\x01\x01@\x01\x04when\x03\0\x08\x04\ +\0\x11subscribe-instant\x01\x09\x01@\x01\x04when\x05\0\x08\x04\0\x12subscribe-du\ +ration\x01\x0a\x04\x01!wasi:clocks/monotonic-clock@0.2.0\x05/\x01B\x05\x01r\x02\x07\ +secondsw\x0bnanosecondsy\x04\0\x08datetime\x03\0\0\x01@\0\0\x01\x04\0\x03now\x01\ +\x02\x04\0\x0aresolution\x01\x02\x04\x01\x1cwasi:clocks/wall-clock@0.2.0\x050\x01\ +B\x05\x01p}\x01@\x01\x03lenw\0\0\x04\0\x10get-random-bytes\x01\x01\x01@\0\0w\x04\ +\0\x0eget-random-u64\x01\x02\x04\x01\x18wasi:random/random@0.2.0\x051\x01B\x05\x01\ +p}\x01@\x01\x03lenw\0\0\x04\0\x19get-insecure-random-bytes\x01\x01\x01@\0\0w\x04\ +\0\x17get-insecure-random-u64\x01\x02\x04\x01\x1awasi:random/insecure@0.2.0\x052\ +\x01B\x03\x01o\x02ww\x01@\0\0\0\x04\0\x0dinsecure-seed\x01\x01\x04\x01\x1fwasi:r\ +andom/insecure-seed@0.2.0\x053\x01B\x04\x04\0\x05error\x03\x01\x01h\0\x01@\x01\x04\ +self\x01\0s\x04\0\x1d[method]error.to-debug-string\x01\x02\x04\x01\x13wasi:io/er\ +ror@0.2.0\x054\x01B(\x02\x03\x02\x01\x08\x04\0\x05error\x03\0\0\x02\x03\x02\x01\x01\ +\x04\0\x08pollable\x03\0\x02\x01i\x01\x01q\x02\x15last-operation-failed\x01\x04\0\ +\x06closed\0\0\x04\0\x0cstream-error\x03\0\x05\x04\0\x0cinput-stream\x03\x01\x04\ +\0\x0doutput-stream\x03\x01\x01h\x07\x01p}\x01j\x01\x0a\x01\x06\x01@\x02\x04self\ +\x09\x03lenw\0\x0b\x04\0\x19[method]input-stream.read\x01\x0c\x04\0\"[method]inp\ +ut-stream.blocking-read\x01\x0c\x01j\x01w\x01\x06\x01@\x02\x04self\x09\x03lenw\0\ +\x0d\x04\0\x19[method]input-stream.skip\x01\x0e\x04\0\"[method]input-stream.bloc\ +king-skip\x01\x0e\x01i\x03\x01@\x01\x04self\x09\0\x0f\x04\0\x1e[method]input-str\ +eam.subscribe\x01\x10\x01h\x08\x01@\x01\x04self\x11\0\x0d\x04\0![method]output-s\ +tream.check-write\x01\x12\x01j\0\x01\x06\x01@\x02\x04self\x11\x08contents\x0a\0\x13\ +\x04\0\x1b[method]output-stream.write\x01\x14\x04\0.[method]output-stream.blocki\ +ng-write-and-flush\x01\x14\x01@\x01\x04self\x11\0\x13\x04\0\x1b[method]output-st\ +ream.flush\x01\x15\x04\0$[method]output-stream.blocking-flush\x01\x15\x01@\x01\x04\ +self\x11\0\x0f\x04\0\x1f[method]output-stream.subscribe\x01\x16\x01@\x02\x04self\ +\x11\x03lenw\0\x13\x04\0\"[method]output-stream.write-zeroes\x01\x17\x04\05[meth\ +od]output-stream.blocking-write-zeroes-and-flush\x01\x17\x01@\x03\x04self\x11\x03\ +src\x09\x03lenw\0\x0d\x04\0\x1c[method]output-stream.splice\x01\x18\x04\0%[metho\ +d]output-stream.blocking-splice\x01\x18\x04\x01\x15wasi:io/streams@0.2.0\x055\x02\ +\x03\0&\x05error\x02\x03\0!\x08datetime\x01Br\x02\x03\x02\x01\x0c\x04\0\x0cinput\ +-stream\x03\0\0\x02\x03\x02\x01\x0a\x04\0\x0doutput-stream\x03\0\x02\x02\x03\x02\ +\x016\x04\0\x05error\x03\0\x04\x02\x03\x02\x017\x04\0\x08datetime\x03\0\x06\x01w\ +\x04\0\x08filesize\x03\0\x08\x01m\x08\x07unknown\x0cblock-device\x10character-de\ +vice\x09directory\x04fifo\x0dsymbolic-link\x0cregular-file\x06socket\x04\0\x0fde\ +scriptor-type\x03\0\x0a\x01n\x06\x04read\x05write\x13file-integrity-sync\x13data\ +-integrity-sync\x14requested-write-sync\x10mutate-directory\x04\0\x10descriptor-\ +flags\x03\0\x0c\x01n\x01\x0esymlink-follow\x04\0\x0apath-flags\x03\0\x0e\x01n\x04\ +\x06create\x09directory\x09exclusive\x08truncate\x04\0\x0aopen-flags\x03\0\x10\x01\ +w\x04\0\x0alink-count\x03\0\x12\x01k\x07\x01r\x06\x04type\x0b\x0alink-count\x13\x04\ +size\x09\x15data-access-timestamp\x14\x1bdata-modification-timestamp\x14\x17stat\ +us-change-timestamp\x14\x04\0\x0fdescriptor-stat\x03\0\x15\x01q\x03\x09no-change\ +\0\0\x03now\0\0\x09timestamp\x01\x07\0\x04\0\x0dnew-timestamp\x03\0\x17\x01r\x02\ +\x04type\x0b\x04names\x04\0\x0fdirectory-entry\x03\0\x19\x01m%\x06access\x0bwoul\ +d-block\x07already\x0ebad-descriptor\x04busy\x08deadlock\x05quota\x05exist\x0efi\ +le-too-large\x15illegal-byte-sequence\x0bin-progress\x0binterrupted\x07invalid\x02\ +io\x0cis-directory\x04loop\x0etoo-many-links\x0cmessage-size\x0dname-too-long\x09\ +no-device\x08no-entry\x07no-lock\x13insufficient-memory\x12insufficient-space\x0d\ +not-directory\x09not-empty\x0fnot-recoverable\x0bunsupported\x06no-tty\x0eno-suc\ +h-device\x08overflow\x0dnot-permitted\x04pipe\x09read-only\x0cinvalid-seek\x0ete\ +xt-file-busy\x0ccross-device\x04\0\x0aerror-code\x03\0\x1b\x01m\x06\x06normal\x0a\ +sequential\x06random\x09will-need\x09dont-need\x08no-reuse\x04\0\x06advice\x03\0\ +\x1d\x01r\x02\x05lowerw\x05upperw\x04\0\x13metadata-hash-value\x03\0\x1f\x04\0\x0a\ +descriptor\x03\x01\x04\0\x16directory-entry-stream\x03\x01\x01h!\x01i\x01\x01j\x01\ +$\x01\x1c\x01@\x02\x04self#\x06offset\x09\0%\x04\0\"[method]descriptor.read-via-\ +stream\x01&\x01i\x03\x01j\x01'\x01\x1c\x01@\x02\x04self#\x06offset\x09\0(\x04\0#\ +[method]descriptor.write-via-stream\x01)\x01@\x01\x04self#\0(\x04\0$[method]desc\ +riptor.append-via-stream\x01*\x01j\0\x01\x1c\x01@\x04\x04self#\x06offset\x09\x06\ +length\x09\x06advice\x1e\0+\x04\0\x19[method]descriptor.advise\x01,\x01@\x01\x04\ +self#\0+\x04\0\x1c[method]descriptor.sync-data\x01-\x01j\x01\x0d\x01\x1c\x01@\x01\ +\x04self#\0.\x04\0\x1c[method]descriptor.get-flags\x01/\x01j\x01\x0b\x01\x1c\x01\ +@\x01\x04self#\00\x04\0\x1b[method]descriptor.get-type\x011\x01@\x02\x04self#\x04\ +size\x09\0+\x04\0\x1b[method]descriptor.set-size\x012\x01@\x03\x04self#\x15data-\ +access-timestamp\x18\x1bdata-modification-timestamp\x18\0+\x04\0\x1c[method]desc\ +riptor.set-times\x013\x01p}\x01o\x024\x7f\x01j\x015\x01\x1c\x01@\x03\x04self#\x06\ +length\x09\x06offset\x09\06\x04\0\x17[method]descriptor.read\x017\x01j\x01\x09\x01\ +\x1c\x01@\x03\x04self#\x06buffer4\x06offset\x09\08\x04\0\x18[method]descriptor.w\ +rite\x019\x01i\"\x01j\x01:\x01\x1c\x01@\x01\x04self#\0;\x04\0![method]descriptor\ +.read-directory\x01<\x04\0\x17[method]descriptor.sync\x01-\x01@\x02\x04self#\x04\ +paths\0+\x04\0&[method]descriptor.create-directory-at\x01=\x01j\x01\x16\x01\x1c\x01\ +@\x01\x04self#\0>\x04\0\x17[method]descriptor.stat\x01?\x01@\x03\x04self#\x0apat\ +h-flags\x0f\x04paths\0>\x04\0\x1a[method]descriptor.stat-at\x01@\x01@\x05\x04sel\ +f#\x0apath-flags\x0f\x04paths\x15data-access-timestamp\x18\x1bdata-modification-\ +timestamp\x18\0+\x04\0\x1f[method]descriptor.set-times-at\x01A\x01@\x05\x04self#\ +\x0eold-path-flags\x0f\x08old-paths\x0enew-descriptor#\x08new-paths\0+\x04\0\x1a\ +[method]descriptor.link-at\x01B\x01i!\x01j\x01\xc3\0\x01\x1c\x01@\x05\x04self#\x0a\ +path-flags\x0f\x04paths\x0aopen-flags\x11\x05flags\x0d\0\xc4\0\x04\0\x1a[method]\ +descriptor.open-at\x01E\x01j\x01s\x01\x1c\x01@\x02\x04self#\x04paths\0\xc6\0\x04\ +\0\x1e[method]descriptor.readlink-at\x01G\x04\0&[method]descriptor.remove-direct\ +ory-at\x01=\x01@\x04\x04self#\x08old-paths\x0enew-descriptor#\x08new-paths\0+\x04\ +\0\x1c[method]descriptor.rename-at\x01H\x01@\x03\x04self#\x08old-paths\x08new-pa\ +ths\0+\x04\0\x1d[method]descriptor.symlink-at\x01I\x04\0![method]descriptor.unli\ +nk-file-at\x01=\x01@\x02\x04self#\x05other#\0\x7f\x04\0![method]descriptor.is-sa\ +me-object\x01J\x01j\x01\x20\x01\x1c\x01@\x01\x04self#\0\xcb\0\x04\0\x20[method]d\ +escriptor.metadata-hash\x01L\x01@\x03\x04self#\x0apath-flags\x0f\x04paths\0\xcb\0\ +\x04\0#[method]descriptor.metadata-hash-at\x01M\x01h\"\x01k\x1a\x01j\x01\xcf\0\x01\ +\x1c\x01@\x01\x04self\xce\0\0\xd0\0\x04\03[method]directory-entry-stream.read-di\ +rectory-entry\x01Q\x01h\x05\x01k\x1c\x01@\x01\x03err\xd2\0\0\xd3\0\x04\0\x15file\ +system-error-code\x01T\x04\x01\x1bwasi:filesystem/types@0.2.0\x058\x02\x03\0'\x0a\ +descriptor\x01B\x07\x02\x03\x02\x019\x04\0\x0adescriptor\x03\0\0\x01i\x01\x01o\x02\ +\x02s\x01p\x03\x01@\0\0\x04\x04\0\x0fget-directories\x01\x05\x04\x01\x1ewasi:fil\ +esystem/preopens@0.2.0\x05:\x01B\x05\x02\x03\x02\x01\x0a\x04\0\x0doutput-stream\x03\ +\0\0\x01i\x01\x01@\0\0\x02\x04\0\x0aget-stdout\x01\x03\x04\x01\x15wasi:cli/stdou\ +t@0.2.0\x05;\x01B\x05\x02\x03\x02\x01\x0c\x04\0\x0cinput-stream\x03\0\0\x01i\x01\ +\x01@\0\0\x02\x04\0\x09get-stdin\x01\x03\x04\x01\x14wasi:cli/stdin@0.2.0\x05<\x01\ +B\x05\x02\x03\x02\x01\x0a\x04\0\x0doutput-stream\x03\0\0\x01i\x01\x01@\0\0\x02\x04\ +\0\x0aget-stderr\x01\x03\x04\x01\x15wasi:cli/stderr@0.2.0\x05=\x01B\x01\x04\0\x0e\ +terminal-input\x03\x01\x04\x01\x1dwasi:cli/terminal-input@0.2.0\x05>\x01B\x01\x04\ +\0\x0fterminal-output\x03\x01\x04\x01\x1ewasi:cli/terminal-output@0.2.0\x05?\x01\ +B\x06\x02\x03\x02\x01\x11\x04\0\x0eterminal-input\x03\0\0\x01i\x01\x01k\x02\x01@\ +\0\0\x03\x04\0\x12get-terminal-stdin\x01\x04\x04\x01\x1dwasi:cli/terminal-stdin@\ +0.2.0\x05@\x01B\x06\x02\x03\x02\x01\x13\x04\0\x0fterminal-output\x03\0\0\x01i\x01\ +\x01k\x02\x01@\0\0\x03\x04\0\x13get-terminal-stdout\x01\x04\x04\x01\x1ewasi:cli/\ +terminal-stdout@0.2.0\x05A\x01B\x06\x02\x03\x02\x01\x13\x04\0\x0fterminal-output\ +\x03\0\0\x01i\x01\x01k\x02\x01@\0\0\x03\x04\0\x13get-terminal-stderr\x01\x04\x04\ +\x01\x1ewasi:cli/terminal-stderr@0.2.0\x05B\x01B\x0a\x01o\x02ss\x01p\0\x01@\0\0\x01\ +\x04\0\x0fget-environment\x01\x02\x01ps\x01@\0\0\x03\x04\0\x0dget-arguments\x01\x04\ +\x01ks\x01@\0\0\x05\x04\0\x0binitial-cwd\x01\x06\x04\x01\x1awasi:cli/environment\ +@0.2.0\x05C\x01B\x03\x01j\0\0\x01@\x01\x06status\0\x01\0\x04\0\x04exit\x01\x01\x04\ +\x01\x13wasi:cli/exit@0.2.0\x05D\x01B\x11\x04\0\x07network\x03\x01\x01m\x15\x07u\ +nknown\x0daccess-denied\x0dnot-supported\x10invalid-argument\x0dout-of-memory\x07\ +timeout\x14concurrency-conflict\x0fnot-in-progress\x0bwould-block\x0dinvalid-sta\ +te\x10new-socket-limit\x14address-not-bindable\x0eaddress-in-use\x12remote-unrea\ +chable\x12connection-refused\x10connection-reset\x12connection-aborted\x12datagr\ +am-too-large\x11name-unresolvable\x1atemporary-resolver-failure\x1apermanent-res\ +olver-failure\x04\0\x0aerror-code\x03\0\x01\x01m\x02\x04ipv4\x04ipv6\x04\0\x11ip\ +-address-family\x03\0\x03\x01o\x04}}}}\x04\0\x0cipv4-address\x03\0\x05\x01o\x08{\ +{{{{{{{\x04\0\x0cipv6-address\x03\0\x07\x01q\x02\x04ipv4\x01\x06\0\x04ipv6\x01\x08\ +\0\x04\0\x0aip-address\x03\0\x09\x01r\x02\x04port{\x07address\x06\x04\0\x13ipv4-\ +socket-address\x03\0\x0b\x01r\x04\x04port{\x09flow-infoy\x07address\x08\x08scope\ +-idy\x04\0\x13ipv6-socket-address\x03\0\x0d\x01q\x02\x04ipv4\x01\x0c\0\x04ipv6\x01\ +\x0e\0\x04\0\x11ip-socket-address\x03\0\x0f\x04\x01\x1awasi:sockets/network@0.2.\ +0\x05E\x02\x03\03\x07network\x01B\x05\x02\x03\x02\x01F\x04\0\x07network\x03\0\0\x01\ +i\x01\x01@\0\0\x02\x04\0\x10instance-network\x01\x03\x04\x01#wasi:sockets/instan\ +ce-network@0.2.0\x05G\x02\x03\03\x0aerror-code\x02\x03\03\x11ip-socket-address\x02\ +\x03\03\x11ip-address-family\x01BD\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\0\ +\x02\x03\x02\x01F\x04\0\x07network\x03\0\x02\x02\x03\x02\x01H\x04\0\x0aerror-cod\ +e\x03\0\x04\x02\x03\x02\x01I\x04\0\x11ip-socket-address\x03\0\x06\x02\x03\x02\x01\ +J\x04\0\x11ip-address-family\x03\0\x08\x01p}\x01r\x02\x04data\x0a\x0eremote-addr\ +ess\x07\x04\0\x11incoming-datagram\x03\0\x0b\x01k\x07\x01r\x02\x04data\x0a\x0ere\ +mote-address\x0d\x04\0\x11outgoing-datagram\x03\0\x0e\x04\0\x0audp-socket\x03\x01\ +\x04\0\x18incoming-datagram-stream\x03\x01\x04\0\x18outgoing-datagram-stream\x03\ +\x01\x01h\x10\x01h\x03\x01j\0\x01\x05\x01@\x03\x04self\x13\x07network\x14\x0dloc\ +al-address\x07\0\x15\x04\0\x1d[method]udp-socket.start-bind\x01\x16\x01@\x01\x04\ +self\x13\0\x15\x04\0\x1e[method]udp-socket.finish-bind\x01\x17\x01i\x11\x01i\x12\ +\x01o\x02\x18\x19\x01j\x01\x1a\x01\x05\x01@\x02\x04self\x13\x0eremote-address\x0d\ +\0\x1b\x04\0\x19[method]udp-socket.stream\x01\x1c\x01j\x01\x07\x01\x05\x01@\x01\x04\ +self\x13\0\x1d\x04\0\x20[method]udp-socket.local-address\x01\x1e\x04\0![method]u\ +dp-socket.remote-address\x01\x1e\x01@\x01\x04self\x13\0\x09\x04\0![method]udp-so\ +cket.address-family\x01\x1f\x01j\x01}\x01\x05\x01@\x01\x04self\x13\0\x20\x04\0$[\ +method]udp-socket.unicast-hop-limit\x01!\x01@\x02\x04self\x13\x05value}\0\x15\x04\ +\0([method]udp-socket.set-unicast-hop-limit\x01\"\x01j\x01w\x01\x05\x01@\x01\x04\ +self\x13\0#\x04\0&[method]udp-socket.receive-buffer-size\x01$\x01@\x02\x04self\x13\ +\x05valuew\0\x15\x04\0*[method]udp-socket.set-receive-buffer-size\x01%\x04\0#[me\ +thod]udp-socket.send-buffer-size\x01$\x04\0'[method]udp-socket.set-send-buffer-s\ +ize\x01%\x01i\x01\x01@\x01\x04self\x13\0&\x04\0\x1c[method]udp-socket.subscribe\x01\ +'\x01h\x11\x01p\x0c\x01j\x01)\x01\x05\x01@\x02\x04self(\x0bmax-resultsw\0*\x04\0\ +([method]incoming-datagram-stream.receive\x01+\x01@\x01\x04self(\0&\x04\0*[metho\ +d]incoming-datagram-stream.subscribe\x01,\x01h\x12\x01@\x01\x04self-\0#\x04\0+[m\ +ethod]outgoing-datagram-stream.check-send\x01.\x01p\x0f\x01@\x02\x04self-\x09dat\ +agrams/\0#\x04\0%[method]outgoing-datagram-stream.send\x010\x01@\x01\x04self-\0&\ +\x04\0*[method]outgoing-datagram-stream.subscribe\x011\x04\x01\x16wasi:sockets/u\ +dp@0.2.0\x05K\x02\x03\05\x0audp-socket\x01B\x0c\x02\x03\x02\x01F\x04\0\x07networ\ +k\x03\0\0\x02\x03\x02\x01H\x04\0\x0aerror-code\x03\0\x02\x02\x03\x02\x01J\x04\0\x11\ +ip-address-family\x03\0\x04\x02\x03\x02\x01L\x04\0\x0audp-socket\x03\0\x06\x01i\x07\ +\x01j\x01\x08\x01\x03\x01@\x01\x0eaddress-family\x05\0\x09\x04\0\x11create-udp-s\ +ocket\x01\x0a\x04\x01$wasi:sockets/udp-create-socket@0.2.0\x05M\x01BT\x02\x03\x02\ +\x01\x0c\x04\0\x0cinput-stream\x03\0\0\x02\x03\x02\x01\x0a\x04\0\x0doutput-strea\ +m\x03\0\x02\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\x04\x02\x03\x02\x01\x18\x04\ +\0\x08duration\x03\0\x06\x02\x03\x02\x01F\x04\0\x07network\x03\0\x08\x02\x03\x02\ +\x01H\x04\0\x0aerror-code\x03\0\x0a\x02\x03\x02\x01I\x04\0\x11ip-socket-address\x03\ +\0\x0c\x02\x03\x02\x01J\x04\0\x11ip-address-family\x03\0\x0e\x01m\x03\x07receive\ +\x04send\x04both\x04\0\x0dshutdown-type\x03\0\x10\x04\0\x0atcp-socket\x03\x01\x01\ +h\x12\x01h\x09\x01j\0\x01\x0b\x01@\x03\x04self\x13\x07network\x14\x0dlocal-addre\ +ss\x0d\0\x15\x04\0\x1d[method]tcp-socket.start-bind\x01\x16\x01@\x01\x04self\x13\ +\0\x15\x04\0\x1e[method]tcp-socket.finish-bind\x01\x17\x01@\x03\x04self\x13\x07n\ +etwork\x14\x0eremote-address\x0d\0\x15\x04\0\x20[method]tcp-socket.start-connect\ +\x01\x18\x01i\x01\x01i\x03\x01o\x02\x19\x1a\x01j\x01\x1b\x01\x0b\x01@\x01\x04sel\ +f\x13\0\x1c\x04\0![method]tcp-socket.finish-connect\x01\x1d\x04\0\x1f[method]tcp\ +-socket.start-listen\x01\x17\x04\0\x20[method]tcp-socket.finish-listen\x01\x17\x01\ +i\x12\x01o\x03\x1e\x19\x1a\x01j\x01\x1f\x01\x0b\x01@\x01\x04self\x13\0\x20\x04\0\ +\x19[method]tcp-socket.accept\x01!\x01j\x01\x0d\x01\x0b\x01@\x01\x04self\x13\0\"\ +\x04\0\x20[method]tcp-socket.local-address\x01#\x04\0![method]tcp-socket.remote-\ +address\x01#\x01@\x01\x04self\x13\0\x7f\x04\0\x1f[method]tcp-socket.is-listening\ +\x01$\x01@\x01\x04self\x13\0\x0f\x04\0![method]tcp-socket.address-family\x01%\x01\ +@\x02\x04self\x13\x05valuew\0\x15\x04\0*[method]tcp-socket.set-listen-backlog-si\ +ze\x01&\x01j\x01\x7f\x01\x0b\x01@\x01\x04self\x13\0'\x04\0%[method]tcp-socket.ke\ +ep-alive-enabled\x01(\x01@\x02\x04self\x13\x05value\x7f\0\x15\x04\0)[method]tcp-\ +socket.set-keep-alive-enabled\x01)\x01j\x01\x07\x01\x0b\x01@\x01\x04self\x13\0*\x04\ +\0'[method]tcp-socket.keep-alive-idle-time\x01+\x01@\x02\x04self\x13\x05value\x07\ +\0\x15\x04\0+[method]tcp-socket.set-keep-alive-idle-time\x01,\x04\0&[method]tcp-\ +socket.keep-alive-interval\x01+\x04\0*[method]tcp-socket.set-keep-alive-interval\ +\x01,\x01j\x01y\x01\x0b\x01@\x01\x04self\x13\0-\x04\0#[method]tcp-socket.keep-al\ +ive-count\x01.\x01@\x02\x04self\x13\x05valuey\0\x15\x04\0'[method]tcp-socket.set\ +-keep-alive-count\x01/\x01j\x01}\x01\x0b\x01@\x01\x04self\x13\00\x04\0\x1c[metho\ +d]tcp-socket.hop-limit\x011\x01@\x02\x04self\x13\x05value}\0\x15\x04\0\x20[metho\ +d]tcp-socket.set-hop-limit\x012\x01j\x01w\x01\x0b\x01@\x01\x04self\x13\03\x04\0&\ +[method]tcp-socket.receive-buffer-size\x014\x04\0*[method]tcp-socket.set-receive\ +-buffer-size\x01&\x04\0#[method]tcp-socket.send-buffer-size\x014\x04\0'[method]t\ +cp-socket.set-send-buffer-size\x01&\x01i\x05\x01@\x01\x04self\x13\05\x04\0\x1c[m\ +ethod]tcp-socket.subscribe\x016\x01@\x02\x04self\x13\x0dshutdown-type\x11\0\x15\x04\ +\0\x1b[method]tcp-socket.shutdown\x017\x04\x01\x16wasi:sockets/tcp@0.2.0\x05N\x02\ +\x03\07\x0atcp-socket\x01B\x0c\x02\x03\x02\x01F\x04\0\x07network\x03\0\0\x02\x03\ +\x02\x01H\x04\0\x0aerror-code\x03\0\x02\x02\x03\x02\x01J\x04\0\x11ip-address-fam\ +ily\x03\0\x04\x02\x03\x02\x01O\x04\0\x0atcp-socket\x03\0\x06\x01i\x07\x01j\x01\x08\ +\x01\x03\x01@\x01\x0eaddress-family\x05\0\x09\x04\0\x11create-tcp-socket\x01\x0a\ +\x04\x01$wasi:sockets/tcp-create-socket@0.2.0\x05P\x02\x03\03\x0aip-address\x01B\ +\x16\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\0\x02\x03\x02\x01F\x04\0\x07net\ +work\x03\0\x02\x02\x03\x02\x01H\x04\0\x0aerror-code\x03\0\x04\x02\x03\x02\x01Q\x04\ +\0\x0aip-address\x03\0\x06\x04\0\x16resolve-address-stream\x03\x01\x01h\x08\x01k\ +\x07\x01j\x01\x0a\x01\x05\x01@\x01\x04self\x09\0\x0b\x04\03[method]resolve-addre\ +ss-stream.resolve-next-address\x01\x0c\x01i\x01\x01@\x01\x04self\x09\0\x0d\x04\0\ +([method]resolve-address-stream.subscribe\x01\x0e\x01h\x03\x01i\x08\x01j\x01\x10\ +\x01\x05\x01@\x02\x07network\x0f\x04names\0\x11\x04\0\x11resolve-addresses\x01\x12\ +\x04\x01!wasi:sockets/ip-name-lookup@0.2.0\x05R\x01B\xc0\x01\x02\x03\x02\x01\x18\ +\x04\0\x08duration\x03\0\0\x02\x03\x02\x01\x0c\x04\0\x0cinput-stream\x03\0\x02\x02\ +\x03\x02\x01\x0a\x04\0\x0doutput-stream\x03\0\x04\x02\x03\x02\x01\x08\x04\0\x08i\ +o-error\x03\0\x06\x02\x03\x02\x01\x01\x04\0\x08pollable\x03\0\x08\x01q\x0a\x03ge\ +t\0\0\x04head\0\0\x04post\0\0\x03put\0\0\x06delete\0\0\x07connect\0\0\x07options\ +\0\0\x05trace\0\0\x05patch\0\0\x05other\x01s\0\x04\0\x06method\x03\0\x0a\x01q\x03\ +\x04HTTP\0\0\x05HTTPS\0\0\x05other\x01s\0\x04\0\x06scheme\x03\0\x0c\x01ks\x01k{\x01\ +r\x02\x05rcode\x0e\x09info-code\x0f\x04\0\x11DNS-error-payload\x03\0\x10\x01k}\x01\ +r\x02\x08alert-id\x12\x0dalert-message\x0e\x04\0\x1aTLS-alert-received-payload\x03\ +\0\x13\x01ky\x01r\x02\x0afield-name\x0e\x0afield-size\x15\x04\0\x12field-size-pa\ +yload\x03\0\x16\x01kw\x01k\x17\x01q'\x0bDNS-timeout\0\0\x09DNS-error\x01\x11\0\x15\ +destination-not-found\0\0\x17destination-unavailable\0\0\x19destination-IP-prohi\ +bited\0\0\x19destination-IP-unroutable\0\0\x12connection-refused\0\0\x15connecti\ +on-terminated\0\0\x12connection-timeout\0\0\x17connection-read-timeout\0\0\x18co\ +nnection-write-timeout\0\0\x18connection-limit-reached\0\0\x12TLS-protocol-error\ +\0\0\x15TLS-certificate-error\0\0\x12TLS-alert-received\x01\x14\0\x13HTTP-reques\ +t-denied\0\0\x1cHTTP-request-length-required\0\0\x16HTTP-request-body-size\x01\x18\ +\0\x1bHTTP-request-method-invalid\0\0\x18HTTP-request-URI-invalid\0\0\x19HTTP-re\ +quest-URI-too-long\0\0\x20HTTP-request-header-section-size\x01\x15\0\x18HTTP-req\ +uest-header-size\x01\x19\0!HTTP-request-trailer-section-size\x01\x15\0\x19HTTP-r\ +equest-trailer-size\x01\x17\0\x18HTTP-response-incomplete\0\0!HTTP-response-head\ +er-section-size\x01\x15\0\x19HTTP-response-header-size\x01\x17\0\x17HTTP-respons\ +e-body-size\x01\x18\0\"HTTP-response-trailer-section-size\x01\x15\0\x1aHTTP-resp\ +onse-trailer-size\x01\x17\0\x1dHTTP-response-transfer-coding\x01\x0e\0\x1cHTTP-r\ +esponse-content-coding\x01\x0e\0\x15HTTP-response-timeout\0\0\x13HTTP-upgrade-fa\ +iled\0\0\x13HTTP-protocol-error\0\0\x0dloop-detected\0\0\x13configuration-error\0\ +\0\x0einternal-error\x01\x0e\0\x04\0\x0aerror-code\x03\0\x1a\x01q\x03\x0einvalid\ +-syntax\0\0\x09forbidden\0\0\x09immutable\0\0\x04\0\x0cheader-error\x03\0\x1c\x01\ +s\x04\0\x09field-key\x03\0\x1e\x01p}\x04\0\x0bfield-value\x03\0\x20\x04\0\x06fie\ +lds\x03\x01\x04\0\x07headers\x03\0\"\x04\0\x08trailers\x03\0\"\x04\0\x10incoming\ +-request\x03\x01\x04\0\x10outgoing-request\x03\x01\x04\0\x0frequest-options\x03\x01\ +\x04\0\x11response-outparam\x03\x01\x01{\x04\0\x0bstatus-code\x03\0)\x04\0\x11in\ +coming-response\x03\x01\x04\0\x0dincoming-body\x03\x01\x04\0\x0ffuture-trailers\x03\ +\x01\x04\0\x11outgoing-response\x03\x01\x04\0\x0doutgoing-body\x03\x01\x04\0\x18\ +future-incoming-response\x03\x01\x01i\"\x01@\0\01\x04\0\x13[constructor]fields\x01\ +2\x01o\x02\x1f!\x01p3\x01j\x011\x01\x1d\x01@\x01\x07entries4\05\x04\0\x18[static\ +]fields.from-list\x016\x01h\"\x01p!\x01@\x02\x04self7\x04name\x1f\08\x04\0\x12[m\ +ethod]fields.get\x019\x01@\x02\x04self7\x04name\x1f\0\x7f\x04\0\x12[method]field\ +s.has\x01:\x01j\0\x01\x1d\x01@\x03\x04self7\x04name\x1f\x05value8\0;\x04\0\x12[m\ +ethod]fields.set\x01<\x01@\x02\x04self7\x04name\x1f\0;\x04\0\x15[method]fields.d\ +elete\x01=\x01@\x03\x04self7\x04name\x1f\x05value!\0;\x04\0\x15[method]fields.ap\ +pend\x01>\x01@\x01\x04self7\04\x04\0\x16[method]fields.entries\x01?\x01@\x01\x04\ +self7\01\x04\0\x14[method]fields.clone\x01@\x01h%\x01@\x01\x04self\xc1\0\0\x0b\x04\ +\0\x1f[method]incoming-request.method\x01B\x01@\x01\x04self\xc1\0\0\x0e\x04\0([m\ +ethod]incoming-request.path-with-query\x01C\x01k\x0d\x01@\x01\x04self\xc1\0\0\xc4\ +\0\x04\0\x1f[method]incoming-request.scheme\x01E\x04\0\"[method]incoming-request\ +.authority\x01C\x01i#\x01@\x01\x04self\xc1\0\0\xc6\0\x04\0\x20[method]incoming-r\ +equest.headers\x01G\x01i,\x01j\x01\xc8\0\0\x01@\x01\x04self\xc1\0\0\xc9\0\x04\0\x20\ +[method]incoming-request.consume\x01J\x01i&\x01@\x01\x07headers\xc6\0\0\xcb\0\x04\ +\0\x1d[constructor]outgoing-request\x01L\x01h&\x01i/\x01j\x01\xce\0\0\x01@\x01\x04\ +self\xcd\0\0\xcf\0\x04\0\x1d[method]outgoing-request.body\x01P\x01@\x01\x04self\xcd\ +\0\0\x0b\x04\0\x1f[method]outgoing-request.method\x01Q\x01j\0\0\x01@\x02\x04self\ +\xcd\0\x06method\x0b\0\xd2\0\x04\0#[method]outgoing-request.set-method\x01S\x01@\ +\x01\x04self\xcd\0\0\x0e\x04\0([method]outgoing-request.path-with-query\x01T\x01\ +@\x02\x04self\xcd\0\x0fpath-with-query\x0e\0\xd2\0\x04\0,[method]outgoing-reques\ +t.set-path-with-query\x01U\x01@\x01\x04self\xcd\0\0\xc4\0\x04\0\x1f[method]outgo\ +ing-request.scheme\x01V\x01@\x02\x04self\xcd\0\x06scheme\xc4\0\0\xd2\0\x04\0#[me\ +thod]outgoing-request.set-scheme\x01W\x04\0\"[method]outgoing-request.authority\x01\ +T\x01@\x02\x04self\xcd\0\x09authority\x0e\0\xd2\0\x04\0&[method]outgoing-request\ +.set-authority\x01X\x01@\x01\x04self\xcd\0\0\xc6\0\x04\0\x20[method]outgoing-req\ +uest.headers\x01Y\x01i'\x01@\0\0\xda\0\x04\0\x1c[constructor]request-options\x01\ +[\x01h'\x01k\x01\x01@\x01\x04self\xdc\0\0\xdd\0\x04\0'[method]request-options.co\ +nnect-timeout\x01^\x01@\x02\x04self\xdc\0\x08duration\xdd\0\0\xd2\0\x04\0+[metho\ +d]request-options.set-connect-timeout\x01_\x04\0*[method]request-options.first-b\ +yte-timeout\x01^\x04\0.[method]request-options.set-first-byte-timeout\x01_\x04\0\ +-[method]request-options.between-bytes-timeout\x01^\x04\01[method]request-option\ +s.set-between-bytes-timeout\x01_\x01i(\x01i.\x01j\x01\xe1\0\x01\x1b\x01@\x02\x05\ +param\xe0\0\x08response\xe2\0\x01\0\x04\0\x1d[static]response-outparam.set\x01c\x01\ +h+\x01@\x01\x04self\xe4\0\0*\x04\0\x20[method]incoming-response.status\x01e\x01@\ +\x01\x04self\xe4\0\0\xc6\0\x04\0![method]incoming-response.headers\x01f\x01@\x01\ +\x04self\xe4\0\0\xc9\0\x04\0![method]incoming-response.consume\x01g\x01h,\x01i\x03\ +\x01j\x01\xe9\0\0\x01@\x01\x04self\xe8\0\0\xea\0\x04\0\x1c[method]incoming-body.\ +stream\x01k\x01i-\x01@\x01\x04this\xc8\0\0\xec\0\x04\0\x1c[static]incoming-body.\ +finish\x01m\x01h-\x01i\x09\x01@\x01\x04self\xee\0\0\xef\0\x04\0![method]future-t\ +railers.subscribe\x01p\x01i$\x01k\xf1\0\x01j\x01\xf2\0\x01\x1b\x01j\x01\xf3\0\0\x01\ +k\xf4\0\x01@\x01\x04self\xee\0\0\xf5\0\x04\0\x1b[method]future-trailers.get\x01v\ +\x01@\x01\x07headers\xc6\0\0\xe1\0\x04\0\x1e[constructor]outgoing-response\x01w\x01\ +h.\x01@\x01\x04self\xf8\0\0*\x04\0%[method]outgoing-response.status-code\x01y\x01\ +@\x02\x04self\xf8\0\x0bstatus-code*\0\xd2\0\x04\0)[method]outgoing-response.set-\ +status-code\x01z\x01@\x01\x04self\xf8\0\0\xc6\0\x04\0![method]outgoing-response.\ +headers\x01{\x01@\x01\x04self\xf8\0\0\xcf\0\x04\0\x1e[method]outgoing-response.b\ +ody\x01|\x01h/\x01i\x05\x01j\x01\xfe\0\0\x01@\x01\x04self\xfd\0\0\xff\0\x04\0\x1b\ +[method]outgoing-body.write\x01\x80\x01\x01j\0\x01\x1b\x01@\x02\x04this\xce\0\x08\ +trailers\xf2\0\0\x81\x01\x04\0\x1c[static]outgoing-body.finish\x01\x82\x01\x01h0\ +\x01@\x01\x04self\x83\x01\0\xef\0\x04\0*[method]future-incoming-response.subscri\ +be\x01\x84\x01\x01i+\x01j\x01\x85\x01\x01\x1b\x01j\x01\x86\x01\0\x01k\x87\x01\x01\ +@\x01\x04self\x83\x01\0\x88\x01\x04\0$[method]future-incoming-response.get\x01\x89\ +\x01\x01h\x07\x01k\x1b\x01@\x01\x03err\x8a\x01\0\x8b\x01\x04\0\x0fhttp-error-cod\ +e\x01\x8c\x01\x04\x01\x15wasi:http/types@0.2.0\x05S\x02\x03\0:\x10outgoing-reque\ +st\x02\x03\0:\x0frequest-options\x02\x03\0:\x18future-incoming-response\x02\x03\0\ +:\x0aerror-code\x01B\x0f\x02\x03\x02\x01T\x04\0\x10outgoing-request\x03\0\0\x02\x03\ +\x02\x01U\x04\0\x0frequest-options\x03\0\x02\x02\x03\x02\x01V\x04\0\x18future-in\ +coming-response\x03\0\x04\x02\x03\x02\x01W\x04\0\x0aerror-code\x03\0\x06\x01i\x01\ +\x01i\x03\x01k\x09\x01i\x05\x01j\x01\x0b\x01\x07\x01@\x02\x07request\x08\x07opti\ +ons\x0a\0\x0c\x04\0\x06handle\x01\x0d\x04\x01\x20wasi:http/outgoing-handler@0.2.\ +0\x05X\x02\x03\0:\x11outgoing-response\x01B\x07\x02\x03\x02\x01Y\x04\0\x11outgoi\ +ng-response\x03\0\0\x01i\x01\x01q\x02\x04echo\0\0\x08response\x01\x02\0\x04\0\x10\ +response-handler\x03\0\x03\x01@\x02\x03urls\x08response\x04\x01\0\x04\0\x0cset-r\ +esponse\x01\x05\x04\x01#fermyon:spin-wasi-virt/http-handler\x05Z\x02\x03\0:\x10i\ +ncoming-request\x02\x03\0:\x11incoming-response\x02\x03\0:\x11response-outparam\x02\ +\x03\0:\x0dincoming-body\x01B\x1f\x02\x03\x02\x01[\x04\0\x10incoming-request\x03\ +\0\0\x02\x03\x02\x01\\\x04\0\x11incoming-response\x03\0\x02\x02\x03\x02\x01Y\x04\ +\0\x11outgoing-response\x03\0\x04\x02\x03\x02\x01T\x04\0\x10outgoing-request\x03\ +\0\x06\x02\x03\x02\x01]\x04\0\x11response-outparam\x03\0\x08\x02\x03\x02\x01V\x04\ +\0\x18future-incoming-response\x03\0\x0a\x02\x03\x02\x01^\x04\0\x0dincoming-body\ +\x03\0\x0c\x04\0\x11response-receiver\x03\x01\x01h\x0e\x01i\x03\x01k\x10\x01@\x01\ +\x04self\x0f\0\x11\x04\0\x1d[method]response-receiver.get\x01\x12\x01i\x07\x01i\x0d\ +\x01k\x14\x01i\x01\x01@\x02\x07request\x13\x0dincoming-body\x15\0\x16\x04\0\x0bn\ +ew-request\x01\x17\x01i\x09\x01i\x0e\x01o\x02\x18\x19\x01@\0\0\x1a\x04\0\x0cnew-\ +response\x01\x1b\x04\x01\"fermyon:spin-wasi-virt/http-helper\x05_\x01B\x03\x01p}\ +\x01@\x02\x04paths\x08contents\0\x01\0\x04\0\x08add-file\x01\x01\x04\x01!fermyon\ +:spin-wasi-virt/fs-handler\x05`\x04\x01\x1afermyon:spin-test-virt/env\x04\0\x0b\x09\ +\x01\0\x03env\x03\0\0\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-component\x07\ +0.208.1\x10wit-bindgen-rust\x060.25.0"; #[inline(never)] #[doc(hidden)] diff --git a/crates/spin-test-virt/src/lib.rs b/crates/spin-test-virt/src/lib.rs index 0917f35..e440162 100644 --- a/crates/spin-test-virt/src/lib.rs +++ b/crates/spin-test-virt/src/lib.rs @@ -6,7 +6,7 @@ mod manifest; mod wasi; use std::{ - cell::LazyCell, + cell::{LazyCell, RefCell}, collections::{HashMap, HashSet}, sync::{Arc, Mutex, OnceLock, RwLock}, }; @@ -702,20 +702,35 @@ thread_local! { .map(|(k, v)| (k.to_string(), v)), ) .unwrap(); - resolver.add_provider(Box::new(TestProvider)); + resolver.add_provider(Box::new(UserGivenProvider)); Ok(resolver) }); + + /// The user-defined variables. + /// + /// These are the application variables the user is supposed to provide. + static USER_DEFINED_VARIABLES: LazyCell>> = LazyCell::new(|| { + RefCell::new(HashMap::new()) + }); } -/// A variable provider for testing. +/// A variable provider populated through the `fermyon:spin-test-virt/variable` interface. #[derive(Debug)] -struct TestProvider; +struct UserGivenProvider; #[async_trait::async_trait] -impl spin_expressions::Provider for TestProvider { - async fn get(&self, _key: &spin_expressions::Key) -> anyhow::Result> { - Ok(Some("test".to_string())) +impl spin_expressions::Provider for UserGivenProvider { + async fn get(&self, key: &spin_expressions::Key) -> anyhow::Result> { + Ok(USER_DEFINED_VARIABLES.with(|vars| vars.borrow().get(key.as_str()).cloned())) + } +} + +impl spin_test_virt::variables::Guest for Component { + fn set(key: String, value: String) { + USER_DEFINED_VARIABLES.with(|vars| { + vars.borrow_mut().insert(key, value); + }); } } diff --git a/host-wit/deps/spin-test-virt/world.wit b/host-wit/deps/spin-test-virt/world.wit index 1db574e..bd4844c 100644 --- a/host-wit/deps/spin-test-virt/world.wit +++ b/host-wit/deps/spin-test-virt/world.wit @@ -17,12 +17,18 @@ world env { // Handles for configuring the environment export key-value; export sqlite; + export variables; // Helper functions export set-component-id: func(component-id: string); import get-manifest: func() -> string; } +/// Interface for configuring variables +interface variables { + set: func(key: string, value: string); +} + /// Interface for configuring the behavior of `fermyon:spin/sqlite` interface interface sqlite { use fermyon:spin/sqlite@2.0.0.{value, query-result, error}; diff --git a/host-wit/world.wit b/host-wit/world.wit index ca803e8..55adc31 100644 --- a/host-wit/world.wit +++ b/host-wit/world.wit @@ -4,6 +4,7 @@ package fermyon:spin-test; world test-imports { import fermyon:spin-test-virt/key-value; import fermyon:spin-test-virt/sqlite; + import fermyon:spin-test-virt/variables; import fermyon:spin-wasi-virt/http-handler; import wasi:http/incoming-handler@0.2.0; import http-helper; diff --git a/src/lib.rs b/src/lib.rs index 077f1c0..96de162 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -146,6 +146,7 @@ fn instantiate_test( "fermyon:spin/sqlite@2.0.0", "fermyon:spin-test-virt/sqlite", "fermyon:spin-test-virt/key-value", + "fermyon:spin-test-virt/variables", "fermyon:spin/key-value@2.0.0", "wasi:io/error@0.2.0", "wasi:io/streams@0.2.0",