binance 2.15.14 → 3.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/lib/coinm-client.js.map +1 -1
- package/lib/index.d.ts +10 -4
- package/lib/index.js +10 -4
- package/lib/index.js.map +1 -1
- package/lib/main-client.d.ts +13 -2
- package/lib/main-client.js +15 -1
- package/lib/main-client.js.map +1 -1
- package/lib/portfolio-client.js.map +1 -1
- package/lib/types/futures.d.ts +1 -0
- package/lib/types/futures.js +3 -3
- package/lib/types/futures.js.map +1 -1
- package/lib/types/spot.js +4 -4
- package/lib/types/spot.js.map +1 -1
- package/lib/types/websockets/ws-api-requests.d.ts +7 -0
- package/lib/types/websockets/ws-api-requests.js +3 -0
- package/lib/types/websockets/ws-api-requests.js.map +1 -0
- package/lib/types/websockets/ws-api-responses.d.ts +8 -0
- package/lib/types/websockets/ws-api-responses.js +3 -0
- package/lib/types/websockets/ws-api-responses.js.map +1 -0
- package/lib/types/websockets/ws-api.d.ts +201 -0
- package/lib/types/websockets/ws-api.js +29 -0
- package/lib/types/websockets/ws-api.js.map +1 -0
- package/lib/types/{websockets.d.ts → websockets/ws-events-formatted.d.ts} +4 -410
- package/lib/types/websockets/ws-events-formatted.js +3 -0
- package/lib/types/websockets/ws-events-formatted.js.map +1 -0
- package/lib/types/websockets/ws-events-raw.d.ts +401 -0
- package/lib/types/{websockets.js → websockets/ws-events-raw.js} +1 -1
- package/lib/types/websockets/ws-events-raw.js.map +1 -0
- package/lib/types/websockets/ws-general.d.ts +98 -0
- package/lib/types/websockets/ws-general.js +11 -0
- package/lib/types/websockets/ws-general.js.map +1 -0
- package/lib/usdm-client.js.map +1 -1
- package/lib/util/BaseRestClient.d.ts +1 -1
- package/lib/util/BaseRestClient.js +1 -1
- package/lib/util/BaseRestClient.js.map +1 -1
- package/lib/util/BaseWSClient.d.ts +225 -0
- package/lib/util/BaseWSClient.js +729 -0
- package/lib/util/BaseWSClient.js.map +1 -0
- package/lib/util/beautifier-maps.d.ts +151 -0
- package/lib/util/beautifier-maps.js +198 -37
- package/lib/util/beautifier-maps.js.map +1 -1
- package/lib/util/beautifier.d.ts +7 -3
- package/lib/util/beautifier.js +40 -11
- package/lib/util/beautifier.js.map +1 -1
- package/lib/util/browser-support.d.ts +2 -1
- package/lib/util/browser-support.js +46 -28
- package/lib/util/browser-support.js.map +1 -1
- package/lib/util/logger.d.ts +8 -0
- package/lib/util/logger.js +17 -0
- package/lib/util/logger.js.map +1 -0
- package/lib/util/node-support.d.ts +2 -1
- package/lib/util/node-support.js +35 -15
- package/lib/util/node-support.js.map +1 -1
- package/lib/util/requestUtils.d.ts +19 -19
- package/lib/util/requestUtils.js +119 -38
- package/lib/util/requestUtils.js.map +1 -1
- package/lib/util/typeGuards.d.ts +9 -1
- package/lib/util/typeGuards.js +59 -34
- package/lib/util/typeGuards.js.map +1 -1
- package/lib/util/usdm/exchangeInfo.js +2 -3
- package/lib/util/usdm/exchangeInfo.js.map +1 -1
- package/lib/util/webCryptoAPI.d.ts +14 -0
- package/lib/util/webCryptoAPI.js +120 -0
- package/lib/util/webCryptoAPI.js.map +1 -0
- package/lib/util/websockets/WsStore.d.ts +74 -0
- package/lib/util/websockets/WsStore.js +279 -0
- package/lib/util/websockets/WsStore.js.map +1 -0
- package/lib/util/websockets/WsStore.types.d.ts +53 -0
- package/lib/util/websockets/WsStore.types.js +14 -0
- package/lib/util/websockets/WsStore.types.js.map +1 -0
- package/lib/util/websockets/listen-key-state-cache.d.ts +21 -0
- package/lib/util/websockets/listen-key-state-cache.js +80 -0
- package/lib/util/websockets/listen-key-state-cache.js.map +1 -0
- package/lib/util/websockets/rest-client-cache.d.ts +13 -0
- package/lib/util/websockets/rest-client-cache.js +56 -0
- package/lib/util/websockets/rest-client-cache.js.map +1 -0
- package/lib/util/websockets/user-data-stream-manager.d.ts +54 -0
- package/lib/util/websockets/user-data-stream-manager.js +256 -0
- package/lib/util/websockets/user-data-stream-manager.js.map +1 -0
- package/lib/util/websockets/websocket-util.d.ts +124 -0
- package/lib/util/websockets/websocket-util.js +481 -0
- package/lib/util/websockets/websocket-util.js.map +1 -0
- package/lib/websocket-client-legacy.d.ts +288 -0
- package/lib/websocket-client-legacy.js +1113 -0
- package/lib/websocket-client-legacy.js.map +1 -0
- package/lib/websocket-client.d.ts +228 -168
- package/lib/websocket-client.js +927 -834
- package/lib/websocket-client.js.map +1 -1
- package/package.json +5 -5
- package/lib/logger.d.ts +0 -9
- package/lib/logger.js +0 -23
- package/lib/logger.js.map +0 -1
- package/lib/types/websockets.js.map +0 -1
- package/lib/util/WsStore.d.ts +0 -57
- package/lib/util/WsStore.js +0 -101
- package/lib/util/WsStore.js.map +0 -1
- package/lib/util/ws-utils.d.ts +0 -7
- package/lib/util/ws-utils.js +0 -16
- package/lib/util/ws-utils.js.map +0 -1
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WS_ERROR_ENUM = exports.WS_AUTH_ON_CONNECT_KEYS = exports.WS_KEY_URL_MAP = exports.WS_KEY_MAP = exports.WS_LOGGER_CATEGORY = void 0;
|
|
4
|
+
exports.getWsURLSuffix = getWsURLSuffix;
|
|
5
|
+
exports.isPrivateWsTopic = isPrivateWsTopic;
|
|
6
|
+
exports.getWsKeyForTopic = getWsKeyForTopic;
|
|
7
|
+
exports.getWsUrl = getWsUrl;
|
|
8
|
+
exports.getMaxTopicsPerSubscribeEvent = getMaxTopicsPerSubscribeEvent;
|
|
9
|
+
exports.safeTerminateWs = safeTerminateWs;
|
|
10
|
+
exports.getPromiseRefForWSAPIRequest = getPromiseRefForWSAPIRequest;
|
|
11
|
+
exports.getNormalisedTopicRequests = getNormalisedTopicRequests;
|
|
12
|
+
exports.getTopicsPerWSKey = getTopicsPerWSKey;
|
|
13
|
+
exports.parseEventTypeFromMessage = parseEventTypeFromMessage;
|
|
14
|
+
exports.resolveUserDataMarketForWsKey = resolveUserDataMarketForWsKey;
|
|
15
|
+
exports.resolveWsKeyForLegacyMarket = resolveWsKeyForLegacyMarket;
|
|
16
|
+
exports.parseRawWsMessage = parseRawWsMessage;
|
|
17
|
+
exports.getContextFromWsKey = getContextFromWsKey;
|
|
18
|
+
exports.getLegacyWsStoreKeyWithContext = getLegacyWsStoreKeyWithContext;
|
|
19
|
+
exports.getLegacyWsKeyContext = getLegacyWsKeyContext;
|
|
20
|
+
exports.getRealWsKeyFromDerivedWsKey = getRealWsKeyFromDerivedWsKey;
|
|
21
|
+
exports.appendEventMarket = appendEventMarket;
|
|
22
|
+
const typeGuards_1 = require("../typeGuards");
|
|
23
|
+
exports.WS_LOGGER_CATEGORY = { category: 'binance-ws' };
|
|
24
|
+
exports.WS_KEY_MAP = {
|
|
25
|
+
// https://developers.binance.com/docs/binance-spot-api-docs/web-socket-streams
|
|
26
|
+
main: 'main', // spot, margin, isolated margin, user data
|
|
27
|
+
main2: 'main2', // spot, margin, isolated margin, user data | alternative
|
|
28
|
+
main3: 'main3', // spot, margin, isolated margin | alternative | MARKET DATA ONLY | NO USER DATA
|
|
29
|
+
// https://developers.binance.com/docs/binance-spot-api-docs/testnet/web-socket-streams#general-wss-information
|
|
30
|
+
mainTestnetPublic: 'mainTestnetPublic',
|
|
31
|
+
mainTestnetUserData: 'mainTestnetUserData',
|
|
32
|
+
// https://developers.binance.com/docs/binance-spot-api-docs/web-socket-api/general-api-information
|
|
33
|
+
mainWSAPI: 'mainWSAPI', // trading over WS in spot, margin, isolated margin. User data supported too.
|
|
34
|
+
mainWSAPI2: 'mainWSAPI2', // trading over WS in spot, margin, isolated margin. User data supported too.
|
|
35
|
+
mainWSAPITestnet: 'mainWSAPITestnet', // trading over WS in spot, margin, isolated margin | TESTNET
|
|
36
|
+
// https://developers.binance.com/docs/margin_trading/risk-data-stream
|
|
37
|
+
marginRiskUserData: 'marginRiskUserData',
|
|
38
|
+
// https://developers.binance.com/docs/derivatives/usds-margined-futures/websocket-market-streams
|
|
39
|
+
// market data, user data
|
|
40
|
+
usdm: 'usdm',
|
|
41
|
+
// https://developers.binance.com/docs/derivatives/usds-margined-futures/general-info
|
|
42
|
+
usdmTestnet: 'usdmTestnet',
|
|
43
|
+
// https://developers.binance.com/docs/derivatives/usds-margined-futures/websocket-api-general-info
|
|
44
|
+
// ONLY WS API | NO USER DATA
|
|
45
|
+
usdmWSAPI: 'usdmWSAPI',
|
|
46
|
+
usdmWSAPITestnet: 'usdmWSAPITestnet',
|
|
47
|
+
// https://developers.binance.com/docs/derivatives/coin-margined-futures/websocket-market-streams
|
|
48
|
+
// market data, user data
|
|
49
|
+
coinm: 'coinm',
|
|
50
|
+
coinm2: 'coinm2',
|
|
51
|
+
// https://developers.binance.com/docs/derivatives/coin-margined-futures/general-info
|
|
52
|
+
coinmTestnet: 'coinmTestnet',
|
|
53
|
+
eoptions: 'eoptions',
|
|
54
|
+
// optionsTestnet: 'optionsTestnet',
|
|
55
|
+
// https://developers.binance.com/docs/derivatives/portfolio-margin/user-data-streams
|
|
56
|
+
portfolioMarginUserData: 'portfolioMarginUserData',
|
|
57
|
+
// https://developers.binance.com/docs/derivatives/portfolio-margin-pro/portfolio-margin-pro-user-data-stream
|
|
58
|
+
portfolioMarginProUserData: 'portfolioMarginProUserData',
|
|
59
|
+
};
|
|
60
|
+
exports.WS_KEY_URL_MAP = {
|
|
61
|
+
// https://developers.binance.com/docs/binance-spot-api-docs/web-socket-streams
|
|
62
|
+
main: 'wss://stream.binance.com:9443', // spot, margin, isolated margin, user data
|
|
63
|
+
main2: 'wss://stream.binance.com:443', // spot, margin, isolated margin, user data | alternative
|
|
64
|
+
main3: 'wss://data-stream.binance.vision', // spot, margin, isolated margin | alternative | MARKET DATA ONLY | NO USER DATA
|
|
65
|
+
// https://developers.binance.com/docs/binance-spot-api-docs/testnet/web-socket-streams#general-wss-information
|
|
66
|
+
mainTestnetPublic: 'wss://testnet.binance.vision',
|
|
67
|
+
mainTestnetUserData: 'wss://stream.testnet.binance.vision:9443',
|
|
68
|
+
// https://developers.binance.com/docs/binance-spot-api-docs/web-socket-api/general-api-information
|
|
69
|
+
// TODO:
|
|
70
|
+
mainWSAPI: 'wss://ws-api.binance.com:443',
|
|
71
|
+
mainWSAPI2: 'wss://ws-api.binance.com:9443',
|
|
72
|
+
mainWSAPITestnet: 'wss://testnet.binance.vision',
|
|
73
|
+
// https://developers.binance.com/docs/margin_trading/risk-data-stream
|
|
74
|
+
// Margin websocket only support Cross Margin Accounts
|
|
75
|
+
marginRiskUserData: 'wss://margin-stream.binance.com',
|
|
76
|
+
// https://developers.binance.com/docs/derivatives/usds-margined-futures/websocket-market-streams
|
|
77
|
+
// market data, user data
|
|
78
|
+
usdm: 'wss://fstream.binance.com',
|
|
79
|
+
// https://developers.binance.com/docs/derivatives/usds-margined-futures/general-info
|
|
80
|
+
usdmTestnet: 'wss://stream.binancefuture.com',
|
|
81
|
+
// https://developers.binance.com/docs/derivatives/usds-margined-futures/websocket-api-general-info
|
|
82
|
+
// ONLY WS API
|
|
83
|
+
// TODO:
|
|
84
|
+
usdmWSAPI: 'wss://ws-fapi.binance.com',
|
|
85
|
+
usdmWSAPITestnet: 'wss://testnet.binancefuture.com',
|
|
86
|
+
// https://developers.binance.com/docs/derivatives/coin-margined-futures/websocket-market-streams
|
|
87
|
+
// market data, user data
|
|
88
|
+
coinm: 'wss://dstream.binance.com',
|
|
89
|
+
coinm2: 'wss://dstream-auth.binance.com', // Warning, coinm2 requires a listenkey
|
|
90
|
+
// https://developers.binance.com/docs/derivatives/coin-margined-futures/general-info
|
|
91
|
+
coinmTestnet: 'wss://dstream.binancefuture.com',
|
|
92
|
+
// https://developers.binance.com/docs/derivatives/option/websocket-market-streams
|
|
93
|
+
// https://developers.binance.com/docs/derivatives/option/user-data-streams
|
|
94
|
+
eoptions: 'wss://nbstream.binance.com/eoptions',
|
|
95
|
+
// optionsTestnet: 'wss://testnetws.binanceops.com',
|
|
96
|
+
// https://developers.binance.com/docs/derivatives/portfolio-margin/user-data-streams
|
|
97
|
+
portfolioMarginUserData: 'wss://fstream.binance.com',
|
|
98
|
+
// https://developers.binance.com/docs/derivatives/portfolio-margin-pro/portfolio-margin-pro-user-data-stream
|
|
99
|
+
portfolioMarginProUserData: 'wss://fstream.binance.com',
|
|
100
|
+
};
|
|
101
|
+
function getWsURLSuffix(wsKey, connectionType) {
|
|
102
|
+
switch (wsKey) {
|
|
103
|
+
case 'main':
|
|
104
|
+
case 'main2':
|
|
105
|
+
case 'main3':
|
|
106
|
+
case 'marginRiskUserData':
|
|
107
|
+
case 'mainTestnetPublic':
|
|
108
|
+
case 'mainTestnetUserData':
|
|
109
|
+
case 'mainWSAPITestnet': {
|
|
110
|
+
switch (connectionType) {
|
|
111
|
+
case 'market':
|
|
112
|
+
return '/stream';
|
|
113
|
+
case 'userData':
|
|
114
|
+
return '/ws';
|
|
115
|
+
case 'wsAPI':
|
|
116
|
+
return '/ws-api/v3';
|
|
117
|
+
default: {
|
|
118
|
+
throw (0, typeGuards_1.neverGuard)(connectionType, `Unhandled connectionType "${wsKey}/${connectionType}"`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
case 'mainWSAPI':
|
|
123
|
+
case 'mainWSAPI2': {
|
|
124
|
+
return '/ws-api/v3';
|
|
125
|
+
}
|
|
126
|
+
case 'usdm':
|
|
127
|
+
case 'usdmTestnet': {
|
|
128
|
+
switch (connectionType) {
|
|
129
|
+
case 'market':
|
|
130
|
+
return '/stream';
|
|
131
|
+
case 'userData':
|
|
132
|
+
return '/ws';
|
|
133
|
+
case 'wsAPI':
|
|
134
|
+
return '/ws-fapi/v1';
|
|
135
|
+
default: {
|
|
136
|
+
throw (0, typeGuards_1.neverGuard)(connectionType, `Unhandled connectionType "${wsKey}/${connectionType}"`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
case 'usdmWSAPI':
|
|
141
|
+
case 'usdmWSAPITestnet': {
|
|
142
|
+
return '/ws-fapi/v1';
|
|
143
|
+
}
|
|
144
|
+
case 'coinm':
|
|
145
|
+
case 'coinmTestnet':
|
|
146
|
+
case 'eoptions':
|
|
147
|
+
switch (connectionType) {
|
|
148
|
+
case 'market':
|
|
149
|
+
return '/stream';
|
|
150
|
+
case 'userData':
|
|
151
|
+
return '/ws';
|
|
152
|
+
case 'wsAPI':
|
|
153
|
+
return '/ws-capi/v1';
|
|
154
|
+
default: {
|
|
155
|
+
throw (0, typeGuards_1.neverGuard)(connectionType, `Unhandled connectionType "${wsKey}/${connectionType}"`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
case 'coinm2':
|
|
159
|
+
return '/stream&listenKey=';
|
|
160
|
+
case 'portfolioMarginUserData':
|
|
161
|
+
return '/pm/ws'; // pm/ws/listenKeyHere
|
|
162
|
+
case 'portfolioMarginProUserData':
|
|
163
|
+
return '/pm-classic/ws';
|
|
164
|
+
default: {
|
|
165
|
+
throw (0, typeGuards_1.neverGuard)(wsKey, `Unhandled WsKey "${wsKey}"`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.WS_AUTH_ON_CONNECT_KEYS = [
|
|
170
|
+
exports.WS_KEY_MAP.mainWSAPI,
|
|
171
|
+
exports.WS_KEY_MAP.mainWSAPI2,
|
|
172
|
+
exports.WS_KEY_MAP.mainWSAPITestnet,
|
|
173
|
+
exports.WS_KEY_MAP.usdmWSAPI,
|
|
174
|
+
exports.WS_KEY_MAP.usdmWSAPITestnet,
|
|
175
|
+
// WS_KEY_MAP.v5Private,
|
|
176
|
+
// WS_KEY_MAP.v5PrivateTrade,
|
|
177
|
+
];
|
|
178
|
+
// export const PUBLIC_WS_KEYS = [
|
|
179
|
+
// WS_KEY_MAP.main,
|
|
180
|
+
// WS_KEY_MAP.main,
|
|
181
|
+
// WS_KEY_MAP.main,
|
|
182
|
+
// ] as WsKey[];
|
|
183
|
+
/** Used to automatically determine if a sub request should be to the public or private ws (when there's two) */
|
|
184
|
+
const PRIVATE_TOPICS = [];
|
|
185
|
+
function isPrivateWsTopic(topic) {
|
|
186
|
+
return PRIVATE_TOPICS.includes(topic);
|
|
187
|
+
}
|
|
188
|
+
function getWsKeyForTopic(wsKey) {
|
|
189
|
+
// const isPrivateTopic = isPrivate === true || PRIVATE_TOPICS.includes(topic);
|
|
190
|
+
switch (wsKey) {
|
|
191
|
+
// case 'v5': {
|
|
192
|
+
// if (isPrivateTopic) {
|
|
193
|
+
// return WS_KEY_MAP.main;
|
|
194
|
+
// }
|
|
195
|
+
// return WS_KEY_MAP.main;
|
|
196
|
+
// }
|
|
197
|
+
default: {
|
|
198
|
+
return exports.WS_KEY_MAP.main;
|
|
199
|
+
// throw neverGuard(wsKey, 'getWsKeyForTopic(): Unhandled market');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function getWsUrl(wsKey, wsClientOptions, logger) {
|
|
204
|
+
const wsUrl = wsClientOptions.wsUrl;
|
|
205
|
+
if (wsUrl) {
|
|
206
|
+
return wsUrl;
|
|
207
|
+
}
|
|
208
|
+
// https://bybit-exchange.github.io/docs/v5/demo
|
|
209
|
+
// const isDemoTrading = wsClientOptions.demoTrading;
|
|
210
|
+
// if (isDemoTrading) {
|
|
211
|
+
// return 'wss://stream-demo.bybit.com/v5/private';
|
|
212
|
+
// }
|
|
213
|
+
// TODO:
|
|
214
|
+
// const isTestnet = wsClientOptions.testnet;
|
|
215
|
+
// const networkKey = isTestnet ? 'testnet' : 'livenet';
|
|
216
|
+
const resolvedUrl = exports.WS_KEY_URL_MAP[wsKey];
|
|
217
|
+
return resolvedUrl;
|
|
218
|
+
// switch (wsKey) {
|
|
219
|
+
// case WS_KEY_MAP.v5Private: {
|
|
220
|
+
// return WS_BASE_URL_MAP.v5.private[networkKey];
|
|
221
|
+
// }
|
|
222
|
+
// case WS_KEY_MAP.v5PrivateTrade: {
|
|
223
|
+
// return WS_BASE_URL_MAP[wsKey].private[networkKey];
|
|
224
|
+
// }
|
|
225
|
+
// case WS_KEY_MAP.v5SpotPublic: {
|
|
226
|
+
// return WS_BASE_URL_MAP.v5SpotPublic.public[networkKey];
|
|
227
|
+
// }
|
|
228
|
+
// case WS_KEY_MAP.v5LinearPublic: {
|
|
229
|
+
// return WS_BASE_URL_MAP.v5LinearPublic.public[networkKey];
|
|
230
|
+
// }
|
|
231
|
+
// case WS_KEY_MAP.v5InversePublic: {
|
|
232
|
+
// return WS_BASE_URL_MAP.v5InversePublic.public[networkKey];
|
|
233
|
+
// }
|
|
234
|
+
// case WS_KEY_MAP.v5OptionPublic: {
|
|
235
|
+
// return WS_BASE_URL_MAP.v5OptionPublic.public[networkKey];
|
|
236
|
+
// }
|
|
237
|
+
// default: {
|
|
238
|
+
// logger.error('getWsUrl(): Unhandled wsKey: ', {
|
|
239
|
+
// category: 'bybit-ws',
|
|
240
|
+
// wsKey,
|
|
241
|
+
// });
|
|
242
|
+
// throw neverGuard(wsKey, 'getWsUrl(): Unhandled wsKey');
|
|
243
|
+
// }
|
|
244
|
+
// }
|
|
245
|
+
}
|
|
246
|
+
function getMaxTopicsPerSubscribeEvent(wsKey) {
|
|
247
|
+
switch (wsKey) {
|
|
248
|
+
// case 'v5': {
|
|
249
|
+
// if (wsKey === WS_KEY_MAP.v5SpotPublic) {
|
|
250
|
+
// return 10;
|
|
251
|
+
// }
|
|
252
|
+
// return null;
|
|
253
|
+
// }
|
|
254
|
+
default: {
|
|
255
|
+
return null;
|
|
256
|
+
// throw neverGuard(market, 'getWsKeyForTopic(): Unhandled market');
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
exports.WS_ERROR_ENUM = {
|
|
261
|
+
NOT_AUTHENTICATED_SPOT_V3: '-1004',
|
|
262
|
+
API_ERROR_GENERIC: '10001',
|
|
263
|
+
API_SIGN_AUTH_FAILED: '10003',
|
|
264
|
+
USDC_OPTION_AUTH_FAILED: '3303006',
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* #305: ws.terminate() is undefined in browsers.
|
|
268
|
+
* This only works in node.js, not in browsers.
|
|
269
|
+
* Does nothing if `ws` is undefined. Does nothing in browsers.
|
|
270
|
+
*/
|
|
271
|
+
function safeTerminateWs(ws, fallbackToClose) {
|
|
272
|
+
if (!ws) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
if (typeof ws['terminate'] === 'function') {
|
|
276
|
+
ws.terminate();
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
else if (fallbackToClose) {
|
|
280
|
+
ws.close();
|
|
281
|
+
}
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* WS API promises are stored using a primary key. This key is constructed using
|
|
286
|
+
* properties found in every request & reply.
|
|
287
|
+
*
|
|
288
|
+
* The counterpart to this is in resolveEmittableEvents
|
|
289
|
+
*/
|
|
290
|
+
function getPromiseRefForWSAPIRequest(wsKey, requestEvent) {
|
|
291
|
+
const promiseRef = [wsKey, requestEvent.id].join('_');
|
|
292
|
+
return promiseRef;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Users can conveniently pass topics as strings or objects (object has topic name + optional params).
|
|
296
|
+
*
|
|
297
|
+
* This method normalises topics into objects (object has topic name + optional params).
|
|
298
|
+
*/
|
|
299
|
+
function getNormalisedTopicRequests(wsTopicRequests) {
|
|
300
|
+
const normalisedTopicRequests = [];
|
|
301
|
+
for (const wsTopicRequest of wsTopicRequests) {
|
|
302
|
+
// passed as string, convert to object
|
|
303
|
+
if (typeof wsTopicRequest === 'string') {
|
|
304
|
+
const topicRequest = {
|
|
305
|
+
topic: wsTopicRequest,
|
|
306
|
+
payload: undefined,
|
|
307
|
+
};
|
|
308
|
+
normalisedTopicRequests.push(topicRequest);
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
// already a normalised object, thanks to user
|
|
312
|
+
normalisedTopicRequests.push(wsTopicRequest);
|
|
313
|
+
}
|
|
314
|
+
return normalisedTopicRequests;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Groups topics in request into per-wsKey groups
|
|
318
|
+
* @param normalisedTopicRequests
|
|
319
|
+
* @param wsKey
|
|
320
|
+
* @param isPrivateTopic
|
|
321
|
+
* @returns
|
|
322
|
+
*/
|
|
323
|
+
function getTopicsPerWSKey(normalisedTopicRequests, wsKey) {
|
|
324
|
+
const perWsKeyTopics = {};
|
|
325
|
+
// Sort into per wsKey arrays, in case topics are mixed together for different wsKeys
|
|
326
|
+
for (const topicRequest of normalisedTopicRequests) {
|
|
327
|
+
// const derivedWsKey =
|
|
328
|
+
// wsKey || getWsKeyForTopic(market, topicRequest.topic, isPrivateTopic);
|
|
329
|
+
const derivedWsKey = wsKey;
|
|
330
|
+
if (!perWsKeyTopics[derivedWsKey] ||
|
|
331
|
+
!Array.isArray(perWsKeyTopics[derivedWsKey])) {
|
|
332
|
+
perWsKeyTopics[derivedWsKey] = [];
|
|
333
|
+
}
|
|
334
|
+
perWsKeyTopics[derivedWsKey].push(topicRequest);
|
|
335
|
+
}
|
|
336
|
+
return perWsKeyTopics;
|
|
337
|
+
}
|
|
338
|
+
function parseEventTypeFromMessage(wsKey, parsedMsg) {
|
|
339
|
+
if (parsedMsg === null || parsedMsg === void 0 ? void 0 : parsedMsg.e) {
|
|
340
|
+
return parsedMsg.e;
|
|
341
|
+
}
|
|
342
|
+
if ((parsedMsg === null || parsedMsg === void 0 ? void 0 : parsedMsg.stream) && typeof (parsedMsg === null || parsedMsg === void 0 ? void 0 : parsedMsg.stream) === 'string') {
|
|
343
|
+
const streamName = parsedMsg.stream;
|
|
344
|
+
// console.log(`parseEventTypeFromMessage(${wsKey}) `, streamName, parsedMsg);
|
|
345
|
+
const eventType = streamName.split('@');
|
|
346
|
+
// All symbol streams can be returned as is, just need to extract the left-most text before any @ or _
|
|
347
|
+
if (streamName.startsWith('!')) {
|
|
348
|
+
const subEventType = eventType[0].split('_');
|
|
349
|
+
return subEventType[0].replace('!', '');
|
|
350
|
+
}
|
|
351
|
+
// Per symbol streams can have the symbol trimmed off (string before first "@")
|
|
352
|
+
// E.g. btcusdt@kline_5m@+08:00 -> kline_5m@+08:00
|
|
353
|
+
if (eventType.length) {
|
|
354
|
+
// remove first, keep the rest rejoined
|
|
355
|
+
eventType.shift();
|
|
356
|
+
// Edge case, for european options, the suffix is a variable date so will never match the map
|
|
357
|
+
if (wsKey === 'eoptions') {
|
|
358
|
+
return eventType[0];
|
|
359
|
+
}
|
|
360
|
+
return eventType.join('@');
|
|
361
|
+
}
|
|
362
|
+
console.error('parseEventTypeFromMessage(): Cannot extract event type from message: ', parsedMsg);
|
|
363
|
+
}
|
|
364
|
+
if (parsedMsg === null || parsedMsg === void 0 ? void 0 : parsedMsg.data) {
|
|
365
|
+
return parseEventTypeFromMessage(wsKey, parsedMsg.data);
|
|
366
|
+
}
|
|
367
|
+
if (Array.isArray(parsedMsg) && parsedMsg.length) {
|
|
368
|
+
return parseEventTypeFromMessage(wsKey, parsedMsg[0]);
|
|
369
|
+
}
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
function resolveUserDataMarketForWsKey(wsKey) {
|
|
373
|
+
switch (wsKey) {
|
|
374
|
+
case 'main':
|
|
375
|
+
case 'main2':
|
|
376
|
+
case 'main3':
|
|
377
|
+
case 'mainWSAPI':
|
|
378
|
+
case 'mainWSAPI2':
|
|
379
|
+
case 'marginRiskUserData':
|
|
380
|
+
return 'spot';
|
|
381
|
+
case 'mainTestnetPublic':
|
|
382
|
+
case 'mainTestnetUserData':
|
|
383
|
+
case 'mainWSAPITestnet':
|
|
384
|
+
return 'spotTestnet';
|
|
385
|
+
case 'usdm':
|
|
386
|
+
case 'usdmWSAPI':
|
|
387
|
+
return 'usdm';
|
|
388
|
+
case 'usdmTestnet':
|
|
389
|
+
case 'usdmWSAPITestnet':
|
|
390
|
+
return 'usdmTestnet';
|
|
391
|
+
case 'coinm':
|
|
392
|
+
case 'coinm2':
|
|
393
|
+
return 'coinm';
|
|
394
|
+
case 'coinmTestnet':
|
|
395
|
+
return 'coinmTestnet';
|
|
396
|
+
case 'eoptions':
|
|
397
|
+
return 'options';
|
|
398
|
+
case 'portfolioMarginUserData':
|
|
399
|
+
case 'portfolioMarginProUserData':
|
|
400
|
+
return 'portfoliom';
|
|
401
|
+
default: {
|
|
402
|
+
throw (0, typeGuards_1.neverGuard)(wsKey, `resolveMarketForWsKey(): Unhandled WsKey "${wsKey}"`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Used by the legacy subscribe* utility methods to determine which wsKey to route the subscription to.
|
|
408
|
+
*/
|
|
409
|
+
function resolveWsKeyForLegacyMarket(market) {
|
|
410
|
+
switch (market) {
|
|
411
|
+
case 'spot': {
|
|
412
|
+
return 'main';
|
|
413
|
+
}
|
|
414
|
+
case 'coinm': {
|
|
415
|
+
return 'coinm';
|
|
416
|
+
}
|
|
417
|
+
case 'usdm': {
|
|
418
|
+
return 'usdm';
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Try to resolve event.data. Example circumstance: {"stream":"!forceOrder@arr","data":{"e":"forceOrder","E":1634653599186,"o":{"s":"IOTXUSDT","S":"SELL","o":"LIMIT","f":"IOC","q":"3661","p":"0.06606","ap":"0.06669","X":"FILLED","l":"962","z":"3661","T":1634653599180}}}
|
|
424
|
+
*/
|
|
425
|
+
function parseRawWsMessage(event) {
|
|
426
|
+
if (typeof event === 'string') {
|
|
427
|
+
const parsedEvent = JSON.parse(event);
|
|
428
|
+
if (parsedEvent.data) {
|
|
429
|
+
if (typeof parsedEvent.data === 'string') {
|
|
430
|
+
return parseRawWsMessage(parsedEvent.data);
|
|
431
|
+
}
|
|
432
|
+
return parsedEvent.data;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (event === null || event === void 0 ? void 0 : event.data) {
|
|
436
|
+
return JSON.parse(event.data);
|
|
437
|
+
}
|
|
438
|
+
return event;
|
|
439
|
+
}
|
|
440
|
+
function getContextFromWsKey(legacyWsKey) {
|
|
441
|
+
const [market, streamName, symbol, listenKey, wsKey, ...otherParams] = legacyWsKey.split('_');
|
|
442
|
+
return {
|
|
443
|
+
symbol: symbol === 'undefined' ? undefined : symbol,
|
|
444
|
+
legacyWsKey,
|
|
445
|
+
wsKey,
|
|
446
|
+
market: market,
|
|
447
|
+
isTestnet: market.includes('estnet'),
|
|
448
|
+
isUserData: legacyWsKey.includes('userData'),
|
|
449
|
+
streamName,
|
|
450
|
+
listenKey: listenKey === 'undefined' ? undefined : listenKey,
|
|
451
|
+
otherParams,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* The legacy WS client creates a deterministic WS Key based on consistent input parameters
|
|
456
|
+
*/
|
|
457
|
+
function getLegacyWsStoreKeyWithContext(market, streamName, symbol = undefined, listenKey = undefined, ...otherParams) {
|
|
458
|
+
return [market, streamName, symbol, listenKey, ...otherParams].join('_');
|
|
459
|
+
}
|
|
460
|
+
function getLegacyWsKeyContext(wsKey) {
|
|
461
|
+
if (wsKey.indexOf('userData') !== -1) {
|
|
462
|
+
return getContextFromWsKey(wsKey);
|
|
463
|
+
}
|
|
464
|
+
return undefined;
|
|
465
|
+
}
|
|
466
|
+
function getRealWsKeyFromDerivedWsKey(wsKey) {
|
|
467
|
+
if (!wsKey.includes('userData')) {
|
|
468
|
+
return wsKey;
|
|
469
|
+
}
|
|
470
|
+
const legacyWsKeyContext = getLegacyWsKeyContext(wsKey);
|
|
471
|
+
if (!legacyWsKeyContext || !legacyWsKeyContext.wsKey) {
|
|
472
|
+
throw new Error(`getRealWsKeyFromDerivedWsKey(): no context found in supplied wsKey: "${wsKey}" | "${legacyWsKeyContext}"`);
|
|
473
|
+
}
|
|
474
|
+
return legacyWsKeyContext.wsKey;
|
|
475
|
+
}
|
|
476
|
+
function appendEventMarket(wsMsg, wsKey) {
|
|
477
|
+
const { market } = getContextFromWsKey(wsKey);
|
|
478
|
+
wsMsg.wsMarket = market;
|
|
479
|
+
wsMsg.wsKey = wsKey;
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=websocket-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-util.js","sourceRoot":"","sources":["../../../src/util/websockets/websocket-util.ts"],"names":[],"mappings":"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"}
|