coinbase-api 0.3.2 → 1.0.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 +438 -14
- package/dist/cjs/CBAdvancedTradeClient.d.ts +559 -0
- package/dist/cjs/CBAdvancedTradeClient.js +574 -0
- package/dist/cjs/CBAdvancedTradeClient.js.map +1 -0
- package/dist/cjs/CBAppClient.d.ts +359 -0
- package/dist/cjs/CBAppClient.js +336 -0
- package/dist/cjs/CBAppClient.js.map +1 -0
- package/dist/cjs/CBCommerceClient.d.ts +110 -0
- package/dist/cjs/CBCommerceClient.js +105 -0
- package/dist/cjs/CBCommerceClient.js.map +1 -0
- package/dist/cjs/CBExchangeClient.d.ts +640 -0
- package/dist/cjs/CBExchangeClient.js +751 -0
- package/dist/cjs/CBExchangeClient.js.map +1 -0
- package/dist/cjs/CBInternationalClient.d.ts +381 -0
- package/dist/cjs/CBInternationalClient.js +437 -0
- package/dist/cjs/CBInternationalClient.js.map +1 -0
- package/dist/cjs/CBPrimeClient.d.ts +363 -0
- package/dist/cjs/CBPrimeClient.js +451 -0
- package/dist/cjs/CBPrimeClient.js.map +1 -0
- package/dist/cjs/WebsocketClient.d.ts +78 -0
- package/dist/cjs/WebsocketClient.js +534 -0
- package/dist/cjs/WebsocketClient.js.map +1 -0
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.js +30 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/BaseRestClient.d.ts +66 -0
- package/dist/cjs/lib/BaseRestClient.js +436 -0
- package/dist/cjs/lib/BaseRestClient.js.map +1 -0
- package/dist/cjs/lib/BaseWSClient.d.ts +169 -0
- package/dist/cjs/lib/BaseWSClient.js +638 -0
- package/dist/cjs/lib/BaseWSClient.js.map +1 -0
- package/dist/cjs/lib/jwtNode.d.ts +13 -0
- package/dist/cjs/lib/jwtNode.js +52 -0
- package/dist/cjs/lib/jwtNode.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 +98 -0
- package/dist/cjs/lib/requestUtils.js +75 -0
- package/dist/cjs/lib/requestUtils.js.map +1 -0
- package/dist/cjs/lib/webCryptoAPI.d.ts +10 -0
- package/dist/cjs/lib/webCryptoAPI.js +83 -0
- package/dist/cjs/lib/webCryptoAPI.js.map +1 -0
- package/dist/cjs/lib/websocket/WsStore.d.ts +63 -0
- package/dist/cjs/lib/websocket/WsStore.js +254 -0
- package/dist/cjs/lib/websocket/WsStore.js.map +1 -0
- package/dist/cjs/lib/websocket/WsStore.types.d.ts +49 -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 +6 -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/typeGuards.d.ts +27 -0
- package/dist/cjs/lib/websocket/typeGuards.js +86 -0
- package/dist/cjs/lib/websocket/typeGuards.js.map +1 -0
- package/dist/cjs/lib/websocket/websocket-util.d.ts +120 -0
- package/dist/cjs/lib/websocket/websocket-util.js +173 -0
- package/dist/cjs/lib/websocket/websocket-util.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/types/request/advanced-trade-client.d.ts +194 -0
- package/dist/cjs/types/request/advanced-trade-client.js +18 -0
- package/dist/cjs/types/request/advanced-trade-client.js.map +1 -0
- package/dist/cjs/types/request/coinbase-app-client.d.ts +80 -0
- package/dist/cjs/types/request/coinbase-app-client.js +28 -0
- package/dist/cjs/types/request/coinbase-app-client.js.map +1 -0
- package/dist/cjs/types/request/coinbase-exchange.d.ts +332 -0
- package/dist/cjs/types/request/coinbase-exchange.js +3 -0
- package/dist/cjs/types/request/coinbase-exchange.js.map +1 -0
- package/dist/cjs/types/request/coinbase-international.d.ts +160 -0
- package/dist/cjs/types/request/coinbase-international.js +13 -0
- package/dist/cjs/types/request/coinbase-international.js.map +1 -0
- package/dist/cjs/types/request/coinbase-prime.d.ts +298 -0
- package/dist/cjs/types/request/coinbase-prime.js +8 -0
- package/dist/cjs/types/request/coinbase-prime.js.map +1 -0
- package/dist/cjs/types/response/advanced-trade-client.d.ts +759 -0
- package/dist/cjs/types/response/advanced-trade-client.js +8 -0
- package/dist/cjs/types/response/advanced-trade-client.js.map +1 -0
- package/dist/cjs/types/response/coinbase-app-client.d.ts +168 -0
- package/dist/cjs/types/response/coinbase-app-client.js +18 -0
- package/dist/cjs/types/response/coinbase-app-client.js.map +1 -0
- package/dist/cjs/types/response/coinbase-exchange.d.ts +80 -0
- package/dist/cjs/types/response/coinbase-exchange.js +82 -0
- package/dist/cjs/types/response/coinbase-exchange.js.map +1 -0
- package/dist/cjs/types/response/coinbase-international.d.ts +40 -0
- package/dist/cjs/types/response/coinbase-international.js +42 -0
- package/dist/cjs/types/response/coinbase-international.js.map +1 -0
- package/dist/cjs/types/response/coinbase-prime.d.ts +70 -0
- package/dist/cjs/types/response/coinbase-prime.js +72 -0
- package/dist/cjs/types/response/coinbase-prime.js.map +1 -0
- package/dist/cjs/types/response/ws.d.ts +7 -0
- package/dist/cjs/types/response/ws.js +3 -0
- package/dist/cjs/types/response/ws.js.map +1 -0
- package/dist/cjs/types/shared.types.d.ts +60 -0
- package/dist/cjs/types/shared.types.js +3 -0
- package/dist/cjs/types/shared.types.js.map +1 -0
- package/dist/cjs/types/websockets/client.d.ts +73 -0
- package/dist/cjs/types/websockets/client.js +3 -0
- package/dist/cjs/types/websockets/client.js.map +1 -0
- package/dist/cjs/types/websockets/events.d.ts +40 -0
- package/dist/cjs/types/websockets/events.js +3 -0
- package/dist/cjs/types/websockets/events.js.map +1 -0
- package/dist/cjs/types/websockets/requests.d.ts +76 -0
- package/dist/cjs/types/websockets/requests.js +3 -0
- package/dist/cjs/types/websockets/requests.js.map +1 -0
- package/dist/cjs/types/websockets/wsAPI.d.ts +9 -0
- package/dist/cjs/types/websockets/wsAPI.js +3 -0
- package/dist/cjs/types/websockets/wsAPI.js.map +1 -0
- package/dist/mjs/CBAdvancedTradeClient.d.ts +559 -0
- package/dist/mjs/CBAdvancedTradeClient.js +570 -0
- package/dist/mjs/CBAdvancedTradeClient.js.map +1 -0
- package/dist/mjs/CBAppClient.d.ts +359 -0
- package/dist/mjs/CBAppClient.js +332 -0
- package/dist/mjs/CBAppClient.js.map +1 -0
- package/dist/mjs/CBCommerceClient.d.ts +110 -0
- package/dist/mjs/CBCommerceClient.js +101 -0
- package/dist/mjs/CBCommerceClient.js.map +1 -0
- package/dist/mjs/CBExchangeClient.d.ts +640 -0
- package/dist/mjs/CBExchangeClient.js +747 -0
- package/dist/mjs/CBExchangeClient.js.map +1 -0
- package/dist/mjs/CBInternationalClient.d.ts +381 -0
- package/dist/mjs/CBInternationalClient.js +433 -0
- package/dist/mjs/CBInternationalClient.js.map +1 -0
- package/dist/mjs/CBPrimeClient.d.ts +363 -0
- package/dist/mjs/CBPrimeClient.js +447 -0
- package/dist/mjs/CBPrimeClient.js.map +1 -0
- package/dist/mjs/WebsocketClient.d.ts +78 -0
- package/dist/mjs/WebsocketClient.js +530 -0
- package/dist/mjs/WebsocketClient.js.map +1 -0
- package/dist/mjs/index.d.ts +13 -0
- package/dist/mjs/index.js +14 -0
- package/dist/mjs/index.js.map +1 -0
- package/dist/mjs/lib/BaseRestClient.d.ts +66 -0
- package/dist/mjs/lib/BaseRestClient.js +429 -0
- package/dist/mjs/lib/BaseRestClient.js.map +1 -0
- package/dist/mjs/lib/BaseWSClient.d.ts +169 -0
- package/dist/mjs/lib/BaseWSClient.js +631 -0
- package/dist/mjs/lib/BaseWSClient.js.map +1 -0
- package/dist/mjs/lib/jwtNode.d.ts +13 -0
- package/dist/mjs/lib/jwtNode.js +45 -0
- package/dist/mjs/lib/jwtNode.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 +98 -0
- package/dist/mjs/lib/requestUtils.js +69 -0
- package/dist/mjs/lib/requestUtils.js.map +1 -0
- package/dist/mjs/lib/webCryptoAPI.d.ts +10 -0
- package/dist/mjs/lib/webCryptoAPI.js +79 -0
- package/dist/mjs/lib/webCryptoAPI.js.map +1 -0
- package/dist/mjs/lib/websocket/WsStore.d.ts +63 -0
- package/dist/mjs/lib/websocket/WsStore.js +249 -0
- package/dist/mjs/lib/websocket/WsStore.js.map +1 -0
- package/dist/mjs/lib/websocket/WsStore.types.d.ts +49 -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 +6 -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/typeGuards.d.ts +27 -0
- package/dist/mjs/lib/websocket/typeGuards.js +78 -0
- package/dist/mjs/lib/websocket/typeGuards.js.map +1 -0
- package/dist/mjs/lib/websocket/websocket-util.d.ts +120 -0
- package/dist/mjs/lib/websocket/websocket-util.js +164 -0
- package/dist/mjs/lib/websocket/websocket-util.js.map +1 -0
- package/dist/mjs/package.json +3 -0
- package/dist/mjs/types/request/advanced-trade-client.d.ts +194 -0
- package/dist/mjs/types/request/advanced-trade-client.js +17 -0
- package/dist/mjs/types/request/advanced-trade-client.js.map +1 -0
- package/dist/mjs/types/request/coinbase-app-client.d.ts +80 -0
- package/dist/mjs/types/request/coinbase-app-client.js +27 -0
- package/dist/mjs/types/request/coinbase-app-client.js.map +1 -0
- package/dist/mjs/types/request/coinbase-exchange.d.ts +332 -0
- package/dist/mjs/types/request/coinbase-exchange.js +2 -0
- package/dist/mjs/types/request/coinbase-exchange.js.map +1 -0
- package/dist/mjs/types/request/coinbase-international.d.ts +160 -0
- package/dist/mjs/types/request/coinbase-international.js +12 -0
- package/dist/mjs/types/request/coinbase-international.js.map +1 -0
- package/dist/mjs/types/request/coinbase-prime.d.ts +298 -0
- package/dist/mjs/types/request/coinbase-prime.js +7 -0
- package/dist/mjs/types/request/coinbase-prime.js.map +1 -0
- package/dist/mjs/types/response/advanced-trade-client.d.ts +759 -0
- package/dist/mjs/types/response/advanced-trade-client.js +7 -0
- package/dist/mjs/types/response/advanced-trade-client.js.map +1 -0
- package/dist/mjs/types/response/coinbase-app-client.d.ts +168 -0
- package/dist/mjs/types/response/coinbase-app-client.js +17 -0
- package/dist/mjs/types/response/coinbase-app-client.js.map +1 -0
- package/dist/mjs/types/response/coinbase-exchange.d.ts +80 -0
- package/dist/mjs/types/response/coinbase-exchange.js +82 -0
- package/dist/mjs/types/response/coinbase-exchange.js.map +1 -0
- package/dist/mjs/types/response/coinbase-international.d.ts +40 -0
- package/dist/mjs/types/response/coinbase-international.js +42 -0
- package/dist/mjs/types/response/coinbase-international.js.map +1 -0
- package/dist/mjs/types/response/coinbase-prime.d.ts +70 -0
- package/dist/mjs/types/response/coinbase-prime.js +72 -0
- package/dist/mjs/types/response/coinbase-prime.js.map +1 -0
- package/dist/mjs/types/response/ws.d.ts +7 -0
- package/dist/mjs/types/response/ws.js +2 -0
- package/dist/mjs/types/response/ws.js.map +1 -0
- package/dist/mjs/types/shared.types.d.ts +60 -0
- package/dist/mjs/types/shared.types.js +2 -0
- package/dist/mjs/types/shared.types.js.map +1 -0
- package/dist/mjs/types/websockets/client.d.ts +73 -0
- package/dist/mjs/types/websockets/client.js +2 -0
- package/dist/mjs/types/websockets/client.js.map +1 -0
- package/dist/mjs/types/websockets/events.d.ts +40 -0
- package/dist/mjs/types/websockets/events.js +2 -0
- package/dist/mjs/types/websockets/events.js.map +1 -0
- package/dist/mjs/types/websockets/requests.d.ts +76 -0
- package/dist/mjs/types/websockets/requests.js +2 -0
- package/dist/mjs/types/websockets/requests.js.map +1 -0
- package/dist/mjs/types/websockets/wsAPI.d.ts +9 -0
- package/dist/mjs/types/websockets/wsAPI.js +2 -0
- package/dist/mjs/types/websockets/wsAPI.js.map +1 -0
- package/package.json +42 -30
- package/index.js +0 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -16
- package/lib/index.js.map +0 -1
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
import { BaseWebsocketClient } from './lib/BaseWSClient.js';
|
|
2
|
+
import { signWSJWT } from './lib/jwtNode.js';
|
|
3
|
+
import { neverGuard } from './lib/misc-util.js';
|
|
4
|
+
import { isCBAdvancedTradeErrorEvent, isCBAdvancedTradeWSEvent, isCBExchangeWSEvent, isCBExchangeWSRequestOperation, isCBINTXWSRequestOperation, isCBPrimeWSRequestOperation, } from './lib/websocket/typeGuards.js';
|
|
5
|
+
import { getCBExchangeWSSign, getCBInternationalWSSign, getCBPrimeWSSign, getMergedCBExchangeWSRequestOperations, WS_KEY_MAP, WS_URL_MAP, } from './lib/websocket/websocket-util.js';
|
|
6
|
+
export const WS_LOGGER_CATEGORY = { category: 'coinbase-ws' };
|
|
7
|
+
/**
|
|
8
|
+
* Any WS keys in this list will trigger automatic auth as required, if credentials are available
|
|
9
|
+
*/
|
|
10
|
+
const PRIVATE_WS_KEYS = [
|
|
11
|
+
// Account data (fills), requires auth.
|
|
12
|
+
WS_KEY_MAP.advTradeUserData,
|
|
13
|
+
// Coinbase Direct Market Data has direct access to Coinbase Exchange servers and requires auth.
|
|
14
|
+
WS_KEY_MAP.exchangeDirectMarketData,
|
|
15
|
+
// The INTX feed always requires auth.
|
|
16
|
+
WS_KEY_MAP.internationalMarketData,
|
|
17
|
+
// The Prime feed always requires auth.
|
|
18
|
+
WS_KEY_MAP.primeMarketData,
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Any WS keys in this list will ALWAYS skip the authentication process, even if credentials are available
|
|
22
|
+
*/
|
|
23
|
+
export const PUBLIC_WS_KEYS = [
|
|
24
|
+
WS_KEY_MAP.advTradeMarketData,
|
|
25
|
+
WS_KEY_MAP.exchangeMarketData,
|
|
26
|
+
];
|
|
27
|
+
export class WebsocketClient extends BaseWebsocketClient {
|
|
28
|
+
/**
|
|
29
|
+
* Request connection of all dependent (public & private) websockets, instead of waiting for automatic connection by library
|
|
30
|
+
*/
|
|
31
|
+
connectAll() {
|
|
32
|
+
return Promise.all([
|
|
33
|
+
this.connect(WS_KEY_MAP.advTradeMarketData),
|
|
34
|
+
this.connect(WS_KEY_MAP.advTradeUserData),
|
|
35
|
+
this.connect(WS_KEY_MAP.exchangeMarketData),
|
|
36
|
+
this.connect(WS_KEY_MAP.exchangeDirectMarketData),
|
|
37
|
+
this.connect(WS_KEY_MAP.internationalMarketData),
|
|
38
|
+
this.connect(WS_KEY_MAP.primeMarketData),
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Request subscription to one or more topics. Pass topics as either an array of strings, or array of objects (if the topic has parameters).
|
|
43
|
+
* Objects should be formatted as {topic: string, params: object}.
|
|
44
|
+
*
|
|
45
|
+
* - Subscriptions are automatically routed to the correct websocket connection.
|
|
46
|
+
* - Authentication/connection is automatic.
|
|
47
|
+
* - Resubscribe after network issues is automatic.
|
|
48
|
+
*
|
|
49
|
+
* Call `unsubscribe(topics)` to remove topics
|
|
50
|
+
*/
|
|
51
|
+
subscribe(requests, wsKey) {
|
|
52
|
+
if (!Array.isArray(requests)) {
|
|
53
|
+
this.subscribeTopicsForWsKey([requests], wsKey);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (requests.length) {
|
|
57
|
+
this.subscribeTopicsForWsKey(requests, wsKey);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Unsubscribe from one or more topics. Similar to subscribe() but in reverse.
|
|
62
|
+
*
|
|
63
|
+
* - Requests are automatically routed to the correct websocket connection.
|
|
64
|
+
* - These topics will be removed from the topic cache, so they won't be subscribed to again.
|
|
65
|
+
*/
|
|
66
|
+
unsubscribe(requests, wsKey) {
|
|
67
|
+
if (!Array.isArray(requests)) {
|
|
68
|
+
this.unsubscribeTopicsForWsKey([requests], wsKey);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (requests.length) {
|
|
72
|
+
this.unsubscribeTopicsForWsKey(requests, wsKey);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async sendWSAPIRequest(wsKey, channel, params) {
|
|
76
|
+
this.logger.trace(`sendWSAPIRequest(): assert "${wsKey}" is connected`, {
|
|
77
|
+
channel,
|
|
78
|
+
params,
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
* Internal methods
|
|
85
|
+
*
|
|
86
|
+
*/
|
|
87
|
+
/**
|
|
88
|
+
* Return a websocket URL, which is connected to as-is.
|
|
89
|
+
* If a token or anything else is needed in the URL, this is a good place to add it.
|
|
90
|
+
*/
|
|
91
|
+
async getWsUrl(wsKey) {
|
|
92
|
+
if (this.options.wsUrl) {
|
|
93
|
+
return this.options.wsUrl;
|
|
94
|
+
}
|
|
95
|
+
const useSandbox = this.options.useSandbox;
|
|
96
|
+
const networkKey = useSandbox ? 'testnet' : 'livenet';
|
|
97
|
+
const baseUrl = WS_URL_MAP[wsKey][networkKey];
|
|
98
|
+
return baseUrl;
|
|
99
|
+
}
|
|
100
|
+
sendPingEvent(wsKey) {
|
|
101
|
+
const wsState = this.getWsStore().get(wsKey);
|
|
102
|
+
const ws = wsState?.ws;
|
|
103
|
+
ws?.ping();
|
|
104
|
+
}
|
|
105
|
+
sendPongEvent(wsKey) {
|
|
106
|
+
try {
|
|
107
|
+
this.logger.trace(`Sending upstream ws PONG: `, {
|
|
108
|
+
...WS_LOGGER_CATEGORY,
|
|
109
|
+
wsMessage: 'PONG',
|
|
110
|
+
wsKey,
|
|
111
|
+
});
|
|
112
|
+
if (!wsKey) {
|
|
113
|
+
throw new Error('Cannot send PONG, no wsKey provided');
|
|
114
|
+
}
|
|
115
|
+
const wsState = this.getWsStore().get(wsKey);
|
|
116
|
+
if (!wsState || !wsState?.ws) {
|
|
117
|
+
throw new Error(`Cannot send pong, ${wsKey} socket not connected yet`);
|
|
118
|
+
}
|
|
119
|
+
// Send a protocol layer pong
|
|
120
|
+
wsState.ws.pong();
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
this.logger.error(`Failed to send WS PONG`, {
|
|
124
|
+
...WS_LOGGER_CATEGORY,
|
|
125
|
+
wsMessage: 'PONG',
|
|
126
|
+
wsKey,
|
|
127
|
+
exception: e,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
isWsPing(msg) {
|
|
132
|
+
if (msg?.data === 'ping') {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
isWsPong(msg) {
|
|
138
|
+
if (msg?.data?.includes('pong')) {
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
// this.logger.info(`Not a pong: `, msg);
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
resolveEmittableEvents(wsKey, event) {
|
|
145
|
+
const results = [];
|
|
146
|
+
try {
|
|
147
|
+
const parsed = JSON.parse(event.data);
|
|
148
|
+
const responseEvents = ['subscriptions'];
|
|
149
|
+
// E.g. {"type":"error","message":"rate limit exceeded","wsKey":"advTradeMarketData"}
|
|
150
|
+
if (isCBAdvancedTradeErrorEvent(parsed)) {
|
|
151
|
+
return [{ eventType: 'exception', event: parsed }];
|
|
152
|
+
}
|
|
153
|
+
// Parse Advanced Trade WS events (update & response)
|
|
154
|
+
if (isCBAdvancedTradeWSEvent(parsed)) {
|
|
155
|
+
const eventType = parsed.channel;
|
|
156
|
+
// These are request/reply pattern events (e.g. after subscribing to topics or authenticating)
|
|
157
|
+
if (responseEvents.includes(eventType)) {
|
|
158
|
+
return [
|
|
159
|
+
{
|
|
160
|
+
eventType: 'response',
|
|
161
|
+
event: parsed,
|
|
162
|
+
},
|
|
163
|
+
];
|
|
164
|
+
}
|
|
165
|
+
// Generic data for a channel
|
|
166
|
+
if (typeof eventType === 'string') {
|
|
167
|
+
return [
|
|
168
|
+
{
|
|
169
|
+
eventType: 'update',
|
|
170
|
+
event: parsed,
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Parse CB Exchange WS events
|
|
176
|
+
if (isCBExchangeWSEvent(parsed, wsKey)) {
|
|
177
|
+
const eventType = parsed.type;
|
|
178
|
+
if (responseEvents.includes(eventType)) {
|
|
179
|
+
return [
|
|
180
|
+
{
|
|
181
|
+
eventType: 'response',
|
|
182
|
+
event: parsed,
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
}
|
|
186
|
+
// Generic data for a channel
|
|
187
|
+
if (typeof eventType === 'string') {
|
|
188
|
+
return [
|
|
189
|
+
{
|
|
190
|
+
eventType: 'update',
|
|
191
|
+
event: parsed,
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
this.logger.error(`!! (${wsKey}) Unhandled non-string event type... Defaulting to "update" channel...` +
|
|
197
|
+
JSON.stringify(parsed));
|
|
198
|
+
return [
|
|
199
|
+
{
|
|
200
|
+
eventType: 'update',
|
|
201
|
+
event: parsed,
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
results.push({
|
|
207
|
+
event: {
|
|
208
|
+
message: 'Failed to parse event data due to exception',
|
|
209
|
+
exception: e,
|
|
210
|
+
eventData: event.data,
|
|
211
|
+
},
|
|
212
|
+
eventType: 'exception',
|
|
213
|
+
});
|
|
214
|
+
this.logger.error(`Failed to parse event data due to exception: `, {
|
|
215
|
+
exception: e,
|
|
216
|
+
eventData: event.data,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
return results;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Determines if a topic is for a private channel, using a hardcoded list of strings
|
|
223
|
+
*/
|
|
224
|
+
isPrivateTopicRequest(request, wsKey) {
|
|
225
|
+
return request && PRIVATE_WS_KEYS.includes(wsKey);
|
|
226
|
+
}
|
|
227
|
+
getWsKeyForMarket(market, isPrivate) {
|
|
228
|
+
switch (market) {
|
|
229
|
+
case 'advancedTrade': {
|
|
230
|
+
return isPrivate
|
|
231
|
+
? WS_KEY_MAP.advTradeUserData
|
|
232
|
+
: WS_KEY_MAP.advTradeMarketData;
|
|
233
|
+
}
|
|
234
|
+
case 'exchange': {
|
|
235
|
+
return isPrivate
|
|
236
|
+
? WS_KEY_MAP.exchangeDirectMarketData
|
|
237
|
+
: WS_KEY_MAP.exchangeMarketData;
|
|
238
|
+
}
|
|
239
|
+
case 'international': {
|
|
240
|
+
return isPrivate
|
|
241
|
+
? WS_KEY_MAP.internationalMarketData
|
|
242
|
+
: WS_KEY_MAP.internationalMarketData;
|
|
243
|
+
}
|
|
244
|
+
case 'prime': {
|
|
245
|
+
return isPrivate
|
|
246
|
+
? WS_KEY_MAP.primeMarketData
|
|
247
|
+
: WS_KEY_MAP.primeMarketData;
|
|
248
|
+
}
|
|
249
|
+
default: {
|
|
250
|
+
throw neverGuard(market, `Unhandled "market": "${market}"`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
getWsMarketForWsKey(wsKey) {
|
|
255
|
+
switch (wsKey) {
|
|
256
|
+
case WS_KEY_MAP.advTradeMarketData:
|
|
257
|
+
case WS_KEY_MAP.advTradeUserData: {
|
|
258
|
+
return 'advancedTrade';
|
|
259
|
+
}
|
|
260
|
+
case WS_KEY_MAP.exchangeMarketData:
|
|
261
|
+
case WS_KEY_MAP.exchangeDirectMarketData: {
|
|
262
|
+
return 'exchange';
|
|
263
|
+
}
|
|
264
|
+
case WS_KEY_MAP.internationalMarketData: {
|
|
265
|
+
return 'international';
|
|
266
|
+
}
|
|
267
|
+
case WS_KEY_MAP.primeMarketData: {
|
|
268
|
+
return 'prime';
|
|
269
|
+
}
|
|
270
|
+
default: {
|
|
271
|
+
throw neverGuard(wsKey, `Unhandled WsKey: "${wsKey}"`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
getPrivateWSKeys() {
|
|
276
|
+
return PRIVATE_WS_KEYS;
|
|
277
|
+
}
|
|
278
|
+
/** Force subscription requests to be sent in smaller batches, if a number is returned */
|
|
279
|
+
getMaxTopicsPerSubscribeEvent(wsKey) {
|
|
280
|
+
switch (wsKey) {
|
|
281
|
+
case WS_KEY_MAP.advTradeMarketData:
|
|
282
|
+
case WS_KEY_MAP.advTradeUserData:
|
|
283
|
+
// Technically, INTX supports request batching but not with nested parameters, so we'll send one at a time
|
|
284
|
+
case WS_KEY_MAP.internationalMarketData:
|
|
285
|
+
return 1;
|
|
286
|
+
// Exchange supports request batching, no known limit to max topics per request
|
|
287
|
+
case WS_KEY_MAP.exchangeDirectMarketData:
|
|
288
|
+
case WS_KEY_MAP.exchangeMarketData: {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
default: {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Map one or more topics into fully prepared "subscribe request" events (already stringified and ready to send)
|
|
298
|
+
*/
|
|
299
|
+
async getWsOperationEventsForTopics(topicRequests, wsKey, operation) {
|
|
300
|
+
if (!topicRequests.length) {
|
|
301
|
+
return [];
|
|
302
|
+
}
|
|
303
|
+
const apiKey = this.options.apiKey;
|
|
304
|
+
const apiSecret = this.options.apiSecret;
|
|
305
|
+
const apiPassphrase = this.options.apiPassphrase;
|
|
306
|
+
/**
|
|
307
|
+
* Operations need to be structured in a way that this exchange understands.
|
|
308
|
+
* Parse the internal format into the format expected by the exchange. One request per operation.
|
|
309
|
+
*/
|
|
310
|
+
const operationEvents = topicRequests.map((topicRequest) => {
|
|
311
|
+
switch (wsKey) {
|
|
312
|
+
case WS_KEY_MAP.advTradeMarketData:
|
|
313
|
+
case WS_KEY_MAP.advTradeUserData: {
|
|
314
|
+
const wsRequestEvent = {
|
|
315
|
+
type: operation,
|
|
316
|
+
channel: topicRequest.topic,
|
|
317
|
+
...topicRequest.payload,
|
|
318
|
+
};
|
|
319
|
+
return wsRequestEvent;
|
|
320
|
+
}
|
|
321
|
+
case WS_KEY_MAP.exchangeMarketData:
|
|
322
|
+
case WS_KEY_MAP.exchangeDirectMarketData: {
|
|
323
|
+
const wsRequestEvent = {
|
|
324
|
+
type: operation,
|
|
325
|
+
channels: [
|
|
326
|
+
topicRequest.payload
|
|
327
|
+
? {
|
|
328
|
+
name: topicRequest.topic,
|
|
329
|
+
...topicRequest.payload,
|
|
330
|
+
}
|
|
331
|
+
: topicRequest.topic,
|
|
332
|
+
],
|
|
333
|
+
};
|
|
334
|
+
return wsRequestEvent;
|
|
335
|
+
}
|
|
336
|
+
case WS_KEY_MAP.internationalMarketData: {
|
|
337
|
+
// In case there's ever more operation types than "subscribe" and "unsubscribe"
|
|
338
|
+
if (!['subscribe', 'unsubscribe'].includes(operation)) {
|
|
339
|
+
throw new Error(`Unhandled request operation type for CB International WS: "${operation}"`);
|
|
340
|
+
}
|
|
341
|
+
const wsRequestEvent = {
|
|
342
|
+
type: operation === 'subscribe' ? 'SUBSCRIBE' : 'UNSUBSCRIBE',
|
|
343
|
+
// As of Sep 2024, parameters (such as product_id[]) cannot be nested with the channels array
|
|
344
|
+
channels: [topicRequest.topic],
|
|
345
|
+
// This merges parametrs (such as product_id[]) into the top level request object
|
|
346
|
+
...topicRequest.payload,
|
|
347
|
+
};
|
|
348
|
+
return wsRequestEvent;
|
|
349
|
+
}
|
|
350
|
+
case WS_KEY_MAP.primeMarketData: {
|
|
351
|
+
const wsRequestEvent = {
|
|
352
|
+
type: operation,
|
|
353
|
+
channel: topicRequest.topic,
|
|
354
|
+
...topicRequest.payload,
|
|
355
|
+
};
|
|
356
|
+
return wsRequestEvent;
|
|
357
|
+
}
|
|
358
|
+
default: {
|
|
359
|
+
throw new Error(`Not implemented for "${wsKey}" yet - if you need Prime or INTX, please get in touch.`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
const maxTopicsPerEvent = this.getMaxTopicsPerSubscribeEvent(wsKey);
|
|
364
|
+
const isPrivateChannel = PRIVATE_WS_KEYS.includes(wsKey);
|
|
365
|
+
/**
|
|
366
|
+
* - Merge commands into one if the exchange supports batch requests,
|
|
367
|
+
* - Apply auth/sign, if needed,
|
|
368
|
+
* - Apply any final formatting to return a string array, ready to be sent upstream.
|
|
369
|
+
*/
|
|
370
|
+
switch (wsKey) {
|
|
371
|
+
case WS_KEY_MAP.advTradeMarketData:
|
|
372
|
+
case WS_KEY_MAP.advTradeUserData: {
|
|
373
|
+
// Events that are ready to send (usually stringified JSON)
|
|
374
|
+
// ADV trade only supports sending one at a time, so we don't try to merge them
|
|
375
|
+
// These are already signed, if needed.
|
|
376
|
+
return operationEvents.map((evt) => {
|
|
377
|
+
if (!isPrivateChannel) {
|
|
378
|
+
return JSON.stringify(evt);
|
|
379
|
+
}
|
|
380
|
+
if (!apiKey || !apiSecret) {
|
|
381
|
+
throw new Error(`"options.apiKey" (api key name) and/or "options.apiSecret" missing, unable to generate JWT`);
|
|
382
|
+
}
|
|
383
|
+
const jwtExpiresSeconds = this.options.jwtExpiresSeconds || 120;
|
|
384
|
+
const timestamp = Date.now();
|
|
385
|
+
/**
|
|
386
|
+
* No batching is supported for this product group, so we can already
|
|
387
|
+
* handle sign here and return it as is
|
|
388
|
+
*/
|
|
389
|
+
const sign = signWSJWT({
|
|
390
|
+
algorithm: 'ES256',
|
|
391
|
+
timestampMs: timestamp,
|
|
392
|
+
jwtExpiresSeconds,
|
|
393
|
+
apiPubKey: apiKey,
|
|
394
|
+
apiPrivKey: apiSecret,
|
|
395
|
+
});
|
|
396
|
+
const operationEventWithSign = {
|
|
397
|
+
...evt,
|
|
398
|
+
jwt: sign,
|
|
399
|
+
};
|
|
400
|
+
return JSON.stringify(operationEventWithSign);
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
case WS_KEY_MAP.exchangeMarketData:
|
|
404
|
+
case WS_KEY_MAP.exchangeDirectMarketData: {
|
|
405
|
+
if (!operationEvents.every((evt) => isCBExchangeWSRequestOperation(evt, wsKey))) {
|
|
406
|
+
// Don't expect this to ever happen, but just to please typescript...
|
|
407
|
+
throw new Error(`Unexpected request schema for exchange WS request builder`);
|
|
408
|
+
}
|
|
409
|
+
const mergedOperationEvents = getMergedCBExchangeWSRequestOperations(operationEvents);
|
|
410
|
+
// We're under the max topics per request limit.
|
|
411
|
+
// Send operation requests as one merged request
|
|
412
|
+
if (!maxTopicsPerEvent ||
|
|
413
|
+
mergedOperationEvents.channels.length <= maxTopicsPerEvent) {
|
|
414
|
+
if (!isPrivateChannel) {
|
|
415
|
+
return [JSON.stringify(mergedOperationEvents)];
|
|
416
|
+
}
|
|
417
|
+
if (!apiKey || !apiSecret || !apiPassphrase) {
|
|
418
|
+
throw new Error(`One or more of apiKey, apiSecret and/or apiPassphrase are missing. These must be provided to use private channels.`);
|
|
419
|
+
}
|
|
420
|
+
const { sign, timestampInSeconds } = await getCBExchangeWSSign(apiSecret);
|
|
421
|
+
const mergedOperationEventsWithSign = {
|
|
422
|
+
...mergedOperationEvents,
|
|
423
|
+
signature: sign,
|
|
424
|
+
key: apiKey,
|
|
425
|
+
passphrase: apiPassphrase,
|
|
426
|
+
timestamp: timestampInSeconds,
|
|
427
|
+
};
|
|
428
|
+
return [JSON.stringify(mergedOperationEventsWithSign)];
|
|
429
|
+
}
|
|
430
|
+
// We're over the max topics per request limit. Break into batches.
|
|
431
|
+
const finalOperations = [];
|
|
432
|
+
for (let i = 0; i < mergedOperationEvents.channels.length; i += maxTopicsPerEvent) {
|
|
433
|
+
const batchChannels = mergedOperationEvents.channels.slice(i, i + maxTopicsPerEvent);
|
|
434
|
+
const wsRequestEvent = {
|
|
435
|
+
type: mergedOperationEvents.type,
|
|
436
|
+
channels: [...batchChannels],
|
|
437
|
+
};
|
|
438
|
+
if (isPrivateChannel) {
|
|
439
|
+
if (!apiKey || !apiSecret || !apiPassphrase) {
|
|
440
|
+
throw new Error(`One or more of apiKey, apiSecret and/or apiPassphrase are missing. These must be provided to use private channels.`);
|
|
441
|
+
}
|
|
442
|
+
const { sign, timestampInSeconds } = await getCBExchangeWSSign(apiSecret);
|
|
443
|
+
const wsRequestEventWithSign = {
|
|
444
|
+
...wsRequestEvent,
|
|
445
|
+
signature: sign,
|
|
446
|
+
key: apiKey,
|
|
447
|
+
passphrase: apiPassphrase,
|
|
448
|
+
timestamp: timestampInSeconds,
|
|
449
|
+
};
|
|
450
|
+
finalOperations.push(JSON.stringify(wsRequestEventWithSign));
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
finalOperations.push(JSON.stringify(wsRequestEvent));
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return finalOperations;
|
|
457
|
+
}
|
|
458
|
+
case WS_KEY_MAP.internationalMarketData: {
|
|
459
|
+
if (!operationEvents.every((evt) => isCBINTXWSRequestOperation(evt, wsKey))) {
|
|
460
|
+
// Don't expect this to ever happen, but just to please typescript...
|
|
461
|
+
throw new Error(`Unexpected request schema for exchange WS request builder`);
|
|
462
|
+
}
|
|
463
|
+
// We're over the max topics per request limit. Break into batches.
|
|
464
|
+
const finalOperations = [];
|
|
465
|
+
for (const operationEvent of operationEvents) {
|
|
466
|
+
if (!apiKey || !apiSecret || !apiPassphrase) {
|
|
467
|
+
throw new Error(`One or more of apiKey, apiSecret and/or apiPassphrase are missing. These must be provided to use private channels.`);
|
|
468
|
+
}
|
|
469
|
+
const { sign, timestampInSeconds } = await getCBInternationalWSSign(apiKey, apiSecret, apiPassphrase);
|
|
470
|
+
const wsRequestEventWithSign = {
|
|
471
|
+
...operationEvent,
|
|
472
|
+
time: timestampInSeconds,
|
|
473
|
+
key: apiKey,
|
|
474
|
+
passphrase: apiPassphrase,
|
|
475
|
+
signature: sign,
|
|
476
|
+
};
|
|
477
|
+
finalOperations.push(JSON.stringify(wsRequestEventWithSign));
|
|
478
|
+
}
|
|
479
|
+
// throw new Error(
|
|
480
|
+
// 'CB INTX is not fully implemented yet - awaiting test environment... if you need this, please get in touch.',
|
|
481
|
+
// );
|
|
482
|
+
return finalOperations;
|
|
483
|
+
}
|
|
484
|
+
case WS_KEY_MAP.primeMarketData: {
|
|
485
|
+
if (!operationEvents.every((evt) => isCBPrimeWSRequestOperation(evt, wsKey))) {
|
|
486
|
+
// Don't expect this to ever happen, but just to please typescript...
|
|
487
|
+
throw new Error(`Unexpected request schema for exchange WS request builder`);
|
|
488
|
+
}
|
|
489
|
+
if (!apiKey || !apiSecret || !apiPassphrase) {
|
|
490
|
+
throw new Error(`One or more of apiKey, apiSecret and/or apiPassphrase are missing. These must be provided to use private channels.`);
|
|
491
|
+
}
|
|
492
|
+
const finalOperations = [];
|
|
493
|
+
for (const operationEvent of operationEvents) {
|
|
494
|
+
const { sign, timestampInSeconds } = await getCBPrimeWSSign({
|
|
495
|
+
channelName: operationEvent.channel,
|
|
496
|
+
svcAccountId: operationEvent.svcAccountId,
|
|
497
|
+
portfolioId: operationEvent.portfolio_id,
|
|
498
|
+
apiKey,
|
|
499
|
+
apiSecret,
|
|
500
|
+
product_ids: operationEvent.product_ids,
|
|
501
|
+
});
|
|
502
|
+
const wsRequestEventWithSign = {
|
|
503
|
+
...operationEvent,
|
|
504
|
+
api_key_id: apiKey,
|
|
505
|
+
access_key: apiSecret,
|
|
506
|
+
passphrase: apiPassphrase,
|
|
507
|
+
signature: sign,
|
|
508
|
+
timestamp: timestampInSeconds,
|
|
509
|
+
};
|
|
510
|
+
finalOperations.push(JSON.stringify(wsRequestEventWithSign));
|
|
511
|
+
}
|
|
512
|
+
// throw new Error(
|
|
513
|
+
// 'CB Prime is not fully implemented yet - awaiting test environment... if you need this, please get in touch.',
|
|
514
|
+
// );
|
|
515
|
+
return finalOperations;
|
|
516
|
+
}
|
|
517
|
+
default: {
|
|
518
|
+
throw neverGuard(wsKey, `Not implemented for "${wsKey}" yet`);
|
|
519
|
+
// throw new Error(`Not implemented for "${wsKey}" yet`);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Events are signed per-request, so this function isn't needed for Coinbase.
|
|
525
|
+
*/
|
|
526
|
+
async getWsAuthRequestEvent(wsKey) {
|
|
527
|
+
return { wsKey };
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=WebsocketClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebsocketClient.js","sourceRoot":"","sources":["../../src/WebsocketClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './CBAdvancedTradeClient.js';
|
|
2
|
+
export * from './CBAppClient.js';
|
|
3
|
+
export * from './CBCommerceClient.js';
|
|
4
|
+
export * from './CBExchangeClient.js';
|
|
5
|
+
export * from './CBInternationalClient.js';
|
|
6
|
+
export * from './CBPrimeClient.js';
|
|
7
|
+
export * from './lib/websocket/logger.js';
|
|
8
|
+
export * from './lib/websocket/websocket-util.js';
|
|
9
|
+
export * from './types/request/advanced-trade-client.js';
|
|
10
|
+
export * from './types/websockets/client.js';
|
|
11
|
+
export * from './types/websockets/events.js';
|
|
12
|
+
export * from './types/websockets/requests.js';
|
|
13
|
+
export * from './WebsocketClient.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from './CBAdvancedTradeClient.js';
|
|
2
|
+
export * from './CBAppClient.js';
|
|
3
|
+
export * from './CBCommerceClient.js';
|
|
4
|
+
export * from './CBExchangeClient.js';
|
|
5
|
+
export * from './CBInternationalClient.js';
|
|
6
|
+
export * from './CBPrimeClient.js';
|
|
7
|
+
export * from './lib/websocket/logger.js';
|
|
8
|
+
export * from './lib/websocket/websocket-util.js';
|
|
9
|
+
export * from './types/request/advanced-trade-client.js';
|
|
10
|
+
export * from './types/websockets/client.js';
|
|
11
|
+
export * from './types/websockets/events.js';
|
|
12
|
+
export * from './types/websockets/requests.js';
|
|
13
|
+
export * from './WebsocketClient.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from 'axios';
|
|
2
|
+
import { CloseAdvTradePositionRequest, SubmitAdvTradeOrderRequest } from '../types/request/advanced-trade-client.js';
|
|
3
|
+
import { SubmitCBExchOrderRequest } from '../types/request/coinbase-exchange.js';
|
|
4
|
+
import { SubmitINTXOrderRequest } from '../types/request/coinbase-international.js';
|
|
5
|
+
import { SubmitPrimeOrderRequest } from '../types/request/coinbase-prime.js';
|
|
6
|
+
import { CustomOrderIdProperty } from '../types/shared.types.js';
|
|
7
|
+
import { RestClientOptions, RestClientType } from './requestUtils.js';
|
|
8
|
+
/**
|
|
9
|
+
* Some requests require some params to be in the query string, some in the body, some even in the headers.
|
|
10
|
+
* This type anticipates either are possible in any combination.
|
|
11
|
+
*
|
|
12
|
+
* The request builder will automatically handle where parameters should go.
|
|
13
|
+
*/
|
|
14
|
+
type ParamsInRequest = {
|
|
15
|
+
query?: object;
|
|
16
|
+
body?: object;
|
|
17
|
+
headers?: object;
|
|
18
|
+
};
|
|
19
|
+
export declare abstract class BaseRestClient {
|
|
20
|
+
private options;
|
|
21
|
+
private baseUrl;
|
|
22
|
+
private globalRequestOptions;
|
|
23
|
+
private apiKey;
|
|
24
|
+
private apiSecret;
|
|
25
|
+
private apiPassphrase;
|
|
26
|
+
/** Defines the client type (affecting how requests & signatures behave) */
|
|
27
|
+
abstract getClientType(): RestClientType;
|
|
28
|
+
/**
|
|
29
|
+
* Create an instance of the REST client. Pass API credentials in the object in the first parameter.
|
|
30
|
+
* @param {RestClientOptions} [restClientOptions={}] options to configure REST API connectivity
|
|
31
|
+
* @param {AxiosRequestConfig} [networkOptions={}] HTTP networking options for axios
|
|
32
|
+
*/
|
|
33
|
+
constructor(restClientOptions?: RestClientOptions, networkOptions?: AxiosRequestConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Timestamp used to sign the request. Override this method to implement your own timestamp/sync mechanism
|
|
36
|
+
*/
|
|
37
|
+
getSignTimestampMs(): number;
|
|
38
|
+
get(endpoint: string, params?: object): Promise<any>;
|
|
39
|
+
post(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
40
|
+
getPrivate(endpoint: string, params?: object): Promise<any>;
|
|
41
|
+
postPrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
42
|
+
deletePrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
43
|
+
putPrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
44
|
+
patchPrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
45
|
+
/**
|
|
46
|
+
* @private Make a HTTP request to a specific endpoint. Private endpoint API calls are automatically signed.
|
|
47
|
+
*/
|
|
48
|
+
private _call;
|
|
49
|
+
generateNewOrderId(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Validate syntax meets requirements set by coinbase. Log warning if not.
|
|
52
|
+
*/
|
|
53
|
+
protected validateOrderId(params: SubmitAdvTradeOrderRequest | CloseAdvTradePositionRequest | SubmitCBExchOrderRequest | SubmitINTXOrderRequest | SubmitPrimeOrderRequest, orderIdProperty: CustomOrderIdProperty): void;
|
|
54
|
+
/**
|
|
55
|
+
* @private generic handler to parse request exceptions
|
|
56
|
+
*/
|
|
57
|
+
parseException(e: any, requestParams: any): unknown;
|
|
58
|
+
/**
|
|
59
|
+
* @private sign request and set recv window
|
|
60
|
+
*/
|
|
61
|
+
private signRequest;
|
|
62
|
+
private prepareSignParams;
|
|
63
|
+
/** Returns an axios request object. Handles signing process automatically if this is a private API call */
|
|
64
|
+
private buildRequest;
|
|
65
|
+
}
|
|
66
|
+
export {};
|