WASI 0.3.0: WebAssembly Bileşenlerine Doğal Asenkron Yetenekler Geliyor
WebAssembly System Interface (WASI) Subgroup’u tarafından yapılan oylama sonucunda WASI 0.3.0 resmi olarak onaylandı. Bu önemli sürüm, WASI’yi WebAssembly Bileşen Modeli’nin asenkron (async) temel öğeleri üzerine yeniden konumlandırarak büyük bir adım atıyor. Daha önceki WASI 0.2 sürümünde asenkron işlemleri yönetmek için bazı ‘akrobatik’ çözümler gerekirken, artık asenkron yetenekler bileşen modeline doğal olarak entegre edildi. Bu sayede, aynı işlevler çok daha ergonomik bir şekilde yazılabiliyor.
Asenkron Programlamada Dönüşüm: WASI 0.2’den 0.3’e
WASI 0.2’deki ‘wasi:io’ paketiyle kodlanan desenler, Component Model’in doğal asenkron yapısıyla WASI 0.3’te şu şekilde basitleştirildi:
resource pollableartıkfuture<T>oldu.resource input-streamyerinistream<u8>‘e bıraktı.resource output-streamise yazma yönünde yinestream<u8>olarak standardize edildi.poll(list<pollable>)çağrıları, çalışma zamanı tarafından yönetilenawaitifadelerine dönüştü.- Kaynaklardaki
subscribe()metotları, doğrudan çağrıdanfuture<...>döndürmeye başladı. start-foo/finish-fooçiftleri, tek birfoo: async func(...)fonksiyonuna birleşti.
‘wasi:cli’ Modülündeki Yenilikler
Yapısal olarak ‘stdin.wit’, ‘stdout.wit’, ‘stderr.wit’, ‘run.wit’, ‘exit.wit’, ‘terminal.wit’, ‘environment.wit’ gibi dosyalar aynı kalırken, en ilgi çekici değişiklik stdio arayüzlerinde yaşandı:
WASI 0.2 (Örnek):
interface stdin { use wasi:io/streams.{input-stream}; get-stdin: func() -> input-stream; }
interface stdout { use wasi:io/streams.{output-stream}; get-stdout: func() -> output-stream; }
WASI 0.3 (Örnek):
interface stdin { use types.{error-code}; read-via-stream: func() -> tuple<stream<u8>, future<result<_, error-code>>>; }
interface stdout { use types.{error-code}; write-via-stream: func(data: stream<u8>) -> future<result<_, error-code>>; }
WASI 0.2’de bir output-stream alıp ona zorunlu olarak yazılırken, WASI 0.3’te bir stream<u8> geçirilir ve yazma işlemi tamamlandığında çözülecek bir future döndürülür. Yeni wasi:cli/types arayüzü ise paylaşılan error-code varyantlarını (io, illegal-byte-sequence, pipe) taşır.
‘wasi:sockets’: Ağ Erişiminde Büyük Sadeleşme
network kaynağı tamamen kaldırıldı. WASI 0.2’de ağ erişimi, her bağlama, bağlantı kurma ve arama çağrısına geçirilen bir yetenek kaynağı olarak modelleniyordu. WASI 0.3, bu kaynağı tamamen ortadan kaldırarak ağ erişimini dünya (world) içe aktarımları aracılığıyla sağlıyor.
Her start/finish çifti, tek bir async func haline geldi. Gelişmekte olan ara durumlar (bind-in-progress, connect-in-progress, listen-in-progress) ve bunları tetikleyen subscribe() -> pollable mekanizmaları artık mevcut değil.
WASI 0.2 (Örnek):
start-bind: func(network: borrow<network>, local: ip-socket-address) -> result<_, error-code>; finish-bind: func() -> result<_, error-code>; start-connect: func(network: borrow<network>, remote: ip-socket-address) -> result<_, error-code>; finish-connect: func() -> result<tuple<input-stream, output-stream>, error-code>;
WASI 0.3 (Örnek):
bind: async func(local-address: ip-socket-address) -> result<_, error-code>; connect: async func(remote-address: ip-socket-address) -> result<_, error-code>; listen: async func() -> result<_, error-code>; accept: async func() -> result<tuple<tcp-socket, ip-socket-address>, error-code>;
WASI 0.2’nin finish-connect fonksiyonunun TCP akış çiftini doğrudan döndürdüğü unutulmamalıdır. WASI 0.3’te connect özel bir şey döndürmez; bayt G/Ç, soket kaynağının kendi akış metotları üzerinde yaşar. UDP de aynı sadeleştirmeyi gördü; gelen/giden datagram akış kaynakları, düz async send ve async receive ile değiştirildi. TCP, UDP ve isim çözme genelindeki hata kodları, yeni bir connection-broken durumu ve açık uçlu other(option<string>) kuyruğu ile tek bir error-code varyantında birleştirildi.
‘wasi:http’: İstek ve Yanıt İşlemede Birlik
Bu sürümün en belirgin yeniden düzenlemesi HTTP modülünde gerçekleşti.
Kaynakların Birleşimi: 8’den 2’ye Düşüş
WASI 0.2, gelen/giden × istek/yanıt/gövde alanı için tam bir kaynak matrisine sahipti (incoming-request, outgoing-request, incoming-response, outgoing-response, incoming-body, outgoing-body, future-trailers, future-incoming-response). WASI 0.3 ise sadece request ve response kaynaklarına sahip. Gövdeler doğrudan stream<u8> olarak, fragmanlar (trailers) ise future<result<option<trailers>, error-code>> olarak temsil ediliyor. future-incoming-response ise düz bir future<result<response, error-code>>‘un bu işi yapmasıyla ortadan kalkıyor.
İşleyici (Handler) Artık Asenkron Bir Fonksiyon
WASI 0.2’deki incoming-handler, doğal asenkron dönüşlerin eksikliğini gidermek için bir response-outparam parametresi kullanıyordu:
WASI 0.2 (Örnek):
interface incoming-handler { handle: func(request: incoming-request, response-out: response-outparam); }
WASI 0.3 (Örnek):
interface handler { handle: async func(request: request) -> result<response, error-code>; }
Giden taraf da benzer bir şekilde düzenlendi:
interface client { send: async func(request: request) -> result<response, error-code>; }
Ara Yazılım (Middleware) İçin Yeni Dünyalar
Eski proxy dünyasının yerini service ve hem handler‘ı içe aktaran hem de dışa aktaran middleware dünyası aldı. Bu, istek yolunda bulunan bileşenlere birinci sınıf destek sağlıyor.
‘wasi:filesystem’: Akış Tabanlı Dosya İşlemleri
Akış tabanlı okuma/yazma işlemleri, artık akış ve future çifti şeklinde değişti:
WASI 0.2 (Örnek):
read-via-stream: func(offset: filesize) -> result<input-stream, error-code>; write-via-stream: func(offset: filesize) -> result<output-stream, error-code>;
WASI 0.3 (Örnek):
read-via-stream: func(offset: filesize) -> tuple<stream<u8>, future<result<_, error-code>>>; write-via-stream: func(data: stream<u8>, offset: filesize) -> future<result<_, error-code>>;
Dizin yinelemesi de kaynak tabanlı iteratörden akışa geçiş yaptı:
WASI 0.2 (Örnek):
read-directory: func() -> result<directory-entry-stream, error-code>;
WASI 0.3 (Örnek):
read-directory: func() -> tuple<stream<directory-entry>, future<result<_, error-code>>>;
‘wasi:clocks’: İsimlendirme ve Basitleştirmeler
wasi:clocks modülündeki değişiklikler, bilinçli olarak çoğunlukla yeniden adlandırmalardan oluşuyor. Bu değişiklikler, alt sistemlerde görülen döngüsel etkileri vurgulamak için belirtilmiştir.
WASI#79 (Tipler için standart dışı isim kullanımından kaçınma) değişikliği, paketi geleneksel isimlere taşıdı: wall-clock, system-clock oldu ve datetime, instant haline geldi. Bu değişimin motivasyonu, ekosistemin geri kalanıyla (POSIX, Rust’ın std::time vb.) saatler hakkında konuşma tutarlılığını sağlamaktı. ‘Wall clock’ ve ‘datetime’ WASI’ye özgü ifadelerdi ve diğer sistemlerle uyumlu değildi. Benzer bir nedenle wasi:filesystem zaman damgaları da aynı değişikliği takip etti. Küçük bir types.wit dosyası, duration = u64 takma adını paylaşmak için eklendi. Ayrıca monotonic-clock, pollable döndüren subscribe-instant ve subscribe-duration çağrılarını kaldırdı; çağıranlar artık her yerde kullanılan aynı desen olan ana bilgisayar tarafından sağlanan bir zamanlayıcı future’ını await ediyor.
Bu değişikliklerin alt sistemlere etkisi genellikle mekanik bul-değiştir işlemleridir. Örneğin, WASI test süitindeki güncelleme WebAssembly/wasi-testsuite@f13976f adresinde incelenebilir.

