bybit-api 2.3.2 → 2.4.0-beta.2
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 +74 -153
- package/lib/account-asset-client.d.ts +42 -0
- package/lib/account-asset-client.js +104 -0
- package/lib/account-asset-client.js.map +1 -0
- package/lib/constants/enum.d.ts +18 -0
- package/lib/constants/enum.js +18 -0
- package/lib/constants/enum.js.map +1 -1
- package/lib/copy-trading-client.d.ts +54 -0
- package/lib/copy-trading-client.js +112 -0
- package/lib/copy-trading-client.js.map +1 -0
- package/lib/index.d.ts +8 -2
- package/lib/index.js +8 -2
- package/lib/index.js.map +1 -1
- package/lib/inverse-client.d.ts +5 -13
- package/lib/inverse-client.js +6 -13
- package/lib/inverse-client.js.map +1 -1
- package/lib/inverse-futures-client.d.ts +4 -12
- package/lib/inverse-futures-client.js +5 -12
- package/lib/inverse-futures-client.js.map +1 -1
- package/lib/linear-client.d.ts +4 -12
- package/lib/linear-client.js +5 -12
- package/lib/linear-client.js.map +1 -1
- package/lib/spot-client-v3.d.ts +105 -0
- package/lib/spot-client-v3.js +222 -0
- package/lib/spot-client-v3.js.map +1 -0
- package/lib/spot-client.d.ts +5 -12
- package/lib/spot-client.js +6 -12
- package/lib/spot-client.js.map +1 -1
- package/lib/types/index.d.ts +1 -1
- package/lib/types/index.js +1 -1
- package/lib/types/index.js.map +1 -1
- package/lib/types/request/account-asset.d.ts +76 -0
- package/lib/types/request/account-asset.js +3 -0
- package/lib/types/request/account-asset.js.map +1 -0
- package/lib/types/request/copy-trading.d.ts +47 -0
- package/lib/types/request/copy-trading.js +3 -0
- package/lib/types/request/copy-trading.js.map +1 -0
- package/lib/types/request/index.d.ts +7 -0
- package/lib/types/request/index.js +7 -0
- package/lib/types/request/index.js.map +1 -1
- package/lib/types/request/spot.d.ts +72 -0
- package/lib/types/{spot.js → request/spot.js} +0 -0
- package/lib/types/{spot.js.map → request/spot.js.map} +1 -1
- package/lib/types/request/unified-margin.d.ts +223 -0
- package/lib/types/request/unified-margin.js +3 -0
- package/lib/types/request/unified-margin.js.map +1 -0
- package/lib/types/request/usdc-options.d.ts +119 -0
- package/lib/types/request/usdc-options.js +3 -0
- package/lib/types/request/usdc-options.js.map +1 -0
- package/lib/types/request/usdc-perp.d.ts +86 -0
- package/lib/types/request/usdc-perp.js +3 -0
- package/lib/types/request/usdc-perp.js.map +1 -0
- package/lib/types/request/usdc-shared.d.ts +29 -0
- package/lib/types/request/usdc-shared.js +3 -0
- package/lib/types/request/usdc-shared.js.map +1 -0
- package/lib/types/shared.d.ts +18 -5
- package/lib/types/websockets.d.ts +41 -0
- package/lib/types/websockets.js +3 -0
- package/lib/types/websockets.js.map +1 -0
- package/lib/unified-margin-client.d.ts +137 -0
- package/lib/unified-margin-client.js +269 -0
- package/lib/unified-margin-client.js.map +1 -0
- package/lib/usdc-option-client.d.ts +100 -0
- package/lib/usdc-option-client.js +186 -0
- package/lib/usdc-option-client.js.map +1 -0
- package/lib/usdc-perpetual-client.d.ts +88 -0
- package/lib/usdc-perpetual-client.js +181 -0
- package/lib/usdc-perpetual-client.js.map +1 -0
- package/lib/util/BaseRestClient.d.ts +15 -2
- package/lib/util/BaseRestClient.js +93 -29
- package/lib/util/BaseRestClient.js.map +1 -1
- package/lib/util/WsStore.d.ts +40 -17
- package/lib/util/WsStore.js +12 -3
- package/lib/util/WsStore.js.map +1 -1
- package/lib/util/index.d.ts +5 -0
- package/lib/util/index.js +18 -0
- package/lib/util/index.js.map +1 -0
- package/lib/{logger.d.ts → util/logger.d.ts} +0 -0
- package/lib/{logger.js → util/logger.js} +0 -0
- package/lib/util/logger.js.map +1 -0
- package/lib/util/node-support.d.ts +1 -0
- package/lib/util/node-support.js +1 -0
- package/lib/util/node-support.js.map +1 -1
- package/lib/util/requestUtils.d.ts +6 -2
- package/lib/util/requestUtils.js +20 -25
- package/lib/util/requestUtils.js.map +1 -1
- package/lib/util/websocket-util.d.ts +34 -0
- package/lib/util/websocket-util.js +194 -0
- package/lib/util/websocket-util.js.map +1 -0
- package/lib/websocket-client.d.ts +56 -82
- package/lib/websocket-client.js +308 -264
- package/lib/websocket-client.js.map +1 -1
- package/package.json +1 -1
- package/lib/logger.js.map +0 -1
- package/lib/types/spot.d.ts +0 -30
|
@@ -16,12 +16,21 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
16
16
|
const node_support_1 = require("./node-support");
|
|
17
17
|
const requestUtils_1 = require("./requestUtils");
|
|
18
18
|
class BaseRestClient {
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Create an instance of the REST client
|
|
21
|
+
* @param {string} key - your API key
|
|
22
|
+
* @param {string} secret - your API secret
|
|
23
|
+
* @param {boolean} [useLivenet=false]
|
|
24
|
+
* @param {RestClientOptions} [restClientOptions={}] options to configure REST API connectivity
|
|
25
|
+
* @param {AxiosRequestConfig} [requestOptions={}] HTTP networking options for axios
|
|
26
|
+
*/
|
|
27
|
+
constructor(key, secret, useLivenet = false, options = {}, requestOptions = {}) {
|
|
28
|
+
const baseUrl = requestUtils_1.getRestBaseUrl(useLivenet, options);
|
|
20
29
|
this.timeOffset = null;
|
|
21
30
|
this.syncTimePromise = null;
|
|
22
|
-
this.clientType =
|
|
31
|
+
this.clientType = this.getClientType();
|
|
23
32
|
this.options = Object.assign({ recv_window: 5000,
|
|
24
|
-
/** Throw errors if any params are
|
|
33
|
+
/** Throw errors if any request params are empty */
|
|
25
34
|
strict_param_validation: false,
|
|
26
35
|
/** Disable time sync by default */
|
|
27
36
|
enable_time_sync: false,
|
|
@@ -30,7 +39,7 @@ class BaseRestClient {
|
|
|
30
39
|
this.globalRequestOptions = Object.assign(Object.assign({
|
|
31
40
|
// in ms == 5 minutes by default
|
|
32
41
|
timeout: 1000 * 60 * 5 }, requestOptions), { headers: {
|
|
33
|
-
'x-referer':
|
|
42
|
+
'x-referer': requestUtils_1.agentSource,
|
|
34
43
|
} });
|
|
35
44
|
this.baseUrl = baseUrl;
|
|
36
45
|
if (key && !secret) {
|
|
@@ -46,6 +55,9 @@ class BaseRestClient {
|
|
|
46
55
|
isSpotClient() {
|
|
47
56
|
return this.clientType === requestUtils_1.REST_CLIENT_TYPE_ENUM.spot;
|
|
48
57
|
}
|
|
58
|
+
isUSDCClient() {
|
|
59
|
+
return this.clientType === requestUtils_1.REST_CLIENT_TYPE_ENUM.v3;
|
|
60
|
+
}
|
|
49
61
|
get(endpoint, params) {
|
|
50
62
|
return this._call('GET', endpoint, params, true);
|
|
51
63
|
}
|
|
@@ -61,7 +73,7 @@ class BaseRestClient {
|
|
|
61
73
|
deletePrivate(endpoint, params) {
|
|
62
74
|
return this._call('DELETE', endpoint, params, false);
|
|
63
75
|
}
|
|
64
|
-
prepareSignParams(params, isPublicApi) {
|
|
76
|
+
prepareSignParams(method, signMethod, params, isPublicApi) {
|
|
65
77
|
return __awaiter(this, void 0, void 0, function* () {
|
|
66
78
|
if (isPublicApi) {
|
|
67
79
|
return {
|
|
@@ -75,27 +87,54 @@ class BaseRestClient {
|
|
|
75
87
|
if (this.timeOffset === null) {
|
|
76
88
|
yield this.syncTime();
|
|
77
89
|
}
|
|
78
|
-
return this.signRequest(params);
|
|
90
|
+
return this.signRequest(params, method, signMethod);
|
|
79
91
|
});
|
|
80
92
|
}
|
|
81
|
-
/**
|
|
82
|
-
|
|
83
|
-
*/
|
|
84
|
-
_call(method, endpoint, params, isPublicApi) {
|
|
93
|
+
/** Returns an axios request object. Handles signing process automatically if this is a private API call */
|
|
94
|
+
buildRequest(method, url, params, isPublicApi) {
|
|
85
95
|
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
-
const options = Object.assign(Object.assign({}, this.globalRequestOptions), { url:
|
|
96
|
+
const options = Object.assign(Object.assign({}, this.globalRequestOptions), { url: url, method: method });
|
|
87
97
|
for (const key in params) {
|
|
88
98
|
if (typeof params[key] === 'undefined') {
|
|
89
99
|
delete params[key];
|
|
90
100
|
}
|
|
91
101
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
102
|
+
if (isPublicApi) {
|
|
103
|
+
return Object.assign(Object.assign({}, options), { params: params });
|
|
104
|
+
}
|
|
105
|
+
// USDC Options uses a different way of authenticating requests (headers instead of params)
|
|
106
|
+
if (this.isUSDCClient()) {
|
|
107
|
+
if (!options.headers) {
|
|
108
|
+
options.headers = {};
|
|
109
|
+
}
|
|
110
|
+
const signResult = yield this.prepareSignParams(method, 'usdc', params, isPublicApi);
|
|
111
|
+
options.headers['X-BAPI-SIGN-TYPE'] = 2;
|
|
112
|
+
options.headers['X-BAPI-API-KEY'] = this.key;
|
|
113
|
+
options.headers['X-BAPI-TIMESTAMP'] = signResult.timestamp;
|
|
114
|
+
options.headers['X-BAPI-SIGN'] = signResult.sign;
|
|
115
|
+
options.headers['X-BAPI-RECV-WINDOW'] = signResult.recvWindow;
|
|
116
|
+
if (method === 'GET') {
|
|
117
|
+
return Object.assign(Object.assign({}, options), { params: signResult.originalParams });
|
|
118
|
+
}
|
|
119
|
+
return Object.assign(Object.assign({}, options), { data: signResult.originalParams });
|
|
95
120
|
}
|
|
96
|
-
|
|
97
|
-
|
|
121
|
+
const signResult = yield this.prepareSignParams(method, 'keyInBody', params, isPublicApi);
|
|
122
|
+
if (method === 'GET' || this.isSpotClient()) {
|
|
123
|
+
return Object.assign(Object.assign({}, options), { params: signResult.paramsWithSign });
|
|
98
124
|
}
|
|
125
|
+
return Object.assign(Object.assign({}, options), { data: signResult.paramsWithSign });
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* @private Make a HTTP request to a specific endpoint. Private endpoints are automatically signed.
|
|
130
|
+
*/
|
|
131
|
+
_call(method, endpoint, params, isPublicApi) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
// Sanity check to make sure it's only ever prefixed by one forward slash
|
|
134
|
+
const requestUrl = [this.baseUrl, endpoint].join(endpoint.startsWith('/') ? '' : '/');
|
|
135
|
+
// Build a request and handle signature process
|
|
136
|
+
const options = yield this.buildRequest(method, requestUrl, params, isPublicApi);
|
|
137
|
+
// Dispatch request
|
|
99
138
|
return axios_1.default(options)
|
|
100
139
|
.then((response) => {
|
|
101
140
|
if (response.status == 200) {
|
|
@@ -135,25 +174,50 @@ class BaseRestClient {
|
|
|
135
174
|
/**
|
|
136
175
|
* @private sign request and set recv window
|
|
137
176
|
*/
|
|
138
|
-
signRequest(data) {
|
|
177
|
+
signRequest(data, method, signMethod) {
|
|
139
178
|
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
const timestamp = Date.now() + (this.timeOffset || 0);
|
|
140
180
|
const res = {
|
|
141
|
-
originalParams: Object.assign(
|
|
181
|
+
originalParams: Object.assign({}, data),
|
|
142
182
|
sign: '',
|
|
183
|
+
timestamp,
|
|
184
|
+
recvWindow: 0,
|
|
185
|
+
serializedParams: '',
|
|
143
186
|
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
187
|
+
if (!this.key || !this.secret) {
|
|
188
|
+
return res;
|
|
189
|
+
}
|
|
190
|
+
const key = this.key;
|
|
191
|
+
const recvWindow = res.originalParams.recv_window || this.options.recv_window || 5000;
|
|
192
|
+
const strictParamValidation = this.options.strict_param_validation;
|
|
193
|
+
// In case the parent function needs it (e.g. USDC uses a header)
|
|
194
|
+
res.recvWindow = recvWindow;
|
|
195
|
+
// usdc is different for some reason
|
|
196
|
+
if (signMethod === 'usdc') {
|
|
197
|
+
const signRequestParams = method === 'GET'
|
|
198
|
+
? requestUtils_1.serializeParams(res.originalParams, strictParamValidation)
|
|
199
|
+
: JSON.stringify(res.originalParams);
|
|
200
|
+
const paramsStr = timestamp + key + recvWindow + signRequestParams;
|
|
201
|
+
res.sign = yield node_support_1.signMessage(paramsStr, this.secret);
|
|
202
|
+
return res;
|
|
152
203
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
res.
|
|
204
|
+
// spot/v2 derivatives
|
|
205
|
+
if (signMethod === 'keyInBody') {
|
|
206
|
+
res.originalParams.api_key = key;
|
|
207
|
+
res.originalParams.timestamp = timestamp;
|
|
208
|
+
// Optional, set to 5000 by default. Increase if timestamp/recv_window errors are seen.
|
|
209
|
+
if (recvWindow) {
|
|
210
|
+
if (this.isSpotClient()) {
|
|
211
|
+
res.originalParams.recvWindow = recvWindow;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
res.originalParams.recv_window = recvWindow;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
res.serializedParams = requestUtils_1.serializeParams(res.originalParams, strictParamValidation);
|
|
218
|
+
res.sign = yield node_support_1.signMessage(res.serializedParams, this.secret);
|
|
156
219
|
res.paramsWithSign = Object.assign(Object.assign({}, res.originalParams), { sign: res.sign });
|
|
220
|
+
return res;
|
|
157
221
|
}
|
|
158
222
|
return res;
|
|
159
223
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseRestClient.js","sourceRoot":"","sources":["../../src/util/BaseRestClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,kDAAyE;AAEzE,iDAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"BaseRestClient.js","sourceRoot":"","sources":["../../src/util/BaseRestClient.ts"],"names":[],"mappings":"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"}
|
package/lib/util/WsStore.d.ts
CHANGED
|
@@ -1,33 +1,56 @@
|
|
|
1
|
-
import { WsConnectionState } from '../websocket-client';
|
|
2
|
-
import { DefaultLogger } from '../logger';
|
|
3
1
|
import WebSocket from 'isomorphic-ws';
|
|
2
|
+
import { WsKey } from '../types';
|
|
3
|
+
import { DefaultLogger } from './logger';
|
|
4
|
+
export declare enum WsConnectionStateEnum {
|
|
5
|
+
INITIAL = 0,
|
|
6
|
+
CONNECTING = 1,
|
|
7
|
+
CONNECTED = 2,
|
|
8
|
+
CLOSING = 3,
|
|
9
|
+
RECONNECTING = 4
|
|
10
|
+
}
|
|
11
|
+
/** A "topic" is always a string */
|
|
4
12
|
declare type WsTopic = string;
|
|
13
|
+
/**
|
|
14
|
+
* A "Set" is used to ensure we only subscribe to a topic once (tracking a list of unique topics we're expected to be connected to)
|
|
15
|
+
* TODO: do any WS topics allow parameters? If so, we need a way to track those (see FTX implementation)
|
|
16
|
+
*/
|
|
5
17
|
declare type WsTopicList = Set<WsTopic>;
|
|
6
18
|
interface WsStoredState {
|
|
19
|
+
/** The currently active websocket connection */
|
|
7
20
|
ws?: WebSocket;
|
|
8
|
-
|
|
21
|
+
/** The current lifecycle state of the connection (enum) */
|
|
22
|
+
connectionState?: WsConnectionStateEnum;
|
|
23
|
+
/** A timer that will send an upstream heartbeat (ping) when it expires */
|
|
9
24
|
activePingTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
25
|
+
/** A timer tracking that an upstream heartbeat was sent, expecting a reply before it expires */
|
|
10
26
|
activePongTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
27
|
+
/** If a reconnection is in progress, this will have the timer for the delayed reconnect */
|
|
28
|
+
activeReconnectTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* All the topics we are expected to be subscribed to (and we automatically resubscribe to if the connection drops)
|
|
31
|
+
*/
|
|
11
32
|
subscribedTopics: WsTopicList;
|
|
12
33
|
}
|
|
13
34
|
export default class WsStore {
|
|
14
35
|
private wsState;
|
|
15
36
|
private logger;
|
|
16
37
|
constructor(logger: typeof DefaultLogger);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
/** Get WS stored state for key, optionally create if missing */
|
|
39
|
+
get(key: WsKey, createIfMissing?: true): WsStoredState;
|
|
40
|
+
get(key: WsKey, createIfMissing?: false): WsStoredState | undefined;
|
|
41
|
+
getKeys(): WsKey[];
|
|
42
|
+
create(key: WsKey): WsStoredState | undefined;
|
|
43
|
+
delete(key: WsKey): void;
|
|
44
|
+
hasExistingActiveConnection(key: WsKey): boolean;
|
|
45
|
+
getWs(key: WsKey): WebSocket | undefined;
|
|
46
|
+
setWs(key: WsKey, wsConnection: WebSocket): WebSocket;
|
|
47
|
+
isWsOpen(key: WsKey): boolean;
|
|
48
|
+
getConnectionState(key: WsKey): WsConnectionStateEnum;
|
|
49
|
+
setConnectionState(key: WsKey, state: WsConnectionStateEnum): void;
|
|
50
|
+
isConnectionState(key: WsKey, state: WsConnectionStateEnum): boolean;
|
|
51
|
+
getTopics(key: WsKey): WsTopicList;
|
|
29
52
|
getTopicsByKey(): Record<string, WsTopicList>;
|
|
30
|
-
addTopic(key:
|
|
31
|
-
deleteTopic(key:
|
|
53
|
+
addTopic(key: WsKey, topic: WsTopic): WsTopicList;
|
|
54
|
+
deleteTopic(key: WsKey, topic: WsTopic): boolean;
|
|
32
55
|
}
|
|
33
56
|
export {};
|
package/lib/util/WsStore.js
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
const logger_1 = require("
|
|
3
|
+
exports.WsConnectionStateEnum = void 0;
|
|
4
|
+
const logger_1 = require("./logger");
|
|
5
|
+
var WsConnectionStateEnum;
|
|
6
|
+
(function (WsConnectionStateEnum) {
|
|
7
|
+
WsConnectionStateEnum[WsConnectionStateEnum["INITIAL"] = 0] = "INITIAL";
|
|
8
|
+
WsConnectionStateEnum[WsConnectionStateEnum["CONNECTING"] = 1] = "CONNECTING";
|
|
9
|
+
WsConnectionStateEnum[WsConnectionStateEnum["CONNECTED"] = 2] = "CONNECTED";
|
|
10
|
+
WsConnectionStateEnum[WsConnectionStateEnum["CLOSING"] = 3] = "CLOSING";
|
|
11
|
+
WsConnectionStateEnum[WsConnectionStateEnum["RECONNECTING"] = 4] = "RECONNECTING";
|
|
12
|
+
// ERROR = 5,
|
|
13
|
+
})(WsConnectionStateEnum = exports.WsConnectionStateEnum || (exports.WsConnectionStateEnum = {}));
|
|
5
14
|
class WsStore {
|
|
6
15
|
constructor(logger) {
|
|
7
16
|
this.logger = logger || logger_1.DefaultLogger;
|
|
@@ -24,7 +33,7 @@ class WsStore {
|
|
|
24
33
|
}
|
|
25
34
|
this.wsState[key] = {
|
|
26
35
|
subscribedTopics: new Set(),
|
|
27
|
-
connectionState:
|
|
36
|
+
connectionState: WsConnectionStateEnum.INITIAL,
|
|
28
37
|
};
|
|
29
38
|
return this.get(key);
|
|
30
39
|
}
|
package/lib/util/WsStore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WsStore.js","sourceRoot":"","sources":["../../src/util/WsStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WsStore.js","sourceRoot":"","sources":["../../src/util/WsStore.ts"],"names":[],"mappings":";;;AAGA,qCAAyC;AAEzC,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC/B,uEAAW,CAAA;IACX,6EAAc,CAAA;IACd,2EAAa,CAAA;IACb,uEAAW,CAAA;IACX,iFAAgB,CAAA;IAChB,aAAa;AACf,CAAC,EAPW,qBAAqB,GAArB,6BAAqB,KAArB,6BAAqB,QAOhC;AA2BD,MAAqB,OAAO;IAI1B,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,sBAAa,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAKD,GAAG,CAAC,GAAU,EAAE,eAAyB;QACvC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACrB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SAC1B;QAED,IAAI,eAAe,EAAE;YACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACzB;IACH,CAAC;IAED,OAAO;QACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAY,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,GAAU;QACf,IAAI,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,gEAAgE,EAChE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAChB,CAAC;SACH;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG;YAClB,gBAAgB,EAAE,IAAI,GAAG,EAAE;YAC3B,eAAe,EAAE,qBAAqB,CAAC,OAAO;SAC/C,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,GAAU;QACf,IAAI,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE;YACzC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,oDAAoD,EACpD,EAAE,CACH,CAAC;YACF,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,KAAK,GAAG;SACb;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,0BAA0B;IAE1B,2BAA2B,CAAC,GAAU;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,GAAU;;QACd,aAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,0CAAE,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAU,EAAE,YAAuB;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,gEAAgE,EAChE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAChB,CAAC;SACH;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAE,CAAC,EAAE,GAAG,YAAY,CAAC;QACvC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,sBAAsB;IAEtB,QAAQ,CAAC,GAAU;QACjB,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,CACL,CAAC,CAAC,kBAAkB;YACpB,kBAAkB,CAAC,UAAU,KAAK,kBAAkB,CAAC,IAAI,CAC1D,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,GAAU;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAE,CAAC,eAAgB,CAAC;IAC/C,CAAC;IAED,kBAAkB,CAAC,GAAU,EAAE,KAA4B;QACzD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAE,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/C,CAAC;IAED,iBAAiB,CAAC,GAAU,EAAE,KAA4B;QACxD,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;IAChD,CAAC;IAED,uBAAuB;IAEvB,SAAS,CAAC,GAAU;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,gBAAgB,CAAC;IAC9C,CAAC;IAED,cAAc;QACZ,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YACjC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAe,CAAC,CAAC;SAClD;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,GAAU,EAAE,KAAc;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,GAAU,EAAE,KAAc;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF;AApHD,0BAoHC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./BaseRestClient"), exports);
|
|
14
|
+
__exportStar(require("./requestUtils"), exports);
|
|
15
|
+
__exportStar(require("./WsStore"), exports);
|
|
16
|
+
__exportStar(require("./logger"), exports);
|
|
17
|
+
__exportStar(require("./websocket-util"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAiC;AACjC,iDAA+B;AAC/B,4CAA0B;AAC1B,2CAAyB;AACzB,mDAAiC"}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/util/logger.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACpC,uBAAuB;IACzB,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACnC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACpC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;CACF,CAAC"}
|
package/lib/util/node-support.js
CHANGED
|
@@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.signMessage = void 0;
|
|
13
13
|
const crypto_1 = require("crypto");
|
|
14
|
+
/** This is async because the browser version uses a promise (browser-support) */
|
|
14
15
|
function signMessage(message, secret) {
|
|
15
16
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
17
|
return crypto_1.createHmac('sha256', secret).update(message).digest('hex');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-support.js","sourceRoot":"","sources":["../../src/util/node-support.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AAEpC,SAAsB,WAAW,CAC/B,OAAe,EACf,MAAc;;QAEd,OAAO,mBAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;CAAA;AALD,kCAKC"}
|
|
1
|
+
{"version":3,"file":"node-support.js","sourceRoot":"","sources":["../../src/util/node-support.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AAEpC,iFAAiF;AACjF,SAAsB,WAAW,CAC/B,OAAe,EACf,MAAc;;QAEd,OAAO,mBAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;CAAA;AALD,kCAKC"}
|
|
@@ -19,13 +19,17 @@ export interface RestClientOptions {
|
|
|
19
19
|
}
|
|
20
20
|
export declare function serializeParams(params?: object, strict_validation?: boolean): string;
|
|
21
21
|
export declare function getRestBaseUrl(useLivenet: boolean, restInverseOptions: RestClientOptions): string;
|
|
22
|
-
export declare function
|
|
23
|
-
export declare function isWsPong(response: any): any;
|
|
22
|
+
export declare function isWsPong(msg: any): boolean;
|
|
24
23
|
export declare const agentSource = "bybitapinode";
|
|
24
|
+
/**
|
|
25
|
+
* Used to switch how authentication/requests work under the hood (primarily for SPOT since it's different there)
|
|
26
|
+
*/
|
|
25
27
|
export declare const REST_CLIENT_TYPE_ENUM: {
|
|
28
|
+
readonly accountAsset: "accountAsset";
|
|
26
29
|
readonly inverse: "inverse";
|
|
27
30
|
readonly inverseFutures: "inverseFutures";
|
|
28
31
|
readonly linear: "linear";
|
|
29
32
|
readonly spot: "spot";
|
|
33
|
+
readonly v3: "v3";
|
|
30
34
|
};
|
|
31
35
|
export declare type RestClientType = typeof REST_CLIENT_TYPE_ENUM[keyof typeof REST_CLIENT_TYPE_ENUM];
|
package/lib/util/requestUtils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.REST_CLIENT_TYPE_ENUM = exports.agentSource = exports.isWsPong = exports.
|
|
3
|
+
exports.REST_CLIENT_TYPE_ENUM = exports.agentSource = exports.isWsPong = exports.getRestBaseUrl = exports.serializeParams = void 0;
|
|
4
4
|
function serializeParams(params = {}, strict_validation = false) {
|
|
5
5
|
return Object.keys(params)
|
|
6
6
|
.sort()
|
|
@@ -15,7 +15,7 @@ function serializeParams(params = {}, strict_validation = false) {
|
|
|
15
15
|
}
|
|
16
16
|
exports.serializeParams = serializeParams;
|
|
17
17
|
function getRestBaseUrl(useLivenet, restInverseOptions) {
|
|
18
|
-
const
|
|
18
|
+
const exchangeBaseUrls = {
|
|
19
19
|
livenet: 'https://api.bybit.com',
|
|
20
20
|
testnet: 'https://api-testnet.bybit.com',
|
|
21
21
|
};
|
|
@@ -23,42 +23,37 @@ function getRestBaseUrl(useLivenet, restInverseOptions) {
|
|
|
23
23
|
return restInverseOptions.baseUrl;
|
|
24
24
|
}
|
|
25
25
|
if (useLivenet === true) {
|
|
26
|
-
return
|
|
26
|
+
return exchangeBaseUrls.livenet;
|
|
27
27
|
}
|
|
28
|
-
return
|
|
28
|
+
return exchangeBaseUrls.testnet;
|
|
29
29
|
}
|
|
30
30
|
exports.getRestBaseUrl = getRestBaseUrl;
|
|
31
|
-
function
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
'public/linear',
|
|
35
|
-
'spot/quote/v1',
|
|
36
|
-
'spot/v1/symbols',
|
|
37
|
-
'spot/v1/time',
|
|
38
|
-
];
|
|
39
|
-
for (const prefix of publicPrefixes) {
|
|
40
|
-
if (endpoint.startsWith(prefix)) {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
31
|
+
function isWsPong(msg) {
|
|
32
|
+
if (!msg) {
|
|
33
|
+
return false;
|
|
43
34
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (response.pong || response.ping) {
|
|
35
|
+
if (msg.pong || msg.ping) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (msg['op'] === 'pong') {
|
|
49
39
|
return true;
|
|
50
40
|
}
|
|
51
|
-
return (
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
41
|
+
return (msg.request &&
|
|
42
|
+
msg.request.op === 'ping' &&
|
|
43
|
+
msg.ret_msg === 'pong' &&
|
|
44
|
+
msg.success === true);
|
|
55
45
|
}
|
|
56
46
|
exports.isWsPong = isWsPong;
|
|
57
47
|
exports.agentSource = 'bybitapinode';
|
|
48
|
+
/**
|
|
49
|
+
* Used to switch how authentication/requests work under the hood (primarily for SPOT since it's different there)
|
|
50
|
+
*/
|
|
58
51
|
exports.REST_CLIENT_TYPE_ENUM = {
|
|
52
|
+
accountAsset: 'accountAsset',
|
|
59
53
|
inverse: 'inverse',
|
|
60
54
|
inverseFutures: 'inverseFutures',
|
|
61
55
|
linear: 'linear',
|
|
62
56
|
spot: 'spot',
|
|
57
|
+
v3: 'v3',
|
|
63
58
|
};
|
|
64
59
|
//# sourceMappingURL=requestUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestUtils.js","sourceRoot":"","sources":["../../src/util/requestUtils.ts"],"names":[],"mappings":";;;AA0BA,SAAgB,eAAe,CAC7B,SAAiB,EAAE,EACnB,iBAAiB,GAAG,KAAK;IAEzB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACvB,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,iBAAiB,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;YAC9D,MAAM,IAAI,KAAK,CACb,uDAAuD,CACxD,CAAC;SACH;QACD,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAhBD,0CAgBC;AAED,SAAgB,cAAc,CAC5B,UAAmB,EACnB,kBAAqC;IAErC,MAAM,
|
|
1
|
+
{"version":3,"file":"requestUtils.js","sourceRoot":"","sources":["../../src/util/requestUtils.ts"],"names":[],"mappings":";;;AA0BA,SAAgB,eAAe,CAC7B,SAAiB,EAAE,EACnB,iBAAiB,GAAG,KAAK;IAEzB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACvB,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,iBAAiB,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;YAC9D,MAAM,IAAI,KAAK,CACb,uDAAuD,CACxD,CAAC;SACH;QACD,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAhBD,0CAgBC;AAED,SAAgB,cAAc,CAC5B,UAAmB,EACnB,kBAAqC;IAErC,MAAM,gBAAgB,GAAG;QACvB,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE,+BAA+B;KACzC,CAAC;IAEF,IAAI,kBAAkB,CAAC,OAAO,EAAE;QAC9B,OAAO,kBAAkB,CAAC,OAAO,CAAC;KACnC;IAED,IAAI,UAAU,KAAK,IAAI,EAAE;QACvB,OAAO,gBAAgB,CAAC,OAAO,CAAC;KACjC;IACD,OAAO,gBAAgB,CAAC,OAAO,CAAC;AAClC,CAAC;AAjBD,wCAiBC;AAED,SAAgB,QAAQ,CAAC,GAAQ;IAC/B,IAAI,CAAC,GAAG,EAAE;QACR,OAAO,KAAK,CAAC;KACd;IACD,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE;QACxB,OAAO,IAAI,CAAC;KACb;IAED,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE;QACxB,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CACL,GAAG,CAAC,OAAO;QACX,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM;QACzB,GAAG,CAAC,OAAO,KAAK,MAAM;QACtB,GAAG,CAAC,OAAO,KAAK,IAAI,CACrB,CAAC;AACJ,CAAC;AAlBD,4BAkBC;AAEY,QAAA,WAAW,GAAG,cAAc,CAAC;AAE1C;;GAEG;AACU,QAAA,qBAAqB,GAAG;IACnC,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,gBAAgB;IAChC,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI;CACA,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { APIMarket, WsKey } from '../types';
|
|
2
|
+
interface NetworkMapV3 {
|
|
3
|
+
livenet: string;
|
|
4
|
+
livenet2?: string;
|
|
5
|
+
testnet: string;
|
|
6
|
+
testnet2?: string;
|
|
7
|
+
}
|
|
8
|
+
declare type PublicPrivateNetwork = 'public' | 'private';
|
|
9
|
+
export declare const WS_BASE_URL_MAP: Record<APIMarket, Record<PublicPrivateNetwork, NetworkMapV3>>;
|
|
10
|
+
export declare const WS_KEY_MAP: {
|
|
11
|
+
readonly inverse: "inverse";
|
|
12
|
+
readonly linearPrivate: "linearPrivate";
|
|
13
|
+
readonly linearPublic: "linearPublic";
|
|
14
|
+
readonly spotPrivate: "spotPrivate";
|
|
15
|
+
readonly spotPublic: "spotPublic";
|
|
16
|
+
readonly spotV3Private: "spotV3Private";
|
|
17
|
+
readonly spotV3Public: "spotV3Public";
|
|
18
|
+
readonly usdcOptionPrivate: "usdcOptionPrivate";
|
|
19
|
+
readonly usdcOptionPublic: "usdcOptionPublic";
|
|
20
|
+
readonly usdcPerpPrivate: "usdcPerpPrivate";
|
|
21
|
+
readonly usdcPerpPublic: "usdcPerpPublic";
|
|
22
|
+
};
|
|
23
|
+
export declare const WS_AUTH_ON_CONNECT_KEYS: WsKey[];
|
|
24
|
+
export declare const PUBLIC_WS_KEYS: string[];
|
|
25
|
+
export declare function getWsKeyForTopic(market: APIMarket, topic: string, isPrivate?: boolean): WsKey;
|
|
26
|
+
export declare function getUsdcWsKeyForTopic(topic: string, subGroup: 'option' | 'perp'): WsKey;
|
|
27
|
+
export declare const WS_ERROR_ENUM: {
|
|
28
|
+
NOT_AUTHENTICATED_SPOT_V3: string;
|
|
29
|
+
API_ERROR_GENERIC: string;
|
|
30
|
+
API_SIGN_AUTH_FAILED: string;
|
|
31
|
+
USDC_OPTION_AUTH_FAILED: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function neverGuard(x: never, msg: string): Error;
|
|
34
|
+
export {};
|