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.
Files changed (145) hide show
  1. package/BACKPORT_PLAN.md +20 -7
  2. package/README.md +35 -0
  3. package/WORKLOG.md +119 -0
  4. package/dist/benchmark/bench-report.d.ts +5 -0
  5. package/dist/benchmark/bench-report.js +91 -0
  6. package/dist/benchmark/bench-report.js.map +1 -0
  7. package/dist/benchmark/bench-runner.d.ts +12 -0
  8. package/dist/benchmark/bench-runner.js +193 -0
  9. package/dist/benchmark/bench-runner.js.map +1 -0
  10. package/dist/benchmark/bench-stats.d.ts +10 -0
  11. package/dist/benchmark/bench-stats.js +56 -0
  12. package/dist/benchmark/bench-stats.js.map +1 -0
  13. package/dist/benchmark/bench-types.d.ts +74 -0
  14. package/dist/benchmark/bench-types.js +3 -0
  15. package/dist/benchmark/bench-types.js.map +1 -0
  16. package/dist/benchmark/gc-probe.d.ts +18 -0
  17. package/dist/benchmark/gc-probe.js +103 -0
  18. package/dist/benchmark/gc-probe.js.map +1 -0
  19. package/dist/benchmark/index.d.ts +6 -0
  20. package/dist/benchmark/index.js +23 -0
  21. package/dist/benchmark/index.js.map +1 -0
  22. package/dist/benchmark/parse-bench.d.ts +28 -0
  23. package/dist/benchmark/parse-bench.js +85 -0
  24. package/dist/benchmark/parse-bench.js.map +1 -0
  25. package/dist/buffer/ascii/ascii-encoder.d.ts +1 -0
  26. package/dist/buffer/ascii/ascii-encoder.js +15 -0
  27. package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
  28. package/dist/buffer/ascii/ascii-parser.d.ts +1 -0
  29. package/dist/buffer/ascii/ascii-parser.js +4 -1
  30. package/dist/buffer/ascii/ascii-parser.js.map +1 -1
  31. package/dist/buffer/ascii/ascii-segment-parser.js +3 -2
  32. package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
  33. package/dist/buffer/ascii/tag-index.js.map +1 -1
  34. package/dist/buffer/msg-encoder.d.ts +2 -0
  35. package/dist/buffer/msg-encoder.js +1 -0
  36. package/dist/buffer/msg-encoder.js.map +1 -1
  37. package/dist/buffer/msg-view.d.ts +1 -0
  38. package/dist/buffer/msg-view.js +25 -19
  39. package/dist/buffer/msg-view.js.map +1 -1
  40. package/dist/dictionary/parser/quickfix/dictionary-validator.d.ts +1 -1
  41. package/dist/dictionary/parser/quickfix/dictionary-validator.js.map +1 -1
  42. package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.d.ts +1 -1
  43. package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js +1 -2
  44. package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js.map +1 -1
  45. package/dist/dictionary/parser/quickfix/validation-error.d.ts +2 -2
  46. package/dist/dictionary/parser/quickfix/validation-error.js.map +1 -1
  47. package/dist/jsfix-bench.d.ts +1 -0
  48. package/dist/jsfix-bench.js +213 -0
  49. package/dist/jsfix-bench.js.map +1 -0
  50. package/dist/runtime/session-container.d.ts +3 -0
  51. package/dist/runtime/session-container.js +8 -0
  52. package/dist/runtime/session-container.js.map +1 -1
  53. package/dist/runtime/session-launcher.d.ts +2 -1
  54. package/dist/runtime/session-launcher.js +4 -1
  55. package/dist/runtime/session-launcher.js.map +1 -1
  56. package/dist/store/file-session-store.js +1 -1
  57. package/dist/store/file-session-store.js.map +1 -1
  58. package/dist/store/file-session-stream-provider.d.ts +1 -0
  59. package/dist/store/file-session-stream-provider.js +13 -13
  60. package/dist/store/file-session-stream-provider.js.map +1 -1
  61. package/dist/store/fix-session-store-factory.d.ts +1 -1
  62. package/dist/store/fix-session-store-factory.js.map +1 -1
  63. package/dist/store/fix-session-store.d.ts +11 -11
  64. package/dist/store/fix-session-store.js.map +1 -1
  65. package/dist/store/memory-session-store.js.map +1 -1
  66. package/dist/store/session-stream-provider.d.ts +13 -13
  67. package/dist/store/session-stream-provider.js.map +1 -1
  68. package/dist/transport/ascii/ascii-msg-transmitter.d.ts +1 -0
  69. package/dist/transport/ascii/ascii-msg-transmitter.js +15 -0
  70. package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
  71. package/dist/transport/ascii/ascii-session-msg-factory.js +1 -7
  72. package/dist/transport/ascii/ascii-session-msg-factory.js.map +1 -1
  73. package/dist/transport/fixml/fixml-session-msg-factory.js +1 -6
  74. package/dist/transport/fixml/fixml-session-msg-factory.js.map +1 -1
  75. package/dist/transport/index.d.ts +3 -0
  76. package/dist/transport/index.js +3 -0
  77. package/dist/transport/index.js.map +1 -1
  78. package/dist/transport/msg-payload.d.ts +3 -1
  79. package/dist/transport/msg-payload.js +2 -1
  80. package/dist/transport/msg-payload.js.map +1 -1
  81. package/dist/transport/msg-transmitter.d.ts +4 -1
  82. package/dist/transport/msg-transmitter.js +18 -2
  83. package/dist/transport/msg-transmitter.js.map +1 -1
  84. package/dist/transport/send-callback.d.ts +7 -0
  85. package/dist/transport/send-callback.js +3 -0
  86. package/dist/transport/send-callback.js.map +1 -0
  87. package/dist/transport/session/fix-clock.d.ts +1 -1
  88. package/dist/transport/session/fix-clock.js.map +1 -1
  89. package/dist/transport/session/fix-session.d.ts +2 -1
  90. package/dist/transport/session/fix-session.js +12 -3
  91. package/dist/transport/session/fix-session.js.map +1 -1
  92. package/dist/transport/session/resend-request-manager.d.ts +2 -2
  93. package/dist/transport/session/resend-request-manager.js.map +1 -1
  94. package/dist/transport/session/session-description.d.ts +2 -0
  95. package/dist/transport/session/session-description.js.map +1 -1
  96. package/dist/transport/session/session-sequence-coordinator.d.ts +1 -1
  97. package/dist/transport/session/session-sequence-coordinator.js.map +1 -1
  98. package/dist/transport/session/session-sequence-store.d.ts +3 -3
  99. package/dist/transport/session/session-sequence-store.js.map +1 -1
  100. package/dist/transport/tcp/tcp-initiator.js.map +1 -1
  101. package/docs/benchmarking.md +117 -0
  102. package/docs/custom-logon.md +225 -0
  103. package/eslint.config.mjs +15 -1
  104. package/jsfix.test_client.txt +62 -62
  105. package/jsfix.test_server.txt +72 -72
  106. package/package.json +9 -1
  107. package/src/benchmark/bench-report.ts +101 -0
  108. package/src/benchmark/bench-runner.ts +196 -0
  109. package/src/benchmark/bench-stats.ts +86 -0
  110. package/src/benchmark/bench-types.ts +110 -0
  111. package/src/benchmark/gc-probe.ts +145 -0
  112. package/src/benchmark/index.ts +6 -0
  113. package/src/benchmark/parse-bench.ts +144 -0
  114. package/src/buffer/ascii/ascii-encoder.ts +20 -0
  115. package/src/buffer/ascii/ascii-parser.ts +16 -1
  116. package/src/buffer/ascii/ascii-segment-parser.ts +9 -6
  117. package/src/buffer/ascii/tag-index.ts +3 -3
  118. package/src/buffer/msg-encoder.ts +12 -0
  119. package/src/buffer/msg-view.ts +35 -18
  120. package/src/dictionary/parser/quickfix/dictionary-validator.ts +1 -1
  121. package/src/dictionary/parser/quickfix/quick-fix-graph-parser.ts +2 -3
  122. package/src/dictionary/parser/quickfix/validation-error.ts +1 -1
  123. package/src/jsfix-bench.ts +204 -0
  124. package/src/runtime/session-container.ts +20 -0
  125. package/src/runtime/session-launcher.ts +19 -2
  126. package/src/store/file-session-store.ts +2 -2
  127. package/src/store/file-session-stream-provider.ts +17 -11
  128. package/src/store/fix-session-store-factory.ts +1 -1
  129. package/src/store/fix-session-store.ts +11 -11
  130. package/src/store/memory-session-store.ts +1 -1
  131. package/src/store/session-stream-provider.ts +13 -13
  132. package/src/transport/ascii/ascii-msg-transmitter.ts +20 -0
  133. package/src/transport/ascii/ascii-session-msg-factory.ts +6 -1
  134. package/src/transport/fixml/fixml-session-msg-factory.ts +3 -1
  135. package/src/transport/index.ts +5 -0
  136. package/src/transport/msg-payload.ts +5 -1
  137. package/src/transport/msg-transmitter.ts +31 -2
  138. package/src/transport/send-callback.ts +33 -0
  139. package/src/transport/session/fix-clock.ts +1 -1
  140. package/src/transport/session/fix-session.ts +22 -3
  141. package/src/transport/session/resend-request-manager.ts +4 -4
  142. package/src/transport/session/session-description.ts +14 -0
  143. package/src/transport/session/session-sequence-coordinator.ts +1 -1
  144. package/src/transport/session/session-sequence-store.ts +3 -3
  145. package/src/transport/tcp/tcp-initiator.ts +1 -1
@@ -244,7 +244,7 @@ class FileSessionStore {
244
244
  return `${y}${M}${d}-${h}:${m}:${s}.${ms}000`;
245
245
  }
