jspurefix 5.9.2 → 5.10.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.
Files changed (54) hide show
  1. package/README.md +35 -0
  2. package/dist/buffer/ascii/ascii-encoder.d.ts +1 -0
  3. package/dist/buffer/ascii/ascii-encoder.js +15 -0
  4. package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
  5. package/dist/buffer/msg-encoder.d.ts +2 -0
  6. package/dist/buffer/msg-encoder.js +1 -0
  7. package/dist/buffer/msg-encoder.js.map +1 -1
  8. package/dist/runtime/session-container.d.ts +3 -0
  9. package/dist/runtime/session-container.js +8 -0
  10. package/dist/runtime/session-container.js.map +1 -1
  11. package/dist/runtime/session-launcher.d.ts +2 -1
  12. package/dist/runtime/session-launcher.js +4 -1
  13. package/dist/runtime/session-launcher.js.map +1 -1
  14. package/dist/transport/ascii/ascii-msg-transmitter.d.ts +1 -0
  15. package/dist/transport/ascii/ascii-msg-transmitter.js +15 -0
  16. package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
  17. package/dist/transport/ascii/ascii-session-msg-factory.js +1 -7
  18. package/dist/transport/ascii/ascii-session-msg-factory.js.map +1 -1
  19. package/dist/transport/fixml/fixml-session-msg-factory.js +1 -6
  20. package/dist/transport/fixml/fixml-session-msg-factory.js.map +1 -1
  21. package/dist/transport/index.d.ts +3 -0
  22. package/dist/transport/index.js +3 -0
  23. package/dist/transport/index.js.map +1 -1
  24. package/dist/transport/msg-payload.d.ts +3 -1
  25. package/dist/transport/msg-payload.js +2 -1
  26. package/dist/transport/msg-payload.js.map +1 -1
  27. package/dist/transport/msg-transmitter.d.ts +4 -1
  28. package/dist/transport/msg-transmitter.js +18 -2
  29. package/dist/transport/msg-transmitter.js.map +1 -1
  30. package/dist/transport/send-callback.d.ts +7 -0
  31. package/dist/transport/send-callback.js +3 -0
  32. package/dist/transport/send-callback.js.map +1 -0
  33. package/dist/transport/session/fix-session.d.ts +2 -1
  34. package/dist/transport/session/fix-session.js +12 -3
  35. package/dist/transport/session/fix-session.js.map +1 -1
  36. package/dist/transport/session/session-description.d.ts +2 -0
  37. package/dist/transport/session/session-description.js.map +1 -1
  38. package/docs/custom-logon.md +225 -0
  39. package/jsfix.test_client.txt +62 -62
  40. package/jsfix.test_server.txt +72 -72
  41. package/package.json +1 -1
  42. package/src/buffer/ascii/ascii-encoder.ts +20 -0
  43. package/src/buffer/msg-encoder.ts +12 -0
  44. package/src/runtime/session-container.ts +20 -0
  45. package/src/runtime/session-launcher.ts +19 -2
  46. package/src/transport/ascii/ascii-msg-transmitter.ts +20 -0
  47. package/src/transport/ascii/ascii-session-msg-factory.ts +6 -1
  48. package/src/transport/fixml/fixml-session-msg-factory.ts +3 -1
  49. package/src/transport/index.ts +5 -0
  50. package/src/transport/msg-payload.ts +5 -1
  51. package/src/transport/msg-transmitter.ts +31 -2
  52. package/src/transport/send-callback.ts +33 -0
  53. package/src/transport/session/fix-session.ts +22 -3
  54. package/src/transport/session/session-description.ts +14 -0
