Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/workerd/api.md
1# Workerd APIs23## Worker Code (JS/TS)45### ES Modules (Recommended)6```javascript7export default {8async fetch(request, env, ctx) {9const value = await env.KV.get("key"); // Bindings in env10const response = await env.API.fetch(request); // Service binding11ctx.waitUntil(logRequest(request)); // Background task12return new Response("OK");13},14async adminApi(request, env, ctx) { /* Named entrypoint */ },15async queue(batch, env, ctx) { /* Queue consumer */ },16async scheduled(event, env, ctx) { /* Cron handler */ }17};18```1920### TypeScript Types2122**Generate from wrangler.toml (Recommended):**23```bash24wrangler types # Output: worker-configuration.d.ts25```2627**Manual types:**28```typescript29interface Env {30API: Fetcher;31CACHE: KVNamespace;32STORAGE: R2Bucket;33ROOMS: DurableObjectNamespace;34API_KEY: string;35}3637export default {38async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {39return new Response(await env.CACHE.get("key"));40}41};42```4344**Setup:**45```bash46npm install -D @cloudflare/workers-types47```4849```json50// tsconfig.json51{"compilerOptions": {"types": ["@cloudflare/workers-types"]}}52```5354### Service Worker Syntax (Legacy)55```javascript56addEventListener('fetch', event => {57event.respondWith(handleRequest(event.request));58});5960async function handleRequest(request) {61const value = await KV.get("key"); // Bindings as globals62return new Response("OK");63}64```6566### Durable Objects67```javascript68export class Room {69constructor(state, env) { this.state = state; this.env = env; }7071async fetch(request) {72const url = new URL(request.url);73if (url.pathname === "/increment") {74const value = (await this.state.storage.get("counter")) || 0;75await this.state.storage.put("counter", value + 1);76return new Response(String(value + 1));77}78return new Response("Not found", {status: 404});79}80}81```8283### RPC Between Services84```javascript85// Caller: env.AUTH.validateToken(token) returns structured data86const user = await env.AUTH.validateToken(request.headers.get("Authorization"));8788// Callee: export methods that return data89export default {90async validateToken(token) { return {id: 123, name: "Alice"}; }91};92```9394## Web Platform APIs9596### Fetch97- `fetch()`, `Request`, `Response`, `Headers`98- `AbortController`, `AbortSignal`99100### Streams101- `ReadableStream`, `WritableStream`, `TransformStream`102- Byte streams, BYOB readers103104### Web Crypto105- `crypto.subtle` (encrypt/decrypt/sign/verify)106- `crypto.randomUUID()`, `crypto.getRandomValues()`107108### Encoding109- `TextEncoder`, `TextDecoder`110- `atob()`, `btoa()`111112### Web Standards113- `URL`, `URLSearchParams`114- `Blob`, `File`, `FormData`115- `WebSocket`116117### Server-Sent Events (EventSource)118```javascript119// Server-side SSE120const { readable, writable } = new TransformStream();121const writer = writable.getWriter();122writer.write(new TextEncoder().encode('data: Hello\n\n'));123return new Response(readable, {headers: {'Content-Type': 'text/event-stream'}});124```125126### HTMLRewriter (HTML Parsing/Transformation)127```javascript128const response = await fetch('https://example.com');129return new HTMLRewriter()130.on('a[href]', {131element(el) {132el.setAttribute('href', `/proxy?url=${encodeURIComponent(el.getAttribute('href'))}`);133}134})135.on('script', { element(el) { el.remove(); } })136.transform(response);137```138139### TCP Sockets (Experimental)140```javascript141const socket = await connect({ hostname: 'example.com', port: 80 });142const writer = socket.writable.getWriter();143await writer.write(new TextEncoder().encode('GET / HTTP/1.1\r\n\r\n'));144const reader = socket.readable.getReader();145const { value } = await reader.read();146return new Response(value);147```148149### Performance150- `performance.now()`, `performance.timeOrigin`151- `setTimeout()`, `setInterval()`, `queueMicrotask()`152153### Console154- `console.log()`, `console.error()`, `console.warn()`155156### Node.js Compat (`nodejs_compat` flag)157```javascript158import { Buffer } from 'node:buffer';159import { randomBytes } from 'node:crypto';160161const buf = Buffer.from('Hello');162const random = randomBytes(16);163```164165**Available:** `node:buffer`, `node:crypto`, `node:stream`, `node:util`, `node:events`, `node:assert`, `node:path`, `node:querystring`, `node:url`166**NOT available:** `node:fs`, `node:http`, `node:net`, `node:child_process`167168## CLI Commands169170```bash171workerd serve config.capnp [constantName] # Start server172workerd serve config.capnp --socket-addr http=*:3000 --verbose173workerd compile config.capnp constantName -o binary # Compile to binary174workerd test config.capnp [--test-only=test.js] # Run tests175```176177## Wrangler Integration178179Use Wrangler for development:180```bash181wrangler dev # Uses workerd internally182wrangler types # Generate TypeScript types from wrangler.toml183```184185See [patterns.md](./patterns.md) for usage examples, [configuration.md](./configuration.md) for config details.186