Cloudflare Workers
pluv.io supports building real-time APIs with Cloudflare Workers through their Durable Objects API.
Using with Cloudflare Workers
Let's step through how we'd put together a real-time API for Cloudflare Workers. The examples below assumes a basic understanding of Cloudflare Workers and Durable Objects.
Install dependencies
1# For the server2npm install @pluv/io @pluv/platform-cloudflare3# Server peer-dependencies4npm install yjs zod
Create PluvIO instance
Define an io (websocket client) instance on the server codebase:
1// backend/io.ts23import { createIO } from "@pluv/io";4import { platformCloudflare } from "@pluv/platform-cloudflare";56export const io = createIO({ platform: platformCloudflare() });78// Export the websocket client io type, instead of the client itself9export type AppPluvIO = typeof io;
Attach to a RoomDurableObject
Next, create a RoomDurableObject
and attach our new pluv.io instance to the room:
1// server/RoomDurableObject.ts23import { type InferIORoom } from "@pluv/io";4import { AppPluvIO, io } from "./io";56export class RoomDurableObject implements DurableObject {7 private _io: InferIORoom<AppPluvIO>;89 constructor(state: DurableObjectState) {10 this._io = io.getRoom(state.id.toString());11 }1213 async fetch(request: Request) {14 const isWebSocketRequest = request.headers.get("Upgrade") === "WebSocket";1516 if (!isWebSocketRequest) {17 return new Response("Expected WebSocket", { status: 400 });18 }1920 const { 0: client, 1: server } = new WebSocketPair();2122 await this._io.register(server);2324 return new Response(null, { status: 101, webSocket: client });25 }26}
Forward request to RoomDurableObject
Lastly, integrate your RoomDurableObject
with your Cloudflare Worker's default handler:
1// server/index.ts23const parseRoomId = (url: string): string => {4 /* get room from req.url */5};67const handler = {8 async fetch(req: Request, env: Env): Promise<Response> {9 const roomId = parseRoomId(req.url);10 const durableObjectId = env.rooms.idFromString(roomId);1112 const room = env.rooms.get(durableObjectId);1314 return room.fetch(request);15 },16};1718export default handler;
From this point on, you can integrate your frontend with @pluv/react
as you would normally.