jspurefix 2.0.4 → 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/appveyor.yml CHANGED
@@ -1,15 +1,15 @@
1
1
  version: 1.0.{build}
2
2
 
3
- image:
4
- - Ubuntu
5
- - Visual Studio 2017
3
+ image:
4
+ - Visual Studio 2022
5
+ - Ubuntu2004
6
6
 
7
7
  platform:
8
8
  - x64
9
9
 
10
10
  environment:
11
11
  matrix:
12
- - nodejs_version: "17"
12
+ - nodejs_version: "18"
13
13
  - nodejs_version: "16"
14
14
  - nodejs_version: "14"
15
15
  - nodejs_version: "12"
@@ -21,7 +21,7 @@ for:
21
21
  -
22
22
  matrix:
23
23
  only:
24
- - image: Visual Studio 2017
24
+ - image: Visual Studio 2022
25
25
 
26
26
  clone_folder: c:\projects\jspurefix
27
27
  install:
@@ -35,7 +35,7 @@ for:
35
35
  -
36
36
  matrix:
37
37
  only:
38
- - image: Ubuntu
38
+ - image: Ubuntu2004
39
39
  - platform: x64
40
40
  clone_folder: /home/appveyor/projects/jspurefix
41
41
 
@@ -12,4 +12,4 @@
12
12
  8=FIX4.4|9=000112|35=0|49=init-tls-comp|56=accept-tls-comp|34=3|57=fix|52=20210307-16:17:14.431|112=Sun, 07 Mar 2021 16:17:14 GMT|10=220|
13
13
  8=FIX4.4|9=000206|35=AE|49=accept-tls-comp|56=init-tls-comp|34=10|57=fix|52=20210307-16:17:14.477|571=100006|487=0|856=0|828=0|17=600006|39=2|570=N|55=Silver|48=Silver.INC|32=105|31=61.2|75=20210307|60=20210307-16:17:14.477|10=191|
14
14
  8=FIX4.4|9=000109|35=5|49=init-tls-comp|56=accept-tls-comp|34=4|57=fix|52=20210307-16:17:16.397|58=test_client initiate logout|10=191|
15
- 8=FIX4.4|9=000112|35=5|49=accept-tls-comp|56=init-tls-comp|34=11|57=fix|52=20210307-16:17:16.404|58=test_server confirming logout|10=201|
15
+ 8=FIX4.4|9=000112|35=5|49=accept-tls-comp|56=init-tls-comp|34=11|57=fix|52=20210307-16:17:16.404|58=test_server confirming logout|10=201|
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { ILooseObject } from '../collections/collection';
3
4
  import { FixDefinitions } from '../dictionary/definition';
