UNPKG

@hackape/tardis-dev

Version:

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

89 lines (75 loc) 2.12 kB
import { BookChange, Trade } from '../types' import { Mapper } from './mapper' // https://docs.gemini.com/websocket-api/#market-data-version-2 export const geminiTradesMapper: Mapper<'gemini', Trade> = { canHandle(message: GeminiL2Updates | GeminiTrade) { return message.type === 'trade' }, getFilters(symbols?: string[]) { return [ { channel: 'trade', symbols } ] }, *map(geminiTrade: GeminiTrade, localTimestamp: Date): IterableIterator<Trade> { yield { type: 'trade', symbol: geminiTrade.symbol, exchange: 'gemini', id: String(geminiTrade.event_id), price: Number(geminiTrade.price), amount: Number(geminiTrade.quantity), side: geminiTrade.side, timestamp: new Date(geminiTrade.timestamp), localTimestamp: localTimestamp } } } const mapBookLevel = (level: GeminiBookLevel) => { const price = Number(level[1]) const amount = Number(level[2]) return { price, amount } } export const geminiBookChangeMapper: Mapper<'gemini', BookChange> = { canHandle(message: GeminiL2Updates | GeminiTrade) { return message.type === 'l2_updates' }, getFilters(symbols?: string[]) { return [ { channel: 'l2_updates', symbols } ] }, *map(geminiL2Updates: GeminiL2Updates, localTimestamp: Date): IterableIterator<BookChange> { yield { type: 'book_change', symbol: geminiL2Updates.symbol, exchange: 'gemini', isSnapshot: geminiL2Updates.auction_events !== undefined, bids: geminiL2Updates.changes.filter((c) => c[0] === 'buy').map(mapBookLevel), asks: geminiL2Updates.changes.filter((c) => c[0] === 'sell').map(mapBookLevel), timestamp: localTimestamp, localTimestamp } } } type GeminiBookLevel = ['buy' | 'sell', string, string] type GeminiL2Updates = { type: 'l2_updates' symbol: string changes: GeminiBookLevel[] auction_events: any[] } type GeminiTrade = { type: 'trade' symbol: string event_id: number timestamp: number price: string quantity: string side: 'sell' | 'buy' }