coinbase-api 0.3.2 → 0.5.0

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