UNPKG

tardis-dev

Version:

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

204 lines 6.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PoloniexBookChangeMapper = exports.PoloniexTradesMapper = exports.PoloniexV2BookChangeMapper = exports.PoloniexV2TradesMapper = void 0; const handy_1 = require("../handy"); class PoloniexV2TradesMapper { canHandle(message) { return message.channel === 'trades' && message.data !== undefined && message.data.length > 0; } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'trades', symbols } ]; } *map(message, localTimestamp) { for (const item of message.data) { yield { type: 'trade', symbol: item.symbol, exchange: 'poloniex', id: item.id, price: Number(item.price), amount: Number(item.quantity), side: item.takerSide === 'sell' ? 'sell' : 'buy', timestamp: new Date(item.createTime), localTimestamp: localTimestamp }; } } } exports.PoloniexV2TradesMapper = PoloniexV2TradesMapper; const mapBookLevelV2 = (level) => { return { price: Number(level[0]), amount: Number(level[1]) }; }; class PoloniexV2BookChangeMapper { canHandle(message) { return message.channel === 'book_lv2' && message.data !== undefined && message.data.length > 0; } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'book_lv2', symbols } ]; } *map(message, localTimestamp) { for (const item of message.data) { const bookSnapshot = { type: 'book_change', symbol: item.symbol, exchange: 'poloniex', isSnapshot: message.action === 'snapshot', bids: item.bids.map(mapBookLevelV2), asks: item.asks.map(mapBookLevelV2), timestamp: new Date(item.ts), localTimestamp: localTimestamp }; yield bookSnapshot; } } } exports.PoloniexV2BookChangeMapper = PoloniexV2BookChangeMapper; class PoloniexTradesMapper { constructor() { this._channelIdToSymbolMap = new Map(); } canHandle(message) { if (Array.isArray(message) === false) { return false; } if (message.length < 3) { return false; } // store mapping between channel id and symbols if (message[2][0][0] === 'i') { this._channelIdToSymbolMap.set(message[0], message[2][0][1].currencyPair); } return message[2].some((m) => m[0] === 't'); } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'price_aggregated_book', symbols } ]; } *map(message, localTimestamp) { const lastItem = message[message.length - 1]; const symbol = typeof lastItem === 'string' ? lastItem : this._channelIdToSymbolMap.get(message[0]); if (symbol === undefined) { return; } for (const item of message[2]) { if (item[0] !== 't') { continue; } const [_, id, side, price, size, timestamp] = item; yield { type: 'trade', symbol, exchange: 'poloniex', id: String(id), price: Number(price), amount: Number(size), side: side === 1 ? 'buy' : 'sell', timestamp: new Date(timestamp * 1000), localTimestamp: localTimestamp }; } } } exports.PoloniexTradesMapper = PoloniexTradesMapper; const mapSnapshotLevels = (levels) => { return Object.keys(levels).map((key) => { return { price: Number(key), amount: Number(levels[key]) }; }); }; const mapBookLevel = (level) => { return { price: Number(level[2]), amount: Number(level[3]) }; }; class PoloniexBookChangeMapper { constructor() { this._channelIdToSymbolMap = new Map(); } canHandle(message) { if (Array.isArray(message) === false) { return false; } if (message.length < 3) { return false; } // store mapping between channel id and symbols if (message[2][0][0] === 'i') { this._channelIdToSymbolMap.set(message[0], message[2][0][1].currencyPair); } return message[2].some((m) => m[0] === 'i' || m[0] === 'o'); } getFilters(symbols) { symbols = (0, handy_1.upperCaseSymbols)(symbols); return [ { channel: 'price_aggregated_book', symbols } ]; } *map(message, localTimestamp) { const lastItem = message[message.length - 1]; const symbol = typeof lastItem === 'string' ? lastItem : this._channelIdToSymbolMap.get(message[0]); if (symbol === undefined) { return; } let updates = []; for (const item of message[2]) { if (item[0] === 'i') { const bookSnapshot = { type: 'book_change', symbol, exchange: 'poloniex', isSnapshot: true, bids: mapSnapshotLevels(item[1].orderBook[1]), asks: mapSnapshotLevels(item[1].orderBook[0]), timestamp: localTimestamp, localTimestamp: localTimestamp }; yield bookSnapshot; } else if (item[0] === 'o') { updates.push(item); } } if (updates.length > 0) { const bookUpdate = { type: 'book_change', symbol, exchange: 'poloniex', isSnapshot: false, bids: updates.filter((u) => u[1] == 1).map(mapBookLevel), asks: updates.filter((u) => u[1] == 0).map(mapBookLevel), timestamp: localTimestamp, localTimestamp: localTimestamp }; yield bookUpdate; } } } exports.PoloniexBookChangeMapper = PoloniexBookChangeMapper; //# sourceMappingURL=poloniex.js.map