UNPKG

tardis-dev

Version:

Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js

190 lines 7.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DydxDerivativeTickerMapper = exports.DydxBookChangeMapper = exports.DydxTradesMapper = void 0; const handy_1 = require("../handy"); const mapper_1 = require("./mapper"); class DydxTradesMapper { canHandle(message) { return message.channel === 'v3_trades' && message.type === 'channel_data'; } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'v3_trades', symbols } ]; } *map(message, localTimestamp) { for (let trade of message.contents.trades) { yield { type: 'trade', symbol: message.id, exchange: 'dydx', id: undefined, price: Number(trade.price), amount: Number(trade.size), side: trade.side === 'SELL' ? 'sell' : 'buy', timestamp: trade.createdAt ? new Date(trade.createdAt) : localTimestamp, localTimestamp: localTimestamp }; } } } exports.DydxTradesMapper = DydxTradesMapper; class DydxBookChangeMapper { constructor() { this._bidsOffsets = {}; this._asksOffsets = {}; } canHandle(message) { return message.channel === 'v3_orderbook'; } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'v3_orderbook', symbols } ]; } *map(message, localTimestamp) { if (message.type === 'subscribed') { this._bidsOffsets[message.id] = {}; this._asksOffsets[message.id] = {}; yield { type: 'book_change', symbol: message.id, exchange: 'dydx', isSnapshot: true, bids: message.contents.bids.map((bid) => { this._bidsOffsets[message.id][bid.price] = Number(bid.offset); return { price: Number(bid.price), amount: Number(bid.size) }; }), asks: message.contents.asks.map((ask) => { this._asksOffsets[message.id][ask.price] = Number(ask.offset); return { price: Number(ask.price), amount: Number(ask.size) }; }), timestamp: localTimestamp, localTimestamp }; } else { if (!message.contents) { return; } // https://docs.dydx.exchange/#orderbook const updateOffset = Number(message.contents.offset); const bookChange = { type: 'book_change', symbol: message.id, exchange: 'dydx', isSnapshot: false, bids: message.contents.bids .map((bid) => { const lastPriceLevelOffset = this._bidsOffsets[message.id] && this._bidsOffsets[message.id][bid[0]]; if (lastPriceLevelOffset !== undefined && lastPriceLevelOffset >= updateOffset) { return; } return { price: Number(bid[0]), amount: Number(bid[1]) }; }) .filter((b) => b !== undefined), asks: message.contents.asks .map((ask) => { const lastPriceLevelOffset = this._asksOffsets[message.id] && this._asksOffsets[message.id][ask[0]]; if (lastPriceLevelOffset !== undefined && lastPriceLevelOffset >= updateOffset) { return; } return { price: Number(ask[0]), amount: Number(ask[1]) }; }) .filter((b) => b !== undefined), timestamp: localTimestamp, localTimestamp }; if (!this._bidsOffsets[message.id]) { this._bidsOffsets[message.id] = {}; } for (const bid of message.contents.bids) { this._bidsOffsets[message.id][bid[0]] = updateOffset; } if (!this._asksOffsets[message.id]) { this._asksOffsets[message.id] = {}; } for (const ask of message.contents.asks) { this._asksOffsets[message.id][ask[0]] = updateOffset; } if (bookChange.bids.length > 0 || bookChange.asks.length > 0) { yield bookChange; } } } } exports.DydxBookChangeMapper = DydxBookChangeMapper; class DydxDerivativeTickerMapper { constructor() { this.pendingTickerInfoHelper = new mapper_1.PendingTickerInfoHelper(); } canHandle(message) { return message.channel === 'v3_markets' || (message.channel === 'v3_trades' && message.type === 'channel_data'); } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'v3_markets', symbols: [] }, { channel: 'v3_trades', symbols } ]; } *map(message, localTimestamp) { if (message.channel === 'v3_trades') { const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.id, 'dydx'); pendingTickerInfo.updateLastPrice(Number(message.contents.trades[message.contents.trades.length - 1].price)); return; } const contents = message.type === 'subscribed' ? message.contents.markets : message.contents; for (const key in contents) { const marketInfo = contents[key]; const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(key, 'dydx'); if (marketInfo.indexPrice !== undefined) { pendingTickerInfo.updateIndexPrice(Number(marketInfo.indexPrice)); } if (marketInfo.oraclePrice !== undefined) { pendingTickerInfo.updateMarkPrice(Number(marketInfo.oraclePrice)); } if (marketInfo.openInterest !== undefined) { pendingTickerInfo.updateOpenInterest(Number(marketInfo.openInterest)); } if (marketInfo.nextFundingRate !== undefined) { pendingTickerInfo.updateFundingRate(Number(marketInfo.nextFundingRate)); } if (marketInfo.nextFundingAt !== undefined) { pendingTickerInfo.updateFundingTimestamp(new Date(marketInfo.nextFundingAt)); } pendingTickerInfo.updateTimestamp(localTimestamp); if (pendingTickerInfo.hasChanged()) { yield pendingTickerInfo.getSnapshot(localTimestamp); } } } } exports.DydxDerivativeTickerMapper = DydxDerivativeTickerMapper; //# sourceMappingURL=dydx.js.map