Edge Real-time (Durable Objects) — Realtime

Edge Real-time Traditional: satu WebSocket server di satu region. Edge: WebSocket server di setiap edge location. Cloudflare Durable Objects memungkinkan…

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

Benefits

Yang akan kamu pelajari