From 84858977da856b717eaa589b549a6b1f625e215b Mon Sep 17 00:00:00 2001 From: "Samuel EF. Tinnerholm" Date: Sun, 24 May 2026 19:48:05 +0300 Subject: [PATCH] fix: gemini-titan websocket non-null guards + 30s handshake timeout Fixes #235 Fixes #236 --- core/src/exchanges/gemini-titan/websocket.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/core/src/exchanges/gemini-titan/websocket.ts b/core/src/exchanges/gemini-titan/websocket.ts index ceb39ba9..227dab54 100644 --- a/core/src/exchanges/gemini-titan/websocket.ts +++ b/core/src/exchanges/gemini-titan/websocket.ts @@ -62,7 +62,10 @@ export class GeminiWebSocket { ? this.auth.buildWsHeaders() : {}; - this.ws = new WebSocket(this.config.wsUrl, { headers }); + this.ws = new WebSocket(this.config.wsUrl, { + headers, + handshakeTimeout: 30_000, + }); this.ws.on('open', () => { this.isConnected = true; @@ -274,7 +277,12 @@ export class GeminiWebSocket { if (!this.orderBookResolvers.has(symbol)) { this.orderBookResolvers.set(symbol, []); } - this.orderBookResolvers.get(symbol)!.push({ resolve, reject }); + const resolvers = this.orderBookResolvers.get(symbol); + if (!resolvers) { + reject(new Error(`[gemini-titan] resolver queue missing for ${symbol}`)); + return; + } + resolvers.push({ resolve, reject }); }); return withWatchTimeout( @@ -303,7 +311,12 @@ export class GeminiWebSocket { if (!this.tradeResolvers.has(symbol)) { this.tradeResolvers.set(symbol, []); } - this.tradeResolvers.get(symbol)!.push({ resolve, reject }); + const resolvers = this.tradeResolvers.get(symbol); + if (!resolvers) { + reject(new Error(`[gemini-titan] resolver queue missing for ${symbol}`)); + return; + } + resolvers.push({ resolve, reject }); }); return withWatchTimeout(