tardis-dev
Version:
Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js
99 lines (89 loc) • 2.6 kB
text/typescript
import { upperCaseSymbols } from '../handy'
import { BookChange, Trade } from '../types'
import { Mapper } from './mapper'
export class BlockchainComTradesMapper implements Mapper<'blockchain-com', Trade> {
canHandle(message: BlockchainComTradeMessage) {
return message.channel === 'trades' && message.event === 'updated'
}
getFilters(symbols?: string[]) {
symbols = upperCaseSymbols(symbols)
return [
{
channel: 'trades',
symbols
} as const
]
}
*map(message: BlockchainComTradeMessage, localTimestamp: Date): IterableIterator<Trade> {
yield {
type: 'trade',
symbol: message.symbol,
exchange: 'blockchain-com',
id: message.trade_id,
price: message.price,
amount: message.qty,
side: message.side === 'sell' ? 'sell' : 'buy',
timestamp: new Date(message.timestamp),
localTimestamp: localTimestamp
}
}
}
export class BlockchainComBookChangeMapper implements Mapper<'blockchain-com', BookChange> {
canHandle(message: BlockchainComL2Message) {
return message.channel == 'l2' && (message.event === 'snapshot' || message.event === 'updated')
}
getFilters(symbols?: string[]) {
symbols = upperCaseSymbols(symbols)
return [
{
channel: 'l2',
symbols
}
]
}
*map(message: BlockchainComL2Message, localTimestamp: Date): IterableIterator<BookChange> {
yield {
type: 'book_change',
symbol: message.symbol,
exchange: 'blockchain-com',
isSnapshot: message.event === 'snapshot',
bids: message.bids.map(this.mapBookLevel),
asks: message.asks.map(this.mapBookLevel),
timestamp: new Date(message.timestamp),
localTimestamp
}
}
protected mapBookLevel(level: { px: number; qty: number }) {
return { price: level.px, amount: level.qty }
}
}
type BlockchainComTradeMessage = {
seqnum: 408403
event: 'updated'
channel: 'trades'
symbol: 'ETH-USDT'
timestamp: '2023-02-23T03:02:11.503718Z'
side: 'sell'
qty: 0.60192856
price: 1677.94
trade_id: '844558083396024'
}
type BlockchainComL2Message =
| {
seqnum: 482554
event: 'updated'
channel: 'l2'
symbol: 'DOT-GBP'
bids: [{ num: 1; px: 6.08; qty: 137.77377093 }]
asks: []
timestamp: '2023-02-23T03:02:11.535015Z'
}
| {
seqnum: 269087
event: 'snapshot'
channel: 'l2'
symbol: 'BTC-USD'
bids: [{ num: 1; px: 1.8; qty: 7.45715496 }]
asks: [{ num: 1; px: 24187.8; qty: 0.04175659 }]
timestamp: '2023-02-23T00:00:00.127804Z'
}