4
5
  import { ContainedFieldSet } from '../dictionary/contained';
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-parser.test.js","sourceRoot":"","sources":["../../../src/test/ascii/ascii-parser.test.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata'\r\n\r\nimport { TagPos } from '../../buffer'\r\nimport { FixDefinitions } from '../../dictionary/definition'\r\nimport { JsonHelper } from '../../util'\r\nimport { IJsFixConfig, MsgType } from '../../index'\r\nimport { Setup } from '../env/setup'\r\nimport { SegmentType } from '../../buffer/segment/segment-type'\r\nimport { ParsingResult } from '../env/parsing-result'\r\n\r\nlet config: IJsFixConfig\r\nlet definitions: FixDefinitions\r\nlet jsonHelper: JsonHelper\r\n\r\nconst logon: string = '8=FIX4.4|9=0000208|35=A|49=sender-10|56=target-20|34=1|57=sub-a|52=20180610-10:39:01.621|98=2|108=62441|95=20|96=VgfoSqo56NqSVI1fLdlI|141=Y|789=4886|383=20|384=1|372=ipsum|385=R|464=N|553=sit|554=consectetur|10=49|'\r\nconst expectedTagPos = [\r\n new TagPos(0, 8, 2, 6),\r\n new TagPos(1, 9, 11, 7),\r\n new TagPos(2, 35, 22, 1),\r\n new TagPos(3, 49, 27, 9),\r\n new TagPos(4, 56, 40, 9),\r\n new TagPos(5, 34, 53, 1),\r\n new TagPos(6, 57, 58, 5),\r\n new TagPos(7, 52, 67, 21),\r\n new TagPos(8, 98, 92, 1),\r\n new TagPos(9, 108, 98, 5),\r\n new TagPos(10, 95, 107, 2),\r\n new TagPos(11, 96, 113, 20),\r\n new TagPos(12, 141, 138, 1),\r\n new TagPos(13, 789, 144, 4),\r\n new TagPos(14, 383, 153, 2),\r\n new TagPos(15, 384, 160, 1),\r\n new TagPos(16, 372, 166, 5),\r\n new TagPos(17, 385, 176, 1),\r\n new TagPos(18, 464, 182, 1),\r\n new TagPos(19, 553, 188, 3),\r\n new TagPos(20, 554, 196, 11),\r\n new TagPos(21, 10, 211, 2)]\r\n\r\nlet setup: Setup = null\r\nbeforeAll(async () => {\r\n expect.assertions(1)\r\n setup = new Setup('session/test-initiator-tls.json', 'session/test-acceptor-tls.json')\r\n await setup.init()\r\n definitions = setup.definitions\r\n config = setup.clientConfig\r\n definitions = setup.definitions\r\n jsonHelper = new JsonHelper(definitions)\r\n}, 45000)\r\n\r\ntest('begin string incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|8=FIX4.4|')).rejects.toEqual(\r\n new Error('BeginString: not expected at position [2]')\r\n )\r\n})\r\n\r\ntest('body length incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|9=101|9=101|')).rejects.toEqual(\r\n new Error('BodyLengthTag: not expected at position [3]')\r\n )\r\n})\r\n\r\ntest('msg type incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|9=101|35=A|35=A|')).rejects.toEqual(\r\n new Error('MsgTag: not expected at position [4]')\r\n )\r\n})\r\n\r\ntest('do not start with 8=', () => {\r\n return expect(setup.client.parseText('59=FIX4.4|')).rejects.toEqual(\r\n new Error('position 1 [59] must be BeginString: 8=')\r\n )\r\n})\r\n\r\ntest('body length incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|59=101|9=101|')).rejects.toEqual(\r\n new Error('position 2 [59] must be BodyLengthTag: 9=')\r\n )\r\n})\r\n\r\ntest('msgTag incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|9=101|59=A|')).rejects.toEqual(\r\n new Error('position 3 [59] must be MsgTag: 35=')\r\n )\r\n})\r\n\r\ntest('first 3 fields correctly placed', async () => {\r\n const res: ParsingResult = await setup.client.parseText('8=FIX4.4|9=101|35=A|')\r\n expect(res.event).toEqual('done')\r\n})\r\n\r\ntest('complete msg parsed', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon)\r\n expect(res.event).toEqual('msg')\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n})\r\n\r\ntest('complete msg in chunks parsed', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon, true)\r\n expect(res.event).toEqual('msg')\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n})\r\n\r\ntest('msg sent in chunks matches parser buffer', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon, true)\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n expect(res.contents).toEqual(logon)\r\n})\r\n\r\ntest('logon parsers to correct tag set', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon, true)\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n expect(res.view.structure.tags.tagPos).toEqual(expectedTagPos)\r\n})\r\n\r\ntest('tags other than 10 past body length', async () => {\r\n const begin = '8=FIX4.4|9=0000208|'\r\n const changed = logon.replace('10=49|','555=you know nothin|10=49')\r\n return expect(setup.client.parseText(changed)).rejects.toEqual(\r\n new Error(`Tag: [555] cant be after ${208 + begin.length - 1}`)\r\n )\r\n})\r\n\r\ntest('unknown message type', async () => {\r\n const changed = logon.replace('35=A', '35=ZZ')\r\n const res = await setup.client.parseText(changed)\r\n expect(res.view).toBeTruthy()\r\n expect(res.view.segment.type).toEqual(SegmentType.Unknown)\r\n})\r\n\r\ntest('missing 1 required tag', async () => {\r\n const changed = logon.replace('108=62441|','000=62441|')\r\n const res = await setup.client.parseText(changed)\r\n expect(res.view).toBeTruthy()\r\n const missing = res.view.missing()\r\n expect(missing).toEqual([108])\r\n})\r\n\r\ntest('missing 2 required tags', async () => {\r\n // const changed = logon.replace('108=62441|','000=62441|')\r\n const changed = logon.replace('98=2|108=62441|','01=2|000=62441|')\r\n const res = await setup.client.parseText(changed)\r\n expect(res.view).toBeTruthy()\r\n const missing = res.view.missing()\r\n expect(missing).toEqual([98, 108])\r\n})\r\n"]}
1
+ {"version":3,"file":"ascii-parser.test.js","sourceRoot":"","sources":["../../../src/test/ascii/ascii-parser.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAAyB;AAEzB,yCAAqC;AAErC,qCAAuC;AACvC,uCAAmD;AACnD,wCAAoC;AACpC,oEAA+D;AAG/D,IAAI,MAAoB,CAAA;AACxB,IAAI,WAA2B,CAAA;AAC/B,IAAI,UAAsB,CAAA;AAE1B,MAAM,KAAK,GAAW,wNAAwN,CAAA;AAC9O,MAAM,cAAc,GAAG;IACrB,IAAI,eAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtB,IAAI,eAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACvB,IAAI,eAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,IAAI,eAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,IAAI,eAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,IAAI,eAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,IAAI,eAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,IAAI,eAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACzB,IAAI,eAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,IAAI,eAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACzB,IAAI,eAAM,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,IAAI,eAAM,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,IAAI,eAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAC5B,IAAI,eAAM,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;CAAC,CAAA;AAE7B,IAAI,KAAK,GAAU,IAAI,CAAA;AACvB,SAAS,CAAC,GAAS,EAAE;IACnB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACpB,KAAK,GAAG,IAAI,aAAK,CAAC,iCAAiC,EAAE,gCAAgC,CAAC,CAAA;IACtF,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;IAClB,WAAW,GAAG,KAAK,CAAC,WAAW,CAAA;IAC/B,MAAM,GAAG,KAAK,CAAC,YAAY,CAAA;IAC3B,WAAW,GAAG,KAAK,CAAC,WAAW,CAAA;IAC/B,UAAU,GAAG,IAAI,iBAAU,CAAC,WAAW,CAAC,CAAA;AAC1C,CAAC,CAAA,EAAE,KAAK,CAAC,CAAA;AAET,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzE,IAAI,KAAK,CAAC,2CAA2C,CAAC,CACvD,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,IAAI,KAAK,CAAC,6CAA6C,CAAC,CACzD,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;IACvC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAChF,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAClD,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAChC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACjE,IAAI,KAAK,CAAC,yCAAyC,CAAC,CACrD,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC7E,IAAI,KAAK,CAAC,2CAA2C,CAAC,CACvD,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3E,IAAI,KAAK,CAAC,qCAAqC,CAAC,CACjD,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,iCAAiC,EAAE,GAAS,EAAE;IACjD,MAAM,GAAG,GAAkB,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAA;IAC/E,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AACnC,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,qBAAqB,EAAE,GAAS,EAAE;IACrC,MAAM,GAAG,GAAkB,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAO,CAAC,KAAK,CAAC,CAAA;AAC5C,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,+BAA+B,EAAE,GAAS,EAAE;IAC/C,MAAM,GAAG,GAAkB,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAO,CAAC,KAAK,CAAC,CAAA;AAC5C,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,0CAA0C,EAAE,GAAS,EAAE;IAC1D,MAAM,GAAG,GAAkB,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAO,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACrC,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,kCAAkC,EAAE,GAAS,EAAE;IAClD,MAAM,GAAG,GAAkB,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAO,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;AAChE,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,qCAAqC,EAAE,GAAS,EAAE;IACrD,MAAM,KAAK,GAAG,qBAAqB,CAAA;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAC,2BAA2B,CAAC,CAAA;IACnE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5D,IAAI,KAAK,CAAC,4BAA4B,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAChE,CAAA;AACH,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,sBAAsB,EAAE,GAAS,EAAE;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,0BAAW,CAAC,OAAO,CAAC,CAAA;AAC5D,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,wBAAwB,EAAE,GAAS,EAAE;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAC,YAAY,CAAC,CAAA;IACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;IAClC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAChC,CAAC,CAAA,CAAC,CAAA;AAEF,IAAI,CAAC,yBAAyB,EAAE,GAAS,EAAE;IAEzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAC,iBAAiB,CAAC,CAAA;IAClE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;IAClC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;AACpC,CAAC,CAAA,CAAC,CAAA","sourcesContent":["import 'reflect-metadata'\r\n\r\nimport { TagPos } from '../../buffer'\r\nimport { FixDefinitions } from '../../dictionary/definition'\r\nimport { JsonHelper } from '../../util'\r\nimport { IJsFixConfig, MsgType } from '../../index'\r\nimport { Setup } from '../env/setup'\r\nimport { SegmentType } from '../../buffer/segment/segment-type'\r\nimport { ParsingResult } from '../env/parsing-result'\r\n\r\nlet config: IJsFixConfig\r\nlet definitions: FixDefinitions\r\nlet jsonHelper: JsonHelper\r\n\r\nconst logon: string = '8=FIX4.4|9=0000208|35=A|49=sender-10|56=target-20|34=1|57=sub-a|52=20180610-10:39:01.621|98=2|108=62441|95=20|96=VgfoSqo56NqSVI1fLdlI|141=Y|789=4886|383=20|384=1|372=ipsum|385=R|464=N|553=sit|554=consectetur|10=49|'\r\nconst expectedTagPos = [\r\n new TagPos(0, 8, 2, 6),\r\n new TagPos(1, 9, 11, 7),\r\n new TagPos(2, 35, 22, 1),\r\n new TagPos(3, 49, 27, 9),\r\n new TagPos(4, 56, 40, 9),\r\n new TagPos(5, 34, 53, 1),\r\n new TagPos(6, 57, 58, 5),\r\n new TagPos(7, 52, 67, 21),\r\n new TagPos(8, 98, 92, 1),\r\n new TagPos(9, 108, 98, 5),\r\n new TagPos(10, 95, 107, 2),\r\n new TagPos(11, 96, 113, 20),\r\n new TagPos(12, 141, 138, 1),\r\n new TagPos(13, 789, 144, 4),\r\n new TagPos(14, 383, 153, 2),\r\n new TagPos(15, 384, 160, 1),\r\n new TagPos(16, 372, 166, 5),\r\n new TagPos(17, 385, 176, 1),\r\n new TagPos(18, 464, 182, 1),\r\n new TagPos(19, 553, 188, 3),\r\n new TagPos(20, 554, 196, 11),\r\n new TagPos(21, 10, 211, 2)]\r\n\r\nlet setup: Setup = null\r\nbeforeAll(async () => {\r\n expect.assertions(1)\r\n setup = new Setup('session/test-initiator-tls.json', 'session/test-acceptor-tls.json')\r\n await setup.init()\r\n definitions = setup.definitions\r\n config = setup.clientConfig\r\n definitions = setup.definitions\r\n jsonHelper = new JsonHelper(definitions)\r\n}, 45000)\r\n\r\ntest('begin string incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|8=FIX4.4|')).rejects.toEqual(\r\n new Error('BeginString: not expected at position [2]')\r\n )\r\n})\r\n\r\ntest('body length incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|9=101|9=101|')).rejects.toEqual(\r\n new Error('BodyLengthTag: not expected at position [3]')\r\n )\r\n})\r\n\r\ntest('msg type incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|9=101|35=A|35=A|')).rejects.toEqual(\r\n new Error('MsgTag: not expected at position [4]')\r\n )\r\n})\r\n\r\ntest('do not start with 8=', () => {\r\n return expect(setup.client.parseText('59=FIX4.4|')).rejects.toEqual(\r\n new Error('position 1 [59] must be BeginString: 8=')\r\n )\r\n})\r\n\r\ntest('body length incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|59=101|9=101|')).rejects.toEqual(\r\n new Error('position 2 [59] must be BodyLengthTag: 9=')\r\n )\r\n})\r\n\r\ntest('msgTag incorrectly placed', () => {\r\n return expect(setup.client.parseText('8=FIX4.4|9=101|59=A|')).rejects.toEqual(\r\n new Error('position 3 [59] must be MsgTag: 35=')\r\n )\r\n})\r\n\r\ntest('first 3 fields correctly placed', async () => {\r\n const res: ParsingResult = await setup.client.parseText('8=FIX4.4|9=101|35=A|')\r\n expect(res.event).toEqual('done')\r\n})\r\n\r\ntest('complete msg parsed', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon)\r\n expect(res.event).toEqual('msg')\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n})\r\n\r\ntest('complete msg in chunks parsed', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon, true)\r\n expect(res.event).toEqual('msg')\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n})\r\n\r\ntest('msg sent in chunks matches parser buffer', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon, true)\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n expect(res.contents).toEqual(logon)\r\n})\r\n\r\ntest('logon parsers to correct tag set', async () => {\r\n const res: ParsingResult = await setup.client.parseText(logon, true)\r\n expect(res.msgType).toEqual(MsgType.Logon)\r\n expect(res.view.structure.tags.tagPos).toEqual(expectedTagPos)\r\n})\r\n\r\ntest('tags other than 10 past body length', async () => {\r\n const begin = '8=FIX4.4|9=0000208|'\r\n const changed = logon.replace('10=49|','555=you know nothin|10=49')\r\n return expect(setup.client.parseText(changed)).rejects.toEqual(\r\n new Error(`Tag: [555] cant be after ${208 + begin.length - 1}`)\r\n )\r\n})\r\n\r\ntest('unknown message type', async () => {\r\n const changed = logon.replace('35=A', '35=ZZ')\r\n const res = await setup.client.parseText(changed)\r\n expect(res.view).toBeTruthy()\r\n expect(res.view.segment.type).toEqual(SegmentType.Unknown)\r\n})\r\n\r\ntest('missing 1 required tag', async () => {\r\n const changed = logon.replace('108=62441|','000=62441|')\r\n const res = await setup.client.parseText(changed)\r\n expect(res.view).toBeTruthy()\r\n const missing = res.view.missing()\r\n expect(missing).toEqual([108])\r\n})\r\n\r\ntest('missing 2 required tags', async () => {\r\n // const changed = logon.replace('108=62441|','000=62441|')\r\n const changed = logon.replace('98=2|108=62441|','01=2|000=62441|')\r\n const res = await setup.client.parseText(changed)\r\n expect(res.view).toBeTruthy()\r\n const missing = res.view.missing()\r\n expect(missing).toEqual([98, 108])\r\n})\r\n\r\n"]}
@@ -78,4 +78,13 @@ test('test md request JSON => object => fix => object', () => __awaiter(void 0,
78
78
  const msg = jsonHelper.fromJson(file, msgType);
79
79
  yield expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg);
80
80
  }), 1000);
