jspurefix
Version:
pure node js fix engine
100 lines • 4.25 kB
JavaScript
;
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