UNPKG

tardis-dev

Version:

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

213 lines 8.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CryptoComDerivativeTickerMapper = exports.CryptoComBookTickerMapper = exports.CryptoComBookChangeMapper = exports.CryptoComTradesMapper = void 0; const handy_1 = require("../handy"); const mapper_1 = require("./mapper"); class CryptoComTradesMapper { constructor(_exchange) { this._exchange = _exchange; } canHandle(message) { return message.result !== undefined && message.result.channel === 'trade'; } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'trade', symbols } ]; } *map(message, localTimestamp) { message.result.data.reverse(); for (const item of message.result.data) { const trade = { type: 'trade', symbol: message.result.instrument_name, exchange: this._exchange, id: item.d.toString(), price: Number(item.p), amount: Number(item.q), side: item.s === 'BUY' ? 'buy' : 'sell', timestamp: new Date(item.t), localTimestamp }; yield trade; } } } exports.CryptoComTradesMapper = CryptoComTradesMapper; class CryptoComBookChangeMapper { constructor(_exchange) { this._exchange = _exchange; } canHandle(message) { return message.result !== undefined && message.result.channel.startsWith('book'); } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'book', symbols } ]; } *map(message, localTimestamp) { if (message.result.data === undefined || message.result.data[0] === undefined) { return; } const bids = (message.result.channel === 'book' ? message.result.data[0].bids : message.result.data[0].update.bids) || []; const asks = (message.result.channel === 'book' ? message.result.data[0].asks : message.result.data[0].update.asks) || []; yield { type: 'book_change', symbol: message.result.instrument_name, exchange: this._exchange, isSnapshot: message.result.channel === 'book', bids: bids.map(this._mapBookLevel), asks: asks.map(this._mapBookLevel), timestamp: new Date(message.result.data[0].t), localTimestamp }; } _mapBookLevel(level) { return { price: Number(level[0]), amount: Number(level[1]) }; } } exports.CryptoComBookChangeMapper = CryptoComBookChangeMapper; class CryptoComBookTickerMapper { constructor(_exchange) { this._exchange = _exchange; } canHandle(message) { return message.result !== undefined && message.result.channel === 'ticker'; } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'ticker', symbols } ]; } *map(message, localTimestamp) { for (const item of message.result.data) { const bookTicker = { type: 'book_ticker', symbol: message.result.instrument_name, exchange: this._exchange, askAmount: undefined, askPrice: item.k !== undefined && item.k !== null ? Number(item.k) : undefined, bidPrice: item.b !== undefined && item.b !== null ? Number(item.b) : undefined, bidAmount: undefined, timestamp: new Date(item.t), localTimestamp: localTimestamp }; yield bookTicker; } } } exports.CryptoComBookTickerMapper = CryptoComBookTickerMapper; class CryptoComDerivativeTickerMapper { constructor(exchange) { this.exchange = exchange; this.pendingTickerInfoHelper = new mapper_1.PendingTickerInfoHelper(); this._indexPrices = new Map(); } canHandle(message) { if (message.result === undefined) { return false; } if (message.result.instrument_name === undefined) { return false; } // spot symbols if (message.result.instrument_name.includes('_')) { return false; } // options if (message.result.instrument_name.split('-').length === 3) { return false; } return (message.result.channel === 'ticker' || message.result.channel === 'index' || message.result.channel === 'mark' || message.result.channel === 'funding'); } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); let indexes = []; if (symbols !== undefined) { indexes = [...new Set(symbols.map((s) => `${s.split('-')[0]}-INDEX`))]; } const filters = [ { channel: 'ticker', symbols }, { channel: 'index', symbols: indexes }, { channel: 'mark', symbols }, { channel: 'funding', symbols }, { channel: 'estimatedfunding', symbols } ]; return filters; } *map(message, localTimestamp) { if (message.result.channel === 'index') { this._indexPrices.set(message.result.instrument_name.split('-')[0], Number(message.result.data[0].v)); return; } const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.result.instrument_name, this.exchange); const lastIndexPrice = this._indexPrices.get(message.result.instrument_name.split('-')[0]); if (lastIndexPrice !== undefined) { pendingTickerInfo.updateIndexPrice(lastIndexPrice); } if (message.result.channel === 'ticker') { if (message.result.data[0].a !== null && message.result.data[0].a !== undefined) { pendingTickerInfo.updateLastPrice(Number(message.result.data[0].a)); } if (message.result.data[0].oi !== null && message.result.data[0].oi !== undefined) { pendingTickerInfo.updateOpenInterest(Number(message.result.data[0].oi)); } } if (message.result.channel === 'mark') { if (message.result.data[0].v !== null && message.result.data[0].v !== undefined) { pendingTickerInfo.updateMarkPrice(Number(message.result.data[0].v)); } } if (message.result.channel === 'funding') { if (message.result.data[0].v !== null && message.result.data[0].v !== undefined) { pendingTickerInfo.updateFundingRate(Number(message.result.data[0].v)); const nextFundingTimestamp = new Date(message.result.data[0].t); nextFundingTimestamp.setUTCHours(nextFundingTimestamp.getUTCHours() + 1); nextFundingTimestamp.setUTCMinutes(0, 0, 0); pendingTickerInfo.updateFundingTimestamp(nextFundingTimestamp); } } if (message.result.channel === 'estimatedfunding') { if (message.result.data[0] && message.result.data[0].v !== null && message.result.data[0].v !== undefined) { pendingTickerInfo.updatePredictedFundingRate(Number(message.result.data[0].v)); } } pendingTickerInfo.updateTimestamp(new Date(message.result.data[0].t)); if (pendingTickerInfo.hasChanged()) { yield pendingTickerInfo.getSnapshot(localTimestamp); } } } exports.CryptoComDerivativeTickerMapper = CryptoComDerivativeTickerMapper; //# sourceMappingURL=cryptocom.js.map