tardis-machine
Version:
Locally runnable server with built-in data caching, providing both tick-level historical and consolidated real-time cryptocurrency market data via HTTP and WebSocket APIs
64 lines • 3.12 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.replayNormalizedWS = void 0;
const querystring_1 = __importDefault(require("querystring"));
const tardis_dev_1 = require("tardis-dev");
const debug_1 = require("../debug");
const helpers_1 = require("../helpers");
async function replayNormalizedWS(ws, req) {
let messages;
try {
const startTimestamp = new Date().getTime();
const parsedQuery = querystring_1.default.decode(req.getQuery());
const optionsString = parsedQuery['options'];
const replayNormalizedOptions = JSON.parse(optionsString);
(0, debug_1.debug)('WebSocket /ws-replay-normalized started, options: %o', replayNormalizedOptions);
const options = Array.isArray(replayNormalizedOptions) ? replayNormalizedOptions : [replayNormalizedOptions];
const messagesIterables = options.map((option) => {
// let's map from provided options to options and normalizers that needs to be added for dataTypes provided in options
const messages = (0, tardis_dev_1.replayNormalized)(option, ...(0, helpers_1.getNormalizers)(option.dataTypes));
// separately check if any computables are needed for given dataTypes
const computables = (0, helpers_1.getComputables)(option.dataTypes);
if (computables.length > 0) {
return (0, tardis_dev_1.compute)(messages, ...computables);
}
return messages;
});
const filterByDataType = (0, helpers_1.constructDataTypeFilter)(options);
messages = messagesIterables.length === 1 ? messagesIterables[0] : (0, tardis_dev_1.combine)(...messagesIterables);
for await (const message of messages) {
if (!filterByDataType(message)) {
continue;
}
const success = ws.send(JSON.stringify(message));
// handle backpressure in case of slow clients
if (!success) {
while (ws.getBufferedAmount() > 0) {
await (0, helpers_1.wait)(1);
}
}
}
while (ws.getBufferedAmount() > 0) {
await (0, helpers_1.wait)(100);
}
ws.end(1000, 'WS replay-normalized finished');
const endTimestamp = new Date().getTime();
(0, debug_1.debug)('WebSocket /ws-replay-normalized finished, options: %o, time: %d seconds', replayNormalizedOptions, (endTimestamp - startTimestamp) / 1000);
}
catch (e) {
// this will underlying open WS connections
if (messages !== undefined) {
messages.return();
}
if (!ws.closed) {
ws.end(1011, e.toString());
}
(0, debug_1.debug)('WebSocket /ws-replay-normalized error: %o', e);
console.error('WebSocket /ws-replay-normalized error:', e);
}
}
exports.replayNormalizedWS = replayNormalizedWS;
//# sourceMappingURL=replaynormalized.js.map