@siebly/kraken-api 0.0.9
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/LICENSE.md +7 -0
- package/README.md +624 -0
- package/dist/cjs/DerivativesClient.d.ts +657 -0
- package/dist/cjs/DerivativesClient.js +726 -0
- package/dist/cjs/DerivativesClient.js.map +1 -0
- package/dist/cjs/InstitutionalClient.d.ts +183 -0
- package/dist/cjs/InstitutionalClient.js +266 -0
- package/dist/cjs/InstitutionalClient.js.map +1 -0
- package/dist/cjs/PartnerClient.d.ts +257 -0
- package/dist/cjs/PartnerClient.js +344 -0
- package/dist/cjs/PartnerClient.js.map +1 -0
- package/dist/cjs/SpotClient.d.ts +547 -0
- package/dist/cjs/SpotClient.js +607 -0
- package/dist/cjs/SpotClient.js.map +1 -0
- package/dist/cjs/WebsocketAPIClient.d.ts +95 -0
- package/dist/cjs/WebsocketAPIClient.js +136 -0
- package/dist/cjs/WebsocketAPIClient.js.map +1 -0
- package/dist/cjs/WebsocketClient.d.ts +120 -0
- package/dist/cjs/WebsocketClient.js +669 -0
- package/dist/cjs/WebsocketClient.js.map +1 -0
- package/dist/cjs/index.d.ts +24 -0
- package/dist/cjs/index.js +41 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/BaseRestClient.d.ts +66 -0
- package/dist/cjs/lib/BaseRestClient.js +548 -0
- package/dist/cjs/lib/BaseRestClient.js.map +1 -0
- package/dist/cjs/lib/BaseWSClient.d.ts +230 -0
- package/dist/cjs/lib/BaseWSClient.js +935 -0
- package/dist/cjs/lib/BaseWSClient.js.map +1 -0
- package/dist/cjs/lib/misc-util.d.ts +1 -0
- package/dist/cjs/lib/misc-util.js +7 -0
- package/dist/cjs/lib/misc-util.js.map +1 -0
- package/dist/cjs/lib/requestUtils.d.ts +68 -0
- package/dist/cjs/lib/requestUtils.js +82 -0
- package/dist/cjs/lib/requestUtils.js.map +1 -0
- package/dist/cjs/lib/webCryptoAPI.d.ts +15 -0
- package/dist/cjs/lib/webCryptoAPI.js +85 -0
- package/dist/cjs/lib/webCryptoAPI.js.map +1 -0
- package/dist/cjs/lib/websocket/WsStore.d.ts +75 -0
- package/dist/cjs/lib/websocket/WsStore.js +303 -0
- package/dist/cjs/lib/websocket/WsStore.js.map +1 -0
- package/dist/cjs/lib/websocket/WsStore.types.d.ts +51 -0
- package/dist/cjs/lib/websocket/WsStore.types.js +14 -0
- package/dist/cjs/lib/websocket/WsStore.types.js.map +1 -0
- package/dist/cjs/lib/websocket/logger.d.ts +7 -0
- package/dist/cjs/lib/websocket/logger.js +16 -0
- package/dist/cjs/lib/websocket/logger.js.map +1 -0
- package/dist/cjs/lib/websocket/rest-client-cache.d.ts +22 -0
- package/dist/cjs/lib/websocket/rest-client-cache.js +66 -0
- package/dist/cjs/lib/websocket/rest-client-cache.js.map +1 -0
- package/dist/cjs/lib/websocket/websocket-util.d.ts +76 -0
- package/dist/cjs/lib/websocket/websocket-util.js +59 -0
- package/dist/cjs/lib/websocket/websocket-util.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/types/request/derivatives.types.d.ts +186 -0
- package/dist/cjs/types/request/derivatives.types.js +6 -0
- package/dist/cjs/types/request/derivatives.types.js.map +1 -0
- package/dist/cjs/types/request/institutional.types.d.ts +313 -0
- package/dist/cjs/types/request/institutional.types.js +4 -0
- package/dist/cjs/types/request/institutional.types.js.map +1 -0
- package/dist/cjs/types/request/partner.types.d.ts +291 -0
- package/dist/cjs/types/request/partner.types.js +4 -0
- package/dist/cjs/types/request/partner.types.js.map +1 -0
- package/dist/cjs/types/request/spot.types.d.ts +324 -0
- package/dist/cjs/types/request/spot.types.js +6 -0
- package/dist/cjs/types/request/spot.types.js.map +1 -0
- package/dist/cjs/types/request/wsapi.types.d.ts +90 -0
- package/dist/cjs/types/request/wsapi.types.js +6 -0
- package/dist/cjs/types/request/wsapi.types.js.map +1 -0
- package/dist/cjs/types/response/derivatives.types.d.ts +712 -0
- package/dist/cjs/types/response/derivatives.types.js +6 -0
- package/dist/cjs/types/response/derivatives.types.js.map +1 -0
- package/dist/cjs/types/response/institutional.types.d.ts +318 -0
- package/dist/cjs/types/response/institutional.types.js +4 -0
- package/dist/cjs/types/response/institutional.types.js.map +1 -0
- package/dist/cjs/types/response/partner.types.d.ts +332 -0
- package/dist/cjs/types/response/partner.types.js +4 -0
- package/dist/cjs/types/response/partner.types.js.map +1 -0
- package/dist/cjs/types/response/shared.types.d.ts +27 -0
- package/dist/cjs/types/response/shared.types.js +3 -0
- package/dist/cjs/types/response/shared.types.js.map +1 -0
- package/dist/cjs/types/response/spot.types.d.ts +590 -0
- package/dist/cjs/types/response/spot.types.js +6 -0
- package/dist/cjs/types/response/spot.types.js.map +1 -0
- package/dist/cjs/types/response/ws.d.ts +11 -0
- package/dist/cjs/types/response/ws.js +3 -0
- package/dist/cjs/types/response/ws.js.map +1 -0
- package/dist/cjs/types/response/wsapi.types.d.ts +44 -0
- package/dist/cjs/types/response/wsapi.types.js +6 -0
- package/dist/cjs/types/response/wsapi.types.js.map +1 -0
- package/dist/cjs/types/websockets/ws-api.d.ts +71 -0
- package/dist/cjs/types/websockets/ws-api.js +18 -0
- package/dist/cjs/types/websockets/ws-api.js.map +1 -0
- package/dist/cjs/types/websockets/ws-events.d.ts +11 -0
- package/dist/cjs/types/websockets/ws-events.js +11 -0
- package/dist/cjs/types/websockets/ws-events.js.map +1 -0
- package/dist/cjs/types/websockets/ws-general.d.ts +67 -0
- package/dist/cjs/types/websockets/ws-general.js +3 -0
- package/dist/cjs/types/websockets/ws-general.js.map +1 -0
- package/dist/cjs/types/websockets/ws-subscriptions.d.ts +11 -0
- package/dist/cjs/types/websockets/ws-subscriptions.js +31 -0
- package/dist/cjs/types/websockets/ws-subscriptions.js.map +1 -0
- package/dist/mjs/DerivativesClient.d.ts +657 -0
- package/dist/mjs/DerivativesClient.js +722 -0
- package/dist/mjs/DerivativesClient.js.map +1 -0
- package/dist/mjs/InstitutionalClient.d.ts +183 -0
- package/dist/mjs/InstitutionalClient.js +262 -0
- package/dist/mjs/InstitutionalClient.js.map +1 -0
- package/dist/mjs/PartnerClient.d.ts +257 -0
- package/dist/mjs/PartnerClient.js +340 -0
- package/dist/mjs/PartnerClient.js.map +1 -0
- package/dist/mjs/SpotClient.d.ts +547 -0
- package/dist/mjs/SpotClient.js +603 -0
- package/dist/mjs/SpotClient.js.map +1 -0
- package/dist/mjs/WebsocketAPIClient.d.ts +95 -0
- package/dist/mjs/WebsocketAPIClient.js +132 -0
- package/dist/mjs/WebsocketAPIClient.js.map +1 -0
- package/dist/mjs/WebsocketClient.d.ts +120 -0
- package/dist/mjs/WebsocketClient.js +665 -0
- package/dist/mjs/WebsocketClient.js.map +1 -0
- package/dist/mjs/index.d.ts +24 -0
- package/dist/mjs/index.js +25 -0
- package/dist/mjs/index.js.map +1 -0
- package/dist/mjs/lib/BaseRestClient.d.ts +66 -0
- package/dist/mjs/lib/BaseRestClient.js +541 -0
- package/dist/mjs/lib/BaseRestClient.js.map +1 -0
- package/dist/mjs/lib/BaseWSClient.d.ts +230 -0
- package/dist/mjs/lib/BaseWSClient.js +928 -0
- package/dist/mjs/lib/BaseWSClient.js.map +1 -0
- package/dist/mjs/lib/misc-util.d.ts +1 -0
- package/dist/mjs/lib/misc-util.js +4 -0
- package/dist/mjs/lib/misc-util.js.map +1 -0
- package/dist/mjs/lib/requestUtils.d.ts +68 -0
- package/dist/mjs/lib/requestUtils.js +76 -0
- package/dist/mjs/lib/requestUtils.js.map +1 -0
- package/dist/mjs/lib/webCryptoAPI.d.ts +15 -0
- package/dist/mjs/lib/webCryptoAPI.js +80 -0
- package/dist/mjs/lib/webCryptoAPI.js.map +1 -0
- package/dist/mjs/lib/websocket/WsStore.d.ts +75 -0
- package/dist/mjs/lib/websocket/WsStore.js +298 -0
- package/dist/mjs/lib/websocket/WsStore.js.map +1 -0
- package/dist/mjs/lib/websocket/WsStore.types.d.ts +51 -0
- package/dist/mjs/lib/websocket/WsStore.types.js +11 -0
- package/dist/mjs/lib/websocket/WsStore.types.js.map +1 -0
- package/dist/mjs/lib/websocket/logger.d.ts +7 -0
- package/dist/mjs/lib/websocket/logger.js +13 -0
- package/dist/mjs/lib/websocket/logger.js.map +1 -0
- package/dist/mjs/lib/websocket/rest-client-cache.d.ts +22 -0
- package/dist/mjs/lib/websocket/rest-client-cache.js +62 -0
- package/dist/mjs/lib/websocket/rest-client-cache.js.map +1 -0
- package/dist/mjs/lib/websocket/websocket-util.d.ts +76 -0
- package/dist/mjs/lib/websocket/websocket-util.js +54 -0
- package/dist/mjs/lib/websocket/websocket-util.js.map +1 -0
- package/dist/mjs/package.json +3 -0
- package/dist/mjs/types/request/derivatives.types.d.ts +186 -0
- package/dist/mjs/types/request/derivatives.types.js +5 -0
- package/dist/mjs/types/request/derivatives.types.js.map +1 -0
- package/dist/mjs/types/request/institutional.types.d.ts +313 -0
- package/dist/mjs/types/request/institutional.types.js +3 -0
- package/dist/mjs/types/request/institutional.types.js.map +1 -0
- package/dist/mjs/types/request/partner.types.d.ts +291 -0
- package/dist/mjs/types/request/partner.types.js +3 -0
- package/dist/mjs/types/request/partner.types.js.map +1 -0
- package/dist/mjs/types/request/spot.types.d.ts +324 -0
- package/dist/mjs/types/request/spot.types.js +5 -0
- package/dist/mjs/types/request/spot.types.js.map +1 -0
- package/dist/mjs/types/request/wsapi.types.d.ts +90 -0
- package/dist/mjs/types/request/wsapi.types.js +5 -0
- package/dist/mjs/types/request/wsapi.types.js.map +1 -0
- package/dist/mjs/types/response/derivatives.types.d.ts +712 -0
- package/dist/mjs/types/response/derivatives.types.js +5 -0
- package/dist/mjs/types/response/derivatives.types.js.map +1 -0
- package/dist/mjs/types/response/institutional.types.d.ts +318 -0
- package/dist/mjs/types/response/institutional.types.js +3 -0
- package/dist/mjs/types/response/institutional.types.js.map +1 -0
- package/dist/mjs/types/response/partner.types.d.ts +332 -0
- package/dist/mjs/types/response/partner.types.js +3 -0
- package/dist/mjs/types/response/partner.types.js.map +1 -0
- package/dist/mjs/types/response/shared.types.d.ts +27 -0
- package/dist/mjs/types/response/shared.types.js +2 -0
- package/dist/mjs/types/response/shared.types.js.map +1 -0
- package/dist/mjs/types/response/spot.types.d.ts +590 -0
- package/dist/mjs/types/response/spot.types.js +5 -0
- package/dist/mjs/types/response/spot.types.js.map +1 -0
- package/dist/mjs/types/response/ws.d.ts +11 -0
- package/dist/mjs/types/response/ws.js +2 -0
- package/dist/mjs/types/response/ws.js.map +1 -0
- package/dist/mjs/types/response/wsapi.types.d.ts +44 -0
- package/dist/mjs/types/response/wsapi.types.js +5 -0
- package/dist/mjs/types/response/wsapi.types.js.map +1 -0
- package/dist/mjs/types/websockets/ws-api.d.ts +71 -0
- package/dist/mjs/types/websockets/ws-api.js +15 -0
- package/dist/mjs/types/websockets/ws-api.js.map +1 -0
- package/dist/mjs/types/websockets/ws-events.d.ts +11 -0
- package/dist/mjs/types/websockets/ws-events.js +8 -0
- package/dist/mjs/types/websockets/ws-events.js.map +1 -0
- package/dist/mjs/types/websockets/ws-general.d.ts +67 -0
- package/dist/mjs/types/websockets/ws-general.js +2 -0
- package/dist/mjs/types/websockets/ws-general.js.map +1 -0
- package/dist/mjs/types/websockets/ws-subscriptions.d.ts +11 -0
- package/dist/mjs/types/websockets/ws-subscriptions.js +28 -0
- package/dist/mjs/types/websockets/ws-subscriptions.js.map +1 -0
- package/llms.txt +10925 -0
- package/package.json +89 -0
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BaseRestClient = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const https_1 = __importDefault(require("https"));
|
|
9
|
+
const misc_util_js_1 = require("./misc-util.js");
|
|
10
|
+
const requestUtils_js_1 = require("./requestUtils.js");
|
|
11
|
+
const webCryptoAPI_js_1 = require("./webCryptoAPI.js");
|
|
12
|
+
const MISSING_API_KEYS_ERROR = 'API Key & Secret are BOTH required to use the authenticated REST client';
|
|
13
|
+
const ENABLE_HTTP_TRACE = typeof process === 'object' &&
|
|
14
|
+
typeof process.env === 'object' &&
|
|
15
|
+
process.env.KRAKENTRACE;
|
|
16
|
+
if (ENABLE_HTTP_TRACE) {
|
|
17
|
+
axios_1.default.interceptors.request.use((request) => {
|
|
18
|
+
console.log(new Date(), 'Starting Request', JSON.stringify({
|
|
19
|
+
url: request.url,
|
|
20
|
+
method: request.method,
|
|
21
|
+
params: request.params,
|
|
22
|
+
data: request.data,
|
|
23
|
+
}, null, 2));
|
|
24
|
+
return request;
|
|
25
|
+
});
|
|
26
|
+
axios_1.default.interceptors.response.use((response) => {
|
|
27
|
+
console.log(new Date(), 'Response:', {
|
|
28
|
+
// request: {
|
|
29
|
+
// url: response.config.url,
|
|
30
|
+
// method: response.config.method,
|
|
31
|
+
// data: response.config.data,
|
|
32
|
+
// headers: response.config.headers,
|
|
33
|
+
// },
|
|
34
|
+
response: {
|
|
35
|
+
status: response.status,
|
|
36
|
+
statusText: response.statusText,
|
|
37
|
+
headers: response.headers,
|
|
38
|
+
data: JSON.stringify(response.data, null, 2),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
return response;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Impure, mutates params to remove any values that have a key but are undefined.
|
|
46
|
+
*/
|
|
47
|
+
function deleteUndefinedValues(params) {
|
|
48
|
+
if (!params) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
for (const key in params) {
|
|
52
|
+
const value = params[key];
|
|
53
|
+
if (typeof value === 'undefined') {
|
|
54
|
+
delete params[key];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
class BaseRestClient {
|
|
59
|
+
options;
|
|
60
|
+
baseUrl;
|
|
61
|
+
globalRequestOptions;
|
|
62
|
+
apiKey;
|
|
63
|
+
apiSecret;
|
|
64
|
+
apiAccessToken;
|
|
65
|
+
// A unique incrementing nonce
|
|
66
|
+
apiRequestNonce = Date.now();
|
|
67
|
+
/**
|
|
68
|
+
* Create an instance of the REST client. Pass API credentials in the object in the first parameter.
|
|
69
|
+
* @param {RestClientOptions} [restClientOptions={}] options to configure REST API connectivity
|
|
70
|
+
* @param {AxiosRequestConfig} [networkOptions={}] HTTP networking options for axios
|
|
71
|
+
*/
|
|
72
|
+
constructor(restClientOptions = {}, networkOptions = {}) {
|
|
73
|
+
this.options = {
|
|
74
|
+
/** Throw errors if any request params are empty */
|
|
75
|
+
strictParamValidation: false,
|
|
76
|
+
...restClientOptions,
|
|
77
|
+
};
|
|
78
|
+
this.globalRequestOptions = {
|
|
79
|
+
/** in ms == 5 minutes by default */
|
|
80
|
+
timeout: 1000 * 60 * 5,
|
|
81
|
+
/** inject custom request options based on axios specs - see axios docs for more guidance on AxiosRequestConfig: https://github.com/axios/axios#request-config */
|
|
82
|
+
...networkOptions,
|
|
83
|
+
headers: {
|
|
84
|
+
UserAgent: '@siebly/kraken-api',
|
|
85
|
+
locale: 'en-US',
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
// If enabled, configure a https agent with keepAlive enabled
|
|
89
|
+
if (this.options.keepAlive) {
|
|
90
|
+
// Extract existing https agent parameters, if provided, to prevent the keepAlive flag from overwriting an existing https agent completely
|
|
91
|
+
const existingHttpsAgent = this.globalRequestOptions.httpsAgent;
|
|
92
|
+
const existingAgentOptions = existingHttpsAgent?.options || {};
|
|
93
|
+
// For more advanced configuration, raise an issue on GitHub or use the "networkOptions"
|
|
94
|
+
// parameter to define a custom httpsAgent with the desired properties
|
|
95
|
+
this.globalRequestOptions.httpsAgent = new https_1.default.Agent({
|
|
96
|
+
...existingAgentOptions,
|
|
97
|
+
keepAlive: true,
|
|
98
|
+
keepAliveMsecs: this.options.keepAliveMsecs,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
this.baseUrl = (0, requestUtils_js_1.getRestBaseUrl)(restClientOptions, this.getClientType());
|
|
102
|
+
this.apiKey = this.options.apiKey;
|
|
103
|
+
this.apiSecret = this.options.apiSecret;
|
|
104
|
+
this.apiAccessToken = this.options.apiAccessToken;
|
|
105
|
+
// Check Web Crypto API support when credentials are provided
|
|
106
|
+
if (this.apiKey && this.apiSecret) {
|
|
107
|
+
(0, webCryptoAPI_js_1.checkWebCryptoAPISupported)();
|
|
108
|
+
}
|
|
109
|
+
// Throw if one of the 3 values is missing, but at least one of them is set
|
|
110
|
+
const credentials = [this.apiKey, this.apiSecret];
|
|
111
|
+
if (credentials.includes(undefined) &&
|
|
112
|
+
credentials.some((v) => typeof v === 'string')) {
|
|
113
|
+
throw new Error(MISSING_API_KEYS_ERROR);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generates a timestamp for signing API requests.
|
|
118
|
+
*
|
|
119
|
+
* This method can be overridden or customized using `customTimestampFn`
|
|
120
|
+
* to implement a custom timestamp synchronization mechanism.
|
|
121
|
+
* If no custom function is provided, it defaults to the current system time.
|
|
122
|
+
*/
|
|
123
|
+
getSignTimestampMs() {
|
|
124
|
+
if (typeof this.options.customTimestampFn === 'function') {
|
|
125
|
+
return this.options.customTimestampFn();
|
|
126
|
+
}
|
|
127
|
+
return Date.now();
|
|
128
|
+
}
|
|
129
|
+
getNextRequestNonce() {
|
|
130
|
+
const newNonce = Date.now();
|
|
131
|
+
if (newNonce <= this.apiRequestNonce) {
|
|
132
|
+
this.apiRequestNonce = ++this.apiRequestNonce;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this.apiRequestNonce = newNonce;
|
|
136
|
+
}
|
|
137
|
+
return String(this.apiRequestNonce);
|
|
138
|
+
}
|
|
139
|
+
hasValidCredentials() {
|
|
140
|
+
const hasAllAPICredentials = this.apiKey && this.apiSecret;
|
|
141
|
+
return this.hasAccessToken() || hasAllAPICredentials;
|
|
142
|
+
}
|
|
143
|
+
setAccessToken(newAccessToken) {
|
|
144
|
+
this.apiAccessToken = newAccessToken;
|
|
145
|
+
}
|
|
146
|
+
hasAccessToken() {
|
|
147
|
+
return !!this.apiAccessToken;
|
|
148
|
+
}
|
|
149
|
+
get(endpoint, params) {
|
|
150
|
+
const isPublicAPI = true;
|
|
151
|
+
// GET only supports params in the query string
|
|
152
|
+
return this._call('GET', endpoint, { query: params }, isPublicAPI);
|
|
153
|
+
}
|
|
154
|
+
post(endpoint, params) {
|
|
155
|
+
const isPublicAPI = true;
|
|
156
|
+
return this._call('POST', endpoint, params, isPublicAPI);
|
|
157
|
+
}
|
|
158
|
+
getPrivate(endpoint, params) {
|
|
159
|
+
const isPublicAPI = false;
|
|
160
|
+
// GET only supports params in the query string
|
|
161
|
+
return this._call('GET', endpoint, { query: params }, isPublicAPI);
|
|
162
|
+
}
|
|
163
|
+
postPrivate(endpoint, params) {
|
|
164
|
+
const isPublicAPI = false;
|
|
165
|
+
return this._call('POST', endpoint, params, isPublicAPI);
|
|
166
|
+
}
|
|
167
|
+
deletePrivate(endpoint, params) {
|
|
168
|
+
const isPublicAPI = false;
|
|
169
|
+
return this._call('DELETE', endpoint, params, isPublicAPI);
|
|
170
|
+
}
|
|
171
|
+
putPrivate(endpoint, params) {
|
|
172
|
+
const isPublicAPI = false;
|
|
173
|
+
return this._call('PUT', endpoint, params, isPublicAPI);
|
|
174
|
+
}
|
|
175
|
+
// protected patchPrivate(endpoint: string, params?: any) {
|
|
176
|
+
patchPrivate(endpoint, params) {
|
|
177
|
+
const isPublicAPI = false;
|
|
178
|
+
return this._call('PATCH', endpoint, params, isPublicAPI);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* @private Make a HTTP request to a specific endpoint. Private endpoint API calls are automatically signed.
|
|
182
|
+
*/
|
|
183
|
+
async _call(method, endpoint, params, isPublicApi) {
|
|
184
|
+
const path = endpoint.startsWith('/') ? endpoint : '/' + endpoint;
|
|
185
|
+
// Sanity check to make sure it's only ever prefixed by one forward slash
|
|
186
|
+
const requestUrl = this.baseUrl + path;
|
|
187
|
+
// Build a request and handle signature process
|
|
188
|
+
const options = await this.buildRequest(method, path, requestUrl, params, isPublicApi);
|
|
189
|
+
if (ENABLE_HTTP_TRACE) {
|
|
190
|
+
console.log(new Date(), 'full request: ', JSON.stringify(options, null, 2));
|
|
191
|
+
}
|
|
192
|
+
// Dispatch request
|
|
193
|
+
return (0, axios_1.default)(options)
|
|
194
|
+
.then((response) => {
|
|
195
|
+
const throable = {
|
|
196
|
+
method,
|
|
197
|
+
endpoint,
|
|
198
|
+
params,
|
|
199
|
+
response,
|
|
200
|
+
};
|
|
201
|
+
if (response.status == 200) {
|
|
202
|
+
// Throw if API returns an error (e.g. insufficient balance)
|
|
203
|
+
if (typeof response.data?.code === 'string' &&
|
|
204
|
+
response.data?.code !== '200000') {
|
|
205
|
+
throw throable;
|
|
206
|
+
}
|
|
207
|
+
switch (this.getClientType()) {
|
|
208
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.main: {
|
|
209
|
+
if (response.data?.error?.length) {
|
|
210
|
+
throw throable;
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.derivatives: {
|
|
215
|
+
// const res = {
|
|
216
|
+
// result: 'error',
|
|
217
|
+
// error: 'authenticationError',
|
|
218
|
+
// serverTime: '2025-10-29T15:02:39.341Z',
|
|
219
|
+
// };
|
|
220
|
+
if (response?.data?.result === 'error') {
|
|
221
|
+
throw throable;
|
|
222
|
+
}
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return response.data;
|
|
227
|
+
}
|
|
228
|
+
throw throable;
|
|
229
|
+
})
|
|
230
|
+
.catch((e) => this.parseException(e, {
|
|
231
|
+
method,
|
|
232
|
+
endpoint,
|
|
233
|
+
path,
|
|
234
|
+
requestUrl,
|
|
235
|
+
params,
|
|
236
|
+
options: {
|
|
237
|
+
...options,
|
|
238
|
+
headers: {
|
|
239
|
+
...options.headers,
|
|
240
|
+
APIKey: 'omittedFromError',
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* @private generic handler to parse request exceptions
|
|
247
|
+
*/
|
|
248
|
+
parseException(e, requestParams) {
|
|
249
|
+
if (this.options.parseExceptions === false) {
|
|
250
|
+
throw e;
|
|
251
|
+
}
|
|
252
|
+
// Something happened in setting up the request that triggered an error
|
|
253
|
+
if (!e.response) {
|
|
254
|
+
if (!e.request) {
|
|
255
|
+
throw e.message;
|
|
256
|
+
}
|
|
257
|
+
// request made but no response received
|
|
258
|
+
throw e;
|
|
259
|
+
}
|
|
260
|
+
// The request was made and the server responded with a status code
|
|
261
|
+
// that falls out of the range of 2xx
|
|
262
|
+
const response = e.response;
|
|
263
|
+
// console.error('err: ', response?.data);
|
|
264
|
+
throw {
|
|
265
|
+
code: response.status,
|
|
266
|
+
message: response.statusText,
|
|
267
|
+
body: response.data,
|
|
268
|
+
headers: response.headers,
|
|
269
|
+
requestOptions: {
|
|
270
|
+
...this.options,
|
|
271
|
+
// Prevent credentials from leaking into error messages
|
|
272
|
+
apiKey: 'omittedFromError',
|
|
273
|
+
apiSecret: 'omittedFromError',
|
|
274
|
+
apiPassphrase: 'omittedFromError',
|
|
275
|
+
},
|
|
276
|
+
requestParams,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
async signMessage(paramsStr, secret, method, algorithm, options) {
|
|
280
|
+
if (typeof this.options.customSignMessageFn === 'function') {
|
|
281
|
+
return this.options.customSignMessageFn(paramsStr, secret);
|
|
282
|
+
}
|
|
283
|
+
return await (0, webCryptoAPI_js_1.signMessage)(paramsStr, secret, method, algorithm, options);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* @private sign request and set recv window
|
|
287
|
+
*/
|
|
288
|
+
async signRequest(data, endpoint, method, signMethod) {
|
|
289
|
+
const timestamp = this.getSignTimestampMs();
|
|
290
|
+
const res = {
|
|
291
|
+
originalParams: { ...data },
|
|
292
|
+
requestData: data?.body || {},
|
|
293
|
+
requestQuery: data?.query || {},
|
|
294
|
+
sign: '',
|
|
295
|
+
timestamp,
|
|
296
|
+
recvWindow: 0,
|
|
297
|
+
serializedParams: '',
|
|
298
|
+
queryParamsWithSign: '',
|
|
299
|
+
};
|
|
300
|
+
if (!this.hasValidCredentials()) {
|
|
301
|
+
return res;
|
|
302
|
+
}
|
|
303
|
+
// handle JSON preprocessing for requests, including embedded stringify
|
|
304
|
+
if (method === 'POST') {
|
|
305
|
+
// array
|
|
306
|
+
if (Array.isArray(res.requestData)) {
|
|
307
|
+
res.requestData.forEach((element) => {
|
|
308
|
+
element[requestUtils_js_1.APIIDMainKey] = requestUtils_js_1.APIIDMain;
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
else if (
|
|
312
|
+
// not array in top, but has array orders
|
|
313
|
+
!Array.isArray(res.requestData) &&
|
|
314
|
+
Array.isArray(res.requestData.orders)) {
|
|
315
|
+
res.requestData.orders.forEach((order) => {
|
|
316
|
+
order[requestUtils_js_1.APIIDMainKey] = requestUtils_js_1.APIIDMain;
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
else if (
|
|
320
|
+
// not array in top, but has array batchOrder
|
|
321
|
+
!Array.isArray(res.requestData) &&
|
|
322
|
+
res.requestData?.json &&
|
|
323
|
+
typeof res.requestData.json === 'object' &&
|
|
324
|
+
Array.isArray(res.requestData.json?.batchOrder)) {
|
|
325
|
+
// Unique to batch order placement, json must be pre-stringified in request
|
|
326
|
+
res.requestData.json = JSON.stringify({
|
|
327
|
+
...res.requestData.json,
|
|
328
|
+
batchOrder: res.requestData.json.batchOrder.map((order) => ({
|
|
329
|
+
...order,
|
|
330
|
+
[requestUtils_js_1.APIIDMainKey]: requestUtils_js_1.APIIDMain,
|
|
331
|
+
})),
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
else if (
|
|
335
|
+
// not array in top, but has json object
|
|
336
|
+
!Array.isArray(res.requestData) &&
|
|
337
|
+
res.requestData?.json &&
|
|
338
|
+
typeof res.requestData.json === 'object') {
|
|
339
|
+
// For the rare non-order requests that expected pre-stringified json
|
|
340
|
+
res.requestData.json = JSON.stringify({
|
|
341
|
+
...res.requestData.json,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
else if (res.requestData) {
|
|
345
|
+
// simple object
|
|
346
|
+
res.requestData[requestUtils_js_1.APIIDMainKey] = requestUtils_js_1.APIIDMain;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const strictParamValidation = this.options.strictParamValidation;
|
|
350
|
+
const encodeQueryStringValues = true;
|
|
351
|
+
if (signMethod === 'kraken') {
|
|
352
|
+
// Don't prefix with ? as part of sign. Prefix after sign
|
|
353
|
+
const prefixWith = '';
|
|
354
|
+
// Array values are repeated into key value pairs
|
|
355
|
+
// E.g. orderIds:[1,2] becomes orderIds=1&orderIds=2
|
|
356
|
+
const repeatArrayValuesAsKVPairs = true;
|
|
357
|
+
const clientType = this.getClientType();
|
|
358
|
+
switch (clientType) {
|
|
359
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.main: {
|
|
360
|
+
// Set default nonce, if not set yet
|
|
361
|
+
if (!Array.isArray(res.requestData)) {
|
|
362
|
+
if (!res.requestData?.nonce) {
|
|
363
|
+
res.requestData = {
|
|
364
|
+
nonce: this.getNextRequestNonce(),
|
|
365
|
+
...res.requestData,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Allow nonce override in reuqest
|
|
370
|
+
// Should never fallback to new nonce, since it's pre-set above with default val
|
|
371
|
+
const nonce = res.requestData?.nonce || this.getNextRequestNonce();
|
|
372
|
+
const serialisedParams = (0, requestUtils_js_1.serializeParams)(method === 'GET' ? res.requestQuery : res.requestData, strictParamValidation, encodeQueryStringValues, prefixWith, repeatArrayValuesAsKVPairs);
|
|
373
|
+
const serialisedQueryParams = (0, requestUtils_js_1.serializeParams)(res.requestQuery, strictParamValidation, encodeQueryStringValues, prefixWith, repeatArrayValuesAsKVPairs);
|
|
374
|
+
// for spot, serialise GET params, use JSON for POST
|
|
375
|
+
const signRequestParams = method === 'GET'
|
|
376
|
+
? serialisedParams
|
|
377
|
+
: JSON.stringify(res.requestData);
|
|
378
|
+
const signEndpoint = endpoint;
|
|
379
|
+
const signInput = `${nonce}${signRequestParams}`;
|
|
380
|
+
// Only sign when no access token is provided
|
|
381
|
+
if (!this.hasAccessToken()) {
|
|
382
|
+
try {
|
|
383
|
+
const signMessageInput = signEndpoint +
|
|
384
|
+
(await (0, webCryptoAPI_js_1.hashMessage)(signInput, 'binary', 'SHA-256'));
|
|
385
|
+
// node:crypto equivalent
|
|
386
|
+
// const sign = createHmac(
|
|
387
|
+
// 'sha512',
|
|
388
|
+
// Buffer.from(this.apiSecret!, 'base64'),
|
|
389
|
+
// )
|
|
390
|
+
// .update(signMessage, 'binary')
|
|
391
|
+
// .digest('base64');
|
|
392
|
+
const sign = await this.signMessage(signMessageInput, this.apiSecret, 'base64', 'SHA-512', {
|
|
393
|
+
isSecretB64Encoded: true,
|
|
394
|
+
isInputBinaryString: true,
|
|
395
|
+
});
|
|
396
|
+
res.sign = sign;
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
// Check if this is a base64 decoding error (invalid API credentials)
|
|
400
|
+
if (error instanceof Error &&
|
|
401
|
+
(error.name === 'InvalidCharacterError' ||
|
|
402
|
+
error.message?.includes('Invalid character'))) {
|
|
403
|
+
const credentialError = new Error('Failed to sign request: Invalid API credentials detected.\n\n' +
|
|
404
|
+
'⚠️ PLEASE CHECK YOUR API KEY AND SECRET:\n' +
|
|
405
|
+
' - Ensure your API Secret is a valid base64-encoded string\n' +
|
|
406
|
+
' - Kraken provides API secrets in base64 format\n\n' +
|
|
407
|
+
`Original error: ${error.message}\n` +
|
|
408
|
+
`Stack trace: ${error.stack}`);
|
|
409
|
+
credentialError.name = 'InvalidCredentialsError';
|
|
410
|
+
throw credentialError;
|
|
411
|
+
}
|
|
412
|
+
// Re-throw other errors as-is
|
|
413
|
+
throw error;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// ONLY the query params. The rest goes in the body, if there is a body.
|
|
417
|
+
res.queryParamsWithSign = serialisedQueryParams;
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.derivatives: {
|
|
421
|
+
const serialisedQueryParams = (0, requestUtils_js_1.serializeParams)(res.requestQuery, strictParamValidation, encodeQueryStringValues, prefixWith, repeatArrayValuesAsKVPairs);
|
|
422
|
+
const serialisedBodyParams = (0, requestUtils_js_1.serializeParams)(res.requestData, strictParamValidation, encodeQueryStringValues, prefixWith, repeatArrayValuesAsKVPairs);
|
|
423
|
+
const signEndpoint = endpoint.replace('/derivatives', '');
|
|
424
|
+
const nonce = ''; //this.getNextRequestNonce();
|
|
425
|
+
const signInput = `${serialisedQueryParams}${serialisedBodyParams}${nonce}${signEndpoint}`;
|
|
426
|
+
// Only sign when no access token is provided
|
|
427
|
+
if (!this.hasAccessToken()) {
|
|
428
|
+
const signMessageInput = await (0, webCryptoAPI_js_1.hashMessage)(signInput, 'binary', 'SHA-256');
|
|
429
|
+
// node:crypto equivalent
|
|
430
|
+
// const sign = createHmac(
|
|
431
|
+
// 'sha512',
|
|
432
|
+
// Buffer.from(this.apiSecret!, 'base64'),
|
|
433
|
+
// )
|
|
434
|
+
// .update(signMessage, 'binary')
|
|
435
|
+
// .digest('base64');
|
|
436
|
+
const sign = await this.signMessage(signMessageInput, this.apiSecret, 'base64', 'SHA-512', {
|
|
437
|
+
isSecretB64Encoded: true,
|
|
438
|
+
isInputBinaryString: true,
|
|
439
|
+
});
|
|
440
|
+
res.sign = sign;
|
|
441
|
+
}
|
|
442
|
+
res.queryParamsWithSign = serialisedQueryParams;
|
|
443
|
+
// Submitted as query string in form body
|
|
444
|
+
res.requestData = serialisedBodyParams;
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return res;
|
|
449
|
+
}
|
|
450
|
+
console.error(new Date(), (0, misc_util_js_1.neverGuard)(signMethod, `Unhandled sign method: "${signMethod}"`));
|
|
451
|
+
return res;
|
|
452
|
+
}
|
|
453
|
+
async prepareSignParams(method, endpoint, signMethod, params, isPublicApi) {
|
|
454
|
+
if (isPublicApi) {
|
|
455
|
+
return {
|
|
456
|
+
originalParams: params,
|
|
457
|
+
paramsWithSign: params,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
if (!this.hasValidCredentials()) {
|
|
461
|
+
throw new Error(MISSING_API_KEYS_ERROR);
|
|
462
|
+
}
|
|
463
|
+
return this.signRequest(params, endpoint, method, signMethod);
|
|
464
|
+
}
|
|
465
|
+
/** Returns an axios request object. Handles signing process automatically if this is a private API call */
|
|
466
|
+
async buildRequest(method, endpoint, url, params, isPublicApi) {
|
|
467
|
+
const options = {
|
|
468
|
+
...this.globalRequestOptions,
|
|
469
|
+
url: url,
|
|
470
|
+
method: method,
|
|
471
|
+
headers: {
|
|
472
|
+
...params?.headers,
|
|
473
|
+
...this.globalRequestOptions.headers,
|
|
474
|
+
},
|
|
475
|
+
};
|
|
476
|
+
deleteUndefinedValues(params);
|
|
477
|
+
deleteUndefinedValues(params?.body);
|
|
478
|
+
deleteUndefinedValues(params?.query);
|
|
479
|
+
deleteUndefinedValues(params?.headers);
|
|
480
|
+
if (isPublicApi || !this.apiKey || !this.apiSecret) {
|
|
481
|
+
return {
|
|
482
|
+
...options,
|
|
483
|
+
params: params?.query || params?.body || params,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
const signResult = await this.prepareSignParams(method, endpoint, 'kraken', params, isPublicApi);
|
|
487
|
+
let signHeaders = {};
|
|
488
|
+
switch (this.getClientType()) {
|
|
489
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.main: {
|
|
490
|
+
signHeaders = {
|
|
491
|
+
'API-Key': this.apiKey,
|
|
492
|
+
'API-Sign': signResult.sign,
|
|
493
|
+
'Content-Type': 'application/json',
|
|
494
|
+
Accept: 'application/json',
|
|
495
|
+
};
|
|
496
|
+
break;
|
|
497
|
+
}
|
|
498
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.derivatives: {
|
|
499
|
+
// Support for Authorization header, if provided:
|
|
500
|
+
// https://github.com/tiagosiebler/kucoin-api/issues/2
|
|
501
|
+
// Use restClient.setAccessToken(newToken), if you need to store a new access token
|
|
502
|
+
// Not supported for Kraken at this time
|
|
503
|
+
if (this.apiAccessToken) {
|
|
504
|
+
signHeaders = {
|
|
505
|
+
Authorization: this.apiAccessToken,
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
signHeaders = {
|
|
510
|
+
Authent: signResult.sign,
|
|
511
|
+
APIKey: this.apiKey,
|
|
512
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
const queryParams = signResult.queryParamsWithSign
|
|
519
|
+
? '?' + signResult.queryParamsWithSign
|
|
520
|
+
: '';
|
|
521
|
+
const urlWithQueryParams = options.url + queryParams;
|
|
522
|
+
if (method !== 'GET') {
|
|
523
|
+
return {
|
|
524
|
+
...options,
|
|
525
|
+
headers: {
|
|
526
|
+
...signHeaders,
|
|
527
|
+
...params?.headers,
|
|
528
|
+
...options.headers,
|
|
529
|
+
},
|
|
530
|
+
url: urlWithQueryParams,
|
|
531
|
+
data: (0, requestUtils_js_1.isEmptyObject)(signResult.requestData, true)
|
|
532
|
+
? undefined
|
|
533
|
+
: signResult.requestData,
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
return {
|
|
537
|
+
...options,
|
|
538
|
+
headers: {
|
|
539
|
+
...signHeaders,
|
|
540
|
+
...params?.headers,
|
|
541
|
+
...options.headers,
|
|
542
|
+
},
|
|
543
|
+
url: urlWithQueryParams,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
exports.BaseRestClient = BaseRestClient;
|
|
548
|
+
//# sourceMappingURL=BaseRestClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseRestClient.js","sourceRoot":"","sources":["../../../src/lib/BaseRestClient.ts"],"names":[],"mappings":"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"}
|