mio
mio copied to clipboard
add `wasm32-wasip2` support
This implementation currently uses a mix of POSIX-style APIs (provided by wasi-libc
via the libc
crate) and WASIp2-native APIs (provided by the wasi
crate).
Alternatively, we could implement Selector
using only POSIX APIs, e.g. poll(2)
. However, that would add an extra layer of abstraction to support and debug, as well as make it impossible to support polling wasi:io/poll/pollable
objects which cannot be represented as POSIX file descriptors (e.g. timer events, DNS queries, HTTP requests, etc.).
Another approach would be to use only the WASIp2 APIs and bypass wasi-libc
entirely. However, that would break interoperability with both Rust std
and e.g. C libraries which expect to work with file descriptors.
Since wasi-libc
does not yet provide a public API for converting between file descriptors and WASIp2 resource handles, we currently use a non-public API (see the netc
module below) to do so. Once
https://github.com/WebAssembly/wasi-libc/issues/542 is addressed, we'll be able to switch to a public API.
I've tested this end-to-end using https://github.com/dicej/wasi-sockets-tests, which includes smoke tests for mio
, tokio
, tokio-postgres
, etc.