bybit-api 2.3.2 → 2.4.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 +60 -152
- 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 +7 -1
- package/lib/index.js +7 -1
- 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 +16 -5
- package/lib/types/websockets.d.ts +40 -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 +28 -8
- package/lib/util/WsStore.js +11 -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/requestUtils.d.ts +5 -1
- package/lib/util/requestUtils.js +9 -20
- package/lib/util/requestUtils.js.map +1 -1
- package/lib/util/websocket-util.d.ts +8 -0
- package/lib/util/websocket-util.js +39 -0
- package/lib/util/websocket-util.js.map +1 -0
- package/lib/websocket-client.d.ts +6 -58
- package/lib/websocket-client.js +63 -114
- 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,30 +1,50 @@
|
|
|
1
|
-
import { WsConnectionState } from '../websocket-client';
|
|
2
|
-
import { DefaultLogger } from '../logger';
|
|
3
1
|
import WebSocket from 'isomorphic-ws';
|
|
2
|
+
import { DefaultLogger } from './logger';
|
|
3
|
+
export declare enum WsConnectionStateEnum {
|
|
4
|
+
INITIAL = 0,
|
|
5
|
+
CONNECTING = 1,
|
|
6
|
+
CONNECTED = 2,
|
|
7
|
+
CLOSING = 3,
|
|
8
|
+
RECONNECTING = 4
|
|
9
|
+
}
|
|
10
|
+
/** A "topic" is always a string */
|
|
4
11
|
declare type WsTopic = string;
|
|
12
|
+
/**
|
|
13
|
+
* 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)
|
|
14
|
+
* TODO: do any WS topics allow parameters? If so, we need a way to track those (see FTX implementation)
|
|
15
|
+
*/
|
|
5
16
|
declare type WsTopicList = Set<WsTopic>;
|
|
6
17
|
interface WsStoredState {
|
|
18
|
+
/** The currently active websocket connection */
|
|
7
19
|
ws?: WebSocket;
|
|
8
|
-
|
|
20
|
+
/** The current lifecycle state of the connection (enum) */
|
|
21
|
+
connectionState?: WsConnectionStateEnum;
|
|
22
|
+
/** A timer that will send an upstream heartbeat (ping) when it expires */
|
|
9
23
|
activePingTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
24
|
+
/** A timer tracking that an upstream heartbeat was sent, expecting a reply before it expires */
|
|
10
25
|
activePongTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* All the topics we are expected to be subscribed to (and we automatically resubscribe to if the connection drops)
|
|
28
|
+
*/
|
|
11
29
|
subscribedTopics: WsTopicList;
|
|
12
30
|
}
|
|
13
31
|
export default class WsStore {
|
|
14
32
|
private wsState;
|
|
15
33
|
private logger;
|
|
16
34
|
constructor(logger: typeof DefaultLogger);
|
|
17
|
-
|
|
35
|
+
/** Get WS stored state for key, optionally create if missing */
|
|
36
|
+
get(key: string, createIfMissing?: true): WsStoredState;
|
|
37
|
+
get(key: string, createIfMissing?: false): WsStoredState | undefined;
|
|
18
38
|
getKeys(): string[];
|
|
19
39
|
create(key: string): WsStoredState | undefined;
|
|
20
40
|
delete(key: string): void;
|
|
21
|
-
hasExistingActiveConnection(key: string): boolean
|
|
41
|
+
hasExistingActiveConnection(key: string): boolean;
|
|
22
42
|
getWs(key: string): WebSocket | undefined;
|
|
23
43
|
setWs(key: string, wsConnection: WebSocket): WebSocket;
|
|
24
44
|
isWsOpen(key: string): boolean;
|
|
25
|
-
getConnectionState(key: string):
|
|
26
|
-
setConnectionState(key: string, state:
|
|
27
|
-
isConnectionState(key: string, state:
|
|
45
|
+
getConnectionState(key: string): WsConnectionStateEnum;
|
|
46
|
+
setConnectionState(key: string, state: WsConnectionStateEnum): void;
|
|
47
|
+
isConnectionState(key: string, state: WsConnectionStateEnum): boolean;
|
|
28
48
|
getTopics(key: string): WsTopicList;
|
|
29
49
|
getTopicsByKey(): Record<string, WsTopicList>;
|
|
30
50
|
addTopic(key: string, topic: WsTopic): WsTopicList;
|
package/lib/util/WsStore.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
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
|
+
})(WsConnectionStateEnum = exports.WsConnectionStateEnum || (exports.WsConnectionStateEnum = {}));
|
|
5
13
|
class WsStore {
|
|
6
14
|
constructor(logger) {
|
|
7
15
|
this.logger = logger || logger_1.DefaultLogger;
|
|
@@ -24,7 +32,7 @@ class WsStore {
|
|
|
24
32
|
}
|
|
25
33
|
this.wsState[key] = {
|
|
26
34
|
subscribedTopics: new Set(),
|
|
27
|
-
connectionState:
|
|
35
|
+
connectionState: WsConnectionStateEnum.INITIAL,
|
|
28
36
|
};
|
|
29
37
|
return this.get(key);
|
|
30
38
|
}
|
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":"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"}
|
|
@@ -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"}
|
|
@@ -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 isPublicEndpoint(endpoint: string): boolean;
|
|
23
22
|
export declare function isWsPong(response: any): any;
|
|
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,27 +23,11 @@ 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 isPublicEndpoint(endpoint) {
|
|
32
|
-
const publicPrefixes = [
|
|
33
|
-
'v2/public',
|
|
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
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
exports.isPublicEndpoint = isPublicEndpoint;
|
|
47
31
|
function isWsPong(response) {
|
|
48
32
|
if (response.pong || response.ping) {
|
|
49
33
|
return true;
|
|
@@ -55,10 +39,15 @@ function isWsPong(response) {
|
|
|
55
39
|
}
|
|
56
40
|
exports.isWsPong = isWsPong;
|
|
57
41
|
exports.agentSource = 'bybitapinode';
|
|
42
|
+
/**
|
|
43
|
+
* Used to switch how authentication/requests work under the hood (primarily for SPOT since it's different there)
|
|
44
|
+
*/
|
|
58
45
|
exports.REST_CLIENT_TYPE_ENUM = {
|
|
46
|
+
accountAsset: 'accountAsset',
|
|
59
47
|
inverse: 'inverse',
|
|
60
48
|
inverseFutures: 'inverseFutures',
|
|
61
49
|
linear: 'linear',
|
|
62
50
|
spot: 'spot',
|
|
51
|
+
v3: 'v3',
|
|
63
52
|
};
|
|
64
53
|
//# 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,QAAa;IACpC,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,OAAO,IAAI,CAAC;KACb;IACD,OAAO,CACL,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM;QAC9B,QAAQ,CAAC,OAAO,KAAK,MAAM;QAC3B,QAAQ,CAAC,OAAO,KAAK,IAAI,CAC1B,CAAC;AACJ,CAAC;AAVD,4BAUC;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,8 @@
|
|
|
1
|
+
import { WsKey } from '../types';
|
|
2
|
+
export declare const wsKeyInverse = "inverse";
|
|
3
|
+
export declare const wsKeyLinearPrivate = "linearPrivate";
|
|
4
|
+
export declare const wsKeyLinearPublic = "linearPublic";
|
|
5
|
+
export declare const wsKeySpotPrivate = "spotPrivate";
|
|
6
|
+
export declare const wsKeySpotPublic = "spotPublic";
|
|
7
|
+
export declare function getLinearWsKeyForTopic(topic: string): WsKey;
|
|
8
|
+
export declare function getSpotWsKeyForTopic(topic: string): WsKey;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSpotWsKeyForTopic = exports.getLinearWsKeyForTopic = exports.wsKeySpotPublic = exports.wsKeySpotPrivate = exports.wsKeyLinearPublic = exports.wsKeyLinearPrivate = exports.wsKeyInverse = void 0;
|
|
4
|
+
exports.wsKeyInverse = 'inverse';
|
|
5
|
+
exports.wsKeyLinearPrivate = 'linearPrivate';
|
|
6
|
+
exports.wsKeyLinearPublic = 'linearPublic';
|
|
7
|
+
exports.wsKeySpotPrivate = 'spotPrivate';
|
|
8
|
+
exports.wsKeySpotPublic = 'spotPublic';
|
|
9
|
+
function getLinearWsKeyForTopic(topic) {
|
|
10
|
+
const privateLinearTopics = [
|
|
11
|
+
'position',
|
|
12
|
+
'execution',
|
|
13
|
+
'order',
|
|
14
|
+
'stop_order',
|
|
15
|
+
'wallet',
|
|
16
|
+
];
|
|
17
|
+
if (privateLinearTopics.includes(topic)) {
|
|
18
|
+
return exports.wsKeyLinearPrivate;
|
|
19
|
+
}
|
|
20
|
+
return exports.wsKeyLinearPublic;
|
|
21
|
+
}
|
|
22
|
+
exports.getLinearWsKeyForTopic = getLinearWsKeyForTopic;
|
|
23
|
+
function getSpotWsKeyForTopic(topic) {
|
|
24
|
+
const privateLinearTopics = [
|
|
25
|
+
'position',
|
|
26
|
+
'execution',
|
|
27
|
+
'order',
|
|
28
|
+
'stop_order',
|
|
29
|
+
'outboundAccountInfo',
|
|
30
|
+
'executionReport',
|
|
31
|
+
'ticketInfo',
|
|
32
|
+
];
|
|
33
|
+
if (privateLinearTopics.includes(topic)) {
|
|
34
|
+
return exports.wsKeySpotPrivate;
|
|
35
|
+
}
|
|
36
|
+
return exports.wsKeySpotPublic;
|
|
37
|
+
}
|
|
38
|
+
exports.getSpotWsKeyForTopic = getSpotWsKeyForTopic;
|
|
39
|
+
//# sourceMappingURL=websocket-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-util.js","sourceRoot":"","sources":["../../src/util/websocket-util.ts"],"names":[],"mappings":";;;AAEa,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,kBAAkB,GAAG,eAAe,CAAC;AACrC,QAAA,iBAAiB,GAAG,cAAc,CAAC;AACnC,QAAA,gBAAgB,GAAG,aAAa,CAAC;AACjC,QAAA,eAAe,GAAG,YAAY,CAAC;AAE5C,SAAgB,sBAAsB,CAAC,KAAa;IAClD,MAAM,mBAAmB,GAAG;QAC1B,UAAU;QACV,WAAW;QACX,OAAO;QACP,YAAY;QACZ,QAAQ;KACT,CAAC;IACF,IAAI,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACvC,OAAO,0BAAkB,CAAC;KAC3B;IAED,OAAO,yBAAiB,CAAC;AAC3B,CAAC;AAbD,wDAaC;AAED,SAAgB,oBAAoB,CAAC,KAAa;IAChD,MAAM,mBAAmB,GAAG;QAC1B,UAAU;QACV,WAAW;QACX,OAAO;QACP,YAAY;QACZ,qBAAqB;QACrB,iBAAiB;QACjB,YAAY;KACb,CAAC;IAEF,IAAI,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACvC,OAAO,wBAAgB,CAAC;KACzB;IAED,OAAO,uBAAe,CAAC;AACzB,CAAC;AAhBD,oDAgBC"}
|
|
@@ -1,62 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
3
|
import WebSocket from 'isomorphic-ws';
|
|
4
|
-
import { DefaultLogger } from './logger';
|
|
5
|
-
import { KlineInterval } from './types
|
|
6
|
-
import { RestClientOptions } from './util/requestUtils';
|
|
7
|
-
export declare enum WsConnectionState {
|
|
8
|
-
READY_STATE_INITIAL = 0,
|
|
9
|
-
READY_STATE_CONNECTING = 1,
|
|
10
|
-
READY_STATE_CONNECTED = 2,
|
|
11
|
-
READY_STATE_CLOSING = 3,
|
|
12
|
-
READY_STATE_RECONNECTING = 4
|
|
13
|
-
}
|
|
14
|
-
export declare type APIMarket = 'inverse' | 'linear' | 'spot';
|
|
15
|
-
export declare type WsPublicInverseTopic = 'orderBookL2_25' | 'orderBookL2_200' | 'trade' | 'insurance' | 'instrument_info' | 'klineV2';
|
|
16
|
-
export declare type WsPublicUSDTPerpTopic = 'orderBookL2_25' | 'orderBookL2_200' | 'trade' | 'insurance' | 'instrument_info' | 'kline';
|
|
17
|
-
export declare type WsPublicSpotV1Topic = 'trade' | 'realtimes' | 'kline' | 'depth' | 'mergedDepth' | 'diffDepth';
|
|
18
|
-
export declare type WsPublicSpotV2Topic = 'depth' | 'kline' | 'trade' | 'bookTicker' | 'realtimes';
|
|
19
|
-
export declare type WsPublicTopics = WsPublicInverseTopic | WsPublicUSDTPerpTopic | WsPublicSpotV1Topic | WsPublicSpotV2Topic | string;
|
|
20
|
-
export declare type WsPrivateInverseTopic = 'position' | 'execution' | 'order' | 'stop_order';
|
|
21
|
-
export declare type WsPrivateUSDTPerpTopic = 'position' | 'execution' | 'order' | 'stop_order' | 'wallet';
|
|
22
|
-
export declare type WsPrivateSpotTopic = 'outboundAccountInfo' | 'executionReport' | 'ticketInfo';
|
|
23
|
-
export declare type WsPrivateTopic = WsPrivateInverseTopic | WsPrivateUSDTPerpTopic | WsPrivateSpotTopic | string;
|
|
24
|
-
export declare type WsTopic = WsPublicTopics | WsPrivateTopic;
|
|
25
|
-
export interface WSClientConfigurableOptions {
|
|
26
|
-
key?: string;
|
|
27
|
-
secret?: string;
|
|
28
|
-
livenet?: boolean;
|
|
29
|
-
/**
|
|
30
|
-
* @deprecated Use the property { market: 'linear' } instead
|
|
31
|
-
*/
|
|
32
|
-
linear?: boolean;
|
|
33
|
-
market?: APIMarket;
|
|
34
|
-
pongTimeout?: number;
|
|
35
|
-
pingInterval?: number;
|
|
36
|
-
reconnectTimeout?: number;
|
|
37
|
-
restOptions?: RestClientOptions;
|
|
38
|
-
requestOptions?: any;
|
|
39
|
-
wsUrl?: string;
|
|
40
|
-
/** If true, fetch server time before trying to authenticate (disabled by default) */
|
|
41
|
-
fetchTimeOffsetBeforeAuth?: boolean;
|
|
42
|
-
}
|
|
43
|
-
export interface WebsocketClientOptions extends WSClientConfigurableOptions {
|
|
44
|
-
livenet: boolean;
|
|
45
|
-
/**
|
|
46
|
-
* @deprecated Use the property { market: 'linear' } instead
|
|
47
|
-
*/
|
|
48
|
-
linear?: boolean;
|
|
49
|
-
market?: APIMarket;
|
|
50
|
-
pongTimeout: number;
|
|
51
|
-
pingInterval: number;
|
|
52
|
-
reconnectTimeout: number;
|
|
53
|
-
}
|
|
54
|
-
export declare const wsKeyInverse = "inverse";
|
|
55
|
-
export declare const wsKeyLinearPrivate = "linearPrivate";
|
|
56
|
-
export declare const wsKeyLinearPublic = "linearPublic";
|
|
57
|
-
export declare const wsKeySpotPrivate = "spotPrivate";
|
|
58
|
-
export declare const wsKeySpotPublic = "spotPublic";
|
|
59
|
-
export declare type WsKey = 'inverse' | 'linearPrivate' | 'linearPublic' | 'spotPrivate' | 'spotPublic';
|
|
4
|
+
import { DefaultLogger } from './util/logger';
|
|
5
|
+
import { KlineInterval, WSClientConfigurableOptions, WsKey, WsTopic } from './types';
|
|
60
6
|
export declare interface WebsocketClient {
|
|
61
7
|
on(event: 'open' | 'reconnected', listener: ({ wsKey: WsKey, event: any }: {
|
|
62
8
|
wsKey: any;
|
|
@@ -69,6 +15,7 @@ export declare interface WebsocketClient {
|
|
|
69
15
|
}
|
|
70
16
|
export declare class WebsocketClient extends EventEmitter {
|
|
71
17
|
private logger;
|
|
18
|
+
/** Purely used */
|
|
72
19
|
private restClient;
|
|
73
20
|
private options;
|
|
74
21
|
private wsStore;
|
|
@@ -77,6 +24,8 @@ export declare class WebsocketClient extends EventEmitter {
|
|
|
77
24
|
isLinear(): boolean;
|
|
78
25
|
isSpot(): boolean;
|
|
79
26
|
isInverse(): boolean;
|
|
27
|
+
/** USDC, spot v3, unified margin, account asset */
|
|
28
|
+
isV3(): boolean;
|
|
80
29
|
/**
|
|
81
30
|
* Add topic/topics to WS subscription list
|
|
82
31
|
*/
|
|
@@ -87,7 +36,7 @@ export declare class WebsocketClient extends EventEmitter {
|
|
|
87
36
|
unsubscribe(wsTopics: WsTopic[] | WsTopic): void;
|
|
88
37
|
close(wsKey: WsKey): void;
|
|
89
38
|
/**
|
|
90
|
-
* Request connection of all dependent websockets, instead of waiting for automatic connection by library
|
|
39
|
+
* Request connection of all dependent (public & private) websockets, instead of waiting for automatic connection by library
|
|
91
40
|
*/
|
|
92
41
|
connectAll(): Promise<WebSocket | undefined>[] | undefined;
|
|
93
42
|
connectPublic(): Promise<WebSocket | undefined> | undefined;
|
|
@@ -118,7 +67,6 @@ export declare class WebsocketClient extends EventEmitter {
|
|
|
118
67
|
private onWsError;
|
|
119
68
|
private onWsClose;
|
|
120
69
|
private onWsMessageResponse;
|
|
121
|
-
private onWsMessageUpdate;
|
|
122
70
|
private getWs;
|
|
123
71
|
private setWsState;
|
|
124
72
|
private getWsUrl;
|