jspurefix 5.6.2 → 5.8.4
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/DEMO_PORT_PLAN.md +1 -1
- package/README.md +263 -585
- package/dist/buffer/ascii/ascii-parser.d.ts +2 -1
- package/dist/buffer/ascii/ascii-parser.js +5 -3
- package/dist/buffer/ascii/ascii-parser.js.map +1 -1
- package/dist/buffer/tag/tags.d.ts +2 -1
- package/dist/buffer/tag/tags.js +8 -4
- package/dist/buffer/tag/tags.js.map +1 -1
- package/dist/transport/ascii/ascii-session.d.ts +1 -0
- package/dist/transport/ascii/ascii-session.js +51 -10
- package/dist/transport/ascii/ascii-session.js.map +1 -1
- package/dist/transport/http/http-acceptor.js +2 -2
- package/dist/transport/http/http-acceptor.js.map +1 -1
- package/dist/transport/session/fix-session.d.ts +1 -0
- package/dist/transport/session/fix-session.js +7 -0
- package/dist/transport/session/fix-session.js.map +1 -1
- package/jsfix.test_client.txt +75 -71
- package/jsfix.test_server.txt +72 -68
- package/package.json +10 -12
- package/src/buffer/ascii/ascii-parser.ts +3 -2
- package/src/buffer/tag/tags.ts +8 -4
- package/src/transport/ascii/ascii-session.ts +52 -10
- package/src/transport/http/http-acceptor.ts +2 -2
- package/src/transport/session/fix-session.ts +14 -0
- package/src/util/unzip.js +54 -184
package/jsfix.test_server.txt
CHANGED
|
@@ -1,71 +1,75 @@
|
|
|
1
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
2
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
3
|
-
8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
4
|
-
8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=
|
|
5
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=
|
|
6
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
7
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
8
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
9
|
-
8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
10
|
-
8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=
|
|
11
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=
|
|
12
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
13
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
14
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
15
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
16
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
17
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
18
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
19
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
20
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
21
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
22
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
23
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
24
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
25
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
26
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=0|57=fix|52=
|
|
27
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
28
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=5|57=fix|52=
|
|
29
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
30
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
31
|
-
8=FIX.4.4|9=0000110|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
32
|
-
8=FIX.4.4|9=0000125|35=3|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
33
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
34
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
1
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:29.697|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=116|
|
|
2
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:29.702|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=151|
|
|
3
|
+
8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:27:29.702|7=1|16=1|10=238|
|
|
4
|
+
8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260627-11:27:29.707|122=20260627-11:27:29.707|123=Y|36=2|10=117|
|
|
5
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260627-11:27:31.705|58=5|10=211|
|
|
6
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:27:31.707|58=5|10=212|
|
|
7
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:34.546|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=105|
|
|
8
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:34.548|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=155|
|
|
9
|
+
8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:27:34.549|7=1|16=0|10=242|
|
|
10
|
+
8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260627-11:27:34.551|122=20260627-11:27:34.551|123=Y|36=2|10=103|
|
|
11
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260627-11:27:36.550|58=5|10=214|
|
|
12
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:27:36.551|58=5|10=214|
|
|
13
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:39.042|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=101|
|
|
14
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:39.044|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=151|
|
|
15
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:27:39.044|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=104|
|
|
16
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:39.579|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=116|
|
|
17
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:39.580|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=156|
|
|
18
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:27:40.582|58=5|10=213|
|
|
19
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:27:40.583|58=5|10=214|
|
|
20
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:43.284|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=104|
|
|
21
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:43.285|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=153|
|
|
22
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:27:44.287|58=5|10=219|
|
|
23
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:27:44.288|58=5|10=220|
|
|
24
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:47.058|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=107|
|
|
25
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:47.059|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=156|
|
|
26
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=0|57=fix|52=20260627-11:27:48.061|58=5|10=211|
|
|
27
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:50.563|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=102|
|
|
28
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=5|57=fix|52=20260627-11:27:50.564|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=155|
|
|
29
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:27:51.565|58=5|10=216|
|
|
30
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:27:51.566|58=5|10=217|
|
|
31
|
+
8=FIX.4.4|9=0000110|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:54.044|98=0|141=Y|553=js-client|554=pwd-client|10=168|
|
|
32
|
+
8=FIX.4.4|9=0000125|35=3|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:54.045|45=1|372=A|373=1|58=msgType A missing required tag 108|10=002|
|
|
33
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:27:58.638|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=113|
|
|
34
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:27:58.640|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=154|
|
|
35
35
|
8=FIX4.4|9=0000136|35=ZZ|49=init-comp|56=accept-comp|34=2|57=fix|52=20180902-12:25:28.980|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=177|
|
|
36
|
-
8=FIX.4.4|9=0000111|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
37
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=
|
|
38
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=
|
|
39
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
40
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
36
|
+
8=FIX.4.4|9=0000111|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:27:58.641|45=2|372=ZZ|373=11|58=msgType ZZ unknown|10=156|
|
|
37
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260627-11:28:00.642|58=5|10=208|
|
|
38
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260627-11:28:00.643|58=5|10=209|
|
|
39
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:28:03.398|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=107|
|
|
40
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:28:03.400|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=139|
|
|
41
41
|
8=FIX4.4|9=0000123|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20180902-12:25:59.161|999=Sun, 02 Sep 2018 12:25:59 GMT|10=95|
|
|
42
|
-
8=FIX.4.4|9=0000146|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
43
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=
|
|
44
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=
|
|
45
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
46
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
42
|
+
8=FIX.4.4|9=0000146|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:28:03.403|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 143|10=064|
|
|
43
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260627-11:28:05.403|58=5|10=208|
|
|
44
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260627-11:28:05.404|58=5|10=209|
|
|
45
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:28:11.905|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=100|
|
|
46
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:28:11.906|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=149|
|
|
47
47
|
8=FIX4.4|9=0000123|35=0|49=init-not!|56=accept-comp|34=2|57=fix|52=20180902-12:25:59.161|112=Sun, 02 Sep 2018 12:25:59 GMT|10=95|
|
|
48
|
-
8=FIX.4.4|9=0000145|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
49
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=
|
|
50
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=
|
|
51
|
-
8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
52
|
-
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
53
|
-
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
54
|
-
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=
|
|
55
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=4|57=fix|52=
|
|
56
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
57
|
-
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
58
|
-
8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
59
|
-
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
60
|
-
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=3|57=fix|52=
|
|
61
|
-
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=4|57=fix|52=
|
|
62
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
63
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=5|57=fix|52=
|
|
64
|
-
8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=
|
|
65
|
-
8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=
|
|
66
|
-
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=
|
|
67
|
-
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=
|
|
68
|
-
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=
|
|
69
|
-
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=4|57=fix|52=
|
|
70
|
-
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=5|57=fix|52=
|
|
71
|
-
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=
|
|
48
|
+
8=FIX.4.4|9=0000145|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:28:11.907|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 59|10=029|
|
|
49
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260627-11:28:13.906|58=5|10=215|
|
|
50
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260627-11:28:13.907|58=5|10=216|
|
|
51
|
+
8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:28:16.395|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=058|
|
|
52
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:28:16.396|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=157|
|
|
53
|
+
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:28:18.402|112=Sat, 27 Jun 2026 11:28:18 GMT|10=157|
|
|
54
|
+
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260627-11:28:20.404|112=Sat, 27 Jun 2026 11:28:20 GMT|10=146|
|
|
55
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=4|57=fix|52=20260627-11:28:22.398|58=5|10=221|
|
|
56
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:28:22.399|58=5|10=220|
|
|
57
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:28:24.881|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=107|
|
|
58
|
+
8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:28:24.882|98=0|108=2|141=Y|553=js-server|554=pwd-server|10=106|
|
|
59
|
+
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:28:26.887|112=Sat, 27 Jun 2026 11:28:26 GMT|10=172|
|
|
60
|
+
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=3|57=fix|52=20260627-11:28:28.892|112=Sat, 27 Jun 2026 11:28:28 GMT|10=173|
|
|
61
|
+
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=4|57=fix|52=20260627-11:28:30.895|112=Sat, 27 Jun 2026 11:28:30 GMT|10=163|
|
|
62
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:28:32.883|58=5|10=219|
|
|
63
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=5|57=fix|52=20260627-11:28:32.884|58=5|10=223|
|
|
64
|
+
8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:28:35.599|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=065|
|
|
65
|
+
8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:28:35.600|98=0|108=5|141=Y|553=js-server|554=pwd-server|10=099|
|
|
66
|
+
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:28:37.604|112=Sat, 27 Jun 2026 11:28:37 GMT|10=163|
|
|
67
|
+
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260627-11:28:39.608|112=Sat, 27 Jun 2026 11:28:39 GMT|10=172|
|
|
68
|
+
8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:28:40.609|112=Sat, 27 Jun 2026 11:28:40 GMT|10=156|
|
|
69
|
+
8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=4|57=fix|52=20260627-11:28:41.611|112=Sat, 27 Jun 2026 11:28:41 GMT|10=153|
|
|
70
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=5|57=fix|52=20260627-11:28:43.602|58=5|10=213|
|
|
71
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260627-11:28:43.602|58=5|10=211|
|
|
72
|
+
8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260627-11:30:11.370|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=089|
|
|
73
|
+
8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260627-11:30:11.380|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=138|
|
|
74
|
+
8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260627-11:30:12.383|58=5|10=205|
|
|
75
|
+
8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260627-11:30:12.385|58=5|10=207|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jspurefix",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.8.4",
|
|
4
4
|
"description": "pure node js fix engine",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"repo44-bench-tc": "node dist/jsfix-cmd jsfix-cmd --dict=repo44 --fix=data/examples/FIX.4.4/repo/trade-capture/fix.txt --benchmark --delimiter=\"|\" --repeats=30000",
|
|
45
45
|
"repo44-bench-sd": "node dist/jsfix-cmd --dict=repo44 --fix=data/examples/FIX.4.4/repo/security-definition/fix.txt --benchmark --delimiter=\"|\" --repeats=150000",
|
|
46
46
|
"repo44-bench-lo": "node dist/jsfix-cmd --dict=repo44 --fix=data/examples/FIX.4.4/repo/logon/fix.txt --benchmark --delimiter=\"|\" --repeats=250000",
|
|
47
|
-
"qf-bench-lo": "node dist/jsfix-cmd --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/quickfix/logon/fix.txt --benchmark --delimiter=\"|\" --repeats=
|
|
48
|
-
"qf-bench-hb": "node dist/jsfix-cmd --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/quickfix/heartbeat/fix.txt --benchmark --delimiter=\"|\" --repeats=
|
|
47
|
+
"qf-bench-lo": "node dist/jsfix-cmd --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/quickfix/logon/fix.txt --benchmark --delimiter=\"|\" --repeats=1000000",
|
|
48
|
+
"qf-bench-hb": "node dist/jsfix-cmd --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/quickfix/heartbeat/fix.txt --benchmark --delimiter=\"|\" --repeats=1000000",
|
|
49
49
|
"fixml": "node dist/jsfix-cmd --dict=repofixml",
|
|
50
50
|
"tcp-qf-md": "node dist/sample/tcp/qf-md/app",
|
|
51
51
|
"tcp-tls-tc": "node dist/sample/tcp/tls-trade-capture/app",
|
|
@@ -74,9 +74,9 @@
|
|
|
74
74
|
"author": "",
|
|
75
75
|
"license": "MIT",
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@jest/globals": "^30.
|
|
77
|
+
"@jest/globals": "^30.4.1",
|
|
78
78
|
"align-text": "^1.0.2",
|
|
79
|
-
"axios": "^1.
|
|
79
|
+
"axios": "^1.16.1",
|
|
80
80
|
"express": "^5.2.1",
|
|
81
81
|
"lodash": "^4.18.1",
|
|
82
82
|
"mathjs": "^15.2.0",
|
|
@@ -87,10 +87,9 @@
|
|
|
87
87
|
"reflect-metadata": "^0.2.2",
|
|
88
88
|
"sax": "^1.6.0",
|
|
89
89
|
"tsyringe": "^4.10.0",
|
|
90
|
-
"uuid": "^9.0.1",
|
|
91
90
|
"winston": "^3.19.0",
|
|
92
91
|
"word-wrap": "^1.2.5",
|
|
93
|
-
"yauzl": "^3.3.
|
|
92
|
+
"yauzl": "^3.3.1"
|
|
94
93
|
},
|
|
95
94
|
"devDependencies": {
|
|
96
95
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
@@ -100,17 +99,16 @@
|
|
|
100
99
|
"@types/lodash": "^4.17.24",
|
|
101
100
|
"@types/mathjs": "^9.4.2",
|
|
102
101
|
"@types/minimist": "^1.2.5",
|
|
103
|
-
"@types/node": "^25.
|
|
102
|
+
"@types/node": "^25.9.1",
|
|
104
103
|
"@types/request-promise-native": "^1.0.21",
|
|
105
104
|
"@types/sax": "^1.2.7",
|
|
106
|
-
"@types/uuid": "^9.0.8",
|
|
107
105
|
"@types/winston": "^2.4.4",
|
|
108
106
|
"eslint": "^9.39.4",
|
|
109
107
|
"eslint-config-love": "^151.0.0",
|
|
110
|
-
"jest": "^30.
|
|
108
|
+
"jest": "^30.4.2",
|
|
111
109
|
"madge": "^8.0.0",
|
|
112
110
|
"standard": "^17.1.2",
|
|
113
|
-
"ts-jest": "^29.4.
|
|
114
|
-
"typescript": "^6.0.
|
|
111
|
+
"ts-jest": "^29.4.11",
|
|
112
|
+
"typescript": "^6.0.3"
|
|
115
113
|
}
|
|
116
114
|
}
|
|
@@ -30,7 +30,8 @@ export class AsciiParser extends MsgParser {
|
|
|
30
30
|
|
|
31
31
|
constructor (@inject(DITokens.IJsFixConfig) public readonly config: IJsFixConfig,
|
|
32
32
|
@inject(DITokens.readStream) public readonly readStream: Readable | null,
|
|
33
|
-
@inject(DITokens.ParseBuffer) protected readonly receivingBuffer: ElasticBuffer
|
|
33
|
+
@inject(DITokens.ParseBuffer) protected readonly receivingBuffer: ElasticBuffer,
|
|
34
|
+
@inject(DITokens.maxMessageLen) public readonly maxMessageLen: number = 160 * 1024) {
|
|
34
35
|
super()
|
|
35
36
|
|
|
36
37
|
this.delimiter = config.delimiter ?? AsciiChars.Soh
|
|
@@ -38,7 +39,7 @@ export class AsciiParser extends MsgParser {
|
|
|
38
39
|
this.id = AsciiParser.nextId++
|
|
39
40
|
this.segmentParser = config.sessionContainer.resolve<AsciiSegmentParser>(AsciiSegmentParser)
|
|
40
41
|
this.state = config.sessionContainer.resolve<AsciiParserState>(AsciiParserState)
|
|
41
|
-
this.state.locations = new Tags(this.receivingBuffer.size / 10)
|
|
42
|
+
this.state.locations = new Tags(this.receivingBuffer.size / 10, this.maxMessageLen)
|
|
42
43
|
this.state.definitions = this.config.definitions
|
|
43
44
|
this.state.beginMessage()
|
|
44
45
|
if (readStream !== null) {
|
package/src/buffer/tag/tags.ts
CHANGED
|
@@ -8,10 +8,11 @@ export class Tags {
|
|
|
8
8
|
public static readonly CheckSumTag: number = MsgTag.CheckSum
|
|
9
9
|
public static readonly MsgTag: number = MsgTag.MsgType
|
|
10
10
|
|
|
11
|
-
public tagPos: TagPos[] = new Array(this.startingLength)
|
|
11
|
+
public tagPos: TagPos[] = new Array(Math.min(this.startingLength, this.maxLength))
|
|
12
12
|
public nextTagPos: number = 0
|
|
13
13
|
|
|
14
|
-
constructor (public readonly startingLength: number = 30 * 1000
|
|
14
|
+
constructor (public readonly startingLength: number = 30 * 1000,
|
|
15
|
+
public readonly maxLength: number = 1024 * 1024) {
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
public static toJSType (tagType: TagType): string {
|
|
@@ -101,7 +102,7 @@ export class Tags {
|
|
|
101
102
|
|
|
102
103
|
public clone (): Tags {
|
|
103
104
|
const next: number = this.nextTagPos
|
|
104
|
-
const cloned: Tags = new Tags(next)
|
|
105
|
+
const cloned: Tags = new Tags(next, this.maxLength)
|
|
105
106
|
cloned.nextTagPos = next
|
|
106
107
|
for (let i = 0; i < next; ++i) {
|
|
107
108
|
cloned.tagPos[i] = this.tagPos[i].clone()
|
|
@@ -128,7 +129,10 @@ export class Tags {
|
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
private expand (): void {
|
|
131
|
-
|
|
132
|
+
if (this.tagPos.length >= this.maxLength) {
|
|
133
|
+
throw new Error(`tag count exceeds maximum of ${this.maxLength} - message too large or stream misaligned`)
|
|
134
|
+
}
|
|
135
|
+
const size = Math.min(this.tagPos.length * 2, this.maxLength)
|
|
132
136
|
const tagPos = new Array(size)
|
|
133
137
|
for (let i = 0; i < this.tagPos.length; ++i) {
|
|
134
138
|
tagPos[i] = this.tagPos[i]
|
|
@@ -101,7 +101,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
101
101
|
this.sessionLogger.info('logon with ResetSeqNumFlag=Y, accepting regardless of sequence')
|
|
102
102
|
const seqNo = view.getTyped(MsgTag.MsgSeqNum) as number
|
|
103
103
|
this.sessionState.lastPeerMsgSeqNum = seqNo
|
|
104
|
-
this.coordinator.onMessageReceived(seqNo, false)
|
|
104
|
+
this.coordinator.onMessageReceived(seqNo, false).catch((e: Error) => {
|
|
105
|
+
this.sessionLogger.warning(`coordinator.onMessageReceived store persist failed: ${e.message}`)
|
|
106
|
+
})
|
|
105
107
|
return true
|
|
106
108
|
}
|
|
107
109
|
}
|
|
@@ -119,7 +121,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
119
121
|
const possDupFlag = view.getTyped(MsgTag.PossDupFlag) as boolean | undefined
|
|
120
122
|
if (possDupFlag === true) {
|
|
121
123
|
this.sessionLogger.debug(`message '${msgType}' has PossDupFlag=Y, bypassing sequence check`)
|
|
122
|
-
this.coordinator.onMessageReceived(seqNo, true)
|
|
124
|
+
this.coordinator.onMessageReceived(seqNo, true).catch((e: Error) => {
|
|
125
|
+
this.sessionLogger.warning(`coordinator.onMessageReceived store persist failed: ${e.message}`)
|
|
126
|
+
})
|
|
123
127
|
return true
|
|
124
128
|
}
|
|
125
129
|
// Check if this is a delayed message that fills a pending gap range.
|
|
@@ -127,7 +131,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
127
131
|
const inPendingGapRange = pendingRequests.some(p => seqNo >= p.begin && seqNo <= p.end)
|
|
128
132
|
if (inPendingGapRange) {
|
|
129
133
|
this.sessionLogger.info(`accepting delayed message seq ${seqNo} (in pending gap range)`)
|
|
130
|
-
this.coordinator.onMessageReceived(seqNo, false)
|
|
134
|
+
this.coordinator.onMessageReceived(seqNo, false).catch((e: Error) => {
|
|
135
|
+
this.sessionLogger.warning(`coordinator.onMessageReceived store persist failed: ${e.message}`)
|
|
136
|
+
})
|
|
131
137
|
return true
|
|
132
138
|
}
|
|
133
139
|
// serious problem ... drop immediately
|
|
@@ -171,7 +177,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
171
177
|
|
|
172
178
|
// Update sequence state regardless — the gap-triggering message is valid.
|
|
173
179
|
state.lastPeerMsgSeqNum = seqNo
|
|
174
|
-
this.coordinator.onMessageReceived(seqNo, false)
|
|
180
|
+
this.coordinator.onMessageReceived(seqNo, false).catch((e: Error) => {
|
|
181
|
+
this.sessionLogger.warning(`coordinator.onMessageReceived store persist failed: ${e.message}`)
|
|
182
|
+
})
|
|
175
183
|
|
|
176
184
|
// Logon and ResendRequest were already fully handled above (peerLogon / onResendRequest).
|
|
177
185
|
// Don't return true for them — they must not be dispatched to onSessionMsg again.
|
|
@@ -182,7 +190,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
182
190
|
} else {
|
|
183
191
|
ret = true
|
|
184
192
|
state.lastPeerMsgSeqNum = seqNo
|
|
185
|
-
this.coordinator.onMessageReceived(seqNo, false)
|
|
193
|
+
this.coordinator.onMessageReceived(seqNo, false).catch((e: Error) => {
|
|
194
|
+
this.sessionLogger.warning(`coordinator.onMessageReceived store persist failed: ${e.message}`)
|
|
195
|
+
})
|
|
186
196
|
}
|
|
187
197
|
|
|
188
198
|
// Reset timeout recovery on successful message receipt
|
|
@@ -320,6 +330,28 @@ export abstract class AsciiSession extends FixSession {
|
|
|
320
330
|
this.sessionLogger.info('coordinator reset transient state for reconnect')
|
|
321
331
|
}
|
|
322
332
|
|
|
333
|
+
protected override async onPreLogon (): Promise<void> {
|
|
334
|
+
if (!this.config.description.ResetSeqNumFlag) return
|
|
335
|
+
|
|
336
|
+
this.sessionLogger.info('initiator has ResetSeqNumFlag=Y, resetting sequences before logon')
|
|
337
|
+
await this.coordinator.resetSession('initiator ResetSeqNumFlag=Y')
|
|
338
|
+
|
|
339
|
+
const transmitter = this.transport?.transmitter as AsciiMsgTransmitter | undefined
|
|
340
|
+
if (transmitter) {
|
|
341
|
+
transmitter.msgSeqNum = this.coordinator.nextSenderSeqNum
|
|
342
|
+
}
|
|
343
|
+
this.sessionState.lastPeerMsgSeqNum = this.coordinator.lastProcessedPeerSeqNum
|
|
344
|
+
|
|
345
|
+
if (this.store) {
|
|
346
|
+
this.store.clear().catch((e: Error) => {
|
|
347
|
+
this.sessionLogger.warning(`store.clear failed: ${e.message}`)
|
|
348
|
+
})
|
|
349
|
+
this.resender = new FixMsgAsciiStoreResend(this.store, this.config)
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
this.sessionLogger.info(`pre-logon reset complete: encoderSeqNum=${transmitter?.msgSeqNum}`)
|
|
353
|
+
}
|
|
354
|
+
|
|
323
355
|
protected override txOnEncoded (msgType: string, data: string, hdr: ILooseObject): void {
|
|
324
356
|
super.txOnEncoded(msgType, data, hdr)
|
|
325
357
|
// Store the encoded message in the session store for recovery/resend
|
|
@@ -419,7 +451,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
419
451
|
// expect newSeqNo to be the next message's sequence number.
|
|
420
452
|
this.sessionState.lastPeerMsgSeqNum = newSeqNo - 1
|
|
421
453
|
// Notify coordinator to update expected target and clear pending resend requests
|
|
422
|
-
this.coordinator.onGapFillReceived(gapFillSeq, newSeqNo)
|
|
454
|
+
this.coordinator.onGapFillReceived(gapFillSeq, newSeqNo).catch((e: Error) => {
|
|
455
|
+
this.sessionLogger.warning(`coordinator.onGapFillReceived store persist failed: ${e.message}`)
|
|
456
|
+
})
|
|
423
457
|
break
|
|
424
458
|
}
|
|
425
459
|
|
|
@@ -504,7 +538,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
504
538
|
|
|
505
539
|
// Fire-and-forget the async coordinator call (store updates resolve on next microtask)
|
|
506
540
|
// but compute the expected values synchronously since we know the reset outcome
|
|
507
|
-
this.coordinator.handlePeerReset(peerSeqNum, weAlsoReset)
|
|
541
|
+
this.coordinator.handlePeerReset(peerSeqNum, weAlsoReset).catch((e: Error) => {
|
|
542
|
+
this.sessionLogger.warning(`coordinator.handlePeerReset store persist failed: ${e.message}`)
|
|
543
|
+
})
|
|
508
544
|
if (transmitter) {
|
|
509
545
|
transmitter.msgSeqNum = savedEncoderSeqNum ?? 1
|
|
510
546
|
}
|
|
@@ -512,7 +548,9 @@ export abstract class AsciiSession extends FixSession {
|
|
|
512
548
|
|
|
513
549
|
// Recreate resender with empty store
|
|
514
550
|
if (this.store) {
|
|
515
|
-
this.store.clear()
|
|
551
|
+
this.store.clear().catch((e: Error) => {
|
|
552
|
+
this.sessionLogger.warning(`store.clear failed: ${e.message}`)
|
|
553
|
+
})
|
|
516
554
|
this.resender = new FixMsgAsciiStoreResend(this.store, this.config)
|
|
517
555
|
}
|
|
518
556
|
logger.info(`reset complete: encoderSeqNum=${transmitter?.msgSeqNum}, lastPeerMsgSeqNum=${peerSeqNum}`)
|
|
@@ -535,14 +573,18 @@ export abstract class AsciiSession extends FixSession {
|
|
|
535
573
|
if (weReset && resetSeqNumFlag !== true) {
|
|
536
574
|
logger.info('acceptor sending ResetSeqNumFlag=Y (peer sent N), resetting sequences')
|
|
537
575
|
// Fire-and-forget async coordinator call, set values synchronously
|
|
538
|
-
this.coordinator.resetAsAcceptor()
|
|
576
|
+
this.coordinator.resetAsAcceptor().catch((e: Error) => {
|
|
577
|
+
this.sessionLogger.warning(`coordinator.resetAsAcceptor store persist failed: ${e.message}`)
|
|
578
|
+
})
|
|
539
579
|
const transmitter = this.transport?.transmitter as AsciiMsgTransmitter | undefined
|
|
540
580
|
if (transmitter) {
|
|
541
581
|
transmitter.msgSeqNum = 1
|
|
542
582
|
}
|
|
543
583
|
this.sessionState.lastPeerMsgSeqNum = 0
|
|
544
584
|
if (this.store) {
|
|
545
|
-
this.store.clear()
|
|
585
|
+
this.store.clear().catch((e: Error) => {
|
|
586
|
+
this.sessionLogger.warning(`store.clear failed: ${e.message}`)
|
|
587
|
+
})
|
|
546
588
|
this.resender = new FixMsgAsciiStoreResend(this.store, this.config)
|
|
547
589
|
}
|
|
548
590
|
}
|
|
@@ -7,7 +7,7 @@ import { FixDuplex, StringDuplex, StringDuplexTraits } from '../duplex'
|
|
|
7
7
|
import express = require('express')
|
|
8
8
|
import * as bodyParser from 'body-parser'
|
|
9
9
|
import * as http from 'http'
|
|
10
|
-
import {
|
|
10
|
+
import { randomUUID } from 'crypto'
|
|
11
11
|
import { inject, injectable } from 'tsyringe'
|
|
12
12
|
import { DITokens } from '../../runtime/di-tokens'
|
|
13
13
|
|
|
@@ -54,7 +54,7 @@ export class HttpAcceptor extends FixAcceptor {
|
|
|
54
54
|
private saveTransport (tid: number, transport: MsgTransport): string {
|
|
55
55
|
this.transports[tid] = transport
|
|
56
56
|
const keys: string[] = Object.keys(this.transports)
|
|
57
|
-
const a =
|
|
57
|
+
const a = randomUUID()
|
|
58
58
|
this.keys.set(a, transport)
|
|
59
59
|
this.logger.info(`new transport id = ${tid} token = ${a} created total transports = ${keys.length}`)
|
|
60
60
|
this.emit('transport', transport)
|
|
@@ -95,6 +95,11 @@ export abstract class FixSession extends events.EventEmitter {
|
|
|
95
95
|
|
|
96
96
|
private async waitPromise (): Promise<number> {
|
|
97
97
|
const logger = this.sessionLogger
|
|
98
|
+
if (this.initiator) {
|
|
99
|
+
// Hook for subclasses to reset sequences when ResetSeqNumFlag=Y is configured —
|
|
100
|
+
// must run after the store is loaded, before sendLogon stamps a seq num.
|
|
101
|
+
await this.onPreLogon()
|
|
102
|
+
}
|
|
98
103
|
return await new Promise<any>((resolve, reject) => {
|
|
99
104
|
if (this.initiator) {
|
|
100
105
|
logger.debug(`initiator sending logon state = ${this.stateString()}`)
|
|
@@ -398,6 +403,15 @@ export abstract class FixSession extends events.EventEmitter {
|
|
|
398
403
|
// Override in subclass to reset coordinator/transient state
|
|
399
404
|
}
|
|
400
405
|
|
|
406
|
+
/**
|
|
407
|
+
* Called for initiators after the store is loaded but before the Logon is sent.
|
|
408
|
+
* Override to reset sequences/store when ResetSeqNumFlag=Y so the Logon goes out
|
|
409
|
+
* with MsgSeqNum=1 instead of the recovered sender seq num.
|
|
410
|
+
*/
|
|
411
|
+
protected async onPreLogon (): Promise<void> {
|
|
412
|
+
// Default no-op
|
|
413
|
+
}
|
|
414
|
+
|
|
401
415
|
protected stop (error: Error | null = null): void {
|
|
402
416
|
if (this.sessionState.state === SessionState.Stopped) {
|
|
403
417
|
return
|