tardis-dev 17.0.0 → 17.1.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.
- package/dist/consts.d.ts +1 -1
- package/dist/consts.js +1 -1
- package/dist/consts.js.map +1 -1
- package/dist/mappers/gemini.d.ts +2 -1
- package/dist/mappers/gemini.d.ts.map +1 -1
- package/dist/mappers/gemini.js +82 -5
- package/dist/mappers/gemini.js.map +1 -1
- package/dist/mappers/index.d.ts +1 -1
- package/dist/realtimefeeds/gemini.d.ts +1 -0
- package/dist/realtimefeeds/gemini.d.ts.map +1 -1
- package/dist/realtimefeeds/gemini.js +14 -14
- package/dist/realtimefeeds/gemini.js.map +1 -1
- package/package.json +15 -18
- package/src/consts.ts +1 -1
- package/src/mappers/gemini.ts +132 -8
- package/src/realtimefeeds/gemini.ts +15 -14
package/dist/consts.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export declare const EXCHANGE_CHANNELS_INFO: {
|
|
|
18
18
|
bitfinex: readonly ["trades", "book", "raw_book", "ticker"];
|
|
19
19
|
ftx: readonly ["orderbook", "trades", "instrument", "markets", "orderbookGrouped", "lendingRate", "borrowRate", "borrowSummary", "ticker", "leveragedTokenInfo", "busy"];
|
|
20
20
|
'ftx-us': readonly ["orderbook", "trades", "markets", "orderbookGrouped", "ticker"];
|
|
21
|
-
gemini: readonly ["trade", "l2_updates", "auction_open", "auction_indicative", "auction_result"];
|
|
21
|
+
gemini: readonly ["trade", "l2_updates", "auction_open", "auction_indicative", "auction_result", "depth", "bookTicker"];
|
|
22
22
|
bitflyer: readonly ["lightning_executions", "lightning_board_snapshot", "lightning_board", "lightning_ticker"];
|
|
23
23
|
'binance-futures': readonly ["trade", "aggTrade", "ticker", "depth", "markPrice", "premiumIndex", "indexConstituents", "depthSnapshot", "bookTicker", "forceOrder", "openInterest", "fundingInfo", "insuranceBalance", "recentTrades", "compositeIndex", "topLongShortAccountRatio", "topLongShortPositionRatio", "globalLongShortAccountRatio", "takerlongshortRatio", "!contractInfo", "assetIndex"];
|
|
24
24
|
'binance-delivery': readonly ["trade", "aggTrade", "ticker", "depth", "markPrice", "indexPrice", "depthSnapshot", "bookTicker", "forceOrder", "openInterest", "fundingInfo", "recentTrades", "topLongShortAccountRatio", "topLongShortPositionRatio", "globalLongShortAccountRatio", "takerBuySellVol", "!contractInfo"];
|
package/dist/consts.js
CHANGED
|
@@ -273,7 +273,7 @@ const FTX_CHANNELS = [
|
|
|
273
273
|
'leveragedTokenInfo',
|
|
274
274
|
'busy'
|
|
275
275
|
];
|
|
276
|
-
const GEMINI_CHANNELS = ['trade', 'l2_updates', 'auction_open', 'auction_indicative', 'auction_result'];
|
|
276
|
+
const GEMINI_CHANNELS = ['trade', 'l2_updates', 'auction_open', 'auction_indicative', 'auction_result', 'depth', 'bookTicker'];
|
|
277
277
|
const BITFLYER_CHANNELS = ['lightning_executions', 'lightning_board_snapshot', 'lightning_board', 'lightning_ticker'];
|
|
278
278
|
const BINANCE_FUTURES_CHANNELS = [
|
|
279
279
|
'trade',
|
package/dist/consts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"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"}
|
package/dist/mappers/gemini.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { BookChange, Trade } from '../types.ts';
|
|
1
|
+
import { BookChange, BookTicker, Trade } from '../types.ts';
|
|
2
2
|
export declare const geminiMappers: {
|
|
3
3
|
gemini: {
|
|
4
4
|
trades: import("./registry.ts").MapperCreator<"gemini", Trade>;
|
|
5
5
|
bookChanges: import("./registry.ts").MapperCreator<"gemini", BookChange>;
|
|
6
|
+
bookTickers: import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookTicker>;
|
|
6
7
|
};
|
|
7
8
|
};
|
|
8
9
|
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/mappers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/mappers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAM3D,eAAO,MAAM,aAAa;;;;;;CASxB,CAAA"}
|
package/dist/mappers/gemini.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { upperCaseSymbols } from "../handy.js";
|
|
2
|
-
import { exchangeMappers } from "./registry.js";
|
|
3
|
-
|
|
1
|
+
import { asNonZeroNumberOrUndefined, fromMicroSecondsToDate, upperCaseSymbols } from "../handy.js";
|
|
2
|
+
import { exchangeMappers, mapper } from "./registry.js";
|
|
3
|
+
const GEMINI_V3_API_SWITCH_DATE = new Date('2026-07-24T00:00:00.000Z');
|
|
4
4
|
export const geminiMappers = exchangeMappers({
|
|
5
5
|
gemini: {
|
|
6
|
-
trades: () => geminiTradesMapper,
|
|
7
|
-
bookChanges: (
|
|
6
|
+
trades: mapper([{ until: GEMINI_V3_API_SWITCH_DATE, use: () => geminiTradesMapper }, { use: () => new GeminiV3TradesMapper() }]),
|
|
7
|
+
bookChanges: mapper([
|
|
8
|
+
{ until: GEMINI_V3_API_SWITCH_DATE, use: () => geminiBookChangeMapper },
|
|
9
|
+
{ use: () => new GeminiV3BookChangeMapper() }
|
|
10
|
+
]),
|
|
11
|
+
bookTickers: () => new GeminiV3BookTickerMapper()
|
|
8
12
|
}
|
|
9
13
|
});
|
|
10
14
|
const geminiTradesMapper = {
|
|
@@ -65,4 +69,77 @@ const geminiBookChangeMapper = {
|
|
|
65
69
|
};
|
|
66
70
|
}
|
|
67
71
|
};
|
|
72
|
+
class GeminiV3TradesMapper {
|
|
73
|
+
canHandle(message) {
|
|
74
|
+
return 't' in message;
|
|
75
|
+
}
|
|
76
|
+
getFilters(symbols) {
|
|
77
|
+
return [{ channel: 'trade', symbols: upperCaseSymbols(symbols) }];
|
|
78
|
+
}
|
|
79
|
+
*map(message, localTimestamp) {
|
|
80
|
+
yield {
|
|
81
|
+
type: 'trade',
|
|
82
|
+
symbol: message.s.toUpperCase(),
|
|
83
|
+
exchange: 'gemini',
|
|
84
|
+
id: message.t.toString(),
|
|
85
|
+
price: Number(message.p),
|
|
86
|
+
amount: Number(message.q),
|
|
87
|
+
side: message.m ? 'sell' : 'buy',
|
|
88
|
+
timestamp: fromMicroSecondsToDate(Math.floor(message.E / 1000)),
|
|
89
|
+
localTimestamp
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
class GeminiV3BookChangeMapper {
|
|
94
|
+
symbolsWithSnapshot = new Set();
|
|
95
|
+
canHandle(message) {
|
|
96
|
+
return message.e === 'depthUpdate';
|
|
97
|
+
}
|
|
98
|
+
getFilters(symbols) {
|
|
99
|
+
return [{ channel: 'depth', symbols: upperCaseSymbols(symbols) }];
|
|
100
|
+
}
|
|
101
|
+
*map(message, localTimestamp) {
|
|
102
|
+
yield {
|
|
103
|
+
type: 'book_change',
|
|
104
|
+
symbol: message.s.toUpperCase(),
|
|
105
|
+
exchange: 'gemini',
|
|
106
|
+
isSnapshot: this.isSnapshot(message.s),
|
|
107
|
+
bids: message.b.map(this.mapBookLevel),
|
|
108
|
+
asks: message.a.map(this.mapBookLevel),
|
|
109
|
+
timestamp: fromMicroSecondsToDate(Math.floor(message.E / 1000)),
|
|
110
|
+
localTimestamp
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
isSnapshot(symbol) {
|
|
114
|
+
// With snapshot=-1 Gemini sends a full book as the first depthUpdate per symbol on a new connection.
|
|
115
|
+
// A historical replay started mid-connection cannot distinguish that snapshot from a delta using the payload alone.
|
|
116
|
+
const isSnapshot = this.symbolsWithSnapshot.has(symbol) === false;
|
|
117
|
+
this.symbolsWithSnapshot.add(symbol);
|
|
118
|
+
return isSnapshot;
|
|
119
|
+
}
|
|
120
|
+
mapBookLevel([price, amount]) {
|
|
121
|
+
return { price: Number(price), amount: Number(amount) };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
class GeminiV3BookTickerMapper {
|
|
125
|
+
canHandle(message) {
|
|
126
|
+
return 'B' in message;
|
|
127
|
+
}
|
|
128
|
+
getFilters(symbols) {
|
|
129
|
+
return [{ channel: 'bookTicker', symbols: upperCaseSymbols(symbols) }];
|
|
130
|
+
}
|
|
131
|
+
*map(message, localTimestamp) {
|
|
132
|
+
yield {
|
|
133
|
+
type: 'book_ticker',
|
|
134
|
+
symbol: message.s.toUpperCase(),
|
|
135
|
+
exchange: 'gemini',
|
|
136
|
+
askAmount: asNonZeroNumberOrUndefined(message.A),
|
|
137
|
+
askPrice: asNonZeroNumberOrUndefined(message.a),
|
|
138
|
+
bidAmount: asNonZeroNumberOrUndefined(message.B),
|
|
139
|
+
bidPrice: asNonZeroNumberOrUndefined(message.b),
|
|
140
|
+
timestamp: fromMicroSecondsToDate(Math.floor(message.E / 1000)),
|
|
141
|
+
localTimestamp
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
68
145
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/mappers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/mappers/gemini.ts"],"names":[],"mappings":"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"}
|
package/dist/mappers/index.d.ts
CHANGED
|
@@ -740,7 +740,7 @@ export declare const normalizeBookTickers: Normalizer<{
|
|
|
740
740
|
} & {
|
|
741
741
|
'gate-io-futures': import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookTicker>;
|
|
742
742
|
} & {
|
|
743
|
-
gemini:
|
|
743
|
+
gemini: import("./registry.ts").MapperCreator<"bitmex" | "deribit" | "binance-futures" | "binance-delivery" | "binance-european-options" | "binance" | "ftx" | "okex-futures" | "okex-options" | "okex-swap" | "okex" | "okex-spreads" | "huobi-dm" | "huobi-dm-swap" | "huobi-dm-linear-swap" | "huobi" | "bitfinex-derivatives" | "bitfinex" | "coinbase" | "coinbase-international" | "cryptofacilities" | "kraken" | "bitstamp" | "gemini" | "poloniex" | "bybit" | "bybit-spot" | "bybit-options" | "phemex" | "delta" | "ftx-us" | "binance-us" | "gate-io-futures" | "mexc-futures" | "gate-io" | "okcoin" | "bitflyer" | "hitbtc" | "coinflex" | "binance-jersey" | "binance-dex" | "upbit" | "ascendex" | "dydx" | "dydx-v4" | "serum" | "mango" | "huobi-dm-options" | "star-atlas" | "crypto-com" | "kucoin" | "kucoin-futures" | "bitnomial" | "woo-x" | "blockchain-com" | "bitget" | "bitget-futures" | "hyperliquid" | "lighter" | "bullish" | "mexc" | "polymarket", BookTicker>;
|
|
744
744
|
} & {
|
|
745
745
|
hitbtc: never;
|
|
746
746
|
} & {
|
|
@@ -2,6 +2,7 @@ import { Filter } from '../types.ts';
|
|
|
2
2
|
import { RealTimeFeedBase } from './realtimefeed.ts';
|
|
3
3
|
export declare class GeminiRealTimeFeed extends RealTimeFeedBase {
|
|
4
4
|
protected wssURL: string;
|
|
5
|
+
private readonly channels;
|
|
5
6
|
protected mapToSubscribeMessages(filters: Filter<string>[]): any[];
|
|
6
7
|
protected messageIsError(message: any): boolean;
|
|
7
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,SAAS,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,SAAS,CAAC,MAAM,SAAoC;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IAErE,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE;IA2BlE,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;CAGhD"}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { RealTimeFeedBase } from "./realtimefeed.js";
|
|
2
2
|
export class GeminiRealTimeFeed extends RealTimeFeedBase {
|
|
3
|
-
wssURL = 'wss://
|
|
3
|
+
wssURL = 'wss://ws.gemini.com?snapshot=-1';
|
|
4
|
+
channels = new Set(['trade', 'depth', 'bookTicker']);
|
|
4
5
|
mapToSubscribeMessages(filters) {
|
|
5
|
-
const
|
|
6
|
-
.
|
|
7
|
-
if (!
|
|
6
|
+
const params = filters
|
|
7
|
+
.flatMap((filter) => {
|
|
8
|
+
if (!this.channels.has(filter.channel)) {
|
|
9
|
+
throw new Error(`GeminiRealTimeFeed unsupported channel ${filter.channel}`);
|
|
10
|
+
}
|
|
11
|
+
if (!Array.isArray(filter.symbols) || filter.symbols.length === 0) {
|
|
8
12
|
throw new Error('GeminiRealTimeFeed requires explicitly specified symbols when subscribing to live feed');
|
|
9
13
|
}
|
|
10
|
-
|
|
14
|
+
const channel = filter.channel === 'depth' ? 'depth@100ms' : filter.channel;
|
|
15
|
+
return filter.symbols.map((symbol) => `${symbol.toLowerCase()}@${channel}`);
|
|
11
16
|
})
|
|
12
|
-
.flatMap((s) => s)
|
|
13
17
|
.filter((value, index, self) => {
|
|
14
18
|
return self.indexOf(value) === index;
|
|
15
19
|
});
|
|
16
20
|
return [
|
|
17
21
|
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
name: 'l2',
|
|
22
|
-
symbols
|
|
23
|
-
}
|
|
24
|
-
]
|
|
22
|
+
method: 'SUBSCRIBE',
|
|
23
|
+
params,
|
|
24
|
+
id: 1
|
|
25
25
|
}
|
|
26
26
|
];
|
|
27
27
|
}
|
|
28
28
|
messageIsError(message) {
|
|
29
|
-
return message.result === 'error';
|
|
29
|
+
return message.result === 'error' || message.error !== undefined || message.status >= 400;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;IAC5C,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/realtimefeeds/gemini.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;IAC5C,MAAM,GAAG,iCAAiC,CAAA;IACnC,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;IAE3D,sBAAsB,CAAC,OAAyB;QACxD,MAAM,MAAM,GAAG,OAAO;aACnB,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;YAC7E,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAA;YAC3G,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAA;YAC3E,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC,CAAA;QAC7E,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAA;QACtC,CAAC,CAAC,CAAA;QAEJ,OAAO;YACL;gBACE,MAAM,EAAE,WAAW;gBACnB,MAAM;gBACN,EAAE,EAAE,CAAC;aACN;SACF,CAAA;IACH,CAAC;IAES,cAAc,CAAC,OAAY;QACnC,OAAO,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,CAAA;IAC3F,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tardis-dev",
|
|
3
|
-
"version": "17.
|
|
3
|
+
"version": "17.1.0",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=25"
|
|
6
6
|
},
|
|
@@ -69,32 +69,29 @@
|
|
|
69
69
|
"license": "MPL-2.0",
|
|
70
70
|
"dependencies": {
|
|
71
71
|
"bintrees": "^1.0.2",
|
|
72
|
-
"debug": "^4.
|
|
73
|
-
"follow-redirects": "^1.
|
|
72
|
+
"debug": "^4.4.3",
|
|
73
|
+
"follow-redirects": "^1.16.0",
|
|
74
74
|
"https-proxy-agent": "^8.0.0",
|
|
75
|
-
"p-map": "^7.0.
|
|
76
|
-
"protobufjs": "^8.
|
|
75
|
+
"p-map": "^7.0.5",
|
|
76
|
+
"protobufjs": "^8.7.1",
|
|
77
77
|
"socks-proxy-agent": "^9.0.0",
|
|
78
|
-
"ws": "^8.
|
|
78
|
+
"ws": "^8.21.1"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@types/bintrees": "^1.0.6",
|
|
82
|
-
"@types/debug": "^4.1.
|
|
82
|
+
"@types/debug": "^4.1.13",
|
|
83
83
|
"@types/follow-redirects": "^1.14.4",
|
|
84
|
-
"@types/jest": "^29.
|
|
85
|
-
"@types/node": "^
|
|
84
|
+
"@types/jest": "^29.5.14",
|
|
85
|
+
"@types/node": "^26.1.1",
|
|
86
86
|
"@types/ws": "^8.18.1",
|
|
87
|
-
"jest": "^29.
|
|
88
|
-
"lint-staged": "^
|
|
89
|
-
"prettier": "
|
|
90
|
-
"ts-jest": "^29.4.
|
|
91
|
-
"typescript": "^
|
|
87
|
+
"jest": "^29.7.0",
|
|
88
|
+
"lint-staged": "^16.4.0",
|
|
89
|
+
"prettier": "3.8.3",
|
|
90
|
+
"ts-jest": "^29.4.11",
|
|
91
|
+
"typescript": "^6.0.3"
|
|
92
92
|
},
|
|
93
93
|
"lint-staged": {
|
|
94
|
-
"*.
|
|
95
|
-
"prettier --write",
|
|
96
|
-
"git add"
|
|
97
|
-
]
|
|
94
|
+
"*.ts": "prettier --write"
|
|
98
95
|
},
|
|
99
96
|
"jest": {
|
|
100
97
|
"extensionsToTreatAsEsm": [
|
package/src/consts.ts
CHANGED
|
@@ -292,7 +292,7 @@ const FTX_CHANNELS = [
|
|
|
292
292
|
'busy'
|
|
293
293
|
] as const
|
|
294
294
|
|
|
295
|
-
const GEMINI_CHANNELS = ['trade', 'l2_updates', 'auction_open', 'auction_indicative', 'auction_result'] as const
|
|
295
|
+
const GEMINI_CHANNELS = ['trade', 'l2_updates', 'auction_open', 'auction_indicative', 'auction_result', 'depth', 'bookTicker'] as const
|
|
296
296
|
|
|
297
297
|
const BITFLYER_CHANNELS = ['lightning_executions', 'lightning_board_snapshot', 'lightning_board', 'lightning_ticker'] as const
|
|
298
298
|
|
package/src/mappers/gemini.ts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { upperCaseSymbols } from '../handy.ts'
|
|
2
|
-
import { BookChange, Trade } from '../types.ts'
|
|
1
|
+
import { asNonZeroNumberOrUndefined, fromMicroSecondsToDate, upperCaseSymbols } from '../handy.ts'
|
|
2
|
+
import { BookChange, BookTicker, Trade } from '../types.ts'
|
|
3
3
|
import { Mapper } from './mapper.ts'
|
|
4
|
-
import { exchangeMappers } from './registry.ts'
|
|
4
|
+
import { exchangeMappers, mapper } from './registry.ts'
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
const GEMINI_V3_API_SWITCH_DATE = new Date('2026-07-24T00:00:00.000Z')
|
|
7
7
|
|
|
8
8
|
export const geminiMappers = exchangeMappers({
|
|
9
9
|
gemini: {
|
|
10
|
-
trades: () => geminiTradesMapper,
|
|
11
|
-
bookChanges: (
|
|
10
|
+
trades: mapper([{ until: GEMINI_V3_API_SWITCH_DATE, use: () => geminiTradesMapper }, { use: () => new GeminiV3TradesMapper() }]),
|
|
11
|
+
bookChanges: mapper([
|
|
12
|
+
{ until: GEMINI_V3_API_SWITCH_DATE, use: () => geminiBookChangeMapper },
|
|
13
|
+
{ use: () => new GeminiV3BookChangeMapper() }
|
|
14
|
+
]),
|
|
15
|
+
bookTickers: () => new GeminiV3BookTickerMapper()
|
|
12
16
|
}
|
|
13
17
|
})
|
|
14
18
|
|
|
@@ -87,7 +91,7 @@ type GeminiL2Updates = {
|
|
|
87
91
|
type: 'l2_updates'
|
|
88
92
|
symbol: string
|
|
89
93
|
changes: GeminiBookLevel[]
|
|
90
|
-
auction_events
|
|
94
|
+
auction_events?: any[]
|
|
91
95
|
}
|
|
92
96
|
|
|
93
97
|
type GeminiTrade = {
|
|
@@ -97,5 +101,125 @@ type GeminiTrade = {
|
|
|
97
101
|
timestamp: number
|
|
98
102
|
price: string
|
|
99
103
|
quantity: string
|
|
100
|
-
side: 'sell' | 'buy'
|
|
104
|
+
side: 'sell' | 'buy' | 'block'
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
class GeminiV3TradesMapper implements Mapper<'gemini', Trade> {
|
|
108
|
+
canHandle(message: GeminiV3Trade | GeminiV3BookTicker | GeminiV3DepthUpdate) {
|
|
109
|
+
return 't' in message
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
getFilters(symbols?: string[]) {
|
|
113
|
+
return [{ channel: 'trade', symbols: upperCaseSymbols(symbols) } as const]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
*map(message: GeminiV3Trade, localTimestamp: Date): IterableIterator<Trade> {
|
|
117
|
+
yield {
|
|
118
|
+
type: 'trade',
|
|
119
|
+
symbol: message.s.toUpperCase(),
|
|
120
|
+
exchange: 'gemini',
|
|
121
|
+
id: message.t.toString(),
|
|
122
|
+
price: Number(message.p),
|
|
123
|
+
amount: Number(message.q),
|
|
124
|
+
side: message.m ? 'sell' : 'buy',
|
|
125
|
+
timestamp: fromMicroSecondsToDate(Math.floor(message.E / 1000)),
|
|
126
|
+
localTimestamp
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
class GeminiV3BookChangeMapper implements Mapper<'gemini', BookChange> {
|
|
132
|
+
private readonly symbolsWithSnapshot = new Set<string>()
|
|
133
|
+
|
|
134
|
+
canHandle(message: GeminiV3DepthUpdate) {
|
|
135
|
+
return message.e === 'depthUpdate'
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
getFilters(symbols?: string[]) {
|
|
139
|
+
return [{ channel: 'depth', symbols: upperCaseSymbols(symbols) } as const]
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
*map(message: GeminiV3DepthUpdate, localTimestamp: Date): IterableIterator<BookChange> {
|
|
143
|
+
yield {
|
|
144
|
+
type: 'book_change',
|
|
145
|
+
symbol: message.s.toUpperCase(),
|
|
146
|
+
exchange: 'gemini',
|
|
147
|
+
isSnapshot: this.isSnapshot(message.s),
|
|
148
|
+
bids: message.b.map(this.mapBookLevel),
|
|
149
|
+
asks: message.a.map(this.mapBookLevel),
|
|
150
|
+
timestamp: fromMicroSecondsToDate(Math.floor(message.E / 1000)),
|
|
151
|
+
localTimestamp
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private isSnapshot(symbol: string) {
|
|
156
|
+
// With snapshot=-1 Gemini sends a full book as the first depthUpdate per symbol on a new connection.
|
|
157
|
+
// A historical replay started mid-connection cannot distinguish that snapshot from a delta using the payload alone.
|
|
158
|
+
const isSnapshot = this.symbolsWithSnapshot.has(symbol) === false
|
|
159
|
+
this.symbolsWithSnapshot.add(symbol)
|
|
160
|
+
return isSnapshot
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private mapBookLevel([price, amount]: GeminiV3BookLevel) {
|
|
164
|
+
return { price: Number(price), amount: Number(amount) }
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
class GeminiV3BookTickerMapper implements Mapper<'gemini', BookTicker> {
|
|
169
|
+
canHandle(message: GeminiV3Trade | GeminiV3BookTicker | GeminiV3DepthUpdate) {
|
|
170
|
+
return 'B' in message
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
getFilters(symbols?: string[]) {
|
|
174
|
+
return [{ channel: 'bookTicker', symbols: upperCaseSymbols(symbols) } as const]
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
*map(message: GeminiV3BookTicker, localTimestamp: Date): IterableIterator<BookTicker> {
|
|
178
|
+
yield {
|
|
179
|
+
type: 'book_ticker',
|
|
180
|
+
symbol: message.s.toUpperCase(),
|
|
181
|
+
exchange: 'gemini',
|
|
182
|
+
askAmount: asNonZeroNumberOrUndefined(message.A),
|
|
183
|
+
askPrice: asNonZeroNumberOrUndefined(message.a),
|
|
184
|
+
bidAmount: asNonZeroNumberOrUndefined(message.B),
|
|
185
|
+
bidPrice: asNonZeroNumberOrUndefined(message.b),
|
|
186
|
+
timestamp: fromMicroSecondsToDate(Math.floor(message.E / 1000)),
|
|
187
|
+
localTimestamp
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** @see https://developer.gemini.com/websocket/streams#trade-stream */
|
|
193
|
+
type GeminiV3Trade = {
|
|
194
|
+
E: number
|
|
195
|
+
s: string
|
|
196
|
+
t: number
|
|
197
|
+
p: string
|
|
198
|
+
q: string
|
|
199
|
+
m: boolean
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** @see https://developer.gemini.com/websocket/streams#l2-differential-depth-streams */
|
|
203
|
+
type GeminiV3DepthUpdate = {
|
|
204
|
+
e: 'depthUpdate'
|
|
205
|
+
E: number
|
|
206
|
+
s: string
|
|
207
|
+
U: number
|
|
208
|
+
u: number
|
|
209
|
+
b: GeminiV3BookLevel[]
|
|
210
|
+
a: GeminiV3BookLevel[]
|
|
211
|
+
}
|
|
212
|
+
type GeminiV3BookLevel = [string, string]
|
|
213
|
+
|
|
214
|
+
/** @see https://developer.gemini.com/websocket/streams#book-ticker */
|
|
215
|
+
type GeminiV3BookTicker = {
|
|
216
|
+
u: number
|
|
217
|
+
E: number
|
|
218
|
+
s: string
|
|
219
|
+
b: string
|
|
220
|
+
B: string
|
|
221
|
+
a: string
|
|
222
|
+
A: string
|
|
223
|
+
c?: string
|
|
224
|
+
C?: string
|
|
101
225
|
}
|
|
@@ -2,36 +2,37 @@ import { Filter } from '../types.ts'
|
|
|
2
2
|
import { RealTimeFeedBase } from './realtimefeed.ts'
|
|
3
3
|
|
|
4
4
|
export class GeminiRealTimeFeed extends RealTimeFeedBase {
|
|
5
|
-
protected wssURL = 'wss://
|
|
5
|
+
protected wssURL = 'wss://ws.gemini.com?snapshot=-1'
|
|
6
|
+
private readonly channels = new Set(['trade', 'depth', 'bookTicker'])
|
|
6
7
|
|
|
7
8
|
protected mapToSubscribeMessages(filters: Filter<string>[]): any[] {
|
|
8
|
-
const
|
|
9
|
-
.
|
|
10
|
-
if (!
|
|
9
|
+
const params = filters
|
|
10
|
+
.flatMap((filter) => {
|
|
11
|
+
if (!this.channels.has(filter.channel)) {
|
|
12
|
+
throw new Error(`GeminiRealTimeFeed unsupported channel ${filter.channel}`)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (!Array.isArray(filter.symbols) || filter.symbols.length === 0) {
|
|
11
16
|
throw new Error('GeminiRealTimeFeed requires explicitly specified symbols when subscribing to live feed')
|
|
12
17
|
}
|
|
13
18
|
|
|
14
|
-
|
|
19
|
+
const channel = filter.channel === 'depth' ? 'depth@100ms' : filter.channel
|
|
20
|
+
return filter.symbols.map((symbol) => `${symbol.toLowerCase()}@${channel}`)
|
|
15
21
|
})
|
|
16
|
-
.flatMap((s) => s)
|
|
17
22
|
.filter((value, index, self) => {
|
|
18
23
|
return self.indexOf(value) === index
|
|
19
24
|
})
|
|
20
25
|
|
|
21
26
|
return [
|
|
22
27
|
{
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
name: 'l2',
|
|
27
|
-
symbols
|
|
28
|
-
}
|
|
29
|
-
]
|
|
28
|
+
method: 'SUBSCRIBE',
|
|
29
|
+
params,
|
|
30
|
+
id: 1
|
|
30
31
|
}
|
|
31
32
|
]
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
protected messageIsError(message: any): boolean {
|
|
35
|
-
return message.result === 'error'
|
|
36
|
+
return message.result === 'error' || message.error !== undefined || message.status >= 400
|
|
36
37
|
}
|
|
37
38
|
}
|