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