jspurefix 4.1.2 → 5.1.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 (167) hide show
  1. package/BACKPORT_PLAN.md +214 -0
  2. package/README.md +1 -2
  3. package/data/examples/FIX.4.4/fixsim/fix.txt +46 -0
  4. package/data/session/fixsim-qf44-initiator.json +21 -0
  5. package/dist/buffer/ascii/ascii-parser-state.js +0 -7
  6. package/dist/buffer/ascii/ascii-parser-state.js.map +1 -1
  7. package/dist/buffer/ascii/ascii-parser.d.ts +1 -0
  8. package/dist/buffer/ascii/ascii-parser.js +8 -2
  9. package/dist/buffer/ascii/ascii-parser.js.map +1 -1
  10. package/dist/buffer/ascii/ascii-segment-parser.js +36 -0
  11. package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
  12. package/dist/buffer/ascii/tag-index.d.ts +20 -0
  13. package/dist/buffer/ascii/tag-index.js +89 -0
  14. package/dist/buffer/ascii/tag-index.js.map +1 -0
  15. package/dist/buffer/msg-view.js +17 -4
  16. package/dist/buffer/msg-view.js.map +1 -1
  17. package/dist/buffer/segment/segment-description.d.ts +3 -0
  18. package/dist/buffer/segment/segment-description.js +8 -0
  19. package/dist/buffer/segment/segment-description.js.map +1 -1
  20. package/dist/buffer/segment/segment-view.d.ts +13 -0
  21. package/dist/buffer/segment/segment-view.js +27 -0
  22. package/dist/buffer/segment/segment-view.js.map +1 -0
  23. package/dist/collections/collection.js.map +1 -1
  24. package/dist/config/js-fix-logger.js.map +1 -1
  25. package/dist/store/fix-msg-ascii-store-resend.js.map +1 -1
  26. package/dist/transport/session/fix-session.js +6 -0
  27. package/dist/transport/session/fix-session.js.map +1 -1
  28. package/dist/transport/tcp/tcp-initiator-connector.js.map +1 -1
  29. package/dist/types/FIX.5.0SP2/quickfix/enum/all-enum.js.map +1 -1
  30. package/dist/types/FIX.5.0SP2/repo/enum/all-enum.js.map +1 -1
  31. package/dist/types/FIX.5.0SP2/repo/set/hop_grp.js.map +1 -1
  32. package/dist/types/FIX4.0/repo/enum/all-enum.js.map +1 -1
  33. package/dist/types/FIX4.1/repo/enum/all-enum.js.map +1 -1
  34. package/dist/types/FIX4.2/quickfix/enum/all-enum.js.map +1 -1
  35. package/dist/types/FIX4.2/repo/enum/all-enum.js.map +1 -1
  36. package/dist/types/FIX4.3/quickfix/enum/all-enum.js.map +1 -1
  37. package/dist/types/FIX4.3/repo/allocation.js.map +1 -1
  38. package/dist/types/FIX4.3/repo/allocation_ack.js.map +1 -1
  39. package/dist/types/FIX4.3/repo/cross_order_cancel_replace_request.js.map +1 -1
  40. package/dist/types/FIX4.3/repo/cross_order_cancel_request.js.map +1 -1
  41. package/dist/types/FIX4.3/repo/derivative_security_list.js.map +1 -1
  42. package/dist/types/FIX4.3/repo/enum/all-enum.js.map +1 -1
  43. package/dist/types/FIX4.3/repo/execution_report.js.map +1 -1
  44. package/dist/types/FIX4.3/repo/mass_quote.js.map +1 -1
  45. package/dist/types/FIX4.3/repo/mass_quote_acknowledgement.js.map +1 -1
  46. package/dist/types/FIX4.3/repo/multileg_order_cancel_replace_request.js.map +1 -1
  47. package/dist/types/FIX4.3/repo/new_order_cross.js.map +1 -1
  48. package/dist/types/FIX4.3/repo/new_order_list.js.map +1 -1
  49. package/dist/types/FIX4.3/repo/new_order_multileg.js.map +1 -1
  50. package/dist/types/FIX4.3/repo/new_order_single.js.map +1 -1
  51. package/dist/types/FIX4.3/repo/order_cancel_replace_request.js.map +1 -1
  52. package/dist/types/FIX4.3/repo/order_cancel_request.js.map +1 -1
  53. package/dist/types/FIX4.3/repo/order_mass_status_request.js.map +1 -1
  54. package/dist/types/FIX4.3/repo/order_status_request.js.map +1 -1
  55. package/dist/types/FIX4.3/repo/quote.js.map +1 -1
  56. package/dist/types/FIX4.3/repo/quote_cancel.js.map +1 -1
  57. package/dist/types/FIX4.3/repo/quote_request.js.map +1 -1
  58. package/dist/types/FIX4.3/repo/quote_request_reject.js.map +1 -1
  59. package/dist/types/FIX4.3/repo/quote_status_report.js.map +1 -1
  60. package/dist/types/FIX4.3/repo/quote_status_request.js.map +1 -1
  61. package/dist/types/FIX4.3/repo/registration_instructions.js.map +1 -1
  62. package/dist/types/FIX4.3/repo/registration_instructions_response.js.map +1 -1
  63. package/dist/types/FIX4.3/repo/security_definition.js.map +1 -1
  64. package/dist/types/FIX4.3/repo/security_definition_request.js.map +1 -1
  65. package/dist/types/FIX4.3/repo/security_list.js.map +1 -1
  66. package/dist/types/FIX4.3/repo/settlement_instructions.js.map +1 -1
  67. package/dist/types/FIX4.3/repo/trade_capture_report.js.map +1 -1
  68. package/dist/types/FIX4.3/repo/trade_capture_report_request.js.map +1 -1
  69. package/dist/types/FIX4.4/quickfix/enum/all-enum.js.map +1 -1
  70. package/dist/types/FIX4.4/repo/enum/all-enum.js.map +1 -1
  71. package/dist/types/FIX4.4/repo/set/hop.js.map +1 -1
  72. package/dist/types/FIXML50SP2/adjusted_position_report.js.map +1 -1
  73. package/dist/types/FIXML50SP2/derivative_security_list.js.map +1 -1
  74. package/dist/types/FIXML50SP2/derivative_security_list_update_report.js.map +1 -1
  75. package/dist/types/FIXML50SP2/email.js.map +1 -1
  76. package/dist/types/FIXML50SP2/enum/all-enum.js.map +1 -1
  77. package/dist/types/FIXML50SP2/news.js.map +1 -1
  78. package/dist/types/FIXML50SP2/quote_cancel.js.map +1 -1
  79. package/dist/types/FIXML50SP2/set/market_segment_grp.js.map +1 -1
  80. package/dist/types/FIXML50SP2/set/party_risk_limits_ack_grp.js.map +1 -1
  81. package/dist/types/FIXML50SP2/set/party_risk_limits_grp.js.map +1 -1
  82. package/dist/types/FIXML50SP2/set/party_risk_limits_update_grp.js.map +1 -1
  83. package/dist/types/FIXML50SP2/set/sec_list_grp.js.map +1 -1
  84. package/dist/types/FIXML50SP2/set/sec_lst_upd_rel_sym_grp.js.map +1 -1
  85. package/dist/types/FIXML50SP2/set/trading_session_rules_grp.js.map +1 -1
  86. package/dist/types/FIXML50SP2/set/trd_instrmt_leg_grp.js.map +1 -1
  87. package/dist/types/FIXML50SP2/set/trd_sess_lst_grp.js.map +1 -1
  88. package/dist/types/FIXML50SP2/stream_assignment_report.js.map +1 -1
  89. package/dist/types/FIXML50SP2/stream_assignment_request.js.map +1 -1
  90. package/eslint.config.mjs +119 -0
  91. package/jsfix.test_client.txt +66 -66
  92. package/jsfix.test_server.txt +63 -63
  93. package/package.json +4 -5
  94. package/src/buffer/ascii/ascii-parser-state.ts +4 -7
  95. package/src/buffer/ascii/ascii-parser.ts +14 -3
  96. package/src/buffer/ascii/ascii-segment-parser.ts +37 -0
  97. package/src/buffer/ascii/tag-index.ts +101 -0
  98. package/src/buffer/msg-view.ts +18 -6
  99. package/src/buffer/segment/segment-description.ts +10 -0
  100. package/src/buffer/segment/segment-view.ts +28 -0
  101. package/src/collections/collection.ts +0 -1
  102. package/src/config/js-fix-logger.ts +0 -1
  103. package/src/store/fix-msg-ascii-store-resend.ts +1 -1
  104. package/src/transport/session/fix-session.ts +7 -0
  105. package/src/transport/tcp/tcp-initiator-connector.ts +1 -1
  106. package/src/types/FIX.5.0SP2/quickfix/enum/all-enum.ts +0 -1
  107. package/src/types/FIX.5.0SP2/repo/enum/all-enum.ts +0 -1
  108. package/src/types/FIX.5.0SP2/repo/set/hop_grp.ts +1 -1
  109. package/src/types/FIX4.0/repo/enum/all-enum.ts +0 -1
  110. package/src/types/FIX4.1/repo/enum/all-enum.ts +0 -1
  111. package/src/types/FIX4.2/quickfix/enum/all-enum.ts +0 -1
  112. package/src/types/FIX4.2/repo/enum/all-enum.ts +0 -1
  113. package/src/types/FIX4.3/quickfix/enum/all-enum.ts +0 -1
  114. package/src/types/FIX4.3/repo/allocation.ts +2 -2
  115. package/src/types/FIX4.3/repo/allocation_ack.ts +1 -1
  116. package/src/types/FIX4.3/repo/cross_order_cancel_replace_request.ts +4 -4
  117. package/src/types/FIX4.3/repo/cross_order_cancel_request.ts +1 -1
  118. package/src/types/FIX4.3/repo/derivative_security_list.ts +1 -1
  119. package/src/types/FIX4.3/repo/enum/all-enum.ts +0 -1
  120. package/src/types/FIX4.3/repo/execution_report.ts +5 -5
  121. package/src/types/FIX4.3/repo/mass_quote.ts +1 -1
  122. package/src/types/FIX4.3/repo/mass_quote_acknowledgement.ts +1 -1
  123. package/src/types/FIX4.3/repo/multileg_order_cancel_replace_request.ts +3 -3
  124. package/src/types/FIX4.3/repo/new_order_cross.ts +4 -4
  125. package/src/types/FIX4.3/repo/new_order_list.ts +4 -4
  126. package/src/types/FIX4.3/repo/new_order_multileg.ts +3 -3
  127. package/src/types/FIX4.3/repo/new_order_single.ts +4 -4
  128. package/src/types/FIX4.3/repo/order_cancel_replace_request.ts +3 -3
  129. package/src/types/FIX4.3/repo/order_cancel_request.ts +1 -1
  130. package/src/types/FIX4.3/repo/order_mass_status_request.ts +1 -1
  131. package/src/types/FIX4.3/repo/order_status_request.ts +1 -1
  132. package/src/types/FIX4.3/repo/quote.ts +1 -1
  133. package/src/types/FIX4.3/repo/quote_cancel.ts +1 -1
  134. package/src/types/FIX4.3/repo/quote_request.ts +2 -2
  135. package/src/types/FIX4.3/repo/quote_request_reject.ts +2 -2
  136. package/src/types/FIX4.3/repo/quote_status_report.ts +1 -1
  137. package/src/types/FIX4.3/repo/quote_status_request.ts +1 -1
  138. package/src/types/FIX4.3/repo/registration_instructions.ts +2 -2
  139. package/src/types/FIX4.3/repo/registration_instructions_response.ts +1 -1
  140. package/src/types/FIX4.3/repo/security_definition.ts +1 -1
  141. package/src/types/FIX4.3/repo/security_definition_request.ts +1 -1
  142. package/src/types/FIX4.3/repo/security_list.ts +1 -1
  143. package/src/types/FIX4.3/repo/settlement_instructions.ts +1 -1
  144. package/src/types/FIX4.3/repo/trade_capture_report.ts +1 -1
  145. package/src/types/FIX4.3/repo/trade_capture_report_request.ts +1 -1
  146. package/src/types/FIX4.4/quickfix/enum/all-enum.ts +0 -1
  147. package/src/types/FIX4.4/repo/enum/all-enum.ts +0 -1
  148. package/src/types/FIX4.4/repo/set/hop.ts +1 -1
  149. package/src/types/FIXML50SP2/adjusted_position_report.ts +1 -1
  150. package/src/types/FIXML50SP2/derivative_security_list.ts +1 -1
  151. package/src/types/FIXML50SP2/derivative_security_list_update_report.ts +1 -1
  152. package/src/types/FIXML50SP2/email.ts +1 -1
  153. package/src/types/FIXML50SP2/enum/all-enum.ts +0 -1
  154. package/src/types/FIXML50SP2/news.ts +1 -1
  155. package/src/types/FIXML50SP2/quote_cancel.ts +1 -1
  156. package/src/types/FIXML50SP2/set/market_segment_grp.ts +1 -1
  157. package/src/types/FIXML50SP2/set/party_risk_limits_ack_grp.ts +1 -1
  158. package/src/types/FIXML50SP2/set/party_risk_limits_grp.ts +1 -1
  159. package/src/types/FIXML50SP2/set/party_risk_limits_update_grp.ts +1 -1
  160. package/src/types/FIXML50SP2/set/sec_list_grp.ts +2 -2
  161. package/src/types/FIXML50SP2/set/sec_lst_upd_rel_sym_grp.ts +1 -1
  162. package/src/types/FIXML50SP2/set/trading_session_rules_grp.ts +1 -1
  163. package/src/types/FIXML50SP2/set/trd_instrmt_leg_grp.ts +1 -1
  164. package/src/types/FIXML50SP2/set/trd_sess_lst_grp.ts +1 -1
  165. package/src/types/FIXML50SP2/stream_assignment_report.ts +1 -1
  166. package/src/types/FIXML50SP2/stream_assignment_request.ts +1 -1
  167. package/src/util/unzip.js +0 -1
