tardis-dev
Version:
Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js
109 lines • 3.21 kB
JavaScript
import { asNonZeroNumberOrUndefined, upperCaseSymbols } from "../handy.js";
export class SerumTradesMapper {
_exchange;
constructor(_exchange) {
this._exchange = _exchange;
}
canHandle(message) {
return message.type === 'trade';
}
getFilters(symbols) {
if (this._exchange === 'serum') {
symbols = upperCaseSymbols(symbols);
}
return [
{
channel: 'trade',
symbols
}
];
}
*map(message, localTimestamp) {
yield {
type: 'trade',
symbol: message.market.toUpperCase(),
exchange: this._exchange,
id: message.id,
price: Number(message.price),
amount: Number(message.size),
side: message.side,
timestamp: message.eventTimestamp !== undefined ? new Date(message.eventTimestamp) : new Date(message.timestamp),
localTimestamp
};
}
}
export class SerumBookChangeMapper {
_exchange;
constructor(_exchange) {
this._exchange = _exchange;
}
canHandle(message) {
return message.type === 'l2snapshot' || message.type === 'l2update';
}
getFilters(symbols) {
if (this._exchange === 'serum') {
symbols = upperCaseSymbols(symbols);
}
return [
{
channel: 'l2snapshot',
symbols
},
{
channel: 'l2update',
symbols
}
];
}
*map(message, localTimestamp) {
yield {
type: 'book_change',
symbol: message.market.toUpperCase(),
exchange: this._exchange,
isSnapshot: message.type === 'l2snapshot',
bids: message.bids.map(this.mapBookLevel),
asks: message.asks.map(this.mapBookLevel),
timestamp: new Date(message.timestamp),
localTimestamp
};
}
mapBookLevel(level) {
const price = Number(level[0]);
const amount = Number(level[1]);
return { price, amount };
}
}
export class SerumBookTickerMapper {
_exchange;
constructor(_exchange) {
this._exchange = _exchange;
}
canHandle(message) {
return message.type === 'quote';
}
getFilters(symbols) {
if (this._exchange === 'serum') {
symbols = upperCaseSymbols(symbols);
}
return [
{
channel: 'quote',
symbols
}
];
}
*map(message, localTimestamp) {
yield {
type: 'book_ticker',
symbol: message.market.toUpperCase(),
exchange: this._exchange,
askAmount: asNonZeroNumberOrUndefined(message.bestAsk?.[1]),
askPrice: asNonZeroNumberOrUndefined(message.bestAsk?.[0]),
bidPrice: asNonZeroNumberOrUndefined(message.bestBid?.[0]),
bidAmount: asNonZeroNumberOrUndefined(message.bestBid?.[1]),
timestamp: new Date(message.timestamp),
localTimestamp: localTimestamp
};
}
}
//# sourceMappingURL=serum.js.map