@@ -0,0 +1,225 @@
1
+ # Customising the Logon
2
+
3
+ Almost every counterparty wants something on the Logon that the standard message does
4
+ not carry — an account, a default application version, a broker-issued token, a free
5
+ text field. This is the single most asked question about jspurefix
6
+ ([#93](https://github.com/TimelordUK/jspurefix/issues/93),
7
+ [#39](https://github.com/TimelordUK/jspurefix/issues/39),
8
+ [#96](https://github.com/TimelordUK/jspurefix/issues/96)) and it has a short answer
9
+ and a long one.
10
+
11
+ **The short answer:** two things must both be true, and people usually only do one.
12
+
13
+ 1. The field must be **on the Logon object** the engine sends.
14
+ 2. The field must be **declared on Logon in the dictionary** the session loads —
15
+ otherwise the encoder has no tag to write and drops it.
16
+
17
+ Doing (1) without (2) is the classic failure: you add the field, nothing changes, and
18
+ nothing explains why. The engine warns when it drops a field, so watch the log:
19
+
20
+ ```
21
+ warn test_client:encoder field 'Account' is not declared on Logon in this dictionary - it will not be sent
22
+ ```
23
+
24
+ That message means you need step (2) — a dictionary — not more code.
25
+
26
+ ---
27
+
28
+ ## Step 1 — put the field on the message
29
+
30
+ Three ways, in increasing order of effort. Use the first one that fits.
31
+
32
+ ### The `Logon` block (no code)
33
+
34
+ Name the extra fields under `Logon` in the session description. They are merged over
35
+ the fields the engine derives from the description, so you can add, override, or
36
+ suppress:
37
+
38
+ ```json
39
+ {
40
+ "application": {
41
+ "type": "initiator",
42
+ "name": "my_client",
43
+ "tcp": { "host": "fix.broker.com", "port": 10400 },
44
+ "protocol": "ascii",
45
+ "dictionary": "repo44"
46
+ },
47
+ "BeginString": "FIX4.4",
48
+ "SenderCompId": "TVKD",
49
+ "TargetCompID": "MXVMDGW",
50
+ "Password": "password",
51
+ "HeartBtInt": 30,
52
+ "ResetSeqNumFlag": true,
53
+
54
+ "Logon": {
55
+ "Account": "TVKD_001",
56
+ "DefaultApplVerID": "9"
57
+ }
58
+ }
59
+ ```
60
+
61
+ - **Add** a field — name it with its value.
62
+ - **Override** a field the engine derived — `"Logon": { "HeartBtInt": 60 }`.
63
+ - **Suppress** a field — `"Logon": { "Username": null }`. (Simply leaving `Username`
64
+ out of the description entirely has the same effect; a null or empty value is never
65
+ encoded.)
66
+
67
+ Note this block applies to the Logon your session *sends*. An acceptor sends a Logon
68
+ too — its response — so a block configured on an acceptor appears on that response.
69
+
70
+ `EncryptMethod` is a special case: the engine always derives `0` (None) and ignores a
71
+ top-level `"EncryptMethod"` in the description. Set it through the block if you need
72
+ another value.
73
+
74
+ ### An `ObjectMutator` (a callback)
75
+
76
+ When the values are computed at run time — a signature over the sequence number, a
77
+ nonce, a token fetched at start up — a static block will not do. Every session
78
+ message passes through the factory's mutator on its way out:
79
+
80
+ ```typescript
81
+ import { ObjectMutator, ISessionDescription, MsgType } from 'jspurefix'
82
+ import { ILooseObject } from 'jspurefix/dist/collections/collection'
83
+
84
+ const stampToken: ObjectMutator = (
85
+ description: ISessionDescription,
86
+ type: string,
87
+ o: ILooseObject): ILooseObject => {
88
+ if (type !== MsgType.Logon) return o
89
+ return { ...o, RawData: Buffer.from(signOn(description.SenderCompId)) }
90
+ }
91
+ ```
92
+
93
+ The mutator is a constructor argument to any factory deriving from
94
+ `ASessionMsgFactory`, so install it with the factory (next section). It also sees
95
+ `StandardHeader` (as type `'StandardHeader'`), Logout, TestRequest, Heartbeat,
96
+ ResendRequest, SequenceReset and Reject — which is what makes it the right hook for
97
+ anything a counterparty demands on *every* message.
98
+
99
+ ### Your own session message factory
100
+
101
+ Full control: subclass the stock factory and override `logon()`.
102
+
103
+ ```typescript
104
+ import { AsciiSessionMsgFactory } from 'jspurefix'
105
+ import { ILooseObject } from 'jspurefix/dist/collections/collection'
106
+
107
+ export class BrokerSessionMsgFactory extends AsciiSessionMsgFactory {
108
+ public logon (): ILooseObject {
109
+ return {
110
+ ...super.logon(),
111
+ Password: this.freshToken(),
112
+ Account: this.description.SenderCompId
113
+ }
114
+ }
115
+
116
+ private freshToken (): string { /* ... */ }
117
+ }
118
+ ```
119
+
120
+ Override `header()` the same way if a counterparty needs a header field on every
121
+ message. Call `super` and spread — do not rebuild the object from scratch, or you
122
+ will lose fields the engine relies on.
123
+
124
+ ## Installing your factory
125
+
126
+ The launcher you already subclass has one method for this:
127
+
128
+ ```typescript
129
+ class AppLauncher extends SessionLauncher {
130
+ protected override makeSessionMsgFactory (
131
+ description: ISessionDescription): ISessionMsgFactory | null {
132
+ return new BrokerSessionMsgFactory(description)
133
+ }
134
+ }
135
+ ```
136
+
137
+ Return `null` for the stock factory. If you build the container yourself, pass a
138
+ provider instead:
139
+
140
+ ```typescript
141
+ new SessionContainer(d => new BrokerSessionMsgFactory(d))
142
+ ```
143
+
144
+ Both work for initiators and acceptors. An acceptor builds one factory **per accepted
145
+ connection**, so that each session's headers carry its own comp ids; your factory is
146
+ carried into those per-connection scopes rather than being replaced by the stock one
147
+ ([#87](https://github.com/TimelordUK/jspurefix/issues/87)). That works automatically
148
+ for any factory whose constructor takes `(description, mutator)`. If yours takes
149
+ something else, override `cloneFor`:
150
+
151
+ ```typescript
152
+ public override cloneFor (description: ISessionDescription): ISessionMsgFactory {
153
+ return new MyFactory(description, this.apiKey)
154
+ }
155
+ ```
156
+
157
+ > Older advice in issue #39 — `sessionContainer.clearInstances()`, re-register, and
158
+ > rebuild `JsFixConfig` inside `registerApplication` — is obsolete and will fight the
159
+ > per-connection session scopes. Use `makeSessionMsgFactory`.
160
+
161
+ ---
162
+
163
+ ## Step 2 — declare the field in a dictionary
164
+
165
+ The encoder is dictionary driven. It resolves each key on your object to a field of
166
+ the message being encoded, and a key it cannot resolve has no tag, so it is dropped.
167
+ `Account` is tag 1, but it is **not a field of Logon** in standard FIX 4.4 — so
168
+ putting it on the Logon object achieves nothing on its own.
169
+
170
+ Copy the QuickFIX XML for your dialect, add the field to the Logon message, and point
171
+ the session at it:
172
+
173
+ ```xml
174
+ <message name='Logon' msgtype='A' msgcat='admin'>
175
+ <field name='EncryptMethod' required='Y' />
176
+ <field name='HeartBtInt' required='Y' />
177
+ <field name='ResetSeqNumFlag' required='N' />
178
+ <field name='Username' required='N' />
179
+ <field name='Password' required='N' />
180
+ <!-- what this counterparty demands -->
181
+ <field name='Account' required='N' />
182
+ <field name='DefaultApplVerID' required='N' />
183
+ </message>
184
+ ```
185
+
186
+ The field must also exist in the `<fields>` section of the same file:
187
+
188
+ ```xml
189
+ <field number='1' name='Account' type='STRING' />
190
+ ```
191
+
192
+ Then reference it from the session description:
193
+
194
+ ```json
195
+ { "application": { "dictionary": "/abs/path/to/FIX44-BROKER.xml" } }
196
+ ```
197
+
198
+ > **Path gotcha.** A *relative* dictionary path is resolved against the **jspurefix
199
+ > package root** (`node_modules/jspurefix`), not your project's working directory.
200
+ > Use an absolute path — `path.join(__dirname, 'dictionaries/FIX44-BROKER.xml')` —
201
+ > or register an alias in `data/dictionary.json` as described in the README under
202
+ > [Data Dictionaries](../README.md#data-dictionaries).
203
+
204
+ Generating typed interfaces for the dialect is optional — the engine reads the XML at
205
+ run time either way — but worth doing if you want `ILogon` to know about your field.
206
+
207
+ ## Checklist when a tag still is not on the wire
208
+
209
+ 1. Is there an `is not declared on Logon in this dictionary` warning in the log? →
210
+ the dictionary is the problem, not your code.
211
+ 2. Is the session actually loading the dictionary you edited? Relative paths resolve
212
+ against the package root — see above.
213
+ 3. Is the value `null`, `undefined` or `''`? Those are never encoded, by design.
214
+ 4. Are you customising a factory the acceptor then replaces? Implement `cloneFor` if
215
+ your constructor is not `(description, mutator)`.
216
+ 5. Turn on `logReceivedMsgs` / the `onEncoded` hook on your session and read the
217
+ encoded string directly — it is the ground truth.
218
+
219
+ ## See also
220
+
221
+ - [docs/acceptor.md](acceptor.md) — per-connection session scopes and why the factory
222
+ is cloned.
223
+ - `src/test/session/custom-logon.test.ts` — every behaviour above, exercised.
224
+ - `src/test/session/custom-session-msg-factory.test.ts` — factory survival into
225
+ acceptor scopes.
@@ -1,62 +1,62 @@
1
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:29.192|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=108|
2
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:29.199|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=163|
3
- 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:29.200|7=1|16=1|10=233|
4
- 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260802-16:47:29.205|122=20260802-16:47:29.204|123=Y|36=2|10=106|
5
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:31.203|58=5|10=205|
6
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:34.035|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=100|
7
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:34.037|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=150|
8
- 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:34.038|7=1|16=0|10=237|
9
- 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260802-16:47:34.041|122=20260802-16:47:34.041|123=Y|36=2|10=095|
10
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:36.041|58=5|10=210|
11
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:38.525|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=108|
12
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:38.527|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=158|
13
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:38.527|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=111|
14
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:39.070|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=104|
15
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:39.071|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=153|
16
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:40.075|58=5|10=212|
17
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:47:40.529|58=5|10=217|
18
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:42.868|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=113|
19
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:42.870|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=154|
20
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:43.872|58=5|10=220|
21
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:46.667|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=114|
22
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:46.668|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=163|
23
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=0|57=fix|52=20260802-16:47:47.670|58=5|10=218|
24
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:50.181|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=100|
25
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=5|57=fix|52=20260802-16:47:50.182|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=153|
26
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:51.184|58=5|10=215|
27
- 8=FIX.4.4|9=0000110|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:53.673|98=0|141=Y|553=js-client|554=pwd-client|10=177|
28
- 8=FIX.4.4|9=0000125|35=3|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:53.674|45=1|372=A|373=1|58=msgType A missing required tag 108|10=011|
29
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:58.294|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=113|
30
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:58.296|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=163|
31
- 8=FIX.4.4|9=0000111|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:58.298|45=2|372=ZZ|373=11|58=msgType ZZ unknown|10=166|
32
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:00.298|58=5|10=217|
33
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:03.059|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
34
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:03.061|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=144|
35
- 8=FIX.4.4|9=0000146|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:03.063|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 143|10=068|
36
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:05.063|58=5|10=212|
37
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:07.062|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=101|
38
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:11.555|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
39
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:11.556|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=152|
40
- 8=FIX.4.4|9=0000145|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:11.558|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 59|10=033|
41
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:13.559|58=5|10=221|
42
- 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:16.035|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=051|
43
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:16.036|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=150|
44
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:48:18.042|112=Sun, 02 Aug 2026 16:48:18 GMT|10=157|
45
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:48:20.242|112=Sun, 02 Aug 2026 16:48:20 GMT|10=146|
46
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:22.039|58=5|10=213|
47
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:24.515|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
48
- 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:24.516|98=0|108=2|141=Y|553=js-server|554=pwd-server|10=102|
49
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:26.523|112=Sun, 02 Aug 2026 16:48:26 GMT|10=159|
50
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:28.525|112=Sun, 02 Aug 2026 16:48:28 GMT|10=166|
51
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=4|57=fix|52=20260802-16:48:30.531|112=Sun, 02 Aug 2026 16:48:30 GMT|10=150|
52
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=5|57=fix|52=20260802-16:48:32.518|58=5|10=219|
53
- 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:35.238|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=057|
54
- 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:35.239|98=0|108=5|141=Y|553=js-server|554=pwd-server|10=109|
55
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:48:37.244|112=Sun, 02 Aug 2026 16:48:37 GMT|10=163|
56
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:48:39.248|112=Sun, 02 Aug 2026 16:48:39 GMT|10=172|
57
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:40.250|112=Sun, 02 Aug 2026 16:48:40 GMT|10=148|
58
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=4|57=fix|52=20260802-16:48:41.251|112=Sun, 02 Aug 2026 16:48:41 GMT|10=153|
59
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:43.242|58=5|10=213|
60
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:50:41.579|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=105|
61
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:50:41.589|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=154|
62
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:50:42.593|58=5|10=213|
1
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:37.235|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=111|
2
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:37.240|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=155|
3
+ 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:37.241|7=1|16=1|10=243|
4
+ 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260808-13:59:37.245|122=20260808-13:59:37.245|123=Y|36=2|10=125|
5
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:39.246|58=5|10=226|
6
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:42.038|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=108|
7
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:42.040|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=149|
8
+ 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:42.041|7=1|16=0|10=236|
9
+ 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260808-13:59:42.043|122=20260808-13:59:42.043|123=Y|36=2|10=109|
10
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:44.043|58=5|10=217|
11
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:46.524|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=112|
12
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:46.526|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=162|
13
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:46.526|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=115|
14
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:47.064|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=112|
15
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:47.066|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=162|
16
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:48.068|58=5|10=228|
17
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-13:59:48.527|58=5|10=229|
18
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:50.829|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=115|
19
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:50.830|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=155|
20
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:51.832|58=5|10=221|
21
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:54.326|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=111|
22
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:54.327|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=160|
23
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=0|57=fix|52=20260808-13:59:55.328|58=5|10=223|
24
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:57.802|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=113|
25
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=5|57=fix|52=20260808-13:59:57.803|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=166|
26
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:58.805|58=5|10=228|
27
+ 8=FIX.4.4|9=0000110|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:01.434|98=0|141=Y|553=js-client|554=pwd-client|10=158|
28
+ 8=FIX.4.4|9=0000125|35=3|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:01.435|45=1|372=A|373=1|58=msgType A missing required tag 108|10=248|
29
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:06.211|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=088|
30
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:06.213|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=138|
31
+ 8=FIX.4.4|9=0000111|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:06.214|45=2|372=ZZ|373=11|58=msgType ZZ unknown|10=140|
32
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:08.215|58=5|10=206|
33
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:10.703|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=089|
34
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:10.704|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=138|
35
+ 8=FIX.4.4|9=0000146|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:10.705|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 143|10=061|
36
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:12.705|58=5|10=205|
37
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:14.705|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=095|
38
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:19.323|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=096|
39
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:19.324|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=145|
40
+ 8=FIX.4.4|9=0000145|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:19.326|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 59|10=026|
41
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:21.326|58=5|10=204|
42
+ 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:24.088|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=050|
43
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:24.089|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=149|
44
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-14:00:26.095|112=Sat, 08 Aug 2026 14:00:26 GMT|10=133|
45
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-14:00:28.099|112=Sat, 08 Aug 2026 14:00:28 GMT|10=142|
46
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:30.091|58=5|10=202|
47
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:32.593|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=100|
48
+ 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:32.594|98=0|108=2|141=Y|553=js-server|554=pwd-server|10=099|
49
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:34.598|112=Sat, 08 Aug 2026 14:00:34 GMT|10=139|
50
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:36.602|112=Sat, 08 Aug 2026 14:00:36 GMT|10=130|
51
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=4|57=fix|52=20260808-14:00:38.606|112=Sat, 08 Aug 2026 14:00:38 GMT|10=139|
52
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=5|57=fix|52=20260808-14:00:40.596|58=5|10=216|
53
+ 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:43.075|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=047|
54
+ 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:43.077|98=0|108=5|141=Y|553=js-server|554=pwd-server|10=100|
55
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-14:00:45.081|112=Sat, 08 Aug 2026 14:00:45 GMT|10=130|
56
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-14:00:47.086|112=Sat, 08 Aug 2026 14:00:47 GMT|10=140|
57
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:48.087|112=Sat, 08 Aug 2026 14:00:48 GMT|10=142|
58
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=4|57=fix|52=20260808-14:00:49.089|112=Sat, 08 Aug 2026 14:00:49 GMT|10=148|
59
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:51.078|58=5|10=211|
60
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:03:01.489|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
61
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:03:01.499|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=152|
62
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:03:02.504|58=5|10=203|
@@ -1,75 +1,75 @@
1
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:29.192|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=108|
2
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:29.199|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=163|
3
- 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:29.200|7=1|16=1|10=233|
4
- 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260802-16:47:29.205|122=20260802-16:47:29.204|123=Y|36=2|10=106|
5
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:47:31.202|58=5|10=205|
6
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:31.203|58=5|10=205|
7
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:34.035|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=100|
8
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:34.037|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=150|
9
- 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:34.038|7=1|16=0|10=237|
10
- 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260802-16:47:34.041|122=20260802-16:47:34.041|123=Y|36=2|10=095|
11
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:47:36.040|58=5|10=210|
12
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:36.041|58=5|10=210|
13
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:38.525|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=108|
14
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:38.527|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=158|
15
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:38.527|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=111|
16
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:39.070|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=104|
17
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:39.071|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=153|
18
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:40.074|58=5|10=211|
19
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:40.075|58=5|10=212|
20
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:42.868|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=113|
21
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:42.870|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=154|
22
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:43.871|58=5|10=219|
23
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:43.872|58=5|10=220|
24
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:46.667|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=114|
25
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:46.668|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=163|
26
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=0|57=fix|52=20260802-16:47:47.670|58=5|10=218|
27
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:50.181|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=100|
28
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=5|57=fix|52=20260802-16:47:50.182|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=153|
29
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:47:51.183|58=5|10=214|
30
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:47:51.184|58=5|10=215|
31
- 8=FIX.4.4|9=0000110|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:53.673|98=0|141=Y|553=js-client|554=pwd-client|10=177|
32
- 8=FIX.4.4|9=0000125|35=3|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:47:53.674|45=1|372=A|373=1|58=msgType A missing required tag 108|10=011|
33
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:47:58.294|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=20260802-16:47:58.296|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=163|
1
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:37.235|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=111|
2
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:37.240|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=155|
3
+ 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:37.241|7=1|16=1|10=243|
4
+ 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260808-13:59:37.245|122=20260808-13:59:37.245|123=Y|36=2|10=125|
5
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-13:59:39.244|58=5|10=225|
6
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:39.246|58=5|10=226|
7
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:42.038|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=108|
8
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:42.040|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=149|
9
+ 8=FIX.4.4|9=0000079|35=2|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:42.041|7=1|16=0|10=236|
10
+ 8=FIX.4.4|9=0000112|35=4|49=accept-comp|56=init-comp|34=1|57=fix|43=Y|52=20260808-13:59:42.043|122=20260808-13:59:42.043|123=Y|36=2|10=109|
11
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-13:59:44.042|58=5|10=217|
12
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:44.043|58=5|10=217|
13
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:46.524|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=112|
14
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:46.526|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=162|
15
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:46.526|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=115|
16
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:47.064|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=112|
17
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:47.066|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=162|
18
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:48.067|58=5|10=227|
19
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:48.068|58=5|10=228|
20
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:50.829|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=115|
21
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:50.830|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=155|
22
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:51.831|58=5|10=220|
23
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:51.832|58=5|10=221|
24
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:54.326|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=111|
25
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-13:59:54.327|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=160|
26
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=0|57=fix|52=20260808-13:59:55.328|58=5|10=223|
27
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-13:59:57.802|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=113|
28
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=5|57=fix|52=20260808-13:59:57.803|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=166|
29
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-13:59:58.804|58=5|10=227|
30
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-13:59:58.805|58=5|10=228|
31
+ 8=FIX.4.4|9=0000110|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:01.434|98=0|141=Y|553=js-client|554=pwd-client|10=158|
32
+ 8=FIX.4.4|9=0000125|35=3|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:01.435|45=1|372=A|373=1|58=msgType A missing required tag 108|10=248|
33
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:06.211|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=088|
34
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:06.213|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=138|
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=20260802-16:47:58.298|45=2|372=ZZ|373=11|58=msgType ZZ unknown|10=166|
37
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:48:00.297|58=5|10=216|
38
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:00.298|58=5|10=217|
39
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:03.059|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
40
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:03.061|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=144|
36
+ 8=FIX.4.4|9=0000111|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:06.214|45=2|372=ZZ|373=11|58=msgType ZZ unknown|10=140|
37
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-14:00:08.214|58=5|10=205|
38
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:08.215|58=5|10=206|
39
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:10.703|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=089|
40
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:10.704|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=138|
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=20260802-16:48:03.063|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 143|10=068|
43
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:48:05.062|58=5|10=211|
44
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:05.063|58=5|10=212|
45
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:11.555|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
46
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:11.556|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=152|
42
+ 8=FIX.4.4|9=0000146|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:10.705|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 143|10=061|
43
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-14:00:12.704|58=5|10=204|
44
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:12.705|58=5|10=205|
45
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:19.323|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=096|
46
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:19.324|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=145|
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=20260802-16:48:11.558|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 59|10=033|
49
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:48:13.558|58=5|10=220|
50
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:13.559|58=5|10=221|
51
- 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:16.035|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=051|
52
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:16.036|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=150|
53
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:48:18.042|112=Sun, 02 Aug 2026 16:48:18 GMT|10=157|
54
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:48:20.242|112=Sun, 02 Aug 2026 16:48:20 GMT|10=146|
55
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=4|57=fix|52=20260802-16:48:22.038|58=5|10=214|
56
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:22.039|58=5|10=213|
57
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:24.515|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
58
- 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:24.516|98=0|108=2|141=Y|553=js-server|554=pwd-server|10=102|
59
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:26.523|112=Sun, 02 Aug 2026 16:48:26 GMT|10=159|
60
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:28.525|112=Sun, 02 Aug 2026 16:48:28 GMT|10=166|
61
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=4|57=fix|52=20260802-16:48:30.531|112=Sun, 02 Aug 2026 16:48:30 GMT|10=150|
62
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:48:32.517|58=5|10=215|
63
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=5|57=fix|52=20260802-16:48:32.518|58=5|10=219|
64
- 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:48:35.238|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=057|
65
- 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:48:35.239|98=0|108=5|141=Y|553=js-server|554=pwd-server|10=109|
66
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:48:37.244|112=Sun, 02 Aug 2026 16:48:37 GMT|10=163|
67
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260802-16:48:39.248|112=Sun, 02 Aug 2026 16:48:39 GMT|10=172|
68
- 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:48:40.250|112=Sun, 02 Aug 2026 16:48:40 GMT|10=148|
69
- 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=4|57=fix|52=20260802-16:48:41.251|112=Sun, 02 Aug 2026 16:48:41 GMT|10=153|
70
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=5|57=fix|52=20260802-16:48:43.241|58=5|10=214|
71
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260802-16:48:43.242|58=5|10=213|
72
- 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260802-16:50:41.579|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=105|
73
- 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260802-16:50:41.589|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=154|
74
- 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260802-16:50:42.592|58=5|10=212|
75
- 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260802-16:50:42.593|58=5|10=213|
48
+ 8=FIX.4.4|9=0000145|35=3|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:19.326|45=2|372=0|373=5|58=msgType 0 checksum failed. received = 95 computed = 59|10=026|
49
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-14:00:21.325|58=5|10=203|
50
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:21.326|58=5|10=204|
51
+ 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:24.088|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=050|
52
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:24.089|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=149|
53
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-14:00:26.095|112=Sat, 08 Aug 2026 14:00:26 GMT|10=133|
54
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-14:00:28.099|112=Sat, 08 Aug 2026 14:00:28 GMT|10=142|
55
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=4|57=fix|52=20260808-14:00:30.090|58=5|10=203|
56
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:30.091|58=5|10=202|
57
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:32.593|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=100|
58
+ 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:32.594|98=0|108=2|141=Y|553=js-server|554=pwd-server|10=099|
59
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:34.598|112=Sat, 08 Aug 2026 14:00:34 GMT|10=139|
60
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:36.602|112=Sat, 08 Aug 2026 14:00:36 GMT|10=130|
61
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=4|57=fix|52=20260808-14:00:38.606|112=Sat, 08 Aug 2026 14:00:38 GMT|10=139|
62
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-14:00:40.595|58=5|10=212|
63
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=5|57=fix|52=20260808-14:00:40.596|58=5|10=216|
64
+ 8=FIX.4.4|9=0000116|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:00:43.075|98=0|108=2|141=Y|553=js-client|554=pwd-client|10=047|
65
+ 8=FIX.4.4|9=0000116|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:00:43.077|98=0|108=5|141=Y|553=js-server|554=pwd-server|10=100|
66
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-14:00:45.081|112=Sat, 08 Aug 2026 14:00:45 GMT|10=130|
67
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=3|57=fix|52=20260808-14:00:47.086|112=Sat, 08 Aug 2026 14:00:47 GMT|10=140|
68
+ 8=FIX.4.4|9=0000104|35=0|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:00:48.087|112=Sat, 08 Aug 2026 14:00:48 GMT|10=142|
69
+ 8=FIX.4.4|9=0000104|35=0|49=init-comp|56=accept-comp|34=4|57=fix|52=20260808-14:00:49.089|112=Sat, 08 Aug 2026 14:00:49 GMT|10=148|
70
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=5|57=fix|52=20260808-14:00:51.077|58=5|10=212|
71
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=3|57=fix|52=20260808-14:00:51.078|58=5|10=211|
72
+ 8=FIX.4.4|9=0000117|35=A|49=init-comp|56=accept-comp|34=1|57=fix|52=20260808-14:03:01.489|98=0|108=30|141=Y|553=js-client|554=pwd-client|10=103|
73
+ 8=FIX.4.4|9=0000117|35=A|49=accept-comp|56=init-comp|34=1|57=fix|52=20260808-14:03:01.499|98=0|108=30|141=Y|553=js-server|554=pwd-server|10=152|
74
+ 8=FIX.4.4|9=0000075|35=5|49=init-comp|56=accept-comp|34=2|57=fix|52=20260808-14:03:02.502|58=5|10=201|
75
+ 8=FIX.4.4|9=0000075|35=5|49=accept-comp|56=init-comp|34=2|57=fix|52=20260808-14:03:02.504|58=5|10=203|
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jspurefix",
3
- "version": "5.9.2",
3
+ "version": "5.10.0",
4
4
  "description": "pure node js fix engine",
5
5
  "keywords": [
6
6
  "typescript",
@@ -90,6 +90,8 @@ export class AsciiEncoder extends MsgEncoder {
90
90
  const field = set.localNameToField.get(current)
91
91
  if (field) {
92
92
  a[j++] = field
93
+ } else if (this.onUnknownField && !AsciiEncoder.expectedMiss(set, current)) {
94
+ this.onUnknownField(current, set.name)
93
95
  }
94
96
  return a
95
97
  }, new Array(keys.length))
@@ -97,6 +99,24 @@ export class AsciiEncoder extends MsgEncoder {
97
99
  return fields
98
100
  }
99
101
 
102
+ /**
103
+ * Keys that legitimately fail to resolve against this set, so reporting them would
104
+ * be noise: the header and trailer are encoded separately by the transmitter, and
105
+ * a repeating group may be keyed by its count field rather than the group name -
106
+ * encodeInstances accepts either.
107
+ */
108
+ private static expectedMiss (set: IContainedSet, name: string): boolean {
109
+ if (name === 'StandardHeader' || name === 'StandardTrailer') {
110
+ return true
111
+ }
112
+ for (const group of set.groups.values()) {
113
+ if ((group as any).noOfField?.name === name) {
114
+ return true
115
+ }
116
+ }
117
+ return false
118
+ }
119
+
100
120
  private encodeInstances (o: ILooseObject, gf: ContainedGroupField): void {
101
121
  const noOfField: SimpleFieldDefinition | null = gf.definition.noOfField
102
122
  if (!noOfField) return
@@ -3,7 +3,19 @@ import { FixDefinitions } from '../dictionary/definition'
3
3
  import { IContainedSet } from '../dictionary/contained'
4
4
  import * as events from 'events'
5
5
 
6
+ export type UnknownFieldHandler = (fieldName: string, setName: string) => void
7
+
6
8
  export abstract class MsgEncoder extends events.EventEmitter {
9
+ /**
10
+ * Called when an object carries a key the set being encoded has no field for.
11
+ * The key is dropped - it has no tag, so there is nothing to write - and without
12
+ * this hook that happens in complete silence, which is the single most confusing
13
+ * thing about adding a bespoke field. Every report of "my tag never goes on the
14
+ * wire" (issues #93, #39, #96) is this, and the fix is nearly always a dictionary
15
+ * that does not declare the field on that message.
16
+ */
17
+ public onUnknownField: UnknownFieldHandler | null = null
18
+
7
19
  protected constructor (public readonly definitions: FixDefinitions) {
8
20
  super()
9
21
  }