شرکت Cloudflare پیشنمایش آزمایشی قابلیتی را معرفی کرده است که پشتیبانی از کدهای Native زبان Rust و برنامههای مبتنی بر Tokio را در محیط Workers بهبود میبخشد. این پیشرفت از طریق پشتیبانی درجهیک از هدف کامپایلر (Compiler Target) مدل wasm32-unknown-emscripten در زنجیره ابزار متنباز wasm-bindgen و پلتفرم Rust Workers محقق شده است.
نقش Emscripten و wasm-bindgen
ابزار wasm-bindgen زیرساخت اصلی برنامههای WebAssembly (Wasm) مبتنی بر Rust در محیط V8 Workers است. از سوی دیگر، Emscripten یک زنجیره ابزار کامپایلر Wasm است که توسط گوگل نگهداری میشود و امکان پل زدن بین کدهای Native و پلتفرم وب را فراهم میکند. این ابزار قابلیتهایی نظیر تایمرها، عملیات سیستم فایل (File System) و سوکتها (Sockets) را مجازیسازی میکند.
با توجه به اینکه Cloudflare Workers از APIهای پلتفرم وب و سازگاری با Node.js پشتیبانی میکند، اکنون میتوان Emscripten را با استفاده از پرچمهای کامپایل Node.js اجرا کرد. این امر باعث میشود ویژگیهای Native پلتفرم بر روی APIهای موجود Node.js مجازیسازی شوند.
یکپارچهسازی با Tokio و چالشهای Async
یکی از پیچیدهترین بخشهای این بهروزرسانی، پشتیبانی از Tokio (محیط اجرای ناهمگام یا Async Runtime در Rust) بود. محیط Workers تکرشتهای (Single-threaded) است و در یک Event Loop جاوااسکریپتی اجرا میشود، در حالی که Tokio برای عملیات مسدودکننده (Blocking) در محیطهای چندرشتهای طراحی شده است.
برای حل این تضاد، دو رویکرد پیادهسازی شده است:
- JSPI (WebAssembly JavaScript Promise Integration): این قابلیت اجازه میدهد یک فراخوانی Wasm مسدودکننده، استک (Stack) را تعلیق کرده و کنترل را به Event Loop جاوااسکریپت بازگرداند.
- LocalEventLoop: طراحی یک Runtime جدید برای Tokio که به جای مسدود کردن رشته، از یک مکانیزم Wake استفاده میکند تا میزبان (Host) در زمان آماده بودن تسکها، آن را پیش ببرد.
پشتیبانی از سوکتها و شبکه
برای فعالسازی قابلیتهای شبکه (TCP, UDP و Unix sockets)، لایه جدیدی به نام -sNODERAWSOCKETS به Emscripten اضافه شده است. این لایه از APIهای node:net استفاده میکند تا امکان استفاده از epoll_wait() را در محیط Workers فراهم کند. این یعنی برنامههای Rust اکنون میتوانند مانند برنامههای لینوکسی، سوکتهای TCP را مدیریت کنند.
اثبات مفهوم: اجرای سرور Minecraft
برای تست این قابلیتها، یک سرور Minecraft به نام Pumpkin (که با Rust و Tokio نوشته شده) روی یک Durable Object اجرا شد. در این پیادهسازی:
- تسکهای چندرشتهای سرور به تسکهای Cooperative در Event Loop تبدیل شدند.
- سیستم فایل از طریق لایه سازگاری Node.js به دیتابیس SQLite در Durable Object متصل شد تا دادهها بهصورت پایدار (Persistent) ذخیره شوند.
- اتصالات شبکه بازیکنان از طریق TCP Ingress محیط Workers مدیریت شدند.