@@ -19,18 +19,21 @@ const logger = createLogger('OperationsHandlers')
1919
2020export function setupOperationsHandlers ( socket : AuthenticatedSocket , roomManager : IRoomManager ) {
2121 socket . on ( 'workflow-operation' , async ( data ) => {
22- if ( ! roomManager . isReady ( ) ) {
23- socket . emit ( 'operation-forbidden' , {
24- type : 'ROOM_MANAGER_UNAVAILABLE' ,
25- message : 'Realtime unavailable' ,
26- } )
27- if ( data ?. operationId ) {
28- socket . emit ( 'operation-failed' , {
29- operationId : data . operationId ,
30- error : 'Realtime unavailable' ,
31- retryable : true ,
32- } )
22+ const emitOperationError = (
23+ forbidden : { type : string ; message : string ; operation ?: string ; target ?: string } ,
24+ failed ?: { error : string ; retryable ?: boolean }
25+ ) => {
26+ socket . emit ( 'operation-forbidden' , forbidden )
27+ if ( failed && data ?. operationId ) {
28+ socket . emit ( 'operation-failed' , { operationId : data . operationId , ...failed } )
3329 }
30+ }
31+
32+ if ( ! roomManager . isReady ( ) ) {
33+ emitOperationError (
34+ { type : 'ROOM_MANAGER_UNAVAILABLE' , message : 'Realtime unavailable' } ,
35+ { error : 'Realtime unavailable' , retryable : true }
36+ )
3437 return
3538 }
3639
@@ -42,43 +45,37 @@ export function setupOperationsHandlers(socket: AuthenticatedSocket, roomManager
4245 session = await roomManager . getUserSession ( socket . id )
4346 } catch ( error ) {
4447 logger . error ( 'Error loading session for workflow operation:' , error )
45- socket . emit ( 'operation-forbidden' , {
46- type : 'ROOM_MANAGER_UNAVAILABLE' ,
47- message : 'Realtime unavailable' ,
48- } )
49- if ( data ?. operationId ) {
50- socket . emit ( 'operation-failed' , {
51- operationId : data . operationId ,
52- error : 'Realtime unavailable' ,
53- retryable : true ,
54- } )
55- }
48+ emitOperationError (
49+ { type : 'ROOM_MANAGER_UNAVAILABLE' , message : 'Realtime unavailable' } ,
50+ { error : 'Realtime unavailable' , retryable : true }
51+ )
5652 return
5753 }
5854
5955 if ( ! workflowId || ! session ) {
60- socket . emit ( 'operation-forbidden' , {
61- type : 'SESSION_ERROR' ,
62- message : 'Session expired, please rejoin workflow' ,
63- } )
64- if ( data ?. operationId ) {
65- socket . emit ( 'operation-failed' , { operationId : data . operationId , error : 'Session expired' } )
66- }
56+ emitOperationError (
57+ { type : 'SESSION_ERROR' , message : 'Session expired, please rejoin workflow' } ,
58+ { error : 'Session expired' }
59+ )
6760 return
6861 }
6962
70- const hasRoom = await roomManager . hasWorkflowRoom ( workflowId )
63+ let hasRoom = false
64+ try {
65+ hasRoom = await roomManager . hasWorkflowRoom ( workflowId )
66+ } catch ( error ) {
67+ logger . error ( 'Error checking workflow room:' , error )
68+ emitOperationError (
69+ { type : 'ROOM_MANAGER_UNAVAILABLE' , message : 'Realtime unavailable' } ,
70+ { error : 'Realtime unavailable' , retryable : true }
71+ )
72+ return
73+ }
7174 if ( ! hasRoom ) {
72- socket . emit ( 'operation-forbidden' , {
73- type : 'ROOM_NOT_FOUND' ,
74- message : 'Workflow room not found' ,
75- } )
76- if ( data ?. operationId ) {
77- socket . emit ( 'operation-failed' , {
78- operationId : data . operationId ,
79- error : 'Workflow room not found' ,
80- } )
81- }
75+ emitOperationError (
76+ { type : 'ROOM_NOT_FOUND' , message : 'Workflow room not found' } ,
77+ { error : 'Workflow room not found' }
78+ )
8279 return
8380 }
8481
@@ -111,15 +108,15 @@ export function setupOperationsHandlers(socket: AuthenticatedSocket, roomManager
111108 // Check permissions from cached role for all other operations
112109 if ( ! userPresence ) {
113110 logger . warn ( `User presence not found for socket ${ socket . id } ` )
114- socket . emit ( 'operation-forbidden' , {
115- type : 'SESSION_ERROR' ,
116- message : 'User session not found ',
117- operation ,
118- target ,
119- } )
120- if ( operationId ) {
121- socket . emit ( 'operation-failed' , { operationId , error : 'User session not found' } )
122- }
111+ emitOperationError (
112+ {
113+ type : 'SESSION_ERROR ',
114+ message : 'User session not found' ,
115+ operation ,
116+ target ,
117+ } ,
118+ { error : 'User session not found' }
119+ )
123120 return
124121 }
125122
@@ -131,7 +128,7 @@ export function setupOperationsHandlers(socket: AuthenticatedSocket, roomManager
131128 logger . warn (
132129 `User ${ session . userId } (role: ${ userPresence . role } ) forbidden from ${ operation } on ${ target } `
133130 )
134- socket . emit ( 'operation-forbidden' , {
131+ emitOperationError ( {
135132 type : 'INSUFFICIENT_PERMISSIONS' ,
136133 message : `${ permissionCheck . reason } on '${ target } '` ,
137134 operation,
0 commit comments