@@ -133,14 +133,11 @@ async function flushSubblockUpdate(
133133
134134 if ( workflowExists . length === 0 ) {
135135 pending . opToSocket . forEach ( ( socketId , opId ) => {
136- const sock = io . sockets . sockets . get ( socketId )
137- if ( sock ) {
138- sock . emit ( 'operation-failed' , {
139- operationId : opId ,
140- error : 'Workflow not found' ,
141- retryable : false ,
142- } )
143- }
136+ io . to ( socketId ) . emit ( 'operation-failed' , {
137+ operationId : opId ,
138+ error : 'Workflow not found' ,
139+ retryable : false ,
140+ } )
144141 } )
145142 return
146143 }
@@ -173,68 +170,48 @@ async function flushSubblockUpdate(
173170 } )
174171
175172 if ( updateSuccessful ) {
176- // Collect all sender socket IDs to exclude from broadcast
173+ // Broadcast to room excluding all senders (works cross-pod via Redis adapter)
177174 const senderSocketIds = [ ...pending . opToSocket . values ( ) ]
178- const firstSenderSocket =
179- senderSocketIds . length > 0 ? io . sockets . sockets . get ( senderSocketIds [ 0 ] ) : null
180-
181- if ( firstSenderSocket ) {
182- // socket.to(room).emit() excludes sender and broadcasts across all pods via Redis adapter
183- firstSenderSocket . to ( workflowId ) . emit ( 'subblock-update' , {
184- blockId,
185- subblockId,
186- value,
187- timestamp,
188- } )
189- } else if ( senderSocketIds . length > 0 ) {
190- // Senders disconnected but we should still exclude them in case they reconnected
191- // Use io.except() to exclude all sender socket IDs
175+ if ( senderSocketIds . length > 0 ) {
192176 io . to ( workflowId ) . except ( senderSocketIds ) . emit ( 'subblock-update' , {
193177 blockId,
194178 subblockId,
195179 value,
196180 timestamp,
197181 } )
198182 } else {
199- // No senders tracked (edge case) - broadcast to all
200- roomManager . emitToWorkflow ( workflowId , 'subblock-update' , {
183+ io . to ( workflowId ) . emit ( 'subblock-update' , {
201184 blockId,
202185 subblockId,
203186 value,
204187 timestamp,
205188 } )
206189 }
207190
208- // Confirm all coalesced operationIds (only to sockets still connected on this pod)
191+ // Confirm all coalesced operationIds (io.to(socketId) works cross- pod)
209192 pending . opToSocket . forEach ( ( socketId , opId ) => {
210- const sock = io . sockets . sockets . get ( socketId )
211- if ( sock ) {
212- sock . emit ( 'operation-confirmed' , { operationId : opId , serverTimestamp : Date . now ( ) } )
213- }
193+ io . to ( socketId ) . emit ( 'operation-confirmed' , {
194+ operationId : opId ,
195+ serverTimestamp : Date . now ( ) ,
196+ } )
214197 } )
215198 } else {
216199 pending . opToSocket . forEach ( ( socketId , opId ) => {
217- const sock = io . sockets . sockets . get ( socketId )
218- if ( sock ) {
219- sock . emit ( 'operation-failed' , {
220- operationId : opId ,
221- error : 'Block no longer exists' ,
222- retryable : false ,
223- } )
224- }
200+ io . to ( socketId ) . emit ( 'operation-failed' , {
201+ operationId : opId ,
202+ error : 'Block no longer exists' ,
203+ retryable : false ,
204+ } )
225205 } )
226206 }
227207 } catch ( error ) {
228208 logger . error ( 'Error flushing subblock update:' , error )
229209 pending . opToSocket . forEach ( ( socketId , opId ) => {
230- const sock = io . sockets . sockets . get ( socketId )
231- if ( sock ) {
232- sock . emit ( 'operation-failed' , {
233- operationId : opId ,
234- error : error instanceof Error ? error . message : 'Unknown error' ,
235- retryable : true ,
236- } )
237- }
210+ io . to ( socketId ) . emit ( 'operation-failed' , {
211+ operationId : opId ,
212+ error : error instanceof Error ? error . message : 'Unknown error' ,
213+ retryable : true ,
214+ } )
238215 } )
239216 }
240217}
0 commit comments