246
246
  static parseSessionTime(str) {
247
- const match = str.match(/^(\d{4})(\d{2})(\d{2})-(\d{2}):(\d{2}):(\d{2})\.(\d{3,6})$/);
247
+ const match = /^(\d{4})(\d{2})(\d{2})-(\d{2}):(\d{2}):(\d{2})\.(\d{3,6})$/.exec(str);
248
248
  if (!match)
249
249
  return null;
250
250
  const [, y, M, d, h, m, s, frac] = match;
@@ -1 +1 @@
1
- {"version":3,"file":"file-session-store.js","sourceRoot":"","sources":["../../src/store/file-session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { IFixSessionStore } from './fix-session-store'\nimport { SessionId } from './session-id'\nimport { IFixMsgStoreRecord, FixMsgStoreRecord } from './fix-msg-store-record'\nimport { ISessionStreamProvider } from './session-stream-provider'\nimport { FileSessionStreamProvider } from './file-session-stream-provider'\n\n/**\n * QuickFix-compatible file-based session store.\n *\n * File format:\n * - .seqnums: \"SSSSSSSSSSSSSSSSSSSS : TTTTTTTTTTTTTTTTTTTT\" (20-char right-justified sender : target)\n * - .session: \"YYYYMMDD-HH:MM:SS.ffffff\" (session creation time)\n * - .header: \"seqnum,offset,length\" per line (index into body)\n * - .body: concatenated raw FIX messages (no delimiters)\n */\nexport class FileSessionStore implements IFixSessionStore {\n private readonly streamProvider: ISessionStreamProvider\n private readonly ownsProvider: boolean\n\n private senderSeqNumValue: number = 1\n private targetSeqNumValue: number = 1\n private creationTimeValue: Date = new Date()\n\n // In-memory index: seqnum -> { offset, length }\n private readonly headerIndex: Map<number, { offset: number, length: number }> = new Map()\n\n /**\n * Creates a FileSessionStore with the default file-based stream provider.\n */\n static createWithFiles (sessionId: SessionId, directory: string): FileSessionStore {\n return new FileSessionStore(sessionId, new FileSessionStreamProvider(sessionId, directory), true)\n }\n\n /**\n * Creates a FileSessionStore with a custom stream provider.\n * Useful for testing with in-memory streams.\n */\n constructor (\n public readonly sessionId: SessionId,\n streamProvider: ISessionStreamProvider,\n ownsProvider: boolean = false\n ) {\n this.streamProvider = streamProvider\n this.ownsProvider = ownsProvider\n }\n\n /**\n * Gets the stream provider for direct access (useful for testing).\n */\n getStreamProvider (): ISessionStreamProvider {\n return this.streamProvider\n }\n\n // Sequence Numbers\n\n get senderSeqNum (): number {\n return this.senderSeqNumValue\n }\n\n set senderSeqNum (value: number) {\n this.senderSeqNumValue = value\n }\n\n get targetSeqNum (): number {\n return this.targetSeqNumValue\n }\n\n set targetSeqNum (value: number) {\n this.targetSeqNumValue = value\n }\n\n async setSenderSeqNum (value: number): Promise<void> {\n this.senderSeqNumValue = value\n await this.persistSeqNums()\n }\n\n async setTargetSeqNum (value: number): Promise<void> {\n this.targetSeqNumValue = value\n await this.persistSeqNums()\n }\n\n async nextSenderSeqNum (): Promise<number> {\n const next = ++this.senderSeqNumValue\n await this.persistSeqNums()\n return next\n }\n\n async nextTargetSeqNum (): Promise<number> {\n const next = ++this.targetSeqNumValue\n await this.persistSeqNums()\n return next\n }\n\n // Session\n\n get creationTime (): Date {\n return this.creationTimeValue\n }\n\n async reset (): Promise<void> {\n this.senderSeqNumValue = 1\n this.targetSeqNumValue = 1\n this.creationTimeValue = new Date()\n this.headerIndex.clear()\n\n await this.streamProvider.reset()\n await this.persistSeqNums()\n await this.persistSessionTime()\n this.streamProvider.openBody()\n }\n\n // Message Operations\n\n async put (record: IFixMsgStoreRecord): Promise<void> {\n if (record.encoded == null) {\n throw new Error('Record must have encoded content')\n }\n\n const bytes = Buffer.from(record.encoded, 'utf8')\n const length = bytes.length\n const offset = await this.streamProvider.appendBody(bytes)\n this.headerIndex.set(record.seqNum, { offset, length })\n await this.streamProvider.appendHeaderLine(`${record.seqNum},${offset},${length}`)\n }\n\n async get (seqNum: number): Promise<IFixMsgStoreRecord | null> {\n const entry = this.headerIndex.get(seqNum)\n if (!entry) return null\n return await this.readMessage(seqNum, entry.offset, entry.length)\n }\n\n async getRange (fromSeqNum: number, toSeqNum: number): Promise<IFixMsgStoreRecord[]> {\n const results: IFixMsgStoreRecord[] = []\n for (let seq = fromSeqNum; seq <= toSeqNum; seq++) {\n const record = await this.get(seq)\n if (record) {\n results.push(record)\n }\n }\n return results\n }\n\n // Lifecycle\n\n async initialize (): Promise<void> {\n await this.loadSeqNums()\n await this.loadSessionTime()\n await this.loadHeaderIndex()\n this.streamProvider.openBody()\n }\n\n async flush (): Promise<void> {\n await this.streamProvider.flush()\n }\n\n async dispose (): Promise<void> {\n await this.streamProvider.flush()\n if (this.ownsProvider) {\n await this.streamProvider.dispose()\n }\n }\n\n // Private - persistence\n\n private async persistSeqNums (): Promise<void> {\n const sender = this.senderSeqNumValue.toString().padStart(20, ' ')\n const target = this.targetSeqNumValue.toString().padStart(20, ' ')\n await this.streamProvider.writeSeqNums(`${sender} : ${target}`)\n }\n\n private async loadSeqNums (): Promise<void> {\n const content = await this.streamProvider.readSeqNums()\n if (content == null) {\n this.senderSeqNumValue = 1\n this.targetSeqNumValue = 1\n return\n }\n const parts = content.split(':')\n if (parts.length === 2) {\n this.senderSeqNumValue = parseInt(parts[0].trim(), 10) || 1\n this.targetSeqNumValue = parseInt(parts[1].trim(), 10) || 1\n }\n }\n\n private async persistSessionTime (): Promise<void> {\n await this.streamProvider.writeSessionTime(FileSessionStore.formatSessionTime(this.creationTimeValue))\n }\n\n private async loadSessionTime (): Promise<void> {\n const content = await this.streamProvider.readSessionTime()\n if (content == null) {\n this.creationTimeValue = new Date()\n await this.persistSessionTime()\n return\n }\n const parsed = FileSessionStore.parseSessionTime(content.trim())\n this.creationTimeValue = parsed ?? new Date()\n }\n\n private async loadHeaderIndex (): Promise<void> {\n const lines = await this.streamProvider.readHeaderLines()\n for (const line of lines) {\n if (!line.trim()) continue\n const parts = line.split(',')\n if (parts.length === 3) {\n const seqNum = parseInt(parts[0], 10)\n const offset = parseInt(parts[1], 10)\n const length = parseInt(parts[2], 10)\n if (!isNaN(seqNum) && !isNaN(offset) && !isNaN(length)) {\n this.headerIndex.set(seqNum, { offset, length })\n }\n }\n }\n }\n\n // Private - message reading\n\n private async readMessage (seqNum: number, offset: number, length: number): Promise<IFixMsgStoreRecord | null> {\n const buffer = await this.streamProvider.readBody(offset, length)\n if (buffer.length !== length) return null\n\n const encoded = buffer.toString('utf8')\n const msgType = FileSessionStore.extractTag(encoded, '35')\n const sendingTimeStr = FileSessionStore.extractTag(encoded, '52')\n let timestamp = new Date(0)\n if (sendingTimeStr) {\n const parsed = FileSessionStore.parseSessionTime(sendingTimeStr)\n if (parsed) timestamp = parsed\n }\n\n return new FixMsgStoreRecord(msgType ?? '', timestamp, seqNum, undefined, encoded)\n }\n\n /**\n * Extract a FIX tag value from a raw message string.\n * Tags are delimited by SOH (0x01) or pipe (|).\n */\n static extractTag (message: string, tag: string): string | null {\n const tagPrefix = `${tag}=`\n\n // Check if tag is at the start\n if (message.startsWith(tagPrefix)) {\n const endIndex = FileSessionStore.findDelimiter(message, tagPrefix.length)\n return message.substring(tagPrefix.length, endIndex)\n }\n\n // Search for SOH + tag= or | + tag=\n for (const delim of ['\\x01', '|']) {\n const search = `${delim}${tagPrefix}`\n const idx = message.indexOf(search)\n if (idx >= 0) {\n const startIndex = idx + search.length\n const endIndex = FileSessionStore.findDelimiter(message, startIndex)\n return message.substring(startIndex, endIndex)\n }\n }\n\n return null\n }\n\n private static findDelimiter (message: string, fromIndex: number): number {\n for (let i = fromIndex; i < message.length; i++) {\n const ch = message.charAt(i)\n if (ch === '\\x01' || ch === '|') return i\n }\n return message.length\n }\n\n /**\n * Format a date as QuickFix session time: YYYYMMDD-HH:MM:SS.ffffff\n */\n static formatSessionTime (date: Date): string {\n const y = date.getUTCFullYear()\n const M = (date.getUTCMonth() + 1).toString().padStart(2, '0')\n const d = date.getUTCDate().toString().padStart(2, '0')\n const h = date.getUTCHours().toString().padStart(2, '0')\n const m = date.getUTCMinutes().toString().padStart(2, '0')\n const s = date.getUTCSeconds().toString().padStart(2, '0')\n const ms = date.getUTCMilliseconds().toString().padStart(3, '0')\n return `${y}${M}${d}-${h}:${m}:${s}.${ms}000`\n }\n\n /**\n * Parse a QuickFix session time string: YYYYMMDD-HH:MM:SS.fff[fff]\n */\n static parseSessionTime (str: string): Date | null {\n // Format: YYYYMMDD-HH:MM:SS.ffffff\n const match = str.match(/^(\\d{4})(\\d{2})(\\d{2})-(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3,6})$/)\n if (!match) return null\n const [, y, M, d, h, m, s, frac] = match\n const ms = parseInt(frac.substring(0, 3), 10)\n return new Date(Date.UTC(parseInt(y), parseInt(M) - 1, parseInt(d), parseInt(h), parseInt(m), parseInt(s), ms))\n }\n}\n"]}
1
+ {"version":3,"file":"file-session-store.js","sourceRoot":"","sources":["../../src/store/file-session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { IFixSessionStore } from './fix-session-store'\nimport { SessionId } from './session-id'\nimport { IFixMsgStoreRecord, FixMsgStoreRecord } from './fix-msg-store-record'\nimport { ISessionStreamProvider } from './session-stream-provider'\nimport { FileSessionStreamProvider } from './file-session-stream-provider'\n\n/**\n * QuickFix-compatible file-based session store.\n *\n * File format:\n * - .seqnums: \"SSSSSSSSSSSSSSSSSSSS : TTTTTTTTTTTTTTTTTTTT\" (20-char right-justified sender : target)\n * - .session: \"YYYYMMDD-HH:MM:SS.ffffff\" (session creation time)\n * - .header: \"seqnum,offset,length\" per line (index into body)\n * - .body: concatenated raw FIX messages (no delimiters)\n */\nexport class FileSessionStore implements IFixSessionStore {\n private readonly streamProvider: ISessionStreamProvider\n private readonly ownsProvider: boolean\n\n private senderSeqNumValue: number = 1\n private targetSeqNumValue: number = 1\n private creationTimeValue: Date = new Date()\n\n // In-memory index: seqnum -> { offset, length }\n private readonly headerIndex = new Map<number, { offset: number, length: number }>()\n\n /**\n * Creates a FileSessionStore with the default file-based stream provider.\n */\n static createWithFiles (sessionId: SessionId, directory: string): FileSessionStore {\n return new FileSessionStore(sessionId, new FileSessionStreamProvider(sessionId, directory), true)\n }\n\n /**\n * Creates a FileSessionStore with a custom stream provider.\n * Useful for testing with in-memory streams.\n */\n constructor (\n public readonly sessionId: SessionId,\n streamProvider: ISessionStreamProvider,\n ownsProvider: boolean = false\n ) {\n this.streamProvider = streamProvider\n this.ownsProvider = ownsProvider\n }\n\n /**\n * Gets the stream provider for direct access (useful for testing).\n */\n getStreamProvider (): ISessionStreamProvider {\n return this.streamProvider\n }\n\n // Sequence Numbers\n\n get senderSeqNum (): number {\n return this.senderSeqNumValue\n }\n\n set senderSeqNum (value: number) {\n this.senderSeqNumValue = value\n }\n\n get targetSeqNum (): number {\n return this.targetSeqNumValue\n }\n\n set targetSeqNum (value: number) {\n this.targetSeqNumValue = value\n }\n\n async setSenderSeqNum (value: number): Promise<void> {\n this.senderSeqNumValue = value\n await this.persistSeqNums()\n }\n\n async setTargetSeqNum (value: number): Promise<void> {\n this.targetSeqNumValue = value\n await this.persistSeqNums()\n }\n\n async nextSenderSeqNum (): Promise<number> {\n const next = ++this.senderSeqNumValue\n await this.persistSeqNums()\n return next\n }\n\n async nextTargetSeqNum (): Promise<number> {\n const next = ++this.targetSeqNumValue\n await this.persistSeqNums()\n return next\n }\n\n // Session\n\n get creationTime (): Date {\n return this.creationTimeValue\n }\n\n async reset (): Promise<void> {\n this.senderSeqNumValue = 1\n this.targetSeqNumValue = 1\n this.creationTimeValue = new Date()\n this.headerIndex.clear()\n\n await this.streamProvider.reset()\n await this.persistSeqNums()\n await this.persistSessionTime()\n this.streamProvider.openBody()\n }\n\n // Message Operations\n\n async put (record: IFixMsgStoreRecord): Promise<void> {\n if (record.encoded == null) {\n throw new Error('Record must have encoded content')\n }\n\n const bytes = Buffer.from(record.encoded, 'utf8')\n const length = bytes.length\n const offset = await this.streamProvider.appendBody(bytes)\n this.headerIndex.set(record.seqNum, { offset, length })\n await this.streamProvider.appendHeaderLine(`${record.seqNum},${offset},${length}`)\n }\n\n async get (seqNum: number): Promise<IFixMsgStoreRecord | null> {\n const entry = this.headerIndex.get(seqNum)\n if (!entry) return null\n return await this.readMessage(seqNum, entry.offset, entry.length)\n }\n\n async getRange (fromSeqNum: number, toSeqNum: number): Promise<IFixMsgStoreRecord[]> {\n const results: IFixMsgStoreRecord[] = []\n for (let seq = fromSeqNum; seq <= toSeqNum; seq++) {\n const record = await this.get(seq)\n if (record) {\n results.push(record)\n }\n }\n return results\n }\n\n // Lifecycle\n\n async initialize (): Promise<void> {\n await this.loadSeqNums()\n await this.loadSessionTime()\n await this.loadHeaderIndex()\n this.streamProvider.openBody()\n }\n\n async flush (): Promise<void> {\n await this.streamProvider.flush()\n }\n\n async dispose (): Promise<void> {\n await this.streamProvider.flush()\n if (this.ownsProvider) {\n await this.streamProvider.dispose()\n }\n }\n\n // Private - persistence\n\n private async persistSeqNums (): Promise<void> {\n const sender = this.senderSeqNumValue.toString().padStart(20, ' ')\n const target = this.targetSeqNumValue.toString().padStart(20, ' ')\n await this.streamProvider.writeSeqNums(`${sender} : ${target}`)\n }\n\n private async loadSeqNums (): Promise<void> {\n const content = await this.streamProvider.readSeqNums()\n if (content == null) {\n this.senderSeqNumValue = 1\n this.targetSeqNumValue = 1\n return\n }\n const parts = content.split(':')\n if (parts.length === 2) {\n this.senderSeqNumValue = parseInt(parts[0].trim(), 10) || 1\n this.targetSeqNumValue = parseInt(parts[1].trim(), 10) || 1\n }\n }\n\n private async persistSessionTime (): Promise<void> {\n await this.streamProvider.writeSessionTime(FileSessionStore.formatSessionTime(this.creationTimeValue))\n }\n\n private async loadSessionTime (): Promise<void> {\n const content = await this.streamProvider.readSessionTime()\n if (content == null) {\n this.creationTimeValue = new Date()\n await this.persistSessionTime()\n return\n }\n const parsed = FileSessionStore.parseSessionTime(content.trim())\n this.creationTimeValue = parsed ?? new Date()\n }\n\n private async loadHeaderIndex (): Promise<void> {\n const lines = await this.streamProvider.readHeaderLines()\n for (const line of lines) {\n if (!line.trim()) continue\n const parts = line.split(',')\n if (parts.length === 3) {\n const seqNum = parseInt(parts[0], 10)\n const offset = parseInt(parts[1], 10)\n const length = parseInt(parts[2], 10)\n if (!isNaN(seqNum) && !isNaN(offset) && !isNaN(length)) {\n this.headerIndex.set(seqNum, { offset, length })\n }\n }\n }\n }\n\n // Private - message reading\n\n private async readMessage (seqNum: number, offset: number, length: number): Promise<IFixMsgStoreRecord | null> {\n const buffer = await this.streamProvider.readBody(offset, length)\n if (buffer.length !== length) return null\n\n const encoded = buffer.toString('utf8')\n const msgType = FileSessionStore.extractTag(encoded, '35')\n const sendingTimeStr = FileSessionStore.extractTag(encoded, '52')\n let timestamp = new Date(0)\n if (sendingTimeStr) {\n const parsed = FileSessionStore.parseSessionTime(sendingTimeStr)\n if (parsed) timestamp = parsed\n }\n\n return new FixMsgStoreRecord(msgType ?? '', timestamp, seqNum, undefined, encoded)\n }\n\n /**\n * Extract a FIX tag value from a raw message string.\n * Tags are delimited by SOH (0x01) or pipe (|).\n */\n static extractTag (message: string, tag: string): string | null {\n const tagPrefix = `${tag}=`\n\n // Check if tag is at the start\n if (message.startsWith(tagPrefix)) {\n const endIndex = FileSessionStore.findDelimiter(message, tagPrefix.length)\n return message.substring(tagPrefix.length, endIndex)\n }\n\n // Search for SOH + tag= or | + tag=\n for (const delim of ['\\x01', '|']) {\n const search = `${delim}${tagPrefix}`\n const idx = message.indexOf(search)\n if (idx >= 0) {\n const startIndex = idx + search.length\n const endIndex = FileSessionStore.findDelimiter(message, startIndex)\n return message.substring(startIndex, endIndex)\n }\n }\n\n return null\n }\n\n private static findDelimiter (message: string, fromIndex: number): number {\n for (let i = fromIndex; i < message.length; i++) {\n const ch = message.charAt(i)\n if (ch === '\\x01' || ch === '|') return i\n }\n return message.length\n }\n\n /**\n * Format a date as QuickFix session time: YYYYMMDD-HH:MM:SS.ffffff\n */\n static formatSessionTime (date: Date): string {\n const y = date.getUTCFullYear()\n const M = (date.getUTCMonth() + 1).toString().padStart(2, '0')\n const d = date.getUTCDate().toString().padStart(2, '0')\n const h = date.getUTCHours().toString().padStart(2, '0')\n const m = date.getUTCMinutes().toString().padStart(2, '0')\n const s = date.getUTCSeconds().toString().padStart(2, '0')\n const ms = date.getUTCMilliseconds().toString().padStart(3, '0')\n return `${y}${M}${d}-${h}:${m}:${s}.${ms}000`\n }\n\n /**\n * Parse a QuickFix session time string: YYYYMMDD-HH:MM:SS.fff[fff]\n */\n static parseSessionTime (str: string): Date | null {\n // Format: YYYYMMDD-HH:MM:SS.ffffff\n const match = /^(\\d{4})(\\d{2})(\\d{2})-(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3,6})$/.exec(str)\n if (!match) return null\n const [, y, M, d, h, m, s, frac] = match\n const ms = parseInt(frac.substring(0, 3), 10)\n return new Date(Date.UTC(parseInt(y), parseInt(M) - 1, parseInt(d), parseInt(h), parseInt(m), parseInt(s), ms))\n }\n}\n"]}
@@ -9,6 +9,7 @@ export declare class FileSessionStreamProvider implements ISessionStreamProvider
9
9
  private bodySize;
10
10
  constructor(sessionId: SessionId, directory: string);
11
11
  openBody(): void;
12
+ private openBodyFd;
12
13
  appendBody(data: Buffer): Promise<number>;
13
14
  readBody(offset: number, length: number): Promise<Buffer>;
14
15
  getBodySize(): number;
@@ -55,30 +55,30 @@ class FileSessionStreamProvider {
55
55
  this.sessionPath = sessionId.getFilePath(directory, 'session');
56
56
  }
57
57
  openBody() {
58
- if (this.bodyFd !== null)
59
- return;
60
- this.bodyFd = fs.openSync(this.bodyPath, 'a+');
61
- const stat = fs.fstatSync(this.bodyFd);
62
- this.bodySize = stat.size;
58
+ this.openBodyFd();
59
+ }
60
+ openBodyFd() {
61
+ if (this.bodyFd === null) {
62
+ this.bodyFd = fs.openSync(this.bodyPath, 'a+');
63
+ const stat = fs.fstatSync(this.bodyFd);
64
+ this.bodySize = stat.size;
65
+ }
66
+ return this.bodyFd;
63
67
  }
64
68
  appendBody(data) {
65
69
  return __awaiter(this, void 0, void 0, function* () {
66
- if (this.bodyFd === null) {
67
- this.openBody();
68
- }
70
+ const fd = this.openBodyFd();
69
71
  const offset = this.bodySize;
70
- fs.writeSync(this.bodyFd, data, 0, data.length, offset);
72
+ fs.writeSync(fd, data, 0, data.length, offset);
71
73
  this.bodySize += data.length;
72
74
  return offset;
73
75
  });
74
76
  }
75
77
  readBody(offset, length) {
76
78
  return __awaiter(this, void 0, void 0, function* () {
77
- if (this.bodyFd === null) {
78
- this.openBody();
79
- }
79
+ const fd = this.openBodyFd();
80
80
  const buf = Buffer.alloc(length);
81
- fs.readSync(this.bodyFd, buf, 0, length, offset);
81
+ fs.readSync(fd, buf, 0, length, offset);
82
82
  return buf;
83
83
  });
84
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-session-stream-provider.js","sourceRoot":"","sources":["../../src/store/file-session-stream-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs'\nimport { ISessionStreamProvider } from './session-stream-provider'\nimport { SessionId } from './session-id'\n\n/**\n * File-based implementation of ISessionStreamProvider.\n * Creates QuickFix-compatible files in the specified directory.\n *\n * Files created:\n * - {prefix}.body — concatenated raw FIX messages\n * - {prefix}.header — index lines: \"seqnum,offset,length\"\n * - {prefix}.seqnums — sender/target sequence numbers\n * - {prefix}.session — session creation time\n */\nexport class FileSessionStreamProvider implements ISessionStreamProvider {\n private readonly bodyPath: string\n private readonly headerPath: string\n private readonly seqNumsPath: string\n private readonly sessionPath: string\n private bodyFd: number | null = null\n private bodySize: number = 0\n\n constructor (\n sessionId: SessionId,\n directory: string\n ) {\n fs.mkdirSync(directory, { recursive: true })\n this.bodyPath = sessionId.getFilePath(directory, 'body')\n this.headerPath = sessionId.getFilePath(directory, 'header')\n this.seqNumsPath = sessionId.getFilePath(directory, 'seqnums')\n this.sessionPath = sessionId.getFilePath(directory, 'session')\n }\n\n openBody (): void {\n if (this.bodyFd !== null) return\n this.bodyFd = fs.openSync(this.bodyPath, 'a+')\n const stat = fs.fstatSync(this.bodyFd)\n this.bodySize = stat.size\n }\n\n async appendBody (data: Buffer): Promise<number> {\n if (this.bodyFd === null) {\n this.openBody()\n }\n const offset = this.bodySize\n fs.writeSync(this.bodyFd!, data, 0, data.length, offset)\n this.bodySize += data.length\n return offset\n }\n\n async readBody (offset: number, length: number): Promise<Buffer> {\n if (this.bodyFd === null) {\n this.openBody()\n }\n const buf = Buffer.alloc(length)\n fs.readSync(this.bodyFd!, buf, 0, length, offset)\n return buf\n }\n\n getBodySize (): number {\n return this.bodySize\n }\n\n async appendHeaderLine (line: string): Promise<void> {\n await fs.promises.appendFile(this.headerPath, line + '\\n', 'utf8')\n }\n\n async readHeaderLines (): Promise<string[]> {\n if (!fs.existsSync(this.headerPath)) return []\n const content = await fs.promises.readFile(this.headerPath, 'utf8')\n if (!content.trim()) return []\n return content.split('\\n').filter(l => l.trim().length > 0)\n }\n\n async readSeqNums (): Promise<string | null> {\n if (!fs.existsSync(this.seqNumsPath)) return null\n return await fs.promises.readFile(this.seqNumsPath, 'utf8')\n }\n\n async writeSeqNums (content: string): Promise<void> {\n await fs.promises.writeFile(this.seqNumsPath, content, 'utf8')\n }\n\n async readSessionTime (): Promise<string | null> {\n if (!fs.existsSync(this.sessionPath)) return null\n return await fs.promises.readFile(this.sessionPath, 'utf8')\n }\n\n async writeSessionTime (content: string): Promise<void> {\n await fs.promises.writeFile(this.sessionPath, content, 'utf8')\n }\n\n async reset (): Promise<void> {\n if (this.bodyFd !== null) {\n fs.closeSync(this.bodyFd)\n this.bodyFd = null\n }\n this.bodySize = 0\n this.deleteIfExists(this.bodyPath)\n this.deleteIfExists(this.headerPath)\n this.deleteIfExists(this.seqNumsPath)\n this.deleteIfExists(this.sessionPath)\n }\n\n async flush (): Promise<void> {\n if (this.bodyFd !== null) {\n fs.fsyncSync(this.bodyFd)\n }\n }\n\n async dispose (): Promise<void> {\n if (this.bodyFd !== null) {\n fs.closeSync(this.bodyFd)\n this.bodyFd = null\n }\n }\n\n private deleteIfExists (filePath: string): void {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"file-session-stream-provider.js","sourceRoot":"","sources":["../../src/store/file-session-stream-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs'\nimport { ISessionStreamProvider } from './session-stream-provider'\nimport { SessionId } from './session-id'\n\n/**\n * File-based implementation of ISessionStreamProvider.\n * Creates QuickFix-compatible files in the specified directory.\n *\n * Files created:\n * - {prefix}.body — concatenated raw FIX messages\n * - {prefix}.header — index lines: \"seqnum,offset,length\"\n * - {prefix}.seqnums — sender/target sequence numbers\n * - {prefix}.session — session creation time\n */\nexport class FileSessionStreamProvider implements ISessionStreamProvider {\n private readonly bodyPath: string\n private readonly headerPath: string\n private readonly seqNumsPath: string\n private readonly sessionPath: string\n private bodyFd: number | null = null\n private bodySize: number = 0\n\n constructor (\n sessionId: SessionId,\n directory: string\n ) {\n fs.mkdirSync(directory, { recursive: true })\n this.bodyPath = sessionId.getFilePath(directory, 'body')\n this.headerPath = sessionId.getFilePath(directory, 'header')\n this.seqNumsPath = sessionId.getFilePath(directory, 'seqnums')\n this.sessionPath = sessionId.getFilePath(directory, 'session')\n }\n\n openBody (): void {\n this.openBodyFd()\n }\n\n /**\n * open the body file on first use and hand back the descriptor - returning it\n * keeps callers free of a null check the compiler cannot see through.\n */\n private openBodyFd (): number {\n if (this.bodyFd === null) {\n this.bodyFd = fs.openSync(this.bodyPath, 'a+')\n const stat = fs.fstatSync(this.bodyFd)\n this.bodySize = stat.size\n }\n return this.bodyFd\n }\n\n async appendBody (data: Buffer): Promise<number> {\n const fd = this.openBodyFd()\n const offset = this.bodySize\n fs.writeSync(fd, data, 0, data.length, offset)\n this.bodySize += data.length\n return offset\n }\n\n async readBody (offset: number, length: number): Promise<Buffer> {\n const fd = this.openBodyFd()\n const buf = Buffer.alloc(length)\n fs.readSync(fd, buf, 0, length, offset)\n return buf\n }\n\n getBodySize (): number {\n return this.bodySize\n }\n\n async appendHeaderLine (line: string): Promise<void> {\n await fs.promises.appendFile(this.headerPath, line + '\\n', 'utf8')\n }\n\n async readHeaderLines (): Promise<string[]> {\n if (!fs.existsSync(this.headerPath)) return []\n const content = await fs.promises.readFile(this.headerPath, 'utf8')\n if (!content.trim()) return []\n return content.split('\\n').filter(l => l.trim().length > 0)\n }\n\n async readSeqNums (): Promise<string | null> {\n if (!fs.existsSync(this.seqNumsPath)) return null\n return await fs.promises.readFile(this.seqNumsPath, 'utf8')\n }\n\n async writeSeqNums (content: string): Promise<void> {\n await fs.promises.writeFile(this.seqNumsPath, content, 'utf8')\n }\n\n async readSessionTime (): Promise<string | null> {\n if (!fs.existsSync(this.sessionPath)) return null\n return await fs.promises.readFile(this.sessionPath, 'utf8')\n }\n\n async writeSessionTime (content: string): Promise<void> {\n await fs.promises.writeFile(this.sessionPath, content, 'utf8')\n }\n\n async reset (): Promise<void> {\n if (this.bodyFd !== null) {\n fs.closeSync(this.bodyFd)\n this.bodyFd = null\n }\n this.bodySize = 0\n this.deleteIfExists(this.bodyPath)\n this.deleteIfExists(this.headerPath)\n this.deleteIfExists(this.seqNumsPath)\n this.deleteIfExists(this.sessionPath)\n }\n\n async flush (): Promise<void> {\n if (this.bodyFd !== null) {\n fs.fsyncSync(this.bodyFd)\n }\n }\n\n async dispose (): Promise<void> {\n if (this.bodyFd !== null) {\n fs.closeSync(this.bodyFd)\n this.bodyFd = null\n }\n }\n\n private deleteIfExists (filePath: string): void {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath)\n }\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { IFixSessionStore } from './fix-session-store';
2
2
  import { SessionId } from './session-id';
3
3
  export interface IFixSessionStoreFactory {
4
- create(sessionId: SessionId): IFixSessionStore;
4
+ create: (sessionId: SessionId) => IFixSessionStore;
5
5
  }
6
6
  export declare class MemorySessionStoreFactory implements IFixSessionStoreFactory {
7
7
  create(sessionId: SessionId): IFixSessionStore;
@@ -1 +1 @@
1
- {"version":3,"file":"fix-session-store-factory.js","sourceRoot":"","sources":["../../src/store/fix-session-store-factory.ts"],"names":[],"mappings":";;;AAEA,iEAA2D;AAC3D,6DAAuD;AAYvD,MAAa,yBAAyB;IACpC,MAAM,CAAE,SAAoB;QAC1B,OAAO,IAAI,yCAAkB,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;CACF;AAJD,8DAIC;AAKD,MAAa,uBAAuB;IAClC,YAA8B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAEnD,MAAM,CAAE,SAAoB;QAC1B,OAAO,qCAAgB,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACpE,CAAC;CACF;AAND,0DAMC","sourcesContent":["import { IFixSessionStore } from './fix-session-store'\nimport { SessionId } from './session-id'\nimport { MemorySessionStore } from './memory-session-store'\nimport { FileSessionStore } from './file-session-store'\n\n/**\n * Factory for creating session stores.\n */\nexport interface IFixSessionStoreFactory {\n create (sessionId: SessionId): IFixSessionStore\n}\n\n/**\n * Factory for creating in-memory session stores.\n */\nexport class MemorySessionStoreFactory implements IFixSessionStoreFactory {\n create (sessionId: SessionId): IFixSessionStore {\n return new MemorySessionStore(sessionId)\n }\n}\n\n/**\n * Factory for creating file-based session stores.\n */\nexport class FileSessionStoreFactory implements IFixSessionStoreFactory {\n constructor (private readonly directory: string) {}\n\n create (sessionId: SessionId): IFixSessionStore {\n return FileSessionStore.createWithFiles(sessionId, this.directory)\n }\n}\n"]}
1
+ {"version":3,"file":"fix-session-store-factory.js","sourceRoot":"","sources":["../../src/store/fix-session-store-factory.ts"],"names":[],"mappings":";;;AAEA,iEAA2D;AAC3D,6DAAuD;AAYvD,MAAa,yBAAyB;IACpC,MAAM,CAAE,SAAoB;QAC1B,OAAO,IAAI,yCAAkB,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;CACF;AAJD,8DAIC;AAKD,MAAa,uBAAuB;IAClC,YAA8B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAEnD,MAAM,CAAE,SAAoB;QAC1B,OAAO,qCAAgB,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACpE,CAAC;CACF;AAND,0DAMC","sourcesContent":["import { IFixSessionStore } from './fix-session-store'\nimport { SessionId } from './session-id'\nimport { MemorySessionStore } from './memory-session-store'\nimport { FileSessionStore } from './file-session-store'\n\n/**\n * Factory for creating session stores.\n */\nexport interface IFixSessionStoreFactory {\n create: (sessionId: SessionId) => IFixSessionStore\n}\n\n/**\n * Factory for creating in-memory session stores.\n */\nexport class MemorySessionStoreFactory implements IFixSessionStoreFactory {\n create (sessionId: SessionId): IFixSessionStore {\n return new MemorySessionStore(sessionId)\n }\n}\n\n/**\n * Factory for creating file-based session stores.\n */\nexport class FileSessionStoreFactory implements IFixSessionStoreFactory {\n constructor (private readonly directory: string) {}\n\n create (sessionId: SessionId): IFixSessionStore {\n return FileSessionStore.createWithFiles(sessionId, this.directory)\n }\n}\n"]}
@@ -2,18 +2,18 @@ import { SessionId } from './session-id';
2
2
  import { IFixMsgStoreRecord } from './fix-msg-store-record';
3
3
  export interface IFixSessionStore {
4
4
  readonly sessionId: SessionId;
5
- put(record: IFixMsgStoreRecord): Promise<void>;
6
- get(seqNum: number): Promise<IFixMsgStoreRecord | null>;
7
- getRange(fromSeqNum: number, toSeqNum: number): Promise<IFixMsgStoreRecord[]>;
5
+ put: (record: IFixMsgStoreRecord) => Promise<void>;
6
+ get: (seqNum: number) => Promise<IFixMsgStoreRecord | null>;
7
+ getRange: (fromSeqNum: number, toSeqNum: number) => Promise<IFixMsgStoreRecord[]>;
8
8
  senderSeqNum: number;
9
9
  targetSeqNum: number;
10
- setSenderSeqNum(value: number): Promise<void>;
11
- setTargetSeqNum(value: number): Promise<void>;
12
- nextSenderSeqNum(): Promise<number>;
13
- nextTargetSeqNum(): Promise<number>;
10
+ setSenderSeqNum: (value: number) => Promise<void>;
11
+ setTargetSeqNum: (value: number) => Promise<void>;
12
+ nextSenderSeqNum: () => Promise<number>;
13
+ nextTargetSeqNum: () => Promise<number>;
14
14
  readonly creationTime: Date;
15
- reset(): Promise<void>;
16
- initialize(): Promise<void>;
17
- flush(): Promise<void>;
18
- dispose(): Promise<void>;
15
+ reset: () => Promise<void>;
16
+ initialize: () => Promise<void>;
17
+ flush: () => Promise<void>;
18
+ dispose: () => Promise<void>;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fix-session-store.js","sourceRoot":"","sources":["../../src/store/fix-session-store.ts"],"names":[],"mappings":"","sourcesContent":["import { SessionId } from './session-id'\nimport { IFixMsgStoreRecord } from './fix-msg-store-record'\n\n/**\n * Unified session store interface for FIX message persistence and sequence number management.\n * Coordinates all persistence for a single FIX session:\n * - Message storage (.body + .header files)\n * - Sequence numbers (.seqnums file)\n * - Session metadata (.session file)\n *\n * QuickFix-compatible file format for interoperability.\n */\nexport interface IFixSessionStore {\n readonly sessionId: SessionId\n\n // Message Operations\n put (record: IFixMsgStoreRecord): Promise<void>\n get (seqNum: number): Promise<IFixMsgStoreRecord | null>\n getRange (fromSeqNum: number, toSeqNum: number): Promise<IFixMsgStoreRecord[]>\n\n // Sequence Number Operations\n senderSeqNum: number\n targetSeqNum: number\n setSenderSeqNum (value: number): Promise<void>\n setTargetSeqNum (value: number): Promise<void>\n nextSenderSeqNum (): Promise<number>\n nextTargetSeqNum (): Promise<number>\n\n // Session Operations\n readonly creationTime: Date\n reset (): Promise<void>\n\n // Lifecycle\n initialize (): Promise<void>\n flush (): Promise<void>\n dispose (): Promise<void>\n}\n"]}
1
+ {"version":3,"file":"fix-session-store.js","sourceRoot":"","sources":["../../src/store/fix-session-store.ts"],"names":[],"mappings":"","sourcesContent":["import { SessionId } from './session-id'\nimport { IFixMsgStoreRecord } from './fix-msg-store-record'\n\n/**\n * Unified session store interface for FIX message persistence and sequence number management.\n * Coordinates all persistence for a single FIX session:\n * - Message storage (.body + .header files)\n * - Sequence numbers (.seqnums file)\n * - Session metadata (.session file)\n *\n * QuickFix-compatible file format for interoperability.\n */\nexport interface IFixSessionStore {\n readonly sessionId: SessionId\n\n // Message Operations\n put: (record: IFixMsgStoreRecord) => Promise<void>\n get: (seqNum: number) => Promise<IFixMsgStoreRecord | null>\n getRange: (fromSeqNum: number, toSeqNum: number) => Promise<IFixMsgStoreRecord[]>\n\n // Sequence Number Operations\n senderSeqNum: number\n targetSeqNum: number\n setSenderSeqNum: (value: number) => Promise<void>\n setTargetSeqNum: (value: number) => Promise<void>\n nextSenderSeqNum: () => Promise<number>\n nextTargetSeqNum: () => Promise<number>\n\n // Session Operations\n readonly creationTime: Date\n reset: () => Promise<void>\n\n // Lifecycle\n initialize: () => Promise<void>\n flush: () => Promise<void>\n dispose: () => Promise<void>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"memory-session-store.js","sourceRoot":"","sources":["../../src/store/memory-session-store.ts"],"names":[],"mappings":";;;;;;;;;;;;AAQA,MAAa,kBAAkB;IAM7B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;QALhC,aAAQ,GAAoC,IAAI,GAAG,EAAE,CAAA;QAC9D,sBAAiB,GAAW,CAAC,CAAA;QAC7B,sBAAiB,GAAW,CAAC,CAAA;QAC7B,sBAAiB,GAAS,IAAI,IAAI,EAAE,CAAA;IAEQ,CAAC;IAIrD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED,IAAI,YAAY,CAAE,KAAa;QAC7B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;IAChC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED,IAAI,YAAY,CAAE,KAAa;QAC7B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;IAChC,CAAC;IAEK,eAAe,CAAE,KAAa;;YAClC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAChC,CAAC;KAAA;IAEK,eAAe,CAAE,KAAa;;YAClC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAChC,CAAC;KAAA;IAEK,gBAAgB;;YACpB,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAA;QACjC,CAAC;KAAA;IAEK,gBAAgB;;YACpB,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAA;QACjC,CAAC;KAAA;IAID,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAEK,KAAK;;YACT,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;YAC1B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;YAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;KAAA;IAIK,GAAG,CAAE,MAA0B;;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAClD,CAAC;KAAA;IAEK,GAAG,CAAE,MAAc;;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACxC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACvC,CAAC;KAAA;IAEK,QAAQ,CAAE,UAAkB,EAAE,QAAgB;;YAClD,MAAM,OAAO,GAAyB,EAAE,CAAA;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;iBAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,CAAC;iBAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACrC,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC9B,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;KAAA;IAIK,UAAU;;QAEhB,CAAC;KAAA;IAEK,KAAK;;QAEX,CAAC;KAAA;IAEK,OAAO;;QAEb,CAAC;KAAA;CACF;AA7FD,gDA6FC","sourcesContent":["import { IFixSessionStore } from './fix-session-store'\nimport { SessionId } from './session-id'\nimport { IFixMsgStoreRecord } from './fix-msg-store-record'\n\n/**\n * In-memory session store for testing and development.\n * Not persistent - all data lost on dispose.\n */\nexport class MemorySessionStore implements IFixSessionStore {\n private readonly messages: Map<number, IFixMsgStoreRecord> = new Map()\n private senderSeqNumValue: number = 1\n private targetSeqNumValue: number = 1\n private creationTimeValue: Date = new Date()\n\n constructor (public readonly sessionId: SessionId) {}\n\n // Sequence Numbers\n\n get senderSeqNum (): number {\n return this.senderSeqNumValue\n }\n\n set senderSeqNum (value: number) {\n this.senderSeqNumValue = value\n }\n\n get targetSeqNum (): number {\n return this.targetSeqNumValue\n }\n\n set targetSeqNum (value: number) {\n this.targetSeqNumValue = value\n }\n\n async setSenderSeqNum (value: number): Promise<void> {\n this.senderSeqNumValue = value\n }\n\n async setTargetSeqNum (value: number): Promise<void> {\n this.targetSeqNumValue = value\n }\n\n async nextSenderSeqNum (): Promise<number> {\n return ++this.senderSeqNumValue\n }\n\n async nextTargetSeqNum (): Promise<number> {\n return ++this.targetSeqNumValue\n }\n\n // Session\n\n get creationTime (): Date {\n return this.creationTimeValue\n }\n\n async reset (): Promise<void> {\n this.senderSeqNumValue = 1\n this.targetSeqNumValue = 1\n this.creationTimeValue = new Date()\n this.messages.clear()\n }\n\n // Message Operations\n\n async put (record: IFixMsgStoreRecord): Promise<void> {\n this.messages.set(record.seqNum, record.clone())\n }\n\n async get (seqNum: number): Promise<IFixMsgStoreRecord | null> {\n const record = this.messages.get(seqNum)\n return record ? record.clone() : null\n }\n\n async getRange (fromSeqNum: number, toSeqNum: number): Promise<IFixMsgStoreRecord[]> {\n const results: IFixMsgStoreRecord[] = []\n const keys = Array.from(this.messages.keys())\n .filter(k => k >= fromSeqNum && k <= toSeqNum)\n .sort((a, b) => a - b)\n for (const seq of keys) {\n const record = this.messages.get(seq)\n if (record) {\n results.push(record.clone())\n }\n }\n return results\n }\n\n // Lifecycle\n\n async initialize (): Promise<void> {\n // No-op for memory store\n }\n\n async flush (): Promise<void> {\n // No-op for memory store\n }\n\n async dispose (): Promise<void> {\n // No-op for memory store\n }\n}\n"]}
1
+ {"version":3,"file":"memory-session-store.js","sourceRoot":"","sources":["../../src/store/memory-session-store.ts"],"names":[],"mappings":";;;;;;;;;;;;AAQA,MAAa,kBAAkB;IAM7B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;QALhC,aAAQ,GAAG,IAAI,GAAG,EAA8B,CAAA;QACzD,sBAAiB,GAAW,CAAC,CAAA;QAC7B,sBAAiB,GAAW,CAAC,CAAA;QAC7B,sBAAiB,GAAS,IAAI,IAAI,EAAE,CAAA;IAEQ,CAAC;IAIrD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED,IAAI,YAAY,CAAE,KAAa;QAC7B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;IAChC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED,IAAI,YAAY,CAAE,KAAa;QAC7B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;IAChC,CAAC;IAEK,eAAe,CAAE,KAAa;;YAClC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAChC,CAAC;KAAA;IAEK,eAAe,CAAE,KAAa;;YAClC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAChC,CAAC;KAAA;IAEK,gBAAgB;;YACpB,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAA;QACjC,CAAC;KAAA;IAEK,gBAAgB;;YACpB,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAA;QACjC,CAAC;KAAA;IAID,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAEK,KAAK;;YACT,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;YAC1B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;YAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;KAAA;IAIK,GAAG,CAAE,MAA0B;;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAClD,CAAC;KAAA;IAEK,GAAG,CAAE,MAAc;;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACxC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACvC,CAAC;KAAA;IAEK,QAAQ,CAAE,UAAkB,EAAE,QAAgB;;YAClD,MAAM,OAAO,GAAyB,EAAE,CAAA;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;iBAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,CAAC;iBAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACrC,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC9B,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;KAAA;IAIK,UAAU;;QAEhB,CAAC;KAAA;IAEK,KAAK;;QAEX,CAAC;KAAA;IAEK,OAAO;;QAEb,CAAC;KAAA;CACF;AA7FD,gDA6FC","sourcesContent":["import { IFixSessionStore } from './fix-session-store'\nimport { SessionId } from './session-id'\nimport { IFixMsgStoreRecord } from './fix-msg-store-record'\n\n/**\n * In-memory session store for testing and development.\n * Not persistent - all data lost on dispose.\n */\nexport class MemorySessionStore implements IFixSessionStore {\n private readonly messages = new Map<number, IFixMsgStoreRecord>()\n private senderSeqNumValue: number = 1\n private targetSeqNumValue: number = 1\n private creationTimeValue: Date = new Date()\n\n constructor (public readonly sessionId: SessionId) {}\n\n // Sequence Numbers\n\n get senderSeqNum (): number {\n return this.senderSeqNumValue\n }\n\n set senderSeqNum (value: number) {\n this.senderSeqNumValue = value\n }\n\n get targetSeqNum (): number {\n return this.targetSeqNumValue\n }\n\n set targetSeqNum (value: number) {\n this.targetSeqNumValue = value\n }\n\n async setSenderSeqNum (value: number): Promise<void> {\n this.senderSeqNumValue = value\n }\n\n async setTargetSeqNum (value: number): Promise<void> {\n this.targetSeqNumValue = value\n }\n\n async nextSenderSeqNum (): Promise<number> {\n return ++this.senderSeqNumValue\n }\n\n async nextTargetSeqNum (): Promise<number> {\n return ++this.targetSeqNumValue\n }\n\n // Session\n\n get creationTime (): Date {\n return this.creationTimeValue\n }\n\n async reset (): Promise<void> {\n this.senderSeqNumValue = 1\n this.targetSeqNumValue = 1\n this.creationTimeValue = new Date()\n this.messages.clear()\n }\n\n // Message Operations\n\n async put (record: IFixMsgStoreRecord): Promise<void> {\n this.messages.set(record.seqNum, record.clone())\n }\n\n async get (seqNum: number): Promise<IFixMsgStoreRecord | null> {\n const record = this.messages.get(seqNum)\n return record ? record.clone() : null\n }\n\n async getRange (fromSeqNum: number, toSeqNum: number): Promise<IFixMsgStoreRecord[]> {\n const results: IFixMsgStoreRecord[] = []\n const keys = Array.from(this.messages.keys())\n .filter(k => k >= fromSeqNum && k <= toSeqNum)\n .sort((a, b) => a - b)\n for (const seq of keys) {\n const record = this.messages.get(seq)\n if (record) {\n results.push(record.clone())\n }\n }\n return results\n }\n\n // Lifecycle\n\n async initialize (): Promise<void> {\n // No-op for memory store\n }\n\n async flush (): Promise<void> {\n // No-op for memory store\n }\n\n async dispose (): Promise<void> {\n // No-op for memory store\n }\n}\n"]}
@@ -1,15 +1,15 @@
1
1
  export interface ISessionStreamProvider {
2
- openBody(): void;
3
- appendBody(data: Buffer): Promise<number>;
4
- readBody(offset: number, length: number): Promise<Buffer>;
5
- getBodySize(): number;
6
- appendHeaderLine(line: string): Promise<void>;
7
- readHeaderLines(): Promise<string[]>;
8
- readSeqNums(): Promise<string | null>;
9
- writeSeqNums(content: string): Promise<void>;
10
- readSessionTime(): Promise<string | null>;
11
- writeSessionTime(content: string): Promise<void>;
12
- reset(): Promise<void>;
13
- flush(): Promise<void>;
14
- dispose(): Promise<void>;
2
+ openBody: () => void;
3
+ appendBody: (data: Buffer) => Promise<number>;
4
+ readBody: (offset: number, length: number) => Promise<Buffer>;
5
+ getBodySize: () => number;
6
+ appendHeaderLine: (line: string) => Promise<void>;
7
+ readHeaderLines: () => Promise<string[]>;
8
+ readSeqNums: () => Promise<string | null>;
9
+ writeSeqNums: (content: string) => Promise<void>;
10
+ readSessionTime: () => Promise<string | null>;
11
+ writeSessionTime: (content: string) => Promise<void>;
12
+ reset: () => Promise<void>;
13
+ flush: () => Promise<void>;
14
+ dispose: () => Promise<void>;
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-stream-provider.js","sourceRoot":"","sources":["../../src/store/session-stream-provider.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Provides stream access for session store operations.\n * Allows abstraction of file I/O for testing with in-memory buffers.\n */\nexport interface ISessionStreamProvider {\n /**\n * Opens or creates a read-write buffer for the message body file.\n * Must support random-access reads (by offset+length).\n */\n openBody (): void\n\n /**\n * Appends data to the body. Returns the offset at which data was written.\n */\n appendBody (data: Buffer): Promise<number>\n\n /**\n * Reads data from the body at the given offset and length.\n */\n readBody (offset: number, length: number): Promise<Buffer>\n\n /**\n * Gets the current body size (for calculating offsets).\n */\n getBodySize (): number\n\n /**\n * Appends a line to the header index file.\n */\n appendHeaderLine (line: string): Promise<void>\n\n /**\n * Reads all lines from the header index file.\n * Returns empty array if no data exists.\n */\n readHeaderLines (): Promise<string[]>\n\n /**\n * Reads the sequence numbers string.\n * Returns null if no data exists.\n */\n readSeqNums (): Promise<string | null>\n\n /**\n * Writes the sequence numbers string.\n */\n writeSeqNums (content: string): Promise<void>\n\n /**\n * Reads the session time string.\n * Returns null if no data exists.\n */\n readSessionTime (): Promise<string | null>\n\n /**\n * Writes the session time string.\n */\n writeSessionTime (content: string): Promise<void>\n\n /**\n * Resets all streams/files for a new session.\n */\n reset (): Promise<void>\n\n /**\n * Flushes any pending writes.\n */\n flush (): Promise<void>\n\n /**\n * Disposes of all resources.\n */\n dispose (): Promise<void>\n}\n"]}
1
+ {"version":3,"file":"session-stream-provider.js","sourceRoot":"","sources":["../../src/store/session-stream-provider.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Provides stream access for session store operations.\n * Allows abstraction of file I/O for testing with in-memory buffers.\n */\nexport interface ISessionStreamProvider {\n /**\n * Opens or creates a read-write buffer for the message body file.\n * Must support random-access reads (by offset+length).\n */\n openBody: () => void\n\n /**\n * Appends data to the body. Returns the offset at which data was written.\n */\n appendBody: (data: Buffer) => Promise<number>\n\n /**\n * Reads data from the body at the given offset and length.\n */\n readBody: (offset: number, length: number) => Promise<Buffer>\n\n /**\n * Gets the current body size (for calculating offsets).\n */\n getBodySize: () => number\n\n /**\n * Appends a line to the header index file.\n */\n appendHeaderLine: (line: string) => Promise<void>\n\n /**\n * Reads all lines from the header index file.\n * Returns empty array if no data exists.\n */\n readHeaderLines: () => Promise<string[]>\n\n /**\n * Reads the sequence numbers string.\n * Returns null if no data exists.\n */\n readSeqNums: () => Promise<string | null>\n\n /**\n * Writes the sequence numbers string.\n */\n writeSeqNums: (content: string) => Promise<void>\n\n /**\n * Reads the session time string.\n * Returns null if no data exists.\n */\n readSessionTime: () => Promise<string | null>\n\n /**\n * Writes the session time string.\n */\n writeSessionTime: (content: string) => Promise<void>\n\n /**\n * Resets all streams/files for a new session.\n */\n reset: () => Promise<void>\n\n /**\n * Flushes any pending writes.\n */\n flush: () => Promise<void>\n\n /**\n * Disposes of all resources.\n */\n dispose: () => Promise<void>\n}\n"]}
@@ -8,6 +8,7 @@ export declare class AsciiMsgTransmitter extends MsgTransmitter {
8
8
  private readonly header;
9
9
  private readonly trailer;
10
10
  constructor(config: IJsFixConfig);
11
+ private reportUnknownFields;
11
12
  private checksum;
12
13
  encodeMessage(msgType: string, obj: ILooseObject): (ILooseObject | null);
13
14
  }
@@ -40,6 +40,21 @@ let AsciiMsgTransmitter = class AsciiMsgTransmitter extends msg_transmitter_1.Ms
40
40
  const components = config.definitions.component;
41
41
  this.header = components.get('StandardHeader');
42
42
  this.trailer = components.get('StandardTrailer');
43
+ this.reportUnknownFields(config);
44
+ }
45
+ reportUnknownFields(config) {
46
+ var _a, _b;
47
+ const name = (_b = (_a = config.description.application) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'na';
48
+ const logger = config.logFactory.logger(`${name}:encoder`);
49
+ const reported = new Set();
50
+ this.encoder.onUnknownField = (fieldName, setName) => {
51
+ const key = `${setName}.${fieldName}`;
52
+ if (reported.has(key))
53
+ return;
54
+ reported.add(key);
55
+ logger.warning(`field '${fieldName}' is not declared on ${setName} in this dictionary - it will not be sent`);
56
+ this.emit('unknown-field', fieldName, setName);
57
+ };
43
58
  }
44
59
  checksum() {
45
60
  const buffer = this.buffer;
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-msg-transmitter.js","sourceRoot":"","sources":["../../../src/transport/ascii/ascii-msg-transmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsciiChars, AsciiEncoder, TimeFormatter } from '../../buffer/ascii'\nimport { MsgTransmitter } from '../msg-transmitter'\nimport { ILooseObject } from '../../collections/collection'\nimport { IContainedSet } from '../../dictionary/contained'\nimport { MessageDefinition } from '../../dictionary/definition'\nimport { IJsFixConfig } from '../../config'\nimport { IStandardHeader } from '../../types/FIX4.4/repo'\nimport { inject, injectable } from 'tsyringe'\nimport { DITokens } from '../../runtime/di-tokens'\nimport { ElasticBuffer } from '../../buffer'\n\n@injectable()\nexport class AsciiMsgTransmitter extends MsgTransmitter {\n public msgSeqNum: number\n public time: Date\n\n private readonly header: IContainedSet | undefined\n private readonly trailer: IContainedSet | undefined\n\n constructor (@inject(DITokens.IJsFixConfig) public readonly config: IJsFixConfig) {\n super(config.sessionContainer.resolve<ElasticBuffer>(DITokens.TransmitBuffer), config.definitions, config.description)\n this.msgSeqNum = (config.description.LastSentSeqNum ?? 0) + 1 // adding 1 as this the next sequence # to use.\n const buffer = this.buffer\n const tf: TimeFormatter = new TimeFormatter(buffer)\n this.encoder = new AsciiEncoder(buffer, config.definitions, tf,\n config.delimiter ?? AsciiChars.Soh,\n config.logDelimiter ?? AsciiChars.Pipe)\n const components = config.definitions.component\n this.header = components.get('StandardHeader')\n this.trailer = components.get('StandardTrailer')\n }\n\n private checksum (): number {\n const buffer = this.buffer\n const encoder: AsciiEncoder = this.encoder as AsciiEncoder\n let checksum: number = buffer.sum()\n if (encoder.delimiter !== encoder.logDelimiter) {\n const changes = encoder.tags.nextTagPos\n checksum -= changes * encoder.logDelimiter\n checksum += changes * encoder.delimiter\n }\n checksum = checksum % 256\n return checksum\n }\n\n public encodeMessage (msgType: string, obj: ILooseObject): (ILooseObject | null) {\n const encoder: AsciiEncoder = this.encoder as AsciiEncoder\n const factory = this.config.factory\n let headerProps: Partial<IStandardHeader> = {}\n const { StandardHeader, ...bodyProps } = obj\n if (StandardHeader) {\n const { BeginString, BodyLength, MsgType, SenderCompID, SendingTime, TargetCompID, TargetSubID, ...hp } = StandardHeader\n headerProps = hp // pick up any optional applied by application\n headerProps.OrigSendingTime = SendingTime // when first sent\n }\n\n const msgSeqNum = this.msgSeqNum\n const sendingTime = this.time || new Date()\n const hdr: ILooseObject | null = factory?.header(msgType, msgSeqNum, sendingTime, headerProps) ?? null\n // Only increment sequence number if this is not a duplicate message.\n if (!hdr) return null\n if (!headerProps.PossDupFlag) {\n this.msgSeqNum++\n }\n\n const buffer = this.buffer\n buffer.reset()\n const msgDef: MessageDefinition | undefined = this.definitions.message.get(msgType)\n if (!msgDef) {\n this.emit('error', new Error(`ascii transmitter cannot find definition for ${msgType}`))\n return null\n }\n const headerName: string = this.header?.name ?? 'header'\n const trailerName: string = this.trailer?.name ?? 'trailer'\n encoder.encode(hdr, headerName)\n encoder.encode(bodyProps, msgDef.name)\n const lenPos = encoder.bodyLengthPos\n const bodyLength: number = Math.max(4, this.config.description.BodyLengthChars ?? 7)\n const len = buffer.getPos() - encoder.msgTypePos\n buffer.patchPaddedNumberAtPos(lenPos, len, bodyLength)\n const checksum: number = this.checksum()\n const trl: ILooseObject | null = factory?.trailer(checksum) ?? null\n if (trl) {\n encoder.encode(trl, trailerName)\n }\n return hdr\n }\n}\n"]}
1
+ {"version":3,"file":"ascii-msg-transmitter.js","sourceRoot":"","sources":["../../../src/transport/ascii/ascii-msg-transmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsciiChars, AsciiEncoder, TimeFormatter } from '../../buffer/ascii'\nimport { MsgTransmitter } from '../msg-transmitter'\nimport { ILooseObject } from '../../collections/collection'\nimport { IContainedSet } from '../../dictionary/contained'\nimport { MessageDefinition } from '../../dictionary/definition'\nimport { IJsFixConfig } from '../../config'\nimport { IStandardHeader } from '../../types/FIX4.4/repo'\nimport { inject, injectable } from 'tsyringe'\nimport { DITokens } from '../../runtime/di-tokens'\nimport { ElasticBuffer } from '../../buffer'\n\n@injectable()\nexport class AsciiMsgTransmitter extends MsgTransmitter {\n public msgSeqNum: number\n public time: Date\n\n private readonly header: IContainedSet | undefined\n private readonly trailer: IContainedSet | undefined\n\n constructor (@inject(DITokens.IJsFixConfig) public readonly config: IJsFixConfig) {\n super(config.sessionContainer.resolve<ElasticBuffer>(DITokens.TransmitBuffer), config.definitions, config.description)\n this.msgSeqNum = (config.description.LastSentSeqNum ?? 0) + 1 // adding 1 as this the next sequence # to use.\n const buffer = this.buffer\n const tf: TimeFormatter = new TimeFormatter(buffer)\n this.encoder = new AsciiEncoder(buffer, config.definitions, tf,\n config.delimiter ?? AsciiChars.Soh,\n config.logDelimiter ?? AsciiChars.Pipe)\n const components = config.definitions.component\n this.header = components.get('StandardHeader')\n this.trailer = components.get('StandardTrailer')\n this.reportUnknownFields(config)\n }\n\n /**\n * A field the dictionary does not declare on the message being encoded has no tag,\n * so it cannot be written and is dropped. Say so once per offending field - the\n * alternative, and what this library did for years, is that a bespoke Logon tag\n * simply never appears on the wire and nothing anywhere explains why.\n */\n private reportUnknownFields (config: IJsFixConfig): void {\n const name = config.description.application?.name ?? 'na'\n const logger = config.logFactory.logger(`${name}:encoder`)\n const reported = new Set<string>()\n this.encoder.onUnknownField = (fieldName: string, setName: string) => {\n const key = `${setName}.${fieldName}`\n if (reported.has(key)) return\n reported.add(key)\n logger.warning(`field '${fieldName}' is not declared on ${setName} in this dictionary - it will not be sent`)\n this.emit('unknown-field', fieldName, setName)\n }\n }\n\n private checksum (): number {\n const buffer = this.buffer\n const encoder: AsciiEncoder = this.encoder as AsciiEncoder\n let checksum: number = buffer.sum()\n if (encoder.delimiter !== encoder.logDelimiter) {\n const changes = encoder.tags.nextTagPos\n checksum -= changes * encoder.logDelimiter\n checksum += changes * encoder.delimiter\n }\n checksum = checksum % 256\n return checksum\n }\n\n public encodeMessage (msgType: string, obj: ILooseObject): (ILooseObject | null) {\n const encoder: AsciiEncoder = this.encoder as AsciiEncoder\n const factory = this.config.factory\n let headerProps: Partial<IStandardHeader> = {}\n const { StandardHeader, ...bodyProps } = obj\n if (StandardHeader) {\n const { BeginString, BodyLength, MsgType, SenderCompID, SendingTime, TargetCompID, TargetSubID, ...hp } = StandardHeader\n headerProps = hp // pick up any optional applied by application\n headerProps.OrigSendingTime = SendingTime // when first sent\n }\n\n const msgSeqNum = this.msgSeqNum\n const sendingTime = this.time || new Date()\n const hdr: ILooseObject | null = factory?.header(msgType, msgSeqNum, sendingTime, headerProps) ?? null\n // Only increment sequence number if this is not a duplicate message.\n if (!hdr) return null\n if (!headerProps.PossDupFlag) {\n this.msgSeqNum++\n }\n\n const buffer = this.buffer\n buffer.reset()\n const msgDef: MessageDefinition | undefined = this.definitions.message.get(msgType)\n if (!msgDef) {\n this.emit('error', new Error(`ascii transmitter cannot find definition for ${msgType}`))\n return null\n }\n const headerName: string = this.header?.name ?? 'header'\n const trailerName: string = this.trailer?.name ?? 'trailer'\n encoder.encode(hdr, headerName)\n encoder.encode(bodyProps, msgDef.name)\n const lenPos = encoder.bodyLengthPos\n const bodyLength: number = Math.max(4, this.config.description.BodyLengthChars ?? 7)\n const len = buffer.getPos() - encoder.msgTypePos\n buffer.patchPaddedNumberAtPos(lenPos, len, bodyLength)\n const checksum: number = this.checksum()\n const trl: ILooseObject | null = factory?.trailer(checksum) ?? null\n if (trl) {\n encoder.encode(trl, trailerName)\n }\n return hdr\n }\n}\n"]}
@@ -13,13 +13,7 @@ class AsciiSessionMsgFactory extends a_session_msg_factory_1.ASessionMsgFactory
13
13
  }
14
14
  logon() {
15
15
  const description = this.description;
16
- const o = {
17
- Username: description.Username,
18
- Password: description.Password,
19
- HeartBtInt: description.HeartBtInt,
20
- ResetSeqNumFlag: description.ResetSeqNumFlag,
21
- EncryptMethod: repo_1.EncryptMethod.None
22
- };
16
+ const o = Object.assign({ Username: description.Username, Password: description.Password, HeartBtInt: description.HeartBtInt, ResetSeqNumFlag: description.ResetSeqNumFlag, EncryptMethod: repo_1.EncryptMethod.None }, description.Logon);
23
17
  return this.mutate(o, types_1.MsgType.Logon);
24
18
  }
25
19
  logout(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-session-msg-factory.js","sourceRoot":"","sources":["../../../src/transport/ascii/ascii-session-msg-factory.ts"],"names":[],"mappings":";;;AAEA,uCAAqC;AACrC,4EAAoF;AAEpF,kDAKgC;AAEhC,MAAa,sBAAuB,SAAQ,0CAAkB;IAC5D,YAAsB,WAAgC,EAAE,UAAgC,IAAI;;QAC1F,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QADP,gBAAW,GAAX,WAAW,CAAqB;QAEpD,IAAI,CAAC,OAAO,GAAG,CAAA,MAAA,WAAW,CAAC,WAAW,0CAAE,QAAQ,MAAK,OAAO,CAAA;IAC9D,CAAC;IAEM,KAAK;QACV,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,MAAM,CAAC,GAAW;YAChB,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,aAAa,EAAE,oBAAa,CAAC,IAAI;SACxB,CAAA;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IAEM,MAAM,CAAE,IAAY;QACzB,MAAM,CAAC,GAAY;YACjB,IAAI,EAAE,IAAI;SACA,CAAA;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAEM,MAAM,CAAE,OAAe,EAAE,MAAc,EAAE,IAAU,EAAE,YAAuC;;QACjG,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,MAAM,UAAU,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAA,WAAW,CAAC,eAAe,mCAAI,CAAC,CAAC,CAAA;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACpD,MAAM,CAAC,mBACL,WAAW,EAAE,WAAW,CAAC,WAAW,EACpC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,WAAW,CAAC,YAAY,EACtC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,IAAI,EACjB,YAAY,EAAE,WAAW,CAAC,YAAY,EACtC,WAAW,EAAE,WAAW,CAAC,WAAW,EACpC,WAAW,EAAE,WAAW,CAAC,WAAW,IACjC,YAAY,CAChB,CAAA;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;IACzC,CAAC;CACF;AA3CD,wDA2CC;AAED,MAAa,iBAAkB,SAAQ,sBAAsB;IAC3D,YAA6B,WAAgC,EAAS,UAAgC,IAAI;QACxG,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QADA,gBAAW,GAAX,WAAW,CAAqB;QAAS,YAAO,GAAP,OAAO,CAA6B;IAE1G,CAAC;CACF;AAJD,8CAIC","sourcesContent":["import { ISessionDescription } from '../session/session-description'\nimport { ILooseObject } from '../../collections/collection'\nimport { MsgType } from '../../types'\nimport { ASessionMsgFactory, ObjectMutator } from '../session/a-session-msg-factory'\n\nimport {\n EncryptMethod,\n ILogon,\n ILogout,\n IStandardHeader\n} from '../../types/FIX4.4/repo'\n\nexport class AsciiSessionMsgFactory extends ASessionMsgFactory {\n constructor (readonly description: ISessionDescription, mutator: ObjectMutator | null = null) {\n super(description, mutator)\n this.isAscii = description.application?.protocol === 'ascii'\n }\n\n public logon (): ILooseObject {\n const description = this.description\n const o: ILogon = {\n Username: description.Username,\n Password: description.Password,\n HeartBtInt: description.HeartBtInt,\n ResetSeqNumFlag: description.ResetSeqNumFlag,\n EncryptMethod: EncryptMethod.None\n } as ILogon\n return this.mutate(o, MsgType.Logon)\n }\n\n public logout (text: string): ILooseObject {\n const o: ILogout = {\n Text: text\n } as ILogout\n return this.mutate(o, MsgType.Logout)\n }\n\n public header (msgType: string, seqNum: number, time: Date, overrideData?: Partial<IStandardHeader>): ILooseObject {\n const description = this.description\n const bodyLength: number = Math.max(4, description.BodyLengthChars ?? 7)\n const placeHolder = Math.pow(10, bodyLength - 1) + 1\n const o: IStandardHeader = {\n BeginString: description.BeginString,\n BodyLength: placeHolder,\n MsgType: msgType,\n SenderCompID: description.SenderCompId,\n MsgSeqNum: seqNum,\n SendingTime: time,\n TargetCompID: description.TargetCompID,\n TargetSubID: description.TargetSubID,\n SenderSubID: description.SenderSubID,\n ...overrideData\n }\n return this.mutate(o, 'StandardHeader')\n }\n}\n\nexport class SessionMsgFactory extends AsciiSessionMsgFactory {\n constructor (public readonly description: ISessionDescription, public mutator: ObjectMutator | null = null) {\n super(description, mutator)\n }\n}\n"]}
1
+ {"version":3,"file":"ascii-session-msg-factory.js","sourceRoot":"","sources":["../../../src/transport/ascii/ascii-session-msg-factory.ts"],"names":[],"mappings":";;;AAEA,uCAAqC;AACrC,4EAAoF;AAEpF,kDAKgC;AAEhC,MAAa,sBAAuB,SAAQ,0CAAkB;IAC5D,YAAsB,WAAgC,EAAE,UAAgC,IAAI;;QAC1F,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QADP,gBAAW,GAAX,WAAW,CAAqB;QAEpD,IAAI,CAAC,OAAO,GAAG,CAAA,MAAA,WAAW,CAAC,WAAW,0CAAE,QAAQ,MAAK,OAAO,CAAA;IAC9D,CAAC;IAEM,KAAK;QACV,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,MAAM,CAAC,GAAW,gBAChB,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAC9B,UAAU,EAAE,WAAW,CAAC,UAAU,EAClC,eAAe,EAAE,WAAW,CAAC,eAAe,EAC5C,aAAa,EAAE,oBAAa,CAAC,IAAI,IAK9B,WAAW,CAAC,KAAK,CACX,CAAA;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IAEM,MAAM,CAAE,IAAY;QACzB,MAAM,CAAC,GAAY;YACjB,IAAI,EAAE,IAAI;SACA,CAAA;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAEM,MAAM,CAAE,OAAe,EAAE,MAAc,EAAE,IAAU,EAAE,YAAuC;;QACjG,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,MAAM,UAAU,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAA,WAAW,CAAC,eAAe,mCAAI,CAAC,CAAC,CAAA;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACpD,MAAM,CAAC,mBACL,WAAW,EAAE,WAAW,CAAC,WAAW,EACpC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,WAAW,CAAC,YAAY,EACtC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,IAAI,EACjB,YAAY,EAAE,WAAW,CAAC,YAAY,EACtC,WAAW,EAAE,WAAW,CAAC,WAAW,EACpC,WAAW,EAAE,WAAW,CAAC,WAAW,IACjC,YAAY,CAChB,CAAA;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;IACzC,CAAC;CACF;AAhDD,wDAgDC;AAED,MAAa,iBAAkB,SAAQ,sBAAsB;IAC3D,YAA6B,WAAgC,EAAS,UAAgC,IAAI;QACxG,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QADA,gBAAW,GAAX,WAAW,CAAqB;QAAS,YAAO,GAAP,OAAO,CAA6B;IAE1G,CAAC;CACF;AAJD,8CAIC","sourcesContent":["import { ISessionDescription } from '../session/session-description'\nimport { ILooseObject } from '../../collections/collection'\nimport { MsgType } from '../../types'\nimport { ASessionMsgFactory, ObjectMutator } from '../session/a-session-msg-factory'\n\nimport {\n EncryptMethod,\n ILogon,\n ILogout,\n IStandardHeader\n} from '../../types/FIX4.4/repo'\n\nexport class AsciiSessionMsgFactory extends ASessionMsgFactory {\n constructor (readonly description: ISessionDescription, mutator: ObjectMutator | null = null) {\n super(description, mutator)\n this.isAscii = description.application?.protocol === 'ascii'\n }\n\n public logon (): ILooseObject {\n const description = this.description\n const o: ILogon = {\n Username: description.Username,\n Password: description.Password,\n HeartBtInt: description.HeartBtInt,\n ResetSeqNumFlag: description.ResetSeqNumFlag,\n EncryptMethod: EncryptMethod.None,\n // a counterparty demanding a tag the standard Logon does not carry needs no\n // code at all - name it under \"Logon\" in the session description. Spread last\n // so an application can also override what the engine derived, or null out a\n // field it does not want sent. See issue #93.\n ...description.Logon\n } as ILogon\n return this.mutate(o, MsgType.Logon)\n }\n\n public logout (text: string): ILooseObject {\n const o: ILogout = {\n Text: text\n } as ILogout\n return this.mutate(o, MsgType.Logout)\n }\n\n public header (msgType: string, seqNum: number, time: Date, overrideData?: Partial<IStandardHeader>): ILooseObject {\n const description = this.description\n const bodyLength: number = Math.max(4, description.BodyLengthChars ?? 7)\n const placeHolder = Math.pow(10, bodyLength - 1) + 1\n const o: IStandardHeader = {\n BeginString: description.BeginString,\n BodyLength: placeHolder,\n MsgType: msgType,\n SenderCompID: description.SenderCompId,\n MsgSeqNum: seqNum,\n SendingTime: time,\n TargetCompID: description.TargetCompID,\n TargetSubID: description.TargetSubID,\n SenderSubID: description.SenderSubID,\n ...overrideData\n }\n return this.mutate(o, 'StandardHeader')\n }\n}\n\nexport class SessionMsgFactory extends AsciiSessionMsgFactory {\n constructor (public readonly description: ISessionDescription, public mutator: ObjectMutator | null = null) {\n super(description, mutator)\n }\n}\n"]}
@@ -28,12 +28,7 @@ class FixmlSessionMsgFactory extends a_session_msg_factory_1.ASessionMsgFactory
28
28
  fixmlLogon(userRequestId, isResponse) {
29
29
  const description = this.description;
30
30
  if (!isResponse) {
31
- const o = {
32
- Username: description.Username,
33
- Password: description.Password,
34
- UserRequestID: userRequestId,
35
- UserRequestType: FIXML50SP2_1.UserRequestType.LogOnUser
36
- };
31
+ const o = Object.assign({ Username: description.Username, Password: description.Password, UserRequestID: userRequestId, UserRequestType: FIXML50SP2_1.UserRequestType.LogOnUser }, description.Logon);
37
32
  return this.mutate(o, types_1.MsgType.Logon);
38
33
  }
39
34
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"fixml-session-msg-factory.js","sourceRoot":"","sources":["../../../src/transport/fixml/fixml-session-msg-factory.ts"],"names":[],"mappings":";;;AAEA,uCAAqC;AACrC,4EAAoF;AAEpF,uDAM+B;AAE/B,MAAa,sBAAuB,SAAQ,0CAAkB;IAC5D,YAAsB,WAAgC,EAAE,UAAgC,IAAI;QAC1F,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QADP,gBAAW,GAAX,WAAW,CAAqB;IAEtD,CAAC;IAEM,KAAK,CAAE,gBAAwB,EAAE,EAAE,aAAsB,KAAK;QACnE,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;IACnD,CAAC;IAEM,MAAM,CAAE,OAAe,EAAE,IAAY;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAA;IACzD,CAAC;IAEM,MAAM,CAAE,OAAe,EAAE,SAAiB,CAAC,EAAE,OAAa,IAAI,IAAI,EAAE,EAAE,YAAuC;QAClH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,MAAM,CAAC,GAAoB;YACzB,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,WAAW,EAAE,WAAW,CAAC,WAAW;SAClB,CAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;IACzC,CAAC;IAEO,UAAU,CAAE,aAAqB,EAAE,UAAmB;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,GAAiB;gBACtB,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,aAAa,EAAE,aAAa;gBAC5B,eAAe,EAAE,4BAAe,CAAC,SAAS;aAC3B,CAAA;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAkB;gBACvB,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,aAAa,EAAE,aAAa;gBAC5B,UAAU,EAAE,uBAAU,CAAC,QAAQ;aACf,CAAA;YAClB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAEO,WAAW,CAAE,aAAqB,EAAE,UAAmB;QAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,GAAiB;gBACtB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ;gBACnC,aAAa,EAAE,aAAa;gBAC5B,eAAe,EAAE,4BAAe,CAAC,UAAU;aAC5B,CAAA;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAkB;gBACvB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ;gBACnC,aAAa,EAAE,aAAa;gBAC5B,UAAU,EAAE,uBAAU,CAAC,WAAW;aAClB,CAAA;YAClB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;CACF;AA7DD,wDA6DC","sourcesContent":["import { ISessionDescription } from '../session/session-description'\nimport { ILooseObject } from '../../collections/collection'\nimport { MsgType } from '../../types'\nimport { ASessionMsgFactory, ObjectMutator } from '../session/a-session-msg-factory'\n\nimport {\n IStandardHeader,\n IUserRequest,\n IUserResponse,\n UserRequestType,\n UserStatus\n} from '../../types/FIXML50SP2'\n\nexport class FixmlSessionMsgFactory extends ASessionMsgFactory {\n constructor (readonly description: ISessionDescription, mutator: ObjectMutator | null = null) {\n super(description, mutator)\n }\n\n public logon (userRequestId: string = '', isResponse: boolean = false): ILooseObject {\n return this.fixmlLogon(userRequestId, isResponse)\n }\n\n public logout (msgType: string, text: string): ILooseObject {\n return this.fixmlLogout(msgType, msgType !== 'UserReq')\n }\n\n public header (msgType: string, seqNum: number = 0, time: Date = new Date(), overrideData?: Partial<IStandardHeader>): ILooseObject {\n const description = this.description\n const o: IStandardHeader = {\n SenderCompID: description.SenderCompId,\n TargetCompID: description.TargetCompID,\n SenderSubID: description.SenderSubID,\n TargetSubID: description.TargetSubID\n } as IStandardHeader\n return this.mutate(o, 'StandardHeader')\n }\n\n private fixmlLogon (userRequestId: string, isResponse: boolean): ILooseObject {\n const description = this.description\n if (!isResponse) {\n const o: IUserRequest = {\n Username: description.Username,\n Password: description.Password,\n UserRequestID: userRequestId,\n UserRequestType: UserRequestType.LogOnUser\n } as IUserRequest\n return this.mutate(o, MsgType.Logon)\n } else {\n const o: IUserResponse = {\n Username: description.Username,\n UserRequestID: userRequestId,\n UserStatus: UserStatus.LoggedIn\n } as IUserResponse\n return this.mutate(o, MsgType.Logon)\n }\n }\n\n private fixmlLogout (userRequestId: string, isResponse: boolean): ILooseObject {\n if (!isResponse) {\n const o: IUserRequest = {\n Username: this.description.Username,\n UserRequestID: userRequestId,\n UserRequestType: UserRequestType.LogOffUser\n } as IUserRequest\n return this.mutate(o, MsgType.Logout)\n } else {\n const o: IUserResponse = {\n Username: this.description.Username,\n UserRequestID: userRequestId,\n UserStatus: UserStatus.NotLoggedIn\n } as IUserResponse\n return this.mutate(o, MsgType.Logout)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"fixml-session-msg-factory.js","sourceRoot":"","sources":["../../../src/transport/fixml/fixml-session-msg-factory.ts"],"names":[],"mappings":";;;AAEA,uCAAqC;AACrC,4EAAoF;AAEpF,uDAM+B;AAE/B,MAAa,sBAAuB,SAAQ,0CAAkB;IAC5D,YAAsB,WAAgC,EAAE,UAAgC,IAAI;QAC1F,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QADP,gBAAW,GAAX,WAAW,CAAqB;IAEtD,CAAC;IAEM,KAAK,CAAE,gBAAwB,EAAE,EAAE,aAAsB,KAAK;QACnE,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;IACnD,CAAC;IAEM,MAAM,CAAE,OAAe,EAAE,IAAY;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAA;IACzD,CAAC;IAEM,MAAM,CAAE,OAAe,EAAE,SAAiB,CAAC,EAAE,OAAa,IAAI,IAAI,EAAE,EAAE,YAAuC;QAClH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,MAAM,CAAC,GAAoB;YACzB,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,WAAW,EAAE,WAAW,CAAC,WAAW;SAClB,CAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;IACzC,CAAC;IAEO,UAAU,CAAE,aAAqB,EAAE,UAAmB;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,GAAiB,gBACtB,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAC9B,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,4BAAe,CAAC,SAAS,IAEvC,WAAW,CAAC,KAAK,CACL,CAAA;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAkB;gBACvB,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,aAAa,EAAE,aAAa;gBAC5B,UAAU,EAAE,uBAAU,CAAC,QAAQ;aACf,CAAA;YAClB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAEO,WAAW,CAAE,aAAqB,EAAE,UAAmB;QAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,GAAiB;gBACtB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ;gBACnC,aAAa,EAAE,aAAa;gBAC5B,eAAe,EAAE,4BAAe,CAAC,UAAU;aAC5B,CAAA;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAkB;gBACvB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ;gBACnC,aAAa,EAAE,aAAa;gBAC5B,UAAU,EAAE,uBAAU,CAAC,WAAW;aAClB,CAAA;YAClB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,eAAO,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;CACF;AA/DD,wDA+DC","sourcesContent":["import { ISessionDescription } from '../session/session-description'\nimport { ILooseObject } from '../../collections/collection'\nimport { MsgType } from '../../types'\nimport { ASessionMsgFactory, ObjectMutator } from '../session/a-session-msg-factory'\n\nimport {\n IStandardHeader,\n IUserRequest,\n IUserResponse,\n UserRequestType,\n UserStatus\n} from '../../types/FIXML50SP2'\n\nexport class FixmlSessionMsgFactory extends ASessionMsgFactory {\n constructor (readonly description: ISessionDescription, mutator: ObjectMutator | null = null) {\n super(description, mutator)\n }\n\n public logon (userRequestId: string = '', isResponse: boolean = false): ILooseObject {\n return this.fixmlLogon(userRequestId, isResponse)\n }\n\n public logout (msgType: string, text: string): ILooseObject {\n return this.fixmlLogout(msgType, msgType !== 'UserReq')\n }\n\n public header (msgType: string, seqNum: number = 0, time: Date = new Date(), overrideData?: Partial<IStandardHeader>): ILooseObject {\n const description = this.description\n const o: IStandardHeader = {\n SenderCompID: description.SenderCompId,\n TargetCompID: description.TargetCompID,\n SenderSubID: description.SenderSubID,\n TargetSubID: description.TargetSubID\n } as IStandardHeader\n return this.mutate(o, 'StandardHeader')\n }\n\n private fixmlLogon (userRequestId: string, isResponse: boolean): ILooseObject {\n const description = this.description\n if (!isResponse) {\n const o: IUserRequest = {\n Username: description.Username,\n Password: description.Password,\n UserRequestID: userRequestId,\n UserRequestType: UserRequestType.LogOnUser,\n // same escape hatch as the ascii factory - see ISessionDescription.Logon\n ...description.Logon\n } as IUserRequest\n return this.mutate(o, MsgType.Logon)\n } else {\n const o: IUserResponse = {\n Username: description.Username,\n UserRequestID: userRequestId,\n UserStatus: UserStatus.LoggedIn\n } as IUserResponse\n return this.mutate(o, MsgType.Logon)\n }\n }\n\n private fixmlLogout (userRequestId: string, isResponse: boolean): ILooseObject {\n if (!isResponse) {\n const o: IUserRequest = {\n Username: this.description.Username,\n UserRequestID: userRequestId,\n UserRequestType: UserRequestType.LogOffUser\n } as IUserRequest\n return this.mutate(o, MsgType.Logout)\n } else {\n const o: IUserResponse = {\n Username: this.description.Username,\n UserRequestID: userRequestId,\n UserStatus: UserStatus.NotLoggedIn\n } as IUserResponse\n return this.mutate(o, MsgType.Logout)\n }\n }\n}\n"]}
@@ -4,7 +4,10 @@ export * from './fix-acceptor';
4
4
  export * from './fix-initiator';
5
5
  export * from './msg-transmitter';
6
6
  export * from './msg-payload';
7
+ export * from './send-callback';
7
8
  export * from './tick-action';
8
9
  export * from './msg-application';
9
10
  export * from './ascii/ascii-session';
11
+ export * from './ascii/ascii-session-msg-factory';
12
+ export * from './fixml/fixml-session-msg-factory';
10
13
  export * from './session';
@@ -20,8 +20,11 @@ __exportStar(require("./fix-acceptor"), exports);
20
20
  __exportStar(require("./fix-initiator"), exports);
21
21
  __exportStar(require("./msg-transmitter"), exports);
22
22
  __exportStar(require("./msg-payload"), exports);
23
+ __exportStar(require("./send-callback"), exports);
23
24
  __exportStar(require("./tick-action"), exports);
24
25
  __exportStar(require("./msg-application"), exports);
25
26
  __exportStar(require("./ascii/ascii-session"), exports);
27
+ __exportStar(require("./ascii/ascii-session-msg-factory"), exports);
28
+ __exportStar(require("./fixml/fixml-session-msg-factory"), exports);
26
29
  __exportStar(require("./session"), exports);
27
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AACxB,+CAA4B;AAC5B,iDAA8B;AAC9B,kDAA+B;AAC/B,oDAAiC;AACjC,gDAA6B;AAC7B,gDAA6B;AAC7B,oDAAiC;AACjC,wDAAqC;AACrC,4CAAyB","sourcesContent":["export * from './duplex'\nexport * from './fix-entity'\nexport * from './fix-acceptor'\nexport * from './fix-initiator'\nexport * from './msg-transmitter'\nexport * from './msg-payload'\nexport * from './tick-action'\nexport * from './msg-application'\nexport * from './ascii/ascii-session'\nexport * from './session'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AACxB,+CAA4B;AAC5B,iDAA8B;AAC9B,kDAA+B;AAC/B,oDAAiC;AACjC,gDAA6B;AAC7B,kDAA+B;AAC/B,gDAA6B;AAC7B,oDAAiC;AACjC,wDAAqC;AAGrC,oEAAiD;AACjD,oEAAiD;AACjD,4CAAyB","sourcesContent":["export * from './duplex'\nexport * from './fix-entity'\nexport * from './fix-acceptor'\nexport * from './fix-initiator'\nexport * from './msg-transmitter'\nexport * from './msg-payload'\nexport * from './send-callback'\nexport * from './tick-action'\nexport * from './msg-application'\nexport * from './ascii/ascii-session'\n// the factory an application extends to customise its Logon or header - it belongs\n// at the root alongside ASessionMsgFactory, not behind a dist/ path\nexport * from './ascii/ascii-session-msg-factory'\nexport * from './fixml/fixml-session-msg-factory'\nexport * from './session'\n"]}
@@ -1,7 +1,9 @@
1
1
  import { ILooseObject } from '../collections/collection';
2
+ import { SendCallback } from './send-callback';
2
3
  export declare class MsgPayload {
3
4
  readonly msgType: string;
4
5
  readonly obj: ILooseObject;
6
+ readonly callback: SendCallback | null;
5
7
  encoded: Buffer;
6
- constructor(msgType: string, obj: ILooseObject);
8
+ constructor(msgType: string, obj: ILooseObject, callback?: SendCallback | null);
7
9
  }
@@ -2,9 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MsgPayload = void 0;
4
4
  class MsgPayload {
5
- constructor(msgType, obj) {
5
+ constructor(msgType, obj, callback = null) {
6
6
  this.msgType = msgType;
7
7
  this.obj = obj;
8
+ this.callback = callback;
8
9
  }
9
10
  }
10
11
  exports.MsgPayload = MsgPayload;
@@ -1 +1 @@
1
- {"version":3,"file":"msg-payload.js","sourceRoot":"","sources":["../../src/transport/msg-payload.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAErB,YAA6B,OAAe,EAAkB,GAAiB;QAAlD,YAAO,GAAP,OAAO,CAAQ;QAAkB,QAAG,GAAH,GAAG,CAAc;IAC/E,CAAC;CACF;AAJD,gCAIC","sourcesContent":["import { ILooseObject } from '../collections/collection'\n\nexport class MsgPayload {\n public encoded: Buffer\n constructor (public readonly msgType: string, public readonly obj: ILooseObject) {\n }\n}\n"]}
1
+ {"version":3,"file":"msg-payload.js","sourceRoot":"","sources":["../../src/transport/msg-payload.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IAErB,YAA6B,OAAe,EAC1B,GAAiB,EAEjB,WAAgC,IAAI;QAHzB,YAAO,GAAP,OAAO,CAAQ;QAC1B,QAAG,GAAH,GAAG,CAAc;QAEjB,aAAQ,GAAR,QAAQ,CAA4B;IACtD,CAAC;CACF;AAPD,gCAOC","sourcesContent":["import { ILooseObject } from '../collections/collection'\nimport { SendCallback } from './send-callback'\n\nexport class MsgPayload {\n public encoded: Buffer\n constructor (public readonly msgType: string,\n public readonly obj: ILooseObject,\n /** invoked once this payload has been encoded, or has failed to encode */\n public readonly callback: SendCallback | null = null) {\n }\n}\n"]}
@@ -1,8 +1,10 @@
1
1
  import { MsgEncoder, ElasticBuffer } from '../buffer';
2
2
  import { FixDefinitions } from '../dictionary/definition';
3
3
  import { Transform } from 'stream';
4
+ import { MsgPayload } from './msg-payload';
4
5
  import { ILooseObject } from '../collections/collection';
5
6
  import { ISessionDescription } from './session/session-description';
7
+ import { SendCallback } from './send-callback';
6
8
  import * as events from 'events';
7
9
  export declare abstract class MsgTransmitter extends events.EventEmitter {
8
10
  readonly buffer: ElasticBuffer;
@@ -11,7 +13,8 @@ export declare abstract class MsgTransmitter extends events.EventEmitter {
11
13
  readonly encodeStream: Transform;
12
14
  encoder: MsgEncoder;
13
15
  protected constructor(buffer: ElasticBuffer, definitions: FixDefinitions, session: ISessionDescription);
14
- send(msgType: string, obj: ILooseObject): void;
16
+ send(msgType: string, obj: ILooseObject, callback?: SendCallback | null): void;
17
+ protected settle(payload: MsgPayload, error: Error | null, header: ILooseObject | null): void;
15
18
  abstract encodeMessage(msgType: string, obj: ILooseObject): (ILooseObject | null);
16
19
  private encoderStream;
17
20
  }