Edge Real-time
Traditional: satu WebSocket server di satu region. Edge: WebSocket server di setiap edge location. Cloudflare Durable Objects memungkinkan stateful real-time di edge.
Durable Objects
Setiap Durable Object = single instance yang runs di satu location. Punya persistent storage dan bisa handle WebSocket.
// Durable Object class
export class ChatRoom {
state: DurableObjectState;
sessions: WebSocket[] = [];
constructor(state: DurableObjectState) {
this.state = state;
}
async fetch(request: Request) {
const url = new URL(request.url);
if (url.pathname === "/ws") {
const [client, server] = Object.values(new WebSocketPair());
server.accept();
this.sessions.push(server);
server.addEventListener("message", (event) => {
// Broadcast to all sessions
for (const ws of this.sessions) {
if (ws !== server) {
ws.send(event.data);
}
}
});
server.addEventListener("close", () => {
this.sessions = this.sessions.filter(s => s !== server);
});
return new Response(null, { status: 101, webSocket: client });
}
return new Response("Not found", { status: 404 });
}
}
Routing
// Worker routes to Durable Object by room name
export default {
async fetch(request, env) {
const url = new URL(request.url);
const roomName = url.searchParams.get("room");
// Same room name → same Durable Object instance
const id = env.CHAT_ROOM.idFromName(roomName);
const room = env.CHAT_ROOM.get(id);
return room.fetch(request);
},
};
Alternatives
- PartyKit — Serverless real-time platform, built on Durable Objects, easier DX
- Liveblocks — Managed collaborative infrastructure
- Ably — Managed real-time messaging with edge distribution
Benefits
- Users connect to nearest edge location (low latency globally)
- Each room is a single-point-of-coordination (no distributed state)
- Auto-scales: thousands of rooms = thousands of Durable Objects