@@ -0,0 +1,20 @@
1
+ import { IContainedSet } from '../../dictionary/contained';
2
+ import { SegmentView } from '../segment/segment-view';
3
+ import { Tags } from '../tag/tags';
4
+ export interface TagSpan {
5
+ start: number;
6
+ end: number;
7
+ }
8
+ export declare class TagIndex {
9
+ readonly set: IContainedSet;
10
+ private readonly sortedTagPos;
11
+ private readonly tagSpans;
12
+ private readonly componentGroupWrappers;
13
+ private readonly cache;
14
+ constructor(set: IContainedSet, tags: Tags, count: number);
15
+ private populateTagSpans;
16
+ private calcGroups;
17
+ private findParentComponent;
18
+ getInstance(name: string): SegmentView | null;
19
+ isComponentGroupWrapper(name: string): boolean;
20
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TagIndex = void 0;
4
+ const segment_view_1 = require("../segment/segment-view");
5
+ const tag_pos_1 = require("../tag/tag-pos");
6
+ class TagIndex {
7
+ constructor(set, tags, count) {
8
+ this.set = set;
9
+ this.tagSpans = new Map();
10
+ this.componentGroupWrappers = new Set();
11
+ this.cache = new Map();
12
+ this.sortedTagPos = new Array(count);
13
+ for (let i = 0; i < count; i++) {
14
+ this.sortedTagPos[i] = tags.tagPos[i];
15
+ }
16
+ this.sortedTagPos.sort(tag_pos_1.TagPos.compare);
17
+ this.populateTagSpans();
18
+ this.calcGroups(tags, count);
19
+ }
20
+ populateTagSpans() {
21
+ for (let i = 0; i < this.sortedTagPos.length; i++) {
22
+ const t = this.sortedTagPos[i];
23
+ const existing = this.tagSpans.get(t.tag);
24
+ if (existing) {
25
+ existing.end = i;
26
+ }
27
+ else {
28
+ this.tagSpans.set(t.tag, { start: i, end: i });
29
+ }
30
+ }
31
+ }
32
+ calcGroups(tags, count) {
33
+ for (let i = 0; i < count; i++) {
34
+ const tag = tags.tagPos[i];
35
+ const field = this.set.tagToField[tag.tag];
36
+ if (!field)
37
+ continue;
38
+ const component = this.findParentComponent(tag.tag);
39
+ if (component) {
40
+ const componentSet = this.set.components.get(component);
41
+ if (componentSet && componentSet.fields.length === 1) {
42
+ this.componentGroupWrappers.add(component);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ findParentComponent(tag) {
48
+ for (const [name, componentSet] of this.set.components) {
49
+ if (componentSet.containedTag[tag]) {
50
+ return name;
51
+ }
52
+ }
53
+ return null;
54
+ }
55
+ getInstance(name) {
56
+ const cached = this.cache.get(name);
57
+ if (cached !== undefined) {
58
+ return cached;
59
+ }
60
+ const componentSet = this.set.components.get(name);
61
+ if (!componentSet) {
62
+ this.cache.set(name, null);
63
+ return null;
64
+ }
65
+ const view = new segment_view_1.SegmentView(name, componentSet);
66
+ const flatTags = componentSet.flattenedTag;
67
+ for (let x = 0; x < flatTags.length; x++) {
68
+ const t = flatTags[x];
69
+ const span = this.tagSpans.get(t);
70
+ if (!span)
71
+ continue;
72
+ if (span.start === span.end) {
73
+ view.add(this.sortedTagPos[span.start]);
74
+ }
75
+ else {
76
+ for (let j = span.start; j <= span.end; j++) {
77
+ view.add(this.sortedTagPos[j]);
78
+ }
79
+ }
80
+ }
81
+ this.cache.set(name, view);
82
+ return view;
83
+ }
84
+ isComponentGroupWrapper(name) {
85
+ return this.componentGroupWrappers.has(name);
86
+ }
87
+ }
88
+ exports.TagIndex = TagIndex;
89
+ //# sourceMappingURL=tag-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-index.js","sourceRoot":"","sources":["../../../src/buffer/ascii/tag-index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IContainedSet } from '../../dictionary/contained'\nimport { SegmentView } from '../segment/segment-view'\nimport { TagPos } from '../tag/tag-pos'\nimport { Tags } from '../tag/tags'\n\nexport interface TagSpan {\n start: number\n end: number\n}\n\nexport class TagIndex {\n private readonly sortedTagPos: TagPos[]\n private readonly tagSpans: Map<number, TagSpan> = new Map()\n private readonly componentGroupWrappers: Set<string> = new Set()\n private readonly cache: Map<string, SegmentView | null> = new Map()\n\n constructor (\n public readonly set: IContainedSet,\n tags: Tags,\n count: number) {\n this.sortedTagPos = new Array(count)\n for (let i = 0; i < count; i++) {\n this.sortedTagPos[i] = tags.tagPos[i]\n }\n this.sortedTagPos.sort(TagPos.compare)\n this.populateTagSpans()\n this.calcGroups(tags, count)\n }\n\n private populateTagSpans (): void {\n for (let i = 0; i < this.sortedTagPos.length; i++) {\n const t = this.sortedTagPos[i]\n const existing = this.tagSpans.get(t.tag)\n if (existing) {\n existing.end = i\n } else {\n this.tagSpans.set(t.tag, { start: i, end: i })\n }\n }\n }\n\n private calcGroups (tags: Tags, count: number): void {\n for (let i = 0; i < count; i++) {\n const tag = tags.tagPos[i]\n const field = this.set.tagToField[tag.tag]\n if (!field) continue\n // detect component group wrappers (single-field components containing a group)\n const component = this.findParentComponent(tag.tag)\n if (component) {\n const componentSet = this.set.components.get(component)\n if (componentSet && componentSet.fields.length === 1) {\n this.componentGroupWrappers.add(component)\n }\n }\n }\n }\n\n private findParentComponent (tag: number): string | null {\n for (const [name, componentSet] of this.set.components) {\n if (componentSet.containedTag[tag]) {\n return name\n }\n }\n return null\n }\n\n public getInstance (name: string): SegmentView | null {\n const cached = this.cache.get(name)\n if (cached !== undefined) {\n return cached\n }\n\n const componentSet = this.set.components.get(name)\n if (!componentSet) {\n this.cache.set(name, null)\n return null\n }\n\n const view = new SegmentView(name, componentSet)\n const flatTags = componentSet.flattenedTag\n for (let x = 0; x < flatTags.length; x++) {\n const t = flatTags[x]\n const span = this.tagSpans.get(t)\n if (!span) continue\n if (span.start === span.end) {\n view.add(this.sortedTagPos[span.start])\n } else {\n for (let j = span.start; j <= span.end; j++) {\n view.add(this.sortedTagPos[j])\n }\n }\n }\n\n this.cache.set(name, view)\n return view\n }\n\n public isComponentGroupWrapper (name: string): boolean {\n return this.componentGroupWrappers.has(name)\n }\n}\n"]}
@@ -234,8 +234,15 @@ class MsgView {
234
234
  allStrings() {
235
235
  const segment = this.segment;
236
236
  const range = [];
237
- for (let i = segment.startPosition; i <= segment.endPosition; ++i) {
238
- range[range.length] = i;
237
+ if (segment.segmentView) {
238
+ for (const tp of segment.segmentView.tags) {
239
+ range[range.length] = tp.position;
240
+ }
241
+ }
242
+ else {
243
+ for (let i = segment.startPosition; i <= segment.endPosition; ++i) {
244
+ range[range.length] = i;
245
+ }
239
246
  }
240
247
  return range.map((i) => this.stringAtPosition(i));
241
248
  }
@@ -334,8 +341,14 @@ class MsgView {
334
341
  let forwards = this.sortedTagPosForwards;
335
342
  if (!forwards) {
336
343
  const segment = this.segment;
337
- forwards = this.sortedTagPosForwards = this.structure.tags.tagPos.slice(segment.startPosition, segment.endPosition + 1);
338
- forwards.sort(tag_pos_1.TagPos.compare);
344
+ if (segment.segmentView) {
345
+ forwards = this.sortedTagPosForwards = segment.segmentView.tags.slice();
346
+ forwards.sort(tag_pos_1.TagPos.compare);
347
+ }
348
+ else {
349
+ forwards = this.sortedTagPosForwards = this.structure.tags.tagPos.slice(segment.startPosition, segment.endPosition + 1);
350
+ forwards.sort(tag_pos_1.TagPos.compare);
351
+ }
339
352
  this.sortedTagPosBackwards = forwards.slice().reverse();
340
353
  }
341
354
  return tag_pos_1.TagPos.binarySearch(forwards, tag);
@@ -1 +1 @@
1
- {"version":3,"file":"msg-view.js","sourceRoot":"","sources":["../../src/buffer/msg-view.ts"],"names":[],"mappings":"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","sourcesContent":["import { TagPos } from './tag/tag-pos'\nimport { SegmentDescription } from './segment/segment-description'\nimport { Structure } from './structure'\nimport { Tags } from './tag/tags'\nimport {\n ContainedComponentField,\n ContainedField,\n IContainedSet,\n ContainedGroupField,\n ContainedSimpleField\n} from '../dictionary/contained'\nimport { SetReduce } from '../dictionary'\nimport { ILooseObject } from '../collections/collection'\nimport { ElasticBuffer } from './elastic-buffer'\nimport { FixDefinitions, GroupFieldDefinition, SimpleFieldDefinition } from '../dictionary/definition'\nimport { ITypeDispatcher } from '../dictionary/type-dispatcher'\nimport { ContainedSetType } from '../dictionary/contained-set-type'\n\nexport abstract class MsgView {\n protected sortedTagPosForwards: TagPos[]\n protected sortedTagPosBackwards: TagPos[]\n private readonly reducer: SetReduce<ILooseObject> = new SetReduce<ILooseObject>()\n\n protected constructor (public readonly definitions: FixDefinitions, public readonly segment: SegmentDescription, public readonly structure: Structure | null) {\n }\n\n protected static asVerbose = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const newLine = require('os').EOL\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]${newLine}\\t${field.description ?? ''}${newLine}${newLine}`\n } else {\n desc = `${val}${newLine}t${field.description ?? ''}${newLine}${newLine}`\n }\n } else {\n name = 'unknown'\n desc = 'na'\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}`\n }\n\n protected static asToken = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const perLine: number = 2\n const newLine = require('os').EOL\n // [280] 814 (ApplQueueResolution) = 2[OverlayLast][281] 10 (CheckSum) = 80\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]`\n } else {\n desc = `${val}`\n }\n } else {\n desc = `${val}`\n name = 'unknown'\n }\n let delimiter: string\n if (i === 1 || (i < count && i % perLine - 1 === 0)) {\n delimiter = newLine\n } else {\n delimiter = i < count ? ', ' : ''\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}${delimiter}`\n }\n\n // return list of any tags parsed that are not valid\n public invalid (): number[] {\n const invalidTags: number[] = []\n const set = this.segment.set\n if (set == null) return []\n const tags = this.structure?.tags ?? null\n if (tags == null) return []\n for (let i = 0; i < tags.nextTagPos; ++i) {\n const tag = tags.tagPos[i].tag\n if (tag <= 0 || !set.containedTag[tag]) {\n invalidTags[invalidTags.length] = tag\n }\n }\n return invalidTags\n }\n\n // list of tags that must be present\n public missing (): number[] {\n if (this.segment == null) return []\n if (this.segment.set == null) return []\n return this.missingRequired(this.segment.set, [])\n }\n\n /**\n * does this view contain this tag\n * @param tagOrName the name or tag of field to check 8 or BeginString\n */\n public contains (tagOrName: number | string): boolean {\n const tag: number = this.resolveTag(tagOrName)\n const position: number = this.getPosition(tag)\n return position >= 0\n }\n\n /**\n * if this view represents a repeated group then return a sub view representing\n * this instance of repeated group.\n * @param i the index to return i.e. 0 is first within repeated group\n */\n public getGroupInstance (i: number): MsgView | null {\n const instance: SegmentDescription | null = this.segment?.getInstance(i)\n if (!instance) {\n return null\n }\n return this.create(instance)\n }\n\n public getUndefined (): SegmentDescription | SegmentDescription[] | null {\n return this.structure?.layout['.undefined']\n }\n\n public undefinedForMsg (): string | null {\n let msg: string | null = null\n const undefinedTags = this.getUndefined()\n if (undefinedTags) {\n if (Array.isArray(undefinedTags)) {\n msg = 'undefined tags = ' + undefinedTags.map((e: SegmentDescription) => e.startTag.toString()).join(', ')\n } else {\n msg = `undefined tag = ${undefinedTags.startTag}`\n }\n }\n return msg\n }\n\n /**\n * if this view represents a repeated group then return number\n * of repeated instances within this view\n */\n public groupCount (): number {\n const positions = this.segment.delimiterPositions\n return positions ? positions.length : 0\n }\n\n /**\n * regardless of how this type is represented in data dictionary,\n * return its value as a string.\n * @param tagOrName name or tag to return 8 or BeginString\n */\n public getString (tagOrName: number | string): string | null {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const position: number = this.getPosition(tag)\n if (position < 0) {\n return null\n }\n return this.stringAtPosition(position)\n }\n\n /**\n * for a repeated group, one field may be repeted across each instance of a component\n * return all values for a specified field as array of strings\n * @param tagOrName the name of the repeated field to fetch\n */\n public getStrings (tagOrName: number | string | null = null): Array<(string | null)> | null {\n if (!tagOrName) {\n return this.allStrings()\n }\n tagOrName = tagOrName || -1\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const positions: number[] = this.getPositions(tag)\n if (positions == null) {\n return null\n }\n return positions.map((position: number) => {\n return this.stringAtPosition(position)\n })\n }\n\n /**\n * returns typed value of a sinple field within this view\n * @param tagOrName the name or tag of required field e.g. 8, BeginString\n */\n public getTyped (tagOrName: number | string): (boolean | string | number | Date | Buffer | null) {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const field: SimpleFieldDefinition | null = this.definitions.tagToSimple[tag] ?? null\n if (field == null) {\n return null\n }\n return this.toTyped(field)\n }\n\n /**\n * use a varargs list of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrNames list of tags e.g. 'BeginString', 'BodyLength', ...\n */\n public getTypedList (...tagOrNames: Array<number | string>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrNames.map((s) => this.getTyped(s))\n }\n\n /**\n * use an array of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrName the list of params as array ['BeginString','BodyLength', 'MsgType']\n */\n public getTypedTags (tagOrName: Array<string | number>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrName.map((s) => this.getTyped(s))\n }\n\n /**\n * produce an object representation of the view which when coupled with its\n * interface (generated against the same dictionary source) will allow easy\n * navigation of the object where a group is resolved to an array and simple\n * fields are properties. This is relatively expensive operation as every\n * field is fully resolved regardless of depth i.e. all groups and compoennts\n * are fully resolved.\n */\n public toObject (): ILooseObject | ILooseObject[] | null {\n const segment: SegmentDescription = this.segment\n if (segment.set == null) return null\n if (segment.delimiterTag) {\n switch (segment.set.type) {\n case ContainedSetType.Group: {\n return this.asInstances((segment.set as GroupFieldDefinition).name)\n }\n case ContainedSetType.Msg: {\n // this is a batch of messages\n const hdrView = this.getView('Hdr')\n const batch: ILooseObject = {}\n if (hdrView) {\n const name = hdrView.segment.set?.name ?? 'na'\n batch[name] = hdrView.toObject()\n }\n batch[segment.name] = this.asInstances(segment.name)\n return batch\n }\n }\n }\n return this.asLoose(segment.set)\n }\n\n /**\n * easy human-readable format showing each field, its position, value and resolved\n * enum.\n */\n public toString (): string {\n return this.stringify(MsgView.asToken)\n }\n\n public toVerbose (): string {\n return this.stringify(MsgView.asVerbose)\n }\n\n /**\n * a string in JSON format representing this view as an object\n */\n public toJson (): string {\n return JSON.stringify(this.toObject(), null, 4)\n }\n\n public getView (name: string): MsgView | null {\n const parts: string[] = name.split('.')\n const reducer = (a: MsgView, current: string): MsgView | null => {\n if (!a) {\n return a\n }\n const structure = a.structure\n const singleton: SegmentDescription | null = structure?.firstContainedWithin(current, a.segment) ?? null\n if (singleton) {\n return a.create(singleton)\n }\n // is this a full name where abbreviation exists\n const component: ContainedField | null = a.segment.set?.localNameToField.get(current) ?? null\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (component) {\n const abbreviated: SegmentDescription | null = structure?.firstContainedWithin(component.name, a.segment) ?? null\n if (abbreviated) {\n return a.create(abbreviated)\n }\n }\n return null\n }\n return parts.reduce<MsgView | null>(reducer, this)\n }\n\n public abstract checksum (): number\n\n public abstract clone (): MsgView\n\n protected abstract create (singleton: SegmentDescription): MsgView\n\n protected abstract stringAtPosition (position: number): string | null\n\n protected abstract toTyped (field: SimpleFieldDefinition): boolean | string | number | Date | Buffer | null\n\n protected resolveTag (tagOrName: number | string): number {\n let tag: number\n const set = this.segment.set\n if (typeof (tagOrName) === 'string') {\n if (set == null) return 0\n const cf = set.simple.get(tagOrName)\n const f: SimpleFieldDefinition | null = cf ? cf.definition : this.definitions.simple.get(tagOrName) ?? null\n if (f == null) {\n return -1\n }\n tag = f.tag\n } else {\n tag = tagOrName\n }\n return tag\n }\n\n // fetch all positions of a particular tag.\n protected getPositions (tag: number): number[] {\n const forwards: TagPos[] = this.sortedTagPosForwards\n const backwards: TagPos[] = this.sortedTagPosBackwards\n const position: number = this.binarySearch(tag)\n if (position < 0) {\n return []\n }\n\n const count: number = forwards.length\n const last: number = count - 1\n let end: number = position\n while (end <= last) {\n if (tag !== forwards[end].tag) {\n break\n }\n ++end\n }\n // avoid backtracking over an array by scan forwards on a reversed copy\n let start: number = last - position\n while (start <= last) {\n if (tag !== backwards[start].tag) {\n break\n }\n ++start\n }\n const begin: number = last - (start - 1)\n const len: number = end - begin\n const positions: number[] = new Array(len)\n for (let i: number = begin; i < end; ++i) {\n positions[i - begin] = forwards[i].position\n }\n return positions\n }\n\n protected getPosition (tag: number): number {\n const pos: number = this.binarySearch(tag)\n if (pos >= 0) {\n return this.sortedTagPosForwards[pos].position\n } else {\n return -1\n }\n }\n\n private allStrings (): Array<(string | null)> {\n const segment: SegmentDescription = this.segment\n const range: number[] = []\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n range[range.length] = i\n }\n return range.map((i: number) => this.stringAtPosition(i))\n }\n\n private asInstances (name: string): Array<ILooseObject | null> | null {\n const groupView: MsgView | null = this.getView(name)\n if (groupView == null) {\n return null\n }\n const groupArray = new Array<ILooseObject | null>(groupView.groupCount())\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n groupArray[j] = instance?.toObject() ?? null\n }\n return groupArray\n }\n\n private asLoose (def: IContainedSet): ILooseObject {\n // eslint-disable-next-line\n return this.reducer.reduce(def, {\n group: (a: ILooseObject, field: ContainedGroupField) => { this.asLooseGroup(a, field) },\n simple: (a: ILooseObject, field: ContainedSimpleField) => { this.asLooseSimple(a, field) },\n component: (a: ILooseObject, field: ContainedComponentField) => { this.asLooseComponent(a, field) }\n } as ITypeDispatcher<ILooseObject>, def.localAttribute.reduce<ILooseObject>((a: ILooseObject, sf: ContainedSimpleField) => {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n a[def.name] = this.toTyped(def)\n }\n return a\n }, {}))\n }\n\n private missingRequired (def: IContainedSet, tags: number []): number[] {\n const reducer = new SetReduce<number[]>()\n const dispatcher: ITypeDispatcher<number[]> = {\n group: (a: number[], field: ContainedGroupField) => { this.missingGroup(def, field, a) },\n simple: (a: number[], field: ContainedSimpleField) => { this.missingSimple(field, a) },\n component: (a: number[], field: ContainedComponentField) => { this.missingComponent(field, a) }\n }\n return reducer.reduce(def, dispatcher, tags)\n }\n\n private missingSimple (sf: ContainedSimpleField, a: number[]): void {\n if (sf.required && this.getPosition(sf.definition.tag) < 0) {\n a.push(sf.definition.tag)\n }\n }\n\n private missingComponent (cf: ContainedComponentField, a: number[]): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n view.missingRequired(cf.definition, a)\n }\n }\n\n private missingGroup (def: IContainedSet, gf: ContainedGroupField, tags: number []): void {\n const name = gf.definition.noOfField ? gf.definition.noOfField.name : def.name\n const groupView: MsgView | null = this.getView(name) ?? this.getView(gf.definition.name)\n if (groupView == null) {\n return\n }\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n instance?.missingRequired(gf.definition, tags)\n }\n }\n\n private asLooseComponent (a: ILooseObject, cf: ContainedComponentField): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n const component = view.toObject()\n if (component) {\n a[cf.definition.name] = component\n }\n }\n }\n\n private asLooseSimple (a: ILooseObject, sf: ContainedSimpleField): void {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n const asSimple: boolean | string | number | Date | Buffer | null = this.toTyped(def)\n if (asSimple != null) { // beware, may be false value\n a[sf.name] = asSimple\n }\n }\n }\n\n private asLooseGroup (a: ILooseObject, gf: ContainedGroupField): void {\n const def = gf.definition\n const name = def.noOfField ? def.noOfField.name : def.name\n const instances: ILooseObject | null = this.asInstances(name) ?? this.asInstances(def.name)\n if (instances) {\n a[def.name] = instances\n }\n }\n\n private binarySearch (tag: number): number {\n if (this.structure == null) return -1\n let forwards = this.sortedTagPosForwards\n if (!forwards) {\n const segment = this.segment\n forwards = this.sortedTagPosForwards = this.structure.tags.tagPos.slice(segment.startPosition, segment.endPosition + 1)\n forwards.sort(TagPos.compare)\n this.sortedTagPosBackwards = forwards.slice().reverse()\n }\n return TagPos.binarySearch(forwards, tag)\n }\n\n private stringify (getToken: (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos) => string): string {\n const structure = this.structure\n const buffer: ElasticBuffer = new ElasticBuffer()\n const segment: SegmentDescription = this.segment\n if (structure == null) return ''\n const tags: Tags = structure.tags\n const count: number = segment.endPosition - segment.startPosition\n const simple: Map<string, SimpleFieldDefinition> = this.definitions.simple\n\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n const tagPos: TagPos = tags.tagPos[i]\n const field: SimpleFieldDefinition | undefined = simple.get(tagPos.tag.toString())\n const val: string | null = this.stringAtPosition(i) ?? ''\n // [0] 8 (BeginString) = FIX4.4\n const token = field ? getToken(field, val, i - segment.startPosition, count, tagPos) : `[${i}] ${tagPos.tag} (unknown) = ${val}, `\n buffer.writeString(token)\n }\n\n return buffer.toString()\n }\n}\n"]}
1
+ {"version":3,"file":"msg-view.js","sourceRoot":"","sources":["../../src/buffer/msg-view.ts"],"names":[],"mappings":";;;AAAA,2CAAsC;AAWtC,8CAAyC;AAEzC,qDAAgD;AAGhD,yEAAmE;AAEnE,MAAsB,OAAO;IAK3B,YAAuC,WAA2B,EAAkB,OAA2B,EAAkB,SAA2B;QAArH,gBAAW,GAAX,WAAW,CAAgB;QAAkB,YAAO,GAAP,OAAO,CAAoB;QAAkB,cAAS,GAAT,SAAS,CAAkB;QAF3I,YAAO,GAA4B,IAAI,sBAAS,EAAgB,CAAA;IAGjF,CAAC;IA+CM,OAAO;;QACZ,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;QAC5B,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QAC1B,MAAM,IAAI,GAAG,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,IAAI,mCAAI,IAAI,CAAA;QACzC,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YAC9B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA;YACvC,CAAC;QACH,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAGM,OAAO;QACZ,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QACnC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QACvC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACnD,CAAC;IAMM,QAAQ,CAAE,SAA0B;QACzC,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,OAAO,QAAQ,IAAI,CAAC,CAAA;IACtB,CAAC;IAOM,gBAAgB,CAAE,CAAS;;QAChC,MAAM,QAAQ,GAA8B,MAAA,IAAI,CAAC,OAAO,0CAAE,WAAW,CAAC,CAAC,CAAC,CAAA;QACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;IAEM,YAAY;;QACjB,OAAO,MAAA,IAAI,CAAC,SAAS,0CAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAC7C,CAAC;IAEM,eAAe;QACpB,IAAI,GAAG,GAAkB,IAAI,CAAA;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;QACzC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,GAAG,GAAG,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5G,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,mBAAmB,aAAa,CAAC,QAAQ,EAAE,CAAA;YACnD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAMM,UAAU;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAA;QACjD,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACzC,CAAC;IAOM,SAAS,CAAE,SAA0B;QAC1C,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAOM,UAAU,CAAE,YAAoC,IAAI;QACzD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;QAC1B,CAAC;QACD,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC,CAAA;QAC3B,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,SAAS,GAAa,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAClD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAE,EAAE;YACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC;IAMM,QAAQ,CAAE,SAA0B;;QACzC,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,GAAiC,MAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAA;QACrF,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAMM,YAAY,CAAE,GAAG,UAAkC;QACxD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;IAMM,YAAY,CAAE,SAAiC;QACpD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;IAUM,QAAQ;;QACb,MAAM,OAAO,GAAuB,IAAI,CAAC,OAAO,CAAA;QAChD,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACzB,KAAK,qCAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC5B,OAAO,IAAI,CAAC,WAAW,CAAE,OAAO,CAAC,GAA4B,CAAC,IAAI,CAAC,CAAA;gBACrE,CAAC;gBACD,KAAK,qCAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;oBAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;oBACnC,MAAM,KAAK,GAAiB,EAAE,CAAA;oBAC9B,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,IAAI,GAAG,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,GAAG,0CAAE,IAAI,mCAAI,IAAI,CAAA;wBAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;oBAClC,CAAC;oBACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;oBACpD,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAClC,CAAC;IAMM,QAAQ;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAKM,MAAM;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACjD,CAAC;IAEM,OAAO,CAAE,IAAY;QAC1B,MAAM,KAAK,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,OAAe,EAAkB,EAAE;;YAC9D,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,CAAA;YACV,CAAC;YACD,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAA;YAC7B,MAAM,SAAS,GAA8B,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,mCAAI,IAAI,CAAA;YACxG,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC5B,CAAC;YAED,MAAM,SAAS,GAA0B,MAAA,MAAA,CAAC,CAAC,OAAO,CAAC,GAAG,0CAAE,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,mCAAI,IAAI,CAAA;YAE7F,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,WAAW,GAA8B,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,mCAAI,IAAI,CAAA;gBACjH,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;gBAC9B,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC,CAAA;QACD,OAAO,KAAK,CAAC,MAAM,CAAiB,OAAO,EAAE,IAAI,CAAC,CAAA;IACpD,CAAC;IAYS,UAAU,CAAE,SAA0B;;QAC9C,IAAI,GAAW,CAAA;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;QAC5B,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,GAAG,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAA;YACzB,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACpC,MAAM,CAAC,GAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAI,IAAI,CAAA;YAC3G,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,CAAC,CAAA;YACX,CAAC;YACD,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACb,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,SAAS,CAAA;QACjB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAGS,YAAY,CAAE,GAAW;QACjC,MAAM,QAAQ,GAAa,IAAI,CAAC,oBAAoB,CAAA;QACpD,MAAM,SAAS,GAAa,IAAI,CAAC,qBAAqB,CAAA;QACtD,MAAM,QAAQ,GAAW,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC/C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,KAAK,GAAW,QAAQ,CAAC,MAAM,CAAA;QACrC,MAAM,IAAI,GAAW,KAAK,GAAG,CAAC,CAAA;QAC9B,IAAI,GAAG,GAAW,QAAQ,CAAA;QAC1B,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;YACnB,IAAI,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC9B,MAAK;YACP,CAAC;YACD,EAAE,GAAG,CAAA;QACP,CAAC;QAED,IAAI,KAAK,GAAW,IAAI,GAAG,QAAQ,CAAA;QACnC,OAAO,KAAK,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;gBACjC,MAAK;YACP,CAAC;YACD,EAAE,KAAK,CAAA;QACT,CAAC;QACD,MAAM,KAAK,GAAW,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QACxC,MAAM,GAAG,GAAW,GAAG,GAAG,KAAK,CAAA;QAC/B,MAAM,SAAS,GAAa,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;QAC1C,KAAK,IAAI,CAAC,GAAW,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC7C,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAES,WAAW,CAAE,GAAW;QAChC,MAAM,GAAG,GAAW,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,CAAA;QACX,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,MAAM,OAAO,GAAuB,IAAI,CAAC,OAAO,CAAA;QAChD,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC1C,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAA;YACnC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAW,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1E,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;IAEO,WAAW,CAAE,IAAY;;QAC/B,MAAM,SAAS,GAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACpD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,KAAK,CAAsB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAA;QACzE,MAAM,KAAK,GAAW,SAAS,CAAC,UAAU,EAAE,CAAA;QAC5C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAmB,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;YAC9D,UAAU,CAAC,CAAC,CAAC,GAAG,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,EAAE,mCAAI,IAAI,CAAA;QAC9C,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAEO,OAAO,CAAE,GAAkB;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;YAC9B,KAAK,EAAE,CAAC,CAAe,EAAE,KAA0B,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;YACvF,MAAM,EAAE,CAAC,CAAe,EAAE,KAA2B,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;YAC1F,SAAS,EAAE,CAAC,CAAe,EAAE,KAA8B,EAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;SACnE,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,CAAe,CAAC,CAAe,EAAE,EAAwB,EAAE,EAAE;YACxH,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAA;YACzB,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACjC,CAAC;YACD,OAAO,CAAC,CAAA;QACV,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IACT,CAAC;IAEO,eAAe,CAAE,GAAkB,EAAE,IAAe;QAC1D,MAAM,OAAO,GAAG,IAAI,sBAAS,EAAY,CAAA;QACzC,MAAM,UAAU,GAA8B;YAC5C,KAAK,EAAE,CAAC,CAAW,EAAE,KAA0B,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;YACxF,MAAM,EAAE,CAAC,CAAW,EAAE,KAA2B,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;YACtF,SAAS,EAAE,CAAC,CAAW,EAAE,KAA8B,EAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;SAChG,CAAA;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC;IAEO,aAAa,CAAE,EAAwB,EAAE,CAAW;QAC1D,IAAI,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAE,EAA2B,EAAE,CAAW;QAChE,MAAM,IAAI,GAAmB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;IAEO,YAAY,CAAE,GAAkB,EAAE,EAAuB,EAAE,IAAe;;QAChF,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;QAC9E,MAAM,SAAS,GAAmB,MAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxF,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAW,SAAS,CAAC,UAAU,EAAE,CAAA;QAC5C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAmB,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;YAC9D,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAE,CAAe,EAAE,EAA2B;QACpE,MAAM,IAAI,GAAmB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YACjC,IAAI,SAAS,EAAE,CAAC;gBACd,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,aAAa,CAAE,CAAe,EAAE,EAAwB;QAC9D,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAA;QACzB,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAqD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACpF,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAE,CAAe,EAAE,EAAuB;;QAC5D,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAA;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;QAC1D,MAAM,SAAS,GAAwB,MAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3F,IAAI,SAAS,EAAE,CAAC;YACd,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;QACzB,CAAC;IACH,CAAC;IAEO,YAAY,CAAE,GAAW;QAC/B,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC,CAAA;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAA;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;YAC5B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBAExB,QAAQ,GAAG,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;gBACvE,QAAQ,CAAC,IAAI,CAAC,gBAAM,CAAC,OAAO,CAAC,CAAA;YAC/B,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;gBACvH,QAAQ,CAAC,IAAI,CAAC,gBAAM,CAAC,OAAO,CAAC,CAAA;YAC/B,CAAC;YACD,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAA;QACzD,CAAC;QACD,OAAO,gBAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAEO,SAAS,CAAE,QAAqG;;QACtH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,MAAM,GAAkB,IAAI,8BAAa,EAAE,CAAA;QACjD,MAAM,OAAO,GAAuB,IAAI,CAAC,OAAO,CAAA;QAChD,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QAChC,MAAM,IAAI,GAAS,SAAS,CAAC,IAAI,CAAA;QACjC,MAAM,KAAK,GAAW,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,aAAa,CAAA;QACjE,MAAM,MAAM,GAAuC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAE1E,KAAK,IAAI,CAAC,GAAW,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAW,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,KAAK,GAAsC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;YAClF,MAAM,GAAG,GAAkB,MAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAA;YAEzD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAA;YAClI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;IAC1B,CAAC;;AA3eH,0BA4eC;AApekB,iBAAS,GAAG,CAAC,KAA4B,EAAE,GAAW,EAAE,CAAS,EAAE,KAAa,EAAE,EAAU,EAAU,EAAE;;IACvH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAA;IACjC,IAAI,IAAY,CAAA;IAChB,IAAI,IAAY,CAAA;IAChB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAA;QAC9B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,IAAI,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,MAAA,KAAK,CAAC,WAAW,mCAAI,EAAE,GAAG,OAAO,GAAG,OAAO,EAAE,CAAA;QACtG,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,GAAG,GAAG,OAAO,IAAI,MAAA,KAAK,CAAC,WAAW,mCAAI,EAAE,GAAG,OAAO,GAAG,OAAO,EAAE,CAAA;QAC1E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,SAAS,CAAA;QAChB,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,EAAE,CAAA;AAC/C,CAAC,AAhByB,CAgBzB;AAEgB,eAAO,GAAG,CAAC,KAA4B,EAAE,GAAW,EAAE,CAAS,EAAE,KAAa,EAAE,EAAU,EAAU,EAAE;IACrH,MAAM,OAAO,GAAW,CAAC,CAAA;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAA;IAEjC,IAAI,IAAY,CAAA;IAChB,IAAI,IAAY,CAAA;IAChB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAA;QAC9B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,IAAI,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,GAAG,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,GAAG,EAAE,CAAA;QACf,IAAI,GAAG,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,SAAiB,CAAA;IACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACpD,SAAS,GAAG,OAAO,CAAA;IACrB,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,GAAG,SAAS,EAAE,CAAA;AAC3D,CAAC,AAxBuB,CAwBvB","sourcesContent":["import { TagPos } from './tag/tag-pos'\nimport { SegmentDescription } from './segment/segment-description'\nimport { Structure } from './structure'\nimport { Tags } from './tag/tags'\nimport {\n ContainedComponentField,\n ContainedField,\n IContainedSet,\n ContainedGroupField,\n ContainedSimpleField\n} from '../dictionary/contained'\nimport { SetReduce } from '../dictionary'\nimport { ILooseObject } from '../collections/collection'\nimport { ElasticBuffer } from './elastic-buffer'\nimport { FixDefinitions, GroupFieldDefinition, SimpleFieldDefinition } from '../dictionary/definition'\nimport { ITypeDispatcher } from '../dictionary/type-dispatcher'\nimport { ContainedSetType } from '../dictionary/contained-set-type'\n\nexport abstract class MsgView {\n protected sortedTagPosForwards: TagPos[]\n protected sortedTagPosBackwards: TagPos[]\n private readonly reducer: SetReduce<ILooseObject> = new SetReduce<ILooseObject>()\n\n protected constructor (public readonly definitions: FixDefinitions, public readonly segment: SegmentDescription, public readonly structure: Structure | null) {\n }\n\n protected static asVerbose = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const newLine = require('os').EOL\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]${newLine}\\t${field.description ?? ''}${newLine}${newLine}`\n } else {\n desc = `${val}${newLine}t${field.description ?? ''}${newLine}${newLine}`\n }\n } else {\n name = 'unknown'\n desc = 'na'\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}`\n }\n\n protected static asToken = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const perLine: number = 2\n const newLine = require('os').EOL\n // [280] 814 (ApplQueueResolution) = 2[OverlayLast][281] 10 (CheckSum) = 80\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]`\n } else {\n desc = `${val}`\n }\n } else {\n desc = `${val}`\n name = 'unknown'\n }\n let delimiter: string\n if (i === 1 || (i < count && i % perLine - 1 === 0)) {\n delimiter = newLine\n } else {\n delimiter = i < count ? ', ' : ''\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}${delimiter}`\n }\n\n // return list of any tags parsed that are not valid\n public invalid (): number[] {\n const invalidTags: number[] = []\n const set = this.segment.set\n if (set == null) return []\n const tags = this.structure?.tags ?? null\n if (tags == null) return []\n for (let i = 0; i < tags.nextTagPos; ++i) {\n const tag = tags.tagPos[i].tag\n if (tag <= 0 || !set.containedTag[tag]) {\n invalidTags[invalidTags.length] = tag\n }\n }\n return invalidTags\n }\n\n // list of tags that must be present\n public missing (): number[] {\n if (this.segment == null) return []\n if (this.segment.set == null) return []\n return this.missingRequired(this.segment.set, [])\n }\n\n /**\n * does this view contain this tag\n * @param tagOrName the name or tag of field to check 8 or BeginString\n */\n public contains (tagOrName: number | string): boolean {\n const tag: number = this.resolveTag(tagOrName)\n const position: number = this.getPosition(tag)\n return position >= 0\n }\n\n /**\n * if this view represents a repeated group then return a sub view representing\n * this instance of repeated group.\n * @param i the index to return i.e. 0 is first within repeated group\n */\n public getGroupInstance (i: number): MsgView | null {\n const instance: SegmentDescription | null = this.segment?.getInstance(i)\n if (!instance) {\n return null\n }\n return this.create(instance)\n }\n\n public getUndefined (): SegmentDescription | SegmentDescription[] | null {\n return this.structure?.layout['.undefined']\n }\n\n public undefinedForMsg (): string | null {\n let msg: string | null = null\n const undefinedTags = this.getUndefined()\n if (undefinedTags) {\n if (Array.isArray(undefinedTags)) {\n msg = 'undefined tags = ' + undefinedTags.map((e: SegmentDescription) => e.startTag.toString()).join(', ')\n } else {\n msg = `undefined tag = ${undefinedTags.startTag}`\n }\n }\n return msg\n }\n\n /**\n * if this view represents a repeated group then return number\n * of repeated instances within this view\n */\n public groupCount (): number {\n const positions = this.segment.delimiterPositions\n return positions ? positions.length : 0\n }\n\n /**\n * regardless of how this type is represented in data dictionary,\n * return its value as a string.\n * @param tagOrName name or tag to return 8 or BeginString\n */\n public getString (tagOrName: number | string): string | null {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const position: number = this.getPosition(tag)\n if (position < 0) {\n return null\n }\n return this.stringAtPosition(position)\n }\n\n /**\n * for a repeated group, one field may be repeted across each instance of a component\n * return all values for a specified field as array of strings\n * @param tagOrName the name of the repeated field to fetch\n */\n public getStrings (tagOrName: number | string | null = null): Array<(string | null)> | null {\n if (!tagOrName) {\n return this.allStrings()\n }\n tagOrName = tagOrName || -1\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const positions: number[] = this.getPositions(tag)\n if (positions == null) {\n return null\n }\n return positions.map((position: number) => {\n return this.stringAtPosition(position)\n })\n }\n\n /**\n * returns typed value of a sinple field within this view\n * @param tagOrName the name or tag of required field e.g. 8, BeginString\n */\n public getTyped (tagOrName: number | string): (boolean | string | number | Date | Buffer | null) {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const field: SimpleFieldDefinition | null = this.definitions.tagToSimple[tag] ?? null\n if (field == null) {\n return null\n }\n return this.toTyped(field)\n }\n\n /**\n * use a varargs list of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrNames list of tags e.g. 'BeginString', 'BodyLength', ...\n */\n public getTypedList (...tagOrNames: Array<number | string>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrNames.map((s) => this.getTyped(s))\n }\n\n /**\n * use an array of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrName the list of params as array ['BeginString','BodyLength', 'MsgType']\n */\n public getTypedTags (tagOrName: Array<string | number>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrName.map((s) => this.getTyped(s))\n }\n\n /**\n * produce an object representation of the view which when coupled with its\n * interface (generated against the same dictionary source) will allow easy\n * navigation of the object where a group is resolved to an array and simple\n * fields are properties. This is relatively expensive operation as every\n * field is fully resolved regardless of depth i.e. all groups and compoennts\n * are fully resolved.\n */\n public toObject (): ILooseObject | ILooseObject[] | null {\n const segment: SegmentDescription = this.segment\n if (segment.set == null) return null\n if (segment.delimiterTag) {\n switch (segment.set.type) {\n case ContainedSetType.Group: {\n return this.asInstances((segment.set as GroupFieldDefinition).name)\n }\n case ContainedSetType.Msg: {\n // this is a batch of messages\n const hdrView = this.getView('Hdr')\n const batch: ILooseObject = {}\n if (hdrView) {\n const name = hdrView.segment.set?.name ?? 'na'\n batch[name] = hdrView.toObject()\n }\n batch[segment.name] = this.asInstances(segment.name)\n return batch\n }\n }\n }\n return this.asLoose(segment.set)\n }\n\n /**\n * easy human-readable format showing each field, its position, value and resolved\n * enum.\n */\n public toString (): string {\n return this.stringify(MsgView.asToken)\n }\n\n public toVerbose (): string {\n return this.stringify(MsgView.asVerbose)\n }\n\n /**\n * a string in JSON format representing this view as an object\n */\n public toJson (): string {\n return JSON.stringify(this.toObject(), null, 4)\n }\n\n public getView (name: string): MsgView | null {\n const parts: string[] = name.split('.')\n const reducer = (a: MsgView, current: string): MsgView | null => {\n if (!a) {\n return a\n }\n const structure = a.structure\n const singleton: SegmentDescription | null = structure?.firstContainedWithin(current, a.segment) ?? null\n if (singleton) {\n return a.create(singleton)\n }\n // is this a full name where abbreviation exists\n const component: ContainedField | null = a.segment.set?.localNameToField.get(current) ?? null\n\n if (component) {\n const abbreviated: SegmentDescription | null = structure?.firstContainedWithin(component.name, a.segment) ?? null\n if (abbreviated) {\n return a.create(abbreviated)\n }\n }\n return null\n }\n return parts.reduce<MsgView | null>(reducer, this)\n }\n\n public abstract checksum (): number\n\n public abstract clone (): MsgView\n\n protected abstract create (singleton: SegmentDescription): MsgView\n\n protected abstract stringAtPosition (position: number): string | null\n\n protected abstract toTyped (field: SimpleFieldDefinition): boolean | string | number | Date | Buffer | null\n\n protected resolveTag (tagOrName: number | string): number {\n let tag: number\n const set = this.segment.set\n if (typeof (tagOrName) === 'string') {\n if (set == null) return 0\n const cf = set.simple.get(tagOrName)\n const f: SimpleFieldDefinition | null = cf ? cf.definition : this.definitions.simple.get(tagOrName) ?? null\n if (f == null) {\n return -1\n }\n tag = f.tag\n } else {\n tag = tagOrName\n }\n return tag\n }\n\n // fetch all positions of a particular tag.\n protected getPositions (tag: number): number[] {\n const forwards: TagPos[] = this.sortedTagPosForwards\n const backwards: TagPos[] = this.sortedTagPosBackwards\n const position: number = this.binarySearch(tag)\n if (position < 0) {\n return []\n }\n\n const count: number = forwards.length\n const last: number = count - 1\n let end: number = position\n while (end <= last) {\n if (tag !== forwards[end].tag) {\n break\n }\n ++end\n }\n // avoid backtracking over an array by scan forwards on a reversed copy\n let start: number = last - position\n while (start <= last) {\n if (tag !== backwards[start].tag) {\n break\n }\n ++start\n }\n const begin: number = last - (start - 1)\n const len: number = end - begin\n const positions: number[] = new Array(len)\n for (let i: number = begin; i < end; ++i) {\n positions[i - begin] = forwards[i].position\n }\n return positions\n }\n\n protected getPosition (tag: number): number {\n const pos: number = this.binarySearch(tag)\n if (pos >= 0) {\n return this.sortedTagPosForwards[pos].position\n } else {\n return -1\n }\n }\n\n private allStrings (): Array<(string | null)> {\n const segment: SegmentDescription = this.segment\n const range: number[] = []\n if (segment.segmentView) {\n for (const tp of segment.segmentView.tags) {\n range[range.length] = tp.position\n }\n } else {\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n range[range.length] = i\n }\n }\n return range.map((i: number) => this.stringAtPosition(i))\n }\n\n private asInstances (name: string): Array<ILooseObject | null> | null {\n const groupView: MsgView | null = this.getView(name)\n if (groupView == null) {\n return null\n }\n const groupArray = new Array<ILooseObject | null>(groupView.groupCount())\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n groupArray[j] = instance?.toObject() ?? null\n }\n return groupArray\n }\n\n private asLoose (def: IContainedSet): ILooseObject {\n\n return this.reducer.reduce(def, {\n group: (a: ILooseObject, field: ContainedGroupField) => { this.asLooseGroup(a, field) },\n simple: (a: ILooseObject, field: ContainedSimpleField) => { this.asLooseSimple(a, field) },\n component: (a: ILooseObject, field: ContainedComponentField) => { this.asLooseComponent(a, field) }\n } as ITypeDispatcher<ILooseObject>, def.localAttribute.reduce<ILooseObject>((a: ILooseObject, sf: ContainedSimpleField) => {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n a[def.name] = this.toTyped(def)\n }\n return a\n }, {}))\n }\n\n private missingRequired (def: IContainedSet, tags: number []): number[] {\n const reducer = new SetReduce<number[]>()\n const dispatcher: ITypeDispatcher<number[]> = {\n group: (a: number[], field: ContainedGroupField) => { this.missingGroup(def, field, a) },\n simple: (a: number[], field: ContainedSimpleField) => { this.missingSimple(field, a) },\n component: (a: number[], field: ContainedComponentField) => { this.missingComponent(field, a) }\n }\n return reducer.reduce(def, dispatcher, tags)\n }\n\n private missingSimple (sf: ContainedSimpleField, a: number[]): void {\n if (sf.required && this.getPosition(sf.definition.tag) < 0) {\n a.push(sf.definition.tag)\n }\n }\n\n private missingComponent (cf: ContainedComponentField, a: number[]): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n view.missingRequired(cf.definition, a)\n }\n }\n\n private missingGroup (def: IContainedSet, gf: ContainedGroupField, tags: number []): void {\n const name = gf.definition.noOfField ? gf.definition.noOfField.name : def.name\n const groupView: MsgView | null = this.getView(name) ?? this.getView(gf.definition.name)\n if (groupView == null) {\n return\n }\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n instance?.missingRequired(gf.definition, tags)\n }\n }\n\n private asLooseComponent (a: ILooseObject, cf: ContainedComponentField): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n const component = view.toObject()\n if (component) {\n a[cf.definition.name] = component\n }\n }\n }\n\n private asLooseSimple (a: ILooseObject, sf: ContainedSimpleField): void {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n const asSimple: boolean | string | number | Date | Buffer | null = this.toTyped(def)\n if (asSimple != null) { // beware, may be false value\n a[sf.name] = asSimple\n }\n }\n }\n\n private asLooseGroup (a: ILooseObject, gf: ContainedGroupField): void {\n const def = gf.definition\n const name = def.noOfField ? def.noOfField.name : def.name\n const instances: ILooseObject | null = this.asInstances(name) ?? this.asInstances(def.name)\n if (instances) {\n a[def.name] = instances\n }\n }\n\n private binarySearch (tag: number): number {\n if (this.structure == null) return -1\n let forwards = this.sortedTagPosForwards\n if (!forwards) {\n const segment = this.segment\n if (segment.segmentView) {\n // fragmented component: use the collected tags from SegmentView\n forwards = this.sortedTagPosForwards = segment.segmentView.tags.slice()\n forwards.sort(TagPos.compare)\n } else {\n forwards = this.sortedTagPosForwards = this.structure.tags.tagPos.slice(segment.startPosition, segment.endPosition + 1)\n forwards.sort(TagPos.compare)\n }\n this.sortedTagPosBackwards = forwards.slice().reverse()\n }\n return TagPos.binarySearch(forwards, tag)\n }\n\n private stringify (getToken: (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos) => string): string {\n const structure = this.structure\n const buffer: ElasticBuffer = new ElasticBuffer()\n const segment: SegmentDescription = this.segment\n if (structure == null) return ''\n const tags: Tags = structure.tags\n const count: number = segment.endPosition - segment.startPosition\n const simple: Map<string, SimpleFieldDefinition> = this.definitions.simple\n\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n const tagPos: TagPos = tags.tagPos[i]\n const field: SimpleFieldDefinition | undefined = simple.get(tagPos.tag.toString())\n const val: string | null = this.stringAtPosition(i) ?? ''\n // [0] 8 (BeginString) = FIX4.4\n const token = field ? getToken(field, val, i - segment.startPosition, count, tagPos) : `[${i}] ${tagPos.tag} (unknown) = ${val}, `\n buffer.writeString(token)\n }\n\n return buffer.toString()\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { INumericKeyed } from '../../collections/collection';
2
2
  import { ContainedField, IContainedSet } from '../../dictionary/contained';
3
3
  import { SegmentType } from './segment-type';
4
+ import { SegmentView } from './segment-view';
4
5
  export declare class SegmentDescription {
5
6
  name: string;
6
7
  startTag: number;
@@ -15,6 +16,7 @@ export declare class SegmentDescription {
15
16
  delimiterPositions: number[];
16
17
  currentField: ContainedField | null;
17
18
  containedDelimiterPositions: INumericKeyed<boolean>;
19
+ segmentView: SegmentView | null;
18
20
  constructor(name: string, startTag: number, set: IContainedSet | null, startPosition: number, depth: number, type: SegmentType);
19
21
  toString(): String;
20
22
  contains(segment: SegmentDescription): boolean;
@@ -23,5 +25,6 @@ export declare class SegmentDescription {
23
25
  addDelimiterPosition(position: number): boolean;
24
26
  setCurrentField(tag: number): void;
25
27
  groupAddDelimiter(tag: number, position: number): boolean;
28
+ addSegmentView(view: SegmentView): void;
26
29
  end(i: number, pos: number, endTag: number): void;
27
30
  }
@@ -15,6 +15,7 @@ class SegmentDescription {
15
15
  this.endTag = 0;
16
16
  this.endPosition = 0;
17
17
  this.delimiterTag = 0;
18
+ this.segmentView = null;
18
19
  }
19
20
  toString() {
20
21
  var _a;
@@ -81,6 +82,13 @@ class SegmentDescription {
81
82
  }
82
83
  return delimiter;
83
84
  }
85
+ addSegmentView(view) {
86
+ this.segmentView = view;
87
+ this.endPosition = view.endPosition;
88
+ this.startPosition = view.startPosition;
89
+ this.endTag = view.endTag;
90
+ this.startTag = view.startTag;
91
+ }
84
92
  end(i, pos, endTag) {
85
93
  this.index = i;
86
94
  this.currentField = null;
@@ -1 +1 @@
1
- {"version":3,"file":"segment-description.js","sourceRoot":"","sources":["../../../src/buffer/segment/segment-description.ts"],"names":[],"mappings":"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","sourcesContent":["import { INumericKeyed } from '../../collections/collection'\nimport { ContainedField, IContainedSet } from '../../dictionary/contained'\nimport { GroupFieldDefinition } from '../../dictionary/definition'\nimport { SegmentType } from './segment-type'\nimport { ElasticBuffer } from '../elastic-buffer'\n\nexport class SegmentDescription {\n public index: number\n public endTag: number = 0\n public endPosition: number = 0\n public delimiterTag: number = 0\n public delimiterPositions: number[]\n public currentField: ContainedField | null\n public containedDelimiterPositions: INumericKeyed<boolean>\n\n constructor (\n public name: string,\n public startTag: number,\n public set: IContainedSet | null,\n public startPosition: number,\n public readonly depth: number,\n public readonly type: SegmentType) {\n }\n\n public toString (): String {\n const buffer = new ElasticBuffer()\n buffer.writeString(`name = ${this.name}, `)\n buffer.writeString(`startTag = ${this.startTag}, `)\n buffer.writeString(`startPosition = ${this.startPosition}, `)\n buffer.writeString(`type = ${this.type}, `)\n buffer.writeString(`depth = ${this.depth}, `)\n buffer.writeString(`index = ${this.index}, `)\n buffer.writeString(`endTag = ${this.endTag}, `)\n buffer.writeString(`endPosition = ${this.endPosition}, `)\n buffer.writeString(`delimiterTag = ${this.delimiterTag}, `)\n buffer.writeString(`delimiterPositions = ${this.delimiterPositions}, `)\n buffer.writeString(`currentField = ${this.currentField}, `)\n buffer.writeString(`set = ${this.set?.keys()}`)\n return buffer.toString()\n }\n\n public contains (segment: SegmentDescription): boolean {\n return segment.startPosition >= this.startPosition && segment.endPosition <= this.endPosition\n }\n\n public getInstance (instance: number): SegmentDescription | null {\n const delimiters: number[] = this.delimiterPositions\n if (!delimiters) {\n return null\n }\n if (instance < 0 || instance >= delimiters.length) {\n return null\n }\n const start: number = delimiters[instance]\n const end: number = instance < delimiters.length - 1\n ? delimiters[instance + 1] - 1\n : this.endPosition\n const name: string = this.type === SegmentType.Batch ? this.set?.abbreviation ?? this.name : this.name ?? this.name ?? 'na'\n const d: SegmentDescription = new SegmentDescription(name, this.startTag, this.set, start, this.depth, this.type)\n d.endPosition = end\n d.endTag = this.endTag\n return d\n }\n\n public startGroup (tag: number): void {\n this.delimiterTag = tag\n this.delimiterPositions = []\n this.containedDelimiterPositions = {}\n }\n\n public addDelimiterPosition (position: number): boolean {\n if (this.containedDelimiterPositions[position]) {\n return false\n }\n this.delimiterPositions[this.delimiterPositions.length] = position\n this.containedDelimiterPositions[position] = true\n return true\n }\n\n public setCurrentField (tag: number): void {\n this.currentField = this.set?.localTag[tag] ?? this.set?.tagToField[tag] ?? null\n }\n\n public groupAddDelimiter (tag: number, position: number): boolean {\n let delimiter: boolean = false\n if (this.set instanceof GroupFieldDefinition) {\n if (this.delimiterTag && tag === this.delimiterTag) {\n delimiter = this.addDelimiterPosition(position)\n }\n }\n return delimiter\n }\n\n public end (i: number, pos: number, endTag: number): void {\n this.index = i\n this.currentField = null\n this.endPosition = pos\n this.endTag = endTag\n }\n}\n"]}
1
+ {"version":3,"file":"segment-description.js","sourceRoot":"","sources":["../../../src/buffer/segment/segment-description.ts"],"names":[],"mappings":"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","sourcesContent":["import { INumericKeyed } from '../../collections/collection'\nimport { ContainedField, IContainedSet } from '../../dictionary/contained'\nimport { GroupFieldDefinition } from '../../dictionary/definition'\nimport { SegmentType } from './segment-type'\nimport { SegmentView } from './segment-view'\nimport { ElasticBuffer } from '../elastic-buffer'\n\nexport class SegmentDescription {\n public index: number\n public endTag: number = 0\n public endPosition: number = 0\n public delimiterTag: number = 0\n public delimiterPositions: number[]\n public currentField: ContainedField | null\n public containedDelimiterPositions: INumericKeyed<boolean>\n public segmentView: SegmentView | null = null\n\n constructor (\n public name: string,\n public startTag: number,\n public set: IContainedSet | null,\n public startPosition: number,\n public readonly depth: number,\n public readonly type: SegmentType) {\n }\n\n public toString (): String {\n const buffer = new ElasticBuffer()\n buffer.writeString(`name = ${this.name}, `)\n buffer.writeString(`startTag = ${this.startTag}, `)\n buffer.writeString(`startPosition = ${this.startPosition}, `)\n buffer.writeString(`type = ${this.type}, `)\n buffer.writeString(`depth = ${this.depth}, `)\n buffer.writeString(`index = ${this.index}, `)\n buffer.writeString(`endTag = ${this.endTag}, `)\n buffer.writeString(`endPosition = ${this.endPosition}, `)\n buffer.writeString(`delimiterTag = ${this.delimiterTag}, `)\n buffer.writeString(`delimiterPositions = ${this.delimiterPositions}, `)\n buffer.writeString(`currentField = ${this.currentField}, `)\n buffer.writeString(`set = ${this.set?.keys()}`)\n return buffer.toString()\n }\n\n public contains (segment: SegmentDescription): boolean {\n return segment.startPosition >= this.startPosition && segment.endPosition <= this.endPosition\n }\n\n public getInstance (instance: number): SegmentDescription | null {\n const delimiters: number[] = this.delimiterPositions\n if (!delimiters) {\n return null\n }\n if (instance < 0 || instance >= delimiters.length) {\n return null\n }\n const start: number = delimiters[instance]\n const end: number = instance < delimiters.length - 1\n ? delimiters[instance + 1] - 1\n : this.endPosition\n const name: string = this.type === SegmentType.Batch ? this.set?.abbreviation ?? this.name : this.name ?? this.name ?? 'na'\n const d: SegmentDescription = new SegmentDescription(name, this.startTag, this.set, start, this.depth, this.type)\n d.endPosition = end\n d.endTag = this.endTag\n return d\n }\n\n public startGroup (tag: number): void {\n this.delimiterTag = tag\n this.delimiterPositions = []\n this.containedDelimiterPositions = {}\n }\n\n public addDelimiterPosition (position: number): boolean {\n if (this.containedDelimiterPositions[position]) {\n return false\n }\n this.delimiterPositions[this.delimiterPositions.length] = position\n this.containedDelimiterPositions[position] = true\n return true\n }\n\n public setCurrentField (tag: number): void {\n this.currentField = this.set?.localTag[tag] ?? this.set?.tagToField[tag] ?? null\n }\n\n public groupAddDelimiter (tag: number, position: number): boolean {\n let delimiter: boolean = false\n if (this.set instanceof GroupFieldDefinition) {\n if (this.delimiterTag && tag === this.delimiterTag) {\n delimiter = this.addDelimiterPosition(position)\n }\n }\n return delimiter\n }\n\n public addSegmentView (view: SegmentView): void {\n this.segmentView = view\n this.endPosition = view.endPosition\n this.startPosition = view.startPosition\n this.endTag = view.endTag\n this.startTag = view.startTag\n }\n\n public end (i: number, pos: number, endTag: number): void {\n this.index = i\n this.currentField = null\n this.endPosition = pos\n this.endTag = endTag\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { IContainedSet } from '../../dictionary/contained';
2
+ import { TagPos } from '../tag/tag-pos';
3
+ export declare class SegmentView {
4
+ readonly name: string;
5
+ readonly set: IContainedSet;
6
+ endTag: number;
7
+ endPosition: number;
8
+ startPosition: number;
9
+ startTag: number;
10
+ readonly tags: TagPos[];
11
+ constructor(name: string, set: IContainedSet);
12
+ add(tag: TagPos): void;
13
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SegmentView = void 0;
4
+ class SegmentView {
5
+ constructor(name, set) {
6
+ this.name = name;
7
+ this.set = set;
8
+ this.endTag = 0;
9
+ this.endPosition = Number.MIN_SAFE_INTEGER;
10
+ this.startPosition = Number.MAX_SAFE_INTEGER;
11
+ this.startTag = 0;
12
+ this.tags = [];
13
+ }
14
+ add(tag) {
15
+ if (tag.position < this.startPosition) {
16
+ this.startPosition = tag.position;
17
+ this.startTag = tag.tag;
18
+ }
19
+ if (tag.position > this.endPosition) {
20
+ this.endPosition = tag.position;
21
+ this.endTag = tag.tag;
22
+ }
23
+ this.tags.push(tag.clone());
24
+ }
25
+ }
26
+ exports.SegmentView = SegmentView;
27
+ //# sourceMappingURL=segment-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-view.js","sourceRoot":"","sources":["../../../src/buffer/segment/segment-view.ts"],"names":[],"mappings":";;;AAGA,MAAa,WAAW;IAOtB,YACkB,IAAY,EACZ,GAAkB;QADlB,SAAI,GAAJ,IAAI,CAAQ;QACZ,QAAG,GAAH,GAAG,CAAe;QAR7B,WAAM,GAAW,CAAC,CAAA;QAClB,gBAAW,GAAW,MAAM,CAAC,gBAAgB,CAAA;QAC7C,kBAAa,GAAW,MAAM,CAAC,gBAAgB,CAAA;QAC/C,aAAQ,GAAW,CAAC,CAAA;QACX,SAAI,GAAa,EAAE,CAAA;IAKnC,CAAC;IAEM,GAAG,CAAE,GAAW;QACrB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAA;YACjC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAA;QACzB,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAA;YAC/B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAA;QACvB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;IAC7B,CAAC;CACF;AAxBD,kCAwBC","sourcesContent":["import { IContainedSet } from '../../dictionary/contained'\nimport { TagPos } from '../tag/tag-pos'\n\nexport class SegmentView {\n public endTag: number = 0\n public endPosition: number = Number.MIN_SAFE_INTEGER\n public startPosition: number = Number.MAX_SAFE_INTEGER\n public startTag: number = 0\n public readonly tags: TagPos[] = []\n\n constructor (\n public readonly name: string,\n public readonly set: IContainedSet) {\n }\n\n public add (tag: TagPos): void {\n if (tag.position < this.startPosition) {\n this.startPosition = tag.position\n this.startTag = tag.tag\n }\n if (tag.position > this.endPosition) {\n this.endPosition = tag.position\n this.endTag = tag.tag\n }\n // clone the TagPos to avoid mutation when Tags array is reused\n this.tags.push(tag.clone())\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/collections/collection.ts"],"names":[],"mappings":"","sourcesContent":["export type INumericKeyed<T> = Record<number, T>\n\nexport type ILooseObject = Record<string, any>\n\n"]}
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/collections/collection.ts"],"names":[],"mappings":"","sourcesContent":["export type INumericKeyed<T> = Record<number, T>\n\nexport type ILooseObject = Record<string, any>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"js-fix-logger.js","sourceRoot":"","sources":["../../src/config/js-fix-logger.ts"],"names":[],"mappings":";;;AA6BA,0CAEC;AAxBD,MAAa,WAAW;IACtB,YAA6B,OAAe,EAAE;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAC9C,CAAC;IAEM,IAAI,CAAE,CAAS;IAEtB,CAAC;IAEM,OAAO,CAAE,CAAS;IAEzB,CAAC;IAEM,KAAK,CAAE,CAAS;IAEvB,CAAC;IAGM,KAAK,CAAE,CAAQ;IAEtB,CAAC;CACF;AApBD,kCAoBC;AAED,SAAgB,eAAe,CAAE,IAAY;IAC3C,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC","sourcesContent":["export interface IJsFixLogger {\n info: (message: string) => void\n warning: (message: string) => void\n debug: (message: string) => void\n error: (e: Error) => void\n}\n\nexport class EmptyLogger implements IJsFixLogger {\n constructor (public readonly type: string = '') {\n }\n\n public info (_: string): void {\n // nothing\n }\n\n public warning (_: string): void {\n // nothing\n }\n\n public debug (_: string): void {\n // nothing\n }\n\n // eslint-disable-next-line n/handle-callback-err\n public error (_: Error): void {\n // nothing\n }\n}\n\nexport function makeEmptyLogger (type: string): IJsFixLogger {\n return new EmptyLogger(type)\n}\n"]}
1
+ {"version":3,"file":"js-fix-logger.js","sourceRoot":"","sources":["../../src/config/js-fix-logger.ts"],"names":[],"mappings":";;;AA4BA,0CAEC;AAvBD,MAAa,WAAW;IACtB,YAA6B,OAAe,EAAE;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAC9C,CAAC;IAEM,IAAI,CAAE,CAAS;IAEtB,CAAC;IAEM,OAAO,CAAE,CAAS;IAEzB,CAAC;IAEM,KAAK,CAAE,CAAS;IAEvB,CAAC;IAEM,KAAK,CAAE,CAAQ;IAEtB,CAAC;CACF;AAnBD,kCAmBC;AAED,SAAgB,eAAe,CAAE,IAAY;IAC3C,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC","sourcesContent":["export interface IJsFixLogger {\n info: (message: string) => void\n warning: (message: string) => void\n debug: (message: string) => void\n error: (e: Error) => void\n}\n\nexport class EmptyLogger implements IJsFixLogger {\n constructor (public readonly type: string = '') {\n }\n\n public info (_: string): void {\n // nothing\n }\n\n public warning (_: string): void {\n // nothing\n }\n\n public debug (_: string): void {\n // nothing\n }\n\n public error (_: Error): void {\n // nothing\n }\n}\n\nexport function makeEmptyLogger (type: string): IJsFixLogger {\n return new EmptyLogger(type)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fix-msg-ascii-store-resend.js","sourceRoot":"","sources":["../../src/store/fix-msg-ascii-store-resend.ts"],"names":[],"mappings":"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","sourcesContent":["import { IFixMsgStore } from './fix-msg-store'\nimport { FixMsgStoreRecord, IFixMsgStoreRecord } from './fix-msg-store-record'\nimport { IJsFixConfig } from '../config'\nimport { MsgType } from '../types'\nimport { ElasticBuffer, MsgView } from '../buffer'\nimport { AsciiParser } from '../buffer/ascii'\nimport { ISequenceReset, IStandardHeader } from '../types/FIX4.4/repo'\n\nexport class FixMsgAsciiStoreResend {\n parser: AsciiParser\n constructor (public readonly store: IFixMsgStore, public readonly config: IJsFixConfig) {\n this.parser = new AsciiParser(this.config, null, new ElasticBuffer(160 * 1024))\n }\n\n public async getResendRequest (startSeq: number, endSeq: number): Promise<IFixMsgStoreRecord[]> {\n // need to cover request from start to end where any missing numbers are\n // included as gaps to allow vector of messages to be sent by the session\n // on a request\n\n return await new Promise((resolve, reject) => {\n this.store.getSeqNumRange(startSeq, endSeq).then(res => {\n resolve(this.inflateRange(startSeq, endSeq, res))\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n private inflateRange (startSeq: number, endSeq: number, input: IFixMsgStoreRecord[]): IFixMsgStoreRecord[] {\n const toResend: IFixMsgStoreRecord[] = []\n // If no records for this given sequence number range, returns a single gap fill\n if (input.length === 0) {\n this.gap(startSeq, endSeq + 1, toResend)\n return toResend\n }\n\n let expected = startSeq\n for (let i = 0; i < input.length; ++i) {\n const record = this.prepareRecordForRetransmission(input[i])\n const seqNum = record.seqNum\n const toGap = seqNum - expected\n if (toGap > 0) {\n this.gap(expected, seqNum, toResend)\n }\n expected = seqNum + 1\n if (record.encoded) {\n this.inflate(record)\n }\n toResend.push(record)\n }\n if (endSeq - expected > 0) {\n this.gap(expected, endSeq + 1, toResend)\n }\n return toResend\n }\n\n private gap (beginGap: number, newSeq: number, arr: IFixMsgStoreRecord[]): void {\n if (beginGap > 0) {\n arr.push(this.sequenceResetGap(beginGap, newSeq))\n }\n }\n\n // if records were sent as encoded text then inflate back to object\n // so can be resent or examined\n\n private inflate (record: IFixMsgStoreRecord): void {\n if (record.obj) return\n if (!record.encoded) return\n const parser = this.parser\n parser.on('error', (_: Error) => {\n record.obj = null\n })\n parser.on('msg', (view: MsgView) => {\n record.obj = view.toObject()\n })\n // inline parse\n parser.parseText(record.encoded)\n }\n\n /**\n * A continuous sequence of messages not being retransmitted should be skipped over using a\n * single SequenceReset(35=4) message with GapFillFlag(123) set to “Y” and MsgSeqNum(34) set\n * to the sequence number of the first skipped message and NewSeqNo(36) must always be set\n * to the value of the next sequence number to be expected by the peer immediately following\n * the messages being skipped.\n */\n private sequenceResetGap (startGap: number, newSeq: number): IFixMsgStoreRecord {\n const factory = this.config.factory\n const gapFill: ISequenceReset = factory?.sequenceReset(newSeq, true) as ISequenceReset\n gapFill.StandardHeader = factory?.header(MsgType.SequenceReset, startGap) as IStandardHeader\n gapFill.StandardHeader.PossDupFlag = true\n\n return new FixMsgStoreRecord(\n MsgType.SequenceReset,\n new Date(),\n startGap,\n gapFill,\n null,\n )\n }\n\n /**\n * Prepares the FIX message as response to ResendRequest (2).\n *\n * The FIX session processor retransmitting a message with the PossDupFlag(43) set to \"Y\" must modify the following fields:\n *\n * SendingTime(52) set to the current sending time\n * OrigSendingTime(122) set to the SendingTime(52) from the original message\n * Recalculate the BodyLength(9)\n * Recalculate the CheckSum(10)\n *\n * If the message is encrypted, SecureDataLen(90) and SecureData(91) may also require re-encryption and re-encoding\n *\n * @see https://www.fixtrading.org/standards/fix-session-layer-online/#message-recovery\n *\n * @param originalRecord the FIX message to be retransmitted as possible duplicate\n * @returns the FIX message ready to be retransmitted\n */\n private prepareRecordForRetransmission (originalRecord: IFixMsgStoreRecord): IFixMsgStoreRecord {\n const retransmitted = originalRecord.clone() // We don't want to accidently change any fields of the original record\n\n const factory = this.config.factory\n if (!retransmitted.obj) {\n retransmitted.obj = {}\n }\n\n // Rebuilds header with the updated fields\n const header = factory?.header(\n retransmitted.msgType,\n retransmitted.seqNum,\n new Date(), // SendingTime(52)\n {\n PossDupFlag: true,\n OrigSendingTime: retransmitted.timestamp\n }\n )\n retransmitted.obj = {\n ...retransmitted.obj,\n StandardHeader: header\n }\n return retransmitted\n }\n}\n"]}
1
+ {"version":3,"file":"fix-msg-ascii-store-resend.js","sourceRoot":"","sources":["../../src/store/fix-msg-ascii-store-resend.ts"],"names":[],"mappings":"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","sourcesContent":["import { IFixMsgStore } from './fix-msg-store'\nimport { FixMsgStoreRecord, IFixMsgStoreRecord } from './fix-msg-store-record'\nimport { IJsFixConfig } from '../config'\nimport { MsgType } from '../types'\nimport { ElasticBuffer, MsgView } from '../buffer'\nimport { AsciiParser } from '../buffer/ascii'\nimport { ISequenceReset, IStandardHeader } from '../types/FIX4.4/repo'\n\nexport class FixMsgAsciiStoreResend {\n parser: AsciiParser\n constructor (public readonly store: IFixMsgStore, public readonly config: IJsFixConfig) {\n this.parser = new AsciiParser(this.config, null, new ElasticBuffer(160 * 1024))\n }\n\n public async getResendRequest (startSeq: number, endSeq: number): Promise<IFixMsgStoreRecord[]> {\n // need to cover request from start to end where any missing numbers are\n // included as gaps to allow vector of messages to be sent by the session\n // on a request\n\n return await new Promise((resolve, reject) => {\n this.store.getSeqNumRange(startSeq, endSeq).then(res => {\n resolve(this.inflateRange(startSeq, endSeq, res))\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n private inflateRange (startSeq: number, endSeq: number, input: IFixMsgStoreRecord[]): IFixMsgStoreRecord[] {\n const toResend: IFixMsgStoreRecord[] = []\n // If no records for this given sequence number range, returns a single gap fill\n if (input.length === 0) {\n this.gap(startSeq, endSeq + 1, toResend)\n return toResend\n }\n\n let expected = startSeq\n for (let i = 0; i < input.length; ++i) {\n const record = this.prepareRecordForRetransmission(input[i])\n const seqNum = record.seqNum\n const toGap = seqNum - expected\n if (toGap > 0) {\n this.gap(expected, seqNum, toResend)\n }\n expected = seqNum + 1\n if (record.encoded) {\n this.inflate(record)\n }\n toResend.push(record)\n }\n if (endSeq - expected > 0) {\n this.gap(expected, endSeq + 1, toResend)\n }\n return toResend\n }\n\n private gap (beginGap: number, newSeq: number, arr: IFixMsgStoreRecord[]): void {\n if (beginGap > 0) {\n arr.push(this.sequenceResetGap(beginGap, newSeq))\n }\n }\n\n // if records were sent as encoded text then inflate back to object\n // so can be resent or examined\n\n private inflate (record: IFixMsgStoreRecord): void {\n if (record.obj) return\n if (!record.encoded) return\n const parser = this.parser\n parser.on('error', (_: Error) => {\n record.obj = null\n })\n parser.on('msg', (view: MsgView) => {\n record.obj = view.toObject()\n })\n // inline parse\n parser.parseText(record.encoded)\n }\n\n /**\n * A continuous sequence of messages not being retransmitted should be skipped over using a\n * single SequenceReset(35=4) message with GapFillFlag(123) set to “Y” and MsgSeqNum(34) set\n * to the sequence number of the first skipped message and NewSeqNo(36) must always be set\n * to the value of the next sequence number to be expected by the peer immediately following\n * the messages being skipped.\n */\n private sequenceResetGap (startGap: number, newSeq: number): IFixMsgStoreRecord {\n const factory = this.config.factory\n const gapFill: ISequenceReset = factory?.sequenceReset(newSeq, true) as ISequenceReset\n gapFill.StandardHeader = factory?.header(MsgType.SequenceReset, startGap) as IStandardHeader\n gapFill.StandardHeader.PossDupFlag = true\n\n return new FixMsgStoreRecord(\n MsgType.SequenceReset,\n new Date(),\n startGap,\n gapFill,\n null\n )\n }\n\n /**\n * Prepares the FIX message as response to ResendRequest (2).\n *\n * The FIX session processor retransmitting a message with the PossDupFlag(43) set to \"Y\" must modify the following fields:\n *\n * SendingTime(52) set to the current sending time\n * OrigSendingTime(122) set to the SendingTime(52) from the original message\n * Recalculate the BodyLength(9)\n * Recalculate the CheckSum(10)\n *\n * If the message is encrypted, SecureDataLen(90) and SecureData(91) may also require re-encryption and re-encoding\n *\n * @see https://www.fixtrading.org/standards/fix-session-layer-online/#message-recovery\n *\n * @param originalRecord the FIX message to be retransmitted as possible duplicate\n * @returns the FIX message ready to be retransmitted\n */\n private prepareRecordForRetransmission (originalRecord: IFixMsgStoreRecord): IFixMsgStoreRecord {\n const retransmitted = originalRecord.clone() // We don't want to accidently change any fields of the original record\n\n const factory = this.config.factory\n if (!retransmitted.obj) {\n retransmitted.obj = {}\n }\n\n // Rebuilds header with the updated fields\n const header = factory?.header(\n retransmitted.msgType,\n retransmitted.seqNum,\n new Date(), // SendingTime(52)\n {\n PossDupFlag: true,\n OrigSendingTime: retransmitted.timestamp\n }\n )\n retransmitted.obj = {\n ...retransmitted.obj,\n StandardHeader: header\n }\n return retransmitted\n }\n}\n"]}
@@ -344,7 +344,13 @@ class FixSession extends events.EventEmitter {
344
344
  this.sessionLogger.info(`done. check logout sequence state ${this.stateString()}`);
345
345
  }
346
346
  reset(resetSeqNum) {
347
+ var _a;
347
348
  this.stopTimer();
349
+ this.unsubscribe();
350
+ const receiver = (_a = this.transport) === null || _a === void 0 ? void 0 : _a.receiver;
351
+ if (receiver === null || receiver === void 0 ? void 0 : receiver.reset) {
352
+ receiver.reset();
353
+ }
348
354
  this.transport = null;
349
355
  const resetFlag = this.config.description.ResetSeqNumFlag;
350
356
  const seqNum = resetFlag ? 0 : resetSeqNum !== null && resetSeqNum !== void 0 ? resetSeqNum : this.sessionState.lastPeerMsgSeqNum;