jspurefix 3.5.0 → 4.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 (235) hide show
  1. package/appveyor.yml +1 -1
  2. package/dist/buffer/ascii/ascii-encoder.d.ts +2 -2
  3. package/dist/buffer/ascii/ascii-encoder.js +1 -1
  4. package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
  5. package/dist/buffer/ascii/ascii-parser-state.d.ts +3 -2
  6. package/dist/buffer/ascii/ascii-parser-state.js +1 -2
  7. package/dist/buffer/ascii/ascii-parser-state.js.map +1 -1
  8. package/dist/buffer/ascii/ascii-parser.d.ts +1 -1
  9. package/dist/buffer/ascii/ascii-parser.js +5 -4
  10. package/dist/buffer/ascii/ascii-parser.js.map +1 -1
  11. package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
  12. package/dist/buffer/ascii/ascii-view.d.ts +4 -3
  13. package/dist/buffer/ascii/ascii-view.js +8 -5
  14. package/dist/buffer/ascii/ascii-view.js.map +1 -1
  15. package/dist/buffer/encode-proxy.js +1 -1
  16. package/dist/buffer/encode-proxy.js.map +1 -1
  17. package/dist/buffer/fixml/fixml-encoder.d.ts +2 -2
  18. package/dist/buffer/fixml/fixml-encoder.js +1 -1
  19. package/dist/buffer/fixml/fixml-encoder.js.map +1 -1
  20. package/dist/buffer/fixml/fixml-parser.js +2 -2
  21. package/dist/buffer/fixml/fixml-parser.js.map +1 -1
  22. package/dist/buffer/fixml/fixml-view.d.ts +3 -2
  23. package/dist/buffer/fixml/fixml-view.js +5 -4
  24. package/dist/buffer/fixml/fixml-view.js.map +1 -1
  25. package/dist/buffer/msg-encoder.d.ts +2 -2
  26. package/dist/buffer/msg-encoder.js.map +1 -1
  27. package/dist/buffer/msg-view.d.ts +8 -6
  28. package/dist/buffer/msg-view.js +10 -8
  29. package/dist/buffer/msg-view.js.map +1 -1
  30. package/dist/buffer/segment/segment-description.d.ts +3 -3
  31. package/dist/buffer/segment/segment-description.js.map +1 -1
  32. package/dist/buffer/tag/tags.d.ts +2 -5
  33. package/dist/buffer/tag/tags.js +4 -5
  34. package/dist/buffer/tag/tags.js.map +1 -1
  35. package/dist/collections/collection.d.ts +0 -1
  36. package/dist/collections/collection.js.map +1 -1
  37. package/dist/collections/index.d.ts +0 -1
  38. package/dist/collections/index.js +0 -17
  39. package/dist/collections/index.js.map +1 -1
  40. package/dist/config/js-fix-config.d.ts +2 -1
  41. package/dist/config/js-fix-config.js +3 -3
  42. package/dist/config/js-fix-config.js.map +1 -1
  43. package/dist/dictionary/compiler/compiler-type.d.ts +3 -3
  44. package/dist/dictionary/compiler/compiler-type.js.map +1 -1
  45. package/dist/dictionary/compiler/enum-compiler.js +2 -2
  46. package/dist/dictionary/compiler/enum-compiler.js.map +1 -1
  47. package/dist/dictionary/compiler/msg-compiler.d.ts +1 -2
  48. package/dist/dictionary/compiler/msg-compiler.js +6 -7
  49. package/dist/dictionary/compiler/msg-compiler.js.map +1 -1
  50. package/dist/dictionary/contained/contained-component-field.d.ts +1 -1
  51. package/dist/dictionary/contained/contained-component-field.js.map +1 -1
  52. package/dist/dictionary/contained/contained-field-set.d.ts +9 -20
  53. package/dist/dictionary/contained/contained-field-set.js +16 -149
  54. package/dist/dictionary/contained/contained-field-set.js.map +1 -1
  55. package/dist/dictionary/contained/contained-group-field.d.ts +1 -1
  56. package/dist/dictionary/contained/contained-group-field.js.map +1 -1
  57. package/dist/dictionary/contained/contained-set-builder.d.ts +15 -0
  58. package/dist/dictionary/contained/contained-set-builder.js +142 -0
  59. package/dist/dictionary/contained/contained-set-builder.js.map +1 -0
  60. package/dist/dictionary/contained/contained-set.d.ts +32 -0
  61. package/dist/{types/FIX.5.0SP2/quickfix/xm_lnon_fix.js → dictionary/contained/contained-set.js} +1 -1
  62. package/dist/dictionary/contained/contained-set.js.map +1 -0
  63. package/dist/dictionary/contained/contained-simple-field.d.ts +1 -1
  64. package/dist/dictionary/contained/contained-simple-field.js.map +1 -1
  65. package/dist/dictionary/contained/index.d.ts +4 -1
  66. package/dist/dictionary/contained/index.js +4 -1
  67. package/dist/dictionary/contained/index.js.map +1 -1
  68. package/dist/dictionary/definition/category-simple-set.d.ts +1 -2
  69. package/dist/dictionary/definition/category-simple-set.js +1 -2
  70. package/dist/dictionary/definition/category-simple-set.js.map +1 -1
  71. package/dist/dictionary/definition/component-field-definition.d.ts +1 -1
  72. package/dist/dictionary/definition/component-field-definition.js +2 -2
  73. package/dist/dictionary/definition/component-field-definition.js.map +1 -1
  74. package/dist/dictionary/definition/fix-definitions.d.ts +8 -9
  75. package/dist/dictionary/definition/fix-definitions.js +22 -20
  76. package/dist/dictionary/definition/fix-definitions.js.map +1 -1
  77. package/dist/dictionary/definition/group-field-definition.d.ts +1 -1
  78. package/dist/dictionary/definition/group-field-definition.js +2 -2
  79. package/dist/dictionary/definition/group-field-definition.js.map +1 -1
  80. package/dist/dictionary/definition/message-definition.d.ts +1 -1
  81. package/dist/dictionary/definition/message-definition.js +2 -2
  82. package/dist/dictionary/definition/message-definition.js.map +1 -1
  83. package/dist/dictionary/definition/simple-field-definition.d.ts +2 -3
  84. package/dist/dictionary/definition/simple-field-definition.js +6 -7
  85. package/dist/dictionary/definition/simple-field-definition.js.map +1 -1
  86. package/dist/dictionary/parser/fix-repository/repository.js +20 -20
  87. package/dist/dictionary/parser/fix-repository/repository.js.map +1 -1
  88. package/dist/dictionary/parser/fixml/components-parser.js +18 -16
  89. package/dist/dictionary/parser/fixml/components-parser.js.map +1 -1
  90. package/dist/dictionary/parser/fixml/fields-parser.js +2 -3
  91. package/dist/dictionary/parser/fixml/fields-parser.js.map +1 -1
  92. package/dist/dictionary/parser/fixml/include-graph.js +8 -9
  93. package/dist/dictionary/parser/fixml/include-graph.js.map +1 -1
  94. package/dist/dictionary/parser/quickfix/field-definition-parser.js.map +1 -1
  95. package/dist/dictionary/parser/quickfix/message-parser.js +2 -1
  96. package/dist/dictionary/parser/quickfix/message-parser.js.map +1 -1
  97. package/dist/dictionary/parser/quickfix/node-parser.js +3 -2
  98. package/dist/dictionary/parser/quickfix/node-parser.js.map +1 -1
  99. package/dist/dictionary/parser/quickfix/parse-context.d.ts +3 -3
  100. package/dist/dictionary/parser/quickfix/parse-context.js.map +1 -1
  101. package/dist/dictionary/parser/quickfix/parse-progress.d.ts +1 -2
  102. package/dist/dictionary/parser/quickfix/parse-progress.js +2 -3
  103. package/dist/dictionary/parser/quickfix/parse-progress.js.map +1 -1
  104. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-builder.js +4 -5
  105. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-builder.js.map +1 -1
  106. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js +6 -6
  107. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js.map +1 -1
  108. package/dist/dictionary/parser/quickfix/quick-fix-xml-formatter.d.ts +1 -1
  109. package/dist/dictionary/parser/quickfix/quick-fix-xml-formatter.js.map +1 -1
  110. package/dist/dictionary/set-reduce.d.ts +2 -2
  111. package/dist/dictionary/set-reduce.js.map +1 -1
  112. package/dist/index.d.ts +0 -1
  113. package/dist/index.js +0 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/jsfix-cmd.js +4 -5
  116. package/dist/jsfix-cmd.js.map +1 -1
  117. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js +7 -8
  118. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js.map +1 -1
  119. package/dist/sample/tcp/trade-capture/trade-capture-client.js +3 -4
  120. package/dist/sample/tcp/trade-capture/trade-capture-client.js.map +1 -1
  121. package/dist/sample/tcp/trade-capture/trade-capture-server.js.map +1 -1
  122. package/dist/store/fix-msg-memory-store.js +3 -4
  123. package/dist/store/fix-msg-memory-store.js.map +1 -1
  124. package/dist/store/fix-msg-store-record.js.map +1 -1
  125. package/dist/test/ascii/ascii-encoder.test.js.map +1 -1
  126. package/dist/test/ascii/fix-log-replay.test.js.map +1 -1
  127. package/dist/test/ascii/fix-repo-dict.test.js.map +1 -1
  128. package/dist/test/ascii/qf-50sp0-dict.test.js +7 -7
  129. package/dist/test/ascii/qf-50sp0-dict.test.js.map +1 -1
  130. package/dist/test/ascii/qf-50sp2-dict.test.js +5 -2
  131. package/dist/test/ascii/qf-50sp2-dict.test.js.map +1 -1
  132. package/dist/test/env/encoder-test.d.ts +3 -3
  133. package/dist/test/env/encoder-test.js.map +1 -1
  134. package/dist/test/env/set-constraint-helper.d.ts +4 -4
  135. package/dist/test/env/set-constraint-helper.js.map +1 -1
  136. package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
  137. package/dist/transport/ascii/ascii-session.js +1 -1
  138. package/dist/transport/ascii/ascii-session.js.map +1 -1
  139. package/dist/transport/fixml/fixml-session.js.map +1 -1
  140. package/dist/transport/http/http-acceptor.js +3 -4
  141. package/dist/transport/http/http-acceptor.js.map +1 -1
  142. package/dist/transport/http/http-json-sample-adapter.js +3 -4
  143. package/dist/transport/http/http-json-sample-adapter.js.map +1 -1
  144. package/dist/transport/session/dynamic-session-manager.d.ts +8 -0
  145. package/dist/transport/session/dynamic-session-manager.js +15 -0
  146. package/dist/transport/session/dynamic-session-manager.js.map +1 -0
  147. package/dist/transport/session/session-description.d.ts +9 -7
  148. package/dist/transport/session/session-description.js.map +1 -1
  149. package/dist/util/json-helper.d.ts +2 -2
  150. package/dist/util/json-helper.js.map +1 -1
  151. package/dist/util/message-generator.js +1 -1
  152. package/dist/util/message-generator.js.map +1 -1
  153. package/package.json +16 -16
  154. package/src/buffer/ascii/ascii-encoder.ts +7 -7
  155. package/src/buffer/ascii/ascii-parser-state.ts +4 -4
  156. package/src/buffer/ascii/ascii-parser.ts +6 -5
  157. package/src/buffer/ascii/ascii-segment-parser.ts +2 -2
  158. package/src/buffer/ascii/ascii-view.ts +9 -7
  159. package/src/buffer/encode-proxy.ts +9 -9
  160. package/src/buffer/fixml/fixml-encoder.ts +14 -10
  161. package/src/buffer/fixml/fixml-parser.ts +5 -5
  162. package/src/buffer/fixml/fixml-view.ts +5 -5
  163. package/src/buffer/msg-encoder.ts +3 -3
  164. package/src/buffer/msg-view.ts +18 -18
  165. package/src/buffer/segment/segment-description.ts +2 -2
  166. package/src/buffer/tag/tags.ts +4 -6
  167. package/src/collections/collection.ts +0 -1
  168. package/src/collections/index.ts +1 -1
  169. package/src/config/js-fix-config.ts +3 -2
  170. package/src/dictionary/compiler/compiler-type.ts +8 -2
  171. package/src/dictionary/compiler/enum-compiler.ts +2 -2
  172. package/src/dictionary/compiler/msg-compiler.ts +11 -12
  173. package/src/dictionary/contained/contained-component-field.ts +1 -1
  174. package/src/dictionary/contained/contained-field-set.ts +21 -176
  175. package/src/dictionary/contained/contained-group-field.ts +1 -1
  176. package/src/dictionary/contained/contained-set-builder.ts +164 -0
  177. package/src/dictionary/contained/contained-set.ts +83 -0
  178. package/src/dictionary/contained/contained-simple-field.ts +1 -1
  179. package/src/dictionary/contained/index.ts +4 -1
  180. package/src/dictionary/definition/category-simple-set.ts +1 -2
  181. package/src/dictionary/definition/component-field-definition.ts +1 -1
  182. package/src/dictionary/definition/fix-definitions.ts +28 -26
  183. package/src/dictionary/definition/group-field-definition.ts +1 -1
  184. package/src/dictionary/definition/message-definition.ts +6 -6
  185. package/src/dictionary/definition/simple-field-definition.ts +9 -10
  186. package/src/dictionary/parser/fix-repository/repository.ts +47 -40
  187. package/src/dictionary/parser/fixml/components-parser.ts +41 -38
  188. package/src/dictionary/parser/fixml/fields-parser.ts +3 -4
  189. package/src/dictionary/parser/fixml/include-graph.ts +13 -14
  190. package/src/dictionary/parser/quickfix/field-definition-parser.ts +5 -5
  191. package/src/dictionary/parser/quickfix/message-parser.ts +7 -5
  192. package/src/dictionary/parser/quickfix/node-parser.ts +13 -6
  193. package/src/dictionary/parser/quickfix/parse-context.ts +2 -2
  194. package/src/dictionary/parser/quickfix/parse-progress.ts +2 -3
  195. package/src/dictionary/parser/quickfix/quick-fix-xml-file-builder.ts +4 -5
  196. package/src/dictionary/parser/quickfix/quick-fix-xml-file-parser.ts +10 -12
  197. package/src/dictionary/parser/quickfix/quick-fix-xml-formatter.ts +1 -1
  198. package/src/dictionary/set-reduce.ts +3 -3
  199. package/src/index.ts +0 -1
  200. package/src/jsfix-cmd.ts +5 -6
  201. package/src/sample/tcp/recovering-skeleton/respawn-acceptor.ts +7 -8
  202. package/src/sample/tcp/trade-capture/trade-capture-client.ts +4 -5
  203. package/src/sample/tcp/trade-capture/trade-capture-server.ts +1 -1
  204. package/src/store/fix-msg-memory-store.ts +3 -4
  205. package/src/store/fix-msg-store-record.ts +1 -1
  206. package/src/transport/ascii/ascii-msg-transmitter.ts +6 -6
  207. package/src/transport/ascii/ascii-session.ts +6 -6
  208. package/src/transport/fixml/fixml-session.ts +3 -3
  209. package/src/transport/http/http-acceptor.ts +4 -5
  210. package/src/transport/http/http-json-sample-adapter.ts +3 -4
  211. package/src/transport/session/dynamic-session-manager.ts +16 -0
  212. package/src/transport/session/session-description.ts +10 -7
  213. package/src/util/json-helper.ts +3 -3
  214. package/src/util/message-generator.ts +4 -4
  215. package/dist/collections/dictionary.d.ts +0 -15
  216. package/dist/collections/dictionary.js +0 -57
  217. package/dist/collections/dictionary.js.map +0 -1
  218. package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.d.ts +0 -31
  219. package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.js +0 -3
  220. package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.js.map +0 -1
  221. package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.d.ts +0 -26
  222. package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.js +0 -3
  223. package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.js.map +0 -1
  224. package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.d.ts +0 -5
  225. package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.js +0 -3
  226. package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.js.map +0 -1
  227. package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.d.ts +0 -8
  228. package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.js +0 -3
  229. package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.js.map +0 -1
  230. package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.d.ts +0 -4
  231. package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.js +0 -3
  232. package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.js.map +0 -1
  233. package/dist/types/FIX.5.0SP2/quickfix/xm_lnon_fix.d.ts +0 -6
  234. package/dist/types/FIX.5.0SP2/quickfix/xm_lnon_fix.js.map +0 -1
  235. package/src/collections/dictionary.ts +0 -62
