← На главную

Вышел WASI 0.3.0 с нативной асинхронностью из WebAssembly Component Model

12.06.2026 13:51 · hackernews

Вышел WASI 0.3.0. Подгруппа WASI ратифицировала спецификацию, переведя стандарт на нативную асинхронность из WebAssembly Component Model. В версии 0.2 async-операции эмулировали через костыли с pollable, subscribe и разделением на start/finish. Теперь всё встроено напрямую.

Изменения в основном механические. Пакет wasi:io в 0.2 использовал ресурс pollable, который в 0.3 заменили на future<T>. Вместо ручного опроса набора pollable движок сам обрабатывает await на future. Ручные subscribe на ресурсах исчезли — каждая функция возвращает future<...>. Пара start-foo / finish-foo превратилась в один foo: async func(...).

В wasi:cli ключевое изменение — stdin и stdout. В 0.2 ты получал input-stream и output-stream и писал в них императивно. В 0.3 get-stdin отдаёт кортеж из stream<u8> и future, а get-stdout сам принимает stream<u8> и возвращает future, который разрешается после записи. Добавлен общий error-code с вариантами io, illegal-byte-sequence и pipe.

wasi:sockets потерял ресурс network. Доступ к сети теперь даётся через world imports, а не через capability-ресурс, который тащили через каждый вызов. Все связки start/finish заменили одним async func — bind, connect, listen, accept больше не требуют промежуточных состояний и подписок. Методы finish-connect в 0.3 не возвращают пару потоков: байтовый I/O теперь живёт на методах самого сокета. UDP тоже упростили: incoming/outgoing datagram stream исчезли, их заменили async send и async receive. Коды ошибок для TCP, UDP и name-lookup объединили в один error-code.

wasi:http — самая заметная перестройка. Количество ресурсов сократилось с 8 до 2. В 0.2 была матрица из incoming-request, outgoing-request, incoming-response, outgoing-response, incoming-body, outgoing-body, плюс future-trailers и future-incoming-response. Теперь остались только request и response. Тело — это просто stream<u8>, трейлеры — future<result<option<trailers>, error-code>>. future-incoming-response не нужен — его роль берёт на себя future<result<response, error-code>>. Хендлер стал асинхронной функцией: в 0.2 был костыль с response-outparam, в 0.3 handle: async func(request) -> result<response, error-code>. Клиентская часть — send: async func. Появилась поддержка middleware: старый world proxy заменён на service, а новый world middleware и импортирует, и экспортирует handler, давая компонентам вставать в цепочку запросов.

wasi:filesystem перевёл чтение/запись на ту же схему stream + future. Итерация по директориям вместо ресурса-итератора теперь выдаёт stream<directory-entry>.

wasi:clocks в основном переименовали ради единообразия: wall-clock стал system-clock, datetimeinstant. Это привели в соответствие с POSIX и Rust std::time. У monotonic-clock убрали subscribe-instant/subscribe-duration — теперь await на таймере от хоста.

Обновление в основном сводится к механическому поиску и замене, как показано в тестовом коммите WebAssembly/wasi-testsuite@f13976f.

Читать оригинал →