81
+ test('parse MD snapshot msg', () => __awaiter(void 0, void 0, void 0, function* () {
82
+ const msg = '8=FIX.4.4|9=224|35=W|34=8|49=TEST|56=TEST|52=20220621-17:16:16.414|262=#GBPUSD#0#|55=GBPUSD|268=3|269=0|270=1.22759|271=1|63=0|272=20220623|768=0|269=1|270=1.22759|271=1|63=0|272=20220623|768=0|269=H|270=1.22759|63=0|272=20220623|768=0|10=066|';
83
+ const res = yield setup.client.parseText(msg);
84
+ expect(res.event).toEqual('msg');
85
+ expect(res.msgType).toEqual(index_1.MsgType.MarketDataSnapshotFullRefresh);
86
+ const v2 = res.view.getView('MDFullGrp');
87
+ const o = v2.toObject();
88
+ expect(o).toBeTruthy();
89
+ }));
81
90
  //# sourceMappingURL=qf-full-msg.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"qf-full-msg.test.js","sourceRoot":"","sources":["../../../src/test/ascii/qf-full-msg.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAAyB;AAEzB,6BAA4B;AAC5B,8CAA2D;AAG3D,qCAAuC;AACvC,uCAAkE;AAClE,uFAAiF;AACjF,wCAAoC;AACpC,2CAAwC;AAExC,IAAI,WAA2B,CAAA;AAC/B,IAAI,UAAsB,CAAA;AAC1B,IAAI,MAAoB,CAAA;AACxB,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yCAAyC,CAAC,CAAA;AACpF,IAAI,KAAY,CAAA;AAEhB,SAAS,CAAC,GAAS,EAAE;IACnB,KAAK,GAAG,IAAI,aAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAA;IAChD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;IAClB,WAAW,GAAG,KAAK,CAAC,WAAW,CAAA;IAC/B,UAAU,GAAG,IAAI,iBAAU,CAAC,WAAW,CAAC,CAAA;IACxC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAA;AAC7B,CAAC,CAAA,EAAE,KAAK,CAAC,CAAA;AAET,SAAe,gBAAgB,CAAE,OAAe,EAAE,GAAiB;;QAEjE,OAAO,IAAI,OAAO,CAAC,CAAO,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,OAAO,GAAwB,IAAI,2CAAmB,CAAC,MAAM,CAAC,CAAA;YAClE,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAgB,kBAAQ,CAAC,WAAW,CAAC,CAAA;YACxF,MAAM,MAAM,GAAgB,IAAI,mBAAW,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;YACtF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAe,EAAE,IAAe,EAAE,EAAE;gBACpD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;gBACzB,OAAO,CAAC,CAAC,cAAc,CAAA;gBACvB,OAAO,CAAC,CAAC,eAAe,CAAA;gBACxB,OAAO,CAAC,CAAC,CAAC,CAAA;YACZ,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE;gBAC9B,MAAM,CAAC,CAAC,CAAC,CAAA;YACX,CAAC,CAAC,CAAA;YACF,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC5B,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC;CAAA;AAED,IAAI,CAAC,4CAA4C,EAAE,GAAS,EAAE;IAC5D,MAAM,OAAO,GAAW,eAAO,CAAC,KAAK,CAAA;IACrC,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAA;IACzD,MAAM,GAAG,GAAiB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC,CAAA,EAAE,IAAI,CAAC,CAAA;AAER,IAAI,CAAC,uDAAuD,EAAE,GAAS,EAAE;IACvE,MAAM,OAAO,GAAW,eAAO,CAAC,eAAe,CAAA;IAC/C,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAA;IACpE,MAAM,GAAG,GAAiB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC,CAAA,EAAE,IAAI,CAAC,CAAA;AAER,IAAI,CAAC,uDAAuD,EAAE,GAAS,EAAE;IACvE,MAAM,OAAO,GAAW,eAAO,CAAC,iBAAiB,CAAA;IACjD,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAA;IACvE,MAAM,GAAG,GAAiB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC,CAAA,EAAE,IAAI,CAAC,CAAA;AAER,IAAI,CAAC,oDAAoD,EAAE,GAAS,EAAE;IACpE,MAAM,OAAO,GAAW,eAAO,CAAC,YAAY,CAAA;IAC5C,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;IACjE,MAAM,GAAG,GAAiB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC,CAAA,EAAE,IAAI,CAAC,CAAA;AAER,IAAI,CAAC,iDAAiD,EAAE,GAAS,EAAE;IACjE,MAAM,OAAO,GAAW,eAAO,CAAC,6BAA6B,CAAA;IAC7D,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAA;IACpE,MAAM,GAAG,GAAiB,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC,CAAA,EAAE,IAAI,CAAC,CAAA","sourcesContent":["import 'reflect-metadata'\r\n\r\nimport * as path from 'path'\r\nimport { AsciiParser, AsciiView } from '../../buffer/ascii'\r\nimport { ILooseObject } from '../../collections/collection'\r\nimport { FixDefinitions } from '../../dictionary/definition'\r\nimport { JsonHelper } from '../../util'\r\nimport { ElasticBuffer, IJsFixConfig, MsgType } from '../../index'\r\nimport { AsciiMsgTransmitter } from '../../transport/ascii/ascii-msg-transmitter'\r\nimport { Setup } from '../env/setup'\r\nimport { DITokens } from '../../runtime'\r\n\r\nlet definitions: FixDefinitions\r\nlet jsonHelper: JsonHelper\r\nlet config: IJsFixConfig\r\nconst root: string = path.join(__dirname, '../../../data/examples/FIX.4.4/quickfix')\r\nlet setup: Setup\r\n\r\nbeforeAll(async () => {\r\n setup = new Setup('session/qf-fix44.json', null)\r\n await setup.init()\r\n definitions = setup.definitions\r\n jsonHelper = new JsonHelper(definitions)\r\n config = setup.clientConfig\r\n}, 45000)\r\n\r\nasync function testEncodeDecode (msgType: string, msg: ILooseObject): Promise<ILooseObject> {\r\n // encode to FIX format from provided object.\r\n return new Promise(async (resolve, reject) => {\r\n let session: AsciiMsgTransmitter = new AsciiMsgTransmitter(config)\r\n const parseBuffer = config.sessionContainer.resolve<ElasticBuffer>(DITokens.ParseBuffer)\r\n const parser: AsciiParser = new AsciiParser(config, session.encodeStream, parseBuffer)\r\n parser.on('msg', (msgType: string, view: AsciiView) => {\r\n const o = view.toObject()\r\n delete o.StandardHeader\r\n delete o.StandardTrailer\r\n resolve(o)\r\n })\r\n parser.on('error', (e: Error) => {\r\n reject(e)\r\n })\r\n session.send(msgType, msg)\r\n })\r\n}\r\n\r\ntest('test logon JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.Logon\r\n const file: string = path.join(root, 'logon/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n\r\ntest('test execution report JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.ExecutionReport\r\n const file: string = path.join(root, 'execution-report/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 2000)\r\n\r\ntest('test order cxl reject JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.OrderCancelReject\r\n const file: string = path.join(root, 'order-cancel-reject/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n\r\ntest('test quote request JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.QuoteRequest\r\n const file: string = path.join(root, 'quote-request/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n\r\ntest('test md request JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.MarketDataSnapshotFullRefresh\r\n const file: string = path.join(root, 'md-data-snapshot/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n"]}
