Skip to content

Commit af538ec

Browse files
committed
chore(): refactor to new ws event keys
1 parent 9abe4b4 commit af538ec

File tree

3 files changed

+52
-92
lines changed

3 files changed

+52
-92
lines changed

src/util/BaseWSClient.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import {
2222
import WsStore from './WsStore';
2323
import { WSConnectedResult, WsConnectionStateEnum } from './WsStore.types';
2424

25-
interface WSClientEventMap<WsKey extends string> {
25+
export interface WSClientEventMap<
26+
WsKey extends string,
27+
TUpdateEventData = any,
28+
> {
2629
/** Connection opened. If this connection was previously opened and reconnected, expect the reconnected event instead */
2730
open: (evt: {
2831
wsKey: WsKey;
@@ -52,7 +55,7 @@ interface WSClientEventMap<WsKey extends string> {
5255
update: (response: any & { wsKey: WsKey }) => void;
5356

5457
/** Exception from ws client OR custom listeners (e.g. if you throw inside your event handler) */
55-
exception: (response: any & { wsKey: WsKey }) => void;
58+
exception: (response: TUpdateEventData & { wsKey: WsKey }) => void;
5659

5760
/** Confirmation that a connection successfully authenticated */
5861
authenticated: (event: { wsKey: WsKey; event: any }) => void;

src/websocket-client-legacy.ts

Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable @typescript-eslint/no-unused-vars */
12
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
23
import { EventEmitter } from 'events';
34
import WebSocket from 'isomorphic-ws';
@@ -10,7 +11,6 @@ import {
1011
WsChannelSubUnSubRequestArg,
1112
WSClientConfigurableOptions,
1213
WsDataEvent,
13-
WsEvent,
1414
WsSubRequest,
1515
WsUnsubRequest,
1616
} from './types';
@@ -29,6 +29,7 @@ import {
2929
PUBLIC_WS_KEYS,
3030
WS_KEY_MAP,
3131
} from './util';
32+
import { WSClientEventMap } from './util/BaseWSClient';
3233
import { signMessage } from './util/webCryptoAPI';
3334
import {
3435
getWsKeyForMarket,
@@ -41,42 +42,20 @@ import {
4142
import WsStore from './util/WsStore';
4243
import { WsConnectionStateEnum } from './util/WsStore.types';
4344

44-
type WsKeyObject = { wsKey: WsKey };
45-
46-
interface WebsocketClientEvents {
47-
/** Connection opened. If this connection was previously opened and reconnected, expect the reconnected event instead */
48-
open: (evt: { event: any } & WsKeyObject) => void;
49-
/** Reconnecting a dropped connection */
50-
reconnect: (evt: { event: any } & WsKeyObject) => void;
51-
/** Successfully reconnected a connection that dropped */
52-
reconnected: (evt: { event: any } & WsKeyObject) => void;
53-
/** Connection closed */
54-
close: (evt: { event: any } & WsKeyObject) => void;
55-
/** Received reply to websocket command (e.g. after subscribing to topics or authenticating) */
56-
response: (response: WsEvent & WsKeyObject) => void;
57-
/** Received data for a topic/channel */
58-
update: (response: WsDataEvent & WsKeyObject) => void;
59-
/** Exception from ws client OR custom listeners */
60-
error: (response: any) => void;
61-
}
62-
6345
// Type safety for on and emit handlers: https://stackoverflow.com/a/61609010/880837
64-
export declare interface WebsocketClientLegacy {
65-
on<U extends keyof WebsocketClientEvents>(
46+
export declare interface WebsocketClient {
47+
on<U extends keyof WSClientEventMap<WsKey, WsDataEvent>>(
6648
event: U,
67-
listener: WebsocketClientEvents[U],
49+
listener: WSClientEventMap<WsKey>[U],
6850
): this;
6951

70-
emit<U extends keyof WebsocketClientEvents>(
52+
emit<U extends keyof WSClientEventMap<WsKey, WsDataEvent>>(
7153
event: U,
72-
...args: Parameters<WebsocketClientEvents[U]>
54+
...args: Parameters<WSClientEventMap<WsKey>[U]>
7355
): boolean;
7456
}
7557

76-
/**
77-
* @deprecated Previous generation WS Client will be removed soon. Use the new WebsocketClient instead.
78-
*/
79-
export class WebsocketClientLegacy extends EventEmitter {
58+
export class WebsocketClient extends EventEmitter {
8059
private logger: typeof DefaultLogger;
8160

8261
private options: WebsocketClientOptions;
@@ -102,6 +81,7 @@ export class WebsocketClientLegacy extends EventEmitter {
10281
authPrivateConnectionsOnConnect: true,
10382
// Individual requests do not require a signature, so this is disabled.
10483
authPrivateRequests: false,
84+
10585
...options,
10686
};
10787

@@ -110,9 +90,6 @@ export class WebsocketClientLegacy extends EventEmitter {
11090
'ERROR: to use demo trading, set the "demoTrading: true" flag in the constructor',
11191
);
11292
}
113-
114-
// add default error handling so this doesn't crash node (if the user didn't set a handler)
115-
this.on('error', () => {});
11693
}
11794

11895
/**
@@ -287,7 +264,7 @@ export class WebsocketClientLegacy extends EventEmitter {
287264
private parseWsError(context: string, error: any, wsKey: WsKey) {
288265
if (!error.message) {
289266
this.logger.error(`${context} due to unexpected error: `, error);
290-
this.emit('error', error);
267+
this.emit('exception', error);
291268
return;
292269
}
293270

@@ -311,7 +288,7 @@ export class WebsocketClientLegacy extends EventEmitter {
311288
}
312289
break;
313290
}
314-
this.emit('error', error);
291+
this.emit('exception', error);
315292
}
316293

317294
/**
@@ -668,16 +645,21 @@ export class WebsocketClientLegacy extends EventEmitter {
668645
const { protocols = [], ...wsOptions } = this.options.wsOptions || {};
669646
const ws = new WebSocket(url, protocols, wsOptions);
670647

671-
ws.onopen = (event) => this.onWsOpen(event, wsKey);
672-
ws.onmessage = (event) => this.onWsMessage(event, wsKey);
648+
ws.onopen = (event) => this.onWsOpen(event, wsKey, url, ws);
649+
ws.onmessage = (event) => this.onWsMessage(event, wsKey, ws);
673650
ws.onerror = (event) =>
674651
this.parseWsError('Websocket onWsError', event, wsKey);
675652
ws.onclose = (event) => this.onWsClose(event, wsKey);
676653

677654
return ws;
678655
}
679656

680-
private async onWsOpen(event: unknown, wsKey: WsKey) {
657+
private async onWsOpen(
658+
event: WebSocket.Event,
659+
wsKey: WsKey,
660+
url: string,
661+
ws: WebSocket,
662+
) {
681663
if (
682664
this.wsStore.isConnectionState(wsKey, WsConnectionStateEnum.CONNECTING)
683665
) {
@@ -686,15 +668,15 @@ export class WebsocketClientLegacy extends EventEmitter {
686668
wsKey,
687669
market: this.options.market,
688670
});
689-
this.emit('open', { wsKey, event });
671+
this.emit('open', { wsKey, event, wsUrl: url, ws });
690672
} else if (
691673
this.wsStore.isConnectionState(wsKey, WsConnectionStateEnum.RECONNECTING)
692674
) {
693675
this.logger.info('Websocket reconnected', {
694676
...WS_LOGGER_CATEGORY,
695677
wsKey,
696678
});
697-
this.emit('reconnected', { wsKey, event });
679+
this.emit('reconnected', { wsKey, event, wsUrl: url, ws });
698680
}
699681

700682
this.wsStore.setConnectionState(wsKey, WsConnectionStateEnum.CONNECTED);
@@ -721,7 +703,7 @@ export class WebsocketClientLegacy extends EventEmitter {
721703
this.requestSubscribeTopics(wsKey, topics);
722704
}
723705

724-
private onWsMessage(event: any, wsKey: WsKey) {
706+
private onWsMessage(event: any, wsKey: WsKey, ws: WebSocket) {
725707
const logContext = { ...WS_LOGGER_CATEGORY, wsKey, method: 'onWsMessage' };
726708

727709
try {
@@ -737,7 +719,7 @@ export class WebsocketClientLegacy extends EventEmitter {
737719

738720
if (isWsErrorEvent(msg)) {
739721
this.logger.error('WS error event: ', { ...msg, wsKey });
740-
return this.emit('error', { ...msg, wsKey });
722+
return this.emit('exception', { ...msg, wsKey });
741723
}
742724

743725
if (isWsDataEvent(msg)) {
@@ -768,7 +750,7 @@ export class WebsocketClientLegacy extends EventEmitter {
768750
...msg,
769751
wsKey,
770752
});
771-
return this.emit('error', { ...msg, wsKey });
753+
return this.emit('exception', { ...msg, wsKey });
772754
}
773755

774756
if (isWsSubscribeEvent(msg) || isWsUnsubscribeEvent(msg)) {

src/websocket-client.ts

Lines changed: 23 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable @typescript-eslint/no-unused-vars */
12
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
23
import { EventEmitter } from 'events';
34
import WebSocket from 'isomorphic-ws';
@@ -10,7 +11,6 @@ import {
1011
WsChannelSubUnSubRequestArg,
1112
WSClientConfigurableOptions,
1213
WsDataEvent,
13-
WsEvent,
1414
WsSubRequest,
1515
WsUnsubRequest,
1616
} from './types';
@@ -29,6 +29,7 @@ import {
2929
PUBLIC_WS_KEYS,
3030
WS_KEY_MAP,
3131
} from './util';
32+
import { WSClientEventMap } from './util/BaseWSClient';
3233
import { signMessage } from './util/webCryptoAPI';
3334
import {
3435
getWsKeyForMarket,
@@ -41,48 +42,20 @@ import {
4142
import WsStore from './util/WsStore';
4243
import { WsConnectionStateEnum } from './util/WsStore.types';
4344

44-
export type WsClientEvent =
45-
| 'open'
46-
| 'update'
47-
| 'close'
48-
| 'error'
49-
| 'reconnect'
50-
| 'reconnected'
51-
| 'response';
52-
53-
type WsKeyObject = { wsKey: WsKey };
54-
55-
interface WebsocketClientEvents {
56-
/** Connection opened. If this connection was previously opened and reconnected, expect the reconnected event instead */
57-
open: (evt: { event: any } & WsKeyObject) => void;
58-
/** Reconnecting a dropped connection */
59-
reconnect: (evt: { event: any } & WsKeyObject) => void;
60-
/** Successfully reconnected a connection that dropped */
61-
reconnected: (evt: { event: any } & WsKeyObject) => void;
62-
/** Connection closed */
63-
close: (evt: { event: any } & WsKeyObject) => void;
64-
/** Received reply to websocket command (e.g. after subscribing to topics or authenticating) */
65-
response: (response: WsEvent & WsKeyObject) => void;
66-
/** Received data for a topic/channel */
67-
update: (response: WsDataEvent & WsKeyObject) => void;
68-
/** Exception from ws client OR custom listeners */
69-
error: (response: any) => void;
70-
}
71-
7245
// Type safety for on and emit handlers: https://stackoverflow.com/a/61609010/880837
73-
export declare interface WebsocketClient {
74-
on<U extends keyof WebsocketClientEvents>(
46+
export declare interface WebsocketClientLegacy {
47+
on<U extends keyof WSClientEventMap<WsKey, WsDataEvent>>(
7548
event: U,
76-
listener: WebsocketClientEvents[U],
49+
listener: WSClientEventMap<WsKey>[U],
7750
): this;
7851

79-
emit<U extends keyof WebsocketClientEvents>(
52+
emit<U extends keyof WSClientEventMap<WsKey, WsDataEvent>>(
8053
event: U,
81-
...args: Parameters<WebsocketClientEvents[U]>
54+
...args: Parameters<WSClientEventMap<WsKey>[U]>
8255
): boolean;
8356
}
8457

85-
export class WebsocketClient extends EventEmitter {
58+
export class WebsocketClientLegacy extends EventEmitter {
8659
private logger: typeof DefaultLogger;
8760

8861
private options: WebsocketClientOptions;
@@ -117,9 +90,6 @@ export class WebsocketClient extends EventEmitter {
11790
'ERROR: to use demo trading, set the "demoTrading: true" flag in the constructor',
11891
);
11992
}
120-
121-
// add default error handling so this doesn't crash node (if the user didn't set a handler)
122-
this.on('error', () => {});
12393
}
12494

12595
/**
@@ -294,7 +264,7 @@ export class WebsocketClient extends EventEmitter {
294264
private parseWsError(context: string, error: any, wsKey: WsKey) {
295265
if (!error.message) {
296266
this.logger.error(`${context} due to unexpected error: `, error);
297-
this.emit('error', error);
267+
this.emit('exception', error);
298268
return;
299269
}
300270

@@ -318,7 +288,7 @@ export class WebsocketClient extends EventEmitter {
318288
}
319289
break;
320290
}
321-
this.emit('error', error);
291+
this.emit('exception', error);
322292
}
323293

324294
/**
@@ -675,16 +645,21 @@ export class WebsocketClient extends EventEmitter {
675645
const { protocols = [], ...wsOptions } = this.options.wsOptions || {};
676646
const ws = new WebSocket(url, protocols, wsOptions);
677647

678-
ws.onopen = (event) => this.onWsOpen(event, wsKey);
679-
ws.onmessage = (event) => this.onWsMessage(event, wsKey);
648+
ws.onopen = (event) => this.onWsOpen(event, wsKey, url, ws);
649+
ws.onmessage = (event) => this.onWsMessage(event, wsKey, ws);
680650
ws.onerror = (event) =>
681651
this.parseWsError('Websocket onWsError', event, wsKey);
682652
ws.onclose = (event) => this.onWsClose(event, wsKey);
683653

684654
return ws;
685655
}
686656

687-
private async onWsOpen(event: unknown, wsKey: WsKey) {
657+
private async onWsOpen(
658+
event: WebSocket.Event,
659+
wsKey: WsKey,
660+
url: string,
661+
ws: WebSocket,
662+
) {
688663
if (
689664
this.wsStore.isConnectionState(wsKey, WsConnectionStateEnum.CONNECTING)
690665
) {
@@ -693,15 +668,15 @@ export class WebsocketClient extends EventEmitter {
693668
wsKey,
694669
market: this.options.market,
695670
});
696-
this.emit('open', { wsKey, event });
671+
this.emit('open', { wsKey, event, wsUrl: url, ws });
697672
} else if (
698673
this.wsStore.isConnectionState(wsKey, WsConnectionStateEnum.RECONNECTING)
699674
) {
700675
this.logger.info('Websocket reconnected', {
701676
...WS_LOGGER_CATEGORY,
702677
wsKey,
703678
});
704-
this.emit('reconnected', { wsKey, event });
679+
this.emit('reconnected', { wsKey, event, wsUrl: url, ws });
705680
}
706681

707682
this.wsStore.setConnectionState(wsKey, WsConnectionStateEnum.CONNECTED);
@@ -728,7 +703,7 @@ export class WebsocketClient extends EventEmitter {
728703
this.requestSubscribeTopics(wsKey, topics);
729704
}
730705

731-
private onWsMessage(event: any, wsKey: WsKey) {
706+
private onWsMessage(event: any, wsKey: WsKey, ws: WebSocket) {
732707
const logContext = { ...WS_LOGGER_CATEGORY, wsKey, method: 'onWsMessage' };
733708

734709
try {
@@ -744,7 +719,7 @@ export class WebsocketClient extends EventEmitter {
744719

745720
if (isWsErrorEvent(msg)) {
746721
this.logger.error('WS error event: ', { ...msg, wsKey });
747-
return this.emit('error', { ...msg, wsKey });
722+
return this.emit('exception', { ...msg, wsKey });
748723
}
749724

750725
if (isWsDataEvent(msg)) {
@@ -775,7 +750,7 @@ export class WebsocketClient extends EventEmitter {
775750
...msg,
776751
wsKey,
777752
});
778-
return this.emit('error', { ...msg, wsKey });
753+
return this.emit('exception', { ...msg, wsKey });
779754
}
780755

781756
if (isWsSubscribeEvent(msg) || isWsUnsubscribeEvent(msg)) {

0 commit comments

Comments
 (0)