UNPKG

jspurefix

Version:
100 lines 4.25 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FixMsgAsciiStoreResend = void 0; const fix_msg_store_record_1 = require("./fix-msg-store-record"); const types_1 = require("../types"); const buffer_1 = require("../buffer"); const ascii_1 = require("../buffer/ascii"); class FixMsgAsciiStoreResend { constructor(store, config) { this.store = store; this.config = config; this.parser = new ascii_1.AsciiParser(this.config, null, new buffer_1.ElasticBuffer(160 * 1024)); } getResendRequest(startSeq, endSeq) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((resolve, reject) => { this.store.getSeqNumRange(startSeq, endSeq).then(res => { resolve(this.inflateRange(startSeq, endSeq, res)); }).catch(e => { reject(e); }); }); }); } inflateRange(startSeq, endSeq, input) { const toResend = []; if (input.length === 0) { this.gap(startSeq, endSeq + 1, toResend); return toResend; } let expected = startSeq; for (let i = 0; i < input.length; ++i) { const record = this.prepareRecordForRetransmission(input[i]); const seqNum = record.seqNum; const toGap = seqNum - expected; if (toGap > 0) { this.gap(expected, seqNum, toResend); } expected = seqNum + 1; if (record.encoded) { this.inflate(record); } toResend.push(record); } if (endSeq - expected > 0) { this.gap(expected, endSeq + 1, toResend); } return toResend; } gap(beginGap, newSeq, arr) { if (beginGap > 0) { arr.push(this.sequenceResetGap(beginGap, newSeq)); } } inflate(record) { if (record.obj) return; if (!record.encoded) return; const parser = this.parser; parser.on('error', (_) => { record.obj = null; }); parser.on('msg', (view) => { record.obj = view.toObject(); }); parser.parseText(record.encoded); } sequenceResetGap(startGap, newSeq) { const factory = this.config.factory; const gapFill = factory === null || factory === void 0 ? void 0 : factory.sequenceReset(newSeq, true); gapFill.StandardHeader = factory === null || factory === void 0 ? void 0 : factory.header(types_1.MsgType.SequenceReset, startGap); gapFill.StandardHeader.PossDupFlag = true; return new fix_msg_store_record_1.FixMsgStoreRecord(types_1.MsgType.SequenceReset, new Date(), startGap, gapFill, null); } prepareRecordForRetransmission(originalRecord) { const retransmitted = originalRecord.clone(); const factory = this.config.factory; if (!retransmitted.obj) { retransmitted.obj = {}; } const header = factory === null || factory === void 0 ? void 0 : factory.header(retransmitted.msgType, retransmitted.seqNum, new Date(), { PossDupFlag: true, OrigSendingTime: retransmitted.timestamp }); retransmitted.obj = Object.assign(Object.assign({}, retransmitted.obj), { StandardHeader: header }); return retransmitted; } } exports.FixMsgAsciiStoreResend = FixMsgAsciiStoreResend; //# sourceMappingURL=fix-msg-ascii-store-resend.js.map