Вышел WASI 0.3 — спецификацию ратифицировал подкомитет WASI Subgroup. Главное изменение: WASI теперь нативно завязана на асинхронные возможности Component Model. То, что в версии 0.2 обеспечивал пакет wasi:io (потоки, опрашиваемые сущности), переехало прямо в canonical ABI Component Model. Новые примитивы — stream<T>, future<T> и ключевое слово async — стали частью ABI. stream<T> и future<T> работают как владельческие handle: передача через границу компонента означает передачу владения.
Раньше каждый компонент в WASI 0.2 тащил свой event loop, и они не умели координироваться. Теперь хост управляет единым event loop, общим для всех компонентов. Планирование — на стороне рантайма, не компонента. Если значение доставлено во future, рантайм сам планирует задачу, которая его ожидает, даже если значение побывало в нескольких компонентах. Async-модель — completion-based, как у io_uring в Linux или IOCP/IoRing в Windows. Readiness-based API вроде epoll/kqueue можно эмулировать поверх.
Механические изменения упростили подписи. Трёхшаговая последовательность start-foo / finish-foo / subscribe из WASI 0.2 исчезла — теперь компоненты экспортируют и импортируют async func напрямую. Решена и проблема с ошибками: в WASI 0.2 ошибки приходили инлайн на каждый вызов чтения, и если читатель останавливался раньше, он не мог отличить закрытие потока от ошибки. В 0.3 stream возвращает дополнительный future, который разрешается независимо от того, сколько данных потребили.
Изменения коснулись wasi:http. Появились два мира: wasi:http/service и wasi:http/middleware. middleware заменил старый proxy-мир и позволяет компонентам пробрасывать запросы другим обработчикам без сети — прямо внутри одного процесса. Для микросервисов это ускоряет вызовы с миллисекунд до наносекунд, то есть в миллион раз.
Для разработчиков: в Rust через wit-bindgen async-функция handle из wasi:http/handler маппится на async fn handle. Go через componentize-go позволяет писать синхронный код с горутинами — рантайм паркует горутину на границе ABI и возобновляет, когда данные готовы. Поддержку async в биндинг-генераторах готовят для Python, JavaScript, C#, C и других языков.
WASI 0.3 — стабильный релиз. Wasmtime 46 включит его по умолчанию, jco (JavaScript toolchain) — следом. Обещают, что скомпилированные под 0.3 программы будут работать и в будущем, выходящие каждые два месяца патчи (0.3.x) не сломают совместимость.