Skip to content

Commit 21fb8e4

Browse files
committed
fix(): type guards for new multiplex subs
1 parent 96be9c4 commit 21fb8e4

File tree

2 files changed

+53
-25
lines changed

2 files changed

+53
-25
lines changed

src/types/websockets/ws-events-formatted.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export interface WsMessage24hrMiniTickerFormatted extends WsSharedBase {
114114
}
115115

116116
export interface WsMessage24hrTickerFormatted extends WsSharedBase {
117-
eventType: '24hrTicker';
117+
eventType: '24hrTicker' | '!ticker@arr';
118118
eventTime: number;
119119
symbol: string;
120120
priceChange: number;
@@ -140,23 +140,25 @@ export interface WsMessage24hrTickerFormatted extends WsSharedBase {
140140
}
141141

142142
export interface WsMessageRollingWindowTickerFormatted extends WsSharedBase {
143-
eventType: '1hTicker' | '4hTicker' | '1dTicker';
143+
eventType: 'ticker';
144144
eventTime: number;
145145
symbol: string;
146146
priceChange: number;
147147
priceChangePercent: number;
148148
weightedAveragePrice: number;
149-
openPrice: number;
150-
highPrice: number;
151-
lowPrice: number;
152-
lastPrice: number;
153-
totalTradedBaseAssetVolume: number;
154-
totalTradedQuoteAssetVolume: number;
155-
statisticsOpenTime: number;
156-
statisticsCloseTime: number;
149+
open: number;
150+
high: number;
151+
low: number;
152+
currentClose: number;
153+
baseAssetVolume: number;
154+
quoteAssetVolume: number;
155+
openTime: number;
156+
closeTime: number;
157157
firstTradeId: number;
158158
lastTradeId: number;
159-
totalTrades: number;
159+
trades: number;
160+
streamName: string;
161+
isWSAPIResponse: false;
160162
}
161163

162164
export interface WsMessageBookTickerEventFormatted extends WsSharedBase {

src/util/typeGuards.ts

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
WsMessageKlineFormatted,
1414
WsMessageMarkPriceUpdateEventFormatted,
1515
WsMessagePartialBookDepthEventFormatted,
16-
WsMessageRollingWindowTickerFormatted,
1716
WsMessageSpotBalanceUpdateFormatted,
1817
WsMessageSpotOutboundAccountPositionFormatted,
1918
WsMessageSpotUserDataEventFormatted,
@@ -49,13 +48,13 @@ export function neverGuard(x: never, msg: string): Error {
4948
* Typeguards for WsFormattedMessage event types:
5049
*/
5150

52-
export function isWsFormattedMarkPriceUpdateEvent( // ok
51+
export function isWsFormattedMarkPriceUpdateEvent(
5352
data: WsFormattedMessage,
5453
): data is WsMessageMarkPriceUpdateEventFormatted {
5554
return !Array.isArray(data) && data.eventType === 'markPriceUpdate';
5655
}
5756

58-
export function isWsFormattedMarkPriceUpdateArray( // ok
57+
export function isWsFormattedMarkPriceUpdateArray(
5958
data: WsFormattedMessage,
6059
): data is WsMessageMarkPriceUpdateEventFormatted[] {
6160
return (
@@ -72,54 +71,73 @@ export function isWsFormattedMarkPriceUpdate(
7271
return isWsFormattedMarkPriceUpdateArray(data);
7372
}
7473

75-
export function isWsFormattedTrade( // ok
74+
export function isWsFormattedTrade(
7675
data: WsFormattedMessage,
7776
): data is WsMessageTradeFormatted {
7877
return !Array.isArray(data) && data.eventType === 'trade';
7978
}
8079

81-
export function isWsFormattedKline( // ok
80+
export function isWsFormattedKline(
8281
data: WsFormattedMessage,
8382
): data is WsMessageKlineFormatted {
8483
return !Array.isArray(data) && data.eventType === 'kline';
8584
}
8685

87-
export function isWsFormatted24hrTicker( // ok
86+
export function isWsFormatted24hrTicker(
8887
data: WsFormattedMessage,
8988
): data is WsMessage24hrTickerFormatted {
9089
return !Array.isArray(data) && data.eventType === '24hrTicker';
9190
}
9291

93-
export function isWsFormattedForceOrder( // ok
92+
export function isWsFormattedForceOrder(
9493
data: WsFormattedMessage,
9594
): data is WsMessageForceOrderFormatted {
9695
return !Array.isArray(data) && data.eventType === 'forceOrder';
9796
}
9897

99-
export function isWsFormatted24hrTickerArray( // BROKEN
98+
/**
99+
* !ticker@arr
100+
* @param data
101+
* @returns
102+
*/
103+
export function isWsFormatted24hrTickerArray(
100104
data: WsFormattedMessage,
101105
): data is WsMessage24hrTickerFormatted[] {
102106
return (
103107
Array.isArray(data) &&
104108
data.length !== 0 &&
105-
data[0].eventType === '24hrTicker'
109+
// topic in ws url
110+
(['24hrTicker'].includes(data[0].eventType) || // multiplex subscriptions
111+
(!!data[0].streamName && ['!ticker@arr'].includes(data[0].streamName)))
106112
);
107113
}
108114

109-
export function isWsFormattedRollingWindowTickerArray( // dont exist anymore ??
115+
/**
116+
* !ticker_1h@arr
117+
*
118+
* @param data
119+
* @returns
120+
*/
121+
export function isWsFormattedRollingWindowTickerArray(
110122
data: WsFormattedMessage,
111-
): data is WsMessageRollingWindowTickerFormatted[] {
123+
): data is WsMessage24hrTickerFormatted[] {
112124
return (
113125
Array.isArray(data) &&
114126
data.length !== 0 &&
115-
['1hTicker', '4hTicker', '1dTicker'].includes(data[0].eventType)
127+
// topic in ws url
128+
(['1hTicker', '4hTicker', '1dTicker'].includes(data[0].eventType) ||
129+
// multiplex subscriptions
130+
(!!data[0].streamName &&
131+
['!ticker_1h@arr', '!ticker_4h@arr', '!ticker_1d@arr'].includes(
132+
data[0].streamName,
133+
)))
116134
);
117135
}
118136

119137
/**
120138
* Typeguard to validate a 'Compressed/Aggregate' trade
121139
*/
122-
export function isWsAggTradeFormatted( // ok
140+
export function isWsAggTradeFormatted(
123141
data: WsFormattedMessage,
124142
): data is WsMessageAggTradeFormatted {
125143
return !Array.isArray(data) && data.eventType === 'aggTrade';
@@ -129,14 +147,22 @@ const partialBookDepthEventTypeMap = new Map()
129147
// For dedicated connection
130148
.set('partialBookDepth', true)
131149
// For multiplex connection
150+
.set('depth5', true)
151+
.set('depth10', true)
152+
.set('depth20', true)
132153
.set('depth5@100ms', true)
133154
.set('depth10@100ms', true)
134155
.set('depth20@100ms', true)
135156
.set('depth5@1000ms', true)
136157
.set('depth10@1000ms', true)
137158
.set('depth20@1000ms', true);
138159

139-
export function isWsPartialBookDepthEventFormatted( // BROKEN
160+
/**
161+
* <symbol>@depth<levels> OR <symbol>@depth<levels>@100ms
162+
* @param data
163+
* @returns
164+
*/
165+
export function isWsPartialBookDepthEventFormatted(
140166
data: WsFormattedMessage,
141167
): data is WsMessagePartialBookDepthEventFormatted {
142168
return (

0 commit comments

Comments
 (0)