jspurefix 5.9.1 → 5.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BACKPORT_PLAN.md +20 -7
- package/README.md +35 -0
- package/WORKLOG.md +119 -0
- package/dist/benchmark/bench-report.d.ts +5 -0
- package/dist/benchmark/bench-report.js +91 -0
- package/dist/benchmark/bench-report.js.map +1 -0
- package/dist/benchmark/bench-runner.d.ts +12 -0
- package/dist/benchmark/bench-runner.js +193 -0
- package/dist/benchmark/bench-runner.js.map +1 -0
- package/dist/benchmark/bench-stats.d.ts +10 -0
- package/dist/benchmark/bench-stats.js +56 -0
- package/dist/benchmark/bench-stats.js.map +1 -0
- package/dist/benchmark/bench-types.d.ts +74 -0
- package/dist/benchmark/bench-types.js +3 -0
- package/dist/benchmark/bench-types.js.map +1 -0
- package/dist/benchmark/gc-probe.d.ts +18 -0
- package/dist/benchmark/gc-probe.js +103 -0
- package/dist/benchmark/gc-probe.js.map +1 -0
- package/dist/benchmark/index.d.ts +6 -0
- package/dist/benchmark/index.js +23 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/benchmark/parse-bench.d.ts +28 -0
- package/dist/benchmark/parse-bench.js +85 -0
- package/dist/benchmark/parse-bench.js.map +1 -0
- package/dist/buffer/ascii/ascii-encoder.d.ts +1 -0
- package/dist/buffer/ascii/ascii-encoder.js +15 -0
- package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
- package/dist/buffer/ascii/ascii-parser.d.ts +1 -0
- package/dist/buffer/ascii/ascii-parser.js +4 -1
- package/dist/buffer/ascii/ascii-parser.js.map +1 -1
- package/dist/buffer/ascii/ascii-segment-parser.js +3 -2
- package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
- package/dist/buffer/ascii/tag-index.js.map +1 -1
- package/dist/buffer/msg-encoder.d.ts +2 -0
- package/dist/buffer/msg-encoder.js +1 -0
- package/dist/buffer/msg-encoder.js.map +1 -1
- package/dist/buffer/msg-view.d.ts +1 -0
- package/dist/buffer/msg-view.js +25 -19
- package/dist/buffer/msg-view.js.map +1 -1
- package/dist/dictionary/parser/quickfix/dictionary-validator.d.ts +1 -1
- package/dist/dictionary/parser/quickfix/dictionary-validator.js.map +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.d.ts +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js +1 -2
- package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js.map +1 -1
- package/dist/dictionary/parser/quickfix/validation-error.d.ts +2 -2
- package/dist/dictionary/parser/quickfix/validation-error.js.map +1 -1
- package/dist/jsfix-bench.d.ts +1 -0
- package/dist/jsfix-bench.js +213 -0
- package/dist/jsfix-bench.js.map +1 -0
- package/dist/runtime/session-container.d.ts +3 -0
- package/dist/runtime/session-container.js +8 -0
- package/dist/runtime/session-container.js.map +1 -1
- package/dist/runtime/session-launcher.d.ts +2 -1
- package/dist/runtime/session-launcher.js +4 -1
- package/dist/runtime/session-launcher.js.map +1 -1
- package/dist/store/file-session-store.js +1 -1
- package/dist/store/file-session-store.js.map +1 -1
- package/dist/store/file-session-stream-provider.d.ts +1 -0
- package/dist/store/file-session-stream-provider.js +13 -13
- package/dist/store/file-session-stream-provider.js.map +1 -1
- package/dist/store/fix-session-store-factory.d.ts +1 -1
- package/dist/store/fix-session-store-factory.js.map +1 -1
- package/dist/store/fix-session-store.d.ts +11 -11
- package/dist/store/fix-session-store.js.map +1 -1
- package/dist/store/memory-session-store.js.map +1 -1
- package/dist/store/session-stream-provider.d.ts +13 -13
- package/dist/store/session-stream-provider.js.map +1 -1
- package/dist/transport/ascii/ascii-msg-transmitter.d.ts +1 -0
- package/dist/transport/ascii/ascii-msg-transmitter.js +15 -0
- package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
- package/dist/transport/ascii/ascii-session-msg-factory.js +1 -7
- package/dist/transport/ascii/ascii-session-msg-factory.js.map +1 -1
- package/dist/transport/fixml/fixml-session-msg-factory.js +1 -6
- package/dist/transport/fixml/fixml-session-msg-factory.js.map +1 -1
- package/dist/transport/index.d.ts +3 -0
- package/dist/transport/index.js +3 -0
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/msg-payload.d.ts +3 -1
- package/dist/transport/msg-payload.js +2 -1
- package/dist/transport/msg-payload.js.map +1 -1
- package/dist/transport/msg-transmitter.d.ts +4 -1
- package/dist/transport/msg-transmitter.js +18 -2
- package/dist/transport/msg-transmitter.js.map +1 -1
- package/dist/transport/send-callback.d.ts +7 -0
- package/dist/transport/send-callback.js +3 -0
- package/dist/transport/send-callback.js.map +1 -0
- package/dist/transport/session/fix-clock.d.ts +1 -1
- package/dist/transport/session/fix-clock.js.map +1 -1
- package/dist/transport/session/fix-session.d.ts +2 -1
- package/dist/transport/session/fix-session.js +12 -3
- package/dist/transport/session/fix-session.js.map +1 -1
- package/dist/transport/session/resend-request-manager.d.ts +2 -2
- package/dist/transport/session/resend-request-manager.js.map +1 -1
- package/dist/transport/session/session-description.d.ts +2 -0
- package/dist/transport/session/session-description.js.map +1 -1
- package/dist/transport/session/session-sequence-coordinator.d.ts +1 -1
- package/dist/transport/session/session-sequence-coordinator.js.map +1 -1
- package/dist/transport/session/session-sequence-store.d.ts +3 -3
- package/dist/transport/session/session-sequence-store.js.map +1 -1
- package/dist/transport/tcp/tcp-initiator.js.map +1 -1
- package/docs/benchmarking.md +117 -0
- package/docs/custom-logon.md +225 -0
- package/eslint.config.mjs +15 -1
- package/jsfix.test_client.txt +62 -62
- package/jsfix.test_server.txt +72 -72
- package/package.json +9 -1
- package/src/benchmark/bench-report.ts +101 -0
- package/src/benchmark/bench-runner.ts +196 -0
- package/src/benchmark/bench-stats.ts +86 -0
- package/src/benchmark/bench-types.ts +110 -0
- package/src/benchmark/gc-probe.ts +145 -0
- package/src/benchmark/index.ts +6 -0
- package/src/benchmark/parse-bench.ts +144 -0
- package/src/buffer/ascii/ascii-encoder.ts +20 -0
- package/src/buffer/ascii/ascii-parser.ts +16 -1
- package/src/buffer/ascii/ascii-segment-parser.ts +9 -6
- package/src/buffer/ascii/tag-index.ts +3 -3
- package/src/buffer/msg-encoder.ts +12 -0
- package/src/buffer/msg-view.ts +35 -18
- package/src/dictionary/parser/quickfix/dictionary-validator.ts +1 -1
- package/src/dictionary/parser/quickfix/quick-fix-graph-parser.ts +2 -3
- package/src/dictionary/parser/quickfix/validation-error.ts +1 -1
- package/src/jsfix-bench.ts +204 -0
- package/src/runtime/session-container.ts +20 -0
- package/src/runtime/session-launcher.ts +19 -2
- package/src/store/file-session-store.ts +2 -2
- package/src/store/file-session-stream-provider.ts +17 -11
- package/src/store/fix-session-store-factory.ts +1 -1
- package/src/store/fix-session-store.ts +11 -11
- package/src/store/memory-session-store.ts +1 -1
- package/src/store/session-stream-provider.ts +13 -13
- package/src/transport/ascii/ascii-msg-transmitter.ts +20 -0
- package/src/transport/ascii/ascii-session-msg-factory.ts +6 -1
- package/src/transport/fixml/fixml-session-msg-factory.ts +3 -1
- package/src/transport/index.ts +5 -0
- package/src/transport/msg-payload.ts +5 -1
- package/src/transport/msg-transmitter.ts +31 -2
- package/src/transport/send-callback.ts +33 -0
- package/src/transport/session/fix-clock.ts +1 -1
- package/src/transport/session/fix-session.ts +22 -3
- package/src/transport/session/resend-request-manager.ts +4 -4
- package/src/transport/session/session-description.ts +14 -0
- package/src/transport/session/session-sequence-coordinator.ts +1 -1
- package/src/transport/session/session-sequence-store.ts +3 -3
- package/src/transport/tcp/tcp-initiator.ts +1 -1
|
@@ -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:
|
|
16
|
-
constructor(errors:
|
|
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,
|
|
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":"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","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"]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { DependencyContainer } from 'tsyringe';
|
|
2
2
|
import { IJsFixConfig, JsFixLoggerFactory } from '../config';
|
|
3
3
|
import { ISessionMsgFactory, ISessionDescription } from '../transport';
|
|
4
|
+
export type SessionMsgFactoryProvider = (description: ISessionDescription) => ISessionMsgFactory | null;
|
|
4
5
|
export declare class SessionContainer {
|
|
6
|
+
readonly msgFactoryProvider: SessionMsgFactoryProvider | null;
|
|
7
|
+
constructor(msgFactoryProvider?: SessionMsgFactoryProvider | null);
|
|
5
8
|
reset(): void;
|
|
6
9
|
registerGlobal(loggerFactory?: JsFixLoggerFactory): void;
|
|
7
10
|
registerGlobal(level: string): void;
|
|
@@ -25,6 +25,9 @@ const buffer_1 = require("../buffer");
|
|
|
25
25
|
const ascii_2 = require("../buffer/ascii");
|
|
26
26
|
const fixml_2 = require("../buffer/fixml");
|
|
27
27
|
class SessionContainer {
|
|
28
|
+
constructor(msgFactoryProvider = null) {
|
|
29
|
+
this.msgFactoryProvider = msgFactoryProvider;
|
|
30
|
+
}
|
|
28
31
|
reset() {
|
|
29
32
|
tsyringe_1.container.reset();
|
|
30
33
|
}
|
|
@@ -46,6 +49,11 @@ class SessionContainer {
|
|
|
46
49
|
});
|
|
47
50
|
}
|
|
48
51
|
makeSessionFactory(description) {
|
|
52
|
+
var _a;
|
|
53
|
+
const supplied = (_a = this.msgFactoryProvider) === null || _a === void 0 ? void 0 : _a.call(this, description);
|
|
54
|
+
if (supplied) {
|
|
55
|
+
return supplied;
|
|
56
|
+
}
|
|
49
57
|
const fixml = !this.isAscii(description);
|
|
50
58
|
return fixml
|
|
51
59
|
? new fixml_1.FixmlSessionMsgFactory(description)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-container.js","sourceRoot":"","sources":["../../src/runtime/session-container.ts"],"names":[],"mappings":"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","sourcesContent":["import { container, DependencyContainer } from 'tsyringe'\nimport { DefinitionFactory } from '../util'\nimport { IJsFixConfig, JsFixLoggerFactory, JsFixWinstonLogFactory, WinstonLogger } from '../config'\nimport { DITokens } from './di-tokens'\nimport { RuntimeFactory } from './make-config'\n\nimport {\n TcpAcceptorListener, RecoveringTcpInitiator,\n TcpInitiatorConnector, TcpInitiator\n} from '../transport/tcp'\nimport { HttpInitiator, HttpAcceptorListener, HttpJsonSampleAdapter } from '../transport/http'\nimport { ISessionMsgFactory, MsgTransmitter, ISessionDescription } from '../transport'\nimport { AsciiMsgTransmitter } from '../transport/ascii/ascii-msg-transmitter'\nimport { FixmlMsgTransmitter } from '../transport/fixml/fixml-msg-transmitter'\nimport { FixmlSessionMsgFactory } from '../transport/fixml'\nimport { AsciiSessionMsgFactory } from '../transport/ascii'\nimport { ElasticBuffer, MsgEncoder, MsgParser } from '../buffer'\nimport { AsciiParser, AsciiParserState, AsciiSegmentParser } from '../buffer/ascii'\nimport { FixmlEncoder, FiXmlParser } from '../buffer/fixml'\nimport { FixEntity } from '../transport/fix-entity'\nimport { IHttpAdapter } from '../transport/http/http-adapter'\n\nexport class SessionContainer {\n public reset (): void {\n container.reset()\n }\n\n public registerGlobal (loggerFactory?: JsFixLoggerFactory): void\n public registerGlobal (level: string): void\n public registerGlobal (levelOrLoggerFactory: string | JsFixLoggerFactory = 'info'): void {\n container.registerInstance(DefinitionFactory, new DefinitionFactory())\n let lf: JsFixLoggerFactory\n if (typeof levelOrLoggerFactory === 'string') {\n lf = new JsFixWinstonLogFactory(WinstonLogger.consoleOptions(levelOrLoggerFactory))\n } else {\n lf = levelOrLoggerFactory\n }\n container.registerInstance(DITokens.JsFixLoggerFactory, lf)\n container.register<RuntimeFactory>(RuntimeFactory, {\n useClass: RuntimeFactory\n })\n container.register<ElasticBuffer>(DITokens.ElasticBuffer, {\n useClass: ElasticBuffer\n })\n }\n\n protected makeSessionFactory (description: ISessionDescription): ISessionMsgFactory {\n const fixml = !this.isAscii(description)\n return fixml\n ? new FixmlSessionMsgFactory(description)\n : new AsciiSessionMsgFactory(description)\n }\n\n public newChild (description: ISessionDescription): DependencyContainer {\n const sessionContainer = container.createChildContainer()\n const sf = this.makeSessionFactory(description)\n sessionContainer.registerInstance(DITokens.ISessionDescription, description)\n sessionContainer.registerInstance(DITokens.ISessionMsgFactory, sf)\n return sessionContainer\n }\n\n public async makeSystem (description: ISessionDescription): Promise<DependencyContainer> {\n return await new Promise<DependencyContainer>((resolve, reject) => {\n const sessionContainer = this.newChild(description)\n const factory = sessionContainer.resolve<RuntimeFactory>(RuntimeFactory)\n factory.makeConfig().then((c: IJsFixConfig) => {\n this.registerSession(c, sessionContainer)\n resolve(sessionContainer)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n public isAscii (description: ISessionDescription): boolean {\n return description.application?.protocol === 'ascii'\n }\n\n public isInitiator (description: ISessionDescription): boolean {\n return description.application?.type === 'initiator'\n }\n\n public asAscii (description: ISessionDescription, sessionContainer: DependencyContainer): void {\n sessionContainer.register<MsgTransmitter>(DITokens.MsgTransmitter, {\n useClass: AsciiMsgTransmitter\n })\n sessionContainer.register<MsgParser>(DITokens.MsgParser, {\n useClass: AsciiParser\n })\n const parseSize = 160 * 1024\n const sendSize = 10 * 1024\n\n sessionContainer.register(DITokens.maxMessageLen, {\n useValue: parseSize\n })\n sessionContainer.register<AsciiSegmentParser>(AsciiSegmentParser, {\n useClass: AsciiSegmentParser\n })\n sessionContainer.register<AsciiParserState>(AsciiParserState, {\n useClass: AsciiParserState\n })\n\n sessionContainer.registerInstance<ElasticBuffer>(DITokens.TransmitBuffer, new ElasticBuffer(sendSize))\n sessionContainer.registerInstance<ElasticBuffer>(DITokens.ParseBuffer, new ElasticBuffer(parseSize))\n\n if (this.isInitiator(description)) {\n sessionContainer.register<TcpInitiator>(TcpInitiator, {\n useClass: TcpInitiator\n })\n sessionContainer.register<RecoveringTcpInitiator>(RecoveringTcpInitiator, {\n useClass: RecoveringTcpInitiator\n })\n sessionContainer.register<TcpInitiatorConnector>(TcpInitiatorConnector, {\n useClass: TcpInitiatorConnector\n })\n if (description.application?.resilient) {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: RecoveringTcpInitiator\n })\n } else {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: TcpInitiatorConnector\n })\n }\n } else {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: TcpAcceptorListener\n })\n }\n }\n\n public asFixml (description: ISessionDescription, sessionContainer: DependencyContainer): void {\n sessionContainer.register<MsgTransmitter>(DITokens.MsgTransmitter, {\n useClass: FixmlMsgTransmitter\n })\n const sendSize = 10 * 1024\n\n sessionContainer.register<MsgParser>(DITokens.MsgParser, {\n useClass: FiXmlParser\n })\n sessionContainer.register(DITokens.maxMessageLocations, {\n useValue: sendSize\n })\n sessionContainer.register<MsgEncoder>(DITokens.MsgEncoder, {\n useClass: FixmlEncoder\n })\n sessionContainer.registerInstance<ElasticBuffer>(DITokens.TransmitBuffer, new ElasticBuffer(sendSize))\n sessionContainer.register<HttpAcceptorListener>(HttpAcceptorListener, {\n useClass: HttpAcceptorListener\n })\n sessionContainer.register<HttpInitiator>(HttpInitiator, {\n useClass: HttpInitiator\n })\n if (this.isInitiator(description)) {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: HttpInitiator\n })\n sessionContainer.register<IHttpAdapter>(DITokens.IHttpAdapter, {\n useClass: HttpJsonSampleAdapter\n })\n } else {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: HttpAcceptorListener\n })\n }\n }\n\n protected asciiConstants (c: IJsFixConfig, sessionContainer: DependencyContainer): void {\n sessionContainer.register(DITokens.delimiter, {\n useValue: c.delimiter\n })\n sessionContainer.register(DITokens.logDelimiter, {\n useValue: c.logDelimiter\n })\n }\n\n public registerSession (c: IJsFixConfig, sessionContainer: DependencyContainer): void {\n if (this.isAscii(c.description)) {\n this.asAscii(c.description, sessionContainer)\n this.asciiConstants(c, sessionContainer)\n } else {\n this.asFixml(c.description, sessionContainer)\n }\n c.sessionContainer = sessionContainer\n sessionContainer.registerInstance(DITokens.IJsFixConfig, c)\n sessionContainer.registerInstance(DITokens.Definitions, c.definitions)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-container.js","sourceRoot":"","sources":["../../src/runtime/session-container.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAAyD;AACzD,kCAA2C;AAC3C,sCAAmG;AACnG,2CAAsC;AACtC,+CAA8C;AAE9C,0CAGyB;AACzB,4CAA8F;AAE9F,oFAA8E;AAC9E,oFAA8E;AAC9E,8CAA2D;AAC3D,8CAA2D;AAC3D,sCAAgE;AAChE,2CAAmF;AACnF,2CAA2D;AAU3D,MAAa,gBAAgB;IAQ3B,YAA6B,qBAAuD,IAAI;QAA3D,uBAAkB,GAAlB,kBAAkB,CAAyC;IACxF,CAAC;IAEM,KAAK;QACV,oBAAS,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC;IAIM,cAAc,CAAE,uBAAoD,MAAM;QAC/E,oBAAS,CAAC,gBAAgB,CAAC,wBAAiB,EAAE,IAAI,wBAAiB,EAAE,CAAC,CAAA;QACtE,IAAI,EAAsB,CAAA;QAC1B,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE,CAAC;YAC7C,EAAE,GAAG,IAAI,+BAAsB,CAAC,sBAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,CAAA;QACrF,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,oBAAoB,CAAA;QAC3B,CAAC;QACD,oBAAS,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;QAC3D,oBAAS,CAAC,QAAQ,CAAiB,4BAAc,EAAE;YACjD,QAAQ,EAAE,4BAAc;SACzB,CAAC,CAAA;QACF,oBAAS,CAAC,QAAQ,CAAgB,oBAAQ,CAAC,aAAa,EAAE;YACxD,QAAQ,EAAE,sBAAa;SACxB,CAAC,CAAA;IACJ,CAAC;IAES,kBAAkB,CAAE,WAAgC;;QAC5D,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,kBAAkB,qDAAG,WAAW,CAAC,CAAA;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAA;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACxC,OAAO,KAAK;YACV,CAAC,CAAC,IAAI,8BAAsB,CAAC,WAAW,CAAC;YACzC,CAAC,CAAC,IAAI,8BAAsB,CAAC,WAAW,CAAC,CAAA;IAC7C,CAAC;IAEM,QAAQ,CAAE,WAAgC;QAC/C,MAAM,gBAAgB,GAAG,oBAAS,CAAC,oBAAoB,EAAE,CAAA;QACzD,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAA;QAC/C,gBAAgB,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAA;QAC5E,gBAAgB,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;QAClE,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAEY,UAAU,CAAE,WAAgC;;YACvD,OAAO,MAAM,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;gBACnD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAiB,4BAAc,CAAC,CAAA;gBACxE,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE;oBAC5C,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;oBACzC,OAAO,CAAC,gBAAgB,CAAC,CAAA;gBAC3B,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;IAEM,OAAO,CAAE,WAAgC;;QAC9C,OAAO,CAAA,MAAA,WAAW,CAAC,WAAW,0CAAE,QAAQ,MAAK,OAAO,CAAA;IACtD,CAAC;IAEM,WAAW,CAAE,WAAgC;;QAClD,OAAO,CAAA,MAAA,WAAW,CAAC,WAAW,0CAAE,IAAI,MAAK,WAAW,CAAA;IACtD,CAAC;IAEM,OAAO,CAAE,WAAgC,EAAE,gBAAqC;;QACrF,gBAAgB,CAAC,QAAQ,CAAiB,oBAAQ,CAAC,cAAc,EAAE;YACjE,QAAQ,EAAE,2CAAmB;SAC9B,CAAC,CAAA;QACF,gBAAgB,CAAC,QAAQ,CAAY,oBAAQ,CAAC,SAAS,EAAE;YACvD,QAAQ,EAAE,mBAAW;SACtB,CAAC,CAAA;QACF,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAA;QAC5B,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAA;QAE1B,gBAAgB,CAAC,QAAQ,CAAC,oBAAQ,CAAC,aAAa,EAAE;YAChD,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAA;QACF,gBAAgB,CAAC,QAAQ,CAAqB,0BAAkB,EAAE;YAChE,QAAQ,EAAE,0BAAkB;SAC7B,CAAC,CAAA;QACF,gBAAgB,CAAC,QAAQ,CAAmB,wBAAgB,EAAE;YAC5D,QAAQ,EAAE,wBAAgB;SAC3B,CAAC,CAAA;QAEF,gBAAgB,CAAC,gBAAgB,CAAgB,oBAAQ,CAAC,cAAc,EAAE,IAAI,sBAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;QACtG,gBAAgB,CAAC,gBAAgB,CAAgB,oBAAQ,CAAC,WAAW,EAAE,IAAI,sBAAa,CAAC,SAAS,CAAC,CAAC,CAAA;QAEpG,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,gBAAgB,CAAC,QAAQ,CAAe,kBAAY,EAAE;gBACpD,QAAQ,EAAE,kBAAY;aACvB,CAAC,CAAA;YACF,gBAAgB,CAAC,QAAQ,CAAyB,4BAAsB,EAAE;gBACxE,QAAQ,EAAE,4BAAsB;aACjC,CAAC,CAAA;YACF,gBAAgB,CAAC,QAAQ,CAAwB,2BAAqB,EAAE;gBACtE,QAAQ,EAAE,2BAAqB;aAChC,CAAC,CAAA;YACF,IAAI,MAAA,WAAW,CAAC,WAAW,0CAAE,SAAS,EAAE,CAAC;gBACvC,gBAAgB,CAAC,QAAQ,CAAY,oBAAQ,CAAC,SAAS,EAAE;oBACvD,QAAQ,EAAE,4BAAsB;iBACjC,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,QAAQ,CAAY,oBAAQ,CAAC,SAAS,EAAE;oBACvD,QAAQ,EAAE,2BAAqB;iBAChC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,QAAQ,CAAY,oBAAQ,CAAC,SAAS,EAAE;gBACvD,QAAQ,EAAE,yBAAmB;aAC9B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAEM,OAAO,CAAE,WAAgC,EAAE,gBAAqC;QACrF,gBAAgB,CAAC,QAAQ,CAAiB,oBAAQ,CAAC,cAAc,EAAE;YACjE,QAAQ,EAAE,2CAAmB;SAC9B,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAA;QAE1B,gBAAgB,CAAC,QAAQ,CAAY,oBAAQ,CAAC,SAAS,EAAE;YACvD,QAAQ,EAAE,mBAAW;SACtB,CAAC,CAAA;QACF,gBAAgB,CAAC,QAAQ,CAAC,oBAAQ,CAAC,mBAAmB,EAAE;YACtD,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAA;QACF,gBAAgB,CAAC,QAAQ,CAAa,oBAAQ,CAAC,UAAU,EAAE;YACzD,QAAQ,EAAE,oBAAY;SACvB,CAAC,CAAA;QACF,gBAAgB,CAAC,gBAAgB,CAAgB,oBAAQ,CAAC,cAAc,EAAE,IAAI,sBAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;QACtG,gBAAgB,CAAC,QAAQ,CAAuB,2BAAoB,EAAE;YACpE,QAAQ,EAAE,2BAAoB;SAC/B,CAAC,CAAA;QACF,gBAAgB,CAAC,QAAQ,CAAgB,oBAAa,EAAE;YACtD,QAAQ,EAAE,oBAAa;SACxB,CAAC,CAAA;QACF,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,gBAAgB,CAAC,QAAQ,CAAY,oBAAQ,CAAC,SAAS,EAAE;gBACvD,QAAQ,EAAE,oBAAa;aACxB,CAAC,CAAA;YACF,gBAAgB,CAAC,QAAQ,CAAe,oBAAQ,CAAC,YAAY,EAAE;gBAC7D,QAAQ,EAAE,4BAAqB;aAChC,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,QAAQ,CAAY,oBAAQ,CAAC,SAAS,EAAE;gBACvD,QAAQ,EAAE,2BAAoB;aAC/B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAES,cAAc,CAAE,CAAe,EAAE,gBAAqC;QAC9E,gBAAgB,CAAC,QAAQ,CAAC,oBAAQ,CAAC,SAAS,EAAE;YAC5C,QAAQ,EAAE,CAAC,CAAC,SAAS;SACtB,CAAC,CAAA;QACF,gBAAgB,CAAC,QAAQ,CAAC,oBAAQ,CAAC,YAAY,EAAE;YAC/C,QAAQ,EAAE,CAAC,CAAC,YAAY;SACzB,CAAC,CAAA;IACJ,CAAC;IAEM,eAAe,CAAE,CAAe,EAAE,gBAAqC;QAC5E,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;YAC7C,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;QAC/C,CAAC;QACD,CAAC,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QACrC,gBAAgB,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;QAC3D,gBAAgB,CAAC,gBAAgB,CAAC,oBAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;IACxE,CAAC;CACF;AAnLD,4CAmLC","sourcesContent":["import { container, DependencyContainer } from 'tsyringe'\nimport { DefinitionFactory } from '../util'\nimport { IJsFixConfig, JsFixLoggerFactory, JsFixWinstonLogFactory, WinstonLogger } from '../config'\nimport { DITokens } from './di-tokens'\nimport { RuntimeFactory } from './make-config'\n\nimport {\n TcpAcceptorListener, RecoveringTcpInitiator,\n TcpInitiatorConnector, TcpInitiator\n} from '../transport/tcp'\nimport { HttpInitiator, HttpAcceptorListener, HttpJsonSampleAdapter } from '../transport/http'\nimport { ISessionMsgFactory, MsgTransmitter, ISessionDescription } from '../transport'\nimport { AsciiMsgTransmitter } from '../transport/ascii/ascii-msg-transmitter'\nimport { FixmlMsgTransmitter } from '../transport/fixml/fixml-msg-transmitter'\nimport { FixmlSessionMsgFactory } from '../transport/fixml'\nimport { AsciiSessionMsgFactory } from '../transport/ascii'\nimport { ElasticBuffer, MsgEncoder, MsgParser } from '../buffer'\nimport { AsciiParser, AsciiParserState, AsciiSegmentParser } from '../buffer/ascii'\nimport { FixmlEncoder, FiXmlParser } from '../buffer/fixml'\nimport { FixEntity } from '../transport/fix-entity'\nimport { IHttpAdapter } from '../transport/http/http-adapter'\n\n/**\n * Supplies the session message factory for a description. Return null to accept the\n * stock factory for the protocol.\n */\nexport type SessionMsgFactoryProvider = (description: ISessionDescription) => ISessionMsgFactory | null\n\nexport class SessionContainer {\n /**\n * @param msgFactoryProvider an application that needs its own session messages -\n * typically a Logon carrying tags the standard message does not - can pass one\n * here rather than subclassing to override makeSessionFactory:\n *\n * new SessionContainer(d => new MyFactory(d))\n */\n constructor (public readonly msgFactoryProvider: SessionMsgFactoryProvider | null = null) {\n }\n\n public reset (): void {\n container.reset()\n }\n\n public registerGlobal (loggerFactory?: JsFixLoggerFactory): void\n public registerGlobal (level: string): void\n public registerGlobal (levelOrLoggerFactory: string | JsFixLoggerFactory = 'info'): void {\n container.registerInstance(DefinitionFactory, new DefinitionFactory())\n let lf: JsFixLoggerFactory\n if (typeof levelOrLoggerFactory === 'string') {\n lf = new JsFixWinstonLogFactory(WinstonLogger.consoleOptions(levelOrLoggerFactory))\n } else {\n lf = levelOrLoggerFactory\n }\n container.registerInstance(DITokens.JsFixLoggerFactory, lf)\n container.register<RuntimeFactory>(RuntimeFactory, {\n useClass: RuntimeFactory\n })\n container.register<ElasticBuffer>(DITokens.ElasticBuffer, {\n useClass: ElasticBuffer\n })\n }\n\n protected makeSessionFactory (description: ISessionDescription): ISessionMsgFactory {\n const supplied = this.msgFactoryProvider?.(description)\n if (supplied) {\n return supplied\n }\n const fixml = !this.isAscii(description)\n return fixml\n ? new FixmlSessionMsgFactory(description)\n : new AsciiSessionMsgFactory(description)\n }\n\n public newChild (description: ISessionDescription): DependencyContainer {\n const sessionContainer = container.createChildContainer()\n const sf = this.makeSessionFactory(description)\n sessionContainer.registerInstance(DITokens.ISessionDescription, description)\n sessionContainer.registerInstance(DITokens.ISessionMsgFactory, sf)\n return sessionContainer\n }\n\n public async makeSystem (description: ISessionDescription): Promise<DependencyContainer> {\n return await new Promise<DependencyContainer>((resolve, reject) => {\n const sessionContainer = this.newChild(description)\n const factory = sessionContainer.resolve<RuntimeFactory>(RuntimeFactory)\n factory.makeConfig().then((c: IJsFixConfig) => {\n this.registerSession(c, sessionContainer)\n resolve(sessionContainer)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n public isAscii (description: ISessionDescription): boolean {\n return description.application?.protocol === 'ascii'\n }\n\n public isInitiator (description: ISessionDescription): boolean {\n return description.application?.type === 'initiator'\n }\n\n public asAscii (description: ISessionDescription, sessionContainer: DependencyContainer): void {\n sessionContainer.register<MsgTransmitter>(DITokens.MsgTransmitter, {\n useClass: AsciiMsgTransmitter\n })\n sessionContainer.register<MsgParser>(DITokens.MsgParser, {\n useClass: AsciiParser\n })\n const parseSize = 160 * 1024\n const sendSize = 10 * 1024\n\n sessionContainer.register(DITokens.maxMessageLen, {\n useValue: parseSize\n })\n sessionContainer.register<AsciiSegmentParser>(AsciiSegmentParser, {\n useClass: AsciiSegmentParser\n })\n sessionContainer.register<AsciiParserState>(AsciiParserState, {\n useClass: AsciiParserState\n })\n\n sessionContainer.registerInstance<ElasticBuffer>(DITokens.TransmitBuffer, new ElasticBuffer(sendSize))\n sessionContainer.registerInstance<ElasticBuffer>(DITokens.ParseBuffer, new ElasticBuffer(parseSize))\n\n if (this.isInitiator(description)) {\n sessionContainer.register<TcpInitiator>(TcpInitiator, {\n useClass: TcpInitiator\n })\n sessionContainer.register<RecoveringTcpInitiator>(RecoveringTcpInitiator, {\n useClass: RecoveringTcpInitiator\n })\n sessionContainer.register<TcpInitiatorConnector>(TcpInitiatorConnector, {\n useClass: TcpInitiatorConnector\n })\n if (description.application?.resilient) {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: RecoveringTcpInitiator\n })\n } else {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: TcpInitiatorConnector\n })\n }\n } else {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: TcpAcceptorListener\n })\n }\n }\n\n public asFixml (description: ISessionDescription, sessionContainer: DependencyContainer): void {\n sessionContainer.register<MsgTransmitter>(DITokens.MsgTransmitter, {\n useClass: FixmlMsgTransmitter\n })\n const sendSize = 10 * 1024\n\n sessionContainer.register<MsgParser>(DITokens.MsgParser, {\n useClass: FiXmlParser\n })\n sessionContainer.register(DITokens.maxMessageLocations, {\n useValue: sendSize\n })\n sessionContainer.register<MsgEncoder>(DITokens.MsgEncoder, {\n useClass: FixmlEncoder\n })\n sessionContainer.registerInstance<ElasticBuffer>(DITokens.TransmitBuffer, new ElasticBuffer(sendSize))\n sessionContainer.register<HttpAcceptorListener>(HttpAcceptorListener, {\n useClass: HttpAcceptorListener\n })\n sessionContainer.register<HttpInitiator>(HttpInitiator, {\n useClass: HttpInitiator\n })\n if (this.isInitiator(description)) {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: HttpInitiator\n })\n sessionContainer.register<IHttpAdapter>(DITokens.IHttpAdapter, {\n useClass: HttpJsonSampleAdapter\n })\n } else {\n sessionContainer.register<FixEntity>(DITokens.FixEntity, {\n useClass: HttpAcceptorListener\n })\n }\n }\n\n protected asciiConstants (c: IJsFixConfig, sessionContainer: DependencyContainer): void {\n sessionContainer.register(DITokens.delimiter, {\n useValue: c.delimiter\n })\n sessionContainer.register(DITokens.logDelimiter, {\n useValue: c.logDelimiter\n })\n }\n\n public registerSession (c: IJsFixConfig, sessionContainer: DependencyContainer): void {\n if (this.isAscii(c.description)) {\n this.asAscii(c.description, sessionContainer)\n this.asciiConstants(c, sessionContainer)\n } else {\n this.asFixml(c.description, sessionContainer)\n }\n c.sessionContainer = sessionContainer\n sessionContainer.registerInstance(DITokens.IJsFixConfig, c)\n sessionContainer.registerInstance(DITokens.Definitions, c.definitions)\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IJsFixConfig, IJsFixLogger, JsFixLoggerFactory } from '../config';
|
|
2
|
-
import { ISessionDescription } from '../transport';
|
|
2
|
+
import { ISessionDescription, ISessionMsgFactory } from '../transport';
|
|
3
3
|
import { DependencyContainer } from 'tsyringe';
|
|
4
4
|
import { EngineFactory } from './engine-factory';
|
|
5
5
|
import { SessionContainer } from './session-container';
|
|
@@ -11,6 +11,7 @@ export declare abstract class SessionLauncher {
|
|
|
11
11
|
readonly acceptorConfig: ISessionDescription | null;
|
|
12
12
|
protected constructor(initiatorConfig?: string | ISessionDescription | null, acceptorConfig?: string | ISessionDescription | null, loggerFactory?: JsFixLoggerFactory);
|
|
13
13
|
protected sessionContainer: SessionContainer;
|
|
14
|
+
protected makeSessionMsgFactory(_description: ISessionDescription): ISessionMsgFactory | null;
|
|
14
15
|
private empty;
|
|
15
16
|
private acceptorEntity;
|
|
16
17
|
protected getAcceptor(sessionContainer: DependencyContainer): Promise<any>;
|
|
@@ -52,12 +52,15 @@ class SessionLauncher {
|
|
|
52
52
|
constructor(initiatorConfig = null, acceptorConfig = null, loggerFactory = defaultLoggerFactory) {
|
|
53
53
|
this.loggerFactory = loggerFactory;
|
|
54
54
|
this.root = '../../';
|
|
55
|
-
this.sessionContainer = new session_container_1.SessionContainer();
|
|
55
|
+
this.sessionContainer = new session_container_1.SessionContainer((d) => this.makeSessionMsgFactory(d));
|
|
56
56
|
this.acceptorEntity = null;
|
|
57
57
|
this.logger = this.loggerFactory.logger('launcher');
|
|
58
58
|
this.initiatorConfig = initiatorConfig ? this.loadConfig(initiatorConfig) : null;
|
|
59
59
|
this.acceptorConfig = acceptorConfig ? this.loadConfig(acceptorConfig) : null;
|
|
60
60
|
}
|
|
61
|
+
makeSessionMsgFactory(_description) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
61
64
|
empty() {
|
|
62
65
|
return __awaiter(this, void 0, void 0, function* () {
|
|
63
66
|
return yield new Promise((resolve, reject) => {
|
|
@@ -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 // 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"]}
|
|
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, ISessionMsgFactory } 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 // the arrow defers to makeSessionMsgFactory at resolve time, so a subclass need\n // only override that one method - no SessionContainer subclass required\n protected sessionContainer: SessionContainer =\n new SessionContainer((d: ISessionDescription) => this.makeSessionMsgFactory(d))\n\n /**\n * Override to supply this application's own session message factory - the place to\n * put a Logon carrying tags the standard message does not, or a header a\n * counterparty stamps differently. Return null (the default) for the stock\n * factory.\n *\n * For a Logon that only needs extra fields, prefer the \"Logon\" block in the session\n * description - it needs no code at all. Reach for a factory when the values are\n * computed at run time (a signature, a nonce, a token fetched at start up).\n */\n protected makeSessionMsgFactory (_description: ISessionDescription): ISessionMsgFactory | null {\n return null\n }\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"]}
|