What's the sync layer implementation for this project?
This post might have stale content, as HEAD is 2 commits ahead.
what's the sync layer for this? websockets on DO storing the presence state in memory?
Yes—roughly:
- The client uses tldraw’s
useSync, connecting over a WebSocket to/api/connect/:roomId(client/pages/Room.tsx:12-16). - The Worker routes each room ID to a uniquely named Cloudflare Durable Object, so one DO coordinates each room (
worker/worker.ts:16-20). - Inside the DO,
@tldraw/sync-core’sTLSocketRoomhandles synchronization, applying changes and broadcasting them to connected clients (worker/TldrawDurableObject.ts:49-65). - Document records are persisted in the DO’s built-in SQLite through
SQLiteSyncStorage; they are not only in memory. - Presence/session state is ephemeral, primarily managed by
TLSocketRoom. However, it’s not purely ordinary process memory: session snapshots are serialized into each WebSocket’s attachment so sessions can survive DO hibernation and be resumed (worker/TldrawDurableObject.ts:58-79). - Cloudflare’s WebSocket Hibernation API keeps sockets alive while allowing the DO’s memory to be freed. Disconnects trigger presence removal broadcasts (
worker/TldrawDurableObject.ts:131-158).
So: WebSockets + one Durable Object per room; durable document state in SQLite; ephemeral presence/session state with WebSocket-attached snapshots for hibernation recovery. Static assets go separately to R2.
END OF POST