Skip to content

Commit 6215b13

Browse files
authored
fix: shard Dispatcher DO per session instead of global singleton (#83)
* fix: shard Dispatcher DO per session instead of global singleton * fix: use random UUID fallback for missing sessionId, soften locality comment * worker: pass sessionId as query param on dispatcher DO upgrade * worker: rename dispatcher URL query param sessionId -> meetingId to dodge CF auto-redaction * worker: drop dispatcher URL session identifier (redacted by CF; DO reads ctx.id.name instead)
1 parent 6d7bada commit 6215b13

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

worker/index.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,11 @@ async function handleWebSocketWithDispatcher(
229229
containerWs.accept();
230230

231231
// Connect to Dispatcher DO via WebSocket (preferred - avoids subrequest limit)
232+
// Each session gets its own DO instance for isolation.
232233
let dispatcherWs: WebSocket | null = null;
233234
if (env.DISPATCHER_DO) {
234235
try {
235-
const doId = env.DISPATCHER_DO.idFromName('global');
236+
const doId = env.DISPATCHER_DO.idFromName(sessionId);
236237
const stub = env.DISPATCHER_DO.get(doId);
237238

238239
const upgradeRequest = new Request('http://dispatcher/websocket', {
@@ -291,7 +292,7 @@ async function handleWebSocketWithDispatcher(
291292
if (!env.DISPATCHER_DO || (sessionClosed && !allowDuringClose)) return null;
292293

293294
try {
294-
const doId = env.DISPATCHER_DO.idFromName('global');
295+
const doId = env.DISPATCHER_DO.idFromName(sessionId);
295296
const stub = env.DISPATCHER_DO.get(doId);
296297

297298
const upgradeRequest = new Request('http://dispatcher/websocket', {
@@ -511,7 +512,7 @@ export default {
511512
const useDispatcher = useDispatcherParam !== null
512513
? useDispatcherParam === 'true'
513514
: env.USE_DISPATCHER === 'true';
514-
const sessionId = url.searchParams.get('sessionId') || 'unknown';
515+
const sessionId = url.searchParams.get('sessionId') || crypto.randomUUID();
515516

516517
// Select which container instance to use based on routing strategy
517518
const containerInstanceId = await selectContainerInstance(request, env);

0 commit comments

Comments
 (0)