1
+ {"version":3,"file":"qf-full-msg.test.js","sourceRoot":"","sources":["../../../src/test/ascii/qf-full-msg.test.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata'\r\nimport * as path from 'path'\r\nimport { AsciiParser, AsciiView } from '../../buffer/ascii'\r\nimport { ILooseObject } from '../../collections/collection'\r\nimport { FixDefinitions } from '../../dictionary/definition'\r\nimport { JsonHelper } from '../../util'\r\nimport { ElasticBuffer, IJsFixConfig, MsgType } from '../../index'\r\nimport { AsciiMsgTransmitter } from '../../transport/ascii/ascii-msg-transmitter'\r\nimport { Setup } from '../env/setup'\r\nimport { DITokens } from '../../runtime'\r\nimport { ParsingResult } from '../env/parsing-result'\r\n\r\nlet definitions: FixDefinitions\r\nlet jsonHelper: JsonHelper\r\nlet config: IJsFixConfig\r\nconst root: string = path.join(__dirname, '../../../data/examples/FIX.4.4/quickfix')\r\nlet setup: Setup\r\n\r\nbeforeAll(async () => {\r\n setup = new Setup('session/qf-fix44.json', null)\r\n await setup.init()\r\n definitions = setup.definitions\r\n jsonHelper = new JsonHelper(definitions)\r\n config = setup.clientConfig\r\n}, 45000)\r\n\r\nasync function testEncodeDecode (msgType: string, msg: ILooseObject): Promise<ILooseObject> {\r\n // encode to FIX format from provided object.\r\n return new Promise(async (resolve, reject) => {\r\n let session: AsciiMsgTransmitter = new AsciiMsgTransmitter(config)\r\n const parseBuffer = config.sessionContainer.resolve<ElasticBuffer>(DITokens.ParseBuffer)\r\n const parser: AsciiParser = new AsciiParser(config, session.encodeStream, parseBuffer)\r\n parser.on('msg', (msgType: string, view: AsciiView) => {\r\n const o = view.toObject()\r\n delete o.StandardHeader\r\n delete o.StandardTrailer\r\n resolve(o)\r\n })\r\n parser.on('error', (e: Error) => {\r\n reject(e)\r\n })\r\n session.send(msgType, msg)\r\n })\r\n}\r\n\r\ntest('test logon JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.Logon\r\n const file: string = path.join(root, 'logon/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n\r\ntest('test execution report JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.ExecutionReport\r\n const file: string = path.join(root, 'execution-report/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 2000)\r\n\r\ntest('test order cxl reject JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.OrderCancelReject\r\n const file: string = path.join(root, 'order-cancel-reject/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n\r\ntest('test quote request JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.QuoteRequest\r\n const file: string = path.join(root, 'quote-request/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n\r\ntest('test md request JSON => object => fix => object', async () => {\r\n const msgType: string = MsgType.MarketDataSnapshotFullRefresh\r\n const file: string = path.join(root, 'md-data-snapshot/object.json')\r\n const msg: ILooseObject = jsonHelper.fromJson(file, msgType)\r\n await expect(testEncodeDecode(msgType, msg)).resolves.toEqual(msg)\r\n}, 1000)\r\n\r\ntest('parse MD snapshot msg', async () => {\r\n const msg = '8=FIX.4.4|9=224|35=W|34=8|49=TEST|56=TEST|52=20220621-17:16:16.414|262=#GBPUSD#0#|55=GBPUSD|268=3|269=0|270=1.22759|271=1|63=0|272=20220623|768=0|269=1|270=1.22759|271=1|63=0|272=20220623|768=0|269=H|270=1.22759|63=0|272=20220623|768=0|10=066|'\r\n const res: ParsingResult = await setup.client.parseText(msg)\r\n expect(res.event).toEqual('msg')\r\n expect(res.msgType).toEqual(MsgType.MarketDataSnapshotFullRefresh)\r\n const v2 = res.view.getView('MDFullGrp')\r\n const o = v2.toObject()\r\n expect(o).toBeTruthy()\r\n // console.log(JSON.stringify(o, null, 4))\r\n})\r\n"]}
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { MsgEncoder, ElasticBuffer } from '../buffer';
3
4
  import { FixDefinitions } from '../dictionary/definition';
