jspurefix 2.2.1 → 3.0.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 (639) hide show
  1. package/.eslintrc +30 -0
  2. package/README.md +297 -249
  3. package/data/session/test-http-initiator.json +2 -2
  4. package/dist/buffer/ascii/ascii-chars.js.map +1 -1
  5. package/dist/buffer/ascii/ascii-encoder.js +9 -5
  6. package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
  7. package/dist/buffer/ascii/ascii-parser-state.d.ts +2 -2
  8. package/dist/buffer/ascii/ascii-parser-state.js +1 -1
  9. package/dist/buffer/ascii/ascii-parser-state.js.map +1 -1
  10. package/dist/buffer/ascii/ascii-parser.d.ts +2 -2
  11. package/dist/buffer/ascii/ascii-parser.js +17 -11
  12. package/dist/buffer/ascii/ascii-parser.js.map +1 -1
  13. package/dist/buffer/ascii/ascii-segment-parser.d.ts +1 -1
  14. package/dist/buffer/ascii/ascii-segment-parser.js +11 -3
  15. package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
  16. package/dist/buffer/ascii/ascii-view.d.ts +3 -3
  17. package/dist/buffer/ascii/ascii-view.js +18 -0
  18. package/dist/buffer/ascii/ascii-view.js.map +1 -1
  19. package/dist/buffer/ascii/itime-formatter.d.ts +12 -12
  20. package/dist/buffer/ascii/itime-formatter.js.map +1 -1
  21. package/dist/buffer/ascii/time-formatter.d.ts +6 -6
  22. package/dist/buffer/ascii/time-formatter.js.map +1 -1
  23. package/dist/buffer/elastic-buffer.d.ts +1 -1
  24. package/dist/buffer/elastic-buffer.js +2 -2
  25. package/dist/buffer/elastic-buffer.js.map +1 -1
  26. package/dist/buffer/encode-proxy.js +1 -1
  27. package/dist/buffer/encode-proxy.js.map +1 -1
  28. package/dist/buffer/encoder-state.d.ts +2 -2
  29. package/dist/buffer/encoder-state.js +4 -1
  30. package/dist/buffer/encoder-state.js.map +1 -1
  31. package/dist/buffer/fixml/fixml-encoder.js +4 -2
  32. package/dist/buffer/fixml/fixml-encoder.js.map +1 -1
  33. package/dist/buffer/fixml/fixml-parser.js +61 -39
  34. package/dist/buffer/fixml/fixml-parser.js.map +1 -1
  35. package/dist/buffer/fixml/fixml-view.js +3 -3
  36. package/dist/buffer/fixml/fixml-view.js.map +1 -1
  37. package/dist/buffer/fixml/populated-attributes.js.map +1 -1
  38. package/dist/buffer/msg-encoder.js +2 -1
  39. package/dist/buffer/msg-encoder.js.map +1 -1
  40. package/dist/buffer/msg-view.d.ts +9 -9
  41. package/dist/buffer/msg-view.js +58 -25
  42. package/dist/buffer/msg-view.js.map +1 -1
  43. package/dist/buffer/segment/segment-description.d.ts +4 -4
  44. package/dist/buffer/segment/segment-description.js +7 -5
  45. package/dist/buffer/segment/segment-description.js.map +1 -1
  46. package/dist/buffer/segment/segment-summary.js +2 -1
  47. package/dist/buffer/segment/segment-summary.js.map +1 -1
  48. package/dist/buffer/structure.d.ts +1 -1
  49. package/dist/buffer/structure.js +1 -2
  50. package/dist/buffer/structure.js.map +1 -1
  51. package/dist/buffer/time-format-template.js.map +1 -1
  52. package/dist/collections/collection.d.ts +3 -7
  53. package/dist/collections/collection.js.map +1 -1
  54. package/dist/collections/dictionary.d.ts +1 -1
  55. package/dist/collections/dictionary.js +2 -1
  56. package/dist/collections/dictionary.js.map +1 -1
  57. package/dist/config/empty-log-factory.js.map +1 -1
  58. package/dist/config/get-js-fx-logger.d.ts +1 -3
  59. package/dist/config/get-js-fx-logger.js.map +1 -1
  60. package/dist/config/js-fix-config.d.ts +3 -3
  61. package/dist/config/js-fix-config.js.map +1 -1
  62. package/dist/config/js-fix-logger.d.ts +5 -5
  63. package/dist/config/js-fix-logger.js.map +1 -1
  64. package/dist/config/js-fix-winston-log-factory.d.ts +1 -1
  65. package/dist/config/js-fix-winston-log-factory.js.map +1 -1
  66. package/dist/config/winston-logger.js +7 -7
  67. package/dist/config/winston-logger.js.map +1 -1
  68. package/dist/dict-parser.js +27 -21
  69. package/dist/dict-parser.js.map +1 -1
  70. package/dist/dictionary/compiler/compiler-settings.js.map +1 -1
  71. package/dist/dictionary/compiler/compiler-type.js.map +1 -1
  72. package/dist/dictionary/compiler/enum-compiler.d.ts +2 -2
  73. package/dist/dictionary/compiler/enum-compiler.js +7 -10
  74. package/dist/dictionary/compiler/enum-compiler.js.map +1 -1
  75. package/dist/dictionary/compiler/msg-compiler.js +9 -10
  76. package/dist/dictionary/compiler/msg-compiler.js.map +1 -1
  77. package/dist/dictionary/compiler/standard-snippet.d.ts +1 -1
  78. package/dist/dictionary/compiler/standard-snippet.js +11 -10
  79. package/dist/dictionary/compiler/standard-snippet.js.map +1 -1
  80. package/dist/dictionary/contained/contained-component-field.d.ts +2 -2
  81. package/dist/dictionary/contained/contained-component-field.js +1 -1
  82. package/dist/dictionary/contained/contained-component-field.js.map +1 -1
  83. package/dist/dictionary/contained/contained-field-dispatcher.d.ts +3 -9
  84. package/dist/dictionary/contained/contained-field-dispatcher.js.map +1 -1
  85. package/dist/dictionary/contained/contained-field-set.d.ts +4 -4
  86. package/dist/dictionary/contained/contained-field-set.js +1 -1
  87. package/dist/dictionary/contained/contained-field-set.js.map +1 -1
  88. package/dist/dictionary/contained/contained-field.d.ts +1 -0
  89. package/dist/dictionary/contained/contained-field.js +3 -0
  90. package/dist/dictionary/contained/contained-field.js.map +1 -1
  91. package/dist/dictionary/contained/contained-group-field.d.ts +2 -2
  92. package/dist/dictionary/contained/contained-group-field.js +1 -1
  93. package/dist/dictionary/contained/contained-group-field.js.map +1 -1
  94. package/dist/dictionary/contained/contained-simple-field.d.ts +2 -2
  95. package/dist/dictionary/contained/contained-simple-field.js +1 -1
  96. package/dist/dictionary/contained/contained-simple-field.js.map +1 -1
  97. package/dist/dictionary/contained/field-dispatcher.d.ts +3 -9
  98. package/dist/dictionary/contained/field-dispatcher.js.map +1 -1
  99. package/dist/dictionary/contained/fields-dispatch.js +0 -1
  100. package/dist/dictionary/contained/fields-dispatch.js.map +1 -1
  101. package/dist/dictionary/definition/component-field-definition.d.ts +3 -3
  102. package/dist/dictionary/definition/component-field-definition.js +1 -1
  103. package/dist/dictionary/definition/component-field-definition.js.map +1 -1
  104. package/dist/dictionary/definition/fix-definitions.d.ts +3 -3
  105. package/dist/dictionary/definition/fix-definitions.js +3 -2
  106. package/dist/dictionary/definition/fix-definitions.js.map +1 -1
  107. package/dist/dictionary/definition/group-field-definition.d.ts +4 -4
  108. package/dist/dictionary/definition/group-field-definition.js +1 -1
  109. package/dist/dictionary/definition/group-field-definition.js.map +1 -1
  110. package/dist/dictionary/definition/message-definition.d.ts +2 -2
  111. package/dist/dictionary/definition/message-definition.js.map +1 -1
  112. package/dist/dictionary/definition/simple-field-definition.d.ts +4 -4
  113. package/dist/dictionary/definition/simple-field-definition.js +3 -2
  114. package/dist/dictionary/definition/simple-field-definition.js.map +1 -1
  115. package/dist/dictionary/dict-primitive.d.ts +1 -1
  116. package/dist/dictionary/dict-primitive.js.map +1 -1
  117. package/dist/dictionary/field-enum.js.map +1 -1
  118. package/dist/dictionary/fix-versions.js.map +1 -1
  119. package/dist/dictionary/parser/fix-repository/repository-xml-parser.js +20 -18
  120. package/dist/dictionary/parser/fix-repository/repository-xml-parser.js.map +1 -1
  121. package/dist/dictionary/parser/fix-repository/repository.js +24 -16
  122. package/dist/dictionary/parser/fix-repository/repository.js.map +1 -1
  123. package/dist/dictionary/parser/fixml/components-parser.d.ts +1 -1
  124. package/dist/dictionary/parser/fixml/components-parser.js +24 -15
  125. package/dist/dictionary/parser/fixml/components-parser.js.map +1 -1
  126. package/dist/dictionary/parser/fixml/fields-parser.d.ts +1 -1
  127. package/dist/dictionary/parser/fixml/fields-parser.js +5 -5
  128. package/dist/dictionary/parser/fixml/fields-parser.js.map +1 -1
  129. package/dist/dictionary/parser/fixml/fix-xsd-parser.js +3 -2
  130. package/dist/dictionary/parser/fixml/fix-xsd-parser.js.map +1 -1
  131. package/dist/dictionary/parser/fixml/include-graph.d.ts +1 -1
  132. package/dist/dictionary/parser/fixml/include-graph.js +58 -48
  133. package/dist/dictionary/parser/fixml/include-graph.js.map +1 -1
  134. package/dist/dictionary/parser/fixml/xsd-parser.d.ts +1 -1
  135. package/dist/dictionary/parser/fixml/xsd-parser.js +34 -23
  136. package/dist/dictionary/parser/fixml/xsd-parser.js.map +1 -1
  137. package/dist/dictionary/parser/quickfix/field-definition-parser.js +0 -2
  138. package/dist/dictionary/parser/quickfix/field-definition-parser.js.map +1 -1
  139. package/dist/dictionary/parser/quickfix/field-set-parser.js +3 -2
  140. package/dist/dictionary/parser/quickfix/field-set-parser.js.map +1 -1
  141. package/dist/dictionary/parser/quickfix/message-parser.js +10 -5
  142. package/dist/dictionary/parser/quickfix/message-parser.js.map +1 -1
  143. package/dist/dictionary/parser/quickfix/node-parser.js +14 -8
  144. package/dist/dictionary/parser/quickfix/node-parser.js.map +1 -1
  145. package/dist/dictionary/parser/quickfix/parse-context.d.ts +5 -5
  146. package/dist/dictionary/parser/quickfix/parse-context.js.map +1 -1
  147. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js +22 -19
  148. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js.map +1 -1
  149. package/dist/dictionary/set-reduce.js.map +1 -1
  150. package/dist/dictionary/type-dispatcher.d.ts +3 -9
  151. package/dist/dictionary/type-dispatcher.js.map +1 -1
  152. package/dist/dictionary/version-util.js +8 -8
  153. package/dist/dictionary/version-util.js.map +1 -1
  154. package/dist/jsfix-cmd.d.ts +3 -1
  155. package/dist/jsfix-cmd.js +134 -99
  156. package/dist/jsfix-cmd.js.map +1 -1
  157. package/dist/runtime/make-config.js +34 -14
  158. package/dist/runtime/make-config.js.map +1 -1
  159. package/dist/runtime/session-container.d.ts +3 -2
  160. package/dist/runtime/session-container.js +36 -16
  161. package/dist/runtime/session-container.js.map +1 -1
  162. package/dist/runtime/session-launcher.d.ts +10 -6
  163. package/dist/runtime/session-launcher.js +80 -43
  164. package/dist/runtime/session-launcher.js.map +1 -1
  165. package/dist/sample/http/oms/app.js +37 -7
  166. package/dist/sample/http/oms/app.js.map +1 -1
  167. package/dist/sample/http/oms/http-client.js +4 -2
  168. package/dist/sample/http/oms/http-client.js.map +1 -1
  169. package/dist/sample/http/oms/http-server.js +7 -1
  170. package/dist/sample/http/oms/http-server.js.map +1 -1
  171. package/dist/sample/http/oms/oms-factory.js +4 -3
  172. package/dist/sample/http/oms/oms-factory.js.map +1 -1
  173. package/dist/sample/tcp/qf-md/app.js +3 -3
  174. package/dist/sample/tcp/qf-md/app.js.map +1 -1
  175. package/dist/sample/tcp/qf-md/md-client.js +2 -1
  176. package/dist/sample/tcp/qf-md/md-client.js.map +1 -1
  177. package/dist/sample/tcp/qf-md/md-factory.js.map +1 -1
  178. package/dist/sample/tcp/qf-md/md-server.d.ts +1 -1
  179. package/dist/sample/tcp/qf-md/md-server.js +2 -1
  180. package/dist/sample/tcp/qf-md/md-server.js.map +1 -1
  181. package/dist/sample/tcp/recovering-skeleton/app.js +29 -16
  182. package/dist/sample/tcp/recovering-skeleton/app.js.map +1 -1
  183. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.d.ts +9 -1
  184. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js +51 -2
  185. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js.map +1 -1
  186. package/dist/sample/tcp/recovering-skeleton/skeleton-client.js +2 -1
  187. package/dist/sample/tcp/recovering-skeleton/skeleton-client.js.map +1 -1
  188. package/dist/sample/tcp/recovering-skeleton/skeleton-server.js +4 -3
  189. package/dist/sample/tcp/recovering-skeleton/skeleton-server.js.map +1 -1
  190. package/dist/sample/tcp/skeleton/app.js.map +1 -1
  191. package/dist/sample/tcp/skeleton/skeleton-session.js +7 -4
  192. package/dist/sample/tcp/skeleton/skeleton-session.js.map +1 -1
  193. package/dist/sample/tcp/tls-trade-capture/app.js.map +1 -1
  194. package/dist/sample/tcp/trade-capture/app-launcher.js +3 -3
  195. package/dist/sample/tcp/trade-capture/app-launcher.js.map +1 -1
  196. package/dist/sample/tcp/trade-capture/trade-capture-client.d.ts +1 -1
  197. package/dist/sample/tcp/trade-capture/trade-capture-client.js +2 -1
  198. package/dist/sample/tcp/trade-capture/trade-capture-client.js.map +1 -1
  199. package/dist/sample/tcp/trade-capture/trade-capture-server.js +7 -2
  200. package/dist/sample/tcp/trade-capture/trade-capture-server.js.map +1 -1
  201. package/dist/sample/tcp/trade-capture/trade-factory.js.map +1 -1
  202. package/dist/store/fix-msg-ascii-store-resend.js +18 -7
  203. package/dist/store/fix-msg-ascii-store-resend.js.map +1 -1
  204. package/dist/store/fix-msg-memory-store.d.ts +3 -3
  205. package/dist/store/fix-msg-memory-store.js +93 -69
  206. package/dist/store/fix-msg-memory-store.js.map +1 -1
  207. package/dist/store/fix-msg-store-record.d.ts +6 -6
  208. package/dist/store/fix-msg-store-record.js +2 -1
  209. package/dist/store/fix-msg-store-record.js.map +1 -1
  210. package/dist/store/fix-msg-store-state.js.map +1 -1
  211. package/dist/store/fix-msg-store.d.ts +7 -7
  212. package/dist/store/fix-msg-store.js.map +1 -1
  213. package/dist/test/ascii/ascii-encoder.test.js +93 -63
  214. package/dist/test/ascii/ascii-encoder.test.js.map +1 -1
  215. package/dist/test/ascii/ascii-parser.test.js +28 -24
  216. package/dist/test/ascii/ascii-parser.test.js.map +1 -1
  217. package/dist/test/ascii/ascii-segment.test.js +16 -11
  218. package/dist/test/ascii/ascii-segment.test.js.map +1 -1
  219. package/dist/test/ascii/ascii-store-replay.test.js +1 -1
  220. package/dist/test/ascii/ascii-store-replay.test.js.map +1 -1
  221. package/dist/test/ascii/ascii-tag-pos.test.js +7 -3
  222. package/dist/test/ascii/ascii-tag-pos.test.js.map +1 -1
  223. package/dist/test/ascii/execution-report.test.js +80 -72
  224. package/dist/test/ascii/execution-report.test.js.map +1 -1
  225. package/dist/test/ascii/fix-log-replay.test.js +1 -1
  226. package/dist/test/ascii/fix-log-replay.test.js.map +1 -1
  227. package/dist/test/ascii/fix-repo-dict.test.js +58 -55
  228. package/dist/test/ascii/fix-repo-dict.test.js.map +1 -1
  229. package/dist/test/ascii/includes.test.js +1 -1
  230. package/dist/test/ascii/includes.test.js.map +1 -1
  231. package/dist/test/ascii/logon.test.js +3 -3
  232. package/dist/test/ascii/logon.test.js.map +1 -1
  233. package/dist/test/ascii/memory-store.test.js +3 -3
  234. package/dist/test/ascii/memory-store.test.js.map +1 -1
  235. package/dist/test/ascii/qf-full-msg.test.js +19 -16
  236. package/dist/test/ascii/qf-full-msg.test.js.map +1 -1
  237. package/dist/test/ascii/repo-full-ascii-msg.test.js +11 -11
  238. package/dist/test/ascii/repo-full-ascii-msg.test.js.map +1 -1
  239. package/dist/test/ascii/session-state.test.js.map +1 -1
  240. package/dist/test/ascii/session.test.js +59 -42
  241. package/dist/test/ascii/session.test.js.map +1 -1
  242. package/dist/test/ascii/view-decode.test.js +30 -22
  243. package/dist/test/ascii/view-decode.test.js.map +1 -1
  244. package/dist/test/encode-proxy.test.js +29 -29
  245. package/dist/test/encode-proxy.test.js.map +1 -1
  246. package/dist/test/env/experiment.js +5 -5
  247. package/dist/test/env/experiment.js.map +1 -1
  248. package/dist/test/env/parsing-result.d.ts +3 -3
  249. package/dist/test/env/parsing-result.js.map +1 -1
  250. package/dist/test/env/setup.d.ts +2 -2
  251. package/dist/test/env/setup.js +13 -11
  252. package/dist/test/env/setup.js.map +1 -1
  253. package/dist/test/env/skeleton-runner.d.ts +1 -1
  254. package/dist/test/env/skeleton-runner.js +16 -16
  255. package/dist/test/env/skeleton-runner.js.map +1 -1
  256. package/dist/test/env/test-recovery.d.ts +3 -3
  257. package/dist/test/env/test-recovery.js +1 -1
  258. package/dist/test/env/test-recovery.js.map +1 -1
  259. package/dist/test/env/to-views.d.ts +1 -1
  260. package/dist/test/env/to-views.js +2 -2
  261. package/dist/test/env/to-views.js.map +1 -1
  262. package/dist/test/fixml/fixml-alloc-parse.test.js +32 -15
  263. package/dist/test/fixml/fixml-alloc-parse.test.js.map +1 -1
  264. package/dist/test/fixml/fixml-mkt-data-fut-parse.test.js +2 -2
  265. package/dist/test/fixml/fixml-mkt-data-fut-parse.test.js.map +1 -1
  266. package/dist/test/fixml/fixml-mkt-data-settle-parse.test.js +2 -1
  267. package/dist/test/fixml/fixml-mkt-data-settle-parse.test.js.map +1 -1
  268. package/dist/test/fixml/fixml-tc-bi-lateral-parse.test.js +19 -12
  269. package/dist/test/fixml/fixml-tc-bi-lateral-parse.test.js.map +1 -1
  270. package/dist/test/fixml/repo-full-fixml-msg.test.js +2 -2
  271. package/dist/test/fixml/repo-full-fixml-msg.test.js.map +1 -1
  272. package/dist/transport/ascii/ascii-msg-transmitter.d.ts +1 -1
  273. package/dist/transport/ascii/ascii-msg-transmitter.js +18 -8
  274. package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
  275. package/dist/transport/ascii/ascii-session-msg-factory.d.ts +3 -3
  276. package/dist/transport/ascii/ascii-session-msg-factory.js +4 -2
  277. package/dist/transport/ascii/ascii-session-msg-factory.js.map +1 -1
  278. package/dist/transport/ascii/ascii-session.d.ts +1 -1
  279. package/dist/transport/ascii/ascii-session.js +34 -16
  280. package/dist/transport/ascii/ascii-session.js.map +1 -1
  281. package/dist/transport/duplex/http-duplex.js +10 -8
  282. package/dist/transport/duplex/http-duplex.js.map +1 -1
  283. package/dist/transport/duplex/string-duplex.js +2 -2
  284. package/dist/transport/duplex/string-duplex.js.map +1 -1
  285. package/dist/transport/factory/msg-transport.js +21 -10
  286. package/dist/transport/factory/msg-transport.js.map +1 -1
  287. package/dist/transport/fix-acceptor.d.ts +3 -3
  288. package/dist/transport/fix-acceptor.js.map +1 -1
  289. package/dist/transport/fix-entity.d.ts +1 -1
  290. package/dist/transport/fix-entity.js.map +1 -1
  291. package/dist/transport/fix-initiator.d.ts +2 -2
  292. package/dist/transport/fix-initiator.js.map +1 -1
  293. package/dist/transport/fixml/fixml-msg-transmitter.d.ts +1 -1
  294. package/dist/transport/fixml/fixml-msg-transmitter.js +4 -2
  295. package/dist/transport/fixml/fixml-msg-transmitter.js.map +1 -1
  296. package/dist/transport/fixml/fixml-session-msg-factory.d.ts +1 -1
  297. package/dist/transport/fixml/fixml-session-msg-factory.js.map +1 -1
  298. package/dist/transport/fixml/fixml-session.js +7 -3
  299. package/dist/transport/fixml/fixml-session.js.map +1 -1
  300. package/dist/transport/http/html-options.d.ts +2 -2
  301. package/dist/transport/http/html-options.js.map +1 -1
  302. package/dist/transport/http/html-route.js.map +1 -1
  303. package/dist/transport/http/http-acceptor-listener.js +27 -23
  304. package/dist/transport/http/http-acceptor-listener.js.map +1 -1
  305. package/dist/transport/http/http-acceptor.d.ts +2 -2
  306. package/dist/transport/http/http-acceptor.js +52 -41
  307. package/dist/transport/http/http-acceptor.js.map +1 -1
  308. package/dist/transport/http/http-adapter.d.ts +3 -3
  309. package/dist/transport/http/http-adapter.js.map +1 -1
  310. package/dist/transport/http/http-initiator.js +35 -23
  311. package/dist/transport/http/http-initiator.js.map +1 -1
  312. package/dist/transport/http/http-json-sample-adapter.d.ts +4 -4
  313. package/dist/transport/http/http-json-sample-adapter.js +16 -11
  314. package/dist/transport/http/http-json-sample-adapter.js.map +1 -1
  315. package/dist/transport/http/http-transaction.js.map +1 -1
  316. package/dist/transport/http/http-transport-description.js.map +1 -1
  317. package/dist/transport/msg-application.js.map +1 -1
  318. package/dist/transport/msg-transmitter.d.ts +1 -1
  319. package/dist/transport/msg-transmitter.js +2 -2
  320. package/dist/transport/msg-transmitter.js.map +1 -1
  321. package/dist/transport/session/a-session-msg-factory.d.ts +3 -5
  322. package/dist/transport/session/a-session-msg-factory.js.map +1 -1
  323. package/dist/transport/session/fix-session-state.d.ts +8 -5
  324. package/dist/transport/session/fix-session-state.js +21 -16
  325. package/dist/transport/session/fix-session-state.js.map +1 -1
  326. package/dist/transport/session/fix-session.d.ts +19 -6
  327. package/dist/transport/session/fix-session.js +197 -110
  328. package/dist/transport/session/fix-session.js.map +1 -1
  329. package/dist/transport/session/make-fix-session.d.ts +1 -3
  330. package/dist/transport/session/make-fix-session.js.map +1 -1
  331. package/dist/transport/session/session-description.d.ts +1 -1
  332. package/dist/transport/session/session-description.js.map +1 -1
  333. package/dist/transport/session/session-msg-factory.d.ts +9 -9
  334. package/dist/transport/session/session-msg-factory.js.map +1 -1
  335. package/dist/transport/tcp/recovering-tcp-initiator.d.ts +4 -2
  336. package/dist/transport/tcp/recovering-tcp-initiator.js +62 -30
  337. package/dist/transport/tcp/recovering-tcp-initiator.js.map +1 -1
  338. package/dist/transport/tcp/tcp-acceptor-listener.js +28 -25
  339. package/dist/transport/tcp/tcp-acceptor-listener.js.map +1 -1
  340. package/dist/transport/tcp/tcp-acceptor.d.ts +2 -2
  341. package/dist/transport/tcp/tcp-acceptor.js +23 -15
  342. package/dist/transport/tcp/tcp-acceptor.js.map +1 -1
  343. package/dist/transport/tcp/tcp-initiator-connector.js +39 -30
  344. package/dist/transport/tcp/tcp-initiator-connector.js.map +1 -1
  345. package/dist/transport/tcp/tcp-initiator.d.ts +1 -1
  346. package/dist/transport/tcp/tcp-initiator.js +130 -104
  347. package/dist/transport/tcp/tcp-initiator.js.map +1 -1
  348. package/dist/transport/tcp/tcp-transport-description.js.map +1 -1
  349. package/dist/transport/tcp/tls-options-factory.d.ts +3 -3
  350. package/dist/transport/tcp/tls-options-factory.js +10 -3
  351. package/dist/transport/tcp/tls-options-factory.js.map +1 -1
  352. package/dist/transport/tcp/tls-options.d.ts +6 -2
  353. package/dist/transport/tcp/tls-options.js.map +1 -1
  354. package/dist/util/json-helper.js +2 -1
  355. package/dist/util/json-helper.js.map +1 -1
  356. package/dist/util/message-generator.d.ts +1 -1
  357. package/dist/util/message-generator.js +1 -1
  358. package/dist/util/message-generator.js.map +1 -1
  359. package/package.json +53 -48
  360. package/src/buffer/ascii/ascii-chars.ts +0 -1
  361. package/src/buffer/ascii/ascii-encoder.ts +18 -16
  362. package/src/buffer/ascii/ascii-parser-state.ts +4 -4
  363. package/src/buffer/ascii/ascii-parser.ts +16 -13
  364. package/src/buffer/ascii/ascii-segment-parser.ts +16 -15
  365. package/src/buffer/ascii/ascii-view.ts +22 -14
  366. package/src/buffer/ascii/itime-formatter.ts +12 -12
  367. package/src/buffer/ascii/time-formatter.ts +11 -12
  368. package/src/buffer/elastic-buffer.ts +5 -6
  369. package/src/buffer/encode-proxy.ts +6 -5
  370. package/src/buffer/encoder-state.ts +7 -3
  371. package/src/buffer/fixml/fixml-encoder.ts +10 -10
  372. package/src/buffer/fixml/fixml-parser.ts +80 -60
  373. package/src/buffer/fixml/fixml-view.ts +6 -7
  374. package/src/buffer/fixml/populated-attributes.ts +1 -1
  375. package/src/buffer/msg-encoder.ts +2 -1
  376. package/src/buffer/msg-view.ts +73 -53
  377. package/src/buffer/segment/segment-description.ts +13 -13
  378. package/src/buffer/segment/segment-summary.ts +3 -2
  379. package/src/buffer/structure.ts +6 -6
  380. package/src/buffer/time-format-template.ts +1 -1
  381. package/src/collections/collection.ts +2 -6
  382. package/src/collections/dictionary.ts +4 -5
  383. package/src/config/empty-log-factory.ts +1 -0
  384. package/src/config/get-js-fx-logger.ts +1 -2
  385. package/src/config/js-fix-config.ts +6 -6
  386. package/src/config/js-fix-logger.ts +14 -9
  387. package/src/config/js-fix-winston-log-factory.ts +2 -1
  388. package/src/config/winston-logger.ts +9 -7
  389. package/src/dictionary/compiler/compiler-settings.ts +5 -5
  390. package/src/dictionary/compiler/compiler-type.ts +1 -1
  391. package/src/dictionary/compiler/enum-compiler.ts +14 -16
  392. package/src/dictionary/compiler/msg-compiler.ts +15 -17
  393. package/src/dictionary/compiler/standard-snippet.ts +28 -27
  394. package/src/dictionary/contained/contained-component-field.ts +5 -4
  395. package/src/dictionary/contained/contained-field-dispatcher.ts +3 -3
  396. package/src/dictionary/contained/contained-field-set.ts +21 -21
  397. package/src/dictionary/contained/contained-field.ts +4 -1
  398. package/src/dictionary/contained/contained-group-field.ts +4 -4
  399. package/src/dictionary/contained/contained-simple-field.ts +5 -5
  400. package/src/dictionary/contained/field-dispatcher.ts +3 -3
  401. package/src/dictionary/contained/fields-dispatch.ts +0 -1
  402. package/src/dictionary/definition/component-field-definition.ts +4 -4
  403. package/src/dictionary/definition/fix-definitions.ts +8 -8
  404. package/src/dictionary/definition/group-field-definition.ts +5 -5
  405. package/src/dictionary/definition/message-definition.ts +4 -4
  406. package/src/dictionary/definition/simple-field-definition.ts +9 -9
  407. package/src/dictionary/dict-primitive.ts +2 -2
  408. package/src/dictionary/field-enum.ts +3 -2
  409. package/src/dictionary/fix-versions.ts +10 -10
  410. package/src/dictionary/parser/fix-repository/repository-xml-parser.ts +7 -8
  411. package/src/dictionary/parser/fix-repository/repository.ts +38 -30
  412. package/src/dictionary/parser/fixml/components-parser.ts +57 -51
  413. package/src/dictionary/parser/fixml/fields-parser.ts +9 -10
  414. package/src/dictionary/parser/fixml/fix-xsd-parser.ts +2 -3
  415. package/src/dictionary/parser/fixml/include-graph.ts +26 -21
  416. package/src/dictionary/parser/fixml/xsd-parser.ts +5 -5
  417. package/src/dictionary/parser/quickfix/field-definition-parser.ts +3 -5
  418. package/src/dictionary/parser/quickfix/field-set-parser.ts +2 -2
  419. package/src/dictionary/parser/quickfix/message-parser.ts +9 -6
  420. package/src/dictionary/parser/quickfix/node-parser.ts +20 -18
  421. package/src/dictionary/parser/quickfix/parse-context.ts +4 -4
  422. package/src/dictionary/parser/quickfix/quick-fix-xml-file-parser.ts +13 -15
  423. package/src/dictionary/set-reduce.ts +4 -3
  424. package/src/dictionary/type-dispatcher.ts +3 -3
  425. package/src/dictionary/version-util.ts +8 -8
  426. package/src/jsfix-cmd.ts +82 -58
  427. package/src/runtime/make-config.ts +15 -10
  428. package/src/runtime/session-container.ts +26 -18
  429. package/src/runtime/session-launcher.ts +58 -30
  430. package/src/sample/http/oms/app.ts +24 -7
  431. package/src/sample/http/oms/http-client.ts +3 -3
  432. package/src/sample/http/oms/http-server.ts +7 -1
  433. package/src/sample/http/oms/oms-factory.ts +3 -3
  434. package/src/sample/tcp/qf-md/app.ts +3 -3
  435. package/src/sample/tcp/qf-md/md-client.ts +1 -1
  436. package/src/sample/tcp/qf-md/md-factory.ts +3 -2
  437. package/src/sample/tcp/qf-md/md-server.ts +2 -2
  438. package/src/sample/tcp/recovering-skeleton/app.ts +37 -20
  439. package/src/sample/tcp/recovering-skeleton/respawn-acceptor.ts +66 -4
  440. package/src/sample/tcp/recovering-skeleton/skeleton-client.ts +2 -2
  441. package/src/sample/tcp/recovering-skeleton/skeleton-server.ts +4 -4
  442. package/src/sample/tcp/skeleton/app.ts +1 -1
  443. package/src/sample/tcp/skeleton/skeleton-session.ts +7 -7
  444. package/src/sample/tcp/tls-trade-capture/app.ts +1 -1
  445. package/src/sample/tcp/trade-capture/app-launcher.ts +4 -4
  446. package/src/sample/tcp/trade-capture/trade-capture-client.ts +7 -5
  447. package/src/sample/tcp/trade-capture/trade-capture-server.ts +10 -5
  448. package/src/sample/tcp/trade-capture/trade-factory.ts +1 -1
  449. package/src/store/fix-msg-ascii-store-resend.ts +5 -6
  450. package/src/store/fix-msg-memory-store.ts +22 -21
  451. package/src/store/fix-msg-store-record.ts +8 -8
  452. package/src/store/fix-msg-store-state.ts +2 -2
  453. package/src/store/fix-msg-store.ts +7 -7
  454. package/src/transport/ascii/ascii-msg-transmitter.ts +20 -14
  455. package/src/transport/ascii/ascii-session-msg-factory.ts +5 -6
  456. package/src/transport/ascii/ascii-session.ts +40 -29
  457. package/src/transport/duplex/http-duplex.ts +11 -9
  458. package/src/transport/duplex/string-duplex.ts +4 -5
  459. package/src/transport/factory/msg-transport.ts +5 -6
  460. package/src/transport/fix-acceptor.ts +2 -2
  461. package/src/transport/fix-entity.ts +1 -1
  462. package/src/transport/fix-initiator.ts +1 -1
  463. package/src/transport/fixml/fixml-msg-transmitter.ts +4 -3
  464. package/src/transport/fixml/fixml-session-msg-factory.ts +1 -2
  465. package/src/transport/fixml/fixml-session.ts +7 -6
  466. package/src/transport/http/html-options.ts +5 -5
  467. package/src/transport/http/html-route.ts +1 -1
  468. package/src/transport/http/http-acceptor-listener.ts +6 -4
  469. package/src/transport/http/http-acceptor.ts +36 -34
  470. package/src/transport/http/http-adapter.ts +3 -3
  471. package/src/transport/http/http-initiator.ts +22 -16
  472. package/src/transport/http/http-json-sample-adapter.ts +17 -16
  473. package/src/transport/http/http-transaction.ts +1 -1
  474. package/src/transport/http/http-transport-description.ts +1 -1
  475. package/src/transport/msg-application.ts +4 -4
  476. package/src/transport/msg-transmitter.ts +5 -5
  477. package/src/transport/session/a-session-msg-factory.ts +2 -3
  478. package/src/transport/session/fix-session-state.ts +24 -18
  479. package/src/transport/session/fix-session.ts +169 -96
  480. package/src/transport/session/make-fix-session.ts +1 -2
  481. package/src/transport/session/session-description.ts +2 -2
  482. package/src/transport/session/session-msg-factory.ts +9 -9
  483. package/src/transport/tcp/recovering-tcp-initiator.ts +39 -21
  484. package/src/transport/tcp/tcp-acceptor-listener.ts +4 -3
  485. package/src/transport/tcp/tcp-acceptor.ts +23 -22
  486. package/src/transport/tcp/tcp-initiator-connector.ts +16 -10
  487. package/src/transport/tcp/tcp-initiator.ts +57 -46
  488. package/src/transport/tcp/tcp-transport-description.ts +1 -1
  489. package/src/transport/tcp/tls-options-factory.ts +21 -8
  490. package/src/transport/tcp/tls-options.ts +11 -7
  491. package/src/util/json-helper.ts +6 -5
  492. package/src/util/message-generator.ts +6 -7
  493. package/tsconfig.json +2 -0
  494. package/.eslintrc.js +0 -6
  495. package/dist/buffer/ascii-chars.d.ts +0 -22
  496. package/dist/buffer/ascii-chars.js +0 -29
  497. package/dist/buffer/ascii-chars.js.map +0 -1
  498. package/dist/buffer/segment-description.d.ts +0 -33
  499. package/dist/buffer/segment-description.js +0 -80
  500. package/dist/buffer/segment-description.js.map +0 -1
  501. package/dist/buffer/segment-summary.d.ts +0 -13
  502. package/dist/buffer/segment-summary.js +0 -20
  503. package/dist/buffer/segment-summary.js.map +0 -1
  504. package/dist/buffer/tag-pos.d.ts +0 -12
  505. package/dist/buffer/tag-pos.js +0 -55
  506. package/dist/buffer/tag-pos.js.map +0 -1
  507. package/dist/buffer/tags.d.ts +0 -32
  508. package/dist/buffer/tags.js +0 -135
  509. package/dist/buffer/tags.js.map +0 -1
  510. package/dist/dictionary/fields-dispatch.d.ts +0 -13
  511. package/dist/dictionary/fields-dispatch.js +0 -40
  512. package/dist/dictionary/fields-dispatch.js.map +0 -1
  513. package/dist/sample/launcher.d.ts +0 -12
  514. package/dist/sample/launcher.js +0 -63
  515. package/dist/sample/launcher.js.map +0 -1
  516. package/dist/test/ascii-encoder.test.d.ts +0 -1
  517. package/dist/test/ascii-encoder.test.js +0 -529
  518. package/dist/test/ascii-encoder.test.js.map +0 -1
  519. package/dist/test/ascii-parser.test.d.ts +0 -1
  520. package/dist/test/ascii-parser.test.js +0 -142
  521. package/dist/test/ascii-parser.test.js.map +0 -1
  522. package/dist/test/ascii-segment.test.d.ts +0 -1
  523. package/dist/test/ascii-segment.test.js +0 -107
  524. package/dist/test/ascii-segment.test.js.map +0 -1
  525. package/dist/test/ascii-store-replay.test.d.ts +0 -1
  526. package/dist/test/ascii-store-replay.test.js +0 -121
  527. package/dist/test/ascii-store-replay.test.js.map +0 -1
  528. package/dist/test/ascii-tag-pos.test.d.ts +0 -1
  529. package/dist/test/ascii-tag-pos.test.js +0 -105
  530. package/dist/test/ascii-tag-pos.test.js.map +0 -1
  531. package/dist/test/execution-report.test.d.ts +0 -1
  532. package/dist/test/execution-report.test.js +0 -490
  533. package/dist/test/execution-report.test.js.map +0 -1
  534. package/dist/test/fix-log-replay.test.d.ts +0 -1
  535. package/dist/test/fix-log-replay.test.js +0 -45
  536. package/dist/test/fix-log-replay.test.js.map +0 -1
  537. package/dist/test/fix-repo-dict.test.d.ts +0 -1
  538. package/dist/test/fix-repo-dict.test.js +0 -127
  539. package/dist/test/fix-repo-dict.test.js.map +0 -1
  540. package/dist/test/fixml-alloc-parse.test.d.ts +0 -1
  541. package/dist/test/fixml-alloc-parse.test.js +0 -160
  542. package/dist/test/fixml-alloc-parse.test.js.map +0 -1
  543. package/dist/test/fixml-mkt-data-fut-parse.test.d.ts +0 -1
  544. package/dist/test/fixml-mkt-data-fut-parse.test.js +0 -60
  545. package/dist/test/fixml-mkt-data-fut-parse.test.js.map +0 -1
  546. package/dist/test/fixml-mkt-data-settle-parse.test.d.ts +0 -1
  547. package/dist/test/fixml-mkt-data-settle-parse.test.js +0 -33
  548. package/dist/test/fixml-mkt-data-settle-parse.test.js.map +0 -1
  549. package/dist/test/fixml-tc-bi-lateral-parse.test.d.ts +0 -1
  550. package/dist/test/fixml-tc-bi-lateral-parse.test.js +0 -96
  551. package/dist/test/fixml-tc-bi-lateral-parse.test.js.map +0 -1
  552. package/dist/test/includes.test.d.ts +0 -1
  553. package/dist/test/includes.test.js +0 -42
  554. package/dist/test/includes.test.js.map +0 -1
  555. package/dist/test/logon.test.d.ts +0 -1
  556. package/dist/test/logon.test.js +0 -93
  557. package/dist/test/logon.test.js.map +0 -1
  558. package/dist/test/memory-store.test.d.ts +0 -1
  559. package/dist/test/memory-store.test.js +0 -75
  560. package/dist/test/memory-store.test.js.map +0 -1
  561. package/dist/test/qf-full-msg.test.d.ts +0 -1
  562. package/dist/test/qf-full-msg.test.js +0 -76
  563. package/dist/test/qf-full-msg.test.js.map +0 -1
  564. package/dist/test/repo-full-ascii-msg.test.d.ts +0 -1
  565. package/dist/test/repo-full-ascii-msg.test.js +0 -82
  566. package/dist/test/repo-full-ascii-msg.test.js.map +0 -1
  567. package/dist/test/repo-full-fixml-msg.test.d.ts +0 -1
  568. package/dist/test/repo-full-fixml-msg.test.js +0 -136
  569. package/dist/test/repo-full-fixml-msg.test.js.map +0 -1
  570. package/dist/test/session-state.test.d.ts +0 -1
  571. package/dist/test/session-state.test.js +0 -74
  572. package/dist/test/session-state.test.js.map +0 -1
  573. package/dist/test/session.test.d.ts +0 -1
  574. package/dist/test/session.test.js +0 -412
  575. package/dist/test/session.test.js.map +0 -1
  576. package/dist/test/time-formatter.test.d.ts +0 -1
  577. package/dist/test/time-formatter.test.js +0 -78
  578. package/dist/test/time-formatter.test.js.map +0 -1
  579. package/dist/test/to-views.d.ts +0 -11
  580. package/dist/test/to-views.js +0 -55
  581. package/dist/test/to-views.js.map +0 -1
  582. package/dist/test/view-decode.test.d.ts +0 -1
  583. package/dist/test/view-decode.test.js +0 -208
  584. package/dist/test/view-decode.test.js.map +0 -1
  585. package/dist/transport/a-session-msg-factory.d.ts +0 -23
  586. package/dist/transport/a-session-msg-factory.js +0 -58
  587. package/dist/transport/a-session-msg-factory.js.map +0 -1
  588. package/dist/transport/ascii-session-msg-factory.d.ts +0 -16
  589. package/dist/transport/ascii-session-msg-factory.js +0 -47
  590. package/dist/transport/ascii-session-msg-factory.js.map +0 -1
  591. package/dist/transport/fix-msg-factory.d.ts +0 -15
  592. package/dist/transport/fix-msg-factory.js +0 -3
  593. package/dist/transport/fix-msg-factory.js.map +0 -1
  594. package/dist/transport/fix-session-state-args.d.ts +0 -8
  595. package/dist/transport/fix-session-state-args.js +0 -3
  596. package/dist/transport/fix-session-state-args.js.map +0 -1
  597. package/dist/transport/fix-session-state.d.ts +0 -32
  598. package/dist/transport/fix-session-state.js +0 -133
  599. package/dist/transport/fix-session-state.js.map +0 -1
  600. package/dist/transport/fix-session.d.ts +0 -50
  601. package/dist/transport/fix-session.js +0 -290
  602. package/dist/transport/fix-session.js.map +0 -1
  603. package/dist/transport/fixml/acceptor.d.ts +0 -3
  604. package/dist/transport/fixml/acceptor.js +0 -38
  605. package/dist/transport/fixml/acceptor.js.map +0 -1
  606. package/dist/transport/fixml-session-msg-factory.d.ts +0 -13
  607. package/dist/transport/fixml-session-msg-factory.js +0 -68
  608. package/dist/transport/fixml-session-msg-factory.js.map +0 -1
  609. package/dist/transport/make-config.d.ts +0 -4
  610. package/dist/transport/make-config.js +0 -31
  611. package/dist/transport/make-config.js.map +0 -1
  612. package/dist/transport/make-fix-session.d.ts +0 -5
  613. package/dist/transport/make-fix-session.js +0 -3
  614. package/dist/transport/make-fix-session.js.map +0 -1
  615. package/dist/transport/make-fixl-session.d.ts +0 -5
  616. package/dist/transport/make-fixl-session.js +0 -3
  617. package/dist/transport/make-fixl-session.js.map +0 -1
  618. package/dist/transport/msg-transport.d.ts +0 -14
  619. package/dist/transport/msg-transport.js +0 -57
  620. package/dist/transport/msg-transport.js.map +0 -1
  621. package/dist/transport/session-description.d.ts +0 -64
  622. package/dist/transport/session-description.js +0 -3
  623. package/dist/transport/session-description.js.map +0 -1
  624. package/dist/transport/session-msg-factory.d.ts +0 -6
  625. package/dist/transport/session-msg-factory.js +0 -13
  626. package/dist/transport/session-msg-factory.js.map +0 -1
  627. package/dist/transport/session-state.d.ts +0 -25
  628. package/dist/transport/session-state.js +0 -30
  629. package/dist/transport/session-state.js.map +0 -1
  630. package/dist/transport/tcp/acceptor.d.ts +0 -3
  631. package/dist/transport/tcp/acceptor.js +0 -40
  632. package/dist/transport/tcp/acceptor.js.map +0 -1
  633. package/dist/transport/tcp/initiator.d.ts +0 -3
  634. package/dist/transport/tcp/initiator.js +0 -67
  635. package/dist/transport/tcp/initiator.js.map +0 -1
  636. package/dist/util/dictionary-definitions.d.ts +0 -8
  637. package/dist/util/dictionary-definitions.js +0 -51
  638. package/dist/util/dictionary-definitions.js.map +0 -1
  639. package/tslint.json +0 -3
