diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e4f0e2f..e93ccd0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,8 +14,6 @@ jobs: steps: - uses: actions/checkout@v6 - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - target: wasm32-unknown-unknown,wasm32-wasip2 - name: Install cargo binstall uses: cargo-bins/cargo-binstall@main - name: Install cargo component @@ -67,10 +65,6 @@ jobs: steps: - uses: actions/checkout@v6 - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: stable - components: rustfmt - target: wasm32-unknown-unknown - name: Install cargo binstall uses: cargo-bins/cargo-binstall@main - name: Install wkg diff --git a/README.md b/README.md index 9aea4b9..4dfb07c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ A WASM component client for Valkey (and Redis). ## Build Prereqs: -- a rust toolchain with `wasm32-unknown-unknown` and `wasm32-wasip2` targets (`rustup target add wasm32-unknown-unknown` and `rustup target add wasm32-wasip2`) +- a rust toolchain - [`cargo component`](https://github.com/bytecodealliance/cargo-component) - [`wac`](https://github.com/bytecodealliance/wac) - [`wkg`](https://github.com/bytecodealliance/wasm-pkg-tools) diff --git a/components/wit/deps/wasi-cli-0.2.3/package.wit b/components/wit/deps/wasi-cli-0.2.6/package.wit similarity index 71% rename from components/wit/deps/wasi-cli-0.2.3/package.wit rename to components/wit/deps/wasi-cli-0.2.6/package.wit index b86dfec..d7a3ca4 100644 --- a/components/wit/deps/wasi-cli-0.2.3/package.wit +++ b/components/wit/deps/wasi-cli-0.2.6/package.wit @@ -1,4 +1,4 @@ -package wasi:cli@0.2.3; +package wasi:cli@0.2.6; @since(version = 0.2.0) interface environment { @@ -28,6 +28,17 @@ interface exit { /// Exit the current instance and any linked instances. @since(version = 0.2.0) exit: func(status: result); + + /// Exit the current instance and any linked instances, reporting the + /// specified status code to the host. + /// + /// The meaning of the code depends on the context, with 0 usually meaning + /// "success", and other values indicating various types of failure. + /// + /// This function does not return; the effect is analogous to a trap, but + /// without the connotation that something bad has happened. + @unstable(feature = cli-exit-with-code) + exit-with-code: func(status-code: u8); } @since(version = 0.2.0) @@ -40,7 +51,7 @@ interface run { @since(version = 0.2.0) interface stdin { @since(version = 0.2.0) - use wasi:io/streams@0.2.3.{input-stream}; + use wasi:io/streams@0.2.6.{input-stream}; @since(version = 0.2.0) get-stdin: func() -> input-stream; @@ -49,7 +60,7 @@ interface stdin { @since(version = 0.2.0) interface stdout { @since(version = 0.2.0) - use wasi:io/streams@0.2.3.{output-stream}; + use wasi:io/streams@0.2.6.{output-stream}; @since(version = 0.2.0) get-stdout: func() -> output-stream; @@ -58,7 +69,7 @@ interface stdout { @since(version = 0.2.0) interface stderr { @since(version = 0.2.0) - use wasi:io/streams@0.2.3.{output-stream}; + use wasi:io/streams@0.2.6.{output-stream}; @since(version = 0.2.0) get-stderr: func() -> output-stream; @@ -134,11 +145,11 @@ world imports { @since(version = 0.2.0) import exit; @since(version = 0.2.0) - import wasi:io/error@0.2.3; + import wasi:io/error@0.2.6; @since(version = 0.2.0) - import wasi:io/poll@0.2.3; + import wasi:io/poll@0.2.6; @since(version = 0.2.0) - import wasi:io/streams@0.2.3; + import wasi:io/streams@0.2.6; @since(version = 0.2.0) import stdin; @since(version = 0.2.0) @@ -156,33 +167,35 @@ world imports { @since(version = 0.2.0) import terminal-stderr; @since(version = 0.2.0) - import wasi:clocks/monotonic-clock@0.2.3; + import wasi:clocks/monotonic-clock@0.2.6; @since(version = 0.2.0) - import wasi:clocks/wall-clock@0.2.3; + import wasi:clocks/wall-clock@0.2.6; + @unstable(feature = clocks-timezone) + import wasi:clocks/timezone@0.2.6; @since(version = 0.2.0) - import wasi:filesystem/types@0.2.3; + import wasi:filesystem/types@0.2.6; @since(version = 0.2.0) - import wasi:filesystem/preopens@0.2.3; + import wasi:filesystem/preopens@0.2.6; @since(version = 0.2.0) - import wasi:sockets/network@0.2.3; + import wasi:sockets/network@0.2.6; @since(version = 0.2.0) - import wasi:sockets/instance-network@0.2.3; + import wasi:sockets/instance-network@0.2.6; @since(version = 0.2.0) - import wasi:sockets/udp@0.2.3; + import wasi:sockets/udp@0.2.6; @since(version = 0.2.0) - import wasi:sockets/udp-create-socket@0.2.3; + import wasi:sockets/udp-create-socket@0.2.6; @since(version = 0.2.0) - import wasi:sockets/tcp@0.2.3; + import wasi:sockets/tcp@0.2.6; @since(version = 0.2.0) - import wasi:sockets/tcp-create-socket@0.2.3; + import wasi:sockets/tcp-create-socket@0.2.6; @since(version = 0.2.0) - import wasi:sockets/ip-name-lookup@0.2.3; + import wasi:sockets/ip-name-lookup@0.2.6; @since(version = 0.2.0) - import wasi:random/random@0.2.3; + import wasi:random/random@0.2.6; @since(version = 0.2.0) - import wasi:random/insecure@0.2.3; + import wasi:random/insecure@0.2.6; @since(version = 0.2.0) - import wasi:random/insecure-seed@0.2.3; + import wasi:random/insecure-seed@0.2.6; } @since(version = 0.2.0) world command { @@ -191,11 +204,11 @@ world command { @since(version = 0.2.0) import exit; @since(version = 0.2.0) - import wasi:io/error@0.2.3; + import wasi:io/error@0.2.6; @since(version = 0.2.0) - import wasi:io/poll@0.2.3; + import wasi:io/poll@0.2.6; @since(version = 0.2.0) - import wasi:io/streams@0.2.3; + import wasi:io/streams@0.2.6; @since(version = 0.2.0) import stdin; @since(version = 0.2.0) @@ -213,33 +226,35 @@ world command { @since(version = 0.2.0) import terminal-stderr; @since(version = 0.2.0) - import wasi:clocks/monotonic-clock@0.2.3; + import wasi:clocks/monotonic-clock@0.2.6; @since(version = 0.2.0) - import wasi:clocks/wall-clock@0.2.3; + import wasi:clocks/wall-clock@0.2.6; + @unstable(feature = clocks-timezone) + import wasi:clocks/timezone@0.2.6; @since(version = 0.2.0) - import wasi:filesystem/types@0.2.3; + import wasi:filesystem/types@0.2.6; @since(version = 0.2.0) - import wasi:filesystem/preopens@0.2.3; + import wasi:filesystem/preopens@0.2.6; @since(version = 0.2.0) - import wasi:sockets/network@0.2.3; + import wasi:sockets/network@0.2.6; @since(version = 0.2.0) - import wasi:sockets/instance-network@0.2.3; + import wasi:sockets/instance-network@0.2.6; @since(version = 0.2.0) - import wasi:sockets/udp@0.2.3; + import wasi:sockets/udp@0.2.6; @since(version = 0.2.0) - import wasi:sockets/udp-create-socket@0.2.3; + import wasi:sockets/udp-create-socket@0.2.6; @since(version = 0.2.0) - import wasi:sockets/tcp@0.2.3; + import wasi:sockets/tcp@0.2.6; @since(version = 0.2.0) - import wasi:sockets/tcp-create-socket@0.2.3; + import wasi:sockets/tcp-create-socket@0.2.6; @since(version = 0.2.0) - import wasi:sockets/ip-name-lookup@0.2.3; + import wasi:sockets/ip-name-lookup@0.2.6; @since(version = 0.2.0) - import wasi:random/random@0.2.3; + import wasi:random/random@0.2.6; @since(version = 0.2.0) - import wasi:random/insecure@0.2.3; + import wasi:random/insecure@0.2.6; @since(version = 0.2.0) - import wasi:random/insecure-seed@0.2.3; + import wasi:random/insecure-seed@0.2.6; @since(version = 0.2.0) export run; diff --git a/components/wit/deps/wasi-clocks-0.2.3/package.wit b/components/wit/deps/wasi-clocks-0.2.6/package.wit similarity index 55% rename from components/wit/deps/wasi-clocks-0.2.3/package.wit rename to components/wit/deps/wasi-clocks-0.2.6/package.wit index 92f2662..7004aa8 100644 --- a/components/wit/deps/wasi-clocks-0.2.3/package.wit +++ b/components/wit/deps/wasi-clocks-0.2.6/package.wit @@ -1,7 +1,7 @@ -package wasi:clocks@0.2.3; +package wasi:clocks@0.2.6; interface monotonic-clock { - use wasi:io/poll@0.2.3.{pollable}; + use wasi:io/poll@0.2.6.{pollable}; type instant = u64; @@ -27,3 +27,17 @@ interface wall-clock { resolution: func() -> datetime; } +interface timezone { + use wall-clock.{datetime}; + + record timezone-display { + utc-offset: s32, + name: string, + in-daylight-saving-time: bool, + } + + display: func(when: datetime) -> timezone-display; + + utc-offset: func(when: datetime) -> s32; +} + diff --git a/components/wit/deps/wasi-filesystem-0.2.3/package.wit b/components/wit/deps/wasi-filesystem-0.2.6/package.wit similarity index 96% rename from components/wit/deps/wasi-filesystem-0.2.3/package.wit rename to components/wit/deps/wasi-filesystem-0.2.6/package.wit index 1111df1..78bbb1e 100644 --- a/components/wit/deps/wasi-filesystem-0.2.3/package.wit +++ b/components/wit/deps/wasi-filesystem-0.2.6/package.wit @@ -1,8 +1,8 @@ -package wasi:filesystem@0.2.3; +package wasi:filesystem@0.2.6; interface types { - use wasi:io/streams@0.2.3.{input-stream, output-stream, error}; - use wasi:clocks/wall-clock@0.2.3.{datetime}; + use wasi:io/streams@0.2.6.{input-stream, output-stream, error}; + use wasi:clocks/wall-clock@0.2.6.{datetime}; type filesize = u64; diff --git a/components/wit/deps/wasi-http-0.2.3/package.wit b/components/wit/deps/wasi-http-0.2.6/package.wit similarity index 94% rename from components/wit/deps/wasi-http-0.2.3/package.wit rename to components/wit/deps/wasi-http-0.2.6/package.wit index 932f089..eb1b25f 100644 --- a/components/wit/deps/wasi-http-0.2.3/package.wit +++ b/components/wit/deps/wasi-http-0.2.6/package.wit @@ -1,4 +1,4 @@ -package wasi:http@0.2.3; +package wasi:http@0.2.6; /// This interface defines all of the types and methods for implementing /// HTTP Requests and Responses, both incoming and outgoing, as well as @@ -6,13 +6,13 @@ package wasi:http@0.2.3; @since(version = 0.2.0) interface types { @since(version = 0.2.0) - use wasi:clocks/monotonic-clock@0.2.3.{duration}; + use wasi:clocks/monotonic-clock@0.2.6.{duration}; @since(version = 0.2.0) - use wasi:io/streams@0.2.3.{input-stream, output-stream}; + use wasi:io/streams@0.2.6.{input-stream, output-stream}; @since(version = 0.2.0) - use wasi:io/error@0.2.3.{error as io-error}; + use wasi:io/error@0.2.6.{error as io-error}; @since(version = 0.2.0) - use wasi:io/poll@0.2.3.{pollable}; + use wasi:io/poll@0.2.6.{pollable}; /// This type corresponds to HTTP standard Methods. @since(version = 0.2.0) @@ -59,7 +59,7 @@ interface types { } /// These cases are inspired by the IANA HTTP Proxy Error Types: - /// + /// @since(version = 0.2.0) variant error-code { DNS-timeout, @@ -156,7 +156,7 @@ interface types { /// A `fields` may be mutable or immutable. A `fields` created using the /// constructor, `from-list`, or `clone` will be mutable, but a `fields` /// resource given by other means (including, but not limited to, - /// `incoming-request.headers`, `outgoing-request.headers`) might be be + /// `incoming-request.headers`, `outgoing-request.headers`) might be /// immutable. In an immutable fields, the `set`, `append`, and `delete` /// operations will fail with `header-error.immutable`. @since(version = 0.2.0) @@ -389,6 +389,18 @@ interface types { /// other argument to `incoming-handler.handle`. @since(version = 0.2.0) resource response-outparam { + /// Send an HTTP 1xx response. + /// + /// Unlike `response-outparam.set`, this does not consume the + /// `response-outparam`, allowing the guest to send an arbitrary number of + /// informational responses before sending the final response using + /// `response-outparam.set`. + /// + /// This will return an `HTTP-protocol-error` if `status` is not in the + /// range [100-199], or an `internal-error` if the implementation does not + /// support informational responses. + @unstable(feature = informational-outbound-responses) + send-informational: func(status: u16, headers: headers) -> result<_, error-code>; /// Set the value of the `response-outparam` to either send a response, /// or indicate an error. /// @@ -665,23 +677,23 @@ interface outgoing-handler { @since(version = 0.2.0) world imports { @since(version = 0.2.0) - import wasi:io/poll@0.2.3; + import wasi:io/poll@0.2.6; @since(version = 0.2.0) - import wasi:clocks/monotonic-clock@0.2.3; + import wasi:clocks/monotonic-clock@0.2.6; @since(version = 0.2.0) - import wasi:clocks/wall-clock@0.2.3; + import wasi:clocks/wall-clock@0.2.6; @since(version = 0.2.0) - import wasi:random/random@0.2.3; + import wasi:random/random@0.2.6; @since(version = 0.2.0) - import wasi:io/error@0.2.3; + import wasi:io/error@0.2.6; @since(version = 0.2.0) - import wasi:io/streams@0.2.3; + import wasi:io/streams@0.2.6; @since(version = 0.2.0) - import wasi:cli/stdout@0.2.3; + import wasi:cli/stdout@0.2.6; @since(version = 0.2.0) - import wasi:cli/stderr@0.2.3; + import wasi:cli/stderr@0.2.6; @since(version = 0.2.0) - import wasi:cli/stdin@0.2.3; + import wasi:cli/stdin@0.2.6; @since(version = 0.2.0) import types; @since(version = 0.2.0) @@ -694,23 +706,23 @@ world imports { @since(version = 0.2.0) world proxy { @since(version = 0.2.0) - import wasi:io/poll@0.2.3; + import wasi:io/poll@0.2.6; @since(version = 0.2.0) - import wasi:clocks/monotonic-clock@0.2.3; + import wasi:clocks/monotonic-clock@0.2.6; @since(version = 0.2.0) - import wasi:clocks/wall-clock@0.2.3; + import wasi:clocks/wall-clock@0.2.6; @since(version = 0.2.0) - import wasi:random/random@0.2.3; + import wasi:random/random@0.2.6; @since(version = 0.2.0) - import wasi:io/error@0.2.3; + import wasi:io/error@0.2.6; @since(version = 0.2.0) - import wasi:io/streams@0.2.3; + import wasi:io/streams@0.2.6; @since(version = 0.2.0) - import wasi:cli/stdout@0.2.3; + import wasi:cli/stdout@0.2.6; @since(version = 0.2.0) - import wasi:cli/stderr@0.2.3; + import wasi:cli/stderr@0.2.6; @since(version = 0.2.0) - import wasi:cli/stdin@0.2.3; + import wasi:cli/stdin@0.2.6; @since(version = 0.2.0) import types; @since(version = 0.2.0) diff --git a/components/wit/deps/wasi-io-0.2.3/package.wit b/components/wit/deps/wasi-io-0.2.6/package.wit similarity index 98% rename from components/wit/deps/wasi-io-0.2.3/package.wit rename to components/wit/deps/wasi-io-0.2.6/package.wit index adcf1f4..72fefbe 100644 --- a/components/wit/deps/wasi-io-0.2.3/package.wit +++ b/components/wit/deps/wasi-io-0.2.6/package.wit @@ -1,4 +1,10 @@ -package wasi:io@0.2.3; +package wasi:io@0.2.6; + +interface error { + resource error { + to-debug-string: func() -> string; + } +} interface poll { resource pollable { @@ -9,12 +15,6 @@ interface poll { poll: func(in: list>) -> list; } -interface error { - resource error { - to-debug-string: func() -> string; - } -} - interface streams { use error.{error}; use poll.{pollable}; diff --git a/components/wit/deps/wasi-random-0.2.3/package.wit b/components/wit/deps/wasi-random-0.2.6/package.wit similarity index 91% rename from components/wit/deps/wasi-random-0.2.3/package.wit rename to components/wit/deps/wasi-random-0.2.6/package.wit index bc1f891..7adcffa 100644 --- a/components/wit/deps/wasi-random-0.2.3/package.wit +++ b/components/wit/deps/wasi-random-0.2.6/package.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.3; +package wasi:random@0.2.6; interface random { get-random-bytes: func(len: u64) -> list; diff --git a/components/wit/deps/wasi-sockets-0.2.3/package.wit b/components/wit/deps/wasi-sockets-0.2.6/package.wit similarity index 96% rename from components/wit/deps/wasi-sockets-0.2.3/package.wit rename to components/wit/deps/wasi-sockets-0.2.6/package.wit index 42af96a..db6d1a2 100644 --- a/components/wit/deps/wasi-sockets-0.2.3/package.wit +++ b/components/wit/deps/wasi-sockets-0.2.6/package.wit @@ -1,7 +1,10 @@ -package wasi:sockets@0.2.3; +package wasi:sockets@0.2.6; @since(version = 0.2.0) interface network { + @unstable(feature = network-error-code) + use wasi:io/error@0.2.6.{error}; + /// An opaque resource that represents access to (a subset of) the network. /// This enables context-based security for networking. /// There is no need for this to map 1:1 to a physical network interface. @@ -128,6 +131,19 @@ interface network { ipv4(ipv4-socket-address), ipv6(ipv6-socket-address), } + + /// Attempts to extract a network-related `error-code` from the stream + /// `error` provided. + /// + /// Stream operations which return `stream-error::last-operation-failed` + /// have a payload with more information about the operation that failed. + /// This payload can be passed through to this function to see if there's + /// network-related information about the error to return. + /// + /// Note that this function is fallible because not all stream-related + /// errors are network-related errors. + @unstable(feature = network-error-code) + network-error-code: func(err: borrow) -> option; } /// This interface provides a value-export of the default network handle.. @@ -144,7 +160,7 @@ interface instance-network { @since(version = 0.2.0) interface ip-name-lookup { @since(version = 0.2.0) - use wasi:io/poll@0.2.3.{pollable}; + use wasi:io/poll@0.2.6.{pollable}; @since(version = 0.2.0) use network.{network, error-code, ip-address}; @@ -200,11 +216,11 @@ interface ip-name-lookup { @since(version = 0.2.0) interface tcp { @since(version = 0.2.0) - use wasi:io/streams@0.2.3.{input-stream, output-stream}; + use wasi:io/streams@0.2.6.{input-stream, output-stream}; @since(version = 0.2.0) - use wasi:io/poll@0.2.3.{pollable}; + use wasi:io/poll@0.2.6.{pollable}; @since(version = 0.2.0) - use wasi:clocks/monotonic-clock@0.2.3.{duration}; + use wasi:clocks/monotonic-clock@0.2.6.{duration}; @since(version = 0.2.0) use network.{network, error-code, ip-socket-address, ip-address-family}; @@ -542,11 +558,11 @@ interface tcp { /// Initiate a graceful shutdown. /// /// - `receive`: The socket is not expecting to receive any data from - /// the peer. The `input-stream` associated with this socket will be - /// closed. Any data still in the receive queue at time of calling - /// this method will be discarded. + /// the peer. The `input-stream` associated with this socket will be + /// closed. Any data still in the receive queue at time of calling + /// this method will be discarded. /// - `send`: The socket has no more data to send to the peer. The `output-stream` - /// associated with this socket will be closed and a FIN packet will be sent. + /// associated with this socket will be closed and a FIN packet will be sent. /// - `both`: Same effect as `receive` & `send` combined. /// /// This function is idempotent; shutting down a direction more than once @@ -601,7 +617,7 @@ interface tcp-create-socket { @since(version = 0.2.0) interface udp { @since(version = 0.2.0) - use wasi:io/poll@0.2.3.{pollable}; + use wasi:io/poll@0.2.6.{pollable}; @since(version = 0.2.0) use network.{network, error-code, ip-socket-address, ip-address-family}; @@ -685,10 +701,10 @@ interface udp { /// The POSIX equivalent in pseudo-code is: /// ```text /// if (was previously connected) { - /// connect(s, AF_UNSPEC) + /// connect(s, AF_UNSPEC) /// } /// if (remote_address is Some) { - /// connect(s, remote_address) + /// connect(s, remote_address) /// } /// ``` /// @@ -908,22 +924,22 @@ interface udp-create-socket { @since(version = 0.2.0) world imports { + @since(version = 0.2.0) + import wasi:io/error@0.2.6; @since(version = 0.2.0) import network; @since(version = 0.2.0) import instance-network; @since(version = 0.2.0) - import wasi:io/poll@0.2.3; + import wasi:io/poll@0.2.6; @since(version = 0.2.0) import udp; @since(version = 0.2.0) import udp-create-socket; @since(version = 0.2.0) - import wasi:io/error@0.2.3; - @since(version = 0.2.0) - import wasi:io/streams@0.2.3; + import wasi:io/streams@0.2.6; @since(version = 0.2.0) - import wasi:clocks/monotonic-clock@0.2.3; + import wasi:clocks/monotonic-clock@0.2.6; @since(version = 0.2.0) import tcp; @since(version = 0.2.0) diff --git a/components/wit/worlds.wit b/components/wit/worlds.wit index 06f3296..d805d5d 100644 --- a/components/wit/worlds.wit +++ b/components/wit/worlds.wit @@ -1,12 +1,12 @@ package componentized:valkey-client; world cli { - include wasi:cli/imports@0.2.3; + include wasi:cli/imports@0.2.6; import componentized:valkey/store; } world valkey-ops { - include wasi:sockets/imports@0.2.3; + include wasi:sockets/imports@0.2.6; export componentized:valkey/resp; export componentized:valkey/store; } @@ -22,5 +22,5 @@ world keyvalue-to-valkey { world sample-http-incrementor { import wasi:keyvalue/store@0.2.0-draft2; import wasi:keyvalue/atomics@0.2.0-draft2; - export wasi:http/incoming-handler@0.2.3; + export wasi:http/incoming-handler@0.2.6; } diff --git a/components/wkg.lock b/components/wkg.lock index 672510f..a1fd740 100644 --- a/components/wkg.lock +++ b/components/wkg.lock @@ -7,9 +7,9 @@ name = "wasi:cli" registry = "wasi.dev" [[packages.versions]] -requirement = "=0.2.3" -version = "0.2.3" -digest = "sha256:8f97d837e1f856a225422869d5c34752204d1befb5a04d0cd80541aec17a20c1" +requirement = "=0.2.6" +version = "0.2.6" +digest = "sha256:fdbe84136b3dd46d94305ef37f24f3cf04a70cc2026dca2592ac2ec0c9de15c7" [[packages]] name = "wasi:config" @@ -25,15 +25,15 @@ name = "wasi:http" registry = "wasi.dev" [[packages.versions]] -requirement = "=0.2.3" -version = "0.2.3" -digest = "sha256:e526c1586efc94cd148e33725139be05c4bb58ba20466d348282bd8dc3999f1d" +requirement = "=0.2.6" +version = "0.2.6" +digest = "sha256:26a636620af0485dfcfc9a0563a0606564eedcf3fcabda031ab4d4ec0e505ff1" [[packages]] name = "wasi:sockets" registry = "wasi.dev" [[packages.versions]] -requirement = "=0.2.3" -version = "0.2.3" -digest = "sha256:dcbe3e55d025d3b3a7ee959c4f74119be0d7d85d1289d4ac6d29a4a37b4d47d7" +requirement = "=0.2.6" +version = "0.2.6" +digest = "sha256:f3e112b5a7926758b82cfc884b5febfce8b924cda766dbdc1f4f60893f59b301" diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..798c4ad --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.91" +targets = [ "wasm32-unknown-unknown", "wasm32-wasip2" ]