From 6a323764204c2f72f0cf064b235b97de4ba3bd1b Mon Sep 17 00:00:00 2001 From: cte Date: Wed, 3 Sep 2025 00:58:57 -0700 Subject: [PATCH] More socket-io client logging improvements --- packages/cloud/src/bridge/SocketTransport.ts | 80 ++++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/packages/cloud/src/bridge/SocketTransport.ts b/packages/cloud/src/bridge/SocketTransport.ts index eb8b6146fac6..2df3cf95eba6 100644 --- a/packages/cloud/src/bridge/SocketTransport.ts +++ b/packages/cloud/src/bridge/SocketTransport.ts @@ -7,7 +7,7 @@ export interface SocketTransportOptions { socketOptions: Partial onConnect?: () => void | Promise onDisconnect?: (reason: string) => void - onReconnect?: (attemptNumber: number) => void | Promise + onReconnect?: () => void | Promise logger?: { log: (message: string, ...args: unknown[]) => void error: (message: string, ...args: unknown[]) => void @@ -23,7 +23,7 @@ export class SocketTransport { private socket: Socket | null = null private connectionState: ConnectionState = ConnectionState.DISCONNECTED private retryTimeout: NodeJS.Timeout | null = null - private hasConnectedOnce: boolean = false + private isPreviouslyConnected: boolean = false private readonly retryConfig: RetryConfig = { maxInitialAttempts: Infinity, @@ -48,12 +48,12 @@ export class SocketTransport { // kicks in after a successful initial connection. public async connect(): Promise { if (this.connectionState === ConnectionState.CONNECTED) { - console.log(`[SocketTransport] Already connected`) + console.log(`[SocketTransport#connect] Already connected`) return } if (this.connectionState === ConnectionState.CONNECTING || this.connectionState === ConnectionState.RETRYING) { - console.log(`[SocketTransport] Connection attempt already in progress`) + console.log(`[SocketTransport#connect] Already in progress`) return } @@ -61,18 +61,11 @@ export class SocketTransport { let delay = this.retryConfig.initialDelay while (attempt < this.retryConfig.maxInitialAttempts) { - console.log(`[SocketTransport] Initial connect attempt ${attempt + 1}`) + console.log(`[SocketTransport#connect] attempt = ${attempt + 1}, delay = ${delay}ms`) this.connectionState = attempt === 0 ? ConnectionState.CONNECTING : ConnectionState.RETRYING try { await this._connect() - console.log(`[SocketTransport] Connected to ${this.options.url}`) - this.connectionState = ConnectionState.CONNECTED - - if (this.options.onConnect) { - await this.options.onConnect() - } - break } catch (_error) { attempt++ @@ -82,8 +75,6 @@ export class SocketTransport { this.socket = null } - console.log(`[SocketTransport] Waiting ${delay}ms before retry...`) - const promise = new Promise((resolve) => { this.retryTimeout = setTimeout(resolve, delay) }) @@ -99,11 +90,12 @@ export class SocketTransport { this.retryTimeout = null } - if (this.connectionState === ConnectionState.CONNECTED) { - console.log(`[SocketTransport] Connected to ${this.options.url}`) + if (this.socket?.connected) { + console.log(`[SocketTransport#connect] connected - ${this.options.url}`) } else { + // Since we have infinite retries this should never happen. this.connectionState = ConnectionState.FAILED - console.error(`[SocketTransport] Failed to connect to ${this.options.url}, giving up`) + console.error(`[SocketTransport#connect] Giving up`) } } @@ -112,7 +104,7 @@ export class SocketTransport { this.socket = io(this.options.url, this.options.socketOptions) let connectionTimeout: NodeJS.Timeout | null = setTimeout(() => { - console.error(`[SocketTransport] failed to connect after ${this.CONNECTION_TIMEOUT}ms`) + console.error(`[SocketTransport#_connect] failed to connect after ${this.CONNECTION_TIMEOUT}ms`) if (this.connectionState !== ConnectionState.CONNECTED) { this.socket?.disconnect() @@ -122,22 +114,28 @@ export class SocketTransport { // https://socket.io/docs/v4/client-api/#event-connect this.socket.on("connect", async () => { - console.log(`[SocketTransport] on(connect)`) + console.log( + `[SocketTransport#_connect] on(connect): isPreviouslyConnected = ${this.isPreviouslyConnected}`, + ) if (connectionTimeout) { clearTimeout(connectionTimeout) connectionTimeout = null } - if (this.hasConnectedOnce) { - this.connectionState = ConnectionState.CONNECTED + this.connectionState = ConnectionState.CONNECTED + if (this.isPreviouslyConnected) { if (this.options.onReconnect) { - await this.options.onReconnect(0) + await this.options.onReconnect() + } + } else { + if (this.options.onConnect) { + await this.options.onConnect() } } - this.hasConnectedOnce = true + this.isPreviouslyConnected = true resolve() }) @@ -153,7 +151,9 @@ export class SocketTransport { // https://socket.io/docs/v4/client-api/#event-disconnect this.socket.on("disconnect", (reason, details) => { - console.log(`[SocketTransport] on(disconnect) (reason: ${reason}, details: ${JSON.stringify(details)})`) + console.log( + `[SocketTransport#_connect] on(disconnect) (reason: ${reason}, details: ${JSON.stringify(details)})`, + ) this.connectionState = ConnectionState.DISCONNECTED if (this.options.onDisconnect) { @@ -163,12 +163,12 @@ export class SocketTransport { // Don't attempt to reconnect if we're manually disconnecting. const isManualDisconnect = reason === "io client disconnect" - if (!isManualDisconnect && this.hasConnectedOnce) { + if (!isManualDisconnect && this.isPreviouslyConnected) { // After successful initial connection, rely entirely on // Socket.IO's reconnection logic. - console.log("[SocketTransport] will attempt to reconnect") + console.log("[SocketTransport#_connect] will attempt to reconnect") } else { - console.log("[SocketTransport] will *NOT* attempt to reconnect") + console.log("[SocketTransport#_connect] will *NOT* attempt to reconnect") } }) @@ -177,7 +177,7 @@ export class SocketTransport { this.socket.io.on("error", (error) => { // Connection error. if (connectionTimeout && this.connectionState !== ConnectionState.CONNECTED) { - console.error(`[SocketTransport] on(error): ${error.message}`) + console.error(`[SocketTransport#_connect] on(error): ${error.message}`) clearTimeout(connectionTimeout) connectionTimeout = null reject(error) @@ -185,45 +185,45 @@ export class SocketTransport { // Post-connection error. if (this.connectionState === ConnectionState.CONNECTED) { - console.error(`[SocketTransport] on(error): ${error.message}`) + console.error(`[SocketTransport#_connect] on(error): ${error.message}`) } }) // https://socket.io/docs/v4/client-api/#event-reconnect // Fired upon a successful reconnection. this.socket.io.on("reconnect", (attempt) => { - console.log(`[SocketTransport] on(reconnect) - ${attempt}`) + console.log(`[SocketTransport#_connect] on(reconnect) - ${attempt}`) this.connectionState = ConnectionState.CONNECTED if (this.options.onReconnect) { - this.options.onReconnect(attempt) + this.options.onReconnect() } }) // https://socket.io/docs/v4/client-api/#event-reconnect_attempt // Fired upon an attempt to reconnect. this.socket.io.on("reconnect_attempt", (attempt) => { - console.log(`[SocketTransport] on(reconnect_attempt) - ${attempt}`) + console.log(`[SocketTransport#_connect] on(reconnect_attempt) - ${attempt}`) }) // https://socket.io/docs/v4/client-api/#event-reconnect_error // Fired upon a reconnection attempt error. this.socket.io.on("reconnect_error", (error) => { - console.error(`[SocketTransport] on(reconnect_error): ${error.message}`) + console.error(`[SocketTransport#_connect] on(reconnect_error): ${error.message}`) }) // https://socket.io/docs/v4/client-api/#event-reconnect_failed // Fired when couldn't reconnect within `reconnectionAttempts`. // Since we use infinite retries, this should never fire. this.socket.io.on("reconnect_failed", () => { - console.error(`[SocketTransport] on(reconnect_failed) - giving up`) + console.error(`[SocketTransport#_connect] on(reconnect_failed) - giving up`) this.connectionState = ConnectionState.FAILED }) // This is a custom event fired by the server. this.socket.on("auth_error", (error) => { console.error( - `[SocketTransport] on(auth_error): ${error instanceof Error ? error.message : String(error)}`, + `[SocketTransport#_connect] on(auth_error): ${error instanceof Error ? error.message : String(error)}`, ) if (connectionTimeout && this.connectionState !== ConnectionState.CONNECTED) { @@ -236,7 +236,7 @@ export class SocketTransport { } public async disconnect(): Promise { - console.log(`[SocketTransport] Disconnecting...`) + console.log(`[SocketTransport#disconnect] Disconnecting...`) if (this.retryTimeout) { clearTimeout(this.retryTimeout) @@ -251,7 +251,7 @@ export class SocketTransport { } this.connectionState = ConnectionState.DISCONNECTED - console.log(`[SocketTransport] Disconnected`) + console.log(`[SocketTransport#disconnect] Disconnected`) } public getSocket(): Socket | null { @@ -267,14 +267,14 @@ export class SocketTransport { } public async reconnect(): Promise { - console.log(`[SocketTransport] Manually reconnecting...`) + console.log(`[SocketTransport#reconnect] Manually reconnecting...`) if (this.connectionState === ConnectionState.CONNECTED) { - console.log(`[SocketTransport] Already connected`) + console.log(`[SocketTransport#reconnect] Already connected`) return } - this.hasConnectedOnce = false + this.isPreviouslyConnected = false await this.disconnect() await this.connect() }