jspurefix 5.8.5 → 5.9.2

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 (180) hide show
  1. package/.gitattributes +4 -0
  2. package/BACKPORT_PLAN.md +84 -0
  3. package/DEMO_PORT_PLAN.md +10 -0
  4. package/README.md +3 -0
  5. package/WORKLOG.md +119 -0
  6. package/dist/benchmark/bench-report.d.ts +5 -0
  7. package/dist/benchmark/bench-report.js +91 -0
  8. package/dist/benchmark/bench-report.js.map +1 -0
  9. package/dist/benchmark/bench-runner.d.ts +12 -0
  10. package/dist/benchmark/bench-runner.js +193 -0
  11. package/dist/benchmark/bench-runner.js.map +1 -0
  12. package/dist/benchmark/bench-stats.d.ts +10 -0
  13. package/dist/benchmark/bench-stats.js +56 -0
  14. package/dist/benchmark/bench-stats.js.map +1 -0
  15. package/dist/benchmark/bench-types.d.ts +74 -0
  16. package/dist/benchmark/bench-types.js +3 -0
  17. package/dist/benchmark/bench-types.js.map +1 -0
  18. package/dist/benchmark/gc-probe.d.ts +18 -0
  19. package/dist/benchmark/gc-probe.js +103 -0
  20. package/dist/benchmark/gc-probe.js.map +1 -0
  21. package/dist/benchmark/index.d.ts +6 -0
  22. package/dist/benchmark/index.js +23 -0
  23. package/dist/benchmark/index.js.map +1 -0
  24. package/dist/benchmark/parse-bench.d.ts +28 -0
  25. package/dist/benchmark/parse-bench.js +85 -0
  26. package/dist/benchmark/parse-bench.js.map +1 -0
  27. package/dist/buffer/ascii/ascii-parser.d.ts +1 -0
  28. package/dist/buffer/ascii/ascii-parser.js +4 -1
  29. package/dist/buffer/ascii/ascii-parser.js.map +1 -1
  30. package/dist/buffer/ascii/ascii-segment-parser.js +3 -2
  31. package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
  32. package/dist/buffer/ascii/tag-index.js.map +1 -1
  33. package/dist/buffer/msg-view.d.ts +1 -0
  34. package/dist/buffer/msg-view.js +25 -19
  35. package/dist/buffer/msg-view.js.map +1 -1
  36. package/dist/config/js-fix-config.d.ts +4 -0
  37. package/dist/config/js-fix-config.js.map +1 -1
  38. package/dist/dictionary/parser/quickfix/dictionary-validator.d.ts +1 -1
  39. package/dist/dictionary/parser/quickfix/dictionary-validator.js.map +1 -1
  40. package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.d.ts +1 -1
  41. package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js +1 -2
  42. package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js.map +1 -1
  43. package/dist/dictionary/parser/quickfix/validation-error.d.ts +2 -2
  44. package/dist/dictionary/parser/quickfix/validation-error.js.map +1 -1
  45. package/dist/jsfix-bench.d.ts +1 -0
  46. package/dist/jsfix-bench.js +213 -0
  47. package/dist/jsfix-bench.js.map +1 -0
  48. package/dist/runtime/session-launcher.js +1 -1
  49. package/dist/runtime/session-launcher.js.map +1 -1
  50. package/dist/runtime/session-scope.d.ts +3 -0
  51. package/dist/runtime/session-scope.js +47 -0
  52. package/dist/runtime/session-scope.js.map +1 -0
  53. package/dist/sample/http/oms/app.js +3 -3
  54. package/dist/sample/http/oms/app.js.map +1 -1
  55. package/dist/sample/tcp/qf-md/app.js +3 -3
  56. package/dist/sample/tcp/qf-md/app.js.map +1 -1
  57. package/dist/sample/tcp/skeleton/app.js +1 -1
  58. package/dist/sample/tcp/skeleton/app.js.map +1 -1
  59. package/dist/sample/tcp/trade-capture/app-launcher.js +3 -3
  60. package/dist/sample/tcp/trade-capture/app-launcher.js.map +1 -1
  61. package/dist/store/file-session-store.js +1 -1
  62. package/dist/store/file-session-store.js.map +1 -1
  63. package/dist/store/file-session-stream-provider.d.ts +1 -0
  64. package/dist/store/file-session-stream-provider.js +13 -13
  65. package/dist/store/file-session-stream-provider.js.map +1 -1
  66. package/dist/store/fix-session-store-factory.d.ts +1 -1
  67. package/dist/store/fix-session-store-factory.js.map +1 -1
  68. package/dist/store/fix-session-store.d.ts +11 -11
  69. package/dist/store/fix-session-store.js.map +1 -1
  70. package/dist/store/memory-session-store.js.map +1 -1
  71. package/dist/store/session-stream-provider.d.ts +13 -13
  72. package/dist/store/session-stream-provider.js.map +1 -1
  73. package/dist/transport/ascii/ascii-session.d.ts +17 -3
  74. package/dist/transport/ascii/ascii-session.js +121 -8
  75. package/dist/transport/ascii/ascii-session.js.map +1 -1
  76. package/dist/transport/duplex/fix-duplex.d.ts +1 -0
  77. package/dist/transport/duplex/fix-duplex.js +3 -0
  78. package/dist/transport/duplex/fix-duplex.js.map +1 -1
  79. package/dist/transport/duplex/tcp-duplex.d.ts +1 -0
  80. package/dist/transport/duplex/tcp-duplex.js +5 -0
  81. package/dist/transport/duplex/tcp-duplex.js.map +1 -1
  82. package/dist/transport/factory/msg-transport.d.ts +2 -0
  83. package/dist/transport/factory/msg-transport.js +17 -2
  84. package/dist/transport/factory/msg-transport.js.map +1 -1
  85. package/dist/transport/session/a-session-msg-factory.d.ts +1 -0
  86. package/dist/transport/session/a-session-msg-factory.js +4 -0
  87. package/dist/transport/session/a-session-msg-factory.js.map +1 -1
  88. package/dist/transport/session/clone-session-description.d.ts +6 -0
  89. package/dist/transport/session/clone-session-description.js +11 -0
  90. package/dist/transport/session/clone-session-description.js.map +1 -0
  91. package/dist/transport/session/fix-clock.d.ts +1 -1
  92. package/dist/transport/session/fix-clock.js.map +1 -1
  93. package/dist/transport/session/fix-session.d.ts +5 -1
  94. package/dist/transport/session/fix-session.js +93 -24
  95. package/dist/transport/session/fix-session.js.map +1 -1
  96. package/dist/transport/session/index.d.ts +2 -0
  97. package/dist/transport/session/index.js +2 -0
  98. package/dist/transport/session/index.js.map +1 -1
  99. package/dist/transport/session/resend-request-manager.d.ts +2 -2
  100. package/dist/transport/session/resend-request-manager.js.map +1 -1
  101. package/dist/transport/session/session-msg-factory.d.ts +1 -0
  102. package/dist/transport/session/session-msg-factory.js.map +1 -1
  103. package/dist/transport/session/session-registry.d.ts +23 -0
  104. package/dist/transport/session/session-registry.js +59 -0
  105. package/dist/transport/session/session-registry.js.map +1 -0
  106. package/dist/transport/session/session-sequence-coordinator.d.ts +1 -1
  107. package/dist/transport/session/session-sequence-coordinator.js.map +1 -1
  108. package/dist/transport/session/session-sequence-store.d.ts +3 -3
  109. package/dist/transport/session/session-sequence-store.js.map +1 -1
  110. package/dist/transport/tcp/tcp-acceptor-listener.d.ts +3 -0
  111. package/dist/transport/tcp/tcp-acceptor-listener.js +26 -4
  112. package/dist/transport/tcp/tcp-acceptor-listener.js.map +1 -1
  113. package/dist/transport/tcp/tcp-acceptor.d.ts +5 -0
  114. package/dist/transport/tcp/tcp-acceptor.js +74 -20
  115. package/dist/transport/tcp/tcp-acceptor.js.map +1 -1
  116. package/dist/transport/tcp/tcp-initiator.js +15 -5
  117. package/dist/transport/tcp/tcp-initiator.js.map +1 -1
  118. package/dist/transport/tcp/tcp-transport-description.d.ts +1 -0
  119. package/dist/transport/tcp/tcp-transport-description.js.map +1 -1
  120. package/dist/transport/tcp/tls-diagnostics.d.ts +5 -0
  121. package/dist/transport/tcp/tls-diagnostics.js +64 -0
  122. package/dist/transport/tcp/tls-diagnostics.js.map +1 -0
  123. package/dist/transport/tcp/tls-options-factory.d.ts +1 -0
  124. package/dist/transport/tcp/tls-options-factory.js +24 -2
  125. package/dist/transport/tcp/tls-options-factory.js.map +1 -1
  126. package/docs/acceptor.md +207 -0
  127. package/docs/benchmarking.md +117 -0
  128. package/eslint.config.mjs +15 -1
  129. package/jsfix.test_client.txt +62 -75
  130. package/jsfix.test_server.txt +72 -72
  131. package/package.json +19 -10
  132. package/script/pack-local.js +68 -0
  133. package/src/benchmark/bench-report.ts +101 -0
  134. package/src/benchmark/bench-runner.ts +196 -0
  135. package/src/benchmark/bench-stats.ts +86 -0
  136. package/src/benchmark/bench-types.ts +110 -0
  137. package/src/benchmark/gc-probe.ts +145 -0
  138. package/src/benchmark/index.ts +6 -0
  139. package/src/benchmark/parse-bench.ts +144 -0
  140. package/src/buffer/ascii/ascii-parser.ts +16 -1
  141. package/src/buffer/ascii/ascii-segment-parser.ts +9 -6
  142. package/src/buffer/ascii/tag-index.ts +3 -3
  143. package/src/buffer/msg-view.ts +35 -18
  144. package/src/config/js-fix-config.ts +8 -0
  145. package/src/dictionary/parser/quickfix/dictionary-validator.ts +1 -1
  146. package/src/dictionary/parser/quickfix/quick-fix-graph-parser.ts +2 -3
  147. package/src/dictionary/parser/quickfix/validation-error.ts +1 -1
  148. package/src/jsfix-bench.ts +204 -0
  149. package/src/runtime/session-launcher.ts +5 -1
  150. package/src/runtime/session-scope.ts +84 -0
  151. package/src/sample/http/oms/app.ts +3 -3
  152. package/src/sample/tcp/qf-md/app.ts +3 -3
  153. package/src/sample/tcp/skeleton/app.ts +1 -1
  154. package/src/sample/tcp/trade-capture/app-launcher.ts +3 -3
  155. package/src/store/file-session-store.ts +2 -2
  156. package/src/store/file-session-stream-provider.ts +17 -11
  157. package/src/store/fix-session-store-factory.ts +1 -1
  158. package/src/store/fix-session-store.ts +11 -11
  159. package/src/store/memory-session-store.ts +1 -1
  160. package/src/store/session-stream-provider.ts +13 -13
  161. package/src/transport/ascii/ascii-session.ts +186 -11
  162. package/src/transport/duplex/fix-duplex.ts +9 -0
  163. package/src/transport/duplex/tcp-duplex.ts +10 -0
  164. package/src/transport/factory/msg-transport.ts +20 -0
  165. package/src/transport/session/a-session-msg-factory.ts +18 -0
  166. package/src/transport/session/clone-session-description.ts +41 -0
  167. package/src/transport/session/fix-clock.ts +1 -1
  168. package/src/transport/session/fix-session.ts +136 -25
  169. package/src/transport/session/index.ts +2 -0
  170. package/src/transport/session/resend-request-manager.ts +4 -4
  171. package/src/transport/session/session-msg-factory.ts +13 -0
  172. package/src/transport/session/session-registry.ts +112 -0
  173. package/src/transport/session/session-sequence-coordinator.ts +1 -1
  174. package/src/transport/session/session-sequence-store.ts +3 -3
  175. package/src/transport/tcp/tcp-acceptor-listener.ts +43 -5
  176. package/src/transport/tcp/tcp-acceptor.ts +92 -18
  177. package/src/transport/tcp/tcp-initiator.ts +26 -5
  178. package/src/transport/tcp/tcp-transport-description.ts +7 -0
  179. package/src/transport/tcp/tls-diagnostics.ts +76 -0
  180. package/src/transport/tcp/tls-options-factory.ts +34 -2
