@@ -11,40 +11,51 @@ const handlers: MessageHandler[] = [];
1111export function connect ( url : string = 'ws://localhost:3333' ) : void {
1212 connectAttempts ++ ;
1313 const attempt = connectAttempts ;
14- debugLog ( 'tw-overlay' , `ws connect() attempt #${ attempt } to ${ url } | readyState of previous socket: ${ socket ?. readyState ?? 'none' } ` ) ;
14+ const t0 = performance . now ( ) ;
15+ const ts = ( ) => `+${ ( performance . now ( ) - t0 ) . toFixed ( 0 ) } ms` ;
16+ debugLog ( 'tw-overlay' , `ws connect() attempt #${ attempt } to ${ url } | readyState of previous socket: ${ socket ?. readyState ?? 'none' } [${ ts ( ) } ]` ) ;
1517
1618 try {
1719 socket = new WebSocket ( url ) ;
1820 } catch ( err ) {
19- console . error ( `[tw-overlay][ws] WebSocket constructor threw:` , err ) ;
21+ console . error ( `[tw-overlay][ws] WebSocket constructor threw [ ${ ts ( ) } ] :` , err ) ;
2022 return ;
2123 }
2224
23- debugLog ( 'tw-overlay' , `ws WebSocket created, readyState=${ socket . readyState } (0=CONNECTING)` ) ;
25+ debugLog ( 'tw-overlay' , `ws WebSocket created, readyState=${ socket . readyState } (0=CONNECTING) [ ${ ts ( ) } ] ` ) ;
2426
2527 socket . addEventListener ( 'open' , ( ) => {
2628 connected = true ;
2729 connectAttempts = 0 ; // Reset backoff on successful connection
28- debugLog ( 'tw-overlay' , `ws OPEN (attempt #${ attempt } ) — registering as overlay` ) ;
30+ debugLog ( 'tw-overlay' , `ws OPEN (attempt #${ attempt } ) [ ${ ts ( ) } ] — registering as overlay` ) ;
2931 // Register as overlay so the server can route messages to us
3032 send ( { type : 'REGISTER' , role : 'overlay' } ) ;
3133 window . dispatchEvent ( new CustomEvent ( 'overlay-ws-connected' ) ) ;
3234 } ) ;
3335
3436 socket . addEventListener ( 'close' , ( event ) => {
35- debugWarn ( 'tw-overlay' , `ws CLOSE (attempt #${ attempt } ) — code=${ event . code } reason="${ event . reason } " wasClean=${ event . wasClean } | was connected=${ connected } ` ) ;
37+ debugWarn ( 'tw-overlay' , `ws CLOSE (attempt #${ attempt } ) [ ${ ts ( ) } ] — code=${ event . code } reason="${ event . reason } " wasClean=${ event . wasClean } | was connected=${ connected } ` ) ;
3638 connected = false ;
3739 socket = null ;
3840 window . dispatchEvent ( new CustomEvent ( 'overlay-ws-disconnected' ) ) ;
3941 // Exponential backoff: 500ms, 1s, 2s, 3s (cap)
4042 const delay = Math . min ( 500 * Math . pow ( 2 , connectAttempts - 1 ) , 3000 ) ;
41- debugLog ( 'tw-overlay' , `ws Will reconnect in ${ delay } ms…` ) ;
43+ debugLog ( 'tw-overlay' , `ws Will reconnect in ${ delay } ms… [ ${ ts ( ) } ] ` ) ;
4244 reconnectTimer = setTimeout ( ( ) => connect ( url ) , delay ) ;
4345 } ) ;
4446
47+ socket . addEventListener ( 'error' , ( err ) => {
48+ console . error ( `[tw-overlay][ws] ERROR (attempt #${ attempt } ) [${ ts ( ) } ] — connected=${ connected } readyState=${ socket ?. readyState } ` , err ) ;
49+ } ) ;
50+
51+ let firstMessage = true ;
4552 socket . addEventListener ( 'message' , ( event ) => {
4653 try {
4754 const data = JSON . parse ( event . data ) ;
55+ if ( firstMessage ) {
56+ debugLog ( 'tw-overlay' , `WS ← first message: ${ data . type ?? 'unknown' } [${ ts ( ) } ]` ) ;
57+ firstMessage = false ;
58+ }
4859 debugLog ( 'tw-overlay' , `WS ← ${ data . type ?? 'unknown' } ` , data ) ;
4960 for ( const handler of handlers ) {
5061 handler ( data ) ;
@@ -53,10 +64,6 @@ export function connect(url: string = 'ws://localhost:3333'): void {
5364 console . error ( '[tw-overlay] Failed to parse message:' , err ) ;
5465 }
5566 } ) ;
56-
57- socket . addEventListener ( 'error' , ( err ) => {
58- console . error ( `[tw-overlay][ws] ERROR (attempt #${ attempt } ) — connected=${ connected } readyState=${ socket ?. readyState } ` , err ) ;
59- } ) ;
6067}
6168
6269export function send ( data : object ) : void {
0 commit comments