From e3ea353b220953d6991e0d92f925a49813f3be7d Mon Sep 17 00:00:00 2001 From: evanpelle Date: Wed, 18 Dec 2024 10:53:26 -0800 Subject: [PATCH] log locally for transport related logs to avoid stack overflow --- TODO.txt | 2 +- src/client/LogSender.ts | 34 ++++++++++++++++++++--------- src/client/Transport.ts | 16 +++++++------- src/core/configuration/DevConfig.ts | 2 +- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/TODO.txt b/TODO.txt index 00fb0fbf5..20288bb03 100644 --- a/TODO.txt +++ b/TODO.txt @@ -242,7 +242,7 @@ * better error logging in server DONE 12/16/2024 * store and archive player cookies DONE 12/17/2024 * make ips less precise for user safety DONE 12/17/2024 -* send client logs back to server +* send client logs back to server * seperate server config from client config * right click brings up player info menu * give naval units health diff --git a/src/client/LogSender.ts b/src/client/LogSender.ts index 3ff203648..f8e610328 100644 --- a/src/client/LogSender.ts +++ b/src/client/LogSender.ts @@ -1,3 +1,11 @@ +declare global { + interface Console { + localLog: typeof console.log; + localWarn: typeof console.warn; + localError: typeof console.error; + } +} + import { EventBus } from "../core/EventBus" import { LogSeverity } from "../core/Schemas" import { SendLogEvent } from "./Transport" @@ -15,22 +23,28 @@ export function initializeLogSender(eventBus: EventBus) { const originalWarn = console.warn const originalError = console.error - const log = (msg: string): void => { - eventBus.emit(new SendLogEvent(LogSeverity.Info, msg)) - originalLog.call(console, msg) // Use the original method + // Define networked logging functions (both local and remote) + const log = (...args: any[]): void => { + eventBus.emit(new SendLogEvent(LogSeverity.Info, args.join(' '))) + originalLog.apply(console, args) } - const warn = (msg: string): void => { - eventBus.emit(new SendLogEvent(LogSeverity.Warn, msg)) - originalWarn.call(console, msg) // Use the original method + const warn = (...args: any[]): void => { + eventBus.emit(new SendLogEvent(LogSeverity.Warn, args.join(' '))) + originalWarn.apply(console, args) } - const error = (msg: string): void => { - eventBus.emit(new SendLogEvent(LogSeverity.Error, msg)) - originalError.call(console, msg) // Use the original method + const error = (...args: any[]): void => { + eventBus.emit(new SendLogEvent(LogSeverity.Error, args.join(' '))) + originalError.apply(console, args) } - // Replace console methods + // Store local-only logging functions + console.localLog = originalLog.bind(console) + console.localWarn = originalWarn.bind(console) + console.localError = originalError.bind(console) + + // Replace main console methods with networked versions console.log = log console.warn = warn console.error = error diff --git a/src/client/Transport.ts b/src/client/Transport.ts index f0a9518d9..1b6b24f5c 100644 --- a/src/client/Transport.ts +++ b/src/client/Transport.ts @@ -175,7 +175,7 @@ export class Transport { this.socket.onopen = () => { console.log('Connected to game server!'); while (this.buffer.length > 0) { - console.log('sending dropped message') + console.localLog('sending dropped message') this.sendMsg(this.buffer.pop()) } onconnect() @@ -184,13 +184,13 @@ export class Transport { onmessage(ServerMessageSchema.parse(JSON.parse(event.data))) }; this.socket.onerror = (err) => { - console.error('Socket encountered error: ', err, 'Closing socket'); + console.localError('Socket encountered error: ', err, 'Closing socket'); this.socket.close(); }; this.socket.onclose = (event: CloseEvent) => { console.log(`WebSocket closed. Code: ${event.code}, Reason: ${event.reason}`); if (event.code != 1000) { - console.log(`reconnecting`) + console.localLog(`reconnecting`) this.connect(onconnect, onmessage) } }; @@ -236,8 +236,8 @@ export class Transport { console.log('on stop: leaving game') this.socket.close() } else { - console.log('WebSocket is not open. Current state:', this.socket.readyState); - console.log('attempting reconnect') + console.localLog('WebSocket is not open. Current state:', this.socket.readyState); + console.localError('attempting reconnect') } this.socket.onclose = (event: CloseEvent) => { } } @@ -368,8 +368,8 @@ export class Transport { }) this.sendMsg(JSON.stringify(msg)) } else { - console.log('WebSocket is not open. Current state:', this.socket.readyState); - console.log('attempting reconnect') + console.localLog('WebSocket is not open. Current state:', this.socket.readyState); + console.localLog('attempting reconnect') } } @@ -378,7 +378,7 @@ export class Transport { this.localServer.onMessage(msg) } else { if (this.socket.readyState == WebSocket.CLOSED || this.socket.readyState == WebSocket.CLOSED) { - console.warn('socket not ready, closing and trying later') + console.localWarn('socket not ready, closing and trying later') this.socket.close() this.socket = null this.connectRemote(this.onconnect, this.onmessage) diff --git a/src/core/configuration/DevConfig.ts b/src/core/configuration/DevConfig.ts index d7ca21282..c51099402 100644 --- a/src/core/configuration/DevConfig.ts +++ b/src/core/configuration/DevConfig.ts @@ -16,7 +16,7 @@ export const devConfig = new class extends DefaultConfig { return 95 } numSpawnPhaseTurns(gameType: GameType): number { - return 40 + return gameType == GameType.Singleplayer ? 40 : 100 // return 100 } gameCreationRate(): number {