tardis-dev
Version: 
Convenient access to tick-level historical and real-time cryptocurrency market data via Node.js
172 lines • 6.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GateIOFuturesBookTickerMapper = exports.GateIOFuturesDerivativeTickerMapper = exports.GateIOFuturesBookChangeMapper = exports.GateIOFuturesTradesMapper = void 0;
const handy_1 = require("../handy");
const mapper_1 = require("./mapper");
// https://www.gate.io/docs/futures/ws/index.html
class GateIOFuturesTradesMapper {
    constructor(_exchange) {
        this._exchange = _exchange;
    }
    canHandle(message) {
        return message.channel === 'futures.trades' && message.event === 'update';
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'trades',
                symbols
            }
        ];
    }
    *map(tradesMessage, localTimestamp) {
        for (const trade of tradesMessage.result) {
            const timestamp = trade.create_time_ms !== undefined ? new Date(trade.create_time_ms) : new Date(trade.create_time * 1000);
            yield {
                type: 'trade',
                symbol: trade.contract,
                exchange: this._exchange,
                id: trade.id.toString(),
                price: Number(trade.price),
                amount: Math.abs(trade.size),
                side: trade.size < 0 ? 'sell' : 'buy',
                timestamp,
                localTimestamp: localTimestamp
            };
        }
    }
}
exports.GateIOFuturesTradesMapper = GateIOFuturesTradesMapper;
const mapBookLevel = (level) => {
    const price = Number(level.p);
    return { price, amount: Math.abs(level.s) };
};
class GateIOFuturesBookChangeMapper {
    constructor(_exchange) {
        this._exchange = _exchange;
    }
    canHandle(message) {
        return message.channel === 'futures.order_book' && (message.event === 'all' || message.event === 'update');
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'order_book',
                symbols
            }
        ];
    }
    *map(depthMessage, localTimestamp) {
        if (depthMessage.event === 'all') {
            if (depthMessage.result.t === 0) {
                return;
            }
            const timestamp = depthMessage.result.t !== undefined ? new Date(depthMessage.result.t) : new Date(depthMessage.time * 1000);
            // snapshot
            yield {
                type: 'book_change',
                symbol: depthMessage.result.contract,
                exchange: this._exchange,
                isSnapshot: true,
                bids: depthMessage.result.bids.map(mapBookLevel),
                asks: depthMessage.result.asks.map(mapBookLevel),
                timestamp,
                localTimestamp: localTimestamp
            };
        }
        else if (depthMessage.result.length > 0) {
            // update
            const timestamp = depthMessage.result[0].t !== undefined ? new Date(depthMessage.result[0].t) : new Date(depthMessage.time * 1000);
            yield {
                type: 'book_change',
                symbol: depthMessage.result[0].c,
                exchange: this._exchange,
                isSnapshot: false,
                bids: depthMessage.result.filter((l) => l.s >= 0).map(mapBookLevel),
                asks: depthMessage.result.filter((l) => l.s <= 0).map(mapBookLevel),
                timestamp,
                localTimestamp: localTimestamp
            };
        }
    }
}
exports.GateIOFuturesBookChangeMapper = GateIOFuturesBookChangeMapper;
class GateIOFuturesDerivativeTickerMapper {
    constructor() {
        this.pendingTickerInfoHelper = new mapper_1.PendingTickerInfoHelper();
    }
    canHandle(message) {
        return message.channel === 'futures.tickers' && message.event === 'update';
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'tickers',
                symbols
            }
        ];
    }
    *map(message, localTimestamp) {
        const tickers = Array.isArray(message.result) ? message.result : [message.result];
        for (const futuresTicker of tickers) {
            if (futuresTicker.contract === undefined) {
                return;
            }
            const timestamp = message.time_ms !== undefined ? new Date(message.time_ms) : new Date(message.time * 1000);
            const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(futuresTicker.contract, 'gate-io-futures');
            pendingTickerInfo.updateFundingRate(Number(futuresTicker.funding_rate));
            pendingTickerInfo.updatePredictedFundingRate(Number(futuresTicker.funding_rate_indicative));
            pendingTickerInfo.updateIndexPrice(Number(futuresTicker.index_price));
            pendingTickerInfo.updateMarkPrice(Number(futuresTicker.mark_price));
            pendingTickerInfo.updateLastPrice(Number(futuresTicker.last));
            pendingTickerInfo.updateTimestamp(timestamp);
            if (futuresTicker.total_size !== undefined) {
                pendingTickerInfo.updateOpenInterest(Number(futuresTicker.total_size));
            }
            if (pendingTickerInfo.hasChanged()) {
                yield pendingTickerInfo.getSnapshot(localTimestamp);
            }
        }
    }
}
exports.GateIOFuturesDerivativeTickerMapper = GateIOFuturesDerivativeTickerMapper;
class GateIOFuturesBookTickerMapper {
    constructor(_exchange) {
        this._exchange = _exchange;
    }
    canHandle(message) {
        return message.channel === 'futures.book_ticker' && message.event === 'update';
    }
    getFilters(symbols) {
        symbols = (0, handy_1.upperCaseSymbols)(symbols);
        return [
            {
                channel: 'book_ticker',
                symbols
            }
        ];
    }
    *map(gateIoFuturesBookTickerMessage, localTimestamp) {
        const gateIoFuturesBookTicker = gateIoFuturesBookTickerMessage.result;
        if (gateIoFuturesBookTicker.t === 0) {
            return;
        }
        const ticker = {
            type: 'book_ticker',
            symbol: gateIoFuturesBookTicker.s,
            exchange: this._exchange,
            askAmount: gateIoFuturesBookTicker.A !== 0 ? gateIoFuturesBookTicker.A : undefined,
            askPrice: gateIoFuturesBookTicker.a !== '' ? Number(gateIoFuturesBookTicker.a) : undefined,
            bidPrice: gateIoFuturesBookTicker.b !== '' ? Number(gateIoFuturesBookTicker.b) : undefined,
            bidAmount: gateIoFuturesBookTicker.B !== 0 ? gateIoFuturesBookTicker.B : undefined,
            timestamp: gateIoFuturesBookTicker.t !== undefined ? new Date(gateIoFuturesBookTicker.t) : localTimestamp,
            localTimestamp: localTimestamp
        };
        yield ticker;
    }
}
exports.GateIOFuturesBookTickerMapper = GateIOFuturesBookTickerMapper;
//# sourceMappingURL=gateiofutures.js.map