jspurefix
Version:
pure node js fix engine
138 lines • 6.51 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FixSessionState = void 0;
const buffer_1 = require("../../buffer");
const moment = require("moment");
const tick_action_1 = require("../tick-action");
const session_state_1 = require("./session-state");
class FixSessionState {
reset(lastPeerMsgSeqNum = 0) {
this.lastReceivedAt = null;
this.LastSentAt = null;
this.lastTestRequestAt = null;
this.secondsSinceLogoutSent = -1;
this.secondsSinceSent = -1;
this.secondsSinceReceive = -1;
this.peerHeartBeatSecs = 0;
this.logoutSentAt = null;
this.nextTickAction = tick_action_1.TickAction.Nothing;
this.lastPeerMsgSeqNum = lastPeerMsgSeqNum;
this.lastHeader = null;
}
constructor({ heartBeat, state = session_state_1.SessionState.Idle, waitLogoutConfirmSeconds = 5, stopSeconds = 2, lastPeerMsgSeqNum = 0 }) {
this.nextTickAction = tick_action_1.TickAction.Nothing;
this.lastReceivedAt = null;
this.LastSentAt = null;
this.lastTestRequestAt = null;
this.logoutSentAt = null;
this.now = new Date();
this.compId = '';
this.peerCompId = '';
this.peerHeartBeatSecs = 0;
this.secondsSinceLogoutSent = -1;
this.secondsSinceSent = -1;
this.secondsSinceReceive = -1;
this.lastHeader = null;
this.heartBeat = heartBeat;
this.state = state;
this.waitLogoutConfirmSeconds = waitLogoutConfirmSeconds;
this.stopSeconds = stopSeconds;
this.lastPeerMsgSeqNum = lastPeerMsgSeqNum;
}
static dateAsString(d) {
if (!d) {
return 'null';
}
return moment(d).format('HH:mm:ss.SSS');
}
lastSentSeqNum() {
var _a, _b;
return (_b = (_a = this === null || this === void 0 ? void 0 : this.lastHeader) === null || _a === void 0 ? void 0 : _a.MsgSeqNum) !== null && _b !== void 0 ? _b : 0;
}
toString() {
const buffer = new buffer_1.ElasticBuffer(1024);
buffer.writeString(`compId = ${this.compId}, `);
buffer.writeString(`heartBeat = ${this.heartBeat}, `);
buffer.writeString(`state = ${session_state_1.SessionState[this.state]} (${this.state}), `);
buffer.writeString(`nextTickAction = ${tick_action_1.TickAction[this.nextTickAction]} (${this.nextTickAction}), `);
buffer.writeString(`now = ${FixSessionState.dateAsString(this.now)}, `);
buffer.writeString(`timeToDie = ${this.timeToDie()}, `);
buffer.writeString(`timeToHeartbeat = ${this.timeToHeartbeat()}, `);
buffer.writeString(`timeToTerminate = ${this.timeToTerminate()}, `);
buffer.writeString(`timeToTestRequest = ${this.timeToTestRequest()}, `);
buffer.writeString(`lastReceivedAt = ${FixSessionState.dateAsString(this.lastReceivedAt)}, `);
buffer.writeString(`LastSentAt = ${FixSessionState.dateAsString(this.LastSentAt)}, `);
buffer.writeString(`lastTestRequestAt = ${FixSessionState.dateAsString(this.lastTestRequestAt)}, `);
buffer.writeString(`logoutSentAt = ${FixSessionState.dateAsString(this.logoutSentAt)}, `);
buffer.writeString(`peerHeartBeatSecs = ${this.peerHeartBeatSecs}, `);
buffer.writeString(`peerCompId = ${this.peerCompId}, `);
buffer.writeString(`lastPeerMsgSeqNum = ${this.lastPeerMsgSeqNum}, `);
buffer.writeString(`LastSentSeqNum = ${this.lastSentSeqNum()}, `);
buffer.writeString(`secondsSinceLogoutSent = ${this.secondsSinceLogoutSent}, `);
buffer.writeString(`secondsSinceSent = ${this.secondsSinceSent}, `);
buffer.writeString(`secondsSinceReceive = ${this.secondsSinceReceive}`);
return buffer.toString();
}
calcAction(now) {
this.now = now;
this.calcState();
switch (this.state) {
case session_state_1.SessionState.PeerLogonRejected: {
if (this.secondsSinceSent >= this.stopSeconds) {
this.nextTickAction = tick_action_1.TickAction.Stop;
}
break;
}
case session_state_1.SessionState.WaitingLogoutConfirm:
case session_state_1.SessionState.ConfirmingLogout: {
if (this.timeToDie()) {
this.nextTickAction = tick_action_1.TickAction.Stop;
}
break;
}
case session_state_1.SessionState.ActiveNormalSession:
case session_state_1.SessionState.AwaitingProcessingResponseToTestRequest:
case session_state_1.SessionState.InitiationLogonReceived:
case session_state_1.SessionState.InitiationLogonResponse: {
if (this.timeToHeartbeat()) {
this.nextTickAction = tick_action_1.TickAction.Heartbeat;
}
else {
if (this.timeToTerminate()) {
this.nextTickAction = tick_action_1.TickAction.TerminateOnError;
}
else if (this.timeToTestRequest()) {
if (!this.lastTestRequestAt) {
this.nextTickAction = tick_action_1.TickAction.TestRequest;
this.lastTestRequestAt = this.now;
}
}
}
break;
}
}
return this.nextTickAction;
}
timeToDie() {
return this.secondsSinceLogoutSent > this.waitLogoutConfirmSeconds ||
this.secondsSinceLogoutSent > this.stopSeconds;
}
timeToHeartbeat() {
return this.secondsSinceSent >= this.heartBeat;
}
timeToTerminate() {
return this.secondsSinceReceive >= 2.5 * this.peerHeartBeatSecs;
}
timeToTestRequest() {
return this.secondsSinceReceive >= 1.5 * this.peerHeartBeatSecs;
}
calcState() {
const time = this.now.getTime();
this.nextTickAction = tick_action_1.TickAction.Nothing;
this.secondsSinceLogoutSent = this.logoutSentAt ? (time - this.logoutSentAt.getTime()) / 1000 : -1;
this.secondsSinceSent = this.LastSentAt != null ? (time - this.LastSentAt.getTime()) / 1000 : 0;
this.secondsSinceReceive = this.lastReceivedAt != null ? (time - this.lastReceivedAt.getTime()) / 1000 : 0;
}
}
exports.FixSessionState = FixSessionState;
//# sourceMappingURL=fix-session-state.js.map