package/appveyor.yml CHANGED
@@ -9,10 +9,10 @@ platform:
9
9
 
10
10
  environment:
11
11
  matrix:
12
+ - nodejs_version: "22"
12
13
  - nodejs_version: "20"
13
14
  - nodejs_version: "18"
14
15
  - nodejs_version: "16"
15
- - nodejs_version: "14"
16
16
 
17
17
  test_script:
18
18
  - ps: Write-Host "jspurefix test script"
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { ILooseObject } from '../../collections/collection';
3
- import { ContainedFieldSet, FieldsDispatch } from '../../dictionary/contained';
3
+ import { IContainedSet, FieldsDispatch } from '../../dictionary/contained';
4
4
  import { FixDefinitions } from '../../dictionary/definition';
5
5
  import { MsgEncoder } from '../msg-encoder';
6
6
  import { ElasticBuffer } from '../elastic-buffer';
@@ -20,7 +20,7 @@ export declare class AsciiEncoder extends MsgEncoder {
20
20
  constructor(buffer: ElasticBuffer, definitions: FixDefinitions, timeFormatter?: ITimeFormatter, delimiter?: number, logDelimiter?: number);
21
21
  trim(): Buffer;
22
22
  reset(): void;
23
- encodeSet(objectToEncode: ILooseObject, set: ContainedFieldSet): void;
23
+ encodeSet(objectToEncode: ILooseObject, set: IContainedSet): void;
24
24
  private encodeObject;
25
25
  private getFields;
26
26
  private encodeInstances;
@@ -17,7 +17,7 @@ class AsciiEncoder extends msg_encoder_1.MsgEncoder {
17
17
  this.logDelimiter = logDelimiter;
18
18
  this.checkGroups = true;
19
19
  this.dispatcher = new contained_1.FieldsDispatch();
20
- this.tags = new tags_1.Tags(definitions);
20
+ this.tags = new tags_1.Tags();
21
21
  }
22
22
  trim() {
23
23
  const b = this.buffer.copy();
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-encoder.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-encoder.ts"],"names":[],"mappings":";;;AACA,0DAImC;AAEnC,gDAA2C;AAE3C,qDAAgD;AAEhD,+CAA0C;AAC1C,sCAAkC;AAClC,8CAAyC;AAEzC,MAAa,YAAa,SAAQ,wBAAU;IAO1C,YAA6B,MAAqB,EAChC,WAA2B,EAC3B,gBAAgC,IAAI,8BAAa,CAAC,MAAM,CAAC,EACzD,YAAoB,wBAAU,CAAC,GAAG,EAClC,eAAuB,wBAAU,CAAC,IAAI;QACtD,KAAK,CAAC,WAAW,CAAC,CAAA;QALS,WAAM,GAAN,MAAM,CAAe;QAChC,gBAAW,GAAX,WAAW,CAAgB;QAC3B,kBAAa,GAAb,aAAa,CAA4C;QACzD,cAAS,GAAT,SAAS,CAAyB;QAClC,iBAAY,GAAZ,YAAY,CAA0B;QAPjD,gBAAW,GAAY,IAAI,CAAA;QACzB,eAAU,GAAmB,IAAI,0BAAc,EAAE,CAAA;QAQxD,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,WAAW,CAAC,CAAA;IACnC,CAAC;IAEM,IAAI;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;gBAC7B,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAA;IACV,CAAC;IAIM,KAAK;QACV,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC;IAEM,SAAS,CAAE,cAA4B,EAAE,GAAsB;QACpE,MAAM,OAAO,GAA0B,IAAI,qBAAqB,EAAE,CAAA;QAClE,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAEO,YAAY,CAAE,cAA4B,EAAE,GAAsB,EAAE,KAA4B;QACtG,MAAM,MAAM,GAAqB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QACpE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE;YACrC,MAAM,EAAE,CAAC,EAAwB,EAAE,EAAE;gBACnC,MAAM,GAAG,GAAQ,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;gBAExC,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;oBAC9B,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;wBACtB,KAAK,CAAC,WAAW,GAAG,EAAE,CAAA;oBACxB,CAAC;oBACD,KAAK,CAAC,UAAU,GAAG,EAAE,CAAA;oBACrB,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;gBACjD,CAAC;YACH,CAAC;YACD,SAAS,EAAE,CAAC,EAA2B,EAAE,EAAE;gBACzC,MAAM,QAAQ,GAAiB,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;gBACjE,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;YACD,KAAK,EAAE,CAAC,EAAuB,EAAE,EAAE;gBACjC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;YAC1C,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;IAEO,SAAS,CAAE,GAAsB,EAAE,CAAe;QACxD,MAAM,IAAI,GAAa,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrC,IAAI,CAAC,GAAW,CAAC,CAAA;QACjB,MAAM,MAAM,GAAqB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,OAAe,EAAE,EAAE;YACpF,MAAM,KAAK,GAA0B,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACtE,IAAI,KAAK,EAAE,CAAC;gBACV,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAA;YAChB,CAAC;YACD,OAAO,CAAC,CAAA;QACV,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAiB,EAAE,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;QAC9E,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,eAAe,CAAE,CAAe,EAAE,EAAuB;QAC/D,MAAM,SAAS,GAAiC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAA;QACvE,IAAI,CAAC,SAAS;YAAE,OAAM;QACtB,MAAM,SAAS,GAAmB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAEjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAA;YACxC,MAAM,IAAI,GAA0B,SAAS,CAAC,IAAI,CAAA;YAGlD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;YACnC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACzC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;YAC/C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;gBACtD,MAAM,QAAQ,GAAiB,SAAS,CAAC,KAAK,CAAC,CAAA;gBAC/C,IAAI,CAAC,KAAK,EAAE,CAAA;gBACZ,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBAC3C,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBACnD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAE,GAAW;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,SAAS,CAAC,wBAAU,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IAEO,cAAc,CAAE,WAAmB,EAAE,GAAW;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAA;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,CAAC,CAAA;QAChE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC7B,CAAC;IAEO,YAAY,CAAE,CAAe,EAAE,GAAsB,EAAE,EAAwB,EAAE,GAAQ;QAC/F,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAA;QAChC,MAAM,GAAG,GAAW,UAAU,CAAC,GAAG,CAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAA;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAA;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;QAC3B,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,IAAI,OAAgB,CAAA;QACpB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,QAAQ,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC3B,KAAK,kBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrB,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;oBAC5B,MAAM,EAAE,GAAW,GAAG,CAAA;oBACtB,MAAM,KAAK,GAAW,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;oBACxD,GAAG,GAAG,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAA;oBACpC,MAAK;gBACP,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACR,OAAO,GAAG,kBAAO,CAAC,MAAM,CAAA;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;QAC9B,CAAC;QAED,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,kBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBAErB,MAAK;YACP,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBACR,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;gBACxB,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;gBAC7B,MAAK;YACP,CAAC;QACH,CAAC;QAED,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,kBAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpB,MAAM,CAAC,WAAW,CAAC,GAAa,CAAC,CAAA;gBACjC,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnB,MAAM,CAAC,WAAW,CAAC,GAAa,CAAC,CAAA;gBACjC,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,GAAG,CAAC;YACjB,KAAK,kBAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpB,MAAM,CAAC,gBAAgB,CAAC,GAAa,CAAC,CAAA;gBACtC,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrB,MAAM,CAAC,YAAY,CAAC,GAAc,CAAC,CAAA;gBACnC,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC1B,EAAE,CAAC,iBAAiB,CAAC,GAAW,CAAC,CAAA;gBACjC,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,WAAW,CAAC,CAAC,CAAC;gBACzB,EAAE,CAAC,YAAY,CAAC,GAAW,CAAC,CAAA;gBAC5B,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,WAAW,CAAC,CAAC,CAAC;gBACzB,EAAE,CAAC,YAAY,CAAC,GAAW,CAAC,CAAA;gBAC5B,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBACvB,EAAE,CAAC,cAAc,CAAC,GAAW,CAAC,CAAA;gBAC9B,MAAK;YACP,CAAC;YAED,KAAK,kBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrB,MAAM,CAAC,GAAG,GAAa,CAAA;gBACvB,MAAM,QAAQ,GAAyB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAyB,CAAA;gBAC1F,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;oBAC7B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;oBAC5C,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;oBACjC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;gBAC7B,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;gBACxB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;gBACrB,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;gBAC7B,MAAK;YACP,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,CAAC,WAAW,CAAC,GAAa,CAAC,CAAA;gBACjC,MAAK;YACP,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QAErC,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,WAAI,CAAC,aAAa;gBACrB,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,CAAC,CAAA;gBAC5B,MAAK;YAEP,KAAK,WAAI,CAAC,MAAM;gBACd,IAAI,CAAC,UAAU,GAAG,GAAG,CAAA;gBACrB,MAAK;QACT,CAAC;IACH,CAAC;CACF;AAjPD,oCAiPC;AAED,MAAM,cAAc;IAClB,YAA6B,EAAuB,EAClC,QAA+B,IAAI,qBAAqB,EAAE,EAC1D,OAA8B,IAAI,qBAAqB,EAAE;QAF9C,OAAE,GAAF,EAAE,CAAqB;QAClC,UAAK,GAAL,KAAK,CAAqD;QAC1D,SAAI,GAAJ,IAAI,CAAqD;IAC3E,CAAC;IAED,UAAU,CAAE,KAAa;QACvB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7C,CAAC;IAED,mBAAmB,CAAE,KAAa;;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QAClF,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,8BAA8B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,MAAA,KAAK,CAAC,WAAW,0CAAE,UAAU,CAAC,GAAG,CAAA;YAClD,MAAM,GAAG,GAAG,MAAA,IAAI,CAAC,WAAW,0CAAE,UAAU,CAAC,GAAG,CAAA;YAC5C,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,mBAAmB,KAAK,4BAA4B,GAAG,iBAAiB,QAAQ,EAAE,CAAA;gBAC9F,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,qBAAqB;IACzB,YAAoB,cAA2C,IAAI,EAC1D,aAA0C,IAAI,EAC9C,QAAgB,CAAC;QAFN,gBAAW,GAAX,WAAW,CAAoC;QAC1D,eAAU,GAAV,UAAU,CAAoC;QAC9C,UAAK,GAAL,KAAK,CAAY;IAC1B,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,CAAA;IACtD,CAAC;CACF","sourcesContent":["import { ILooseObject } from '../../collections/collection'\r\nimport {\r\n ContainedGroupField, ContainedSimpleField,\r\n ContainedFieldSet, ContainedField,\r\n ContainedComponentField, FieldsDispatch\r\n} from '../../dictionary/contained'\r\nimport { SimpleFieldDefinition, FixDefinitions } from '../../dictionary/definition'\r\nimport { MsgEncoder } from '../msg-encoder'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { TimeFormatter } from './time-formatter'\r\nimport { ITimeFormatter } from './itime-formatter'\r\nimport { AsciiChars } from './ascii-chars'\r\nimport { Tags } from '../tag/tags'\r\nimport { TagType } from '../tag/tag-type'\r\n\r\nexport class AsciiEncoder extends MsgEncoder {\r\n public bodyLengthPos: number\r\n public msgTypePos: number\r\n public tags: Tags\r\n public checkGroups: boolean = true\r\n readonly dispatcher: FieldsDispatch = new FieldsDispatch()\r\n\r\n constructor (public readonly buffer: ElasticBuffer,\r\n public readonly definitions: FixDefinitions,\r\n public readonly timeFormatter: ITimeFormatter = new TimeFormatter(buffer),\r\n public readonly delimiter: number = AsciiChars.Soh,\r\n public readonly logDelimiter: number = AsciiChars.Pipe) {\r\n super(definitions)\r\n this.tags = new Tags(definitions)\r\n }\r\n\r\n public trim (): Buffer {\r\n const b = this.buffer.copy()\r\n const delimiter = this.delimiter\r\n const logDelimiter = this.logDelimiter\r\n const tags = this.tags\r\n if (delimiter !== logDelimiter) {\r\n for (let p = 0; p < tags.nextTagPos; ++p) {\r\n const tagPos = tags.tagPos[p]\r\n b.writeUInt8(delimiter, tagPos.start + tagPos.len)\r\n }\r\n }\r\n\r\n return b\r\n }\r\n\r\n // only reset tags after entire message is encoded - <hdr>body<trl>\r\n\r\n public reset (): void {\r\n this.buffer.reset()\r\n this.tags.reset()\r\n }\r\n\r\n public encodeSet (objectToEncode: ILooseObject, set: ContainedFieldSet): void {\r\n const summary: AsciiEncodeSetSummary = new AsciiEncodeSetSummary()\r\n this.encodeObject(objectToEncode, set, summary)\r\n }\r\n\r\n private encodeObject (objectToEncode: ILooseObject, set: ContainedFieldSet, state: AsciiEncodeSetSummary): void {\r\n const fields: ContainedField[] = this.getFields(set, objectToEncode)\r\n this.dispatcher.dispatchFields(fields, {\r\n simple: (sf: ContainedSimpleField) => {\r\n const val: any = objectToEncode[sf.name]\r\n // Empty strings are omitted as they result in empty values for tags, which are considered malformed.\r\n if (val != null && val !== '') {\r\n if (state.count === 0) {\r\n state.firstSimple = sf\r\n }\r\n state.lastSimple = sf\r\n state.count++\r\n this.encodeSimple(objectToEncode, set, sf, val)\r\n }\r\n },\r\n component: (cf: ContainedComponentField) => {\r\n const instance: ILooseObject = objectToEncode[cf.definition.name]\r\n if (instance) {\r\n this.encodeObject(instance, cf.definition, state)\r\n }\r\n },\r\n group: (gf: ContainedGroupField) => {\r\n this.encodeInstances(objectToEncode, gf)\r\n }\r\n })\r\n }\r\n\r\n private getFields (set: ContainedFieldSet, o: ILooseObject): ContainedField[] {\r\n const keys: string[] = Object.keys(o)\r\n let j: number = 0\r\n const fields: ContainedField[] = keys.reduce((a: ContainedField[], current: string) => {\r\n const field: ContainedField | null = set.localNameToField.get(current)\r\n if (field) {\r\n a[j++] = field\r\n }\r\n return a\r\n }, new Array(keys.length))\r\n fields.sort((a: ContainedField, b: ContainedField) => a.position - b.position)\r\n return fields\r\n }\r\n\r\n private encodeInstances (o: ILooseObject, gf: ContainedGroupField): void {\r\n const noOfField: SimpleFieldDefinition | null = gf.definition.noOfField\r\n if (!noOfField) return\r\n const instances: ILooseObject[] = o[gf.name] || o[noOfField.name]\r\n\r\n const buffer = this.buffer\r\n if (!Array.isArray(instances)) {\r\n throw new Error(`expected array instance for group ${noOfField.name}`)\r\n }\r\n if (instances) {\r\n const validator = new GroupValidator(gf)\r\n const test: AsciiEncodeSetSummary = validator.test\r\n\r\n // a repeated group has number of instances at the start of group\r\n this.WriteTagEquals(noOfField.tag)\r\n const posValBegin = buffer.getPos()\r\n buffer.writeWholeNumber(instances.length)\r\n this.writeDelimiter(posValBegin, noOfField.tag)\r\n for (let field = 0; field < instances.length; ++field) {\r\n const instance: ILooseObject = instances[field]\r\n test.reset()\r\n const summary = validator.getSummary(field)\r\n this.encodeObject(instance, gf.definition, summary)\r\n if (this.checkGroups) {\r\n validator.assertInstanceValid(field)\r\n }\r\n }\r\n }\r\n }\r\n\r\n private WriteTagEquals (tag: number): void {\r\n const buffer = this.buffer\r\n buffer.writeWholeNumber(tag)\r\n buffer.writeChar(AsciiChars.Equal)\r\n }\r\n\r\n private writeDelimiter (posValBegin: number, tag: number): void {\r\n const delimiter = this.logDelimiter\r\n const buffer = this.buffer\r\n this.tags.store(posValBegin, buffer.getPos() - posValBegin, tag)\r\n buffer.writeChar(delimiter)\r\n }\r\n\r\n private encodeSimple (o: ILooseObject, set: ContainedFieldSet, sf: ContainedSimpleField, val: any): void {\r\n const definition = sf.definition\r\n const tag: number = definition.tag\r\n const buffer = this.buffer\r\n const delimiter = this.logDelimiter\r\n const tf = this.timeFormatter\r\n const pos = buffer.getPos()\r\n let posValBegin = 0\r\n\r\n let tagType: TagType\r\n if (typeof val === 'string') {\r\n switch (definition.tagType) {\r\n case TagType.Boolean: {\r\n tagType = definition.tagType\r\n const vs: string = val\r\n const first: string = vs.length > 0 ? vs.charAt(0) : 'N'\r\n val = first === 'Y' || first === 'T'\r\n break\r\n }\r\n default: {\r\n tagType = TagType.String\r\n }\r\n }\r\n } else {\r\n tagType = definition.tagType\r\n }\r\n\r\n switch (tagType) {\r\n case TagType.RawData: {\r\n // may need to first write raw message length (see below)\r\n break\r\n }\r\n\r\n default: {\r\n this.WriteTagEquals(tag)\r\n posValBegin = buffer.getPos()\r\n break\r\n }\r\n }\r\n\r\n switch (tagType) {\r\n case TagType.String: {\r\n buffer.writeString(val as string)\r\n break\r\n }\r\n\r\n case TagType.Float: {\r\n buffer.writeNumber(val as number)\r\n break\r\n }\r\n\r\n case TagType.Int:\r\n case TagType.Length: {\r\n buffer.writeWholeNumber(val as number)\r\n break\r\n }\r\n\r\n case TagType.Boolean: {\r\n buffer.writeBoolean(val as boolean)\r\n break\r\n }\r\n\r\n case TagType.UtcTimestamp: {\r\n tf.writeUtcTimestamp(val as Date)\r\n break\r\n }\r\n\r\n case TagType.UtcTimeOnly: {\r\n tf.writeUtcTime(val as Date)\r\n break\r\n }\r\n\r\n case TagType.UtcDateOnly: {\r\n tf.writeUtcDate(val as Date)\r\n break\r\n }\r\n\r\n case TagType.LocalDate: {\r\n tf.writeLocalDate(val as Date)\r\n break\r\n }\r\n\r\n case TagType.RawData: {\r\n const b = val as Buffer\r\n const lenField: ContainedSimpleField = set.fields[sf.position - 1] as ContainedSimpleField\r\n if (o[lenField.name] == null) {\r\n this.WriteTagEquals(lenField.definition.tag)\r\n buffer.writeWholeNumber(b.length)\r\n buffer.writeChar(delimiter)\r\n }\r\n this.WriteTagEquals(tag)\r\n buffer.writeBuffer(b)\r\n posValBegin = buffer.getPos()\r\n break\r\n }\r\n\r\n default: {\r\n buffer.writeString(val as string)\r\n break\r\n }\r\n }\r\n\r\n this.writeDelimiter(posValBegin, tag)\r\n\r\n switch (tag) {\r\n case Tags.BodyLengthTag:\r\n this.bodyLengthPos = pos + 2\r\n break\r\n\r\n case Tags.MsgTag:\r\n this.msgTypePos = pos\r\n break\r\n }\r\n }\r\n}\r\n\r\nclass GroupValidator {\r\n constructor (public readonly gf: ContainedGroupField,\r\n public readonly first: AsciiEncodeSetSummary = new AsciiEncodeSetSummary(),\r\n public readonly test: AsciiEncodeSetSummary = new AsciiEncodeSetSummary()) {\r\n }\r\n\r\n getSummary (field: number): AsciiEncodeSetSummary {\r\n return field === 0 ? this.first : this.test\r\n }\r\n\r\n assertInstanceValid (field: number): void {\r\n const first = this.first\r\n const test = this.test\r\n if (field === 0 && first.empty()) {\r\n throw new Error(`first group instance has no delimiter present ${this.gf.name}`)\r\n }\r\n if (field > 0 && test.empty()) {\r\n throw new Error(`group instance [${field}] has no delimiter present ${this.gf.name}`)\r\n }\r\n if (field > 0) {\r\n const firstTag = first.firstSimple?.definition.tag\r\n const tag = test.firstSimple?.definition.tag\r\n if (firstTag !== tag) {\r\n const msg = `group instance [${field}] inconsistent delimiter ${tag} expected tag ${firstTag}`\r\n throw new Error(msg)\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass AsciiEncodeSetSummary {\r\n constructor (public firstSimple: ContainedSimpleField | null = null,\r\n public lastSimple: ContainedSimpleField | null = null,\r\n public count: number = 0) {\r\n }\r\n\r\n public reset (): void {\r\n this.firstSimple = null\r\n this.lastSimple = null\r\n this.count = 0\r\n }\r\n\r\n public empty (): boolean {\r\n return this.firstSimple === null || this.count === 0\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ascii-encoder.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-encoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { ILooseObject } from '../../collections/collection'\r\nimport {\r\n ContainedGroupField, ContainedSimpleField,\r\n IContainedSet, ContainedField,\r\n ContainedComponentField, FieldsDispatch\r\n} from '../../dictionary/contained'\r\nimport { SimpleFieldDefinition, FixDefinitions } from '../../dictionary/definition'\r\nimport { MsgEncoder } from '../msg-encoder'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { TimeFormatter } from './time-formatter'\r\nimport { ITimeFormatter } from './itime-formatter'\r\nimport { AsciiChars } from './ascii-chars'\r\nimport { Tags } from '../tag/tags'\r\nimport { TagType } from '../tag/tag-type'\r\n\r\nexport class AsciiEncoder extends MsgEncoder {\r\n public bodyLengthPos: number\r\n public msgTypePos: number\r\n public tags: Tags\r\n public checkGroups: boolean = true\r\n readonly dispatcher: FieldsDispatch = new FieldsDispatch()\r\n\r\n constructor (public readonly buffer: ElasticBuffer,\r\n public readonly definitions: FixDefinitions,\r\n public readonly timeFormatter: ITimeFormatter = new TimeFormatter(buffer),\r\n public readonly delimiter: number = AsciiChars.Soh,\r\n public readonly logDelimiter: number = AsciiChars.Pipe) {\r\n super(definitions)\r\n this.tags = new Tags()\r\n }\r\n\r\n public trim (): Buffer {\r\n const b = this.buffer.copy()\r\n const delimiter = this.delimiter\r\n const logDelimiter = this.logDelimiter\r\n const tags = this.tags\r\n if (delimiter !== logDelimiter) {\r\n for (let p = 0; p < tags.nextTagPos; ++p) {\r\n const tagPos = tags.tagPos[p]\r\n b.writeUInt8(delimiter, tagPos.start + tagPos.len)\r\n }\r\n }\r\n\r\n return b\r\n }\r\n\r\n // only reset tags after entire message is encoded - <hdr>body<trl>\r\n\r\n public reset (): void {\r\n this.buffer.reset()\r\n this.tags.reset()\r\n }\r\n\r\n public encodeSet (objectToEncode: ILooseObject, set: IContainedSet): void {\r\n const summary: AsciiEncodeSetSummary = new AsciiEncodeSetSummary()\r\n this.encodeObject(objectToEncode, set, summary)\r\n }\r\n\r\n private encodeObject (objectToEncode: ILooseObject, set: IContainedSet, state: AsciiEncodeSetSummary): void {\r\n const fields: ContainedField[] = this.getFields(set, objectToEncode)\r\n this.dispatcher.dispatchFields(fields, {\r\n simple: (sf: ContainedSimpleField) => {\r\n const val: any = objectToEncode[sf.name]\r\n // Empty strings are omitted as they result in empty values for tags, which are considered malformed.\r\n if (val != null && val !== '') {\r\n if (state.count === 0) {\r\n state.firstSimple = sf\r\n }\r\n state.lastSimple = sf\r\n state.count++\r\n this.encodeSimple(objectToEncode, set, sf, val)\r\n }\r\n },\r\n component: (cf: ContainedComponentField) => {\r\n const instance: ILooseObject = objectToEncode[cf.definition.name]\r\n if (instance) {\r\n this.encodeObject(instance, cf.definition, state)\r\n }\r\n },\r\n group: (gf: ContainedGroupField) => {\r\n this.encodeInstances(objectToEncode, gf)\r\n }\r\n })\r\n }\r\n\r\n private getFields (set: IContainedSet, o: ILooseObject): ContainedField[] {\r\n const keys: string[] = Object.keys(o)\r\n let j: number = 0\r\n const fields: ContainedField[] = keys.reduce((a: ContainedField[], current: string) => {\r\n const field = set.localNameToField.get(current)\r\n if (field) {\r\n a[j++] = field\r\n }\r\n return a\r\n }, new Array(keys.length))\r\n fields.sort((a: ContainedField, b: ContainedField) => a.position - b.position)\r\n return fields\r\n }\r\n\r\n private encodeInstances (o: ILooseObject, gf: ContainedGroupField): void {\r\n const noOfField: SimpleFieldDefinition | null = gf.definition.noOfField\r\n if (!noOfField) return\r\n const instances: ILooseObject[] = o[gf.name] || o[noOfField.name]\r\n\r\n const buffer = this.buffer\r\n if (!Array.isArray(instances)) {\r\n throw new Error(`expected array instance for group ${noOfField.name}`)\r\n }\r\n if (instances) {\r\n const validator = new GroupValidator(gf)\r\n const test: AsciiEncodeSetSummary = validator.test\r\n\r\n // a repeated group has number of instances at the start of group\r\n this.WriteTagEquals(noOfField.tag)\r\n const posValBegin = buffer.getPos()\r\n buffer.writeWholeNumber(instances.length)\r\n this.writeDelimiter(posValBegin, noOfField.tag)\r\n for (let field = 0; field < instances.length; ++field) {\r\n const instance: ILooseObject = instances[field]\r\n test.reset()\r\n const summary = validator.getSummary(field)\r\n this.encodeObject(instance, gf.definition, summary)\r\n if (this.checkGroups) {\r\n validator.assertInstanceValid(field)\r\n }\r\n }\r\n }\r\n }\r\n\r\n private WriteTagEquals (tag: number): void {\r\n const buffer = this.buffer\r\n buffer.writeWholeNumber(tag)\r\n buffer.writeChar(AsciiChars.Equal)\r\n }\r\n\r\n private writeDelimiter (posValBegin: number, tag: number): void {\r\n const delimiter = this.logDelimiter\r\n const buffer = this.buffer\r\n this.tags.store(posValBegin, buffer.getPos() - posValBegin, tag)\r\n buffer.writeChar(delimiter)\r\n }\r\n\r\n private encodeSimple (o: ILooseObject, set: IContainedSet, sf: ContainedSimpleField, val: any): void {\r\n const definition = sf.definition\r\n const tag: number = definition.tag\r\n const buffer = this.buffer\r\n const delimiter = this.logDelimiter\r\n const tf = this.timeFormatter\r\n const pos = buffer.getPos()\r\n let posValBegin = 0\r\n\r\n let tagType: TagType\r\n if (typeof val === 'string') {\r\n switch (definition.tagType) {\r\n case TagType.Boolean: {\r\n tagType = definition.tagType\r\n const vs: string = val\r\n const first: string = vs.length > 0 ? vs.charAt(0) : 'N'\r\n val = first === 'Y' || first === 'T'\r\n break\r\n }\r\n default: {\r\n tagType = TagType.String\r\n }\r\n }\r\n } else {\r\n tagType = definition.tagType\r\n }\r\n\r\n switch (tagType) {\r\n case TagType.RawData: {\r\n // may need to first write raw message length (see below)\r\n break\r\n }\r\n\r\n default: {\r\n this.WriteTagEquals(tag)\r\n posValBegin = buffer.getPos()\r\n break\r\n }\r\n }\r\n\r\n switch (tagType) {\r\n case TagType.String: {\r\n buffer.writeString(val as string)\r\n break\r\n }\r\n\r\n case TagType.Float: {\r\n buffer.writeNumber(val as number)\r\n break\r\n }\r\n\r\n case TagType.Int:\r\n case TagType.Length: {\r\n buffer.writeWholeNumber(val as number)\r\n break\r\n }\r\n\r\n case TagType.Boolean: {\r\n buffer.writeBoolean(val as boolean)\r\n break\r\n }\r\n\r\n case TagType.UtcTimestamp: {\r\n tf.writeUtcTimestamp(val as Date)\r\n break\r\n }\r\n\r\n case TagType.UtcTimeOnly: {\r\n tf.writeUtcTime(val as Date)\r\n break\r\n }\r\n\r\n case TagType.UtcDateOnly: {\r\n tf.writeUtcDate(val as Date)\r\n break\r\n }\r\n\r\n case TagType.LocalDate: {\r\n tf.writeLocalDate(val as Date)\r\n break\r\n }\r\n\r\n case TagType.RawData: {\r\n const b = val as Buffer\r\n const lenField: ContainedSimpleField = set.fields[sf.position - 1] as ContainedSimpleField\r\n if (o[lenField.name] == null) {\r\n this.WriteTagEquals(lenField.definition.tag)\r\n buffer.writeWholeNumber(b.length)\r\n buffer.writeChar(delimiter)\r\n }\r\n this.WriteTagEquals(tag)\r\n buffer.writeBuffer(b)\r\n posValBegin = buffer.getPos()\r\n break\r\n }\r\n\r\n default: {\r\n buffer.writeString(val as string)\r\n break\r\n }\r\n }\r\n\r\n this.writeDelimiter(posValBegin, tag)\r\n\r\n switch (tag) {\r\n case Tags.BodyLengthTag:\r\n this.bodyLengthPos = pos + 2\r\n break\r\n\r\n case Tags.MsgTag:\r\n this.msgTypePos = pos\r\n break\r\n }\r\n }\r\n}\r\n\r\nclass GroupValidator {\r\n constructor (public readonly gf: ContainedGroupField,\r\n public readonly first: AsciiEncodeSetSummary = new AsciiEncodeSetSummary(),\r\n public readonly test: AsciiEncodeSetSummary = new AsciiEncodeSetSummary()) {\r\n }\r\n\r\n getSummary (field: number): AsciiEncodeSetSummary {\r\n return field === 0 ? this.first : this.test\r\n }\r\n\r\n assertInstanceValid (field: number): void {\r\n const first = this.first\r\n const test = this.test\r\n if (field === 0 && first.empty()) {\r\n throw new Error(`first group instance has no delimiter present ${this.gf.name}`)\r\n }\r\n if (field > 0 && test.empty()) {\r\n throw new Error(`group instance [${field}] has no delimiter present ${this.gf.name}`)\r\n }\r\n if (field > 0) {\r\n const firstTag = first.firstSimple?.definition.tag\r\n const tag = test.firstSimple?.definition.tag\r\n if (firstTag !== tag) {\r\n const msg = `group instance [${field}] inconsistent delimiter ${tag} expected tag ${firstTag}`\r\n throw new Error(msg)\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass AsciiEncodeSetSummary {\r\n constructor (public firstSimple: ContainedSimpleField | null = null,\r\n public lastSimple: ContainedSimpleField | null = null,\r\n public count: number = 0) {\r\n }\r\n\r\n public reset (): void {\r\n this.firstSimple = null\r\n this.lastSimple = null\r\n this.count = 0\r\n }\r\n\r\n public empty (): boolean {\r\n return this.firstSimple === null || this.count === 0\r\n }\r\n}\r\n"]}
@@ -1,10 +1,10 @@
1
1
  import { Tags } from '../tag/tags';
2
- import { MessageDefinition } from '../../dictionary/definition';
2
+ import { FixDefinitions, MessageDefinition } from '../../dictionary/definition';
3
3
  import { ElasticBuffer } from '../elastic-buffer';
4
4
  import { ParseState } from './parse-state';
5
5
  export declare class AsciiParserState {
6
6
  readonly elasticBuffer: ElasticBuffer;
7
- message: MessageDefinition | null;
7
+ message: MessageDefinition | undefined;
8
8
  locations: Tags;
9
9
  parseState: ParseState;
10
10
  bodyLen: number;
@@ -16,6 +16,7 @@ export declare class AsciiParserState {
16
16
  currentTag: number;
17
17
  rawDataLen: number;
18
18
  rawDataRead: number;
19
+ definitions: FixDefinitions;
19
20
  msgType: string | null;
20
21
  constructor(elasticBuffer: ElasticBuffer);
21
22
  beginTag(pos: number): void;
@@ -111,7 +111,7 @@ let AsciiParserState = class AsciiParserState {
111
111
  throw new Error(`MsgTag: not expected at position [${nextTagPos}]`);
112
112
  }
113
113
  this.msgType = buffer.getString(equalPos + 1, valueEndPos);
114
- this.message = locations.definitions.message.get(this.msgType);
114
+ this.message = this.definitions.message.get(this.msgType);
115
115
  break;
116
116
  }
117
117
  case tags_1.Tags.CheckSumTag: {
@@ -162,7 +162,6 @@ let AsciiParserState = class AsciiParserState {
162
162
  this.rawDataRead = 0;
163
163
  this.rawDataLen = 0;
164
164
  this.bodyLen = 0;
165
- this.message = null;
166
165
  this.msgType = null;
167
166
  }
168
167
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-parser-state.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-parser-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Tags } from '../tag/tags'\r\nimport { MessageDefinition } from '../../dictionary/definition'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { ParseState } from './parse-state'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\n\r\n@injectable()\r\nexport class AsciiParserState {\r\n public message: MessageDefinition | null\r\n public locations: Tags\r\n public parseState: ParseState\r\n public bodyLen: number\r\n public checksumExpectedPos: number\r\n public tagStartPos: number\r\n public equalPos: number\r\n public valueEndPos: number\r\n public count: number\r\n public currentTag: number\r\n public rawDataLen: number\r\n public rawDataRead: number\r\n public msgType: string | null\r\n\r\n constructor (@inject(DITokens.ParseBuffer) public readonly elasticBuffer: ElasticBuffer) {\r\n }\r\n\r\n public beginTag (pos: number): void {\r\n this.parseState = ParseState.ParsingTag\r\n this.tagStartPos = pos\r\n this.equalPos = this.valueEndPos = -1\r\n this.currentTag = 0\r\n }\r\n\r\n public endTag (pos: number): void {\r\n this.equalPos = pos\r\n const state = this.parseState\r\n switch (state) {\r\n case ParseState.ParsingTag: {\r\n this.currentTag = this.elasticBuffer.getWholeNumber(this.tagStartPos, pos - 1)\r\n break\r\n }\r\n\r\n default:\r\n throw new Error(`EndTag: unexpected state ${state}`)\r\n }\r\n // if a raw tag, then need length to skip that many bytes\r\n this.checkRawTag()\r\n }\r\n\r\n public incRaw (): boolean {\r\n ++this.rawDataRead\r\n return this.rawDataRead === this.rawDataLen + 1\r\n }\r\n\r\n public checkRawTag (): void {\r\n const msg = this.message\r\n if (!msg?.containsRaw) {\r\n // optimisation as will never hit raw data\r\n this.parseState = ParseState.ParsingValue\r\n return\r\n }\r\n // if this is a raw data tag then need to keep track of the length\r\n // on this field to skip that many bytes.\r\n const isDataLength: boolean = msg.containedLength[this.currentTag]\r\n if (isDataLength) {\r\n this.parseState = ParseState.ParsingRawDataLength\r\n } else {\r\n this.rawDataRead = 0\r\n const isData: boolean = this.rawDataLen > 0\r\n if (isData) {\r\n this.parseState = ParseState.ParsingRawData\r\n } else {\r\n this.parseState = ParseState.ParsingValue\r\n }\r\n }\r\n }\r\n\r\n public store (): void {\r\n const valueEndPos: number = this.elasticBuffer.getPos() - 1\r\n this.valueEndPos = valueEndPos\r\n const equalPos: number = this.equalPos\r\n const tag: number = this.currentTag\r\n const locations: Tags = this.locations\r\n const buffer = this.elasticBuffer\r\n const terminates = this.checksumExpectedPos\r\n\r\n switch (this.parseState) {\r\n case ParseState.ParsingValue:\r\n case ParseState.ParsingRawData: {\r\n this.rawDataLen = 0\r\n locations.store(equalPos + 1, valueEndPos - equalPos - 1, tag)\r\n break\r\n }\r\n\r\n case ParseState.ParsingRawDataLength: {\r\n this.rawDataLen = buffer.getWholeNumber(equalPos + 1, valueEndPos - 1)\r\n locations.store(equalPos + 1, valueEndPos - equalPos - 1, tag)\r\n break\r\n }\r\n }\r\n\r\n this.parseState = ParseState.BeginField\r\n this.count++\r\n const nextTagPos = locations.nextTagPos\r\n\r\n switch (tag) {\r\n case Tags.BeginString: {\r\n if (nextTagPos !== 1) {\r\n throw new Error(`BeginString: not expected at position [${nextTagPos}]`)\r\n }\r\n break\r\n }\r\n\r\n case Tags.BodyLengthTag: {\r\n if (nextTagPos !== 2) {\r\n throw new Error(`BodyLengthTag: not expected at position [${nextTagPos}]`)\r\n }\r\n this.bodyLen = buffer.getWholeNumber(equalPos + 1, valueEndPos - 1)\r\n this.checksumExpectedPos = this.bodyLen + valueEndPos\r\n this.elasticBuffer.checkGrowBuffer(this.bodyLen)\r\n break\r\n }\r\n\r\n case Tags.MsgTag: {\r\n if (nextTagPos !== 3) {\r\n throw new Error(`MsgTag: not expected at position [${nextTagPos}]`)\r\n }\r\n this.msgType = buffer.getString(equalPos + 1, valueEndPos)\r\n this.message = locations.definitions.message.get(this.msgType)\r\n break\r\n }\r\n\r\n case Tags.CheckSumTag: {\r\n if (valueEndPos < this.bodyLen) {\r\n throw new Error(`CheckSumTag: [${valueEndPos}] expected after ${this.bodyLen}`)\r\n }\r\n this.parseState = ParseState.MsgComplete\r\n break\r\n }\r\n\r\n default: {\r\n if (terminates && valueEndPos > terminates) {\r\n throw new Error(`Tag: [${tag}] cant be after ${terminates}`)\r\n }\r\n break\r\n }\r\n }\r\n\r\n switch (nextTagPos) {\r\n case 1: {\r\n if (tag !== Tags.BeginString) {\r\n throw new Error(`position 1 [${tag}] must be BeginString: 8=`)\r\n }\r\n break\r\n }\r\n case 2: {\r\n if (tag !== Tags.BodyLengthTag) {\r\n throw new Error(`position 2 [${tag}] must be BodyLengthTag: 9=`)\r\n }\r\n break\r\n }\r\n case 3: {\r\n if (tag !== Tags.MsgTag) {\r\n throw new Error(`position 3 [${tag}] must be MsgTag: 35=`)\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n public beginMessage (): void {\r\n this.elasticBuffer.reset()\r\n this.locations.reset()\r\n this.checksumExpectedPos = 0\r\n this.parseState = ParseState.BeginField\r\n this.count = 0\r\n this.currentTag = 0\r\n this.tagStartPos = 0\r\n this.valueEndPos = 0\r\n this.equalPos = 0\r\n this.rawDataRead = 0\r\n this.rawDataLen = 0\r\n this.bodyLen = 0\r\n this.message = null\r\n this.msgType = null\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ascii-parser-state.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-parser-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Tags } from '../tag/tags'\r\nimport { FixDefinitions, MessageDefinition } from '../../dictionary/definition'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { ParseState } from './parse-state'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\n\r\n@injectable()\r\nexport class AsciiParserState {\r\n public message: MessageDefinition | undefined\r\n public locations: Tags\r\n public parseState: ParseState\r\n public bodyLen: number\r\n public checksumExpectedPos: number\r\n public tagStartPos: number\r\n public equalPos: number\r\n public valueEndPos: number\r\n public count: number\r\n public currentTag: number\r\n public rawDataLen: number\r\n public rawDataRead: number\r\n public definitions: FixDefinitions\r\n public msgType: string | null\r\n\r\n constructor (@inject(DITokens.ParseBuffer) public readonly elasticBuffer: ElasticBuffer) {\r\n }\r\n\r\n public beginTag (pos: number): void {\r\n this.parseState = ParseState.ParsingTag\r\n this.tagStartPos = pos\r\n this.equalPos = this.valueEndPos = -1\r\n this.currentTag = 0\r\n }\r\n\r\n public endTag (pos: number): void {\r\n this.equalPos = pos\r\n const state = this.parseState\r\n switch (state) {\r\n case ParseState.ParsingTag: {\r\n this.currentTag = this.elasticBuffer.getWholeNumber(this.tagStartPos, pos - 1)\r\n break\r\n }\r\n\r\n default:\r\n throw new Error(`EndTag: unexpected state ${state}`)\r\n }\r\n // if a raw tag, then need length to skip that many bytes\r\n this.checkRawTag()\r\n }\r\n\r\n public incRaw (): boolean {\r\n ++this.rawDataRead\r\n return this.rawDataRead === this.rawDataLen + 1\r\n }\r\n\r\n public checkRawTag (): void {\r\n const msg = this.message\r\n if (!msg?.containsRaw) {\r\n // optimisation as will never hit raw data\r\n this.parseState = ParseState.ParsingValue\r\n return\r\n }\r\n // if this is a raw data tag then need to keep track of the length\r\n // on this field to skip that many bytes.\r\n const isDataLength: boolean = msg.containedLength[this.currentTag]\r\n if (isDataLength) {\r\n this.parseState = ParseState.ParsingRawDataLength\r\n } else {\r\n this.rawDataRead = 0\r\n const isData: boolean = this.rawDataLen > 0\r\n if (isData) {\r\n this.parseState = ParseState.ParsingRawData\r\n } else {\r\n this.parseState = ParseState.ParsingValue\r\n }\r\n }\r\n }\r\n\r\n public store (): void {\r\n const valueEndPos: number = this.elasticBuffer.getPos() - 1\r\n this.valueEndPos = valueEndPos\r\n const equalPos: number = this.equalPos\r\n const tag: number = this.currentTag\r\n const locations: Tags = this.locations\r\n const buffer = this.elasticBuffer\r\n const terminates = this.checksumExpectedPos\r\n\r\n switch (this.parseState) {\r\n case ParseState.ParsingValue:\r\n case ParseState.ParsingRawData: {\r\n this.rawDataLen = 0\r\n locations.store(equalPos + 1, valueEndPos - equalPos - 1, tag)\r\n break\r\n }\r\n\r\n case ParseState.ParsingRawDataLength: {\r\n this.rawDataLen = buffer.getWholeNumber(equalPos + 1, valueEndPos - 1)\r\n locations.store(equalPos + 1, valueEndPos - equalPos - 1, tag)\r\n break\r\n }\r\n }\r\n\r\n this.parseState = ParseState.BeginField\r\n this.count++\r\n const nextTagPos = locations.nextTagPos\r\n\r\n switch (tag) {\r\n case Tags.BeginString: {\r\n if (nextTagPos !== 1) {\r\n throw new Error(`BeginString: not expected at position [${nextTagPos}]`)\r\n }\r\n break\r\n }\r\n\r\n case Tags.BodyLengthTag: {\r\n if (nextTagPos !== 2) {\r\n throw new Error(`BodyLengthTag: not expected at position [${nextTagPos}]`)\r\n }\r\n this.bodyLen = buffer.getWholeNumber(equalPos + 1, valueEndPos - 1)\r\n this.checksumExpectedPos = this.bodyLen + valueEndPos\r\n this.elasticBuffer.checkGrowBuffer(this.bodyLen)\r\n break\r\n }\r\n\r\n case Tags.MsgTag: {\r\n if (nextTagPos !== 3) {\r\n throw new Error(`MsgTag: not expected at position [${nextTagPos}]`)\r\n }\r\n this.msgType = buffer.getString(equalPos + 1, valueEndPos)\r\n this.message = this.definitions.message.get(this.msgType)\r\n break\r\n }\r\n\r\n case Tags.CheckSumTag: {\r\n if (valueEndPos < this.bodyLen) {\r\n throw new Error(`CheckSumTag: [${valueEndPos}] expected after ${this.bodyLen}`)\r\n }\r\n this.parseState = ParseState.MsgComplete\r\n break\r\n }\r\n\r\n default: {\r\n if (terminates && valueEndPos > terminates) {\r\n throw new Error(`Tag: [${tag}] cant be after ${terminates}`)\r\n }\r\n break\r\n }\r\n }\r\n\r\n switch (nextTagPos) {\r\n case 1: {\r\n if (tag !== Tags.BeginString) {\r\n throw new Error(`position 1 [${tag}] must be BeginString: 8=`)\r\n }\r\n break\r\n }\r\n case 2: {\r\n if (tag !== Tags.BodyLengthTag) {\r\n throw new Error(`position 2 [${tag}] must be BodyLengthTag: 9=`)\r\n }\r\n break\r\n }\r\n case 3: {\r\n if (tag !== Tags.MsgTag) {\r\n throw new Error(`position 3 [${tag}] must be MsgTag: 35=`)\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n public beginMessage (): void {\r\n this.elasticBuffer.reset()\r\n this.locations.reset()\r\n this.checksumExpectedPos = 0\r\n this.parseState = ParseState.BeginField\r\n this.count = 0\r\n this.currentTag = 0\r\n this.tagStartPos = 0\r\n this.valueEndPos = 0\r\n this.equalPos = 0\r\n this.rawDataRead = 0\r\n this.rawDataLen = 0\r\n this.bodyLen = 0\r\n this.msgType = null\r\n }\r\n}\r\n"]}
@@ -3,7 +3,7 @@ import { AsciiParserState } from './ascii-parser-state';
3
3
  import { MsgParser } from '../msg-parser';
4
4
  import { Readable } from 'stream';
5
5
  import { ElasticBuffer } from '../elastic-buffer';
6
- import { IJsFixConfig } from '../../config';
6
+ import { IJsFixConfig } from '../../config/js-fix-config';
7
7
  export declare class AsciiParser extends MsgParser {
8
8
  readonly config: IJsFixConfig;
9
9
  readonly readStream: Readable | null;
@@ -37,11 +37,11 @@ let AsciiParser = AsciiParser_1 = class AsciiParser extends msg_parser_1.MsgPars
37
37
  this.receivingBuffer = receivingBuffer;
38
38
  this.delimiter = (_a = config.delimiter) !== null && _a !== void 0 ? _a : ascii_chars_1.AsciiChars.Soh;
39
39
  this.writeDelimiter = (_b = config.logDelimiter) !== null && _b !== void 0 ? _b : ascii_chars_1.AsciiChars.Pipe;
40
- const definitions = config.definitions;
41
40
  this.id = AsciiParser_1.nextId++;
42
41
  this.segmentParser = config.sessionContainer.resolve(ascii_segment_parser_1.AsciiSegmentParser);
43
42
  this.state = config.sessionContainer.resolve(ascii_parser_state_1.AsciiParserState);
44
- this.state.locations = new tags_1.Tags(definitions, this.receivingBuffer.size / 10);
43
+ this.state.locations = new tags_1.Tags(this.receivingBuffer.size / 10);
44
+ this.state.definitions = this.config.definitions;
45
45
  this.state.beginMessage();
46
46
  if (readStream !== null) {
47
47
  this.subscribe();
@@ -164,6 +164,7 @@ let AsciiParser = AsciiParser_1 = class AsciiParser extends msg_parser_1.MsgPars
164
164
  const locations = state.locations;
165
165
  const source = this.receivingBuffer;
166
166
  const delimiter = this.delimiter;
167
+ const definitions = this.config.definitions;
167
168
  const replace = this.writeDelimiter;
168
169
  const msgType = (_a = state.msgType) !== null && _a !== void 0 ? _a : null;
169
170
  if (!msgType)
@@ -173,7 +174,7 @@ let AsciiParser = AsciiParser_1 = class AsciiParser extends msg_parser_1.MsgPars
173
174
  const structure = this.segmentParser.parse(msgType, locations, locations.nextTagPos - 1);
174
175
  if (!structure)
175
176
  return null;
176
- return new ascii_view_1.AsciiView(structure.msg(), source, structure, ptr, delimiter, replace);
177
+ return new ascii_view_1.AsciiView(definitions, structure.msg(), source, structure, ptr, delimiter, replace);
177
178
  }
178
179
  catch (error) {
179
180
  if (error instanceof ascii_segment_parser_error_1.AsciiParserError) {
@@ -186,7 +187,7 @@ let AsciiParser = AsciiParser_1 = class AsciiParser extends msg_parser_1.MsgPars
186
187
  const structure = new structure_1.Structure(locations, []);
187
188
  const segment = new segment_description_1.SegmentDescription('unknown', locations.tagPos[0].tag, null, 0, 1, segment_type_1.SegmentType.Unknown);
188
189
  segment.endPosition = locations.nextTagPos - 1;
189
- return new ascii_view_1.AsciiView(segment, source, structure, ptr, delimiter, replace);
190
+ return new ascii_view_1.AsciiView(this.config.definitions, segment, source, structure, ptr, delimiter, replace);
190
191
  }
191
192
  };
192
193
  exports.AsciiParser = AsciiParser;
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-parser.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsciiChars } from './ascii-chars'\r\nimport { AsciiView } from './ascii-view'\r\nimport { AsciiSegmentParser } from './ascii-segment-parser'\r\nimport { AsciiParserState } from './ascii-parser-state'\r\nimport { Structure } from '../structure'\r\nimport { Tags } from '../tag/tags'\r\nimport { MsgParser } from '../msg-parser'\r\nimport { MsgView } from '../msg-view'\r\nimport { Readable } from 'stream'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { SegmentDescription } from '../segment/segment-description'\r\nimport { ParseState } from './parse-state'\r\nimport { IJsFixConfig } from '../../config'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { SegmentType } from '../segment/segment-type'\r\nimport { AsciiParserError } from './ascii-segment-parser-error'\r\n\r\n@injectable()\r\nexport class AsciiParser extends MsgParser {\r\n private static nextId: number = 0\r\n public readonly id: number\r\n public readonly state: AsciiParserState\r\n private readonly segmentParser: AsciiSegmentParser\r\n public readonly delimiter: number\r\n public readonly writeDelimiter: number\r\n\r\n // allocate enough in receive buffer so buffer does not constant resize back after large messages\r\n // want to keep one slice of memory and constantly reuse it\r\n\r\n constructor (@inject(DITokens.IJsFixConfig) public readonly config: IJsFixConfig,\r\n @inject(DITokens.readStream) public readonly readStream: Readable | null,\r\n @inject(DITokens.ParseBuffer) protected readonly receivingBuffer: ElasticBuffer) {\r\n super()\r\n\r\n this.delimiter = config.delimiter ?? AsciiChars.Soh\r\n this.writeDelimiter = config.logDelimiter ?? AsciiChars.Pipe\r\n const definitions = config.definitions\r\n this.id = AsciiParser.nextId++\r\n this.segmentParser = config.sessionContainer.resolve<AsciiSegmentParser>(AsciiSegmentParser)\r\n this.state = config.sessionContainer.resolve<AsciiParserState>(AsciiParserState)\r\n this.state.locations = new Tags(definitions, this.receivingBuffer.size / 10)\r\n this.state.beginMessage()\r\n if (readStream !== null) {\r\n this.subscribe()\r\n }\r\n }\r\n\r\n private subscribe (): void {\r\n const inst: AsciiParser = this\r\n const Writable = require('stream').Writable\r\n const stream = this.readStream\r\n\r\n const receiver = new Writable({\r\n write: (data: Buffer, _: any, done: Function) => {\r\n try {\r\n inst.parse(data, data.length)\r\n done()\r\n } catch (e) {\r\n done(e)\r\n }\r\n }\r\n })\r\n receiver.on('error', (e: Error) => {\r\n this.emit('error', e)\r\n })\r\n\r\n // receive from say a socket or file and pipe to parser which discovers messages\r\n stream?.pipe(receiver).on('finish', () => {\r\n this.emit('done')\r\n })\r\n stream?.on('error', (e) => {\r\n this.emit('error', e)\r\n })\r\n stream?.on('end', () => {\r\n this.emit('end')\r\n })\r\n }\r\n\r\n private msg (ptr: number): void {\r\n const receivingBuffer: ElasticBuffer = this.receivingBuffer\r\n const state = this.state\r\n if (this.listeners('decoded')) {\r\n this.emit('decoded', state.msgType, receivingBuffer, ptr)\r\n }\r\n this.emit('msg', state.msgType, this.getView(ptr))\r\n state.beginMessage()\r\n }\r\n\r\n /**\r\n * useful helper for testing where characters are parsed as if from the transport\r\n * @param text to be parsed\r\n */\r\n public parseText (text: string): void {\r\n const buff = Buffer.from(text)\r\n this.parse(buff, buff.length)\r\n }\r\n\r\n private parse (readBuffer: Buffer, end: number): void {\r\n const state = this.state\r\n const eq: number = AsciiChars.Eq\r\n const zero: number = AsciiChars.Zero\r\n const nine: number = AsciiChars.Nine\r\n const delimiter: number = this.delimiter\r\n const writeDelimiter: number = this.writeDelimiter\r\n const receivingBuffer: ElasticBuffer = this.receivingBuffer\r\n const switchDelimiter = writeDelimiter !== delimiter\r\n let readPtr: number = 0\r\n\r\n while (readPtr < end) {\r\n const charAtPos: number = readBuffer[readPtr]\r\n\r\n const writePtr = receivingBuffer.saveChar(charAtPos) - 1\r\n switch (state.parseState) {\r\n case ParseState.MsgComplete: {\r\n this.msg(writePtr)\r\n continue\r\n }\r\n\r\n case ParseState.BeginField: {\r\n const atDigit: boolean = charAtPos >= zero && charAtPos <= nine\r\n if (atDigit) {\r\n state.beginTag(writePtr)\r\n }\r\n break\r\n }\r\n\r\n case ParseState.ParsingTag: {\r\n const isEquals: boolean = charAtPos === eq\r\n if (isEquals) {\r\n state.endTag(writePtr)\r\n }\r\n break\r\n }\r\n\r\n case ParseState.ParsingRawData: {\r\n // keep skipping until length read, regardless of delimiter or not\r\n if (state.incRaw()) {\r\n // having consumed the raw field expecting delimiter\r\n if (charAtPos === delimiter) {\r\n if (switchDelimiter) {\r\n receivingBuffer.switchChar(writeDelimiter)\r\n }\r\n state.store()\r\n } else {\r\n throw new Error(`delimiter (${delimiter}) expected at position ${readPtr} when value is ${charAtPos}`)\r\n }\r\n }\r\n break\r\n }\r\n\r\n case ParseState.ParsingRawDataLength:\r\n case ParseState.ParsingValue: {\r\n if (charAtPos === delimiter) {\r\n if (switchDelimiter) {\r\n receivingBuffer.switchChar(writeDelimiter)\r\n }\r\n state.store()\r\n }\r\n break\r\n }\r\n\r\n default: {\r\n const st = state.parseState\r\n throw new Error(`fix parser in unknown state ${st}`)\r\n }\r\n }\r\n readPtr++\r\n }\r\n\r\n switch (state.parseState) {\r\n case ParseState.MsgComplete: {\r\n this.msg(receivingBuffer.getPos())\r\n break\r\n }\r\n }\r\n }\r\n\r\n private getView (ptr: number): MsgView | null {\r\n const state = this.state\r\n const locations = state.locations\r\n const source = this.receivingBuffer\r\n const delimiter = this.delimiter\r\n const replace = this.writeDelimiter\r\n const msgType = state.msgType ?? null\r\n if (!msgType) return null\r\n if (state.message) {\r\n try {\r\n const structure: Structure | null = this.segmentParser.parse(msgType, locations,\r\n locations.nextTagPos - 1)\r\n if (!structure) return null\r\n return new AsciiView(structure.msg(),\r\n source,\r\n structure,\r\n ptr,\r\n delimiter,\r\n replace)\r\n } catch (error) {\r\n if (error instanceof AsciiParserError) {\r\n error.summary.buffer = source.toString()\r\n this.emit('error', error)\r\n }\r\n throw error\r\n }\r\n }\r\n\r\n const structure = new Structure(locations, [])\r\n const segment = new SegmentDescription('unknown', locations.tagPos[0].tag, null, 0, 1, SegmentType.Unknown)\r\n segment.endPosition = locations.nextTagPos - 1\r\n return new AsciiView(segment, source, structure, ptr, delimiter, replace)\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ascii-parser.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsciiChars } from './ascii-chars'\r\nimport { AsciiView } from './ascii-view'\r\nimport { AsciiSegmentParser } from './ascii-segment-parser'\r\nimport { AsciiParserState } from './ascii-parser-state'\r\nimport { Structure } from '../structure'\r\nimport { Tags } from '../tag/tags'\r\nimport { MsgParser } from '../msg-parser'\r\nimport { MsgView } from '../msg-view'\r\nimport { Readable } from 'stream'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { SegmentDescription } from '../segment/segment-description'\r\nimport { ParseState } from './parse-state'\r\nimport { IJsFixConfig } from '../../config/js-fix-config'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { SegmentType } from '../segment/segment-type'\r\nimport { AsciiParserError } from './ascii-segment-parser-error'\r\n\r\n@injectable()\r\nexport class AsciiParser extends MsgParser {\r\n private static nextId: number = 0\r\n public readonly id: number\r\n public readonly state: AsciiParserState\r\n private readonly segmentParser: AsciiSegmentParser\r\n public readonly delimiter: number\r\n public readonly writeDelimiter: number\r\n\r\n // allocate enough in receive buffer so buffer does not constant resize back after large messages\r\n // want to keep one slice of memory and constantly reuse it\r\n\r\n constructor (@inject(DITokens.IJsFixConfig) public readonly config: IJsFixConfig,\r\n @inject(DITokens.readStream) public readonly readStream: Readable | null,\r\n @inject(DITokens.ParseBuffer) protected readonly receivingBuffer: ElasticBuffer) {\r\n super()\r\n\r\n this.delimiter = config.delimiter ?? AsciiChars.Soh\r\n this.writeDelimiter = config.logDelimiter ?? AsciiChars.Pipe\r\n this.id = AsciiParser.nextId++\r\n this.segmentParser = config.sessionContainer.resolve<AsciiSegmentParser>(AsciiSegmentParser)\r\n this.state = config.sessionContainer.resolve<AsciiParserState>(AsciiParserState)\r\n this.state.locations = new Tags(this.receivingBuffer.size / 10)\r\n this.state.definitions = this.config.definitions\r\n this.state.beginMessage()\r\n if (readStream !== null) {\r\n this.subscribe()\r\n }\r\n }\r\n\r\n private subscribe (): void {\r\n const inst: AsciiParser = this\r\n const Writable = require('stream').Writable\r\n const stream = this.readStream\r\n\r\n const receiver = new Writable({\r\n write: (data: Buffer, _: any, done: Function) => {\r\n try {\r\n inst.parse(data, data.length)\r\n done()\r\n } catch (e) {\r\n done(e)\r\n }\r\n }\r\n })\r\n receiver.on('error', (e: Error) => {\r\n this.emit('error', e)\r\n })\r\n\r\n // receive from say a socket or file and pipe to parser which discovers messages\r\n stream?.pipe(receiver).on('finish', () => {\r\n this.emit('done')\r\n })\r\n stream?.on('error', (e) => {\r\n this.emit('error', e)\r\n })\r\n stream?.on('end', () => {\r\n this.emit('end')\r\n })\r\n }\r\n\r\n private msg (ptr: number): void {\r\n const receivingBuffer: ElasticBuffer = this.receivingBuffer\r\n const state = this.state\r\n if (this.listeners('decoded')) {\r\n this.emit('decoded', state.msgType, receivingBuffer, ptr)\r\n }\r\n this.emit('msg', state.msgType, this.getView(ptr))\r\n state.beginMessage()\r\n }\r\n\r\n /**\r\n * useful helper for testing where characters are parsed as if from the transport\r\n * @param text to be parsed\r\n */\r\n public parseText (text: string): void {\r\n const buff = Buffer.from(text)\r\n this.parse(buff, buff.length)\r\n }\r\n\r\n private parse (readBuffer: Buffer, end: number): void {\r\n const state = this.state\r\n const eq: number = AsciiChars.Eq\r\n const zero: number = AsciiChars.Zero\r\n const nine: number = AsciiChars.Nine\r\n const delimiter: number = this.delimiter\r\n const writeDelimiter: number = this.writeDelimiter\r\n const receivingBuffer: ElasticBuffer = this.receivingBuffer\r\n const switchDelimiter = writeDelimiter !== delimiter\r\n let readPtr: number = 0\r\n\r\n while (readPtr < end) {\r\n const charAtPos: number = readBuffer[readPtr]\r\n\r\n const writePtr = receivingBuffer.saveChar(charAtPos) - 1\r\n switch (state.parseState) {\r\n case ParseState.MsgComplete: {\r\n this.msg(writePtr)\r\n continue\r\n }\r\n\r\n case ParseState.BeginField: {\r\n const atDigit: boolean = charAtPos >= zero && charAtPos <= nine\r\n if (atDigit) {\r\n state.beginTag(writePtr)\r\n }\r\n break\r\n }\r\n\r\n case ParseState.ParsingTag: {\r\n const isEquals: boolean = charAtPos === eq\r\n if (isEquals) {\r\n state.endTag(writePtr)\r\n }\r\n break\r\n }\r\n\r\n case ParseState.ParsingRawData: {\r\n // keep skipping until length read, regardless of delimiter or not\r\n if (state.incRaw()) {\r\n // having consumed the raw field expecting delimiter\r\n if (charAtPos === delimiter) {\r\n if (switchDelimiter) {\r\n receivingBuffer.switchChar(writeDelimiter)\r\n }\r\n state.store()\r\n } else {\r\n throw new Error(`delimiter (${delimiter}) expected at position ${readPtr} when value is ${charAtPos}`)\r\n }\r\n }\r\n break\r\n }\r\n\r\n case ParseState.ParsingRawDataLength:\r\n case ParseState.ParsingValue: {\r\n if (charAtPos === delimiter) {\r\n if (switchDelimiter) {\r\n receivingBuffer.switchChar(writeDelimiter)\r\n }\r\n state.store()\r\n }\r\n break\r\n }\r\n\r\n default: {\r\n const st = state.parseState\r\n throw new Error(`fix parser in unknown state ${st}`)\r\n }\r\n }\r\n readPtr++\r\n }\r\n\r\n switch (state.parseState) {\r\n case ParseState.MsgComplete: {\r\n this.msg(receivingBuffer.getPos())\r\n break\r\n }\r\n }\r\n }\r\n\r\n private getView (ptr: number): MsgView | null {\r\n const state = this.state\r\n const locations = state.locations\r\n const source = this.receivingBuffer\r\n const delimiter = this.delimiter\r\n const definitions = this.config.definitions\r\n const replace = this.writeDelimiter\r\n const msgType = state.msgType ?? null\r\n if (!msgType) return null\r\n if (state.message) {\r\n try {\r\n const structure: Structure | null = this.segmentParser.parse(msgType, locations,\r\n locations.nextTagPos - 1)\r\n if (!structure) return null\r\n return new AsciiView(definitions, structure.msg(),\r\n source,\r\n structure,\r\n ptr,\r\n delimiter,\r\n replace)\r\n } catch (error) {\r\n if (error instanceof AsciiParserError) {\r\n error.summary.buffer = source.toString()\r\n this.emit('error', error)\r\n }\r\n throw error\r\n }\r\n }\r\n\r\n const structure = new Structure(locations, [])\r\n const segment = new SegmentDescription('unknown', locations.tagPos[0].tag, null, 0, 1, SegmentType.Unknown)\r\n segment.endPosition = locations.nextTagPos - 1\r\n return new AsciiView(this.config.definitions, segment, source, structure, ptr, delimiter, replace)\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-segment-parser.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-segment-parser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wEAAmE;AACnE,4CAAwC;AAExC,4DAGoC;AACpC,0DAKmC;AACnC,uCAA6C;AAC7C,uDAAkD;AAClD,0DAAqD;AACrD,6EAA+D;AAOxD,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,YAA2D,WAA2B;QAA3B,gBAAW,GAAX,WAAW,CAAgB;IACtF,CAAC;IAEM,KAAK,CAAE,OAAe,EAAE,IAAU,EAAE,IAAY;QAErD,MAAM,QAAQ,GAAyB,EAAE,CAAA;QACzC,MAAM,aAAa,GAA6B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACrF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QAID,MAAM,cAAc,GAAyB,EAAE,CAAA;QAC/C,IAAI,kBAAkB,GAAW,CAAC,CAAA;QAClC,IAAI,IAAwB,CAAA;QAG5B,SAAS,MAAM,CAAE,GAAW;;YAC1B,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,CAAA;gBACjC,IAAI,CAAC,IAAI;oBAAE,SAAQ;gBACnB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC1F,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACnB,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAChD,IAAI,MAAA,IAAI,CAAC,GAAG,0CAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBAEhC,MAAK;gBACP,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,KAAK,0BAAW,CAAC,GAAG,EAAE,CAAC;oBAElC,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS,SAAS;YAChB,OAAkC;gBAChC,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;gBACzB,IAAI;gBACJ,aAAa,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAQ,EAAE;gBACxC,kBAAkB;gBAClB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACrB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACzC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;aACtD,CAAA;QACH,CAAC;QAED,SAAS,OAAO,CAAE,GAAW;YAC3B,IAAI,SAAS,GAA8B,IAAI,CAAA;YAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;YACtC,IAAI,CAAC,YAAY;gBAAE,OAAO,IAAI,CAAA;YAC9B,QAAQ,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,8BAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC/B,MAAM,EAAE,GAAyB,YAAoC,CAAA;oBACrE,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;wBAC9B,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAA;oBAC7C,CAAC;oBACD,MAAK;gBACP,CAAC;gBAED,KAAK,8BAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;oBAClC,MAAM,EAAE,GAA4B,YAAuC,CAAA;oBAC3E,SAAS,GAAG,IAAI,wCAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,EAC5D,kBAAkB,EAAE,cAAc,CAAC,MAAM,EAAE,0BAAW,CAAC,SAAS,CAAC,CAAA;oBACnE,MAAK;gBACP,CAAC;gBAED,KAAK,8BAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9B,MAAM,EAAE,GAA4B,YAAmC,CAAA;oBACvE,SAAS,GAAG,IAAI,wCAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,EAC5D,kBAAkB,EAAE,cAAc,CAAC,MAAM,EAAE,0BAAW,CAAC,KAAK,CAAC,CAAA;oBAC/D,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAA;oBAC3C,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAA;oBACzD,MAAK;gBACP,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,CAAC,GAAG,SAAS,EAAE,CAAA;oBACrB,MAAM,IAAI,6CAAgB,CAAC,kCAAkC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;gBACxE,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,SAAS,cAAc,CAAE,GAAW;YAClC,IAAI,SAAS,GAAY,KAAK,CAAA;YAC9B,IAAI,GAAG,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAA;YAC/C,CAAC;iBAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAGrC,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;YAClG,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,SAAS,GAAG,CAAE,GAAW;YACvB,MAAM,GAAG,GAAG,IAAI,wCAAkB,CAAC,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAC5D,kBAAkB,EAAE,cAAc,CAAC,MAAM,EAAE,0BAAW,CAAC,GAAG,CAAC,CAAA;YAC7D,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAA;YACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAClB,kBAAkB,EAAE,CAAA;QACtB,CAAC;QAED,SAAS,QAAQ;;YACf,OAAO,kBAAkB,IAAI,IAAI,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAA;gBACvD,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAChD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;gBACzB,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,GAAG,0CAAE,YAAY,CAAC,GAAG,CAAC,CAAA,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;oBAExD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,0BAAW,CAAC,GAAG,CAAA;oBAC7C,IAAI,OAAO,EAAE,CAAC;wBACZ,GAAG,CAAC,GAAG,CAAC,CAAA;oBACV,CAAC;yBAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAErC,MAAM,CAAC,GAAG,CAAC,CAAA;oBACb,CAAC;oBACD,SAAQ;gBACV,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACpC,MAAM,IAAI,6CAAgB,CAAC,6CAA6C,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC7F,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;gBAC9B,IAAI,SAAS,EAAE,CAAC;oBACd,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS,KAAK;YAEZ,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,CAAA;gBACjC,IAAI,CAAC,IAAI;oBAAE,SAAQ;gBACnB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC1F,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;YAClC,CAAC;YAED,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;YAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;YACxB,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;YAC3B,QAAQ,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;QACpB,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,wCAAkB,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,EAC/F,kBAAkB,EAAE,cAAc,CAAC,MAAM,EAAE,0BAAW,CAAC,GAAG,CAAC,CAAA;QAC7D,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACjC,QAAQ,EAAE,CAAA;QACV,KAAK,EAAE,CAAA;QAGP,OAAO,IAAI,qBAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;CACF,CAAA;AA9JY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,qBAAU,GAAE;IAEG,WAAA,IAAA,iBAAM,EAAC,oBAAQ,CAAC,WAAW,CAAC,CAAA;qCAA8B,2BAAc;GAD3E,kBAAkB,CA8J9B","sourcesContent":["import { SegmentDescription } from '../segment/segment-description'\r\nimport { Structure } from '../structure'\r\nimport { Tags } from '../tag/tags'\r\nimport {\r\n FixDefinitions,\r\n MessageDefinition\r\n} from '../../dictionary/definition'\r\nimport {\r\n ContainedComponentField,\r\n ContainedGroupField,\r\n ContainedSimpleField,\r\n ContainedFieldType\r\n} from '../../dictionary/contained'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { SegmentType } from '../segment/segment-type'\r\nimport { AsciiParserError } from './ascii-segment-parser-error'\r\nimport { AsciiSegmentParserSummary } from './ascii-segment-parser-summary'\r\n\r\n// this takes linear time i.e. it constantly makes forward progress\r\n// one tag at a time\r\n\r\n@injectable()\r\nexport class AsciiSegmentParser {\r\n constructor (@inject(DITokens.Definitions) public readonly definitions: FixDefinitions) {\r\n }\r\n\r\n public parse (msgType: string, tags: Tags, last: number): Structure | null {\r\n // completed segments in that they are fully parsed\r\n const segments: SegmentDescription[] = []\r\n const msgDefinition: MessageDefinition | null = this.definitions.message.get(msgType)\r\n if (!msgDefinition) {\r\n return null\r\n }\r\n // in process of being discovered and may have any amount of depth\r\n // i.e. a component containing a repeated group of components\r\n // with sub-groups of components\r\n const structureStack: SegmentDescription[] = []\r\n let currentTagPosition: number = 0\r\n let peek: SegmentDescription\r\n\r\n // having finished one segments keep unwinding until tag matches further up stack\r\n function unwind (tag: number): void {\r\n while (structureStack.length > 1) {\r\n const done = structureStack.pop()\r\n if (!done) continue\r\n done.end(segments.length, currentTagPosition - 1, tags.tagPos[currentTagPosition - 1].tag)\r\n segments.push(done)\r\n peek = structureStack[structureStack.length - 1]\r\n if (peek.set?.containedTag[tag]) {\r\n // unwound to point this tag lives in this set.\r\n break\r\n }\r\n if (peek.type === SegmentType.Msg) {\r\n // this is unknown tag and it is not part of trailer so raise unknown\r\n break\r\n }\r\n }\r\n }\r\n\r\n function summarise (): any {\r\n return <AsciiSegmentParserSummary>{\r\n msgType,\r\n tags: tags.clone().tagPos,\r\n last,\r\n msgDefinition: msgDefinition?.toString(),\r\n currentTagPosition,\r\n peek: peek.toString(),\r\n segments: segments.map(s => s.toString()),\r\n structureStack: structureStack.map(s => s.toString())\r\n }\r\n }\r\n\r\n function examine (tag: number): SegmentDescription | null {\r\n let structure: SegmentDescription | null = null\r\n const currentField = peek.currentField\r\n if (!currentField) return null\r\n switch (currentField.type) {\r\n case ContainedFieldType.Simple: {\r\n const sf: ContainedSimpleField = currentField as ContainedSimpleField\r\n if (sf.definition.tag === tag) {\r\n currentTagPosition = currentTagPosition + 1\r\n }\r\n break\r\n }\r\n // moving deeper into structure, start a new context\r\n case ContainedFieldType.Component: {\r\n const cf: ContainedComponentField = currentField as ContainedComponentField\r\n structure = new SegmentDescription(cf.name, tag, cf.definition,\r\n currentTagPosition, structureStack.length, SegmentType.Component)\r\n break\r\n }\r\n // for a group also need to know where all delimiters are positioned\r\n case ContainedFieldType.Group: {\r\n const gf: ContainedComponentField = currentField as ContainedGroupField\r\n structure = new SegmentDescription(gf.name, tag, gf.definition,\r\n currentTagPosition, structureStack.length, SegmentType.Group)\r\n currentTagPosition = currentTagPosition + 1\r\n structure.startGroup(tags.tagPos[currentTagPosition].tag)\r\n break\r\n }\r\n\r\n default: {\r\n const c = summarise()\r\n throw new AsciiParserError(`examine unknown type for tag = ${tag}`, c)\r\n }\r\n }\r\n return structure\r\n }\r\n\r\n function groupDelimiter (tag: number): boolean {\r\n let delimiter: boolean = false\r\n if (tag === peek.delimiterTag) {\r\n peek.addDelimiterPosition(currentTagPosition)\r\n } else if (structureStack.length > 1) {\r\n // if a group is represented by a repeated component, then the tag representing delimiter\r\n // needs to be added further up stack to group itself.\r\n delimiter = structureStack[structureStack.length - 2].groupAddDelimiter(tag, currentTagPosition)\r\n }\r\n return delimiter\r\n }\r\n\r\n function gap (tag: number): void {\r\n const gap = new SegmentDescription('.undefined', tag, peek.set,\r\n currentTagPosition, structureStack.length, SegmentType.Gap)\r\n gap.end(segments.length, currentTagPosition, tag)\r\n segments.push(gap)\r\n currentTagPosition++\r\n }\r\n\r\n function discover (): void {\r\n while (currentTagPosition <= last) {\r\n const tag: number = tags.tagPos[currentTagPosition].tag\r\n peek = structureStack[structureStack.length - 1]\r\n peek.setCurrentField(tag)\r\n if (!peek.set?.containedTag[tag] || groupDelimiter(tag)) {\r\n // unravelled all way back to root hence this is not recognised\r\n const unknown = peek.type === SegmentType.Msg\r\n if (unknown) {\r\n gap(tag)\r\n } else if (structureStack.length > 1) {\r\n // move back up the segments and save the finished group / component\r\n unwind(tag)\r\n }\r\n continue\r\n }\r\n if (!peek.currentField || !peek.set) {\r\n throw new AsciiParserError(`discover no currentField or set for tag = ${tag}`, summarise())\r\n }\r\n const structure = examine(tag)\r\n if (structure) {\r\n structureStack.push(structure)\r\n }\r\n }\r\n }\r\n\r\n function clean (): void {\r\n // any remainder components can be closed.\r\n while (structureStack.length > 0) {\r\n const done = structureStack.pop()\r\n if (!done) continue\r\n done.end(segments.length, currentTagPosition - 1, tags.tagPos[currentTagPosition - 1].tag)\r\n segments[segments.length] = done\r\n }\r\n // logically reverse the trailer and message so trailer is last in list.\r\n const m1 = segments.length - 1\r\n const m2 = segments.length - 2\r\n const tmp = segments[m1]\r\n segments[m1] = segments[m2]\r\n segments[m2] = tmp\r\n }\r\n\r\n const msgStructure = new SegmentDescription(msgDefinition.name, tags.tagPos[0].tag, msgDefinition,\r\n currentTagPosition, structureStack.length, SegmentType.Msg)\r\n structureStack.push(msgStructure)\r\n discover()\r\n clean()\r\n\r\n // now know where all components and groups are positioned within message\r\n return new Structure(tags, segments)\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ascii-segment-parser.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-segment-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { SegmentDescription } from '../segment/segment-description'\r\nimport { Structure } from '../structure'\r\nimport { Tags } from '../tag/tags'\r\nimport {\r\n FixDefinitions,\r\n MessageDefinition\r\n} from '../../dictionary/definition'\r\nimport {\r\n ContainedComponentField,\r\n ContainedGroupField,\r\n ContainedSimpleField,\r\n ContainedFieldType\r\n} from '../../dictionary/contained'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { DITokens } from '../../runtime/di-tokens'\r\nimport { SegmentType } from '../segment/segment-type'\r\nimport { AsciiParserError } from './ascii-segment-parser-error'\r\nimport { AsciiSegmentParserSummary } from './ascii-segment-parser-summary'\r\n\r\n// this takes linear time i.e. it constantly makes forward progress\r\n// one tag at a time\r\n\r\n@injectable()\r\nexport class AsciiSegmentParser {\r\n constructor (@inject(DITokens.Definitions) public readonly definitions: FixDefinitions) {\r\n }\r\n\r\n public parse (msgType: string, tags: Tags, last: number): Structure | null {\r\n // completed segments in that they are fully parsed\r\n const segments: SegmentDescription[] = []\r\n const msgDefinition: MessageDefinition | undefined = this.definitions.message.get(msgType)\r\n if (!msgDefinition) {\r\n return null\r\n }\r\n // in process of being discovered and may have any amount of depth\r\n // i.e. a component containing a repeated group of components\r\n // with sub-groups of components\r\n const structureStack: SegmentDescription[] = []\r\n let currentTagPosition: number = 0\r\n let peek: SegmentDescription\r\n\r\n // having finished one segments keep unwinding until tag matches further up stack\r\n function unwind (tag: number): void {\r\n while (structureStack.length > 1) {\r\n const done = structureStack.pop()\r\n if (!done) continue\r\n done.end(segments.length, currentTagPosition - 1, tags.tagPos[currentTagPosition - 1].tag)\r\n segments.push(done)\r\n peek = structureStack[structureStack.length - 1]\r\n if (peek.set?.containedTag[tag]) {\r\n // unwound to point this tag lives in this set.\r\n break\r\n }\r\n if (peek.type === SegmentType.Msg) {\r\n // this is unknown tag and it is not part of trailer so raise unknown\r\n break\r\n }\r\n }\r\n }\r\n\r\n function summarise (): AsciiSegmentParserSummary {\r\n return <AsciiSegmentParserSummary>{\r\n msgType,\r\n tags: tags.clone().tagPos,\r\n last,\r\n msgDefinition: msgDefinition?.toString(),\r\n currentTagPosition,\r\n peek: peek.toString(),\r\n segments: segments.map(s => s.toString()),\r\n structureStack: structureStack.map(s => s.toString())\r\n }\r\n }\r\n\r\n function examine (tag: number): SegmentDescription | null {\r\n let structure: SegmentDescription | null = null\r\n const currentField = peek.currentField\r\n if (!currentField) return null\r\n switch (currentField.type) {\r\n case ContainedFieldType.Simple: {\r\n const sf: ContainedSimpleField = currentField as ContainedSimpleField\r\n if (sf.definition.tag === tag) {\r\n currentTagPosition = currentTagPosition + 1\r\n }\r\n break\r\n }\r\n // moving deeper into structure, start a new context\r\n case ContainedFieldType.Component: {\r\n const cf: ContainedComponentField = currentField as ContainedComponentField\r\n structure = new SegmentDescription(cf.name, tag, cf.definition,\r\n currentTagPosition, structureStack.length, SegmentType.Component)\r\n break\r\n }\r\n // for a group also need to know where all delimiters are positioned\r\n case ContainedFieldType.Group: {\r\n const gf: ContainedComponentField = currentField as ContainedGroupField\r\n structure = new SegmentDescription(gf.name, tag, gf.definition,\r\n currentTagPosition, structureStack.length, SegmentType.Group)\r\n currentTagPosition = currentTagPosition + 1\r\n structure.startGroup(tags.tagPos[currentTagPosition].tag)\r\n break\r\n }\r\n\r\n default: {\r\n const c = summarise()\r\n throw new AsciiParserError(`examine unknown type for tag = ${tag}`, c)\r\n }\r\n }\r\n return structure\r\n }\r\n\r\n function groupDelimiter (tag: number): boolean {\r\n let delimiter: boolean = false\r\n if (tag === peek.delimiterTag) {\r\n peek.addDelimiterPosition(currentTagPosition)\r\n } else if (structureStack.length > 1) {\r\n // if a group is represented by a repeated component, then the tag representing delimiter\r\n // needs to be added further up stack to group itself.\r\n delimiter = structureStack[structureStack.length - 2].groupAddDelimiter(tag, currentTagPosition)\r\n }\r\n return delimiter\r\n }\r\n\r\n function gap (tag: number): void {\r\n const gap = new SegmentDescription('.undefined', tag, peek.set,\r\n currentTagPosition, structureStack.length, SegmentType.Gap)\r\n gap.end(segments.length, currentTagPosition, tag)\r\n segments.push(gap)\r\n currentTagPosition++\r\n }\r\n\r\n function discover (): void {\r\n while (currentTagPosition <= last) {\r\n const tag: number = tags.tagPos[currentTagPosition].tag\r\n peek = structureStack[structureStack.length - 1]\r\n peek.setCurrentField(tag)\r\n if (!peek.set?.containedTag[tag] || groupDelimiter(tag)) {\r\n // unravelled all way back to root hence this is not recognised\r\n const unknown = peek.type === SegmentType.Msg\r\n if (unknown) {\r\n gap(tag)\r\n } else if (structureStack.length > 1) {\r\n // move back up the segments and save the finished group / component\r\n unwind(tag)\r\n }\r\n continue\r\n }\r\n if (!peek.currentField || !peek.set) {\r\n throw new AsciiParserError(`discover no currentField or set for tag = ${tag}`, summarise())\r\n }\r\n const structure = examine(tag)\r\n if (structure) {\r\n structureStack.push(structure)\r\n }\r\n }\r\n }\r\n\r\n function clean (): void {\r\n // any remainder components can be closed.\r\n while (structureStack.length > 0) {\r\n const done = structureStack.pop()\r\n if (!done) continue\r\n done.end(segments.length, currentTagPosition - 1, tags.tagPos[currentTagPosition - 1].tag)\r\n segments[segments.length] = done\r\n }\r\n // logically reverse the trailer and message so trailer is last in list.\r\n const m1 = segments.length - 1\r\n const m2 = segments.length - 2\r\n const tmp = segments[m1]\r\n segments[m1] = segments[m2]\r\n segments[m2] = tmp\r\n }\r\n\r\n const msgStructure = new SegmentDescription(msgDefinition.name, tags.tagPos[0].tag, msgDefinition,\r\n currentTagPosition, structureStack.length, SegmentType.Msg)\r\n structureStack.push(msgStructure)\r\n discover()\r\n clean()\r\n\r\n // now know where all components and groups are positioned within message\r\n return new Structure(tags, segments)\r\n }\r\n}\r\n"]}
@@ -1,10 +1,11 @@
1
1
  /// <reference types="node" />
2
- import { SimpleFieldDefinition } from '../../dictionary/definition';
2
+ import { FixDefinitions, SimpleFieldDefinition } from '../../dictionary/definition';
3
3
  import { SegmentDescription } from '../segment/segment-description';
4
4
  import { Structure } from '../structure';
5
5
  import { MsgView } from '../msg-view';
6
6
  import { ElasticBuffer } from '../elastic-buffer';
7
7
  export declare class AsciiView extends MsgView {
8
+ readonly definitions: FixDefinitions;
8
9
  readonly segment: SegmentDescription;
9
10
  readonly buffer: ElasticBuffer;
10
11
  readonly structure: Structure | null;
@@ -12,12 +13,12 @@ export declare class AsciiView extends MsgView {
12
13
  readonly delimiter: number;
13
14
  readonly writeDelimiter: number;
14
15
  private readonly timeFormatter;
15
- constructor(segment: SegmentDescription, buffer: ElasticBuffer, structure: Structure | null, ptr: number, delimiter: number, writeDelimiter: number);
16
+ constructor(definitions: FixDefinitions, segment: SegmentDescription, buffer: ElasticBuffer, structure: Structure | null, ptr: number, delimiter: number, writeDelimiter: number);
16
17
  clone(): MsgView;
17
18
  private replaceDelimiter;
18
19
  toBuffer(replaceDelimiter?: number): Buffer;
19
20
  checksum(): number;
20
- protected toTyped(field: SimpleFieldDefinition): any;
21
+ protected toTyped(field: SimpleFieldDefinition): (boolean | string | number | Date | Buffer | null);
21
22
  protected create(singleton: SegmentDescription): MsgView;
22
23
  protected stringAtPosition(position: number): string | null;
23
24
  private getBuffer;
@@ -7,8 +7,9 @@ const time_formatter_1 = require("./time-formatter");
7
7
  const types_1 = require("../../types");
8
8
  const tag_type_1 = require("../tag/tag-type");
9
9
  class AsciiView extends msg_view_1.MsgView {
10
- constructor(segment, buffer, structure, ptr, delimiter, writeDelimiter) {
11
- super(segment, structure);
10
+ constructor(definitions, segment, buffer, structure, ptr, delimiter, writeDelimiter) {
11
+ super(definitions, segment, structure);
12
+ this.definitions = definitions;
12
13
  this.segment = segment;
13
14
  this.buffer = buffer;
14
15
  this.structure = structure;
@@ -22,11 +23,12 @@ class AsciiView extends msg_view_1.MsgView {
22
23
  const buffer = this.buffer.clone();
23
24
  const segment = this.segment;
24
25
  const delimiter = this.delimiter;
26
+ const definitions = this.definitions;
25
27
  const writeDelimiter = this.writeDelimiter;
26
28
  if (structure) {
27
- return new AsciiView(segment, buffer, new structure_1.Structure(structure.tags.clone(), structure.segments), this.ptr, delimiter, writeDelimiter);
29
+ return new AsciiView(definitions, segment, buffer, new structure_1.Structure(structure.tags.clone(), structure.segments), this.ptr, delimiter, writeDelimiter);
28
30
  }
29
- return new AsciiView(segment, buffer, null, this.ptr, delimiter, writeDelimiter);
31
+ return new AsciiView(definitions, segment, buffer, null, this.ptr, delimiter, writeDelimiter);
30
32
  }
31
33
  replaceDelimiter(viewBuffer, replaceDelimiter) {
32
34
  if (this.structure == null)
@@ -101,9 +103,10 @@ class AsciiView extends msg_view_1.MsgView {
101
103
  }
102
104
  }
103
105
  }
106
+ return null;
104
107
  }
105
108
  create(singleton) {
106
- return new AsciiView(singleton, this.buffer, this.structure, this.ptr, this.delimiter, this.writeDelimiter);
109
+ return new AsciiView(this.definitions, singleton, this.buffer, this.structure, this.ptr, this.delimiter, this.writeDelimiter);
107
110
  }
108
111
  stringAtPosition(position) {
109
112
  if (this.structure == null)
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-view.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-view.ts"],"names":[],"mappings":";;;AAEA,4CAAwC;AACxC,0CAAqC;AAGrC,qDAAgD;AAEhD,uCAAoC;AACpC,8CAAyC;AAEzC,MAAa,SAAU,SAAQ,kBAAO;IAEpC,YAA6B,OAA2B,EACtC,MAAqB,EACrB,SAA2B,EAC3B,GAAW,EACX,SAAiB,EACjB,cAAsB;QACtC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QANE,YAAO,GAAP,OAAO,CAAoB;QACtC,WAAM,GAAN,MAAM,CAAe;QACrB,cAAS,GAAT,SAAS,CAAkB;QAC3B,QAAG,GAAH,GAAG,CAAQ;QACX,cAAS,GAAT,SAAS,CAAQ;QACjB,mBAAc,GAAd,cAAc,CAAQ;QANvB,kBAAa,GAAmB,IAAI,8BAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAQ/E,CAAC;IAGM,KAAK;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;QAC1C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,qBAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;QACvI,CAAC;QACD,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;IAClF,CAAC;IAEO,gBAAgB,CAAE,UAAkB,EAAE,gBAAyB;QACrE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAM;QAClC,MAAM,SAAS,GAAG,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,IAAI,CAAC,SAAS,CAAA;QACpD,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;YAChC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAA;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;gBACnD,MAAM,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC3B,MAAM,CAAC,GAAW,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAA;gBACrC,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAGM,QAAQ,CAAE,gBAAyB;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACtC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAA;QACnD,OAAO,UAAU,CAAA;IACnB,CAAC;IAEM,QAAQ;QACb,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,cAAM,CAAC,QAAQ,CAAC,CAAA;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;QACpC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;QAC1C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;YAC7C,EAAE,IAAI,OAAO,GAAG,cAAc,CAAA;YAC9B,EAAE,IAAI,OAAO,GAAG,SAAS,CAAA;QAC3B,CAAC;QACD,OAAO,EAAE,GAAG,GAAG,CAAA;IACjB,CAAC;IAES,OAAO,CAAE,KAA4B;QAC7C,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;gBACtB,KAAK,kBAAO,CAAC,MAAO,CAAC,CAAC,CAAC;oBACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;gBACxC,CAAC;gBAED,KAAK,kBAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBACnB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACvC,CAAC;gBAED,KAAK,kBAAO,CAAC,GAAG,CAAC;gBACjB,KAAK,kBAAO,CAAC,MAAM,CAAC,CAAC,CAAC;oBACpB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;gBACjC,CAAC;gBAED,KAAK,kBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACnC,CAAC;gBAED,KAAK,kBAAO,CAAC,YAAY,CAAC,CAAC,CAAC;oBAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBAC1C,CAAC;gBAED,KAAK,kBAAO,CAAC,WAAW,CAAC,CAAC,CAAC;oBACzB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBACtC,CAAC;gBAED,KAAK,kBAAO,CAAC,WAAW,CAAC,CAAC,CAAC;oBACzB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBACtC,CAAC;gBAED,KAAK,kBAAO,CAAC,SAAS,CAAC,CAAC,CAAC;oBACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBACtC,CAAC;gBAED,KAAK,kBAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;gBACjC,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAES,MAAM,CAAE,SAA6B;QAC7C,OAAO,IAAI,SAAS,CAAC,SAAS,EAC5B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,cAAc,CAAC,CAAA;IACxB,CAAC;IAES,gBAAgB,CAAE,QAAgB;QAC1C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAA;QAChC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9D,CAAC;IAEO,SAAS,CAAE,QAAgB;QACjC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACvC,MAAM,GAAG,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9D,CAAC;IAEO,SAAS,CAAE,QAAgB,EAAE,UAAmB,KAAK;QAC3D,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,MAAM,GAAG,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAEO,OAAO,CAAE,GAAW,EAAE,MAAe;QAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAA;QACpC,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC3D,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAEO,OAAO,CAAE,GAAW,EAAE,MAAe;QAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAA;QACpC,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,MAAM,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE3D,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAEO,WAAW,CAAE,GAAW,EAAE,MAAe;QAC/C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACvC,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAA;QACpC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QAC7E,CAAC;IACH,CAAC;IAEO,UAAU,CAAE,GAAW;QAC7B,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACvC,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,MAAM,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC3D,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAEM,QAAQ;QACb,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;CACF;AArND,8BAqNC","sourcesContent":["import { SimpleFieldDefinition } from '../../dictionary/definition'\r\nimport { SegmentDescription } from '../segment/segment-description'\r\nimport { Structure } from '../structure'\r\nimport { MsgView } from '../msg-view'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { ITimeFormatter } from './itime-formatter'\r\nimport { TimeFormatter } from './time-formatter'\r\nimport { TagPos } from '../tag/tag-pos'\r\nimport { MsgTag } from '../../types'\r\nimport { TagType } from '../tag/tag-type'\r\n\r\nexport class AsciiView extends MsgView {\r\n private readonly timeFormatter: ITimeFormatter = new TimeFormatter(this.buffer)\r\n constructor (public readonly segment: SegmentDescription,\r\n public readonly buffer: ElasticBuffer,\r\n public readonly structure: Structure | null,\r\n public readonly ptr: number,\r\n public readonly delimiter: number,\r\n public readonly writeDelimiter: number) {\r\n super(segment, structure)\r\n }\r\n\r\n // if the view is to be kept beyond the event on which it arrives, must be cloned\r\n public clone (): MsgView {\r\n const structure = this.structure\r\n const buffer = this.buffer.clone()\r\n const segment = this.segment\r\n const delimiter = this.delimiter\r\n const writeDelimiter = this.writeDelimiter\r\n if (structure) {\r\n return new AsciiView(segment, buffer, new Structure(structure.tags.clone(), structure.segments), this.ptr, delimiter, writeDelimiter)\r\n }\r\n return new AsciiView(segment, buffer, null, this.ptr, delimiter, writeDelimiter)\r\n }\r\n\r\n private replaceDelimiter (viewBuffer: Buffer, replaceDelimiter?: number): void {\r\n if (this.structure == null) return\r\n const delimiter = replaceDelimiter ?? this.delimiter\r\n if (delimiter !== this.writeDelimiter) {\r\n const structure = this.structure\r\n const tags = structure.tags.tagPos\r\n for (let i = 0; i < structure.tags.nextTagPos; ++i) {\r\n const tag: TagPos = tags[i]\r\n const p: number = tag.start + tag.len\r\n viewBuffer.writeUInt8(delimiter, p)\r\n }\r\n }\r\n }\r\n\r\n // turn our view back to a raw msg\r\n public toBuffer (replaceDelimiter?: number): Buffer {\r\n const viewBuffer = this.buffer.slice()\r\n this.replaceDelimiter(viewBuffer, replaceDelimiter)\r\n return viewBuffer\r\n }\r\n\r\n public checksum (): number {\r\n if (this.structure == null) return -1\r\n const t = this.getPosition(MsgTag.CheckSum)\r\n const structure = this.structure\r\n const prev = structure.tags.tagPos[t - 1]\r\n const tp = prev.start + prev.len + 1\r\n let cs = this.buffer.sum(tp)\r\n const delimiter = this.delimiter\r\n const writeDelimiter = this.writeDelimiter\r\n if (writeDelimiter !== delimiter) {\r\n const changes = structure.tags.nextTagPos - 1\r\n cs -= changes * writeDelimiter\r\n cs += changes * delimiter\r\n }\r\n return cs % 256\r\n }\r\n\r\n protected toTyped (field: SimpleFieldDefinition): any {\r\n const position: number = this.getPosition(field.tag)\r\n if (position >= 0) {\r\n switch (field.tagType) {\r\n case TagType.String : {\r\n return this.stringAtPosition(position)\r\n }\r\n\r\n case TagType.Float: {\r\n return this.getNumber(position, true)\r\n }\r\n\r\n case TagType.Int:\r\n case TagType.Length: {\r\n return this.getNumber(position)\r\n }\r\n\r\n case TagType.Boolean: {\r\n return this.getBoolean(field.tag)\r\n }\r\n\r\n case TagType.UtcTimestamp: {\r\n return this.getDateTime(field.tag, true)\r\n }\r\n\r\n case TagType.UtcTimeOnly: {\r\n return this.getTime(field.tag, true)\r\n }\r\n\r\n case TagType.UtcDateOnly: {\r\n return this.getDate(field.tag, true)\r\n }\r\n\r\n case TagType.LocalDate: {\r\n return this.getDate(field.tag, true)\r\n }\r\n\r\n case TagType.RawData: {\r\n return this.getBuffer(position)\r\n }\r\n\r\n default: {\r\n return this.stringAtPosition(position)\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected create (singleton: SegmentDescription): MsgView {\r\n return new AsciiView(singleton,\r\n this.buffer,\r\n this.structure,\r\n this.ptr,\r\n this.delimiter,\r\n this.writeDelimiter)\r\n }\r\n\r\n protected stringAtPosition (position: number): string | null {\r\n if (this.structure == null) return null\r\n const tags = this.structure.tags\r\n if (position < 0 || position >= tags.nextTagPos) {\r\n return null\r\n }\r\n const tag: TagPos = tags.tagPos[position]\r\n return this.buffer.getString(tag.start, tag.start + tag.len)\r\n }\r\n\r\n private getBuffer (position: number): Buffer | null {\r\n if (this.structure == null) return null\r\n const tag: TagPos = this.structure.tags.tagPos[position]\r\n return this.buffer.getBuffer(tag.start, tag.start + tag.len)\r\n }\r\n\r\n private getNumber (position: number, isFloat: boolean = false): number | null {\r\n if (this.structure == null) return null\r\n const buffer = this.buffer\r\n const tag: TagPos = this.structure.tags.tagPos[position]\r\n if (isFloat) {\r\n return buffer.getFloat(tag.start, tag.start + tag.len - 1)\r\n } else {\r\n return buffer.getWholeNumber(tag.start, tag.start + tag.len - 1)\r\n }\r\n }\r\n\r\n private getTime (tag: number, useUtc: boolean): Date | null {\r\n if (this.structure == null) return null\r\n const formatter = this.timeFormatter\r\n const position: number = this.getPosition(tag)\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n if (position < 0) {\r\n return null\r\n }\r\n if (useUtc) {\r\n return formatter.getUtcTime(tagPos.start)\r\n } else {\r\n return formatter.getLocalTime(tagPos.start)\r\n }\r\n }\r\n\r\n private getDate (tag: number, useUtc: boolean): Date | null {\r\n if (this.structure == null) return null\r\n const formatter = this.timeFormatter\r\n const position: number = this.getPosition(tag)\r\n if (position < 0) {\r\n return null\r\n }\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n // (SendingTime) = 20150417-01:00:08.201\r\n if (tagPos.len < 8) {\r\n return null\r\n }\r\n if (useUtc) {\r\n return formatter.getUtcDate(tagPos.start)\r\n } else {\r\n return formatter.getLocalDate(tagPos.start)\r\n }\r\n }\r\n\r\n private getDateTime (tag: number, useUtc: boolean): Date | null {\r\n if (this.structure == null) return null\r\n const position: number = this.getPosition(tag)\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n const formatter = this.timeFormatter\r\n if (position < 0) {\r\n return null\r\n }\r\n // (SendingTime) = 20150417-01:00:08.201\r\n if (tagPos.len < 8) {\r\n return null\r\n }\r\n\r\n if (useUtc) {\r\n return formatter.getUtcTimestamp(tagPos.start, tagPos.start + tagPos.len)\r\n } else {\r\n return formatter.getLocalTimestamp(tagPos.start, tagPos.start + tagPos.len)\r\n }\r\n }\r\n\r\n private getBoolean (tag: number): boolean | null {\r\n if (this.structure == null) return null\r\n const position: number = this.getPosition(tag)\r\n if (position < 0) {\r\n return null\r\n }\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n return this.buffer.getBoolean(tagPos.start)\r\n }\r\n\r\n public toString (): string {\r\n return super.toString()\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ascii-view.js","sourceRoot":"","sources":["../../../src/buffer/ascii/ascii-view.ts"],"names":[],"mappings":"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","sourcesContent":["import { FixDefinitions, SimpleFieldDefinition } from '../../dictionary/definition'\r\nimport { SegmentDescription } from '../segment/segment-description'\r\nimport { Structure } from '../structure'\r\nimport { MsgView } from '../msg-view'\r\nimport { ElasticBuffer } from '../elastic-buffer'\r\nimport { ITimeFormatter } from './itime-formatter'\r\nimport { TimeFormatter } from './time-formatter'\r\nimport { TagPos } from '../tag/tag-pos'\r\nimport { MsgTag } from '../../types'\r\nimport { TagType } from '../tag/tag-type'\r\n\r\nexport class AsciiView extends MsgView {\r\n private readonly timeFormatter: ITimeFormatter = new TimeFormatter(this.buffer)\r\n constructor (public readonly definitions: FixDefinitions, public readonly segment: SegmentDescription,\r\n public readonly buffer: ElasticBuffer,\r\n public readonly structure: Structure | null,\r\n public readonly ptr: number,\r\n public readonly delimiter: number,\r\n public readonly writeDelimiter: number) {\r\n super(definitions, segment, structure)\r\n }\r\n\r\n // if the view is to be kept beyond the event on which it arrives, must be cloned\r\n public clone (): MsgView {\r\n const structure = this.structure\r\n const buffer = this.buffer.clone()\r\n const segment = this.segment\r\n const delimiter = this.delimiter\r\n const definitions = this.definitions\r\n const writeDelimiter = this.writeDelimiter\r\n if (structure) {\r\n return new AsciiView(definitions, segment, buffer, new Structure(structure.tags.clone(), structure.segments), this.ptr, delimiter, writeDelimiter)\r\n }\r\n return new AsciiView(definitions, segment, buffer, null, this.ptr, delimiter, writeDelimiter)\r\n }\r\n\r\n private replaceDelimiter (viewBuffer: Buffer, replaceDelimiter?: number): void {\r\n if (this.structure == null) return\r\n const delimiter = replaceDelimiter ?? this.delimiter\r\n if (delimiter !== this.writeDelimiter) {\r\n const structure = this.structure\r\n const tags = structure.tags.tagPos\r\n for (let i = 0; i < structure.tags.nextTagPos; ++i) {\r\n const tag: TagPos = tags[i]\r\n const p: number = tag.start + tag.len\r\n viewBuffer.writeUInt8(delimiter, p)\r\n }\r\n }\r\n }\r\n\r\n // turn our view back to a raw msg\r\n public toBuffer (replaceDelimiter?: number): Buffer {\r\n const viewBuffer = this.buffer.slice()\r\n this.replaceDelimiter(viewBuffer, replaceDelimiter)\r\n return viewBuffer\r\n }\r\n\r\n public checksum (): number {\r\n if (this.structure == null) return -1\r\n const t = this.getPosition(MsgTag.CheckSum)\r\n const structure = this.structure\r\n const prev = structure.tags.tagPos[t - 1]\r\n const tp = prev.start + prev.len + 1\r\n let cs = this.buffer.sum(tp)\r\n const delimiter = this.delimiter\r\n const writeDelimiter = this.writeDelimiter\r\n if (writeDelimiter !== delimiter) {\r\n const changes = structure.tags.nextTagPos - 1\r\n cs -= changes * writeDelimiter\r\n cs += changes * delimiter\r\n }\r\n return cs % 256\r\n }\r\n\r\n protected toTyped (field: SimpleFieldDefinition): (boolean | string | number | Date | Buffer | null) {\r\n const position: number = this.getPosition(field.tag)\r\n if (position >= 0) {\r\n switch (field.tagType) {\r\n case TagType.String : {\r\n return this.stringAtPosition(position)\r\n }\r\n\r\n case TagType.Float: {\r\n return this.getNumber(position, true)\r\n }\r\n\r\n case TagType.Int:\r\n case TagType.Length: {\r\n return this.getNumber(position)\r\n }\r\n\r\n case TagType.Boolean: {\r\n return this.getBoolean(field.tag)\r\n }\r\n\r\n case TagType.UtcTimestamp: {\r\n return this.getDateTime(field.tag, true)\r\n }\r\n\r\n case TagType.UtcTimeOnly: {\r\n return this.getTime(field.tag, true)\r\n }\r\n\r\n case TagType.UtcDateOnly: {\r\n return this.getDate(field.tag, true)\r\n }\r\n\r\n case TagType.LocalDate: {\r\n return this.getDate(field.tag, true)\r\n }\r\n\r\n case TagType.RawData: {\r\n return this.getBuffer(position)\r\n }\r\n\r\n default: {\r\n return this.stringAtPosition(position)\r\n }\r\n }\r\n }\r\n return null\r\n }\r\n\r\n protected create (singleton: SegmentDescription): MsgView {\r\n return new AsciiView(this.definitions, singleton,\r\n this.buffer,\r\n this.structure,\r\n this.ptr,\r\n this.delimiter,\r\n this.writeDelimiter)\r\n }\r\n\r\n protected stringAtPosition (position: number): string | null {\r\n if (this.structure == null) return null\r\n const tags = this.structure.tags\r\n if (position < 0 || position >= tags.nextTagPos) {\r\n return null\r\n }\r\n const tag: TagPos = tags.tagPos[position]\r\n return this.buffer.getString(tag.start, tag.start + tag.len)\r\n }\r\n\r\n private getBuffer (position: number): Buffer | null {\r\n if (this.structure == null) return null\r\n const tag: TagPos = this.structure.tags.tagPos[position]\r\n return this.buffer.getBuffer(tag.start, tag.start + tag.len)\r\n }\r\n\r\n private getNumber (position: number, isFloat: boolean = false): number | null {\r\n if (this.structure == null) return null\r\n const buffer = this.buffer\r\n const tag: TagPos = this.structure.tags.tagPos[position]\r\n if (isFloat) {\r\n return buffer.getFloat(tag.start, tag.start + tag.len - 1)\r\n } else {\r\n return buffer.getWholeNumber(tag.start, tag.start + tag.len - 1)\r\n }\r\n }\r\n\r\n private getTime (tag: number, useUtc: boolean): Date | null {\r\n if (this.structure == null) return null\r\n const formatter = this.timeFormatter\r\n const position: number = this.getPosition(tag)\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n if (position < 0) {\r\n return null\r\n }\r\n if (useUtc) {\r\n return formatter.getUtcTime(tagPos.start)\r\n } else {\r\n return formatter.getLocalTime(tagPos.start)\r\n }\r\n }\r\n\r\n private getDate (tag: number, useUtc: boolean): Date | null {\r\n if (this.structure == null) return null\r\n const formatter = this.timeFormatter\r\n const position: number = this.getPosition(tag)\r\n if (position < 0) {\r\n return null\r\n }\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n // (SendingTime) = 20150417-01:00:08.201\r\n if (tagPos.len < 8) {\r\n return null\r\n }\r\n if (useUtc) {\r\n return formatter.getUtcDate(tagPos.start)\r\n } else {\r\n return formatter.getLocalDate(tagPos.start)\r\n }\r\n }\r\n\r\n private getDateTime (tag: number, useUtc: boolean): Date | null {\r\n if (this.structure == null) return null\r\n const position: number = this.getPosition(tag)\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n const formatter = this.timeFormatter\r\n if (position < 0) {\r\n return null\r\n }\r\n // (SendingTime) = 20150417-01:00:08.201\r\n if (tagPos.len < 8) {\r\n return null\r\n }\r\n\r\n if (useUtc) {\r\n return formatter.getUtcTimestamp(tagPos.start, tagPos.start + tagPos.len)\r\n } else {\r\n return formatter.getLocalTimestamp(tagPos.start, tagPos.start + tagPos.len)\r\n }\r\n }\r\n\r\n private getBoolean (tag: number): boolean | null {\r\n if (this.structure == null) return null\r\n const position: number = this.getPosition(tag)\r\n if (position < 0) {\r\n return null\r\n }\r\n const tagPos: TagPos = this.structure.tags.tagPos[position]\r\n return this.buffer.getBoolean(tagPos.start)\r\n }\r\n\r\n public toString (): string {\r\n return super.toString()\r\n }\r\n}\r\n"]}
@@ -10,7 +10,7 @@ class EncodeProxy {
10
10
  static SimpleFieldCheck(field, val) {
11
11
  const definition = field.definition;
12
12
  if (definition.isEnum()) {
13
- const resolved = definition.containsEnum(val);
13
+ const resolved = definition.containsEnum(String(val));
14
14
  if (!resolved) {
15
15
  throw new Error(`enum field ${field.name} does not support "${val}"`);
16
16
  }