@@ -1 +1 @@
1
- {"version":3,"file":"quick-fix-graph-parser.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/quick-fix-graph-parser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Graph-based QuickFix XML dictionary parser.\n *\n * Verbatim port of C# QuickFixXmlFileParser. Uses XDocument tree (from SaxTreeBuilder)\n * for random-access XML traversal and a Node/Edge/work-queue pattern for forward\n * reference resolution. Replaces the iterative N-pass SAX-streaming approach.\n *\n * Pre-parse validation via DictionaryValidator catches missing fields, duplicates,\n * and undefined references with \"did you mean\" suggestions before parsing begins.\n */\nimport { XDocument, XNode } from './x-element'\nimport { SaxTreeBuilder } from './sax-tree-builder'\nimport { DictionaryValidator } from './dictionary-validator'\nimport { FixDefinitions } from '../../definition/fix-definitions'\nimport { SimpleFieldDefinition } from '../../definition/simple-field-definition'\nimport { ComponentFieldDefinition } from '../../definition/component-field-definition'\nimport { GroupFieldDefinition } from '../../definition/group-field-definition'\nimport { MessageDefinition } from '../../definition/message-definition'\nimport { ContainedFieldSet } from '../../contained/contained-field-set'\nimport { ContainedSimpleField } from '../../contained/contained-simple-field'\nimport { ContainedComponentField } from '../../contained/contained-component-field'\nimport { ContainedGroupField } from '../../contained/contained-group-field'\nimport { ContainedSetBuilder } from '../../contained/contained-set-builder'\nimport { FixDefinitionSource } from '../../fix-definition-source'\nimport { VersionUtil } from '../../version-util'\nimport { IndexVisitor } from './index-visitor'\n\nexport enum NodeElementType {\n MessageDefinition = 'MessageDefinition',\n SimpleFieldDefinition = 'SimpleFieldDefinition',\n SimpleFieldDeclaration = 'SimpleFieldDeclaration',\n InlineGroupDefinition = 'InlineGroupDefinition',\n GroupDefinition = 'GroupDefinition',\n GroupDeclaration = 'GroupDeclaration',\n ComponentDefinition = 'ComponentDefinition',\n ComponentDeclaration = 'ComponentDeclaration'\n}\n\nexport interface Edge {\n readonly head: number\n readonly tail: number\n}\n\nexport class GraphNode {\n private readonly _edges: Edge[] = []\n\n constructor (\n public readonly id: number,\n public readonly name: string,\n public readonly type: NodeElementType,\n public readonly element: XNode\n ) {}\n\n get edges (): ReadonlyArray<Edge> {\n return this._edges\n }\n\n makeEdge (tail: number): Edge {\n const edge: Edge = { head: this.id, tail }\n this._edges.push(edge)\n return edge\n }\n\n isRequired (): boolean {\n if (this.name === 'StandardHeader' || this.name === 'StandardTrailer') return true\n return this.element.attribute('required') === 'Y'\n }\n\n toString (): string {\n return `Node: id=${this.id}, name=${this.name}, type=${this.type}`\n }\n}\n\nexport interface QuickFixGraphParserOptions {\n validateBeforeParsing?: boolean\n}\n\nexport class QuickFixGraphParser {\n private readonly definitions: FixDefinitions\n private readonly nodes = new Map<number, GraphNode>()\n private readonly containedSets = new Map<number, ContainedFieldSet>()\n private readonly queue: GraphNode[] = []\n private nextId = 0\n private header: GraphNode | null = null\n private trailer: GraphNode | null = null\n\n public validator: DictionaryValidator | null = null\n public readonly validateBeforeParsing: boolean\n\n constructor (definitions: FixDefinitions, options: QuickFixGraphParserOptions = {}) {\n this.definitions = definitions\n this.validateBeforeParsing = options.validateBeforeParsing ?? true\n }\n\n /**\n * Parse XML text into the FixDefinitions provided at construction.\n * Throws DictionaryValidationException if validation is enabled and errors are found.\n */\n parseText (xml: string): FixDefinitions {\n const doc = SaxTreeBuilder.parse(xml)\n return this.parseDocument(doc)\n }\n\n /**\n * Parse a pre-built XDocument tree.\n */\n parseDocument (doc: XDocument): FixDefinitions {\n if (this.validateBeforeParsing) {\n this.validator = new DictionaryValidator()\n this.validator.validate(doc)\n this.validator.throwIfErrors()\n }\n\n this.parseVersion(doc)\n this.parseFields(doc)\n this.parseComponents(doc)\n this.parseHeader(doc)\n this.parseTrailer(doc)\n this.parseMessages(doc)\n\n while (this.queue.length > 0) {\n const node = this.queue.shift()!\n this.work(node)\n }\n\n /*\n * At this point all fields on all sets are placed, however the parent (e.g. an\n * Instrument component) is not aware of the tags contained in nested groups/components\n * that were resolved AFTER it. The IndexVisitor walks every message and re-indexes\n * its tree post-order so each set knows all tags below it — essential for the segment\n * parser to work.\n */\n new IndexVisitor().compute(this.definitions)\n\n return this.definitions\n }\n\n // ── Graph construction ──\n\n private makeNode (name: string, element: XNode, type: NodeElementType): GraphNode {\n const node = new GraphNode(this.nextId++, name, type, element)\n this.nodes.set(node.id, node)\n this.queue.push(node)\n return node\n }\n\n private constructTailNode (name: string, headNode: GraphNode, element: XNode, type: NodeElementType): void {\n const tailNode = this.makeNode(name, element, type)\n headNode.makeEdge(tailNode.id)\n tailNode.makeEdge(headNode.id)\n }\n\n // ── Parsing entry points ──\n\n private parseVersion (doc: XDocument): void {\n const version = doc.firstDescendant('fix')\n if (!version) throw new Error('no <fix> root element')\n const major = parseInt(version.attribute('major') ?? '0', 10)\n const minor = parseInt(version.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(version.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const resolved = VersionUtil.resolve(description)\n // FixDefinitions doesn't have a setVersion — version is set at construction\n if (resolved !== this.definitions.version) {\n throw new Error(`version mismatch: dictionary declares ${description} but FixDefinitions was constructed with ${this.definitions.version}`)\n }\n }\n\n private parseFields (doc: XDocument): void {\n const fieldsNode = doc.firstDescendant('fields')\n if (!fieldsNode) return\n for (const fieldElement of fieldsNode.elements('field')) {\n this.makeNode(QuickFixGraphParser.nameFrom(fieldElement), fieldElement, NodeElementType.SimpleFieldDefinition)\n }\n }\n\n private parseComponents (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) return\n for (const componentElement of componentsNode.elements('component')) {\n this.makeNode(QuickFixGraphParser.nameFrom(componentElement), componentElement, NodeElementType.ComponentDefinition)\n }\n }\n\n private parseHeader (doc: XDocument): void {\n const header = doc.firstDescendant('header')\n if (!header) throw new Error('no header declared in fix definitions')\n this.header = this.makeNode('StandardHeader', header, NodeElementType.ComponentDefinition)\n }\n\n private parseTrailer (doc: XDocument): void {\n const trailer = doc.firstDescendant('trailer')\n if (!trailer) throw new Error('no trailer declared in fix definitions')\n this.trailer = this.makeNode('StandardTrailer', trailer, NodeElementType.ComponentDefinition)\n }\n\n private parseMessages (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) return\n for (const messageElement of messagesNode.elements('message')) {\n const msgType = messageElement.attribute('msgtype')\n if (!msgType) continue\n this.makeNode(msgType, messageElement, NodeElementType.MessageDefinition)\n }\n }\n\n // ── Work queue dispatch ──\n\n private work (node: GraphNode): void {\n switch (node.type) {\n case NodeElementType.SimpleFieldDefinition: {\n const sd = QuickFixGraphParser.getField(node.element)\n this.definitions.addSimpleFieldDef(sd)\n break\n }\n case NodeElementType.MessageDefinition: {\n this.messageDefinition(node)\n break\n }\n case NodeElementType.ComponentDefinition: {\n this.componentDefinition(node)\n break\n }\n case NodeElementType.SimpleFieldDeclaration: {\n this.simpleFieldDeclaration(node)\n break\n }\n case NodeElementType.InlineGroupDefinition: {\n this.inlineGroupDefinition(node)\n break\n }\n case NodeElementType.GroupDefinition: {\n this.groupDefinition(node)\n break\n }\n case NodeElementType.ComponentDeclaration: {\n this.componentDeclaration(node)\n break\n }\n case NodeElementType.GroupDeclaration: {\n // QuickFix XML never has standalone group declarations — groups are always inline\n break\n }\n }\n }\n\n // ── Definition handlers ──\n\n private getComponentDefinition (node: GraphNode): ComponentFieldDefinition {\n let definition = this.definitions.component.get(node.name)\n if (definition) return definition\n definition = new ComponentFieldDefinition(node.name, node.name, null, node.name)\n this.definitions.addComponentFieldDef(definition)\n return definition\n }\n\n private componentDeclaration (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n const edge = node.edges[0]\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set on which to place declared component '${node.name}'`)\n }\n const containedComponent = new ContainedComponentField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedComponent)\n this.containedSets.set(edge.head, definition)\n }\n\n private messageDefinition (node: GraphNode): void {\n if (!this.header) throw new Error('header not set')\n if (!this.trailer) throw new Error('trailer not set')\n\n const md = QuickFixGraphParser.getMessage(node.element)\n this.definitions.addMessage(md)\n this.containedSets.set(node.id, md)\n\n // wrap the message body in StandardHeader + content + StandardTrailer\n this.constructTailNode('StandardHeader', node, this.header.element, NodeElementType.ComponentDeclaration)\n this.expandSet(node)\n this.constructTailNode('StandardTrailer', node, this.trailer.element, NodeElementType.ComponentDeclaration)\n }\n\n private componentDefinition (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n this.containedSets.set(node.id, definition)\n this.expandSet(node)\n }\n\n private groupDefinition (node: GraphNode): void {\n const tail = node.edges[0]?.tail\n if (tail == null) {\n throw new Error(`node ${node} has no edges to find tail for group definition`)\n }\n const definition = this.containedSets.get(tail)\n if (!definition) {\n throw new Error(`node ${node} has no contained set for group definition`)\n }\n this.containedSets.set(node.edges[0].head, definition)\n this.expandSet(node)\n }\n\n private inlineGroupDefinition (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for inline group definition`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for inline group '${node.name}'`)\n }\n const noOFieldDefinition = this.definitions.simple.get(node.name)\n if (!noOFieldDefinition) {\n throw new Error(`${node.name} does not exist in simple field definitions to construct inline group`)\n }\n const name = node.name\n const definition = new GroupFieldDefinition(name, name, null, noOFieldDefinition, name)\n const containedGroup = new ContainedGroupField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedGroup)\n this.containedSets.set(edge.head, definition)\n this.constructTailNode(name, node, node.element, NodeElementType.GroupDefinition)\n }\n\n private simpleFieldDeclaration (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for simple field declaration`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for declared field '${node.name}'`)\n }\n const sd = this.definitions.simple.get(node.name)\n if (!sd) {\n throw new Error(`element ${node} cannot be located as a simple field`)\n }\n const containedSimpleField = new ContainedSimpleField(sd, parentSet.fields.length, node.isRequired(), false)\n new ContainedSetBuilder(parentSet).add(containedSimpleField)\n }\n\n // ── Set expansion ──\n\n /**\n * Walks the children of a definition node and constructs tail nodes for each\n * field/group/component reference, queuing them for resolution.\n */\n private expandSet (node: GraphNode): void {\n for (const child of node.element.elements()) {\n switch (child.name) {\n case 'field': {\n this.expandField(node, child)\n break\n }\n case 'group': {\n this.expandGroup(node, child)\n break\n }\n case 'component': {\n this.expandComponent(node, child)\n break\n }\n }\n }\n }\n\n private expandField (node: GraphNode, element: XNode): void {\n this.constructTailNode(QuickFixGraphParser.nameFrom(element), node, element, NodeElementType.SimpleFieldDeclaration)\n }\n\n private expandGroup (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.InlineGroupDefinition, NodeElementType.GroupDeclaration)\n }\n\n private expandComponent (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.ComponentDefinition, NodeElementType.ComponentDeclaration)\n }\n\n private expandSetChild (\n node: GraphNode,\n element: XNode,\n defineElement: NodeElementType,\n declareElement: NodeElementType\n ): void {\n const name = QuickFixGraphParser.nameFrom(element)\n const hasInlinedFields = element.elements().length > 0\n const elementType = hasInlinedFields ? defineElement : declareElement\n this.constructTailNode(name, node, element, elementType)\n }\n\n // ── Static helpers ──\n\n /**\n * Extract a name from an element's attributes, with the same conventions as the C# parser:\n * strip spaces, prefix with 'F' if the name starts with a digit.\n */\n static nameFrom (element: XNode): string {\n let name = element.attribute('name') ?? ''\n name = name.replace(/ /g, '')\n if (name.length > 0 && name[0] >= '0' && name[0] <= '9') {\n name = `F${name}`\n }\n return name\n }\n\n static getField (element: XNode): SimpleFieldDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const numberStr = element.attribute('number')\n const tag = numberStr != null ? parseInt(numberStr, 10) : -1\n if (tag < 0) throw new Error(`no tag/number for ${name}`)\n const type = element.attribute('type') ?? 'STRING'\n\n const sd = new SimpleFieldDefinition(String(tag), name, name, null, null, type, null)\n // Add enum values\n for (const value of element.elements('value')) {\n const enumKey = value.attribute('enum')\n const description = value.attribute('description') ?? ''\n if (enumKey != null) {\n sd.addEnum(enumKey, description, description)\n }\n }\n return sd\n }\n\n static getMessage (element: XNode): MessageDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const msgCat = element.attribute('msgcat') ?? ''\n const msgType = element.attribute('msgtype') ?? ''\n return new MessageDefinition(name, name, msgType, msgCat, name)\n }\n\n /**\n * Convenience: parse XML text into a fresh FixDefinitions.\n */\n static parse (xml: string, options: QuickFixGraphParserOptions = {}): FixDefinitions {\n // Pre-parse the version so we can construct FixDefinitions correctly\n const doc = SaxTreeBuilder.parse(xml)\n const fixRoot = doc.firstDescendant('fix')\n if (!fixRoot) throw new Error('no <fix> root element')\n const major = parseInt(fixRoot.attribute('major') ?? '0', 10)\n const minor = parseInt(fixRoot.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(fixRoot.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const definitions = new FixDefinitions(FixDefinitionSource.QuickFix, VersionUtil.resolve(description))\n const parser = new QuickFixGraphParser(definitions, options)\n return parser.parseDocument(doc)\n }\n}\n"]}
1
+ {"version":3,"file":"quick-fix-graph-parser.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/quick-fix-graph-parser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Graph-based QuickFix XML dictionary parser.\n *\n * Verbatim port of C# QuickFixXmlFileParser. Uses XDocument tree (from SaxTreeBuilder)\n * for random-access XML traversal and a Node/Edge/work-queue pattern for forward\n * reference resolution. Replaces the iterative N-pass SAX-streaming approach.\n *\n * Pre-parse validation via DictionaryValidator catches missing fields, duplicates,\n * and undefined references with \"did you mean\" suggestions before parsing begins.\n */\nimport { XDocument, XNode } from './x-element'\nimport { SaxTreeBuilder } from './sax-tree-builder'\nimport { DictionaryValidator } from './dictionary-validator'\nimport { FixDefinitions } from '../../definition/fix-definitions'\nimport { SimpleFieldDefinition } from '../../definition/simple-field-definition'\nimport { ComponentFieldDefinition } from '../../definition/component-field-definition'\nimport { GroupFieldDefinition } from '../../definition/group-field-definition'\nimport { MessageDefinition } from '../../definition/message-definition'\nimport { ContainedFieldSet } from '../../contained/contained-field-set'\nimport { ContainedSimpleField } from '../../contained/contained-simple-field'\nimport { ContainedComponentField } from '../../contained/contained-component-field'\nimport { ContainedGroupField } from '../../contained/contained-group-field'\nimport { ContainedSetBuilder } from '../../contained/contained-set-builder'\nimport { FixDefinitionSource } from '../../fix-definition-source'\nimport { VersionUtil } from '../../version-util'\nimport { IndexVisitor } from './index-visitor'\n\nexport enum NodeElementType {\n MessageDefinition = 'MessageDefinition',\n SimpleFieldDefinition = 'SimpleFieldDefinition',\n SimpleFieldDeclaration = 'SimpleFieldDeclaration',\n InlineGroupDefinition = 'InlineGroupDefinition',\n GroupDefinition = 'GroupDefinition',\n GroupDeclaration = 'GroupDeclaration',\n ComponentDefinition = 'ComponentDefinition',\n ComponentDeclaration = 'ComponentDeclaration'\n}\n\nexport interface Edge {\n readonly head: number\n readonly tail: number\n}\n\nexport class GraphNode {\n private readonly _edges: Edge[] = []\n\n constructor (\n public readonly id: number,\n public readonly name: string,\n public readonly type: NodeElementType,\n public readonly element: XNode\n ) {}\n\n get edges (): readonly Edge[] {\n return this._edges\n }\n\n makeEdge (tail: number): Edge {\n const edge: Edge = { head: this.id, tail }\n this._edges.push(edge)\n return edge\n }\n\n isRequired (): boolean {\n if (this.name === 'StandardHeader' || this.name === 'StandardTrailer') return true\n return this.element.attribute('required') === 'Y'\n }\n\n toString (): string {\n return `Node: id=${this.id}, name=${this.name}, type=${this.type}`\n }\n}\n\nexport interface QuickFixGraphParserOptions {\n validateBeforeParsing?: boolean\n}\n\nexport class QuickFixGraphParser {\n private readonly definitions: FixDefinitions\n private readonly nodes = new Map<number, GraphNode>()\n private readonly containedSets = new Map<number, ContainedFieldSet>()\n private readonly queue: GraphNode[] = []\n private nextId = 0\n private header: GraphNode | null = null\n private trailer: GraphNode | null = null\n\n public validator: DictionaryValidator | null = null\n public readonly validateBeforeParsing: boolean\n\n constructor (definitions: FixDefinitions, options: QuickFixGraphParserOptions = {}) {\n this.definitions = definitions\n this.validateBeforeParsing = options.validateBeforeParsing ?? true\n }\n\n /**\n * Parse XML text into the FixDefinitions provided at construction.\n * Throws DictionaryValidationException if validation is enabled and errors are found.\n */\n parseText (xml: string): FixDefinitions {\n const doc = SaxTreeBuilder.parse(xml)\n return this.parseDocument(doc)\n }\n\n /**\n * Parse a pre-built XDocument tree.\n */\n parseDocument (doc: XDocument): FixDefinitions {\n if (this.validateBeforeParsing) {\n this.validator = new DictionaryValidator()\n this.validator.validate(doc)\n this.validator.throwIfErrors()\n }\n\n this.parseVersion(doc)\n this.parseFields(doc)\n this.parseComponents(doc)\n this.parseHeader(doc)\n this.parseTrailer(doc)\n this.parseMessages(doc)\n\n for (let node = this.queue.shift(); node !== undefined; node = this.queue.shift()) {\n this.work(node)\n }\n\n /*\n * At this point all fields on all sets are placed, however the parent (e.g. an\n * Instrument component) is not aware of the tags contained in nested groups/components\n * that were resolved AFTER it. The IndexVisitor walks every message and re-indexes\n * its tree post-order so each set knows all tags below it — essential for the segment\n * parser to work.\n */\n new IndexVisitor().compute(this.definitions)\n\n return this.definitions\n }\n\n // ── Graph construction ──\n\n private makeNode (name: string, element: XNode, type: NodeElementType): GraphNode {\n const node = new GraphNode(this.nextId++, name, type, element)\n this.nodes.set(node.id, node)\n this.queue.push(node)\n return node\n }\n\n private constructTailNode (name: string, headNode: GraphNode, element: XNode, type: NodeElementType): void {\n const tailNode = this.makeNode(name, element, type)\n headNode.makeEdge(tailNode.id)\n tailNode.makeEdge(headNode.id)\n }\n\n // ── Parsing entry points ──\n\n private parseVersion (doc: XDocument): void {\n const version = doc.firstDescendant('fix')\n if (!version) throw new Error('no <fix> root element')\n const major = parseInt(version.attribute('major') ?? '0', 10)\n const minor = parseInt(version.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(version.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const resolved = VersionUtil.resolve(description)\n // FixDefinitions doesn't have a setVersion — version is set at construction\n if (resolved !== this.definitions.version) {\n throw new Error(`version mismatch: dictionary declares ${description} but FixDefinitions was constructed with ${this.definitions.version}`)\n }\n }\n\n private parseFields (doc: XDocument): void {\n const fieldsNode = doc.firstDescendant('fields')\n if (!fieldsNode) return\n for (const fieldElement of fieldsNode.elements('field')) {\n this.makeNode(QuickFixGraphParser.nameFrom(fieldElement), fieldElement, NodeElementType.SimpleFieldDefinition)\n }\n }\n\n private parseComponents (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) return\n for (const componentElement of componentsNode.elements('component')) {\n this.makeNode(QuickFixGraphParser.nameFrom(componentElement), componentElement, NodeElementType.ComponentDefinition)\n }\n }\n\n private parseHeader (doc: XDocument): void {\n const header = doc.firstDescendant('header')\n if (!header) throw new Error('no header declared in fix definitions')\n this.header = this.makeNode('StandardHeader', header, NodeElementType.ComponentDefinition)\n }\n\n private parseTrailer (doc: XDocument): void {\n const trailer = doc.firstDescendant('trailer')\n if (!trailer) throw new Error('no trailer declared in fix definitions')\n this.trailer = this.makeNode('StandardTrailer', trailer, NodeElementType.ComponentDefinition)\n }\n\n private parseMessages (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) return\n for (const messageElement of messagesNode.elements('message')) {\n const msgType = messageElement.attribute('msgtype')\n if (!msgType) continue\n this.makeNode(msgType, messageElement, NodeElementType.MessageDefinition)\n }\n }\n\n // ── Work queue dispatch ──\n\n private work (node: GraphNode): void {\n switch (node.type) {\n case NodeElementType.SimpleFieldDefinition: {\n const sd = QuickFixGraphParser.getField(node.element)\n this.definitions.addSimpleFieldDef(sd)\n break\n }\n case NodeElementType.MessageDefinition: {\n this.messageDefinition(node)\n break\n }\n case NodeElementType.ComponentDefinition: {\n this.componentDefinition(node)\n break\n }\n case NodeElementType.SimpleFieldDeclaration: {\n this.simpleFieldDeclaration(node)\n break\n }\n case NodeElementType.InlineGroupDefinition: {\n this.inlineGroupDefinition(node)\n break\n }\n case NodeElementType.GroupDefinition: {\n this.groupDefinition(node)\n break\n }\n case NodeElementType.ComponentDeclaration: {\n this.componentDeclaration(node)\n break\n }\n case NodeElementType.GroupDeclaration: {\n // QuickFix XML never has standalone group declarations — groups are always inline\n break\n }\n }\n }\n\n // ── Definition handlers ──\n\n private getComponentDefinition (node: GraphNode): ComponentFieldDefinition {\n let definition = this.definitions.component.get(node.name)\n if (definition) return definition\n definition = new ComponentFieldDefinition(node.name, node.name, null, node.name)\n this.definitions.addComponentFieldDef(definition)\n return definition\n }\n\n private componentDeclaration (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n const edge = node.edges[0]\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set on which to place declared component '${node.name}'`)\n }\n const containedComponent = new ContainedComponentField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedComponent)\n this.containedSets.set(edge.head, definition)\n }\n\n private messageDefinition (node: GraphNode): void {\n if (!this.header) throw new Error('header not set')\n if (!this.trailer) throw new Error('trailer not set')\n\n const md = QuickFixGraphParser.getMessage(node.element)\n this.definitions.addMessage(md)\n this.containedSets.set(node.id, md)\n\n // wrap the message body in StandardHeader + content + StandardTrailer\n this.constructTailNode('StandardHeader', node, this.header.element, NodeElementType.ComponentDeclaration)\n this.expandSet(node)\n this.constructTailNode('StandardTrailer', node, this.trailer.element, NodeElementType.ComponentDeclaration)\n }\n\n private componentDefinition (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n this.containedSets.set(node.id, definition)\n this.expandSet(node)\n }\n\n private groupDefinition (node: GraphNode): void {\n const tail = node.edges[0]?.tail\n if (tail == null) {\n throw new Error(`node ${node} has no edges to find tail for group definition`)\n }\n const definition = this.containedSets.get(tail)\n if (!definition) {\n throw new Error(`node ${node} has no contained set for group definition`)\n }\n this.containedSets.set(node.edges[0].head, definition)\n this.expandSet(node)\n }\n\n private inlineGroupDefinition (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for inline group definition`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for inline group '${node.name}'`)\n }\n const noOFieldDefinition = this.definitions.simple.get(node.name)\n if (!noOFieldDefinition) {\n throw new Error(`${node.name} does not exist in simple field definitions to construct inline group`)\n }\n const name = node.name\n const definition = new GroupFieldDefinition(name, name, null, noOFieldDefinition, name)\n const containedGroup = new ContainedGroupField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedGroup)\n this.containedSets.set(edge.head, definition)\n this.constructTailNode(name, node, node.element, NodeElementType.GroupDefinition)\n }\n\n private simpleFieldDeclaration (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for simple field declaration`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for declared field '${node.name}'`)\n }\n const sd = this.definitions.simple.get(node.name)\n if (!sd) {\n throw new Error(`element ${node} cannot be located as a simple field`)\n }\n const containedSimpleField = new ContainedSimpleField(sd, parentSet.fields.length, node.isRequired(), false)\n new ContainedSetBuilder(parentSet).add(containedSimpleField)\n }\n\n // ── Set expansion ──\n\n /**\n * Walks the children of a definition node and constructs tail nodes for each\n * field/group/component reference, queuing them for resolution.\n */\n private expandSet (node: GraphNode): void {\n for (const child of node.element.elements()) {\n switch (child.name) {\n case 'field': {\n this.expandField(node, child)\n break\n }\n case 'group': {\n this.expandGroup(node, child)\n break\n }\n case 'component': {\n this.expandComponent(node, child)\n break\n }\n }\n }\n }\n\n private expandField (node: GraphNode, element: XNode): void {\n this.constructTailNode(QuickFixGraphParser.nameFrom(element), node, element, NodeElementType.SimpleFieldDeclaration)\n }\n\n private expandGroup (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.InlineGroupDefinition, NodeElementType.GroupDeclaration)\n }\n\n private expandComponent (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.ComponentDefinition, NodeElementType.ComponentDeclaration)\n }\n\n private expandSetChild (\n node: GraphNode,\n element: XNode,\n defineElement: NodeElementType,\n declareElement: NodeElementType\n ): void {\n const name = QuickFixGraphParser.nameFrom(element)\n const hasInlinedFields = element.elements().length > 0\n const elementType = hasInlinedFields ? defineElement : declareElement\n this.constructTailNode(name, node, element, elementType)\n }\n\n // ── Static helpers ──\n\n /**\n * Extract a name from an element's attributes, with the same conventions as the C# parser:\n * strip spaces, prefix with 'F' if the name starts with a digit.\n */\n static nameFrom (element: XNode): string {\n let name = element.attribute('name') ?? ''\n name = name.replace(/ /g, '')\n if (name.length > 0 && name[0] >= '0' && name[0] <= '9') {\n name = `F${name}`\n }\n return name\n }\n\n static getField (element: XNode): SimpleFieldDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const numberStr = element.attribute('number')\n const tag = numberStr != null ? parseInt(numberStr, 10) : -1\n if (tag < 0) throw new Error(`no tag/number for ${name}`)\n const type = element.attribute('type') ?? 'STRING'\n\n const sd = new SimpleFieldDefinition(String(tag), name, name, null, null, type, null)\n // Add enum values\n for (const value of element.elements('value')) {\n const enumKey = value.attribute('enum')\n const description = value.attribute('description') ?? ''\n if (enumKey != null) {\n sd.addEnum(enumKey, description, description)\n }\n }\n return sd\n }\n\n static getMessage (element: XNode): MessageDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const msgCat = element.attribute('msgcat') ?? ''\n const msgType = element.attribute('msgtype') ?? ''\n return new MessageDefinition(name, name, msgType, msgCat, name)\n }\n\n /**\n * Convenience: parse XML text into a fresh FixDefinitions.\n */\n static parse (xml: string, options: QuickFixGraphParserOptions = {}): FixDefinitions {\n // Pre-parse the version so we can construct FixDefinitions correctly\n const doc = SaxTreeBuilder.parse(xml)\n const fixRoot = doc.firstDescendant('fix')\n if (!fixRoot) throw new Error('no <fix> root element')\n const major = parseInt(fixRoot.attribute('major') ?? '0', 10)\n const minor = parseInt(fixRoot.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(fixRoot.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const definitions = new FixDefinitions(FixDefinitionSource.QuickFix, VersionUtil.resolve(description))\n const parser = new QuickFixGraphParser(definitions, options)\n return parser.parseDocument(doc)\n }\n}\n"]}
@@ -12,6 +12,6 @@ export interface ValidationError {
12
12
  readonly suggestion?: string;
13
13
  }