@@ -11,8 +11,8 @@ import { SegmentType } from '../../buffer/segment/segment-type'
11
11
 
12
12
  export abstract class FixSession extends events.EventEmitter {
13
13
  public logReceivedMsgs: boolean = false
14
- protected timer: NodeJS.Timer = null
15
- protected transport: MsgTransport = null
14
+ protected timer: NodeJS.Timer | null = null
15
+ protected transport: MsgTransport | null = null
16
16
  public manageSession: boolean = true
17
17
  public checkMsgIntegrity: boolean = false
18
18
  protected readonly me: string
@@ -27,37 +27,75 @@ export abstract class FixSession extends events.EventEmitter {
27
27
  protected constructor (public readonly config: IJsFixConfig) {
28
28
  super()
29
29
  const description = config.description
30
- this.me = description.application.name
30
+ this.me = description?.application?.name ?? 'me'
31
31
  this.sessionState = new FixSessionState(
32
- { heartBeat: config.description.HeartBtInt,
33
- lastPeerMsgSeqNum: config.description.LastReceivedSeqNum})
32
+ {
33
+ heartBeat: config.description.HeartBtInt,
34
+ lastPeerMsgSeqNum: config.description.LastReceivedSeqNum
35
+ })
34
36
  this.sessionLogger = config.logFactory.logger(`${this.me}:FixSession`)
35
- this.initiator = description.application.type === 'initiator'
37
+ this.initiator = description?.application?.type === 'initiator'
36
38
  this.acceptor = !this.initiator
37
39
  this.checkMsgIntegrity = this.acceptor
38
40
  this.sessionState.compId = description.SenderCompId
39
41
  }
40
42
 
41
- public setState (state: SessionState) {
42
- if (state === this.sessionState.state) return
43
+ stateStr (theState: SessionState): string {
44
+ return SessionState[theState]
45
+ }
46
+
47
+ assignState (newState: SessionState): void {
48
+ const currentState = this.sessionState.state
49
+ const currentStateStr = this.stateStr(currentState)
43
50
  const logger = this.sessionLogger
44
- const prevState = this.sessionState.state
45
- const msg = `current state ${SessionState[prevState]} (${prevState}) moves to ${SessionState[state]} (${state})`
51
+ const msg = `current state ${currentStateStr} (${currentState}) moves to ${SessionState[newState]} (${newState})`
46
52
  logger.info(msg)
47
- this.sessionState.state = state
53
+ this.sessionState.state = newState
54
+ }
55
+
56
+ public setState (state: SessionState): void {
57
+ const logger = this.sessionLogger
58
+ const currentState = this.sessionState.state
59
+ const currentStateStr = this.stateStr(currentState)
60
+ if (state === currentState) return
61
+ switch (currentState) {
62
+ case SessionState.ConfirmingLogout:
63
+ case SessionState.Stopped:
64
+ if (state !== SessionState.NetworkConnectionEstablished) {
65
+ logger.info(`ignoring request to change state as now already in ${currentStateStr}`)
66
+ } else {
67
+ this.assignState(state)
68
+ }
69
+ break
70
+
71
+ default: {
72
+ this.assignState(state)
73
+ }
74
+ }
48
75
  }
49
76
 
50
77
  public getState (): SessionState {
51
78
  return this.sessionState.state
52
79
  }
53
80
 
54
- public sendLogon () {
55
- this.send(this.requestLogonType, this.config.factory.logon())
81
+ public lastSentSeqNum (): number {
82
+ return this.sessionState.lastSentSeqNum()
83
+ }
84
+
85
+ public lastPeerSeqNum (): number {
86
+ return this.sessionState.lastPeerMsgSeqNum
56
87
  }
57
88
 
58
- private waitPromise (): Promise<any> {
89
+ public sendLogon (): void {
90
+ const lo = this.config.factory?.logon()
91
+ if (lo) {
92
+ this.send(this.requestLogonType, lo)
93
+ }
94
+ }
95
+
96
+ private async waitPromise (): Promise<number> {
59
97
  const logger = this.sessionLogger
60
- return new Promise<any>((accept, reject) => {
98
+ return await new Promise<any>((resolve, reject) => {
61
99
  if (this.initiator) {
62
100
  logger.debug(`initiator sending logon state = ${this.stateString()}`)
63
101
  this.sendLogon()
@@ -73,12 +111,12 @@ export abstract class FixSession extends events.EventEmitter {
73
111
  })
74
112
 
75
113
  this.on('done', () => {
76
- accept(this.transport.id)
114
+ resolve(this.transport?.id)
77
115
  })
78
116
  })
79
117
  }
80
118
 
81
- public run (transport: MsgTransport): Promise<number> {
119
+ public async run (transport: MsgTransport): Promise<number> {
82
120
  const logger = this.sessionLogger
83
121
  if (this.transport) {
84
122
  logger.info(`reset from previous transport. state ${this.stateString()}`)
@@ -86,18 +124,13 @@ export abstract class FixSession extends events.EventEmitter {
86
124
  }
87
125
  this.transport = transport
88
126
  this.subscribe()
89
- return this.waitPromise()
127
+ return await this.waitPromise()
90
128
  }
91
129
 
92
- protected expectedState (): boolean {
130
+ protected expectedEndState (): boolean {
93
131
  switch (this.sessionState.state) {
94
- case SessionState.ActiveNormalSession:
95
- case SessionState.ReceiveLogout:
96
132
  case SessionState.Stopped:
97
133
  case SessionState.ConfirmingLogout:
98
- case SessionState.HandleResendRequest:
99
- case SessionState.AwaitingProcessingResponseToTestRequest:
100
- case SessionState.AwaitingProcessingResponseToResendRequest:
101
134
  return true
102
135
 
103
136
  default:
@@ -105,65 +138,97 @@ export abstract class FixSession extends events.EventEmitter {
105
138
  }
106
139
  }
107
140
 
108
- protected subscribe () {
141
+ protected rxOnEnd (): void {
142
+ const logger = this.sessionLogger
143
+ logger.info(`rx end received sessionState = [${this.sessionState.toString()}]`)
144
+ const expectedState = this.expectedEndState()
145
+ if (expectedState) {
146
+ logger.info(`rx receives end state = ${this.stateString()} - stop session`)
147
+ this.stop()
148
+ } else {
149
+ this.setState(SessionState.DetectBrokenNetworkConnection)
150
+ const e = new Error(`unexpected state - transport failed? = ${this.stateString()}`)
151
+ logger.info(`rx error ${e.message}`)
152
+ this.terminate(e)
153
+ }
154
+ }
109
155
 
110
- const transport = this.transport
156
+ protected rxOnMsg (msgType: string, view: MsgView): void {
111
157
  const logger = this.sessionLogger
112
158
 
113
- const rx = transport.receiver
114
- const tx = transport.transmitter
159
+ if (this.logReceivedMsgs) {
160
+ const name = view.segment.type !== SegmentType.Unknown ? view?.segment?.set?.name : 'unknown'
161
+ logger.info(`${msgType}: ${name}`)
162
+ logger.info(`${view.toString()}`)
163
+ }
164
+ this.sessionState.lastReceivedAt = new Date()
165
+ if (this.manageSession) {
166
+ this.onMsg(msgType, view)
167
+ } else {
168
+ this.checkForwardMsg(msgType, view)
169
+ }
170
+ }
115
171
 
116
- rx.on('msg', (msgType: string, view: MsgView) => {
117
- if (this.logReceivedMsgs) {
118
- const name = view.segment.type !== SegmentType.Unknown ? view.segment.set.name : 'unknown'
119
- logger.info(`${msgType}: ${name}`)
120
- logger.info(`${view.toString()}`)
121
- }
122
- this.sessionState.lastReceivedAt = new Date()
123
- if (this.manageSession) {
124
- this.onMsg(msgType, view)
125
- } else {
126
- this.checkForwardMsg(msgType, view)
127
- }
128
- })
172
+ protected rxOnDone (): void {
173
+ const logger = this.sessionLogger
174
+ logger.info('rx done received')
175
+ this.done()
176
+ }
129
177
 
130
- rx.on('error', (e: Error) => {
131
- logger.warning(`rx error event: ${e.message} ${e.stack || ''}`)
132
- this.terminate(e)
133
- })
178
+ protected rxOnError (e: Error): void {
179
+ const logger = this.sessionLogger
180
+ logger.warning(`rx error event: ${e.message} ${e.stack ?? ''}`)
181
+ this.terminate(e)
182
+ }
134
183
 
135
- rx.on('done', () => {
136
- logger.info('rx done received')
137
- this.done()
138
- })
184
+ protected rxOnDecoded (msgType: string, data: ElasticBuffer, ptr: number): void {
185
+ const logger = this.sessionLogger
186
+ logger.debug(`rx: [${msgType}] ${ptr} bytes`)
187
+ this.onDecoded(msgType, data.toString(ptr))
188
+ }
139
189
 
140
- rx.on('end', () => {
141
- logger.info(`rx end received sessionState = [${this.sessionState.toString()}]`)
142
- const expectedState = this.expectedState()
143
- if (expectedState) {
144
- logger.info(`rx graceful end state = ${this.stateString()}`)
145
- this.done()
146
- } else {
147
- const e = new Error(`unexpected state - transport failed? = ${this.stateString()}`)
148
- logger.info(`rx error ${e.message}`)
149
- this.terminate(e)
150
- }
151
- })
190
+ protected txOnError (e: Error): void {
191
+ const logger = this.sessionLogger
192
+ logger.warning(`tx error event: ${e.message} ${e.stack ?? ''}`)
193
+ this.terminate(e)
194
+ }
152
195
 
153
- rx.on('decoded', (msgType: string, data: ElasticBuffer, ptr: number) => {
154
- logger.debug(`rx: [${msgType}] ${ptr} bytes`)
155
- this.onDecoded(msgType, data.toString(ptr))
156
- })
196
+ protected txOnEncoded (msgType: string, data: string, hdr: ILooseObject): void {
197
+ const logger = this.sessionLogger
198
+ this.sessionState.lastHeader = hdr
199
+ logger.debug(`tx: [${msgType}] ${data.length} bytes seqNo = ${this.lastSentSeqNum()}`)
200
+ this.onEncoded(msgType, data)
201
+ }
157
202
 
158
- tx.on('error', (e: Error) => {
159
- logger.warning(`tx error event: ${e.message} ${e.stack || ''}`)
160
- this.terminate(e)
161
- })
203
+ protected unsubscribe (): void {
204
+ const logger = this.sessionLogger
205
+ logger.info(`unsubscribe sessionState = [${this.sessionState.toString()}]`)
206
+ const transport = this.transport
207
+ const rx = transport?.receiver
208
+ const tx = transport?.transmitter
209
+
210
+ rx?.removeListener('msg', this.rxOnMsg)
211
+ rx?.removeListener('error', this.rxOnError)
212
+ rx?.removeListener('done', this.rxOnDone)
213
+ rx?.removeListener('end', this.rxOnEnd)
214
+ rx?.removeListener('decoded', this.rxOnDecoded)
215
+ tx?.removeListener('error', this.txOnError)
216
+ tx?.removeListener('encoded', this.txOnEncoded)
217
+ }
162
218
 
163
- tx.on('encoded', (msgType: string, data: string) => {
164
- logger.debug(`tx: [${msgType}] ${data.length} bytes`)
165
- this.onEncoded(msgType, data)
166
- })
219
+ protected subscribe (): void {
220
+ const transport = this.transport
221
+
222
+ const rx = transport?.receiver
223
+ const tx = transport?.transmitter
224
+ const inst = this
225
+ rx?.on('msg', (msgType: string, view: MsgView) => inst.rxOnMsg(msgType, view))
226
+ rx?.on('error', (e: Error) => inst.rxOnError(e))
227
+ rx?.on('done', () => inst.rxOnDone())
228
+ rx?.on('end', () => inst.rxOnEnd())
229
+ rx?.on('decoded', (msgType: string, data: ElasticBuffer, ptr: number) => inst.rxOnDecoded(msgType, data, ptr))
230
+ tx?.on('error', (e: Error) => inst.txOnError(e))
231
+ tx?.on('encoded', (msgType: string, data: string, hdr: ILooseObject) => inst.txOnEncoded(msgType, data, hdr))
167
232
  }
168
233
 
169
234
  protected validStateApplicationMsg (): boolean {
@@ -191,12 +256,18 @@ export abstract class FixSession extends events.EventEmitter {
191
256
  this.onApplicationMsg(msgType, view)
192
257
  }
193
258
 
194
- protected terminate (error: Error): void {
195
- if (this.sessionState.state === SessionState.Stopped) return
196
- this.sessionLogger.error(error)
259
+ private stopTimer (): void {
197
260
  if (this.timer) {
261
+ this.sessionLogger.info('stopTimer')
198
262
  clearInterval(this.timer)
263
+ this.timer = null
199
264
  }
265
+ }
266
+
267
+ protected terminate (error: Error): void {
268
+ if (this.sessionState.state === SessionState.Stopped) return
269
+ this.sessionLogger.error(error)
270
+ this.stopTimer()
200
271
  if (this.transport) {
201
272
  this.transport.end()
202
273
  }
@@ -205,7 +276,7 @@ export abstract class FixSession extends events.EventEmitter {
205
276
  this.emit('error', error)
206
277
  }
207
278
 
208
- protected peerLogout (view: MsgView) {
279
+ protected peerLogout (view: MsgView): void {
209
280
  const msg = view.getString(MsgTag.Text)
210
281
  const state = this.sessionState.state
211
282
  switch (state) {
@@ -225,7 +296,7 @@ export abstract class FixSession extends events.EventEmitter {
225
296
  }
226
297
  }
227
298
 
228
- protected send (msgType: string, obj: ILooseObject) {
299
+ protected send (msgType: string, obj: ILooseObject): void {
229
300
  const state = this.sessionState.state
230
301
  switch (state) {
231
302
  case SessionState.Stopped: {
@@ -235,16 +306,19 @@ export abstract class FixSession extends events.EventEmitter {
235
306
 
236
307
  default: {
237
308
  this.sessionState.LastSentAt = new Date()
238
- this.transport.transmitter.send(msgType, obj)
309
+ this.transport?.transmitter.send(msgType, obj)
239
310
  break
240
311
  }
241
312
  }
242
313
  }
243
314
 
244
- protected sendLogout (msg: string) {
315
+ protected sendLogout (msg: string): void {
245
316
  const factory = this.config.factory
246
317
  this.sessionLogger.info(`sending logout with ${msg}`)
247
- this.send(this.requestLogoutType, factory.logout(this.requestLogoutType, msg))
318
+ const lo = factory?.logout(this.requestLogoutType, msg)
319
+ if (lo) {
320
+ this.send(this.requestLogoutType, lo)
321
+ }
248
322
  }
249
323
 
250
324
  protected sessionLogout (): void {
@@ -267,7 +341,8 @@ export abstract class FixSession extends events.EventEmitter {
267
341
  }
268
342
 
269
343
  case SessionState.ConfirmingLogout: {
270
- // this instance responds to logout
344
+ // this instance responds to log out
345
+ this.setState(SessionState.ConfirmingLogout)
271
346
  sessionState.logoutSentAt = new Date()
272
347
  const msg = `${this.me} confirming logout`
273
348
  this.sessionLogger.info(msg)
@@ -291,7 +366,7 @@ export abstract class FixSession extends events.EventEmitter {
291
366
  }
292
367
 
293
368
  case SessionState.Stopped:
294
- this.sessionLogger.info(`done. session is now stopped`)
369
+ this.sessionLogger.info('done. session is now stopped')
295
370
  break
296
371
 
297
372
  default: {
@@ -302,25 +377,23 @@ export abstract class FixSession extends events.EventEmitter {
302
377
  this.sessionLogger.info(`done. check logout sequence state ${this.stateString()}`)
303
378
  }
304
379
 
305
- public reset (): void {
306
- if (this.timer) {
307
- clearInterval(this.timer)
308
- }
380
+ public reset (resetSeqNum?: number | null): void {
381
+ this.stopTimer()
309
382
  this.transport = null
310
- const resetSeqNum = this.config.description.ResetSeqNumFlag || true
311
- this.sessionState.reset(resetSeqNum) // from header def ... eventually
383
+ const resetFlag = this.config.description.ResetSeqNumFlag
384
+ const seqNum = resetFlag ? 0 : resetSeqNum ?? this.sessionState.lastPeerMsgSeqNum
385
+ this.sessionState.reset(seqNum) // from header def ... eventually
312
386
  this.setState(SessionState.NetworkConnectionEstablished)
313
387
  }
314
388
 
315
- protected stop (error: Error = null): void {
389
+ protected stop (error: Error | null = null): void {
316
390
  if (this.sessionState.state === SessionState.Stopped) {
317
391
  return
318
392
  }
319
- if (this.timer) {
320
- clearInterval(this.timer)
321
- }
322
- this.sessionLogger.info(`stop: kill transport`)
323
- this.transport.end()
393
+ this.stopTimer()
394
+ this.unsubscribe()
395
+ this.sessionLogger.info('stop: kill transport')
396
+ this.transport?.end()
324
397
  if (error) {
325
398
  this.sessionLogger.info(`stop: emit error ${error.message}`)
326
399
  this.emit('error', error)
@@ -329,7 +402,7 @@ export abstract class FixSession extends events.EventEmitter {
329
402
  }
330
403
 
331
404
  this.setState(SessionState.Stopped)
332
- this.onStopped(error)
405
+ this.onStopped(error ?? undefined)
333
406
  this.transport = null
334
407
  }
335
408
 
@@ -1,5 +1,4 @@
1
1
  import { IJsFixConfig } from '../../config'
2
2
  import { FixSession } from './fix-session'
3
3
 
4
- export interface MakeFixSession { (config: IJsFixConfig): FixSession
5
- }
4
+ export type MakeFixSession = (config: IJsFixConfig) => FixSession
@@ -9,10 +9,10 @@ export interface ISessionDescription {
9
9
  readonly SenderCompId: string
10
10
  readonly TargetCompID: string
11
11
  readonly ResetSeqNumFlag: boolean
12
- readonly LastSentSeqNum?: number
12
+ LastSentSeqNum?: number
13
13
  readonly LastReceivedSeqNum?: number
14
14
  readonly SenderSubID: string
15
15
  readonly TargetSubID: string
16
16
  readonly BeginString: string
17
- readonly BodyLengthChars?: number,
17
+ readonly BodyLengthChars?: number
18
18
  }
@@ -4,13 +4,13 @@ import { ISessionDescription } from './session-description'
4
4
 
5
5
  export interface ISessionMsgFactory {
6
6
  description: ISessionDescription
7
- reject (msgType: string, seqNo: number, msg: string, reason: number): ILooseObject
8
- logout (msgType: string, text: string): ILooseObject
9
- logon (userRequestId?: string, isResponse?: boolean): ILooseObject
10
- testRequest (reqId?: string): ILooseObject
11
- resendRequest (from: number, to: number): ILooseObject
12
- sequenceReset (newSeq: number, gapFill?: boolean): ILooseObject
13
- heartbeat (testReqId: string): ILooseObject
14
- header (msgType?: string, seqNum?: number, time?: Date, overrideData?: Partial<IStandardHeader>): ILooseObject
15
- trailer (checksum: number): ILooseObject
7
+ reject: (msgType: string, seqNo: number, msg: string, reason: number) => ILooseObject
8
+ logout: (msgType: string, text: string) => ILooseObject
9
+ logon: (userRequestId?: string, isResponse?: boolean) => ILooseObject
10
+ testRequest: (reqId?: string) => ILooseObject
11
+ resendRequest: (from: number, to: number) => ILooseObject
12
+ sequenceReset: (newSeq: number, gapFill?: boolean) => ILooseObject
13
+ heartbeat: (testReqId: string) => ILooseObject
14
+ header: (msgType?: string, seqNum?: number, time?: Date, overrideData?: Partial<IStandardHeader>) => ILooseObject
15
+ trailer: (checksum: number) => ILooseObject
16
16
  }
@@ -11,38 +11,39 @@ import { IMsgApplication } from '../msg-application'
11
11
  import { FixEntity } from '../fix-entity'
12
12
 
13
13
  /*
14
- create one application session instance - and recover a lost transport. Hence the application
14
+ create one application session instance - and recover a lost transport. Hence, the application
15
15
  will automatically re-connected and the "message recovery" policy enacted i.e. replay from
16
16
  last known sequence number or sequence reset.
17
17
  */
18
18
 
19
19
  @injectable()
20
20
  export class RecoveringTcpInitiator extends FixEntity {
21
- public tcp: ITcpTransportDescription
21
+ public tcp: ITcpTransportDescription | null
22
22
  public session: FixSession
23
23
  private readonly logger: IJsFixLogger
24
- private application: IMsgApplication
24
+ private readonly application: IMsgApplication | null
25
25
  private initiator: TcpInitiator
26
26
  private transport: MsgTransport
27
- private th: Timeout = null
27
+ private th: Timeout | null = null
28
28
  public recoveryAttemptSecs: number = 5
29
29
  public backoffFailConnectSecs: number = 30
30
30
 
31
31
  constructor (@inject(DITokens.IJsFixConfig) public readonly jsFixConfig: IJsFixConfig) {
32
32
  super(jsFixConfig)
33
- this.application = this.jsFixConfig.description.application
34
- this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:RecoveringTcpInitiator`)
33
+ this.application = this.jsFixConfig.description.application ?? null
34
+ const name = this.application?.name ?? 'na'
35
+ this.logger = jsFixConfig.logFactory.logger(`${name}:RecoveringTcpInitiator`)
35
36
  if (!this.application) {
36
- throw new Error(`no application in session description.`)
37
+ throw new Error('no application in session description.')
37
38
  }
38
- this.tcp = this.application.tcp
39
+ this.tcp = this.application.tcp ?? null
39
40
  if (!this.tcp) {
40
- throw new Error(`no tcp in session description need tcp { host: hostname, port: port }`)
41
+ throw new Error('no tcp in session description need tcp { host: hostname, port: port }')
41
42
  }
42
43
  this.createSession(jsFixConfig)
43
44
  }
44
45
 
45
- private createSession (jsFixConfig: IJsFixConfig) {
46
+ private createSession (jsFixConfig: IJsFixConfig): void {
46
47
  this.logger.info(`creating an application session with DI token ${DITokens.FixSession}.`)
47
48
  this.session = jsFixConfig.sessionContainer.resolve<FixSession>(DITokens.FixSession)
48
49
  this.session.on('done', () => {
@@ -60,12 +61,20 @@ export class RecoveringTcpInitiator extends FixEntity {
60
61
  return this.session.getState()
61
62
  }
62
63
 
63
- private newTransport (transport: MsgTransport) {
64
+ public lastSentSeqNum (): number {
65
+ return this.session.lastSentSeqNum()
66
+ }
67
+
68
+ private resetSeq (): boolean {
69
+ return this.jsFixConfig.description.ResetSeqNumFlag
70
+ }
71
+
72
+ private newTransport (transport: MsgTransport): void {
64
73
  this.transport = transport
65
74
  this.emit('transport', transport)
66
75
  this.logger.info(`initiator connects id ${(transport.id)}`)
67
76
  const session = this.session
68
- if (this.jsFixConfig.description.ResetSeqNumFlag) {
77
+ if (this.resetSeq()) {
69
78
  this.logger.info('reset sequence numbers')
70
79
  session.reset()
71
80
  }
@@ -84,7 +93,7 @@ export class RecoveringTcpInitiator extends FixEntity {
84
93
  this.logger.info(`running session with transport ${transport.id} state = ${session.getState()}`)
85
94
  }
86
95
 
87
- private clearTimer () {
96
+ private clearTimer (): void {
88
97
  if (this.th) {
89
98
  clearTimeout(this.th)
90
99
  this.th = null
@@ -98,6 +107,13 @@ export class RecoveringTcpInitiator extends FixEntity {
98
107
  private recover (): void {
99
108
  this.session.setState(SessionState.DetectBrokenNetworkConnection)
100
109
  this.logger.info(`recover session transport - attempt in ${this.recoveryAttemptSecs} secs`)
110
+ if (!this.resetSeq()) {
111
+ const lastSentSeqNum = this.lastSentSeqNum()
112
+ if (lastSentSeqNum > 0) {
113
+ this.logger.info(`recover session set LastSentSeqNum ${lastSentSeqNum} for new transport`)
114
+ this.config.description.LastSentSeqNum = lastSentSeqNum
115
+ }
116
+ }
101
117
  this.th = setTimeout(() => {
102
118
  this.connect(60).then(t => {
103
119
  this.logger.info(`new transport ${t.id}`)
@@ -105,22 +121,24 @@ export class RecoveringTcpInitiator extends FixEntity {
105
121
  this.logger.info(`failed to re-connect ${e.message} - backoff for ${this.backoffFailConnectSecs}`)
106
122
  this.th = setTimeout(() => {
107
123
  this.logger.info('returning to recover()')
108
- this.recover()
124
+ setImmediate(() => {
125
+ this.recover()
126
+ })
109
127
  }, this.backoffFailConnectSecs * 1000)
110
128
  })
111
- },this.recoveryAttemptSecs * 1000)
129
+ }, this.recoveryAttemptSecs * 1000)
112
130
  }
113
131
 
114
- public start (): Promise<any> {
115
- return this.run()
132
+ public async start (): Promise<any> {
133
+ return await this.run()
116
134
  }
117
135
 
118
136
  // for first connection - reject if no initial connection established within timeout
119
137
  // once connection established, will not resolve until session is ended - i.e. lost
120
138
  // connections are re-established using the same session instance.
121
139
 
122
- public run (initialTimeout: number = 60): Promise<any> {
123
- return new Promise<any>((resolve, reject) => {
140
+ public async run (initialTimeout: number = 60): Promise<any> {
141
+ return await new Promise<any>((resolve, reject) => {
124
142
  this.connect(initialTimeout).then(() => {
125
143
  this.on('end', () => {
126
144
  this.clearTimer()
@@ -137,8 +155,8 @@ export class RecoveringTcpInitiator extends FixEntity {
137
155
 
138
156
  // return a promise for new transport - or reject if no connection within timeout
139
157
 
140
- private connect (timeout: number): Promise<MsgTransport> {
141
- return new Promise<MsgTransport>((resolve, reject) => {
158
+ private async connect (timeout: number): Promise<MsgTransport> {
159
+ return await new Promise<MsgTransport>((resolve, reject) => {
142
160
  this.logger.info(`connect: start initiator timeout ${timeout}`)
143
161
  this.session.setState(SessionState.InitiateConnection)
144
162
  this.initiator = new TcpInitiator(this.jsFixConfig)
@@ -13,8 +13,8 @@ export class TcpAcceptorListener extends FixEntity {
13
13
  super(config)
14
14
  }
15
15
 
16
- start (): Promise<any> {
17
- return new Promise<any>(async (accept, reject) => {
16
+ async start (): Promise<any> {
17
+ return await new Promise<any>(async (resolve, reject) => {
18
18
  const logger = this.config.logFactory.logger('acceptor')
19
19
  const sessionContainer = this.config.sessionContainer
20
20
  if (!sessionContainer.isRegistered(DITokens.FixSession)) {
@@ -25,11 +25,12 @@ export class TcpAcceptorListener extends FixEntity {
25
25
  acceptor.on('transport', (t: MsgTransport) => {
26
26
  logger.info(`creates new transport using DI token ${DITokens.FixSession}.`)
27
27
  const acceptorSession = sessionContainer.resolve<FixSession>(DITokens.FixSession)
28
+ this.emit('session', acceptorSession, t)
28
29
  acceptorSession.run(t).then(() => {
29
30
  logger.info('ends')
30
31
  acceptor.close(() => {
31
32
  logger.info('acceptor closed.')
32
- accept(true)
33
+ resolve(true)
33
34
  })
34
35
  }).catch((e: Error) => {
35
36
  logger.info(`error in session - close listener ${e.message}`)