// Build Cloudflare Workers serverless applications with TypeScript. Supports Workers KV, Durable Objects, D1, R2, Hyperdrive, Queues, Vectorize, Workers AI, Browser Rendering, Workflows, and Agents. Use when working with Cloudflare Workers, edge computing, serverless functions, or any Cloudflare platform services.
| name | cloudflare-workers |
| description | Build Cloudflare Workers serverless applications with TypeScript. Supports Workers KV, Durable Objects, D1, R2, Hyperdrive, Queues, Vectorize, Workers AI, Browser Rendering, Workflows, and Agents. Use when working with Cloudflare Workers, edge computing, serverless functions, or any Cloudflare platform services. |
Generate complete, production-ready Cloudflare Workers solutions with best practices and proper TypeScript types.
You are an advanced assistant specialized in generating Cloudflare Workers code with deep knowledge of Cloudflare's platform, APIs, and best practices.
Integrate with appropriate Cloudflare services for data storage:
Include all necessary bindings in code and wrangler.jsonc.
this.ctx.acceptWebSocket(server) to accept connectionsasync webSocketMessage() handlerasync webSocketClose() handleraddEventListener patternagents to build AI Agentsthis.setState API to manage statethis.sql for direct SQLite database interaction when beneficialuseAgent React hook for client interfacesEnv and state type parameters when extending Agentmigrations[].new_sqlite_classes to Agent class nameexport default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
try {
// Your logic here
return new Response('Hello World!', {
headers: { 'Content-Type': 'text/plain' },
});
} catch (error) {
console.error('Error:', error);
return new Response('Internal Server Error', { status: 500 });
}
},
};
interface Env {
// Your bindings here
}
export class ChatRoom extends DurableObject {
async fetch(request: Request): Promise<Response> {
const upgradeHeader = request.headers.get('Upgrade');
if (upgradeHeader === 'websocket') {
const pair = new WebSocketPair();
const [client, server] = Object.values(pair);
this.ctx.acceptWebSocket(server);
return new Response(null, {
status: 101,
webSocket: client,
});
}
return new Response('Expected WebSocket', { status: 400 });
}
async webSocketMessage(ws: WebSocket, message: string | ArrayBuffer): Promise<void> {
// Handle incoming messages
if (typeof message === 'string') {
// Broadcast to all connected WebSockets
this.ctx.getWebSockets().forEach(socket => {
socket.send(message);
});
}
}
async webSocketClose(ws: WebSocket, code: number, reason: string, wasClean: boolean): Promise<void> {
// Clean up when WebSocket closes
console.log('WebSocket closed:', code, reason);
}
}
import { Agent } from 'cloudflare:agents';
interface State {
conversationHistory: Array<{ role: string; content: string }>;
}
export class MyAgent extends Agent<Env, State> {
async chat(message: string): Promise<string> {
const history = this.state.conversationHistory || [];
// Add user message to history
history.push({ role: 'user', content: message });
// Call AI service
const response = await this.env.AI.run('@cf/meta/llama-3-8b-instruct', {
messages: history,
});
// Add assistant response to history
history.push({ role: 'assistant', content: response.response });
// Update state
await this.setState({ conversationHistory: history });
return response.response;
}
}
{
"name": "my-worker",
"main": "src/index.ts",
"compatibility_date": "2025-03-07",
"compatibility_flags": ["nodejs_compat"],
"observability": {
"enabled": true,
"head_sampling_rate": 1
},
"vars": {
"ENVIRONMENT": "production"
},
"kv_namespaces": [
{
"binding": "KV",
"id": "your-kv-namespace-id"
}
],
"durable_objects": {
"bindings": [
{
"name": "CHAT_ROOM",
"class_name": "ChatRoom",
"script_name": "my-worker"
}
]
},
"migrations": [
{
"tag": "v1",
"new_classes": ["ChatRoom"]
}
]
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
const key = url.pathname.slice(1);
if (request.method === 'GET') {
const value = await env.KV.get(key);
if (!value) {
return new Response('Not found', { status: 404 });
}
return new Response(value, {
headers: { 'Content-Type': 'application/json' },
});
}
if (request.method === 'PUT') {
const value = await request.text();
await env.KV.put(key, value);
return new Response('Stored', { status: 200 });
}
return new Response('Method not allowed', { status: 405 });
},
};
// Producer
export default {
async fetch(request: Request, env: Env): Promise<Response> {
await env.QUEUE.send({ timestamp: Date.now(), data: 'example' });
return new Response('Queued');
},
};
// Consumer
export default {
async queue(batch: MessageBatch<any>, env: Env): Promise<void> {
for (const message of batch.messages) {
console.log('Processing:', message.body);
// Process message
message.ack();
}
},
};
All code runs in the Cloudflare Workers runtime. No external installation required beyond the Wrangler CLI for deployment.