14
14
  export declare class DictionaryValidationException extends Error {
15
- readonly errors: ReadonlyArray<ValidationError>;
16
- constructor(errors: ReadonlyArray<ValidationError>);
15
+ readonly errors: readonly ValidationError[];
16
+ constructor(errors: readonly ValidationError[]);
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/validation-error.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,qCAAe,CAAA;AACjB,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAYD,MAAa,6BAA8B,SAAQ,KAAK;IACtD,YAA6B,MAAsC;QACjE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;QACrF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QACzF,MAAM,MAAM,GAAG,yCAAyC,UAAU,iBAAiB,YAAY,cAAc,CAAA;QAC7G,MAAM,OAAO,GAAG,MAAM;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC;aACpD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;YACvC,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI;gBAAE,IAAI,IAAI,UAAU,CAAC,CAAC,UAAU,GAAG,CAAA;YAC3D,IAAI,CAAC,CAAC,UAAU;gBAAE,IAAI,IAAI,MAAM,CAAC,CAAC,UAAU,EAAE,CAAA;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,KAAK,CAAC,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC,CAAA;QAdH,WAAM,GAAN,MAAM,CAAgC;QAejE,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,CAAC;CACF;AAlBD,sEAkBC","sourcesContent":["export enum ValidationSeverity {\n Warning = 'Warning',\n Error = 'Error'\n}\n\nexport interface ValidationError {\n readonly severity: ValidationSeverity\n readonly code: string\n readonly message: string\n readonly elementName?: string\n readonly elementType?: string\n readonly lineNumber?: number\n readonly suggestion?: string\n}\n\nexport class DictionaryValidationException extends Error {\n constructor (public readonly errors: ReadonlyArray<ValidationError>) {\n const errorCount = errors.filter(e => e.severity === ValidationSeverity.Error).length\n const warningCount = errors.filter(e => e.severity === ValidationSeverity.Warning).length\n const header = `FIX dictionary validation failed with ${errorCount} error(s) and ${warningCount} warning(s):`\n const details = errors\n .filter(e => e.severity === ValidationSeverity.Error)\n .slice(0, 20)\n .map(e => {\n let line = ` [${e.code}] ${e.message}`\n if (e.lineNumber != null) line += ` (line ${e.lineNumber})`\n if (e.suggestion) line += ` — ${e.suggestion}`\n return line\n })\n .join('\\n')\n super(`${header}\\n${details}`)\n this.name = 'DictionaryValidationException'\n }\n}\n"]}
1
+ {"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/validation-error.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,qCAAe,CAAA;AACjB,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAYD,MAAa,6BAA8B,SAAQ,KAAK;IACtD,YAA6B,MAAkC;QAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;QACrF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QACzF,MAAM,MAAM,GAAG,yCAAyC,UAAU,iBAAiB,YAAY,cAAc,CAAA;QAC7G,MAAM,OAAO,GAAG,MAAM;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC;aACpD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;YACvC,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI;gBAAE,IAAI,IAAI,UAAU,CAAC,CAAC,UAAU,GAAG,CAAA;YAC3D,IAAI,CAAC,CAAC,UAAU;gBAAE,IAAI,IAAI,MAAM,CAAC,CAAC,UAAU,EAAE,CAAA;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,KAAK,CAAC,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC,CAAA;QAdH,WAAM,GAAN,MAAM,CAA4B;QAe7D,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,CAAC;CACF;AAlBD,sEAkBC","sourcesContent":["export enum ValidationSeverity {\n Warning = 'Warning',\n Error = 'Error'\n}\n\nexport interface ValidationError {\n readonly severity: ValidationSeverity\n readonly code: string\n readonly message: string\n readonly elementName?: string\n readonly elementType?: string\n readonly lineNumber?: number\n readonly suggestion?: string\n}\n\nexport class DictionaryValidationException extends Error {\n constructor (public readonly errors: readonly ValidationError[]) {\n const errorCount = errors.filter(e => e.severity === ValidationSeverity.Error).length\n const warningCount = errors.filter(e => e.severity === ValidationSeverity.Warning).length\n const header = `FIX dictionary validation failed with ${errorCount} error(s) and ${warningCount} warning(s):`\n const details = errors\n .filter(e => e.severity === ValidationSeverity.Error)\n .slice(0, 20)\n .map(e => {\n let line = ` [${e.code}] ${e.message}`\n if (e.lineNumber != null) line += ` (line ${e.lineNumber})`\n if (e.suggestion) line += ` — ${e.suggestion}`\n return line\n })\n .join('\\n')\n super(`${header}\\n${details}`)\n this.name = 'DictionaryValidationException'\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ import 'reflect-metadata';
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ require("reflect-metadata");
49
+ const path = __importStar(require("path"));
50
+ const fs = __importStar(require("fs"));
51
+ const minimist = require("minimist");
52
+ const minimist_options_1 = __importDefault(require("minimist-options"));
53
+ const ascii_1 = require("./buffer/ascii");
54
+ const util_1 = require("./util");
55
+ const runtime_1 = require("./runtime");
56
+ const di_tokens_1 = require("./runtime/di-tokens");
57
+ const benchmark_1 = require("./benchmark");
58
+ const options = (0, minimist_options_1.default)({
59
+ dict: {
60
+ type: 'string',
61
+ alias: 'd',
62
+ default: 'qf44'
63
+ },
64
+ fix: {
65
+ type: 'string',
66
+ alias: 'f',
67
+ default: 'data/examples/FIX.4.4/quickfix/execution-report/fix.txt'
68
+ },
69
+ session: {
70
+ type: 'string',
71
+ alias: 's',
72
+ default: 'data/session/test-initiator.json'
73
+ },
74
+ delimiter: {
75
+ type: 'string',
76
+ alias: 'l',
77
+ default: '|'
78
+ },
79
+ depth: {
80
+ type: 'string',
81
+ default: 'view,object'
82
+ },
83
+ rounds: {
84
+ type: 'number',
85
+ default: benchmark_1.defaultBenchOptions.rounds
86
+ },
87
+ msgs: {
88
+ type: 'number',
89
+ default: benchmark_1.defaultBenchOptions.operationsPerRound
90
+ },
91
+ warmup: {
92
+ type: 'number',
93
+ default: benchmark_1.defaultBenchOptions.warmupOperations
94
+ },
95
+ label: {
96
+ type: 'string',
97
+ default: 'jspurefix'
98
+ },
99
+ save: {
100
+ type: 'string'
101
+ },
102
+ baseline: {
103
+ type: 'string'
104
+ },
105
+ json: {
106
+ type: 'boolean',
107
+ default: false
108
+ },
109
+ help: {
110
+ type: 'boolean',
111
+ alias: 'h',
112
+ default: false
113
+ }
114
+ });
115
+ const argv = minimist(process.argv.slice(2), options);
116
+ const root = path.join(__dirname, '../');
117
+ function norm(p) {
118
+ return path.isAbsolute(p) ? p : path.join(root, p);
119
+ }
120
+ function usage() {
121
+ console.log('measure the parse path and what it costs in time and in garbage');
122
+ console.log();
123
+ console.log(' --fix=<path> fix log to parse, defaults to a 4.4 execution report');
124
+ console.log(' --dict=<name> dictionary, e.g. qf44, repo44, qf50sp2');
125
+ console.log(' --delimiter=<char> field delimiter in the log, defaults to |');
126
+ console.log(' --depth=view,object which stages to measure, comma separated');
127
+ console.log(' --rounds=<n> measured rounds, one sample each');
128
+ console.log(' --msgs=<n> messages per round');
129
+ console.log(' --warmup=<n> messages discarded before measuring');
130
+ console.log(' --save=<path> write the suite to json');
131
+ console.log(' --baseline=<path> compare against a previously saved suite');
132
+ console.log(' --json print the suite as json instead of a report');
133
+ console.log();
134
+ console.log('run under --expose-gc so rounds can be isolated and heap read cleanly:');
135
+ console.log(' node --expose-gc dist/jsfix-bench --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt');
136
+ console.log(' npm run bench');
137
+ }
138
+ function makeConfig() {
139
+ return __awaiter(this, void 0, void 0, function* () {
140
+ const sys = new runtime_1.SessionContainer();
141
+ sys.registerGlobal('error');
142
+ const sessionDescription = require(norm(argv.session));
143
+ const container = yield sys.makeSystem(sessionDescription);
144
+ const config = container.resolve(di_tokens_1.DITokens.IJsFixConfig);
145
+ config.definitions = yield new util_1.DefinitionFactory().getDefinitions(argv.dict);
146
+ config.delimiter = ascii_1.AsciiChars.firstChar(argv.delimiter);
147
+ return config;
148
+ });
149
+ }
150
+ function requestedDepths() {
151
+ const known = new Map([
152
+ ['view', benchmark_1.ParseDepth.View],
153
+ ['object', benchmark_1.ParseDepth.Object]
154
+ ]);
155
+ const asked = String(argv.depth).split(',').map(d => d.trim().toLowerCase()).filter(d => d.length > 0);
156
+ return asked.map(d => {
157
+ const depth = known.get(d);
158
+ if (!depth) {
159
+ throw new Error(`unknown depth ${d}, expected view or object`);
160
+ }
161
+ return depth;
162
+ });
163
+ }
164
+ function readSuite(p) {
165
+ return JSON.parse(fs.readFileSync(norm(p), 'utf8'));
166
+ }
167
+ function main() {
168
+ return __awaiter(this, void 0, void 0, function* () {
169
+ if (argv.help) {
170
+ usage();
171
+ return;
172
+ }
173
+ const fixPath = norm(argv.fix);
174
+ if (!fs.existsSync(fixPath)) {
175
+ throw new Error(`no such fix log ${fixPath}`);
176
+ }
177
+ const contents = fs.readFileSync(fixPath, 'utf8');
178
+ const config = yield makeConfig();
179
+ const cases = requestedDepths().map(depth => new benchmark_1.ParseCase(`parse:${depth}`, { config, contents, depth }));
180
+ const perInvocation = cases[0].operationsPerInvocation;
181
+ const operationsPerRound = cases[0].alignOperations(argv.msgs);
182
+ const benchOptions = {
183
+ warmupOperations: cases[0].alignOperations(argv.warmup),
184
+ rounds: argv.rounds,
185
+ operationsPerRound,
186
+ gcBetweenRounds: true
187
+ };
188
+ console.log(`${path.relative(root, fixPath)} ${perInvocation} msg/pass dict ${argv.dict}`);
189
+ const suite = yield new benchmark_1.BenchRunner(benchOptions).runAll(argv.label, cases);
190
+ if (argv.json) {
191
+ console.log(JSON.stringify(suite, null, 2));
192
+ }
193
+ else {
194
+ console.log();
195
+ console.log((0, benchmark_1.formatSuite)(suite));
196
+ }
197
+ if (argv.baseline) {
198
+ console.log();
199
+ console.log((0, benchmark_1.formatComparison)(readSuite(argv.baseline), suite));
200
+ }
201
+ if (argv.save) {
202
+ const target = norm(argv.save);
203
+ fs.mkdirSync(path.dirname(target), { recursive: true });
204
+ fs.writeFileSync(target, JSON.stringify(suite, null, 2), 'utf8');
205
+ console.log(`saved ${path.relative(root, target)}`);
206
+ }
207
+ });
208
+ }
209
+ main().catch(e => {
210
+ console.error(e instanceof Error ? e.message : e);
211
+ process.exit(1);
212
+ });
213
+ //# sourceMappingURL=jsfix-bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsfix-bench.js","sourceRoot":"","sources":["../src/jsfix-bench.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4BAAyB;AAEzB,2CAA4B;AAC5B,uCAAwB;AACxB,qCAAqC;AACrC,wEAA2C;AAE3C,0CAA2C;AAE3C,iCAA0C;AAC1C,uCAA4C;AAC5C,mDAA8C;AAC9C,2CAUoB;AAEpB,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,MAAM;KAChB;IAED,GAAG,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,yDAAyD;KACnE;IAED,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,kCAAkC;KAC5C;IAED,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,GAAG;KACb;IAED,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,aAAa;KACvB;IAED,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,+BAAmB,CAAC,MAAM;KACpC;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,+BAAmB,CAAC,kBAAkB;KAChD;IAED,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,+BAAmB,CAAC,gBAAgB;KAC9C;IAED,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;KACrB;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;KACf;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;KACf;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,KAAK;KACf;CACF,CAAC,CAAA;AAEF,MAAM,IAAI,GAAQ,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AAE1D,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;AAEhD,SAAS,IAAI,CAAE,CAAS;IACtB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,KAAK;IACZ,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAA;IAC9E,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAA;IACzF,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;IAC3E,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAA;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;IAC7E,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;IACrE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;IACxE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;IAC5D,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;IAC7E,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAA;IAChF,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAA;IACrF,OAAO,CAAC,GAAG,CAAC,mGAAmG,CAAC,CAAA;IAChH,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;AAChC,CAAC;AAED,SAAe,UAAU;;QACvB,MAAM,GAAG,GAAG,IAAI,0BAAgB,EAAE,CAAA;QAClC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QACtD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAe,oBAAQ,CAAC,YAAY,CAAC,CAAA;QACrE,MAAM,CAAC,WAAW,GAAG,MAAM,IAAI,wBAAiB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAG5E,MAAM,CAAC,SAAS,GAAG,kBAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvD,OAAO,MAAM,CAAA;IACf,CAAC;CAAA;AAED,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAqB;QACxC,CAAC,MAAM,EAAE,sBAAU,CAAC,IAAI,CAAC;QACzB,CAAC,QAAQ,EAAE,sBAAU,CAAC,MAAM,CAAC;KAC9B,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACtG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;QAChE,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAE,CAAS;IAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,SAAe,IAAI;;QACjB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,KAAK,EAAE,CAAA;YACP,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAA;QAC/C,CAAC;QACD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;QAEjC,MAAM,KAAK,GAAgB,eAAe,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACvD,IAAI,qBAAS,CAAC,SAAS,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QAI/D,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAA;QACtD,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,YAAY,GAAkB;YAClC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;YACvD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,kBAAkB;YAClB,eAAe,EAAE,IAAI;SACtB,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,aAAa,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5F,MAAM,KAAK,GAAG,MAAM,IAAI,uBAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAqB,CAAC,CAAA;QAE3F,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,OAAO,CAAC,GAAG,CAAC,IAAA,uBAAW,EAAC,KAAK,CAAC,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,OAAO,CAAC,GAAG,CAAC,IAAA,4BAAgB,EAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACvD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA","sourcesContent":["import 'reflect-metadata'\n\nimport * as path from 'path'\nimport * as fs from 'fs'\nimport minimist = require('minimist')\nimport buildOptions from 'minimist-options'\n\nimport { AsciiChars } from './buffer/ascii'\nimport { IJsFixConfig } from './config'\nimport { DefinitionFactory } from './util'\nimport { SessionContainer } from './runtime'\nimport { DITokens } from './runtime/di-tokens'\nimport {\n BenchRunner,\n IBenchCase,\n IBenchOptions,\n IBenchSuiteResult,\n ParseCase,\n ParseDepth,\n defaultBenchOptions,\n formatComparison,\n formatSuite\n} from './benchmark'\n\nconst options = buildOptions({\n dict: {\n type: 'string',\n alias: 'd',\n default: 'qf44'\n },\n\n fix: {\n type: 'string',\n alias: 'f',\n default: 'data/examples/FIX.4.4/quickfix/execution-report/fix.txt'\n },\n\n session: {\n type: 'string',\n alias: 's',\n default: 'data/session/test-initiator.json'\n },\n\n delimiter: {\n type: 'string',\n alias: 'l',\n default: '|'\n },\n\n depth: {\n type: 'string',\n default: 'view,object'\n },\n\n rounds: {\n type: 'number',\n default: defaultBenchOptions.rounds\n },\n\n msgs: {\n type: 'number',\n default: defaultBenchOptions.operationsPerRound\n },\n\n warmup: {\n type: 'number',\n default: defaultBenchOptions.warmupOperations\n },\n\n label: {\n type: 'string',\n default: 'jspurefix'\n },\n\n save: {\n type: 'string'\n },\n\n baseline: {\n type: 'string'\n },\n\n json: {\n type: 'boolean',\n default: false\n },\n\n help: {\n type: 'boolean',\n alias: 'h',\n default: false\n }\n})\n\nconst argv: any = minimist(process.argv.slice(2), options)\n\nconst root: string = path.join(__dirname, '../')\n\nfunction norm (p: string): string {\n return path.isAbsolute(p) ? p : path.join(root, p)\n}\n\nfunction usage (): void {\n console.log('measure the parse path and what it costs in time and in garbage')\n console.log()\n console.log(' --fix=<path> fix log to parse, defaults to a 4.4 execution report')\n console.log(' --dict=<name> dictionary, e.g. qf44, repo44, qf50sp2')\n console.log(' --delimiter=<char> field delimiter in the log, defaults to |')\n console.log(' --depth=view,object which stages to measure, comma separated')\n console.log(' --rounds=<n> measured rounds, one sample each')\n console.log(' --msgs=<n> messages per round')\n console.log(' --warmup=<n> messages discarded before measuring')\n console.log(' --save=<path> write the suite to json')\n console.log(' --baseline=<path> compare against a previously saved suite')\n console.log(' --json print the suite as json instead of a report')\n console.log()\n console.log('run under --expose-gc so rounds can be isolated and heap read cleanly:')\n console.log(' node --expose-gc dist/jsfix-bench --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt')\n console.log(' npm run bench')\n}\n\nasync function makeConfig (): Promise<IJsFixConfig> {\n const sys = new SessionContainer()\n sys.registerGlobal('error')\n const sessionDescription = require(norm(argv.session))\n const container = await sys.makeSystem(sessionDescription)\n const config = container.resolve<IJsFixConfig>(DITokens.IJsFixConfig)\n config.definitions = await new DefinitionFactory().getDefinitions(argv.dict)\n // the parser reads the delimiter when it is constructed, so this has to be\n // settled before any case is built\n config.delimiter = AsciiChars.firstChar(argv.delimiter)\n return config\n}\n\nfunction requestedDepths (): ParseDepth[] {\n const known = new Map<string, ParseDepth>([\n ['view', ParseDepth.View],\n ['object', ParseDepth.Object]\n ])\n const asked = String(argv.depth).split(',').map(d => d.trim().toLowerCase()).filter(d => d.length > 0)\n return asked.map(d => {\n const depth = known.get(d)\n if (!depth) {\n throw new Error(`unknown depth ${d}, expected view or object`)\n }\n return depth\n })\n}\n\nfunction readSuite (p: string): IBenchSuiteResult {\n return JSON.parse(fs.readFileSync(norm(p), 'utf8'))\n}\n\nasync function main (): Promise<void> {\n if (argv.help) {\n usage()\n return\n }\n const fixPath = norm(argv.fix)\n if (!fs.existsSync(fixPath)) {\n throw new Error(`no such fix log ${fixPath}`)\n }\n const contents = fs.readFileSync(fixPath, 'utf8')\n const config = await makeConfig()\n\n const cases: ParseCase[] = requestedDepths().map(depth =>\n new ParseCase(`parse:${depth}`, { config, contents, depth }))\n\n // every case walks the same input, so one alignment covers the suite and all\n // of them stay directly comparable\n const perInvocation = cases[0].operationsPerInvocation\n const operationsPerRound = cases[0].alignOperations(argv.msgs)\n const benchOptions: IBenchOptions = {\n warmupOperations: cases[0].alignOperations(argv.warmup),\n rounds: argv.rounds,\n operationsPerRound,\n gcBetweenRounds: true\n }\n\n console.log(`${path.relative(root, fixPath)} ${perInvocation} msg/pass dict ${argv.dict}`)\n const suite = await new BenchRunner(benchOptions).runAll(argv.label, cases as IBenchCase[])\n\n if (argv.json) {\n console.log(JSON.stringify(suite, null, 2))\n } else {\n console.log()\n console.log(formatSuite(suite))\n }\n if (argv.baseline) {\n console.log()\n console.log(formatComparison(readSuite(argv.baseline), suite))\n }\n if (argv.save) {\n const target = norm(argv.save)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(target, JSON.stringify(suite, null, 2), 'utf8')\n console.log(`saved ${path.relative(root, target)}`)\n }\n}\n\nmain().catch(e => {\n console.error(e instanceof Error ? e.message : e)\n process.exit(1)\n})\n"]}
@@ -148,7 +148,7 @@ class SessionLauncher {
148
148
  else {
149
149
  if (factory.makeSession) {
150
150
  container.register(di_tokens_1.DITokens.FixSession, {
151
- useFactory: () => factory.makeSession(config)
151
+ useFactory: (c) => factory.makeSession(c.resolve(di_tokens_1.DITokens.IJsFixConfig))
152
152
  });
153
153
  }
154
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-launcher.js","sourceRoot":"","sources":["../../src/runtime/session-launcher.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path'\nimport { IJsFixConfig, IJsFixLogger, JsFixLoggerFactory, JsFixWinstonLogFactory, WinstonLogger } from '../config'\nimport { FixEntity, FixSession, ISessionDescription } from '../transport'\nimport { DependencyContainer } from 'tsyringe'\nimport { EngineFactory } from './engine-factory'\nimport { SessionContainer } from './session-container'\nimport { DITokens } from './di-tokens'\n\nconst defaultLoggerFactory = new JsFixWinstonLogFactory(WinstonLogger.consoleOptions('info'))\n\nexport abstract class SessionLauncher {\n public root: string = '../../'\n protected readonly logger: IJsFixLogger\n public readonly initiatorConfig: ISessionDescription | null\n public readonly acceptorConfig: ISessionDescription | null\n\n protected constructor (\n initiatorConfig: string | ISessionDescription | null = null,\n acceptorConfig: string | ISessionDescription | null = null,\n private readonly loggerFactory: JsFixLoggerFactory = defaultLoggerFactory\n ) {\n this.logger = this.loggerFactory.logger('launcher')\n this.initiatorConfig = initiatorConfig ? this.loadConfig(initiatorConfig) : null\n this.acceptorConfig = acceptorConfig ? this.loadConfig(acceptorConfig) : null\n }\n\n protected sessionContainer: SessionContainer = new SessionContainer()\n\n private async empty (): Promise<any> {\n return await new Promise((resolve, reject) => {\n try {\n setImmediate(() => {\n this.logger.info('resolving an empty promise')\n resolve(null)\n })\n } catch (e) {\n reject(e)\n }\n })\n }\n\n private acceptorEntity: FixEntity | null = null\n\n protected async getAcceptor (sessionContainer: DependencyContainer): Promise<any> {\n if (sessionContainer.isRegistered<FixEntity>(DITokens.FixEntity)) {\n const entity = sessionContainer.resolve<FixEntity>(DITokens.FixEntity)\n this.acceptorEntity = entity\n return entity.start()\n } else {\n return this.empty()\n }\n }\n\n protected async getInitiator (sessionContainer: DependencyContainer): Promise<any> {\n if (sessionContainer.isRegistered<FixEntity>(DITokens.FixEntity)) {\n const entity = sessionContainer.resolve<FixEntity>(DITokens.FixEntity)\n return entity.start()\n } else {\n return this.empty()\n }\n }\n\n /**\n * provide a factory which will be invoked with a config where an instance of the application\n * should be constructed and returned.\n * @param config to be provided to the constucted application representing this session\n * @protected\n */\n protected makeFactory (config: IJsFixConfig): EngineFactory | null {\n return null\n }\n\n public async run (): Promise<boolean> {\n return await new Promise<any>((resolve, reject) => {\n const logger = this.logger\n logger.info('launching ..')\n this.setup().then(() => {\n logger.info('.. done')\n resolve(true)\n }).catch((e: Error) => {\n logger.error(e)\n reject(e)\n })\n })\n }\n\n public exec (): void {\n this.run().then(() => {\n console.log('finished.')\n }).catch(e => {\n console.error(e)\n })\n }\n\n /**\n * is this session config representing an ascii based session\n * @param description config to be tested.\n */\n public isAscii (description: ISessionDescription): boolean {\n return this.sessionContainer.isAscii(description)\n }\n\n /**\n * is this session config representing an initiator based session\n * @param description config to be tested.\n */\n public isInitiator (description: ISessionDescription): boolean {\n return this.sessionContainer.isInitiator(description)\n }\n\n protected registerApplication (_: DependencyContainer): void {\n this.logger.info('bypass register via DI')\n }\n\n private async makeSystem (description: ISessionDescription): Promise<DependencyContainer> {\n const name = description.application?.name ?? 'na'\n const protocol = description.application?.protocol ?? 'ascii'\n this.logger.info(`creating app ${name} [protocol ${protocol}]`)\n return await this.sessionContainer.makeSystem(description)\n }\n\n private register (container: DependencyContainer): void {\n const config = container.resolve<IJsFixConfig>(DITokens.IJsFixConfig)\n const factory = this.makeFactory(config)\n if (!factory) {\n this.registerApplication(container)\n } else {\n if (factory.makeSession) {\n container.register<FixSession>(DITokens.FixSession, {\n useFactory: () => factory.makeSession(config)\n })\n }\n }\n }\n\n private async makeClient (): Promise<any> {\n if (!this.initiatorConfig) return\n const sessionContainer = await this.makeSystem(this.initiatorConfig)\n this.register(sessionContainer)\n this.logger.info('create initiator')\n return await this.getInitiator(sessionContainer)\n }\n\n private async makeServer (): Promise<any> {\n if (!this.acceptorConfig) return\n const sessionContainer = await this.makeSystem(this.acceptorConfig)\n this.register(sessionContainer)\n this.logger.info('create acceptor')\n return await this.getAcceptor(sessionContainer)\n }\n\n async serverOrEmpty (): Promise<any> {\n return this.acceptorConfig ? this.makeServer() : this.empty()\n }\n\n async clientOrEmpty (): Promise<any> {\n return this.initiatorConfig ? this.makeClient() : this.empty()\n }\n\n private async setup (): Promise<any> {\n this.sessionContainer.registerGlobal(this.loggerFactory)\n const server = this.serverOrEmpty()\n const client = this.clientOrEmpty()\n this.logger.info('launching ....')\n if (this.acceptorConfig && this.initiatorConfig) {\n // Both mode: client drives the lifecycle. When client finishes,\n // stop the acceptor so the process can exit cleanly.\n await client\n this.logger.info('client finished, stopping acceptor')\n this.stopAcceptor()\n return true\n }\n return await Promise.all([server, client])\n }\n\n private stopAcceptor (): void {\n const entity = this.acceptorEntity as any\n if (entity && typeof entity.stop === 'function') {\n entity.stop()\n }\n }\n\n private loadConfig (config: string | ISessionDescription): ISessionDescription {\n if (typeof config === 'string') {\n return require(path.join(this.root, config))\n }\n return config\n }\n}\n"]}
1
+ {"version":3,"file":"session-launcher.js","sourceRoot":"","sources":["../../src/runtime/session-launcher.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path'\nimport { IJsFixConfig, IJsFixLogger, JsFixLoggerFactory, JsFixWinstonLogFactory, WinstonLogger } from '../config'\nimport { FixEntity, FixSession, ISessionDescription } from '../transport'\nimport { DependencyContainer } from 'tsyringe'\nimport { EngineFactory } from './engine-factory'\nimport { SessionContainer } from './session-container'\nimport { DITokens } from './di-tokens'\n\nconst defaultLoggerFactory = new JsFixWinstonLogFactory(WinstonLogger.consoleOptions('info'))\n\nexport abstract class SessionLauncher {\n public root: string = '../../'\n protected readonly logger: IJsFixLogger\n public readonly initiatorConfig: ISessionDescription | null\n public readonly acceptorConfig: ISessionDescription | null\n\n protected constructor (\n initiatorConfig: string | ISessionDescription | null = null,\n acceptorConfig: string | ISessionDescription | null = null,\n private readonly loggerFactory: JsFixLoggerFactory = defaultLoggerFactory\n ) {\n this.logger = this.loggerFactory.logger('launcher')\n this.initiatorConfig = initiatorConfig ? this.loadConfig(initiatorConfig) : null\n this.acceptorConfig = acceptorConfig ? this.loadConfig(acceptorConfig) : null\n }\n\n protected sessionContainer: SessionContainer = new SessionContainer()\n\n private async empty (): Promise<any> {\n return await new Promise((resolve, reject) => {\n try {\n setImmediate(() => {\n this.logger.info('resolving an empty promise')\n resolve(null)\n })\n } catch (e) {\n reject(e)\n }\n })\n }\n\n private acceptorEntity: FixEntity | null = null\n\n protected async getAcceptor (sessionContainer: DependencyContainer): Promise<any> {\n if (sessionContainer.isRegistered<FixEntity>(DITokens.FixEntity)) {\n const entity = sessionContainer.resolve<FixEntity>(DITokens.FixEntity)\n this.acceptorEntity = entity\n return entity.start()\n } else {\n return this.empty()\n }\n }\n\n protected async getInitiator (sessionContainer: DependencyContainer): Promise<any> {\n if (sessionContainer.isRegistered<FixEntity>(DITokens.FixEntity)) {\n const entity = sessionContainer.resolve<FixEntity>(DITokens.FixEntity)\n return entity.start()\n } else {\n return this.empty()\n }\n }\n\n /**\n * provide a factory which will be invoked with a config where an instance of the application\n * should be constructed and returned.\n * @param config to be provided to the constucted application representing this session\n * @protected\n */\n protected makeFactory (config: IJsFixConfig): EngineFactory | null {\n return null\n }\n\n public async run (): Promise<boolean> {\n return await new Promise<any>((resolve, reject) => {\n const logger = this.logger\n logger.info('launching ..')\n this.setup().then(() => {\n logger.info('.. done')\n resolve(true)\n }).catch((e: Error) => {\n logger.error(e)\n reject(e)\n })\n })\n }\n\n public exec (): void {\n this.run().then(() => {\n console.log('finished.')\n }).catch(e => {\n console.error(e)\n })\n }\n\n /**\n * is this session config representing an ascii based session\n * @param description config to be tested.\n */\n public isAscii (description: ISessionDescription): boolean {\n return this.sessionContainer.isAscii(description)\n }\n\n /**\n * is this session config representing an initiator based session\n * @param description config to be tested.\n */\n public isInitiator (description: ISessionDescription): boolean {\n return this.sessionContainer.isInitiator(description)\n }\n\n protected registerApplication (_: DependencyContainer): void {\n this.logger.info('bypass register via DI')\n }\n\n private async makeSystem (description: ISessionDescription): Promise<DependencyContainer> {\n const name = description.application?.name ?? 'na'\n const protocol = description.application?.protocol ?? 'ascii'\n this.logger.info(`creating app ${name} [protocol ${protocol}]`)\n return await this.sessionContainer.makeSystem(description)\n }\n\n private register (container: DependencyContainer): void {\n const config = container.resolve<IJsFixConfig>(DITokens.IJsFixConfig)\n const factory = this.makeFactory(config)\n if (!factory) {\n this.registerApplication(container)\n } else {\n if (factory.makeSession) {\n // resolve the config from the container doing the resolving, not the one\n // captured here. An acceptor resolves each session from a per-connection\n // child scope which re-registers IJsFixConfig, so this is how an application\n // receives that session's own description, store and message factory.\n container.register<FixSession>(DITokens.FixSession, {\n useFactory: (c) => factory.makeSession(c.resolve<IJsFixConfig>(DITokens.IJsFixConfig))\n })\n }\n }\n }\n\n private async makeClient (): Promise<any> {\n if (!this.initiatorConfig) return\n const sessionContainer = await this.makeSystem(this.initiatorConfig)\n this.register(sessionContainer)\n this.logger.info('create initiator')\n return await this.getInitiator(sessionContainer)\n }\n\n private async makeServer (): Promise<any> {\n if (!this.acceptorConfig) return\n const sessionContainer = await this.makeSystem(this.acceptorConfig)\n this.register(sessionContainer)\n this.logger.info('create acceptor')\n return await this.getAcceptor(sessionContainer)\n }\n\n async serverOrEmpty (): Promise<any> {\n return this.acceptorConfig ? this.makeServer() : this.empty()\n }\n\n async clientOrEmpty (): Promise<any> {\n return this.initiatorConfig ? this.makeClient() : this.empty()\n }\n\n private async setup (): Promise<any> {\n this.sessionContainer.registerGlobal(this.loggerFactory)\n const server = this.serverOrEmpty()\n const client = this.clientOrEmpty()\n this.logger.info('launching ....')\n if (this.acceptorConfig && this.initiatorConfig) {\n // Both mode: client drives the lifecycle. When client finishes,\n // stop the acceptor so the process can exit cleanly.\n await client\n this.logger.info('client finished, stopping acceptor')\n this.stopAcceptor()\n return true\n }\n return await Promise.all([server, client])\n }\n\n private stopAcceptor (): void {\n const entity = this.acceptorEntity as any\n if (entity && typeof entity.stop === 'function') {\n entity.stop()\n }\n }\n\n private loadConfig (config: string | ISessionDescription): ISessionDescription {\n if (typeof config === 'string') {\n return require(path.join(this.root, config))\n }\n return config\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { IJsFixConfig } from '../config';
2
+ import { ISessionDescription } from '../transport/session/session-description';
3
+ export declare function makeSessionScope(config: IJsFixConfig, overrides?: Partial<ISessionDescription>): IJsFixConfig;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeSessionScope = makeSessionScope;
4
+ const config_1 = require("../config");
5
+ const di_tokens_1 = require("./di-tokens");
6
+ const elastic_buffer_1 = require("../buffer/elastic-buffer");
7
+ const clone_session_description_1 = require("../transport/session/clone-session-description");
8
+ const ascii_session_msg_factory_1 = require("../transport/ascii/ascii-session-msg-factory");
9
+ const fixml_session_msg_factory_1 = require("../transport/fixml/fixml-session-msg-factory");
10
+ function makeSessionScope(config, overrides) {
11
+ var _a;
12
+ const parent = config.sessionContainer;
13
+ const scope = parent.createChildContainer();
14
+ const description = (0, clone_session_description_1.cloneSessionDescription)(config.description, overrides);
15
+ const factory = makeSessionMsgFactory(description, config.factory);
16
+ scope.registerInstance(di_tokens_1.DITokens.ISessionDescription, description);
17
+ scope.registerInstance(di_tokens_1.DITokens.ISessionMsgFactory, factory);
18
+ scope.registerInstance(di_tokens_1.DITokens.TransmitBuffer, cloneBuffer(parent, di_tokens_1.DITokens.TransmitBuffer));
19
+ scope.registerInstance(di_tokens_1.DITokens.ParseBuffer, cloneBuffer(parent, di_tokens_1.DITokens.ParseBuffer));
20
+ const scoped = new config_1.JsFixConfig(factory, config.definitions, description, config.delimiter, config.logFactory);
21
+ scoped.logDelimiter = (_a = config.logDelimiter) !== null && _a !== void 0 ? _a : scoped.logDelimiter;
22
+ scoped.sessionStoreFactory = config.sessionStoreFactory;
23
+ scoped.sessionRegistry = config.sessionRegistry;
24
+ scoped.sessionContainer = scope;
25
+ scope.registerInstance(di_tokens_1.DITokens.IJsFixConfig, scoped);
26
+ scope.registerInstance(di_tokens_1.DITokens.Definitions, config.definitions);
27
+ return scoped;
28
+ }
29
+ function cloneBuffer(parent, token) {
30
+ if (!parent.isRegistered(token, true)) {
31
+ return new elastic_buffer_1.ElasticBuffer();
32
+ }
33
+ const existing = parent.resolve(token);
34
+ return new elastic_buffer_1.ElasticBuffer(existing.size);
35
+ }
36
+ function makeSessionMsgFactory(description, current) {
37
+ var _a, _b;
38
+ if (current === null || current === void 0 ? void 0 : current.cloneFor) {
39
+ return current.cloneFor(description);
40
+ }
41
+ const ascii = ((_a = description.application) === null || _a === void 0 ? void 0 : _a.protocol) === 'ascii';
42
+ const mutator = (_b = current === null || current === void 0 ? void 0 : current.mutator) !== null && _b !== void 0 ? _b : null;
43
+ return ascii
44
+ ? new ascii_session_msg_factory_1.AsciiSessionMsgFactory(description, mutator)
45
+ : new fixml_session_msg_factory_1.FixmlSessionMsgFactory(description, mutator);
46
+ }
47
+ //# sourceMappingURL=session-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-scope.js","sourceRoot":"","sources":["../../src/runtime/session-scope.ts"],"names":[],"mappings":";;AA2BA,4CAuBC;AAjDD,sCAAqD;AACrD,2CAAsC;AACtC,6DAAwD;AAGxD,8FAAwF;AACxF,4FAAqF;AACrF,4FAAqF;AAmBrF,SAAgB,gBAAgB,CAC9B,MAAoB,EACpB,SAAwC;;IACxC,MAAM,MAAM,GAAwB,MAAM,CAAC,gBAAgB,CAAA;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAA;IAE3C,MAAM,WAAW,GAAG,IAAA,mDAAuB,EAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAC1E,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAElE,KAAK,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAA;IACjE,KAAK,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;IAC5D,KAAK,CAAC,gBAAgB,CAAgB,oBAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;IAC5G,KAAK,CAAC,gBAAgB,CAAgB,oBAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAQ,CAAC,WAAW,CAAC,CAAC,CAAA;IAEtG,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IAC7G,MAAM,CAAC,YAAY,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,MAAM,CAAC,YAAY,CAAA;IAChE,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAA;IACvD,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAA;IAC/C,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAA;IAC/B,KAAK,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IACrD,KAAK,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAEhE,OAAO,MAAM,CAAA;AACf,CAAC;AAOD,SAAS,WAAW,CAAE,MAA2B,EAAE,KAAe;IAChE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,8BAAa,EAAE,CAAA;IAC5B,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAgB,KAAK,CAAC,CAAA;IACrD,OAAO,IAAI,8BAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC;AASD,SAAS,qBAAqB,CAC5B,WAAgC,EAChC,OAAkC;;IAClC,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,KAAK,GAAG,CAAA,MAAA,WAAW,CAAC,WAAW,0CAAE,QAAQ,MAAK,OAAO,CAAA;IAC3D,MAAM,OAAO,GAAG,MAAC,OAAe,aAAf,OAAO,uBAAP,OAAO,CAAU,OAAO,mCAAI,IAAI,CAAA;IACjD,OAAO,KAAK;QACV,CAAC,CAAC,IAAI,kDAAsB,CAAC,WAAW,EAAE,OAAO,CAAC;QAClD,CAAC,CAAC,IAAI,kDAAsB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;AACtD,CAAC","sourcesContent":["import { DependencyContainer } from 'tsyringe'\nimport { IJsFixConfig, JsFixConfig } from '../config'\nimport { DITokens } from './di-tokens'\nimport { ElasticBuffer } from '../buffer/elastic-buffer'\nimport { ISessionDescription } from '../transport/session/session-description'\nimport { ISessionMsgFactory } from '../transport/session/session-msg-factory'\nimport { cloneSessionDescription } from '../transport/session/clone-session-description'\nimport { AsciiSessionMsgFactory } from '../transport/ascii/ascii-session-msg-factory'\nimport { FixmlSessionMsgFactory } from '../transport/fixml/fixml-session-msg-factory'\n\n/**\n * A FIX acceptor serves many connections from one listener configuration. Until\n * this existed every accepted connection shared the *same* parse buffer, transmit\n * buffer, session description and message factory, because those are registered as\n * instances on the single session container built at start up. Two clients talking\n * to one acceptor would therefore interleave bytes in a shared ElasticBuffer and\n * compute the same SessionId - so the same message store file.\n *\n * A session scope is a tsyringe child container which re-registers exactly the\n * per-connection state. Everything else (dictionary, transient parser/transmitter\n * classes, logger factory) is inherited from the parent, and resolving a parent\n * registration from the child still injects the child's instances, so an\n * AsciiParser resolved here receives this scope's ParseBuffer.\n *\n * Mirrors cspurefix TradeCaptureSessionFactory.CreatePerSessionConfigAndEncoder,\n * which had to do the same thing for the same reason.\n */\nexport function makeSessionScope (\n config: IJsFixConfig,\n overrides?: Partial<ISessionDescription>): IJsFixConfig {\n const parent: DependencyContainer = config.sessionContainer\n const scope = parent.createChildContainer()\n\n const description = cloneSessionDescription(config.description, overrides)\n const factory = makeSessionMsgFactory(description, config.factory)\n\n scope.registerInstance(DITokens.ISessionDescription, description)\n scope.registerInstance(DITokens.ISessionMsgFactory, factory)\n scope.registerInstance<ElasticBuffer>(DITokens.TransmitBuffer, cloneBuffer(parent, DITokens.TransmitBuffer))\n scope.registerInstance<ElasticBuffer>(DITokens.ParseBuffer, cloneBuffer(parent, DITokens.ParseBuffer))\n\n const scoped = new JsFixConfig(factory, config.definitions, description, config.delimiter, config.logFactory)\n scoped.logDelimiter = config.logDelimiter ?? scoped.logDelimiter\n scoped.sessionStoreFactory = config.sessionStoreFactory\n scoped.sessionRegistry = config.sessionRegistry\n scoped.sessionContainer = scope\n scope.registerInstance(DITokens.IJsFixConfig, scoped)\n scope.registerInstance(DITokens.Definitions, config.definitions)\n\n return scoped\n}\n\n/**\n * A fresh buffer of the same capacity as the one the parent container holds, so the\n * sizing decisions made in SessionContainer.asAscii are honoured without repeating\n * them here.\n */\nfunction cloneBuffer (parent: DependencyContainer, token: DITokens): ElasticBuffer {\n if (!parent.isRegistered(token, true)) {\n return new ElasticBuffer()\n }\n const existing = parent.resolve<ElasticBuffer>(token)\n return new ElasticBuffer(existing.size)\n}\n\n/**\n * The scope needs a factory bound to *its* description, because the outbound header\n * carries this session's comp ids. Applications may supply their own factory (by\n * overriding SessionContainer.makeSessionFactory), and that must survive into the\n * per-session scope - building a stock one here would silently drop custom header\n * handling on the acceptor path. See issue #87.\n */\nfunction makeSessionMsgFactory (\n description: ISessionDescription,\n current: ISessionMsgFactory | null): ISessionMsgFactory {\n if (current?.cloneFor) {\n return current.cloneFor(description)\n }\n const ascii = description.application?.protocol === 'ascii'\n const mutator = (current as any)?.mutator ?? null\n return ascii\n ? new AsciiSessionMsgFactory(description, mutator)\n : new FixmlSessionMsgFactory(description, mutator)\n}\n"]}
@@ -54,9 +54,9 @@ class AppLauncher extends runtime_1.SessionLauncher {
54
54
  makeFactory(config) {
55
55
  const isInitiator = this.isInitiator(config.description);
56
56
  return {
57
- makeSession: () => isInitiator
58
- ? new http_client_1.HttpClient(config)
59
- : new http_server_1.HttpServer(config)
57
+ makeSession: (sessionConfig) => isInitiator
58
+ ? new http_client_1.HttpClient(sessionConfig)
59
+ : new http_server_1.HttpServer(sessionConfig)
60
60
  };
61
61
  }
62
62
  waitFor(ms) {
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/sample/http/oms/app.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4BAAyB;AAEzB,+CAA0C;AAC1C,+CAA0C;AAE1C,8CAA2E;AAI3E,2CAA4B;AAE5B,MAAM,WAAY,SAAQ,yBAAe;IACvC;QACE,KAAK,CACH,uCAAuC,EACvC,sCAAsC,CAAC,CAAA;IAC3C,CAAC;IAEkB,WAAW,CAAE,MAAoB;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACxD,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW;gBAC5B,CAAC,CAAC,IAAI,wBAAU,CAAC,MAAM,CAAC;gBACxB,CAAC,CAAC,IAAI,wBAAU,CAAC,MAAM,CAAC;SACV,CAAA;IACpB,CAAC;IAEK,OAAO,CAAE,EAAU;;YACvB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBACf,OAAO,CAAC,IAAI,CAAC,CAAA;gBACf,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBACX,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEwB,YAAY,CAAE,gBAAqC;;;YAC1E,MAAM,MAAM,GAAiB,gBAAgB,CAAC,OAAO,CAAe,kBAAQ,CAAC,YAAY,CAAC,CAAA;YAC1F,MAAM,IAAI,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,0CAAE,WAAW,0CAAE,IAAI,CAAA;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAe,kBAAQ,CAAC,YAAY,CAAC,CAAA;gBAC5E,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAY,kBAAQ,CAAC,SAAS,CAAC,CAAA;gBACzE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAS,EAAE;oBACxC,OAAO,SAAS,CAAC,KAAK,EAAE,CAAA;gBAC1B,CAAC,CAAA,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KAAA;CACF;AAED,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAA;AAC3B,CAAC,CAAC,IAAI,EAAE,CAAA","sourcesContent":["import 'reflect-metadata'\n\nimport { HttpServer } from './http-server'\nimport { HttpClient } from './http-client'\nimport { IJsFixConfig } from '../../../config'\nimport { DITokens, EngineFactory, SessionLauncher } from '../../../runtime'\nimport { DependencyContainer } from 'tsyringe'\nimport { FixEntity } from '../../../transport'\nimport { IHttpAdapter } from '../../../transport/http/http-adapter'\nimport * as util from 'util'\n\nclass AppLauncher extends SessionLauncher {\n public constructor () {\n super(\n 'data/session/test-http-initiator.json',\n 'data/session/test-http-acceptor.json')\n }\n\n protected override makeFactory (config: IJsFixConfig): EngineFactory {\n const isInitiator = this.isInitiator(config.description)\n return {\n makeSession: () => isInitiator\n ? new HttpClient(config)\n : new HttpServer(config)\n } as EngineFactory\n }\n\n async waitFor (ms: number): Promise<any> {\n const to = util.promisify(setTimeout)\n return new Promise((resolve, reject) => {\n to(ms).then(() => {\n resolve(null)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n protected override async getInitiator (sessionContainer: DependencyContainer): Promise<any> {\n const config: IJsFixConfig = sessionContainer.resolve<IJsFixConfig>(DITokens.IJsFixConfig)\n const http = config?.description?.application?.http\n if (http) {\n http.adapter = sessionContainer.resolve<IHttpAdapter>(DITokens.IHttpAdapter)\n const initiator = sessionContainer.resolve<FixEntity>(DITokens.FixEntity)\n return this.waitFor(1000).then(async () => {\n return initiator.start()\n })\n }\n }\n}\n\nconst l = new AppLauncher()\nl.exec()\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/sample/http/oms/app.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4BAAyB;AAEzB,+CAA0C;AAC1C,+CAA0C;AAE1C,8CAA2E;AAI3E,2CAA4B;AAE5B,MAAM,WAAY,SAAQ,yBAAe;IACvC;QACE,KAAK,CACH,uCAAuC,EACvC,sCAAsC,CAAC,CAAA;IAC3C,CAAC;IAEkB,WAAW,CAAE,MAAoB;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACxD,OAAO;YACL,WAAW,EAAE,CAAC,aAA2B,EAAE,EAAE,CAAC,WAAW;gBACvD,CAAC,CAAC,IAAI,wBAAU,CAAC,aAAa,CAAC;gBAC/B,CAAC,CAAC,IAAI,wBAAU,CAAC,aAAa,CAAC;SACjB,CAAA;IACpB,CAAC;IAEK,OAAO,CAAE,EAAU;;YACvB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBACf,OAAO,CAAC,IAAI,CAAC,CAAA;gBACf,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBACX,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEwB,YAAY,CAAE,gBAAqC;;;YAC1E,MAAM,MAAM,GAAiB,gBAAgB,CAAC,OAAO,CAAe,kBAAQ,CAAC,YAAY,CAAC,CAAA;YAC1F,MAAM,IAAI,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,0CAAE,WAAW,0CAAE,IAAI,CAAA;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAe,kBAAQ,CAAC,YAAY,CAAC,CAAA;gBAC5E,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAY,kBAAQ,CAAC,SAAS,CAAC,CAAA;gBACzE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAS,EAAE;oBACxC,OAAO,SAAS,CAAC,KAAK,EAAE,CAAA;gBAC1B,CAAC,CAAA,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;KAAA;CACF;AAED,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAA;AAC3B,CAAC,CAAC,IAAI,EAAE,CAAA","sourcesContent":["import 'reflect-metadata'\n\nimport { HttpServer } from './http-server'\nimport { HttpClient } from './http-client'\nimport { IJsFixConfig } from '../../../config'\nimport { DITokens, EngineFactory, SessionLauncher } from '../../../runtime'\nimport { DependencyContainer } from 'tsyringe'\nimport { FixEntity } from '../../../transport'\nimport { IHttpAdapter } from '../../../transport/http/http-adapter'\nimport * as util from 'util'\n\nclass AppLauncher extends SessionLauncher {\n public constructor () {\n super(\n 'data/session/test-http-initiator.json',\n 'data/session/test-http-acceptor.json')\n }\n\n protected override makeFactory (config: IJsFixConfig): EngineFactory {\n const isInitiator = this.isInitiator(config.description)\n return {\n makeSession: (sessionConfig: IJsFixConfig) => isInitiator\n ? new HttpClient(sessionConfig)\n : new HttpServer(sessionConfig)\n } as EngineFactory\n }\n\n async waitFor (ms: number): Promise<any> {\n const to = util.promisify(setTimeout)\n return new Promise((resolve, reject) => {\n to(ms).then(() => {\n resolve(null)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n protected override async getInitiator (sessionContainer: DependencyContainer): Promise<any> {\n const config: IJsFixConfig = sessionContainer.resolve<IJsFixConfig>(DITokens.IJsFixConfig)\n const http = config?.description?.application?.http\n if (http) {\n http.adapter = sessionContainer.resolve<IHttpAdapter>(DITokens.IHttpAdapter)\n const initiator = sessionContainer.resolve<FixEntity>(DITokens.FixEntity)\n return this.waitFor(1000).then(async () => {\n return initiator.start()\n })\n }\n }\n}\n\nconst l = new AppLauncher()\nl.exec()\n"]}
@@ -11,9 +11,9 @@ class AppLauncher extends runtime_1.SessionLauncher {
11
11
  makeFactory(config) {
12
12
  const isInitiator = this.isInitiator(config.description);
13
13
  return {
14
- makeSession: () => isInitiator
15
- ? new md_client_1.MDClient(config)
16
- : new md_server_1.MDServer(config)
14
+ makeSession: (sessionConfig) => isInitiator
15
+ ? new md_client_1.MDClient(sessionConfig)
16
+ : new md_server_1.MDServer(sessionConfig)
17
17
  };
18
18
  }
19
19
  }