jspurefix 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/transport/tcp/recovering-tcp-initiator.js +3 -7
- package/dist/transport/tcp/recovering-tcp-initiator.js.map +1 -1
- package/dist/transport/tcp/tcp-initiator-connector.js +5 -11
- package/dist/transport/tcp/tcp-initiator-connector.js.map +1 -1
- package/dist/transport/tcp/tcp-initiator.js +5 -10
- package/dist/transport/tcp/tcp-initiator.js.map +1 -1
- package/package.json +2 -2
- package/src/transport/tcp/recovering-tcp-initiator.ts +3 -7
- package/src/transport/tcp/tcp-initiator-connector.ts +5 -10
- package/src/transport/tcp/tcp-initiator.ts +5 -10
|
@@ -28,15 +28,11 @@ let RecoveringTcpInitiator = class RecoveringTcpInitiator extends fix_entity_1.F
|
|
|
28
28
|
this.application = this.jsFixConfig.description.application;
|
|
29
29
|
this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:RecoveringTcpInitiator`);
|
|
30
30
|
if (!this.application) {
|
|
31
|
-
|
|
32
|
-
this.logger.error(e);
|
|
33
|
-
throw e;
|
|
31
|
+
throw new Error(`no application in session description.`);
|
|
34
32
|
}
|
|
35
33
|
this.tcp = this.application.tcp;
|
|
36
34
|
if (!this.tcp) {
|
|
37
|
-
|
|
38
|
-
this.logger.error(e);
|
|
39
|
-
throw e;
|
|
35
|
+
throw new Error(`no tcp in session description need tcp { host: hostname, port: port }`);
|
|
40
36
|
}
|
|
41
37
|
this.createSession(jsFixConfig);
|
|
42
38
|
}
|
|
@@ -75,7 +71,7 @@ let RecoveringTcpInitiator = class RecoveringTcpInitiator extends fix_entity_1.F
|
|
|
75
71
|
}
|
|
76
72
|
}).catch(e => {
|
|
77
73
|
this.logger.info(`transport id ${(transport.id)} failed - session state ${session.getState()}`);
|
|
78
|
-
this.logger.
|
|
74
|
+
this.logger.warning(e.message);
|
|
79
75
|
this.recover();
|
|
80
76
|
});
|
|
81
77
|
this.logger.info(`running session with transport ${transport.id} state = ${session.getState()}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovering-tcp-initiator.js","sourceRoot":"","sources":["../../../src/transport/tcp/recovering-tcp-initiator.ts"],"names":[],"mappings":"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","sourcesContent":["import { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { FixSession } from '../session/fix-session'\r\nimport { TcpInitiator } from './tcp-initiator'\r\nimport { MsgTransport } from '../factory'\r\nimport Timeout = NodeJS.Timeout\r\nimport { SessionState } from '../session/session-state'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { ITcpTransportDescription } from './tcp-transport-description'\r\nimport { IMsgApplication } from '../msg-application'\r\nimport { FixEntity } from '../fix-entity'\r\n\r\n/*\r\n create one application session instance - and recover a lost transport. Hence the application\r\n will automatically re-connected and the \"message recovery\" policy enacted i.e. replay from\r\n last known sequence number or sequence reset.\r\n */\r\n\r\n@injectable()\r\nexport class RecoveringTcpInitiator extends FixEntity {\r\n public tcp: ITcpTransportDescription\r\n public session: FixSession\r\n private readonly logger: IJsFixLogger\r\n private application: IMsgApplication\r\n private initiator: TcpInitiator\r\n private transport: MsgTransport\r\n private th: Timeout = null\r\n public recoveryAttemptSecs: number = 5\r\n public backoffFailConnectSecs: number = 30\r\n\r\n constructor (@inject(DITokens.IJsFixConfig) public readonly jsFixConfig: IJsFixConfig) {\r\n super(jsFixConfig)\r\n this.application = this.jsFixConfig.description.application\r\n this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:RecoveringTcpInitiator`)\r\n if (!this.application) {\r\n const e: Error = new Error(`no application in session description.`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n this.tcp = this.application.tcp\r\n if (!this.tcp) {\r\n const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n this.createSession(jsFixConfig)\r\n }\r\n\r\n private createSession (jsFixConfig: IJsFixConfig) {\r\n this.logger.info(`creating an application session with DI token ${DITokens.FixSession}.`)\r\n this.session = jsFixConfig.sessionContainer.resolve<FixSession>(DITokens.FixSession)\r\n this.session.on('done', () => {\r\n this.logger.info('session has permanently ended')\r\n this.emit('end', this)\r\n })\r\n this.session.on('end', () => {\r\n this.logger.info('session has permanently ended')\r\n this.emit('end', this)\r\n })\r\n this.session.setState(SessionState.DisconnectedNoConnectionToday)\r\n }\r\n\r\n public getState (): SessionState {\r\n return this.session.getState()\r\n }\r\n\r\n private newTransport (transport: MsgTransport) {\r\n this.transport = transport\r\n this.emit('transport', transport)\r\n this.logger.info(`initiator connects id ${(transport.id)}`)\r\n const session = this.session\r\n if (this.jsFixConfig.description.ResetSeqNumFlag) {\r\n this.logger.info('reset sequence numbers')\r\n session.reset()\r\n }\r\n session.setState(SessionState.NetworkConnectionEstablished)\r\n session.run(transport).then((id: number) => {\r\n if (!transport || id === transport.id) {\r\n this.emit('end', this)\r\n } else {\r\n this.logger.info(`old transport ${id} ends waiting on ${(transport.id)}`)\r\n }\r\n }).catch(e => {\r\n this.logger.info(`transport id ${(transport.id)} failed - session state ${session.getState()}`)\r\n this.logger.error(e.message)\r\n this.recover()\r\n })\r\n this.logger.info(`running session with transport ${transport.id} state = ${session.getState()}`)\r\n }\r\n\r\n private clearTimer () {\r\n if (this.th) {\r\n clearTimeout(this.th)\r\n this.th = null\r\n }\r\n }\r\n\r\n // at least one connection was established so retry to establish - either\r\n // succeed in which case can restart session or fails in which case wait and\r\n // restart an attempt to connect\r\n\r\n private recover (): void {\r\n this.session.setState(SessionState.DetectBrokenNetworkConnection)\r\n this.logger.info(`recover session transport - attempt in ${this.recoveryAttemptSecs} secs`)\r\n this.th = setTimeout(() => {\r\n this.connect(60).then(t => {\r\n this.logger.info(`new transport ${t.id}`)\r\n }).catch((e) => {\r\n this.logger.info(`failed to re-connect ${e.message} - backoff for ${this.backoffFailConnectSecs}`)\r\n this.th = setTimeout(() => {\r\n this.logger.info('returning to recover()')\r\n this.recover()\r\n }, this.backoffFailConnectSecs * 1000)\r\n })\r\n },this.recoveryAttemptSecs * 1000)\r\n }\r\n\r\n public start (): Promise<any> {\r\n return this.run()\r\n }\r\n\r\n // for first connection - reject if no initial connection established within timeout\r\n // once connection established, will not resolve until session is ended - i.e. lost\r\n // connections are re-established using the same session instance.\r\n\r\n public run (initialTimeout: number = 60): Promise<any> {\r\n return new Promise<any>((resolve, reject) => {\r\n this.connect(initialTimeout).then(() => {\r\n this.on('end', () => {\r\n this.clearTimer()\r\n this.initiator.end()\r\n this.logger.info(`run: transport ${this.transport.id} gracefully ends ${initialTimeout} - resolving`)\r\n resolve(null)\r\n })\r\n }).catch(e => {\r\n this.logger.info(`run: failed to connect to first transport ${initialTimeout} - rejecting`)\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n // return a promise for new transport - or reject if no connection within timeout\r\n\r\n private connect (timeout: number): Promise<MsgTransport> {\r\n return new Promise<MsgTransport>((resolve, reject) => {\r\n this.logger.info(`connect: start initiator timeout ${timeout}`)\r\n this.session.setState(SessionState.InitiateConnection)\r\n this.initiator = new TcpInitiator(this.jsFixConfig)\r\n this.initiator.connect(timeout).then((transport: MsgTransport) => {\r\n this.logger.info(`connect: receive new transport ${transport.id}`)\r\n this.newTransport(transport)\r\n resolve(transport)\r\n }).catch(e => {\r\n this.logger.info(`connect: failed to connect within ${timeout} - rejecting`)\r\n this.session.setState(SessionState.DetectBrokenNetworkConnection)\r\n reject(e)\r\n })\r\n })\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"recovering-tcp-initiator.js","sourceRoot":"","sources":["../../../src/transport/tcp/recovering-tcp-initiator.ts"],"names":[],"mappings":"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","sourcesContent":["import { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { FixSession } from '../session/fix-session'\r\nimport { TcpInitiator } from './tcp-initiator'\r\nimport { MsgTransport } from '../factory'\r\nimport Timeout = NodeJS.Timeout\r\nimport { SessionState } from '../session/session-state'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { ITcpTransportDescription } from './tcp-transport-description'\r\nimport { IMsgApplication } from '../msg-application'\r\nimport { FixEntity } from '../fix-entity'\r\n\r\n/*\r\n create one application session instance - and recover a lost transport. Hence the application\r\n will automatically re-connected and the \"message recovery\" policy enacted i.e. replay from\r\n last known sequence number or sequence reset.\r\n */\r\n\r\n@injectable()\r\nexport class RecoveringTcpInitiator extends FixEntity {\r\n public tcp: ITcpTransportDescription\r\n public session: FixSession\r\n private readonly logger: IJsFixLogger\r\n private application: IMsgApplication\r\n private initiator: TcpInitiator\r\n private transport: MsgTransport\r\n private th: Timeout = null\r\n public recoveryAttemptSecs: number = 5\r\n public backoffFailConnectSecs: number = 30\r\n\r\n constructor (@inject(DITokens.IJsFixConfig) public readonly jsFixConfig: IJsFixConfig) {\r\n super(jsFixConfig)\r\n this.application = this.jsFixConfig.description.application\r\n this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:RecoveringTcpInitiator`)\r\n if (!this.application) {\r\n throw new Error(`no application in session description.`)\r\n }\r\n this.tcp = this.application.tcp\r\n if (!this.tcp) {\r\n throw new Error(`no tcp in session description need tcp { host: hostname, port: port }`)\r\n }\r\n this.createSession(jsFixConfig)\r\n }\r\n\r\n private createSession (jsFixConfig: IJsFixConfig) {\r\n this.logger.info(`creating an application session with DI token ${DITokens.FixSession}.`)\r\n this.session = jsFixConfig.sessionContainer.resolve<FixSession>(DITokens.FixSession)\r\n this.session.on('done', () => {\r\n this.logger.info('session has permanently ended')\r\n this.emit('end', this)\r\n })\r\n this.session.on('end', () => {\r\n this.logger.info('session has permanently ended')\r\n this.emit('end', this)\r\n })\r\n this.session.setState(SessionState.DisconnectedNoConnectionToday)\r\n }\r\n\r\n public getState (): SessionState {\r\n return this.session.getState()\r\n }\r\n\r\n private newTransport (transport: MsgTransport) {\r\n this.transport = transport\r\n this.emit('transport', transport)\r\n this.logger.info(`initiator connects id ${(transport.id)}`)\r\n const session = this.session\r\n if (this.jsFixConfig.description.ResetSeqNumFlag) {\r\n this.logger.info('reset sequence numbers')\r\n session.reset()\r\n }\r\n session.setState(SessionState.NetworkConnectionEstablished)\r\n session.run(transport).then((id: number) => {\r\n if (!transport || id === transport.id) {\r\n this.emit('end', this)\r\n } else {\r\n this.logger.info(`old transport ${id} ends waiting on ${(transport.id)}`)\r\n }\r\n }).catch(e => {\r\n this.logger.info(`transport id ${(transport.id)} failed - session state ${session.getState()}`)\r\n this.logger.warning(e.message)\r\n this.recover()\r\n })\r\n this.logger.info(`running session with transport ${transport.id} state = ${session.getState()}`)\r\n }\r\n\r\n private clearTimer () {\r\n if (this.th) {\r\n clearTimeout(this.th)\r\n this.th = null\r\n }\r\n }\r\n\r\n // at least one connection was established so retry to establish - either\r\n // succeed in which case can restart session or fails in which case wait and\r\n // restart an attempt to connect\r\n\r\n private recover (): void {\r\n this.session.setState(SessionState.DetectBrokenNetworkConnection)\r\n this.logger.info(`recover session transport - attempt in ${this.recoveryAttemptSecs} secs`)\r\n this.th = setTimeout(() => {\r\n this.connect(60).then(t => {\r\n this.logger.info(`new transport ${t.id}`)\r\n }).catch((e) => {\r\n this.logger.info(`failed to re-connect ${e.message} - backoff for ${this.backoffFailConnectSecs}`)\r\n this.th = setTimeout(() => {\r\n this.logger.info('returning to recover()')\r\n this.recover()\r\n }, this.backoffFailConnectSecs * 1000)\r\n })\r\n },this.recoveryAttemptSecs * 1000)\r\n }\r\n\r\n public start (): Promise<any> {\r\n return this.run()\r\n }\r\n\r\n // for first connection - reject if no initial connection established within timeout\r\n // once connection established, will not resolve until session is ended - i.e. lost\r\n // connections are re-established using the same session instance.\r\n\r\n public run (initialTimeout: number = 60): Promise<any> {\r\n return new Promise<any>((resolve, reject) => {\r\n this.connect(initialTimeout).then(() => {\r\n this.on('end', () => {\r\n this.clearTimer()\r\n this.initiator.end()\r\n this.logger.info(`run: transport ${this.transport.id} gracefully ends ${initialTimeout} - resolving`)\r\n resolve(null)\r\n })\r\n }).catch(e => {\r\n this.logger.info(`run: failed to connect to first transport ${initialTimeout} - rejecting`)\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n // return a promise for new transport - or reject if no connection within timeout\r\n\r\n private connect (timeout: number): Promise<MsgTransport> {\r\n return new Promise<MsgTransport>((resolve, reject) => {\r\n this.logger.info(`connect: start initiator timeout ${timeout}`)\r\n this.session.setState(SessionState.InitiateConnection)\r\n this.initiator = new TcpInitiator(this.jsFixConfig)\r\n this.initiator.connect(timeout).then((transport: MsgTransport) => {\r\n this.logger.info(`connect: receive new transport ${transport.id}`)\r\n this.newTransport(transport)\r\n resolve(transport)\r\n }).catch(e => {\r\n this.logger.info(`connect: failed to connect within ${timeout} - rejecting`)\r\n this.session.setState(SessionState.DetectBrokenNetworkConnection)\r\n reject(e)\r\n })\r\n })\r\n }\r\n}\r\n"]}
|
|
@@ -76,17 +76,11 @@ let TcpInitiatorConnector = class TcpInitiatorConnector extends fix_entity_1.Fix
|
|
|
76
76
|
const logger = this.config.logFactory.logger('initiator');
|
|
77
77
|
const initiator = this.config.sessionContainer.resolve(tcp_initiator_1.TcpInitiator);
|
|
78
78
|
logger.info('connecting ...');
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
catch (e) {
|
|
87
|
-
logger.error(e);
|
|
88
|
-
throw e;
|
|
89
|
-
}
|
|
79
|
+
const initiatorTransport = yield initiator.connect(22);
|
|
80
|
+
logger.info('... connected, run session');
|
|
81
|
+
yield initiatorSession.run(initiatorTransport);
|
|
82
|
+
logger.info('ends');
|
|
83
|
+
return true;
|
|
90
84
|
});
|
|
91
85
|
}
|
|
92
86
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp-initiator-connector.js","sourceRoot":"","sources":["../../../src/transport/tcp/tcp-initiator-connector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAEA,mDAA8C;AAG9C,uCAA6C;AAC7C,uDAAkD;AAClD,8CAAyC;AAGzC,IAAa,qBAAqB,GAAlC,MAAa,qBAAsB,SAAQ,sBAAS;IAClD,YAA4D,MAAoB;QAC9E,KAAK,CAAC,MAAM,CAAC,CAAA;QAD6C,WAAM,GAAN,MAAM,CAAc;IAEhF,CAAC;IACD,KAAK,CAAE,mBAA2B,CAAC;QACjC,OAAO,IAAI,OAAO,CAAM,CAAO,MAAM,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAA;YACrD,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oBAAQ,CAAC,UAAU,CAAC,EAAE;gBACvD,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,oBAAQ,CAAC,UAAU,oBAAoB,CAAC,CAAC,CAAA;aACpG;YACD,MAAM,CAAC,IAAI,CAAC,gCAAgC,oBAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;YAClE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAa,oBAAQ,CAAC,UAAU,CAAC,CAAA;YAClF,IAAI,UAAU,GAAY,IAAI,CAAA;YAC9B,OAAO,UAAU,EAAE;gBACjB,IAAI;oBACF,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;oBACpC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;oBAChC,UAAU,GAAG,KAAK,CAAA;oBAClB,MAAM,CAAC,IAAI,CAAC,CAAA;iBACb;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,CAAC,gBAAgB,EAAE;wBACrB,UAAU,GAAG,KAAK,CAAA;wBAClB,MAAM,CAAC,CAAC,CAAC,CAAA;qBACV;yBAAM;wBACL,MAAM,CAAC,IAAI,CAAC,WAAW,gBAAgB,+BAA+B,CAAC,CAAA;wBACvE,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;qBACnC;iBACF;aACF;QACH,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAE,CAAS;QACd,OAAO,IAAI,OAAO,CAAM,CAAC,MAAM,EAAE,EAAE;YACjC,IAAI,CAAC,CAAC,EAAE;gBACN,MAAM,CAAC,IAAI,CAAC,CAAA;aACb;YACD,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,IAAI,CAAC,CAAA;YACd,CAAC,EAAE,CAAC,CAAC,CAAA;QACP,CAAC,CAAC,CAAA;IACJ,CAAC;IAEK,OAAO,CAAE,gBAA4B;;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACzD,MAAM,SAAS,GAAiB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAe,4BAAY,CAAC,CAAA;YAChG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC7B,
|
|
1
|
+
{"version":3,"file":"tcp-initiator-connector.js","sourceRoot":"","sources":["../../../src/transport/tcp/tcp-initiator-connector.ts"],"names":[],"mappings":"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","sourcesContent":["import { IJsFixConfig } from '../../config'\r\nimport { FixInitiator } from '../fix-initiator'\r\nimport { TcpInitiator } from './tcp-initiator'\r\nimport { MsgTransport } from '../factory'\r\nimport { FixSession } from '../session/fix-session'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { FixEntity } from '../fix-entity'\r\n\r\n@injectable()\r\nexport class TcpInitiatorConnector extends FixEntity {\r\n constructor (@inject(DITokens.IJsFixConfig) public readonly config: IJsFixConfig) {\r\n super(config)\r\n }\r\n start (reconnectTimeout: number = 0): Promise<any> {\r\n return new Promise<any>(async (accept, reject) => {\r\n const logger = this.config.logFactory.logger('initiator')\r\n const sessionContainer = this.config.sessionContainer\r\n if (!sessionContainer.isRegistered(DITokens.FixSession)) {\r\n reject(new Error(`application must register a DI token '${DITokens.FixSession}' - see src/sample`))\r\n }\r\n logger.info(`create session with DI Token ${DITokens.FixSession}`)\r\n const initiatorSession = sessionContainer.resolve<FixSession>(DITokens.FixSession)\r\n let connecting: boolean = true\r\n while (connecting) {\r\n try {\r\n await this.connect(initiatorSession)\r\n logger.info('session has ended')\r\n connecting = false\r\n accept(true)\r\n } catch (e) {\r\n if (!reconnectTimeout) {\r\n connecting = false\r\n reject(e)\r\n } else {\r\n logger.info(`waiting ${reconnectTimeout} to reconnect following error`)\r\n await this.delay(reconnectTimeout)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n delay (p: number): Promise<any> {\r\n return new Promise<any>((accept) => {\r\n if (!p) {\r\n accept(true)\r\n }\r\n setTimeout(() => {\r\n accept(true)\r\n }, p)\r\n })\r\n }\r\n\r\n async connect (initiatorSession: FixSession): Promise<any> {\r\n const logger = this.config.logFactory.logger('initiator')\r\n const initiator: FixInitiator = this.config.sessionContainer.resolve<FixInitiator>(TcpInitiator)\r\n logger.info('connecting ...')\r\n const initiatorTransport: MsgTransport = await initiator.connect(22)\r\n logger.info('... connected, run session')\r\n await initiatorSession.run(initiatorTransport)\r\n logger.info('ends')\r\n return true\r\n }\r\n}\r\n"]}
|
|
@@ -46,15 +46,11 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
|
|
|
46
46
|
this.th = null;
|
|
47
47
|
this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`);
|
|
48
48
|
if (!this.application) {
|
|
49
|
-
|
|
50
|
-
this.logger.error(e);
|
|
51
|
-
throw e;
|
|
49
|
+
throw new Error(`no application in session description.`);
|
|
52
50
|
}
|
|
53
51
|
this.tcp = this.application.tcp;
|
|
54
52
|
if (!this.tcp) {
|
|
55
|
-
|
|
56
|
-
this.logger.error(e);
|
|
57
|
-
throw e;
|
|
53
|
+
throw new Error(`no tcp in session description need tcp { host: hostname, port: port }`);
|
|
58
54
|
}
|
|
59
55
|
}
|
|
60
56
|
end() {
|
|
@@ -82,7 +78,6 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
|
|
|
82
78
|
this.tryConnect()
|
|
83
79
|
.then((t) => resolve(t))
|
|
84
80
|
.catch((e) => {
|
|
85
|
-
this.logger.error(e);
|
|
86
81
|
this.repeatConnect(timeoutSeconds)
|
|
87
82
|
.then((t) => resolve(t))
|
|
88
83
|
.catch((e) => reject(e));
|
|
@@ -182,6 +177,7 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
|
|
|
182
177
|
const promisify = util.promisify;
|
|
183
178
|
const timeoutPromise = promisify(setTimeout);
|
|
184
179
|
let retries = 0;
|
|
180
|
+
let lastError;
|
|
185
181
|
this.th = setInterval(() => {
|
|
186
182
|
++retries;
|
|
187
183
|
this.tryConnect()
|
|
@@ -190,17 +186,16 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
|
|
|
190
186
|
this.clearTimer();
|
|
191
187
|
resolve(t);
|
|
192
188
|
}).catch((e) => {
|
|
189
|
+
lastError = e;
|
|
193
190
|
this.logger.info(`${application.name}: retries ${retries} ${e.message}`);
|
|
194
191
|
});
|
|
195
192
|
}, application.reconnectSeconds * 1000);
|
|
196
193
|
timeoutPromise(timeoutSeconds * 1000).then(() => {
|
|
197
194
|
this.clearTimer();
|
|
198
195
|
this.state = InitiatorState.Stopped;
|
|
199
|
-
const e = new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`);
|
|
200
|
-
this.logger.warning(`repeatConnect reject with message ${e.message}`);
|
|
196
|
+
const e = lastError !== null && lastError !== void 0 ? lastError : new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`);
|
|
201
197
|
reject(e);
|
|
202
198
|
}).catch(e => {
|
|
203
|
-
this.logger.error(e);
|
|
204
199
|
reject(e);
|
|
205
200
|
});
|
|
206
201
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp-initiator.js","sourceRoot":"","sources":["../../../src/transport/tcp/tcp-initiator.ts"],"names":[],"mappings":"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","sourcesContent":["\r\nimport { FixInitiator } from '../fix-initiator'\r\nimport { MsgTransport } from '../factory'\r\n\r\nimport { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { TcpDuplex, FixDuplex } from '../duplex'\r\n\r\nimport * as util from 'util'\r\nimport { connect as tlsConnect, ConnectionOptions, TLSSocket } from 'tls'\r\nimport { createConnection } from 'net'\r\nimport Timeout = NodeJS.Timeout\r\nimport { TlsOptionsFactory } from './tls-options-factory'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { ITcpTransportDescription } from './tcp-transport-description'\r\n\r\nexport enum InitiatorState {\r\n Idle = 1,\r\n Connecting = 2,\r\n Connected = 3,\r\n Stopped = 4\r\n}\r\n\r\n@injectable()\r\nexport class TcpInitiator extends FixInitiator {\r\n public tcp: ITcpTransportDescription\r\n public state: InitiatorState = InitiatorState.Idle\r\n private readonly logger: IJsFixLogger\r\n private duplex: FixDuplex\r\n private th: Timeout = null\r\n\r\n constructor (@inject(DITokens.IJsFixConfig) public readonly jsFixConfig: IJsFixConfig) {\r\n super(jsFixConfig.description.application)\r\n this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`)\r\n if (!this.application) {\r\n const e: Error = new Error(`no application in session description.`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n this.tcp = this.application.tcp\r\n if (!this.tcp) {\r\n const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n }\r\n\r\n public end (): void {\r\n this.clearTimer()\r\n switch (this.state) {\r\n case InitiatorState.Connected: {\r\n this.logger.info('end')\r\n this.duplex.end()\r\n this.state = InitiatorState.Stopped\r\n break\r\n }\r\n\r\n default: {\r\n this.logger.info(`end :state ${this.state}`)\r\n this.state = InitiatorState.Stopped\r\n break\r\n }\r\n }\r\n }\r\n\r\n public connect (timeoutSeconds: number): Promise<MsgTransport> {\r\n return new Promise<MsgTransport>(async (resolve, reject) => {\r\n switch (this.state) {\r\n case InitiatorState.Idle: {\r\n this.state = InitiatorState.Connecting\r\n this.logger.info(`connecting with timeout ${timeoutSeconds}`)\r\n this.tryConnect()\r\n .then((t: MsgTransport) => resolve(t))\r\n .catch((e: Error) => {\r\n this.logger.error(e)\r\n this.repeatConnect(timeoutSeconds)\r\n .then((t: MsgTransport) => resolve(t))\r\n .catch((e: Error) => reject(e))\r\n })\r\n break\r\n }\r\n\r\n default:\r\n const e: Error = new Error(`connect not valid from non idle state`)\r\n this.logger.warning(`rejecting from state ${this.state}`)\r\n reject(e)\r\n }\r\n })\r\n }\r\n\r\n private unsecureDuplex (): Promise<TcpDuplex> {\r\n const tcp = this.tcp\r\n return new Promise<TcpDuplex>((resolve, reject) => {\r\n try {\r\n this.logger.info(`unsecureDuplex try to connect to endPoint`)\r\n const socket = createConnection(tcp, () => {\r\n try {\r\n this.logger.info(`net.createConnection cb, resolving`)\r\n const tcpDuplex = new TcpDuplex(socket)\r\n resolve(tcpDuplex)\r\n } catch (e) {\r\n reject(e)\r\n }\r\n })\r\n socket.on('error', (err) => {\r\n reject(err)\r\n })\r\n } catch (e) {\r\n reject(e)\r\n }\r\n })\r\n }\r\n\r\n private tlsDuplex (): Promise < TcpDuplex > {\r\n return new Promise<TcpDuplex>((resolve, reject) => {\r\n let tlsSocket: TLSSocket = null\r\n const tcp = this.tcp\r\n const connectionOptions: ConnectionOptions = TlsOptionsFactory.getTlsConnectionOptions(tcp)\r\n if (connectionOptions) {\r\n try {\r\n tlsSocket = tlsConnect(connectionOptions, () => {\r\n this.logger.info(`client connected ${tlsSocket.authorized ? 'authorized' : 'unauthorized'}`)\r\n if (!tlsSocket.authorized) {\r\n const error = tlsSocket.authorizationError\r\n this.logger.warning(`rejecting from state ${this.state} authorizationError ${error}`)\r\n tlsSocket.end()\r\n reject(error)\r\n } else {\r\n tlsSocket.setEncoding('utf8')\r\n const tlsDuplex = new TcpDuplex(tlsSocket)\r\n if (tcp.tls.enableTrace) {\r\n this.logger.info(`enabling tls session trace`)\r\n tlsSocket.enableTrace()\r\n }\r\n this.logger.info(`tlsDuplex resolving`)\r\n resolve(tlsDuplex)\r\n }\r\n })\r\n tlsSocket.on('error', (err) => {\r\n reject(err)\r\n })\r\n } catch (e) {\r\n reject(e)\r\n }\r\n }\r\n })\r\n }\r\n\r\n private tryConnect (): Promise < MsgTransport > {\r\n return new Promise<MsgTransport>((resolve, reject) => {\r\n const tcp = this.tcp\r\n const connectionOptions: ConnectionOptions = TlsOptionsFactory.getTlsConnectionOptions(tcp)\r\n const connector = connectionOptions ? this.tlsDuplex() : this.unsecureDuplex()\r\n this.logger.info(`tryConnect ${tcp.host}:${tcp.port}`)\r\n connector.then(duplex => {\r\n this.duplex = duplex\r\n resolve(new MsgTransport(0, this.jsFixConfig, duplex))\r\n }).catch(e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n public clearTimer () {\r\n if (this .th) {\r\n clearInterval(this.th)\r\n this.th = null\r\n }\r\n }\r\n\r\n private repeatConnect (timeoutSeconds: number): Promise < MsgTransport > {\r\n return new Promise<MsgTransport>(async (resolve, reject) => {\r\n const application = this.application\r\n const promisify = util.promisify\r\n const timeoutPromise = promisify(setTimeout)\r\n let retries = 0\r\n this.th = setInterval(() => {\r\n ++retries\r\n this.tryConnect()\r\n .then((t: MsgTransport) => {\r\n this.state = InitiatorState.Connected\r\n this.clearTimer()\r\n resolve(t)\r\n }).catch((e: Error) => {\r\n this.logger.info(`${application.name}: retries ${retries} ${e.message}`)\r\n })\r\n }, application.reconnectSeconds * 1000)\r\n timeoutPromise(timeoutSeconds * 1000).then(() => {\r\n this.clearTimer()\r\n this.state = InitiatorState.Stopped\r\n const e = new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`)\r\n this.logger.warning(`repeatConnect reject with message ${e.message}`)\r\n reject(e)\r\n }).catch(e => {\r\n this.logger.error(e)\r\n reject(e)\r\n })\r\n })\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"tcp-initiator.js","sourceRoot":"","sources":["../../../src/transport/tcp/tcp-initiator.ts"],"names":[],"mappings":"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","sourcesContent":["\r\nimport { FixInitiator } from '../fix-initiator'\r\nimport { MsgTransport } from '../factory'\r\n\r\nimport { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { TcpDuplex, FixDuplex } from '../duplex'\r\n\r\nimport * as util from 'util'\r\nimport { connect as tlsConnect, ConnectionOptions, TLSSocket } from 'tls'\r\nimport { createConnection } from 'net'\r\nimport Timeout = NodeJS.Timeout\r\nimport { TlsOptionsFactory } from './tls-options-factory'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { ITcpTransportDescription } from './tcp-transport-description'\r\n\r\nexport enum InitiatorState {\r\n Idle = 1,\r\n Connecting = 2,\r\n Connected = 3,\r\n Stopped = 4\r\n}\r\n\r\n@injectable()\r\nexport class TcpInitiator extends FixInitiator {\r\n public tcp: ITcpTransportDescription\r\n public state: InitiatorState = InitiatorState.Idle\r\n private readonly logger: IJsFixLogger\r\n private duplex: FixDuplex\r\n private th: Timeout = null\r\n\r\n constructor (@inject(DITokens.IJsFixConfig) public readonly jsFixConfig: IJsFixConfig) {\r\n super(jsFixConfig.description.application)\r\n this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`)\r\n if (!this.application) {\r\n throw new Error(`no application in session description.`)\r\n }\r\n this.tcp = this.application.tcp\r\n if (!this.tcp) {\r\n throw new Error(`no tcp in session description need tcp { host: hostname, port: port }`)\r\n }\r\n }\r\n\r\n public end (): void {\r\n this.clearTimer()\r\n switch (this.state) {\r\n case InitiatorState.Connected: {\r\n this.logger.info('end')\r\n this.duplex.end()\r\n this.state = InitiatorState.Stopped\r\n break\r\n }\r\n\r\n default: {\r\n this.logger.info(`end :state ${this.state}`)\r\n this.state = InitiatorState.Stopped\r\n break\r\n }\r\n }\r\n }\r\n\r\n public connect (timeoutSeconds: number): Promise<MsgTransport> {\r\n return new Promise<MsgTransport>(async (resolve, reject) => {\r\n switch (this.state) {\r\n case InitiatorState.Idle: {\r\n this.state = InitiatorState.Connecting\r\n this.logger.info(`connecting with timeout ${timeoutSeconds}`)\r\n this.tryConnect()\r\n .then((t: MsgTransport) => resolve(t))\r\n .catch((e: Error) => {\r\n this.repeatConnect(timeoutSeconds)\r\n .then((t: MsgTransport) => resolve(t))\r\n .catch((e: Error) => reject(e))\r\n })\r\n break\r\n }\r\n\r\n default:\r\n const e: Error = new Error(`connect not valid from non idle state`)\r\n this.logger.warning(`rejecting from state ${this.state}`)\r\n reject(e)\r\n }\r\n })\r\n }\r\n\r\n private unsecureDuplex (): Promise<TcpDuplex> {\r\n const tcp = this.tcp\r\n return new Promise<TcpDuplex>((resolve, reject) => {\r\n try {\r\n this.logger.info(`unsecureDuplex try to connect to endPoint`)\r\n const socket = createConnection(tcp, () => {\r\n try {\r\n this.logger.info(`net.createConnection cb, resolving`)\r\n const tcpDuplex = new TcpDuplex(socket)\r\n resolve(tcpDuplex)\r\n } catch (e) {\r\n reject(e)\r\n }\r\n })\r\n socket.on('error', (err) => {\r\n reject(err)\r\n })\r\n } catch (e) {\r\n reject(e)\r\n }\r\n })\r\n }\r\n\r\n private tlsDuplex (): Promise < TcpDuplex > {\r\n return new Promise<TcpDuplex>((resolve, reject) => {\r\n let tlsSocket: TLSSocket = null\r\n const tcp = this.tcp\r\n const connectionOptions: ConnectionOptions = TlsOptionsFactory.getTlsConnectionOptions(tcp)\r\n if (connectionOptions) {\r\n try {\r\n tlsSocket = tlsConnect(connectionOptions, () => {\r\n this.logger.info(`client connected ${tlsSocket.authorized ? 'authorized' : 'unauthorized'}`)\r\n if (!tlsSocket.authorized) {\r\n const error = tlsSocket.authorizationError\r\n this.logger.warning(`rejecting from state ${this.state} authorizationError ${error}`)\r\n tlsSocket.end()\r\n reject(error)\r\n } else {\r\n tlsSocket.setEncoding('utf8')\r\n const tlsDuplex = new TcpDuplex(tlsSocket)\r\n if (tcp.tls.enableTrace) {\r\n this.logger.info(`enabling tls session trace`)\r\n tlsSocket.enableTrace()\r\n }\r\n this.logger.info(`tlsDuplex resolving`)\r\n resolve(tlsDuplex)\r\n }\r\n })\r\n tlsSocket.on('error', (err) => {\r\n reject(err)\r\n })\r\n } catch (e) {\r\n reject(e)\r\n }\r\n }\r\n })\r\n }\r\n\r\n private tryConnect (): Promise < MsgTransport > {\r\n return new Promise<MsgTransport>((resolve, reject) => {\r\n const tcp = this.tcp\r\n const connectionOptions: ConnectionOptions = TlsOptionsFactory.getTlsConnectionOptions(tcp)\r\n const connector = connectionOptions ? this.tlsDuplex() : this.unsecureDuplex()\r\n this.logger.info(`tryConnect ${tcp.host}:${tcp.port}`)\r\n connector.then(duplex => {\r\n this.duplex = duplex\r\n resolve(new MsgTransport(0, this.jsFixConfig, duplex))\r\n }).catch(e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n public clearTimer () {\r\n if (this .th) {\r\n clearInterval(this.th)\r\n this.th = null\r\n }\r\n }\r\n\r\n private repeatConnect (timeoutSeconds: number): Promise < MsgTransport > {\r\n return new Promise<MsgTransport>(async (resolve, reject) => {\r\n const application = this.application\r\n const promisify = util.promisify\r\n const timeoutPromise = promisify(setTimeout)\r\n let retries = 0\r\n let lastError: Error\r\n this.th = setInterval(() => {\r\n ++retries\r\n this.tryConnect()\r\n .then((t: MsgTransport) => {\r\n this.state = InitiatorState.Connected\r\n this.clearTimer()\r\n resolve(t)\r\n }).catch((e: Error) => {\r\n lastError = e\r\n this.logger.info(`${application.name}: retries ${retries} ${e.message}`)\r\n })\r\n }, application.reconnectSeconds * 1000)\r\n timeoutPromise(timeoutSeconds * 1000).then(() => {\r\n this.clearTimer()\r\n this.state = InitiatorState.Stopped\r\n const e = lastError ?? new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`)\r\n reject(e)\r\n }).catch(e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jspurefix",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "pure node js fix engine",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"@types/lodash": "^4.14.182",
|
|
88
88
|
"@types/mathjs": "^9.4.1",
|
|
89
89
|
"@types/minimist": "^1.2.2",
|
|
90
|
-
"@types/node": "^18.
|
|
90
|
+
"@types/node": "^18.7.1",
|
|
91
91
|
"@types/request-promise-native": "^1.0.18",
|
|
92
92
|
"@types/sax": "^1.2.4",
|
|
93
93
|
"@types/uuid": "^8.3.4",
|
|
@@ -33,15 +33,11 @@ export class RecoveringTcpInitiator extends FixEntity {
|
|
|
33
33
|
this.application = this.jsFixConfig.description.application
|
|
34
34
|
this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:RecoveringTcpInitiator`)
|
|
35
35
|
if (!this.application) {
|
|
36
|
-
|
|
37
|
-
this.logger.error(e)
|
|
38
|
-
throw e
|
|
36
|
+
throw new Error(`no application in session description.`)
|
|
39
37
|
}
|
|
40
38
|
this.tcp = this.application.tcp
|
|
41
39
|
if (!this.tcp) {
|
|
42
|
-
|
|
43
|
-
this.logger.error(e)
|
|
44
|
-
throw e
|
|
40
|
+
throw new Error(`no tcp in session description need tcp { host: hostname, port: port }`)
|
|
45
41
|
}
|
|
46
42
|
this.createSession(jsFixConfig)
|
|
47
43
|
}
|
|
@@ -82,7 +78,7 @@ export class RecoveringTcpInitiator extends FixEntity {
|
|
|
82
78
|
}
|
|
83
79
|
}).catch(e => {
|
|
84
80
|
this.logger.info(`transport id ${(transport.id)} failed - session state ${session.getState()}`)
|
|
85
|
-
this.logger.
|
|
81
|
+
this.logger.warning(e.message)
|
|
86
82
|
this.recover()
|
|
87
83
|
})
|
|
88
84
|
this.logger.info(`running session with transport ${transport.id} state = ${session.getState()}`)
|
|
@@ -56,15 +56,10 @@ export class TcpInitiatorConnector extends FixEntity {
|
|
|
56
56
|
const logger = this.config.logFactory.logger('initiator')
|
|
57
57
|
const initiator: FixInitiator = this.config.sessionContainer.resolve<FixInitiator>(TcpInitiator)
|
|
58
58
|
logger.info('connecting ...')
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return true
|
|
65
|
-
} catch (e) {
|
|
66
|
-
logger.error(e)
|
|
67
|
-
throw e
|
|
68
|
-
}
|
|
59
|
+
const initiatorTransport: MsgTransport = await initiator.connect(22)
|
|
60
|
+
logger.info('... connected, run session')
|
|
61
|
+
await initiatorSession.run(initiatorTransport)
|
|
62
|
+
logger.info('ends')
|
|
63
|
+
return true
|
|
69
64
|
}
|
|
70
65
|
}
|
|
@@ -33,15 +33,11 @@ export class TcpInitiator extends FixInitiator {
|
|
|
33
33
|
super(jsFixConfig.description.application)
|
|
34
34
|
this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`)
|
|
35
35
|
if (!this.application) {
|
|
36
|
-
|
|
37
|
-
this.logger.error(e)
|
|
38
|
-
throw e
|
|
36
|
+
throw new Error(`no application in session description.`)
|
|
39
37
|
}
|
|
40
38
|
this.tcp = this.application.tcp
|
|
41
39
|
if (!this.tcp) {
|
|
42
|
-
|
|
43
|
-
this.logger.error(e)
|
|
44
|
-
throw e
|
|
40
|
+
throw new Error(`no tcp in session description need tcp { host: hostname, port: port }`)
|
|
45
41
|
}
|
|
46
42
|
}
|
|
47
43
|
|
|
@@ -72,7 +68,6 @@ export class TcpInitiator extends FixInitiator {
|
|
|
72
68
|
this.tryConnect()
|
|
73
69
|
.then((t: MsgTransport) => resolve(t))
|
|
74
70
|
.catch((e: Error) => {
|
|
75
|
-
this.logger.error(e)
|
|
76
71
|
this.repeatConnect(timeoutSeconds)
|
|
77
72
|
.then((t: MsgTransport) => resolve(t))
|
|
78
73
|
.catch((e: Error) => reject(e))
|
|
@@ -174,6 +169,7 @@ export class TcpInitiator extends FixInitiator {
|
|
|
174
169
|
const promisify = util.promisify
|
|
175
170
|
const timeoutPromise = promisify(setTimeout)
|
|
176
171
|
let retries = 0
|
|
172
|
+
let lastError: Error
|
|
177
173
|
this.th = setInterval(() => {
|
|
178
174
|
++retries
|
|
179
175
|
this.tryConnect()
|
|
@@ -182,17 +178,16 @@ export class TcpInitiator extends FixInitiator {
|
|
|
182
178
|
this.clearTimer()
|
|
183
179
|
resolve(t)
|
|
184
180
|
}).catch((e: Error) => {
|
|
181
|
+
lastError = e
|
|
185
182
|
this.logger.info(`${application.name}: retries ${retries} ${e.message}`)
|
|
186
183
|
})
|
|
187
184
|
}, application.reconnectSeconds * 1000)
|
|
188
185
|
timeoutPromise(timeoutSeconds * 1000).then(() => {
|
|
189
186
|
this.clearTimer()
|
|
190
187
|
this.state = InitiatorState.Stopped
|
|
191
|
-
const e = new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`)
|
|
192
|
-
this.logger.warning(`repeatConnect reject with message ${e.message}`)
|
|
188
|
+
const e = lastError ?? new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`)
|
|
193
189
|
reject(e)
|
|
194
190
|
}).catch(e => {
|
|
195
|
-
this.logger.error(e)
|
|
196
191
|
reject(e)
|
|
197
192
|
})
|
|
198
193
|
})
|