4
5
  import { Transform } from 'stream';
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { MsgView } from '../../buffer';
3
4
  import { IJsFixConfig, IJsFixLogger } from '../../config';
4
5
  import { FixSessionState } from './fix-session-state';
@@ -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
- const e = new Error(`no application in session description.`);
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
- const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`);
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.error(e.message);
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":";;;;;;;;;;;;;;;AAEA,mDAA8C;AAG9C,4DAAuD;AACvD,uCAA6C;AAC7C,uDAAkD;AAGlD,8CAAyC;AASzC,IAAa,sBAAsB,GAAnC,MAAa,sBAAuB,SAAQ,sBAAS;IAWnD,YAA4D,WAAyB;QACnF,KAAK,CAAC,WAAW,CAAC,CAAA;QADwC,gBAAW,GAAX,WAAW,CAAc;QAJ7E,OAAE,GAAY,IAAI,CAAA;QACnB,wBAAmB,GAAW,CAAC,CAAA;QAC/B,2BAAsB,GAAW,EAAE,CAAA;QAIxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAA;QAC3D,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,yBAAyB,CAAC,CAAA;QAC9F,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;SAC1D;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;SACzF;QACD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;IACjC,CAAC;IAEO,aAAa,CAAE,WAAyB;QAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,oBAAQ,CAAC,UAAU,GAAG,CAAC,CAAA;QACzF,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAa,oBAAQ,CAAC,UAAU,CAAC,CAAA;QACpF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;YACjD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;YACjD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAAY,CAAC,6BAA6B,CAAC,CAAA;IACnE,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;IAChC,CAAC;IAEO,YAAY,CAAE,SAAuB;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,EAAE;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;YAC1C,OAAO,CAAC,KAAK,EAAE,CAAA;SAChB;QACD,OAAO,CAAC,QAAQ,CAAC,4BAAY,CAAC,4BAA4B,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE;YACzC,IAAI,CAAC,SAAS,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,EAAE;gBACrC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;aACvB;iBAAM;gBACL,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;aAC1E;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,2BAA2B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;YAC/F,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,SAAS,CAAC,EAAE,YAAY,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAClG,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,EAAE,EAAE;YACX,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;SACf;IACH,CAAC;IAMO,OAAO;QACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAAY,CAAC,6BAA6B,CAAC,CAAA;QACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,IAAI,CAAC,mBAAmB,OAAO,CAAC,CAAA;QAC3F,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAC3C,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,OAAO,kBAAkB,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAA;gBAClG,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;oBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;oBAC1C,IAAI,CAAC,OAAO,EAAE,CAAA;gBAChB,CAAC,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAA;YACxC,CAAC,CAAC,CAAA;QACJ,CAAC,EAAC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAA;IACpC,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;IACnB,CAAC;IAMM,GAAG,CAAE,iBAAyB,EAAE;QACrC,OAAO,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACrC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBAClB,IAAI,CAAC,UAAU,EAAE,CAAA;oBACjB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAA;oBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,EAAE,oBAAoB,cAAc,cAAc,CAAC,CAAA;oBACrG,OAAO,CAAC,IAAI,CAAC,CAAA;gBACf,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,cAAc,cAAc,CAAC,CAAA;gBAC3F,MAAM,CAAC,CAAC,CAAC,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAIO,OAAO,CAAE,OAAe;QAC9B,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAA;YAC/D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAAY,CAAC,kBAAkB,CAAC,CAAA;YACtD,IAAI,CAAC,SAAS,GAAG,IAAI,4BAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACnD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAuB,EAAE,EAAE;gBAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAA;gBAClE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;gBAC5B,OAAO,CAAC,SAAS,CAAC,CAAA;YACpB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,OAAO,cAAc,CAAC,CAAA;gBAC5E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAAY,CAAC,6BAA6B,CAAC,CAAA;gBACjE,MAAM,CAAC,CAAC,CAAC,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAxIY,sBAAsB;IADlC,IAAA,qBAAU,GAAE;IAYG,WAAA,IAAA,iBAAM,EAAC,oBAAQ,CAAC,YAAY,CAAC,CAAA;;GAXhC,sBAAsB,CAwIlC;AAxIY,wDAAsB","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"]}
@@ -72,20 +72,16 @@ let TcpInitiatorConnector = class TcpInitiatorConnector extends fix_entity_1.Fix
72
72
  });
73
73
  }
74
74
  connect(initiatorSession) {
75
- return new Promise((accept, reject) => __awaiter(this, void 0, void 0, function* () {
75
+ return __awaiter(this, void 0, void 0, function* () {
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
79
  const initiatorTransport = yield initiator.connect(22);
80
80
  logger.info('... connected, run session');
81
- initiatorSession.run(initiatorTransport).then(() => {
82
- logger.info('ends');
83
- accept(true);
84
- }).catch((e) => {
85
- logger.error(e);
86
- reject(e);
87
- });
88
- }));
81
+ yield initiatorSession.run(initiatorTransport);
82
+ logger.info('ends');
83
+ return true;
84
+ });
89
85
  }
90
86
  };
91
87
  TcpInitiatorConnector = __decorate([
@@ -1 +1 @@
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 connect (initiatorSession: FixSession): Promise<any> {\r\n return new Promise<any>(async (accept, reject) => {\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 initiatorSession.run(initiatorTransport).then(() => {\r\n logger.info('ends')\r\n accept(true)\r\n }).catch((e: Error) => {\r\n logger.error(e)\r\n reject(e)\r\n })\r\n })\r\n }\r\n}\r\n"]}
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
- const e = new Error(`no application in session description.`);
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
- const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`);
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() {
@@ -79,9 +75,12 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
79
75
  case InitiatorState.Idle: {
80
76
  this.state = InitiatorState.Connecting;
81
77
  this.logger.info(`connecting with timeout ${timeoutSeconds}`);
82
- this.tryConnect().then((t) => resolve(t)).catch((e) => {
83
- this.logger.error(e);
84
- this.repeatConnect(timeoutSeconds).then((t) => resolve(t)).catch((e) => reject(e));
78
+ this.tryConnect()
79
+ .then((t) => resolve(t))
80
+ .catch((e) => {
81
+ this.repeatConnect(timeoutSeconds)
82
+ .then((t) => resolve(t))
83
+ .catch((e) => reject(e));
85
84
  });
86
85
  break;
87
86
  }
@@ -107,6 +106,9 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
107
106
  reject(e);
108
107
  }
109
108
  });
