tardis-dev 13.27.2 → 13.28.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.
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KucoinFuturesDerivativeTickerMapper = exports.KucoinFuturesBookTickerMapper = exports.KucoinFuturesBookChangeMapper = exports.KucoinFuturesTradesMapper = void 0;
4
+ const debug_1 = require("../debug");
5
+ const handy_1 = require("../handy");
6
+ const mapper_1 = require("./mapper");
7
+ class KucoinFuturesTradesMapper {
8
+ canHandle(message) {
9
+ return message.type === 'message' && message.topic.startsWith('/contractMarket/execution');
10
+ }
11
+ getFilters(symbols) {
12
+ symbols = (0, handy_1.upperCaseSymbols)(symbols);
13
+ return [
14
+ {
15
+ channel: 'contractMarket/execution',
16
+ symbols
17
+ }
18
+ ];
19
+ }
20
+ *map(message, localTimestamp) {
21
+ const kucoinTrade = message.data;
22
+ const timestamp = new Date(kucoinTrade.ts / 1000000);
23
+ yield {
24
+ type: 'trade',
25
+ symbol: kucoinTrade.symbol,
26
+ exchange: 'kucoin-futures',
27
+ id: kucoinTrade.tradeId,
28
+ price: Number(kucoinTrade.price),
29
+ amount: Number(kucoinTrade.size),
30
+ side: kucoinTrade.side === 'sell' ? 'sell' : 'buy',
31
+ timestamp,
32
+ localTimestamp
33
+ };
34
+ }
35
+ }
36
+ exports.KucoinFuturesTradesMapper = KucoinFuturesTradesMapper;
37
+ class KucoinFuturesBookChangeMapper {
38
+ constructor(ignoreBookSnapshotOverlapError) {
39
+ this.ignoreBookSnapshotOverlapError = ignoreBookSnapshotOverlapError;
40
+ this.symbolToDepthInfoMapping = {};
41
+ }
42
+ canHandle(message) {
43
+ return message.type === 'message' && message.topic.startsWith('/contractMarket/level2');
44
+ }
45
+ getFilters(symbols) {
46
+ symbols = (0, handy_1.upperCaseSymbols)(symbols);
47
+ return [
48
+ {
49
+ channel: 'contractMarket/level2',
50
+ symbols
51
+ },
52
+ {
53
+ channel: 'contractMarket/level2Snapshot',
54
+ symbols
55
+ }
56
+ ];
57
+ }
58
+ *map(message, localTimestamp) {
59
+ const symbol = message.topic.split(':')[1];
60
+ if (this.symbolToDepthInfoMapping[symbol] === undefined) {
61
+ this.symbolToDepthInfoMapping[symbol] = {
62
+ bufferedUpdates: new handy_1.CircularBuffer(2000)
63
+ };
64
+ }
65
+ const symbolDepthInfo = this.symbolToDepthInfoMapping[symbol];
66
+ const snapshotAlreadyProcessed = symbolDepthInfo.snapshotProcessed;
67
+ // first check if received message is snapshot and process it as such if it is
68
+ if (message.subject === 'level2Snapshot') {
69
+ // if we've already received 'manual' snapshot, ignore if there is another one
70
+ if (snapshotAlreadyProcessed) {
71
+ return;
72
+ }
73
+ // produce snapshot book_change
74
+ const kucoinSnapshotData = message.data;
75
+ if (!message.data) {
76
+ return;
77
+ }
78
+ if (!kucoinSnapshotData.asks) {
79
+ kucoinSnapshotData.asks = [];
80
+ }
81
+ if (!kucoinSnapshotData.bids) {
82
+ kucoinSnapshotData.bids = [];
83
+ }
84
+ // mark given symbol depth info that has snapshot processed
85
+ symbolDepthInfo.lastUpdateId = Number(kucoinSnapshotData.sequence);
86
+ symbolDepthInfo.snapshotProcessed = true;
87
+ // if there were any depth updates buffered, let's process those by adding to or updating the initial snapshot
88
+ for (const update of symbolDepthInfo.bufferedUpdates.items()) {
89
+ const bookChange = this.mapBookDepthUpdate(update, localTimestamp);
90
+ if (bookChange !== undefined) {
91
+ const mappedChange = this.mapChange(update.data.change);
92
+ if (mappedChange.price == 0) {
93
+ continue;
94
+ }
95
+ const matchingSide = mappedChange.isBid ? kucoinSnapshotData.bids : kucoinSnapshotData.asks;
96
+ const matchingLevel = matchingSide.find((b) => b[0] === mappedChange.price);
97
+ if (matchingLevel !== undefined) {
98
+ // remove empty level from snapshot
99
+ if (mappedChange.amount === 0) {
100
+ const index = matchingSide.findIndex((b) => b[0] === mappedChange.price);
101
+ if (index > -1) {
102
+ matchingSide.splice(index, 1);
103
+ }
104
+ }
105
+ else {
106
+ matchingLevel[1] = mappedChange.amount;
107
+ }
108
+ }
109
+ else if (mappedChange.amount != 0) {
110
+ matchingSide.push([mappedChange.price, mappedChange.amount]);
111
+ }
112
+ }
113
+ }
114
+ // remove all buffered updates
115
+ symbolDepthInfo.bufferedUpdates.clear();
116
+ const bookChange = {
117
+ type: 'book_change',
118
+ symbol,
119
+ exchange: 'kucoin-futures',
120
+ isSnapshot: true,
121
+ bids: kucoinSnapshotData.bids.map(this.mapBookLevel),
122
+ asks: kucoinSnapshotData.asks.map(this.mapBookLevel),
123
+ timestamp: localTimestamp,
124
+ localTimestamp
125
+ };
126
+ yield bookChange;
127
+ }
128
+ else if (snapshotAlreadyProcessed) {
129
+ // snapshot was already processed let's map the message as normal book_change
130
+ const bookChange = this.mapBookDepthUpdate(message, localTimestamp);
131
+ if (bookChange !== undefined) {
132
+ yield bookChange;
133
+ }
134
+ }
135
+ else {
136
+ symbolDepthInfo.bufferedUpdates.append(message);
137
+ }
138
+ }
139
+ mapBookDepthUpdate(l2UpdateMessage, localTimestamp) {
140
+ // we can safely assume here that depthContext and lastUpdateId aren't null here as this is method only works
141
+ // when we've already processed the snapshot
142
+ const symbol = l2UpdateMessage.topic.split(':')[1];
143
+ const depthContext = this.symbolToDepthInfoMapping[symbol];
144
+ const lastUpdateId = depthContext.lastUpdateId;
145
+ // Drop any event where sequence is <= lastUpdateId in the snapshot
146
+ if (l2UpdateMessage.data.sequence <= lastUpdateId) {
147
+ return;
148
+ }
149
+ // The first processed event should have sequence>lastUpdateId
150
+ if (!depthContext.validatedFirstUpdate) {
151
+ // if there is new instrument added it can have empty book at first and that's normal
152
+ const bookSnapshotIsEmpty = lastUpdateId == -1 || lastUpdateId == 0;
153
+ if (l2UpdateMessage.data.sequence === lastUpdateId + 1 || bookSnapshotIsEmpty) {
154
+ depthContext.validatedFirstUpdate = true;
155
+ }
156
+ else {
157
+ const message = `Book depth snapshot has no overlap with first update, update ${JSON.stringify(l2UpdateMessage)}, lastUpdateId: ${lastUpdateId}, exchange kucoin-futures`;
158
+ if (this.ignoreBookSnapshotOverlapError) {
159
+ depthContext.validatedFirstUpdate = true;
160
+ (0, debug_1.debug)(message);
161
+ }
162
+ else {
163
+ throw new Error(message);
164
+ }
165
+ }
166
+ }
167
+ const change = this.mapChange(l2UpdateMessage.data.change);
168
+ return {
169
+ type: 'book_change',
170
+ symbol: symbol,
171
+ exchange: 'kucoin-futures',
172
+ isSnapshot: false,
173
+ bids: change.isBid
174
+ ? [
175
+ {
176
+ price: change.price,
177
+ amount: change.amount
178
+ }
179
+ ]
180
+ : [],
181
+ asks: change.isBid === false
182
+ ? [
183
+ {
184
+ price: change.price,
185
+ amount: change.amount
186
+ }
187
+ ]
188
+ : [],
189
+ timestamp: new Date(l2UpdateMessage.data.timestamp),
190
+ localTimestamp: localTimestamp
191
+ };
192
+ }
193
+ mapBookLevel(level) {
194
+ return { price: level[0], amount: level[1] };
195
+ }
196
+ mapChange(change) {
197
+ const parts = change.split(',');
198
+ const isBid = parts[1] === 'buy';
199
+ const price = Number(parts[0]);
200
+ const amount = Number(parts[2]);
201
+ return { isBid, price, amount };
202
+ }
203
+ }
204
+ exports.KucoinFuturesBookChangeMapper = KucoinFuturesBookChangeMapper;
205
+ class KucoinFuturesBookTickerMapper {
206
+ canHandle(message) {
207
+ return message.type === 'message' && message.topic.startsWith('/contractMarket/tickerV2');
208
+ }
209
+ getFilters(symbols) {
210
+ symbols = (0, handy_1.upperCaseSymbols)(symbols);
211
+ return [
212
+ {
213
+ channel: 'contractMarket/tickerV2',
214
+ symbols
215
+ }
216
+ ];
217
+ }
218
+ *map(message, localTimestamp) {
219
+ const symbol = message.topic.split(':')[1];
220
+ const bookTicker = {
221
+ type: 'book_ticker',
222
+ symbol,
223
+ exchange: 'kucoin-futures',
224
+ askAmount: message.data.bestAskSize !== undefined && message.data.bestAskSize !== null ? message.data.bestAskSize : undefined,
225
+ askPrice: message.data.bestAskPrice !== undefined && message.data.bestAskPrice !== null ? Number(message.data.bestAskPrice) : undefined,
226
+ bidPrice: message.data.bestBidPrice !== undefined && message.data.bestBidPrice !== null ? Number(message.data.bestBidPrice) : undefined,
227
+ bidAmount: message.data.bestBidSize !== undefined && message.data.bestBidSize !== null ? message.data.bestBidSize : undefined,
228
+ timestamp: new Date(message.data.ts / 1000000),
229
+ localTimestamp: localTimestamp
230
+ };
231
+ yield bookTicker;
232
+ }
233
+ }
234
+ exports.KucoinFuturesBookTickerMapper = KucoinFuturesBookTickerMapper;
235
+ class KucoinFuturesDerivativeTickerMapper {
236
+ constructor() {
237
+ this.pendingTickerInfoHelper = new mapper_1.PendingTickerInfoHelper();
238
+ this._lastPrices = new Map();
239
+ this._openInterests = new Map();
240
+ }
241
+ canHandle(message) {
242
+ return (message.type === 'message' &&
243
+ (message.topic.startsWith('/contract/instrument') ||
244
+ message.topic.startsWith('/contractMarket/execution') ||
245
+ message.topic.startsWith('/contract/details')));
246
+ }
247
+ getFilters(symbols) {
248
+ symbols = (0, handy_1.upperCaseSymbols)(symbols);
249
+ return [
250
+ {
251
+ channel: 'contract/instrument',
252
+ symbols
253
+ },
254
+ {
255
+ channel: 'contractMarket/execution',
256
+ symbols
257
+ },
258
+ {
259
+ channel: 'contract/details',
260
+ symbols
261
+ }
262
+ ];
263
+ }
264
+ *map(message, localTimestamp) {
265
+ const symbol = message.topic.split(':')[1];
266
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(symbol, 'kucoin-futures');
267
+ if (message.subject === 'match') {
268
+ this._lastPrices.set(symbol, Number(message.data.price));
269
+ return;
270
+ }
271
+ if (message.subject === 'contractDetails') {
272
+ this._openInterests.set(symbol, Number(message.data.openInterest));
273
+ return;
274
+ }
275
+ const lastPrice = this._lastPrices.get(symbol);
276
+ const openInterest = this._openInterests.get(symbol);
277
+ if (message.subject === 'mark.index.price') {
278
+ pendingTickerInfo.updateIndexPrice(message.data.indexPrice);
279
+ pendingTickerInfo.updateMarkPrice(message.data.markPrice);
280
+ }
281
+ if (message.subject === 'funding.rate') {
282
+ pendingTickerInfo.updateTimestamp(new Date(message.data.timestamp));
283
+ pendingTickerInfo.updateFundingRate(message.data.fundingRate);
284
+ }
285
+ if (lastPrice !== undefined) {
286
+ pendingTickerInfo.updateLastPrice(lastPrice);
287
+ }
288
+ if (openInterest !== undefined) {
289
+ pendingTickerInfo.updateOpenInterest(openInterest);
290
+ }
291
+ if (pendingTickerInfo.hasChanged()) {
292
+ yield pendingTickerInfo.getSnapshot(localTimestamp);
293
+ }
294
+ }
295
+ }
296
+ exports.KucoinFuturesDerivativeTickerMapper = KucoinFuturesDerivativeTickerMapper;
297
+ //# sourceMappingURL=kucoinfutures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kucoinfutures.js","sourceRoot":"","sources":["../../src/mappers/kucoinfutures.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AA6B3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAsB7C,cAAc,gBAAgB,CAAA;AA4D9B,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAMvE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EACzB,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,iDAKjC;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,QAEpF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AA6B3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAuB7C,cAAc,gBAAgB,CAAA;AA6D9B,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAMvE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EACzB,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,iDAKjC;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,QAEpF"}
@@ -51,6 +51,7 @@ const woox_1 = require("./woox");
51
51
  const blockchaincom_1 = require("./blockchaincom");
