A minimal example demonstrating stateless-stateful notification flow using oRPC + Hibernation plugin, Cloudflare Workers, and Durable Objects.
[Stateless API] → [Durable Object] → [WebSocket Clients]
- Stateless Routes (
/api/rpc) handle CRUD operations - Broadcast to Durable Object when data changes
- Durable Object maintains WebSocket connections and forwards events
- Clients receive real-time notifications
server/rpc/router/todo.router.ts- Stateless API that broadcasts eventsserver/subscriptions/dos/DurableSubscription.ts- Stateful WebSocket handlerserver/subscriptions/router/server.router.ts- Internal broadcast endpointserver/subscriptions/router/client.router.ts- Client event stream
- Client calls
POST /api/rpc/todo/create - Stateless handler creates todo
- Handler calls
broadcastTodoEvent()→ Durable Object - Durable Object sends event to all connected WebSocket clients
- Clients receive
todo.createdevent in real-time
WIP not fully implemented yet
- HTTP requests:
x-user-idheader - WebSocket:
userIdquery parameter (cookies also supported) - User isolation: Each user gets their own Durable Object instance
pnpm install
pnpm run devOpen browser → Create/update todos → See real-time updates across tabs