109
+ socket.on('error', (err) => {
110
+ reject(err);
111
+ });
110
112
  }
111
113
  catch (e) {
112
114
  reject(e);
@@ -139,6 +141,9 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
139
141
  resolve(tlsDuplex);
140
142
  }
141
143
  });
144
+ tlsSocket.on('error', (err) => {
145
+ reject(err);
146
+ });
142
147
  }
143
148
  catch (e) {
144
149
  reject(e);
@@ -172,24 +177,25 @@ let TcpInitiator = class TcpInitiator extends fix_initiator_1.FixInitiator {
172
177
  const promisify = util.promisify;
173
178
  const timeoutPromise = promisify(setTimeout);
174
179
  let retries = 0;
180
+ let lastError;
175
181
  this.th = setInterval(() => {
176
182
  ++retries;
177
- this.tryConnect().then((t) => {
183
+ this.tryConnect()
184
+ .then((t) => {
178
185
  this.state = InitiatorState.Connected;
179
186
  this.clearTimer();
180
187
  resolve(t);
181
188
  }).catch((e) => {
189
+ lastError = e;
182
190
  this.logger.info(`${application.name}: retries ${retries} ${e.message}`);
183
191
  });
184
192
  }, application.reconnectSeconds * 1000);
185
193
  timeoutPromise(timeoutSeconds * 1000).then(() => {
186
194
  this.clearTimer();
187
195
  this.state = InitiatorState.Stopped;
188
- const e = new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`);
189
- 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`);
190
197
  reject(e);
191
198
  }).catch(e => {
192
- this.logger.error(e);
193
199
  reject(e);
194
200
  });
195
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().then((t: MsgTransport) => resolve(t)).catch((e: Error) => {\r\n this.logger.error(e)\r\n this.repeatConnect(timeoutSeconds).then((t: MsgTransport) => resolve(t)).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 } 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 } 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().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"]}
@@ -31,13 +31,15 @@ class TlsOptionsFactory {
31
31
  static getTlsConnectionOptions(tcp) {
32
32
  let connectionOptions = null;
33
33
  const tls = tcp.tls;
34
- if (tls && tls.key) {
34
+ if (tls) {
35
35
  connectionOptions = {
36
36
  port: tcp.port,
37
- host: tcp.host,
38
- key: TlsOptionsFactory.read(tcp.tls.key),
39
- cert: TlsOptionsFactory.read(tcp.tls.cert)
37
+ host: tcp.host
40
38
  };
39
+ if (tls.key) {
40
+ connectionOptions.key = TlsOptionsFactory.read(tcp.tls.key);
41
+ connectionOptions.cert = TlsOptionsFactory.read(tcp.tls.cert);
42
+ }
41
43
  if (tcp.tls.ca && tcp.tls.ca.length > 0) {
42
44
  connectionOptions.ca = tcp.tls.ca.map(i => TlsOptionsFactory.read(i));
43
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tls-options-factory.js","sourceRoot":"","sources":["../../../src/transport/tcp/tls-options-factory.ts"],"names":[],"mappings":";;;AAGA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAExB,MAAa,iBAAiB;IAC5B,MAAM,CAAC,IAAI,CAAE,QAAgB;QAC3B,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC1C,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAC7B;YACE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;SAC5B,CAAC,CAAA;IACN,CAAC;IAED,MAAM,CAAC,aAAa,CAAE,GAAgB;QACpC,IAAI,UAAU,GAAe,IAAI,CAAA;QACjC,IAAI,GAAG,EAAE;YACP,UAAU,GAAG;gBACX,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;aAC7B,CAAA;YAEf,IAAI,GAAG,CAAC,GAAG,EAAE;gBACX,UAAU,CAAC,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAChD,UAAU,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;aACnD;YAED,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,UAAU,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;aAC3D;SACF;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAE,GAA6B;QAC3D,IAAI,iBAAiB,GAAsB,IAAI,CAAA;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAA;QACnB,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE;YAClB,iBAAiB,GAAG;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;gBACxC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;aACtB,CAAA;YACtB,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,iBAAiB,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;aACtE;YACD,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE;gBACnB,iBAAiB,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAA;aAC5C;YACD,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE;gBAC1B,iBAAiB,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAA;aAC1D;SACF;QACD,OAAO,iBAAiB,CAAA;IAC1B,CAAC;CACF;AApDD,8CAoDC","sourcesContent":["import { ConnectionOptions, TlsOptions } from 'tls'\r\nimport { ITlsOptions } from './tls-options'\r\nimport { ITcpTransportDescription } from './tcp-transport-description'\r\nconst path = require('path')\r\nconst fs = require('fs')\r\n\r\nexport class TlsOptionsFactory {\r\n static read (filePath: string) {\r\n const root: string = path.join(__dirname, '../../../')\r\n const fullPath = path.join(root, filePath)\r\n return fs.readFileSync(fullPath,\r\n {\r\n encoding: 'utf8', flag: 'r'\r\n })\r\n }\r\n\r\n static getTlsOptions (tls: ITlsOptions): TlsOptions {\r\n let tlsOptions: TlsOptions = null\r\n if (tls) {\r\n tlsOptions = {\r\n requestCert: tls.requestCert,\r\n rejectUnauthorized: tls.rejectUnauthorized\r\n } as TlsOptions\r\n\r\n if (tls.key) {\r\n tlsOptions.key = TlsOptionsFactory.read(tls.key)\r\n tlsOptions.cert = TlsOptionsFactory.read(tls.cert)\r\n }\r\n \r\n if (tls.ca && tls.ca.length > 0) {\r\n tlsOptions.ca = tls.ca.map(i => TlsOptionsFactory.read(i))\r\n }\r\n }\r\n return tlsOptions\r\n }\r\n\r\n static getTlsConnectionOptions (tcp: ITcpTransportDescription): ConnectionOptions {\r\n let connectionOptions: ConnectionOptions = null\r\n const tls = tcp.tls\r\n if (tls && tls.key) {\r\n connectionOptions = {\r\n port: tcp.port,\r\n host: tcp.host,\r\n key: TlsOptionsFactory.read(tcp.tls.key),\r\n cert: TlsOptionsFactory.read(tcp.tls.cert)\r\n } as ConnectionOptions\r\n if (tcp.tls.ca && tcp.tls.ca.length > 0) {\r\n connectionOptions.ca = tcp.tls.ca.map(i => TlsOptionsFactory.read(i))\r\n }\r\n if (tcp.tls.timeout) {\r\n connectionOptions.timeout = tcp.tls.timeout\r\n }\r\n if (tcp.tls.sessionTimeout) {\r\n connectionOptions.sessionTimeout = tcp.tls.sessionTimeout\r\n }\r\n }\r\n return connectionOptions\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"tls-options-factory.js","sourceRoot":"","sources":["../../../src/transport/tcp/tls-options-factory.ts"],"names":[],"mappings":";;;AAGA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAExB,MAAa,iBAAiB;IAC5B,MAAM,CAAC,IAAI,CAAE,QAAgB;QAC3B,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC1C,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAC7B;YACE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;SAC5B,CAAC,CAAA;IACN,CAAC;IAED,MAAM,CAAC,aAAa,CAAE,GAAgB;QACpC,IAAI,UAAU,GAAe,IAAI,CAAA;QACjC,IAAI,GAAG,EAAE;YACP,UAAU,GAAG;gBACX,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;aAC7B,CAAA;YAEf,IAAI,GAAG,CAAC,GAAG,EAAE;gBACX,UAAU,CAAC,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAChD,UAAU,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;aACnD;YAED,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,UAAU,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;aAC3D;SACF;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAE,GAA6B;QAC3D,IAAI,iBAAiB,GAAsB,IAAI,CAAA;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAA;QACnB,IAAI,GAAG,EAAE;YACP,iBAAiB,GAAG;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;aACM,CAAA;YACtB,IAAI,GAAG,CAAC,GAAG,EAAE;gBACX,iBAAiB,CAAC,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAC3D,iBAAiB,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;aAC9D;YACD,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,iBAAiB,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;aACtE;YACD,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE;gBACnB,iBAAiB,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAA;aAC5C;YACD,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE;gBAC1B,iBAAiB,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAA;aAC1D;SACF;QACD,OAAO,iBAAiB,CAAA;IAC1B,CAAC;CACF;AAtDD,8CAsDC","sourcesContent":["import { ConnectionOptions, TlsOptions } from 'tls'\r\nimport { ITlsOptions } from './tls-options'\r\nimport { ITcpTransportDescription } from './tcp-transport-description'\r\nconst path = require('path')\r\nconst fs = require('fs')\r\n\r\nexport class TlsOptionsFactory {\r\n static read (filePath: string) {\r\n const root: string = path.join(__dirname, '../../../')\r\n const fullPath = path.join(root, filePath)\r\n return fs.readFileSync(fullPath,\r\n {\r\n encoding: 'utf8', flag: 'r'\r\n })\r\n }\r\n\r\n static getTlsOptions (tls: ITlsOptions): TlsOptions {\r\n let tlsOptions: TlsOptions = null\r\n if (tls) {\r\n tlsOptions = {\r\n requestCert: tls.requestCert,\r\n rejectUnauthorized: tls.rejectUnauthorized\r\n } as TlsOptions\r\n\r\n if (tls.key) {\r\n tlsOptions.key = TlsOptionsFactory.read(tls.key)\r\n tlsOptions.cert = TlsOptionsFactory.read(tls.cert)\r\n }\r\n \r\n if (tls.ca && tls.ca.length > 0) {\r\n tlsOptions.ca = tls.ca.map(i => TlsOptionsFactory.read(i))\r\n }\r\n }\r\n return tlsOptions\r\n }\r\n\r\n static getTlsConnectionOptions (tcp: ITcpTransportDescription): ConnectionOptions {\r\n let connectionOptions: ConnectionOptions = null\r\n const tls = tcp.tls\r\n if (tls) {\r\n connectionOptions = {\r\n port: tcp.port,\r\n host: tcp.host\r\n } as ConnectionOptions\r\n if (tls.key) {\r\n connectionOptions.key = TlsOptionsFactory.read(tcp.tls.key)\r\n connectionOptions.cert = TlsOptionsFactory.read(tcp.tls.cert)\r\n }\r\n if (tcp.tls.ca && tcp.tls.ca.length > 0) {\r\n connectionOptions.ca = tcp.tls.ca.map(i => TlsOptionsFactory.read(i))\r\n }\r\n if (tcp.tls.timeout) {\r\n connectionOptions.timeout = tcp.tls.timeout\r\n }\r\n if (tcp.tls.sessionTimeout) {\r\n connectionOptions.sessionTimeout = tcp.tls.sessionTimeout\r\n }\r\n }\r\n return connectionOptions\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jspurefix",
3
- "version": "2.0.4",
3
+ "version": "2.2.0",
4
4
  "description": "pure node js fix engine",
5
5
  "keywords": [
6
6
  "typescript",
@@ -25,6 +25,7 @@
25
25
  "scripts": {
26
26
  "circular": "madge --circular --extensions js dist && madge --circular --extensions ts src",
27
27
  "test": "jest",
28
+ "build": "tsc",
28
29
  "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
29
30
  "cmd": "cd dist && node jsfix-cmd",
30
31
  "repo44": "cd dist && node jsfix-cmd --dict=repo44",
@@ -36,6 +37,7 @@
36
37
  "repo44-bench-er": "cd dist && node jsfix-cmd --dict=repo44 --fix=data/examples/FIX.4.4/repo/execution-report/fix.txt --benchmark --delimiter=\"|\" --repeats=125000",
37
38
  "repo44-bench-tc": "cd dist && node jsfix-cmd ---dict=repo44 --fix=data/examples/FIX.4.4/repo/trade-capture/fix.txt --benchmark --delimiter=\"|\" --repeats=30000",
38
39
  "repo44-bench-sd": "cd dist && node jsfix-cmd --dict=repo44 --fix=data/examples/FIX.4.4/repo/security-definition/fix.txt --benchmark --delimiter=\"|\" --repeats=150000",
40
+ "repo44-bench-lo": "cd dist && node jsfix-cmd --dict=repo44 --fix=data/examples/FIX.4.4/repo/logon/fix.txt --benchmark --delimiter=\"|\" --repeats=250000",
39
41
  "qf-bench-lo": "cd dist && node jsfix-cmd --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/quickfix/logon/fix.txt --benchmark --delimiter=\"|\" --repeats=250000",
40
42
  "fixml": "cd dist && node jsfix-cmd --dict=repofixml",
41
43
  "tcp-qf-md": "cd dist/sample/tcp/qf-md && node app",
@@ -62,44 +64,40 @@
62
64
  "license": "MIT",
63
65
  "dependencies": {
64
66
  "align-text": "^1.0.2",
65
- "express": "^4.17.3",
67
+ "express": "^4.18.1",
66
68
  "lodash": "^4.17.21",
67
- "log4js": "^6.4.2",
68
- "mathjs": "^10.3.0",
69
- "minimist": "^1.2.5",
70
- "moment": "^2.29.1",
69
+ "mathjs": "^11.0.1",
70
+ "minimist": "^1.2.6",
71
+ "moment": "^2.29.4",
71
72
  "node-fs-extra": "^0.8.2",
72
73
  "reflect-metadata": "^0.1.13",
73
74
  "request": "^2.88.2",
74
75
  "request-promise-native": "^1.0.9",
75
76
  "sax": "^1.2.4",
76
- "tsyringe": "^4.6.0",
77
+ "tsyringe": "^4.7.0",
77
78
  "uuid": "^8.3.2",
78
- "winston": "^3.6.0",
79
+ "winston": "^3.8.1",
79
80
  "word-wrap": "^1.2.3",
80
- "xml2js": "^0.4.23",
81
- "xmlbuilder": "^15.1.1",
82
81
  "yauzl": "^2.10.0"
83
82
  },
84
83
  "devDependencies": {
85
84
  "@types/express": "^4.17.13",
86
- "@types/express-serve-static-core": "^4.17.28",
87
- "@types/jest": "^27.4.1",
88
- "@types/lodash": "^4.14.179",
85
+ "@types/express-serve-static-core": "^4.17.30",
86
+ "@types/jest": "^28.1.6",
87
+ "@types/lodash": "^4.14.182",
89
88
  "@types/mathjs": "^9.4.1",
90
89
  "@types/minimist": "^1.2.2",
91
- "@types/node": "^17.0.21",
90
+ "@types/node": "^18.7.1",
92
91
  "@types/request-promise-native": "^1.0.18",
93
92
  "@types/sax": "^1.2.4",
94
93
  "@types/uuid": "^8.3.4",
95
94
  "@types/winston": "^2.4.4",
96
- "@types/xmlbuilder": "0.0.35",
97
- "jest": "^27.5.1",
95
+ "jest": "^28.1.3",
98
96
  "madge": "^5.0.1",
99
- "standard": "^16.0.4",
100
- "ts-jest": "^27.1.3",
97
+ "standard": "^17.0.0",
98
+ "ts-jest": "^28.0.7",
101
99
  "tslint": "^6.1.3",
102
100
  "tslint-config-standard": "^9.0.0",
103
- "typescript": "^4.6.2"
101
+ "typescript": "^4.7.4"
104
102
  }
105
103
  }
@@ -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
- const e: Error = new Error(`no application in session description.`)
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
- const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`)
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.error(e.message)
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()}`)
@@ -52,20 +52,14 @@ export class TcpInitiatorConnector extends FixEntity {
52
52
  })
53
53
  }
54
54
 
55
- connect (initiatorSession: FixSession): Promise<any> {
56
- return new Promise<any>(async (accept, reject) => {
57
- const logger = this.config.logFactory.logger('initiator')
58
- const initiator: FixInitiator = this.config.sessionContainer.resolve<FixInitiator>(TcpInitiator)
59
- logger.info('connecting ...')
60
- const initiatorTransport: MsgTransport = await initiator.connect(22)
61
- logger.info('... connected, run session')
62
- initiatorSession.run(initiatorTransport).then(() => {
63
- logger.info('ends')
64
- accept(true)
65
- }).catch((e: Error) => {
66
- logger.error(e)
67
- reject(e)
68
- })
69
- })
55
+ async connect (initiatorSession: FixSession): Promise<any> {
56
+ const logger = this.config.logFactory.logger('initiator')
57
+ const initiator: FixInitiator = this.config.sessionContainer.resolve<FixInitiator>(TcpInitiator)
58
+ logger.info('connecting ...')
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
70
64
  }
71
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
- const e: Error = new Error(`no application in session description.`)
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
- const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`)
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
 
@@ -69,10 +65,13 @@ export class TcpInitiator extends FixInitiator {
69
65
  case InitiatorState.Idle: {
70
66
  this.state = InitiatorState.Connecting
71
67
  this.logger.info(`connecting with timeout ${timeoutSeconds}`)
72
- this.tryConnect().then((t: MsgTransport) => resolve(t)).catch((e: Error) => {
73
- this.logger.error(e)
74
- this.repeatConnect(timeoutSeconds).then((t: MsgTransport) => resolve(t)).catch((e: Error) => reject(e))
75
- })
68
+ this.tryConnect()
69
+ .then((t: MsgTransport) => resolve(t))
70
+ .catch((e: Error) => {
71
+ this.repeatConnect(timeoutSeconds)
72
+ .then((t: MsgTransport) => resolve(t))
73
+ .catch((e: Error) => reject(e))
74
+ })
76
75
  break
77
76
  }
78
77
 
@@ -98,6 +97,9 @@ export class TcpInitiator extends FixInitiator {
98
97
  reject(e)
99
98
  }
100
99
  })
100
+ socket.on('error', (err) => {
101
+ reject(err)
102
+ })
101
103
  } catch (e) {
102
104
  reject(e)
103
105
  }
@@ -129,6 +131,9 @@ export class TcpInitiator extends FixInitiator {
129
131
  resolve(tlsDuplex)
130
132
  }
131
133
  })
134
+ tlsSocket.on('error', (err) => {
135
+ reject(err)
136
+ })
132
137
  } catch (e) {
133
138
  reject(e)
134
139
  }
@@ -164,24 +169,25 @@ export class TcpInitiator extends FixInitiator {
164
169
  const promisify = util.promisify
165
170
  const timeoutPromise = promisify(setTimeout)
166
171
  let retries = 0
172
+ let lastError: Error
167
173
  this.th = setInterval(() => {
168
174
  ++retries
169
- this.tryConnect().then((t: MsgTransport) => {
170
- this.state = InitiatorState.Connected
171
- this.clearTimer()
172
- resolve(t)
175
+ this.tryConnect()
176
+ .then((t: MsgTransport) => {
177
+ this.state = InitiatorState.Connected
178
+ this.clearTimer()
179
+ resolve(t)
173
180
  }).catch((e: Error) => {
181
+ lastError = e
174
182
  this.logger.info(`${application.name}: retries ${retries} ${e.message}`)
175
183
  })
176
184
  }, application.reconnectSeconds * 1000)
177
185
  timeoutPromise(timeoutSeconds * 1000).then(() => {
178
186
  this.clearTimer()
179
187
  this.state = InitiatorState.Stopped
180
- const e = new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`)
181
- this.logger.warning(`repeatConnect reject with message ${e.message}`)
188
+ const e = lastError ?? new Error(`${application.name}: timeout of ${timeoutSeconds} whilst connecting`)
182
189
  reject(e)
183
190
  }).catch(e => {
184
- this.logger.error(e)
185
191
  reject(e)
186
192
  })
187
193
  })
@@ -37,13 +37,15 @@ export class TlsOptionsFactory {
37
37
  static getTlsConnectionOptions (tcp: ITcpTransportDescription): ConnectionOptions {
38
38
  let connectionOptions: ConnectionOptions = null
39
39
  const tls = tcp.tls
40
- if (tls && tls.key) {
40
+ if (tls) {
41
41
  connectionOptions = {
42
42
  port: tcp.port,
43
- host: tcp.host,
44
- key: TlsOptionsFactory.read(tcp.tls.key),
45
- cert: TlsOptionsFactory.read(tcp.tls.cert)
43
+ host: tcp.host
46
44
  } as ConnectionOptions
45
+ if (tls.key) {
46
+ connectionOptions.key = TlsOptionsFactory.read(tcp.tls.key)
47
+ connectionOptions.cert = TlsOptionsFactory.read(tcp.tls.cert)
48
+ }
47
49
  if (tcp.tls.ca && tcp.tls.ca.length > 0) {
48
50
  connectionOptions.ca = tcp.tls.ca.map(i => TlsOptionsFactory.read(i))
49
51
  }