52
52
  const binanceeuropeanoptions_1 = require("./binanceeuropeanoptions");
53
53
  const okexspreads_1 = require("./okexspreads");
54
+ const kucoinfutures_1 = require("./kucoinfutures");
54
55
  __exportStar(require("./realtimefeed"), exports);
55
56
  const realTimeFeedsMap = {
56
57
  bitmex: bitmex_1.BitmexRealTimeFeed,
@@ -105,7 +106,8 @@ const realTimeFeedsMap = {
105
106
  'woo-x': woox_1.WooxRealTimeFeed,
106
107
  'blockchain-com': blockchaincom_1.BlockchainComRealTimeFeed,
107
108
  'binance-european-options': binanceeuropeanoptions_1.BinanceEuropeanOptionsRealTimeFeed,
108
- 'okex-spreads': okexspreads_1.OkexSpreadsRealTimeFeed
109
+ 'okex-spreads': okexspreads_1.OkexSpreadsRealTimeFeed,
110
+ 'kucoin-futures': kucoinfutures_1.KucoinFuturesRealTimeFeed
109
111
  };
110
112
  function getRealTimeFeedFactory(exchange) {
111
113
  if (realTimeFeedsMap[exchange]) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtimefeeds/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtimefeeds/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,uCAMkB;AAClB,6CAAqD;AACrD,yCAAiD;AACjD,yCAAiD;AACjD,qCAA6C;AAC7C,yCAAiD;AACjD,mCAAwG;AACxG,yCAAiD;AACjD,yDAAiE;AACjE,uCAAmD;AACnD,+BAA0D;AAC1D,qCAA6C;AAC7C,qCAA6C;AAC7C,mCAMgB;AAChB,qCAA6C;AAC7C,iCAAsF;AAEtF,qCAA6C;AAC7C,mCAA2C;AAC3C,qCAA6C;AAC7C,mDAA2D;AAC3D,yCAAiD;AACjD,yCAAiD;AACjD,qDAA6D;AAC7D,mCAA2C;AAC3C,yCAAiD;AACjD,iCAAyC;AACzC,mCAA2C;AAC3C,2CAAmD;AACnD,mCAA2C;AAC3C,2CAAmD;AACnD,qCAA6C;AAC7C,2CAAmD;AACnD,iCAAyC;AACzC,mDAA2D;AAC3D,qEAA6E;AAC7E,+CAAuD;AACvD,mDAA2D;AAE3D,iDAA8B;AAE9B,MAAM,gBAAgB,GAElB;IACF,MAAM,EAAE,2BAAkB;IAC1B,OAAO,EAAE,6BAAmB;IAC5B,gBAAgB,EAAE,mCAAyB;IAC3C,YAAY,EAAE,+BAAqB;IACnC,aAAa,EAAE,mCAAsB;IACrC,iBAAiB,EAAE,oCAA0B;IAC7C,kBAAkB,EAAE,qCAA2B;IAC/C,QAAQ,EAAE,+BAAoB;IAC9B,sBAAsB,EAAE,+BAAoB;IAC5C,QAAQ,EAAE,+BAAoB;IAC9B,QAAQ,EAAE,+BAAoB;IAC9B,QAAQ,EAAE,+BAAoB;IAC9B,gBAAgB,EAAE,+CAA4B;IAC9C,OAAO,EAAE,iCAAuB;IAChC,GAAG,EAAE,qBAAe;IACpB,QAAQ,EAAE,uBAAiB;IAC3B,MAAM,EAAE,2BAAkB;IAC1B,MAAM,EAAE,2BAAkB;IAC1B,IAAI,EAAE,uBAAgB;IACtB,cAAc,EAAE,uBAAgB;IAChC,WAAW,EAAE,uBAAgB;IAC7B,cAAc,EAAE,8BAAuB;IACvC,UAAU,EAAE,2BAAmB;IAC/B,eAAe,EAAE,+BAAuB;IACxC,sBAAsB,EAAE,qCAA6B;IACrD,KAAK,EAAE,yBAAiB;IACxB,KAAK,EAAE,6BAAqB;IAC5B,MAAM,EAAE,yBAAkB;IAC1B,MAAM,EAAE,2BAAkB;IAC1B,MAAM,EAAE,2BAAkB;IAC1B,KAAK,EAAE,yBAAiB;IACxB,SAAS,EAAE,2BAAkB;IAC7B,iBAAiB,EAAE,yCAAyB;IAC5C,QAAQ,EAAE,+BAAoB;IAC9B,QAAQ,EAAE,+BAAoB;IAC9B,iBAAiB,EAAE,2CAA0B;IAC7C,KAAK,EAAE,yBAAiB;IACxB,QAAQ,EAAE,+BAAoB;IAC9B,IAAI,EAAE,uBAAgB;IACtB,KAAK,EAAE,yBAAiB;IACxB,YAAY,EAAE,iCAAqB;IACnC,kBAAkB,EAAE,kCAA0B;IAC9C,KAAK,EAAE,yBAAiB;IACxB,YAAY,EAAE,iCAAyB;IACvC,eAAe,EAAE,oCAA4B;IAC7C,YAAY,EAAE,iCAAqB;IACnC,wBAAwB,EAAE,iCAAqB;IAC/C,MAAM,EAAE,2BAAkB;IAC1B,SAAS,EAAE,iCAAqB;IAChC,OAAO,EAAE,uBAAgB;IACzB,gBAAgB,EAAE,yCAAyB;IAC3C,0BAA0B,EAAE,2DAAkC;IAC9D,cAAc,EAAE,qCAAuB;IACvC,gBAAgB,EAAE,yCAAyB;CAC5C,CAAA;AAED,SAAgB,sBAAsB,CAAC,QAAkB;IACvD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;QAC9B,OAAO,gBAAgB,CAAC,QAAQ,CAAE,CAAA;KACnC;IAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAA;AACvD,CAAC;AAND,wDAMC;AAED,SAAgB,kBAAkB,CAChC,QAAkB,EAClB,OAAyB,EACzB,iBAAqC,EACrC,OAAgC;IAEhC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAE5D,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAA;AAC/E,CAAC;AATD,gDASC;AAED,SAAgB,sBAAsB,CAAC,QAAkB,EAAE,YAA0B;IACnF,gBAAgB,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAA;AAC3C,CAAC;AAFD,wDAEC"}
@@ -0,0 +1,26 @@
1
+ /// <reference types="node" />
2
+ import { Writable } from 'stream';
3
+ import { Filter } from '../types';
4
+ import { MultiConnectionRealTimeFeedBase, PoolingClientBase, RealTimeFeedBase } from './realtimefeed';
5
+ export declare class KucoinFuturesRealTimeFeed extends MultiConnectionRealTimeFeedBase {
6
+ private _httpURL;
7
+ protected _getRealTimeFeeds(exchange: string, filters: Filter<string>[], timeoutIntervalMS?: number, onError?: (error: Error) => void): Generator<KucoinFuturesSingleConnectionRealTimeFeed | KucoinFuturesContractDetailsClient, void, unknown>;
8
+ }
9
+ export declare class KucoinFuturesSingleConnectionRealTimeFeed extends RealTimeFeedBase {
10
+ private readonly _httpURL;
11
+ constructor(exchange: string, filters: Filter<string>[], _httpURL: string, timeoutIntervalMS: number | undefined, onError?: (error: Error) => void);
12
+ protected wssURL: string;
13
+ protected getWebSocketUrl(): Promise<string>;
14
+ protected mapToSubscribeMessages(filters: Filter<string>[]): any[];
15
+ protected provideManualSnapshots(filters: Filter<string>[], shouldCancel: () => boolean): Promise<void>;
16
+ protected messageIsError(message: any): boolean;
17
+ protected sendCustomPing: () => void;
18
+ protected messageIsHeartbeat(msg: any): boolean;
19
+ }
20
+ declare class KucoinFuturesContractDetailsClient extends PoolingClientBase {
21
+ private readonly _httpURL;
22
+ constructor(exchange: string, _httpURL: string);
23
+ protected poolDataToStream(outputStream: Writable): Promise<void>;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=kucoinfutures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kucoinfutures.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/kucoinfutures.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAWrG,qBAAa,yBAA0B,SAAQ,+BAA+B;IAC5E,OAAO,CAAC,QAAQ,CAAuC;IAEvD,SAAS,CAAE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;CAYvI;AAED,qBAAa,yCAA0C,SAAQ,gBAAgB;IAI3E,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EACR,QAAQ,EAAE,MAAM,EACjC,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;IAIlC,SAAS,CAAC,MAAM,SAAK;cAEL,eAAe;IAM/B,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE;cAiBlD,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO;IA8B7F,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAI/C,SAAS,CAAC,cAAc,aAKvB;IAED,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG;CAGtC;AAED,cAAM,kCAAmC,SAAQ,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAA3C,QAAQ,EAAE,MAAM,EAAmB,QAAQ,EAAE,MAAM;cAI/C,gBAAgB,CAAC,YAAY,EAAE,QAAQ;CAiBxD"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KucoinFuturesSingleConnectionRealTimeFeed = exports.KucoinFuturesRealTimeFeed = void 0;
4
+ const handy_1 = require("../handy");
5
+ const realtimefeed_1 = require("./realtimefeed");
6
+ const kucoinHttpOptions = {
7
+ timeout: 10 * 1000,
8
+ retry: {
9
+ limit: 10,
10
+ statusCodes: [418, 429, 500, 403],
11
+ maxRetryAfter: 120 * 1000
12
+ }
13
+ };
14
+ class KucoinFuturesRealTimeFeed extends realtimefeed_1.MultiConnectionRealTimeFeedBase {
15
+ constructor() {
16
+ super(...arguments);
17
+ this._httpURL = 'https://api-futures.kucoin.com/api';
18
+ }
19
+ *_getRealTimeFeeds(exchange, filters, timeoutIntervalMS, onError) {
20
+ const wsFilters = filters.filter((f) => f.channel !== 'contract/details');
21
+ if (wsFilters.length > 0) {
22
+ yield new KucoinFuturesSingleConnectionRealTimeFeed(exchange, wsFilters, this._httpURL, timeoutIntervalMS, onError);
23
+ }
24
+ const contractDetailsFilters = filters.filter((f) => f.channel === 'contract/details');
25
+ if (contractDetailsFilters.length > 0) {
26
+ yield new KucoinFuturesContractDetailsClient(exchange, this._httpURL);
27
+ }
28
+ }
29
+ }
30
+ exports.KucoinFuturesRealTimeFeed = KucoinFuturesRealTimeFeed;
31
+ class KucoinFuturesSingleConnectionRealTimeFeed extends realtimefeed_1.RealTimeFeedBase {
32
+ constructor(exchange, filters, _httpURL, timeoutIntervalMS, onError) {
33
+ super(exchange, filters, timeoutIntervalMS, onError);
34
+ this._httpURL = _httpURL;
35
+ this.wssURL = '';
36
+ this.sendCustomPing = () => {
37
+ this.send({
38
+ id: new Date().valueOf().toString(),
39
+ type: 'ping'
40
+ });
41
+ };
42
+ }
43
+ async getWebSocketUrl() {
44
+ const response = (await handy_1.httpClient.post(`${this._httpURL}/v1/bullet-public`, { retry: 3, timeout: 10000 }).json());
45
+ return `${response.data.instanceServers[0].endpoint}?token=${response.data.token}&connectId=${(0, handy_1.getRandomString)()}`;
46
+ }
47
+ mapToSubscribeMessages(filters) {
48
+ return filters
49
+ .filter((f) => f.channel !== 'contractMarket/level2Snapshot')
50
+ .map((filter) => {
51
+ if (!filter.symbols || filter.symbols.length === 0) {
52
+ throw new Error('KucoinFuturesRealTimeFeed requires explicitly specified symbols when subscribing to live feed');
53
+ }
54
+ return {
55
+ id: (0, handy_1.getRandomString)(),
56
+ type: 'subscribe',
57
+ topic: `/${filter.channel}:${filter.symbols.join(',')}`,
58
+ response: true
59
+ };
60
+ });
61
+ }
62
+ async provideManualSnapshots(filters, shouldCancel) {
63
+ const depthSnapshotFilter = filters.find((f) => f.channel === 'contractMarket/level2Snapshot');
64
+ if (!depthSnapshotFilter) {
65
+ return;
66
+ }
67
+ this.debug('requesting manual snapshots for: %s', depthSnapshotFilter.symbols);
68
+ for (let symbol of depthSnapshotFilter.symbols) {
69
+ if (shouldCancel()) {
70
+ return;
71
+ }
72
+ const depthSnapshotResponse = (await handy_1.httpClient
73
+ .get(`${this._httpURL}/v1/level2/snapshot?symbol=${symbol}`, kucoinHttpOptions)
74
+ .json());
75
+ const snapshot = {
76
+ type: 'message',
77
+ generated: true,
78
+ topic: `/contractMarket/level2Snapshot:${symbol}`,
79
+ subject: 'level2Snapshot',
80
+ ...depthSnapshotResponse
81
+ };
82
+ this.manualSnapshotsBuffer.push(snapshot);
83
+ }
84
+ this.debug('requested manual snapshots successfully for: %s ', depthSnapshotFilter.symbols);
85
+ }
86
+ messageIsError(message) {
87
+ return message.type === 'error';
88
+ }
89
+ messageIsHeartbeat(msg) {
90
+ return msg.type === 'pong';
91
+ }
92
+ }
93
+ exports.KucoinFuturesSingleConnectionRealTimeFeed = KucoinFuturesSingleConnectionRealTimeFeed;
94
+ class KucoinFuturesContractDetailsClient extends realtimefeed_1.PoolingClientBase {
95
+ constructor(exchange, _httpURL) {
96
+ super(exchange, 6);
97
+ this._httpURL = _httpURL;
98
+ }
99
+ async poolDataToStream(outputStream) {
100
+ const openInterestResponse = (await handy_1.httpClient.get(`${this._httpURL}/v1/contracts/active`, kucoinHttpOptions).json());
101
+ for (const instrument of openInterestResponse.data) {
102
+ const openInterestMessage = {
103
+ topic: `/contract/details:${instrument.symbol}`,
104
+ type: 'message',
105
+ subject: 'contractDetails',
106
+ generated: true,
107
+ data: instrument
108
+ };
109
+ if (outputStream.writable) {
110
+ outputStream.write(openInterestMessage);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ //# sourceMappingURL=kucoinfutures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kucoinfutures.js","sourceRoot":"","sources":["../../src/realtimefeeds/kucoinfutures.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-dev",
3
- "version": "13.27.2",
3
+ "version": "13.28.1",
4
4
  "engines": {
5
5
  "node": ">=12"
6
6
  },
package/src/consts.ts CHANGED
@@ -49,6 +49,7 @@ export const EXCHANGES = [
49
49
  'crypto-com',
50
50
  'crypto-com-derivatives',
51
51
  'kucoin',
52
+ 'kucoin-futures',
52
53
  'bitnomial',
53
54
  'woo-x',
54
55
  'blockchain-com'
@@ -458,6 +459,16 @@ const BINANCE_EUROPEAN_OPTIONS_CHANNELS = ['trade', 'depth100', 'index', 'markPr
458
459
 
459
460
  const OKEX_SPREADS_CHANNELS = ['sprd-public-trades', 'sprd-bbo-tbt', 'sprd-books5', 'sprd-tickers']
460
461
 
462
+ const KUCOIN_FUTURES_CHANNELS = [
463
+ 'contractMarket/execution',
464
+ 'contractMarket/level2',
465
+ 'contractMarket/level2Snapshot',
466
+ 'contractMarket/tickerV2',
467
+ 'contract/instrument',
468
+ 'contract/details',
469
+ 'contractMarket/snapshot'
470
+ ]
471
+
461
472
  export const EXCHANGE_CHANNELS_INFO = {
462
473
  bitmex: BITMEX_CHANNELS,
463
474
  coinbase: COINBASE_CHANNELS,
@@ -511,5 +522,6 @@ export const EXCHANGE_CHANNELS_INFO = {
511
522
  'woo-x': WOOX_CHANNELS,
512
523
  'blockchain-com': BLOCKCHAIN_COM_CHANNELS,
513
524
  'binance-european-options': BINANCE_EUROPEAN_OPTIONS_CHANNELS,
514
- 'okex-spreads': OKEX_SPREADS_CHANNELS
525
+ 'okex-spreads': OKEX_SPREADS_CHANNELS,
526
+ 'kucoin-futures': KUCOIN_FUTURES_CHANNELS
515
527
  }
@@ -94,6 +94,12 @@ import {
94
94
  } from './huobi'
95
95
  import { krakenBookChangeMapper, krakenBookTickerMapper, krakenTradesMapper } from './kraken'
96
96
  import { KucoinBookChangeMapper, KucoinBookTickerMapper, KucoinTradesMapper } from './kucoin'
97
+ import {
98
+ KucoinFuturesBookChangeMapper,
99
+ KucoinFuturesBookTickerMapper,
100
+ KucoinFuturesDerivativeTickerMapper,
101
+ KucoinFuturesTradesMapper
102
+ } from './kucoinfutures'
97
103
  import { Mapper } from './mapper'
98
104
  import {
99
105
  OkexBookChangeMapper,
@@ -257,6 +263,7 @@ const tradesMappers = {
257
263
  'crypto-com': () => new CryptoComTradesMapper('crypto-com'),
258
264
  'crypto-com-derivatives': () => new CryptoComTradesMapper('crypto-com-derivatives'),
259
265
  kucoin: () => new KucoinTradesMapper('kucoin'),
266
+ 'kucoin-futures': () => new KucoinFuturesTradesMapper(),
260
267
  bitnomial: () => bitnomialTradesMapper,
261
268
  'woo-x': () => wooxTradesMapper,
262
269
  'blockchain-com': () => new BlockchainComTradesMapper(),
@@ -343,6 +350,7 @@ const bookChangeMappers = {
343
350
  'crypto-com': () => new CryptoComBookChangeMapper('crypto-com'),
344
351
  'crypto-com-derivatives': () => new CryptoComBookChangeMapper('crypto-com-derivatives'),
345
352
  kucoin: (localTimestamp: Date) => new KucoinBookChangeMapper('kucoin', isRealTime(localTimestamp) === false),
353
+ 'kucoin-futures': (localTimestamp: Date) => new KucoinFuturesBookChangeMapper(isRealTime(localTimestamp) === false),
346
354
  bitnomial: () => new BitnomialBookChangMapper(),
347
355
  'woo-x': () => new WooxBookChangeMapper(),
348
356
  'blockchain-com': () => new BlockchainComBookChangeMapper(),
@@ -380,7 +388,8 @@ const derivativeTickersMappers = {
380
388
  dydx: () => new DydxDerivativeTickerMapper(),
381
389
  'crypto-com-derivatives': () => new CryptoComDerivativeTickerMapper('crypto-com-derivatives'),
382
390
  'crypto-com': () => new CryptoComDerivativeTickerMapper('crypto-com'),
383
- 'woo-x': () => new WooxDerivativeTickerMapper()
391
+ 'woo-x': () => new WooxDerivativeTickerMapper(),
392
+ 'kucoin-futures': () => new KucoinFuturesDerivativeTickerMapper()
384
393
  }
385
394
 
386
395
  const optionsSummaryMappers = {
@@ -470,7 +479,8 @@ const bookTickersMappers = {
470
479
  delta: () => new DeltaBookTickerMapper(),
471
480
  bybit: () => new BybitV5BookTickerMapper('bybit'),
472
481
  'gate-io': () => new GateIOV4BookTickerMapper('gate-io'),
473
- 'okex-spreads': () => new OkexSpreadsBookTickerMapper()
482
+ 'okex-spreads': () => new OkexSpreadsBookTickerMapper(),
483
+ 'kucoin-futures': () => new KucoinFuturesBookTickerMapper()
474
484
  }
475
485
 
476
486
  export const normalizeTrades = <T extends keyof typeof tradesMappers>(exchange: T, localTimestamp: Date): Mapper<T, Trade> => {