diff --git a/package-lock.json b/package-lock.json index dab9740..6f65234 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitget-api", - "version": "2.3.2", + "version": "2.3.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bitget-api", - "version": "2.3.2", + "version": "2.3.3", "license": "MIT", "dependencies": { "axios": "^1.6.1", diff --git a/package.json b/package.json index 31cac0c..2eb56f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bitget-api", - "version": "2.3.2", + "version": "2.3.3", "description": "Node.js & JavaScript SDK for Bitget REST APIs & WebSockets, with TypeScript & end-to-end tests.", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/util/BaseWSClient.ts b/src/util/BaseWSClient.ts index be6c277..ec33cf5 100644 --- a/src/util/BaseWSClient.ts +++ b/src/util/BaseWSClient.ts @@ -8,7 +8,7 @@ import { } from '../types/index'; import { DefaultLogger } from './logger'; import { isWsPong } from './requestUtils'; -import { getWsAuthSignature } from './websocket-util'; +import { getWsAuthSignature, safeTerminateWs } from './websocket-util'; import WsStore from './WsStore'; import { WsConnectionStateEnum } from './WsStore.types'; @@ -191,7 +191,7 @@ export abstract class BaseWebsocketClient< const ws = this.getWs(wsKey); ws?.close(); if (force) { - ws?.terminate(); + safeTerminateWs(ws); } } @@ -340,7 +340,7 @@ export abstract class BaseWebsocketClient< ...LOGGER_CATEGORY, wsKey, }); - this.getWs(wsKey)?.terminate(); + safeTerminateWs(this.getWs(wsKey), true); delete this.wsStore.get(wsKey, true).activePongTimer; }, this.options.pongTimeout); } diff --git a/src/util/websocket-util.ts b/src/util/websocket-util.ts index 13a1305..509cc9c 100644 --- a/src/util/websocket-util.ts +++ b/src/util/websocket-util.ts @@ -178,3 +178,25 @@ export async function getWsAuthSignature( signature, }; } + +/** + * #305: ws.terminate() is undefined in browsers. + * This only works in node.js, not in browsers. + * Does nothing if `ws` is undefined. Does nothing in browsers. + */ +export function safeTerminateWs( + ws?: WebSocket | any, + fallbackToClose?: boolean, +): boolean { + if (!ws) { + return false; + } + if (typeof ws['terminate'] === 'function') { + ws.terminate(); + return true; + } else if (fallbackToClose) { + ws.close(); + } + + return false; +} diff --git a/src/websocket-client.ts b/src/websocket-client.ts index 86182ec..dd9c2d4 100644 --- a/src/websocket-client.ts +++ b/src/websocket-client.ts @@ -18,6 +18,7 @@ import { isPrivateChannel, isWsPong, neverGuard, + safeTerminateWs, WS_AUTH_ON_CONNECT_KEYS, WS_BASE_URL_MAP, WS_KEY_MAP, @@ -185,7 +186,7 @@ export class WebsocketClient extends EventEmitter { const ws = this.getWs(wsKey); ws?.close(); if (force) { - ws?.terminate(); + safeTerminateWs(ws); } } @@ -341,7 +342,7 @@ export class WebsocketClient extends EventEmitter { ...LOGGER_CATEGORY, wsKey, }); - this.getWs(wsKey)?.terminate(); + safeTerminateWs(this.getWs(wsKey), true); delete this.wsStore.get(wsKey, true).activePongTimer; }, this.options.pongTimeout); }