A lightweight JavaScript runtime for OpenWorkers based on QuickJS, providing fast cold starts and efficient execution for edge computing workloads.
- Fast Cold Start: ~850µs worker creation time
- High Throughput: ~85,000 req/s for simple responses
- Web APIs: Fetch, Request, Response, Headers, URL, URLSearchParams
- Streaming: ReadableStream support for response bodies
- Async/Await: Full ES2023 async support with Promises
- Scheduled Events: Cron-style scheduled task execution
| Runtime | Buffered req/s | Worker Creation |
|---|---|---|
| QuickJS | 85,000 | 850µs |
| V8 | 59,500 | ~800µs |
| JSC | 18,600 | ~957µs |
QuickJS is 1.4x faster than V8 and 4.6x faster than JSC for simple requests.
use openworkers_runtime_quickjs::{HttpRequest, Script, Task, Worker};
use std::collections::HashMap;
#[tokio::main]
async fn main() {
let script = Script::new(r#"
addEventListener('fetch', (event) => {
event.respondWith(new Response('Hello World!'));
});
"#);
let mut worker = Worker::new(script, None, None)
.await
.expect("Failed to create worker");
let request = HttpRequest {
method: "GET".to_string(),
url: "http://localhost/".to_string(),
headers: HashMap::new(),
body: None,
};
let (task, rx) = Task::fetch(request);
worker.exec(task).await.expect("Failed to execute");
let response = rx.await.expect("Failed to receive response");
println!("Status: {}", response.status);
}addEventListener('fetch', (event) => {
const stream = new ReadableStream({
start(controller) {
controller.enqueue(new TextEncoder().encode('Hello '));
controller.enqueue(new TextEncoder().encode('World!'));
controller.close();
}
});
event.respondWith(new Response(stream));
});addEventListener('scheduled', (event) => {
console.log('Scheduled at:', event.scheduledTime);
event.waitUntil(doSomeWork());
});fetch()- HTTP clientRequest/Response- HTTP primitivesHeaders- HTTP headersURL/URLSearchParams- URL parsingTextEncoder/TextDecoder- Text encodingReadableStream- Streaming bodiesatob()/btoa()- Base64 encodingaddEventListener()- Event registrationPromise- Async primitives
cargo run --example streaming_bench --releasecargo testMIT License - see LICENSE file.