web standard api bindings (fetch, Streams, Blob, URL, Crypto, ...)
Dependencies
| API | Package | Status | Note |
|---|---|---|---|
| HTTP & Networking | |||
| fetch | mizchi/js_web/http | ๐งช Tested | HTTP requests |
| Request | mizchi/js_web/http | ๐งช Tested | Request objects |
| Response | mizchi/js_web/http | ๐งช Tested | Response objects |
| Headers | mizchi/js_web/http | ๐งช Tested | HTTP headers |
| FormData | mizchi/js_web/http | ๐งช Tested | Form data handling |
| URL | mizchi/js_web/url | ๐งช Tested | URL parsing |
| URLSearchParams | mizchi/js_web/url | ๐งช Tested | Query strings |
| URLPattern | mizchi/js_web/url | ๐งช Tested | URL pattern matching |
| WebSocket | mizchi/js_web/websocket | ๐งช Tested | WebSocket API |
| Streams | |||
| ReadableStream | mizchi/js_web/streams | ๐งช Tested | Readable streams |
| WritableStream | mizchi/js_web/streams | ๐งช Tested | Writable streams |
| TransformStream | mizchi/js_web/streams | ๐งช Tested | Transform streams |
| CompressionStream | mizchi/js_web/streams | ๐งช Tested | GZIP/Deflate compression |
| DecompressionStream | mizchi/js_web/streams | ๐งช Tested | GZIP/Deflate decompression |
| Binary Data | |||
| Blob | mizchi/js_web/blob | ๐งช Tested | Binary data |
| File | mizchi/js_web/file | ๐งช Tested | Blob with a name and mtime |
| FileReader | mizchi/js_web/file | ๐งช Tested | Read a Blob as text/ArrayBuffer/data URL |
| Encoding | |||
| TextEncoder | mizchi/js_web/encoding | ๐งช Tested | String to Uint8Array |
| TextDecoder | mizchi/js_web/encoding | ๐งช Tested | Uint8Array to String |
| Events | |||
| Event | mizchi/js_web/event | ๐งช Tested | Event objects |
| CustomEvent | mizchi/js_web/event | ๐งช Tested | Custom events |
| MessageEvent | mizchi/js_web/event | ๐งช Tested | Message events |
| Cryptography | |||
| Crypto | mizchi/js_web/crypto | ๐ Reviewed | Web Crypto API |
| SubtleCrypto | mizchi/js_web/crypto | ๐ค AI Generated | Cryptographic operations |
| Workers & Concurrency | |||
| Worker | mizchi/js_web/worker | ๐งช Tested | Web Workers |
| MessagePort | mizchi/js_web/worker | ๐งช Tested | Message passing |
| MessageChannel | mizchi/js_web/message | ๐งช Tested | Channel messaging |
| WebAssembly | |||
| WebAssembly | mizchi/js_web/webassembly | ๐ค AI Generated | WASM integration |
| WebGPU | |||
| WebGPU | mizchi/js_web/webgpu | ๐งช Tested | All 35 GPU* interfaces, incl. canvas rendering |
| WebNN | |||
| WebNN | mizchi/js_web/nn | ๐งช Tested | navigator.ml, graph building, device tensors |
| WebGL | |||
| WebGL | mizchi/js_web/webgl | ๐ Planned | 2D/3D graphics rendering |
| WebGL2 | mizchi/js_web/webgl | ๐ Planned | WebGL 2.0 API |
| WebTransport | |||
| WebTransport | mizchi/js_web/webtransport | ๐ Planned | HTTP/3 based transport |
import {
"mizchi/js_core@0.13.0",
"mizchi/js_web@0.13.0",
}import {
"mizchi/js_core" @core,
"mizchi/js_web/blob",
"mizchi/js_web/crypto",
"mizchi/js_web/encoding",
"mizchi/js_web/event",
"mizchi/js_web/http",
"mizchi/js_web/streams",
"mizchi/js_web/url",
"mizchi/js_web/webassembly",
"mizchi/js_web/webgpu",
"mizchi/js_web/websocket",
"mizchi/js_web/worker",
}// Simple GET request - works in browser, Node.js, Deno, and edge runtimes
let response = @http.fetch("https://api.example.com/data")
let json = response.json()
// POST request with JSON body
let request = @http.Request("https://api.example.com/users",
method="POST",
body="{\"name\":\"Alice\"}",
headers=headers
)
let response = @http.fetch_with_request(request)
// Server-side API handler example (Cloudflare Workers, Vercel Edge, etc.)
fn handle_request(request : @http.Request) -> @http.Response {
let url = request.url()
if url.pathname == "/api/hello" {
@http.Response(
body="{\"message\":\"Hello World\"}",
status=200,
headers=...
)
} else {
@http.Response(body="Not Found", status=404)
}
}// Streaming API responses - efficient for large datasets
fn stream_large_file(file_path : String) -> @http.Response {
let stream = @streams.ReadableStream(...)
@http.Response(
body=stream,
headers=...
)
}
// Transform streams for data processing pipelines
fn process_stream(input : @streams.ReadableStream) -> @streams.ReadableStream {
let transform = @streams.TransformStream()
input.pipe_through(transform)
}
// Server-sent events (SSE) example
fn create_sse_stream() -> @streams.ReadableStream {
@streams.ReadableStream(controller => {
// Send periodic updates
controller.enqueue("data: {\"time\": \"...\"}\n\n")
})
}
// Compression streams - compress data on the fly
fn compress_response(data : String) -> @streams.ReadableStream {
let compressor = @streams.CompressionStream("gzip")
let encoder = @encoding.TextEncoder()
// Create a readable stream from data
let readable = create_stream_from_string(data)
// Pipe through compression
readable.pipeThrough(compressor)
compressor.readable()
}
// Decompression streams - decompress streamed data
fn decompress_request(compressed_stream : @streams.ReadableStream) -> @streams.ReadableStream {
let decompressor = @streams.DecompressionStream("gzip")
compressed_stream.pipeThrough(decompressor)
decompressor.readable()
}// Password hashing (server-side authentication)
async fn hash_password(password : String) -> @arraybuffer.ArrayBuffer {
let subtle = @crypto.Crypto::get().subtle
let data = @encoding.TextEncoder().encode(password)
subtle.digest("SHA-256", data.as_any())
}
// Generate JWT tokens (API authentication)
async fn sign_jwt(payload : String, secret : String) -> @arraybuffer.ArrayBuffer {
let subtle = @crypto.Crypto::get().subtle
let encoder = @encoding.TextEncoder()
// Algorithm descriptors are plain JS objects
let algorithm = @core.from_entries([
("name", @core.any("HMAC")),
("hash", @core.any("SHA-256")),
])
// Import the HMAC key, then sign
let key = subtle.import_key(
"raw",
encoder.encode(secret).as_any(),
algorithm,
false,
["sign"],
)
subtle.sign(algorithm, key.as_any(), encoder.encode(payload).as_any())
}
// Encrypt sensitive data (database encryption)
async fn encrypt_data(data : String) -> @arraybuffer.ArrayBuffer {
let subtle = @crypto.Crypto::get().subtle
// Generate an AES-GCM key
let key = subtle.generate_key(
@core.from_entries([
("name", @core.any("AES-GCM")),
("length", @core.any(256)),
]),
true,
["encrypt", "decrypt"],
)
// Encrypt -- AES-GCM needs a 12-byte iv
let iv = @crypto.Crypto::get().getRandomValues(
@arraybuffer.Uint8Array::from_size(12),
)
let algorithm = @core.from_entries([
("name", @core.any("AES-GCM")),
("iv", iv.as_any()),
])
subtle.encrypt(algorithm, key, @encoding.TextEncoder().encode(data).as_any())
}// Client-side (browser) or server-side (Node.js, Bun)
let ws = @websocket.WebSocket("wss://api.example.com/ws")
ws.addEventListener("open", fn(event) {
ws.send("{\"type\":\"subscribe\",\"channel\":\"updates\"}")
})
ws.addEventListener("message", fn(event) {
let data = event.data()
// Process real-time updates
console.log(data)
})
ws.addEventListener("error", fn(event) {
console.error("WebSocket error")
})
// Cloudflare Workers Durable Objects WebSocket example
fn handle_websocket(request : @http.Request) -> @http.Response {
let upgrade = request.headers()._get("Upgrade")
if upgrade == Some("websocket") {
// Upgrade connection to WebSocket
// Handle WebSocket messages
}
@http.Response(body="Not a WebSocket request", status=400)
}let worker = @worker.Worker("worker.js")
worker.addEventListener("message", fn(event) {
let result = event.data()
console.log(result)
})
worker.postMessage("Start processing")// Same code runs in browser, Node.js, Deno, Cloudflare Workers
fn fetch_user(id : Int) -> @js.Promise[@core.Any] {
let response = @http.fetch("https://api.example.com/users/\(id)")
response.json()
}fn verify_jwt(token : String) -> Bool {
// Web Crypto works everywhere
let crypto = @crypto.get_crypto()
// Verify signature
}// Deploy to Cloudflare Workers, Vercel Edge, Netlify Edge
fn handle(request : @http.Request) -> @http.Response {
let path = request.url().pathname
match path {
"/api/data" => fetch_and_transform_data()
_ => @http.Response(body="Not Found", status=404)
}
}// Stream processing works on server and client
fn process_large_file(url : String) -> @stream.ReadableStream {
let response = @http.fetch(url)
response.body()
}// Same code for browser client and Node.js backend
fn connect_to_server() -> @websocket.WebSocket {
@websocket.WebSocket("wss://api.example.com/ws")
}| API | Browser | Node.js | Deno | Bun | Cloudflare Workers | Vercel Edge |
|---|---|---|---|---|---|---|
| fetch | โ | โ (18+) | โ | โ | โ | โ |
| Request/Response | โ | โ (18+) | โ | โ | โ | โ |
| Headers | โ | โ (18+) | โ | โ | โ | โ |
| URL | โ | โ | โ | โ | โ | โ |
| WebSocket | โ | โ | โ | โ | โ | โ |
| Streams | โ | โ (16+) | โ | โ | โ | โ |
| Web Crypto | โ | โ (15+) | โ | โ | โ | โ |
| Workers | โ | โ (10+) | โ | โ | โ (Durable Objects) | โ |
| WebGPU | โ | โ | โ (unstable) | โ | โ | โ |
Install
Download zipweb standard api bindings (fetch, Streams, Blob, URL, Crypto, ...)
Dependencies