tardis-dev
Version:
Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js
176 lines • 5.6 kB
JavaScript
import { asNonZeroNumberOrUndefined } from "../handy.js";
import { PendingTickerInfoHelper } from "./mapper.js";
function parseChannelMarketId(channel) {
const colonIndex = channel.indexOf(':');
if (colonIndex < 0) {
return undefined;
}
const suffix = channel.slice(colonIndex + 1);
if (suffix === 'all') {
return undefined;
}
return suffix;
}
export class LighterTradesMapper {
canHandle(message) {
return message.type === 'update/trade';
}
getFilters(symbols) {
return [
{
channel: 'trade',
symbols
}
];
}
*map(message, localTimestamp) {
for (const trade of message.trades) {
yield {
type: 'trade',
symbol: trade.market_id.toString(),
exchange: 'lighter',
id: trade.trade_id_str,
price: Number(trade.price),
amount: Number(trade.size),
side: trade.is_maker_ask ? 'buy' : 'sell',
timestamp: new Date(trade.timestamp),
localTimestamp
};
}
}
}
export class LighterLiquidationMapper {
canHandle(message) {
return message.type === 'update/trade';
}
getFilters(symbols) {
return [
{
channel: 'trade',
symbols
}
];
}
*map(message, localTimestamp) {
if (!Array.isArray(message.liquidation_trades)) {
return;
}
for (const trade of message.liquidation_trades) {
if (trade.type !== 'liquidation') {
continue;
}
yield {
type: 'liquidation',
symbol: trade.market_id.toString(),
exchange: 'lighter',
id: trade.trade_id_str,
price: Number(trade.price),
amount: Number(trade.size),
side: trade.is_maker_ask ? 'buy' : 'sell',
timestamp: new Date(trade.timestamp),
localTimestamp
};
}
}
}
export class LighterBookChangeMapper {
canHandle(message) {
return message.type === 'subscribed/order_book' || message.type === 'update/order_book';
}
getFilters(symbols) {
return [
{
channel: 'order_book',
symbols
}
];
}
*map(message, localTimestamp) {
const symbol = parseChannelMarketId(message.channel);
if (symbol === undefined)
return;
yield {
type: 'book_change',
symbol,
exchange: 'lighter',
isSnapshot: message.type === 'subscribed/order_book',
bids: message.order_book.bids.map(this.mapLevel),
asks: message.order_book.asks.map(this.mapLevel),
timestamp: new Date(message.timestamp),
localTimestamp
};
}
mapLevel(level) {
return {
price: Number(level.price),
amount: Number(level.size)
};
}
}
export class LighterBookTickerMapper {
canHandle(message) {
return message.type === 'update/ticker';
}
getFilters(symbols) {
return [
{
channel: 'ticker',
symbols
}
];
}
*map(message, localTimestamp) {
const symbol = parseChannelMarketId(message.channel);
if (symbol === undefined)
return;
yield {
type: 'book_ticker',
symbol,
exchange: 'lighter',
askAmount: asNonZeroNumberOrUndefined(message.ticker?.a?.size),
askPrice: asNonZeroNumberOrUndefined(message.ticker?.a?.price),
bidPrice: asNonZeroNumberOrUndefined(message.ticker?.b?.price),
bidAmount: asNonZeroNumberOrUndefined(message.ticker?.b?.size),
timestamp: new Date(message.timestamp),
localTimestamp
};
}
}
export class LighterDerivativeTickerMapper {
pendingTickerInfoHelper = new PendingTickerInfoHelper();
canHandle(message) {
return message.type === 'update/market_stats';
}
getFilters(_symbols) {
return [
{
channel: 'market_stats',
symbols: []
}
];
}
*map(message, localTimestamp) {
for (const entry of this.iterateMarketStats(message)) {
const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(entry.market_id.toString(), 'lighter');
pendingTickerInfo.updateMarkPrice(Number(entry.mark_price));
pendingTickerInfo.updateIndexPrice(Number(entry.index_price));
pendingTickerInfo.updateFundingRate(Number(entry.current_funding_rate));
pendingTickerInfo.updateLastPrice(Number(entry.last_trade_price));
pendingTickerInfo.updateOpenInterest(Number(entry.open_interest));
if (pendingTickerInfo.hasChanged()) {
pendingTickerInfo.updateTimestamp(new Date(message.timestamp));
yield pendingTickerInfo.getSnapshot(localTimestamp);
}
}
}
*iterateMarketStats(message) {
if (message.channel === 'market_stats:all') {
for (const key of Object.keys(message.market_stats)) {
yield message.market_stats[key];
}
return;
}
yield message.market_stats;
}
}
//# sourceMappingURL=lighter.js.map