Cloudflare, wasm-bindgen araç zinciri ve Rust Workers ortamı kapsamında wasm32-unknown-emscripten derleme hedefi için ilk genel deneysel önizlemeyi duyurdu. Bu yol, geleneksel WebAssembly modeliyle önceden uyumlu kütüphanelerle sınırlı kalmak yerine, daha fazla yerel Rust uygulamasının ve kütüphanesinin WebAssembly biçiminde küresel Workers platformunda derlenip çalıştırılmasını sağlıyor.
Bu çalışma, yerel kodu web ortamına bağlamak ve dosya sistemi, zamanlayıcılar ve soketler gibi işlevleri taklit etmek için bir katman sağlayan Emscripten ile Rust ve JavaScript arasında bindings oluşturan wasm-bindgen arasında entegrasyon oluşturuyor. Yeni değişiklikler kapsamında hem Rust derleyicisi hem de Emscripten derleyicisi, aynı derleme süreci içinde birbirlerinin bindings katmanını kullanabiliyor.
Rust kütüphanelerinin uyumluluğunu genişletme
Cloudflare, ilk testlerin düşük seviyeli kütüphaneler de dahil olmak üzere Rust kütüphaneleriyle daha iyi uyumluluk gösterdiğini belirtiyor. libc, socket2 ve Mio gibi kütüphanelerin, Emscripten hedefini platform koşullarına eklemek için sınırlı değişikliklere ihtiyacı oldu. En karmaşık kütüphane ise Tokio oldu; çünkü Workers, bir JavaScript olay döngüsü içinde tek iş parçacığıyla çalışırken Tokio geleneksel olarak girdi ve çıktı işlemlerini beklerken iş parçacığını durdurmaya dayanıyor.
Cloudflare bu farklılığı gidermek için iki yol üzerinde çalışıyor. Birincisi, WebAssembly yığınını askıya alıp kontrolü JavaScript olay döngüsüne geri vermeyi sağlayan WebAssembly JavaScript Promise Integration’ı kullanıyor. Bu, yığınlar askıya alınıp devam ettirildiğinde iş parçacığının yerel bağlamının dikkatle yönetilmesini gerektiriyor. İkinci yol ise Tokio için LocalEventLoop modelini öneriyor; burada hazır görevler drive() işlemi üzerinden yürütülüyor ve beklemenin yerini ana makinenin olay döngüsüne gönderilen bir uyandırma bildirimi alıyor.
Soketler ve TCP ağları desteği
Ağ desteği ek bir zorluk oluşturdu; çünkü Tokio, Mio üzerinden epoll_wait() kullanırken Emscripten, poll() için sınırlı destek ve WebSocket’leri taklit eden bir katman sağlıyordu. Bu nedenle Cloudflare, Emscripten’e -sNODERAWSOCKETS katmanını eklemek için 40’tan fazla birleştirme isteğine katkıda bulundu. Bu katman, node:net arayüzü üzerinden epoll, TCP, UDP ve Unix sockets desteği sağlıyor.
Workers, Node.js arayüzleriyle uyumluluk sunduğundan aynı köprü platform içinde de kullanılabiliyor; böylece Emscripten ile Cloudflare arasında ayrıca özel arayüzler eklemeye gerek kalmıyor. Bu yetenekler deneysel olmayı sürdürüyor ve bazı Tokio yamaları projeye nihai olarak dahil edilmeden önce hâlâ inceleniyor.
Minecraft sunucusu üzerinden pratik test
Uyumluluk düzeyini test etmek için Cloudflare mühendisi Dan Lapid, Pumpkin adıyla bilinen Rust ile yazılmış Minecraft sunucusunu bir Durable Object içinde çalıştırdı. Durable Object tek iş parçacığıyla çalıştığından oyun döngüleri, bölge zamanlaması ve Rayon görevleri, bağımsız işletim sistemi iş parçacıklarına dayanmak yerine bir Tokio döngüsü içindeki işbirlikçi görevlere dönüştürüldü.
Sunucu, dosya sistemini Node.js arayüzleri üzerinden kullandı ve dosyaları worker-fs-mount kütüphanesi aracılığıyla Durable Object’in SQLite’ında depoladı. Oyuncuların bağlantıları da TCP ingress üzerinden geçerek nesne içindeki TCP sunucusuna ulaştı. Cloudflare’a göre bu, durumun kaydedilmesi ve nesnenin depolanan dünyadan yeniden başlatılmasıyla çok oyunculu bir Minecraft sunucusunun çalıştırılmasını sağladı.
Bu gelişme neden önemli?
Değişikliğin pratik değeri yalnızca yeni bir derleme hedefi eklenmesinde değil, Workers üzerinde çalışabilmeleri için yeniden yazılması gereken kütüphane ve uygulamaların sayısını azaltmasında yatıyor. Bununla birlikte Cloudflare, desteği deneysel ve sürüm öncesi olarak nitelendiriyor; ayrıca Tokio’nun yeni tasarımı, JSPI desteği ve bazı Emscripten entegrasyonları hâlâ geliştirme aşamasında ve upstream incelemesinden geçiyor. Bu nedenle bu yol, yerel Rust uygulamalarını çalıştırma deneylerinin önünü açıyor; ancak henüz tüm geleneksel çalışma ortamları için eksiksiz ve kararlı bir alternatif olduğunu kanıtlamıyor.