@@ -96,6 +96,21 @@ export function SocketProvider({ children, user }: SocketProviderProps) {
9696 workflowDeleted ?: ( data : any ) => void
9797 } > ( { } )
9898
99+ // Helper function to generate a fresh socket token
100+ const generateSocketToken = async ( ) : Promise < string > => {
101+ const tokenResponse = await fetch ( '/api/auth/socket-token' , {
102+ method : 'POST' ,
103+ credentials : 'include' ,
104+ } )
105+
106+ if ( ! tokenResponse . ok ) {
107+ throw new Error ( 'Failed to generate socket token' )
108+ }
109+
110+ const { token } = await tokenResponse . json ( )
111+ return token
112+ }
113+
99114 // Initialize socket when user is available - only once per session
100115 useEffect ( ( ) => {
101116 if ( ! user ?. id ) return
@@ -111,17 +126,8 @@ export function SocketProvider({ children, user }: SocketProviderProps) {
111126
112127 const initializeSocket = async ( ) => {
113128 try {
114- // Generate one-time token for socket authentication
115- const tokenResponse = await fetch ( '/api/auth/socket-token' , {
116- method : 'POST' ,
117- credentials : 'include' ,
118- } )
119-
120- if ( ! tokenResponse . ok ) {
121- throw new Error ( 'Failed to generate socket token' )
122- }
123-
124- const { token } = await tokenResponse . json ( )
129+ // Generate initial token for socket authentication
130+ const token = await generateSocketToken ( )
125131
126132 const socketUrl = process . env . NEXT_PUBLIC_SOCKET_URL || 'http://localhost:3002'
127133
@@ -139,8 +145,17 @@ export function SocketProvider({ children, user }: SocketProviderProps) {
139145 reconnectionDelay : 1000 , // Start with 1 second delay
140146 reconnectionDelayMax : 5000 , // Max 5 second delay
141147 timeout : 10000 , // Back to original timeout
142- auth : {
143- token, // Send one-time token for authentication
148+ auth : ( cb ) => {
149+ // Generate a fresh token for each connection attempt (including reconnections)
150+ generateSocketToken ( )
151+ . then ( ( freshToken ) => {
152+ logger . info ( 'Generated fresh token for connection attempt' )
153+ cb ( { token : freshToken } )
154+ } )
155+ . catch ( ( error ) => {
156+ logger . error ( 'Failed to generate fresh token for connection:' , error )
157+ cb ( { token : null } ) // This will cause authentication to fail gracefully
158+ } )
144159 } ,
145160 } )
146161
@@ -178,33 +193,45 @@ export function SocketProvider({ children, user }: SocketProviderProps) {
178193 transport : error . transport ,
179194 } )
180195
181- // With 24-hour token expiry, authentication errors indicate a more serious issue
182- // that requires user intervention (e.g., session expired, user logged out)
196+ // Authentication errors now indicate either session expiry or token generation issues
183197 if (
184198 error . message ?. includes ( 'Token validation failed' ) ||
185- error . message ?. includes ( 'Authentication failed' )
199+ error . message ?. includes ( 'Authentication failed' ) ||
200+ error . message ?. includes ( 'Authentication required' )
186201 ) {
187- logger . warn ( 'Authentication failed - user may need to refresh page or re-login' )
202+ logger . warn ( 'Authentication failed - this could indicate session expiry or token generation issues' )
203+ // The fresh token generation on each attempt should handle most cases automatically
204+ // If this persists, user may need to refresh page or re-login
188205 }
189206 } )
190207
191208 // Socket.IO provides reconnection logging with attempt numbers
192209 socketInstance . on ( 'reconnect' , ( attemptNumber ) => {
193- logger . info ( 'Socket reconnected' , {
210+ logger . info ( 'Socket reconnected successfully ' , {
194211 attemptNumber,
212+ socketId : socketInstance . id ,
213+ transport : socketInstance . io . engine ?. transport ?. name ,
195214 } )
196215 } )
197216
198217 socketInstance . on ( 'reconnect_attempt' , ( attemptNumber ) => {
199- logger . info ( 'Socket reconnection attempt' , { attemptNumber } )
218+ logger . info ( 'Socket reconnection attempt (fresh token will be generated)' , {
219+ attemptNumber,
220+ timestamp : new Date ( ) . toISOString ( ) ,
221+ } )
200222 } )
201223
202224 socketInstance . on ( 'reconnect_error' , ( error : any ) => {
203- logger . error ( 'Socket reconnection error:' , error )
225+ logger . error ( 'Socket reconnection error:' , {
226+ message : error . message ,
227+ attemptNumber : error . attemptNumber ,
228+ type : error . type ,
229+ } )
204230 } )
205231
206232 socketInstance . on ( 'reconnect_failed' , ( ) => {
207233 logger . error ( 'Socket reconnection failed - all attempts exhausted' )
234+ setIsConnecting ( false )
208235 } )
209236
210237 // Presence events
0 commit comments