tardis-dev
Version: 
Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js
189 lines • 7.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DydxV4LiquidationsMapper = exports.DydxV4DerivativeTickerMapper = exports.DydxV4BookChangeMapper = exports.DydxV4TradesMapper = void 0;
const handy_1 = require("../handy");
const mapper_1 = require("./mapper");
class DydxV4TradesMapper {
    canHandle(message) {
        return message.channel === 'v4_trades' && message.type === 'channel_data';
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'v4_trades',
                symbols
            }
        ];
    }
    *map(message, localTimestamp) {
        for (let trade of message.contents.trades) {
            yield {
                type: 'trade',
                symbol: message.id,
                exchange: 'dydx-v4',
                id: trade.id,
                price: Number(trade.price),
                amount: Number(trade.size),
                side: trade.side === 'SELL' ? 'sell' : 'buy',
                timestamp: trade.createdAt ? new Date(trade.createdAt) : localTimestamp,
                localTimestamp: localTimestamp
            };
        }
    }
}
exports.DydxV4TradesMapper = DydxV4TradesMapper;
function mapSnapshotPriceLevel(level) {
    return {
        price: Number(level.price),
        amount: Number(level.size)
    };
}
function mapUpdatePriceLevel(level) {
    return {
        price: Number(level[0]),
        amount: Number(level[1])
    };
}
class DydxV4BookChangeMapper {
    canHandle(message) {
        return message.channel === 'v4_orderbook';
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'v4_orderbook',
                symbols
            }
        ];
    }
    *map(message, localTimestamp) {
        if (message.type === 'subscribed') {
            yield {
                type: 'book_change',
                symbol: message.id,
                exchange: 'dydx-v4',
                isSnapshot: true,
                bids: message.contents.bids.map(mapSnapshotPriceLevel),
                asks: message.contents.asks.map(mapSnapshotPriceLevel),
                timestamp: localTimestamp,
                localTimestamp
            };
        }
        else {
            if (!message.contents) {
                return;
            }
            const bookChange = {
                type: 'book_change',
                symbol: message.id,
                exchange: 'dydx-v4',
                isSnapshot: false,
                bids: message.contents.bids !== undefined ? message.contents.bids.map(mapUpdatePriceLevel) : [],
                asks: message.contents.asks !== undefined ? message.contents.asks.map(mapUpdatePriceLevel) : [],
                timestamp: localTimestamp,
                localTimestamp
            };
            if (bookChange.bids.length > 0 || bookChange.asks.length > 0) {
                yield bookChange;
            }
        }
    }
}
exports.DydxV4BookChangeMapper = DydxV4BookChangeMapper;
class DydxV4DerivativeTickerMapper {
    constructor() {
        this.pendingTickerInfoHelper = new mapper_1.PendingTickerInfoHelper();
    }
    canHandle(message) {
        return message.channel === 'v4_markets' || (message.channel === 'v4_trades' && message.type === 'channel_data');
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'v4_markets',
                symbols: []
            },
            {
                channel: 'v4_trades',
                symbols
            }
        ];
    }
    *map(message, localTimestamp) {
        if (message.channel === 'v4_trades') {
            const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.id, 'dydx-v4');
            pendingTickerInfo.updateLastPrice(Number(message.contents.trades[message.contents.trades.length - 1].price));
            return;
        }
        if (message.type === 'subscribed' || (message.type === 'channel_data' && message.contents.trading !== undefined)) {
            const contents = message.type === 'subscribed' ? message.contents.markets : message.contents.trading;
            for (const key in contents) {
                const marketInfo = contents[key];
                const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(key, 'dydx-v4');
                if (marketInfo.oraclePrice !== undefined) {
                    pendingTickerInfo.updateMarkPrice(Number(marketInfo.oraclePrice));
                }
                if (marketInfo.openInterest !== undefined) {
                    pendingTickerInfo.updateOpenInterest(Number(marketInfo.openInterest));
                }
                if (marketInfo.nextFundingRate !== undefined) {
                    pendingTickerInfo.updateFundingRate(Number(marketInfo.nextFundingRate));
                }
                pendingTickerInfo.updateTimestamp(localTimestamp);
                if (pendingTickerInfo.hasChanged()) {
                    yield pendingTickerInfo.getSnapshot(localTimestamp);
                }
            }
        }
        if (message.type === 'channel_data' && message.contents.oraclePrices !== undefined) {
            for (const key in message.contents.oraclePrices) {
                const oraclePriceInfo = message.contents.oraclePrices[key];
                const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(key, 'dydx-v4');
                if (oraclePriceInfo.oraclePrice !== undefined) {
                    pendingTickerInfo.updateMarkPrice(Number(oraclePriceInfo.oraclePrice));
                }
                pendingTickerInfo.updateTimestamp(localTimestamp);
                if (pendingTickerInfo.hasChanged()) {
                    yield pendingTickerInfo.getSnapshot(localTimestamp);
                }
            }
        }
    }
}
exports.DydxV4DerivativeTickerMapper = DydxV4DerivativeTickerMapper;
class DydxV4LiquidationsMapper {
    canHandle(message) {
        return message.channel === 'v4_trades' && message.type === 'channel_data';
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'v4_trades',
                symbols
            }
        ];
    }
    *map(message, localTimestamp) {
        for (let trade of message.contents.trades) {
            if (trade.type === 'LIQUIDATED') {
                yield {
                    type: 'liquidation',
                    symbol: message.id,
                    exchange: 'dydx-v4',
                    id: trade.id,
                    price: Number(trade.price),
                    amount: Number(trade.size),
                    side: trade.side === 'SELL' ? 'sell' : 'buy',
                    timestamp: trade.createdAt ? new Date(trade.createdAt) : localTimestamp,
                    localTimestamp: localTimestamp
                };
            }
        }
    }
}
exports.DydxV4LiquidationsMapper = DydxV4LiquidationsMapper;
//# sourceMappingURL=dydxv4.js.map