jspurefix 1.3.0 → 1.4.1

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 (182) hide show
  1. package/README.md +5 -2
  2. package/data/session/genkey.ps1 +179 -0
  3. package/dist/buffer/ascii/ascii-encoder.d.ts +1 -1
  4. package/dist/buffer/ascii/ascii-encoder.js +42 -30
  5. package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
  6. package/dist/buffer/ascii/ascii-view.d.ts +2 -2
  7. package/dist/buffer/ascii/ascii-view.js.map +1 -1
  8. package/dist/buffer/ascii/time-formatter.js.map +1 -1
  9. package/dist/buffer/elastic-buffer.js +1 -1
  10. package/dist/buffer/elastic-buffer.js.map +1 -1
  11. package/dist/buffer/encode-proxy.js.map +1 -1
  12. package/dist/buffer/fixml/fixml-encoder.js +1 -1
  13. package/dist/buffer/fixml/fixml-encoder.js.map +1 -1
  14. package/dist/buffer/fixml/fixml-view.d.ts +2 -0
  15. package/dist/buffer/fixml/fixml-view.js +3 -0
  16. package/dist/buffer/fixml/fixml-view.js.map +1 -1
  17. package/dist/buffer/msg-view.d.ts +2 -0
  18. package/dist/buffer/msg-view.js +2 -2
  19. package/dist/buffer/msg-view.js.map +1 -1
  20. package/dist/dict-parser.js +9 -9
  21. package/dist/dict-parser.js.map +1 -1
  22. package/dist/dictionary/compiler/msg-compiler.js +2 -2
  23. package/dist/dictionary/compiler/msg-compiler.js.map +1 -1
  24. package/dist/dictionary/parser/fix-repository/repository-xml-parser.js +1 -1
  25. package/dist/dictionary/parser/fix-repository/repository-xml-parser.js.map +1 -1
  26. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js +1 -1
  27. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js.map +1 -1
  28. package/dist/jsfix-cmd.js +3 -3
  29. package/dist/jsfix-cmd.js.map +1 -1
  30. package/dist/sample/http/oms/app.js +2 -2
  31. package/dist/sample/http/oms/app.js.map +1 -1
  32. package/dist/sample/launcher.js +2 -2
  33. package/dist/sample/launcher.js.map +1 -1
  34. package/dist/sample/tcp/qf-md/app.js +2 -2
  35. package/dist/sample/tcp/qf-md/app.js.map +1 -1
  36. package/dist/sample/tcp/recovering-skeleton/respawn-2.d.ts +2 -0
  37. package/dist/sample/tcp/recovering-skeleton/respawn-2.js +3 -0
  38. package/dist/sample/tcp/recovering-skeleton/respawn-2.js.map +1 -0
  39. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js +1 -1
  40. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js.map +1 -1
  41. package/dist/sample/tcp/skeleton/app.js +2 -2
  42. package/dist/sample/tcp/skeleton/app.js.map +1 -1
  43. package/dist/sample/tcp/skeleton/skeleton-session.d.ts +5 -1
  44. package/dist/sample/tcp/skeleton/skeleton-session.js +21 -2
  45. package/dist/sample/tcp/skeleton/skeleton-session.js.map +1 -1
  46. package/dist/sample/tcp/tls-trade-capture/app.js +2 -2
  47. package/dist/sample/tcp/tls-trade-capture/app.js.map +1 -1
  48. package/dist/sample/tcp/trade-capture/app.js +2 -2
  49. package/dist/sample/tcp/trade-capture/app.js.map +1 -1
  50. package/dist/sample/tcp/trade-capture/trade-capture-client.d.ts +1 -0
  51. package/dist/sample/tcp/trade-capture/trade-capture-client.js +7 -3
  52. package/dist/sample/tcp/trade-capture/trade-capture-client.js.map +1 -1
  53. package/dist/store/fix-msg-ascii-store-recovery.d.ts +12 -0
  54. package/dist/store/fix-msg-ascii-store-recovery.js +60 -0
  55. package/dist/store/fix-msg-ascii-store-recovery.js.map +1 -0
  56. package/dist/store/fix-msg-ascii-store-replay.d.ts +13 -0
  57. package/dist/store/fix-msg-ascii-store-replay.js +60 -0
  58. package/dist/store/fix-msg-ascii-store-replay.js.map +1 -0
  59. package/dist/store/fix-msg-ascii-store-resend.js +3 -2
  60. package/dist/store/fix-msg-ascii-store-resend.js.map +1 -1
  61. package/dist/store/fix-msg-store-record.js.map +1 -1
  62. package/dist/store/fix-replay-record.d.ts +12 -0
  63. package/dist/store/fix-replay-record.js +12 -0
  64. package/dist/store/fix-replay-record.js.map +1 -0
  65. package/dist/store/fix-resend-record.d.ts +12 -0
  66. package/dist/store/fix-resend-record.js +12 -0
  67. package/dist/store/fix-resend-record.js.map +1 -0
  68. package/dist/store/replay-record.d.ts +6 -0
  69. package/dist/store/replay-record.js +3 -0
  70. package/dist/store/replay-record.js.map +1 -0
  71. package/dist/store/store-replay-record.d.ts +12 -0
  72. package/dist/store/store-replay-record.js +12 -0
  73. package/dist/store/store-replay-record.js.map +1 -0
  74. package/dist/tcp/tls-options.d.ts +5 -0
  75. package/dist/tcp/tls-options.js +45 -0
  76. package/dist/tcp/tls-options.js.map +1 -0
  77. package/dist/test/ascii-encode.test.d.ts +1 -0
  78. package/dist/test/ascii-encode.test.js +416 -0
  79. package/dist/test/ascii-encode.test.js.map +1 -0
  80. package/dist/test/ascii-encoder.test.js +2 -2
  81. package/dist/test/ascii-encoder.test.js.map +1 -1
  82. package/dist/test/ascii-parser.test.js +9 -7
  83. package/dist/test/ascii-parser.test.js.map +1 -1
  84. package/dist/test/ascii-segment.test.js +7 -6
  85. package/dist/test/ascii-segment.test.js.map +1 -1
  86. package/dist/test/ascii-store-recovery.test.d.ts +1 -0
  87. package/dist/test/ascii-store-recovery.test.js +50 -0
  88. package/dist/test/ascii-store-recovery.test.js.map +1 -0
  89. package/dist/test/ascii-store-replay.test.js +2 -2
  90. package/dist/test/ascii-store-replay.test.js.map +1 -1
  91. package/dist/test/ascii-tag-pos.test.js +2 -2
  92. package/dist/test/ascii-tag-pos.test.js.map +1 -1
  93. package/dist/test/encode-proxy.test.js +1 -1
  94. package/dist/test/encode-proxy.test.js.map +1 -1
  95. package/dist/test/execution-report.test.js +2 -2
  96. package/dist/test/execution-report.test.js.map +1 -1
  97. package/dist/test/fix-log-replay.test.js +2 -2
  98. package/dist/test/fix-log-replay.test.js.map +1 -1
  99. package/dist/test/fix-repo-dict.test.js +1 -1
  100. package/dist/test/fix-repo-dict.test.js.map +1 -1
  101. package/dist/test/logon.test.js +2 -2
  102. package/dist/test/logon.test.js.map +1 -1
  103. package/dist/test/memory-store.test.js +2 -2
  104. package/dist/test/memory-store.test.js.map +1 -1
  105. package/dist/test/qf-full-msg.test.js +14 -13
  106. package/dist/test/qf-full-msg.test.js.map +1 -1
  107. package/dist/test/repo-full-ascii-msg.test.js +10 -9
  108. package/dist/test/repo-full-ascii-msg.test.js.map +1 -1
  109. package/dist/test/repo-full-fixml-msg.test.js +15 -15
  110. package/dist/test/repo-full-fixml-msg.test.js.map +1 -1
  111. package/dist/test/session.test.js +262 -143
  112. package/dist/test/session.test.js.map +1 -1
  113. package/dist/test/to-views.js +1 -1
  114. package/dist/test/to-views.js.map +1 -1
  115. package/dist/test/view-decode.test.js +2 -2
  116. package/dist/test/view-decode.test.js.map +1 -1
  117. package/dist/transport/ascii/ascii-msg-transmitter.js +6 -3
  118. package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
  119. package/dist/transport/ascii/ascii-session.d.ts +8 -0
  120. package/dist/transport/ascii/ascii-session.js +67 -19
  121. package/dist/transport/ascii/ascii-session.js.map +1 -1
  122. package/dist/transport/duplex/http-duplex.js +2 -2
  123. package/dist/transport/duplex/http-duplex.js.map +1 -1
  124. package/dist/transport/fix-session-state.js +4 -1
  125. package/dist/transport/fix-session-state.js.map +1 -1
  126. package/dist/transport/fix-session.d.ts +6 -0
  127. package/dist/transport/fix-session.js +91 -38
  128. package/dist/transport/fix-session.js.map +1 -1
  129. package/dist/transport/http/http-acceptor.js +8 -7
  130. package/dist/transport/http/http-acceptor.js.map +1 -1
  131. package/dist/transport/make-config.js +1 -1
  132. package/dist/transport/make-config.js.map +1 -1
  133. package/dist/transport/session-msg-factory.d.ts +24 -2
  134. package/dist/transport/session-msg-factory.js +143 -3
  135. package/dist/transport/session-msg-factory.js.map +1 -1
  136. package/dist/transport/tcp/recovering-initiator.d.ts +17 -0
  137. package/dist/transport/tcp/recovering-initiator.js +30 -0
  138. package/dist/transport/tcp/recovering-initiator.js.map +1 -0
  139. package/dist/transport/tcp/recovering_initiator.d.ts +12 -0
  140. package/dist/transport/tcp/recovering_initiator.js +25 -0
  141. package/dist/transport/tcp/recovering_initiator.js.map +1 -0
  142. package/dist/transport/tcp/resilient-initiator.d.ts +12 -0
  143. package/dist/transport/tcp/resilient-initiator.js +41 -0
  144. package/dist/transport/tcp/resilient-initiator.js.map +1 -0
  145. package/dist/transport/tcp/tcp-acceptor.d.ts +7 -0
  146. package/dist/transport/tcp/tcp-acceptor.js +57 -38
  147. package/dist/transport/tcp/tcp-acceptor.js.map +1 -1
  148. package/dist/transport/tcp/tcp-initiator.d.ts +2 -0
  149. package/dist/transport/tcp/tcp-initiator.js +59 -32
  150. package/dist/transport/tcp/tcp-initiator.js.map +1 -1
  151. package/dist/types/FIX4.4/quickfix/set/header.d.ts +31 -0
  152. package/dist/types/FIX4.4/quickfix/set/header.js +3 -0
  153. package/dist/types/FIX4.4/quickfix/set/header.js.map +1 -0
  154. package/dist/types/FIX4.4/quickfix/set/trailer.d.ts +6 -0
  155. package/dist/types/FIX4.4/quickfix/set/trailer.js +3 -0
  156. package/dist/types/FIX4.4/quickfix/set/trailer.js.map +1 -0
  157. package/dist/util/buffer-helper.js +1 -1
  158. package/dist/util/buffer-helper.js.map +1 -1
  159. package/dist/util/json-helper.js +2 -2
  160. package/dist/util/json-helper.js.map +1 -1
  161. package/dist/util/message-generator.js +1 -1
  162. package/dist/util/message-generator.js.map +1 -1
  163. package/package.json +16 -15
  164. package/script/genkey.ps1 +179 -179
  165. package/src/buffer/ascii/ascii-encoder.ts +71 -33
  166. package/src/buffer/ascii/ascii-view.ts +2 -2
  167. package/src/buffer/ascii/time-formatter.ts +2 -2
  168. package/src/buffer/encode-proxy.ts +2 -2
  169. package/src/buffer/fixml/fixml-view.ts +5 -0
  170. package/src/buffer/msg-view.ts +3 -0
  171. package/src/sample/tcp/skeleton/skeleton-session.ts +24 -2
  172. package/src/sample/tcp/trade-capture/trade-capture-client.ts +8 -3
  173. package/src/store/fix-msg-ascii-store-resend.ts +3 -2
  174. package/src/store/fix-msg-store-record.ts +1 -0
  175. package/src/transport/ascii/ascii-msg-transmitter.ts +6 -3
  176. package/src/transport/ascii/ascii-session.ts +75 -19
  177. package/src/transport/duplex/http-duplex.ts +2 -2
  178. package/src/transport/fix-session-state.ts +4 -1
  179. package/src/transport/fix-session.ts +98 -37
  180. package/src/transport/http/http-acceptor.ts +7 -6
  181. package/src/transport/tcp/tcp-acceptor.ts +59 -35
  182. package/src/transport/tcp/tcp-initiator.ts +63 -38
@@ -1 +1 @@
1
- {"version":3,"file":"ascii-session.js","sourceRoot":"","sources":["../../../src/transport/ascii/ascii-session.ts"],"names":[],"mappings":"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","sourcesContent":["import { MsgView, SegmentType } from '../../buffer'\r\nimport { MsgTag, MsgType, SessionRejectReason } from '../../types'\r\nimport { IJsFixConfig } from '../../config'\r\nimport { IMsgApplication } from '../session-description'\r\nimport { SessionState, TickAction } from '../fix-session-state'\r\nimport { FixSession } from '../fix-session'\r\n\r\nexport abstract class AsciiSession extends FixSession {\r\n\r\n public heartbeat: boolean = true\r\n\r\n protected constructor (public readonly config: IJsFixConfig) {\r\n super(config)\r\n this.requestLogoutType = this.respondLogoutType = MsgType.Logout\r\n this.requestLogonType = MsgType.Logon\r\n }\r\n\r\n private checkSeqNo (msgType: string, view: MsgView): boolean {\r\n\r\n switch (msgType) {\r\n case MsgType.SequenceReset: {\r\n return true\r\n }\r\n\r\n default: {\r\n const state = this.sessionState\r\n const lastSeq: number = state.lastPeerMsgSeqNum\r\n const seqNo: number = view.getTyped(MsgTag.MsgSeqNum)\r\n let ret: boolean = false\r\n const seqDelta: number = seqNo - lastSeq\r\n if (seqDelta <= 0) {\r\n // serious problem ... drop immediately\r\n this.sessionLogger.warning(`terminate as seqDelta (${seqDelta}) < 0 lastSeq = ${lastSeq} seqNo = ${seqNo}`)\r\n this.stop()\r\n } else if (seqDelta > 1) {\r\n // resend request required as have missed messages.\r\n\r\n // We process a Logon beforehand to confirm the connection even we out of sync\r\n if (msgType === MsgType.Logon) {\r\n this.peerLogon(view)\r\n }\r\n // If the out of sync message is a resend request itself, then we handle it first in order\r\n // to avoid triggering an endless loop of both sides sending resend requests in response to resend requests.\r\n if (msgType === MsgType.ResendRequest) {\r\n this.onResendRequest(view)\r\n }\r\n this.sendResendRequest(lastSeq, seqNo)\r\n } else {\r\n ret = true\r\n state.lastPeerMsgSeqNum = seqNo\r\n }\r\n return ret\r\n }\r\n }\r\n }\r\n\r\n private sendReject (msgType: string, seqNo: number, msg: string, reason: number): void {\r\n const factory = this.config.factory\r\n const reject = factory.reject(msgType, seqNo, msg, reason)\r\n this.sessionLogger.warning(`rejecting with ${JSON.stringify(reject)}`)\r\n this.send(MsgType.Reject, reject)\r\n }\r\n\r\n protected sendResendRequest (lastSeq: number, receivedSeq: number) {\r\n const resend = this.config.factory.resendRequest(lastSeq + 1, 0)\r\n this.sessionLogger.warning(`received seq ${receivedSeq}, but last known seq is ${lastSeq}. Sending resend request for all messages > ${lastSeq}`)\r\n this.send(MsgType.ResendRequest, resend)\r\n }\r\n\r\n private checkIntegrity (msgType: string, view: MsgView): boolean {\r\n const state = this.sessionState\r\n const seqNum = view.getTyped(MsgTag.MsgSeqNum)\r\n\r\n const received: number = parseInt(view.getString(MsgTag.CheckSum), 10)\r\n const computed = view.checksum()\r\n if (received !== computed) {\r\n const msg: string = `msgType ${msgType} checksum failed. received = ${received} computed = ${computed}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.ValueIsIncorrect)\r\n return false\r\n }\r\n\r\n if (view.segment.type === SegmentType.Unknown) {\r\n const msg: string = `msgType ${msgType} unknown`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.InvalidMsgType)\r\n return false\r\n }\r\n\r\n const invalid = view.invalid()\r\n if (invalid.length > 0) {\r\n const msg: string = `msgType ${msgType} invalid tag${invalid.length > 1 ? 's' : ''} ${invalid.join(', ')}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.InvalidTagNumber)\r\n return false\r\n }\r\n\r\n const undefinedMsg: string = view.undefinedForMsg()\r\n if (undefinedMsg) {\r\n const msg: string = `msgType ${msgType} ${undefinedMsg}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.TagNotDefinedForThisMessageType)\r\n return false\r\n }\r\n\r\n const missingRequired = view.missing()\r\n if (missingRequired.length > 0) {\r\n const msg: string = `msgType ${msgType} missing required tag${missingRequired.length > 1 ? 's' : ''} ${missingRequired.join(', ')}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.RequiredTagMissing)\r\n return false\r\n }\r\n\r\n switch (state.state) {\r\n case SessionState.InitiationLogonReceived:\r\n case SessionState.InitiationLogonResponse: {\r\n const targetCompId = view.getString(MsgTag.TargetCompID)\r\n if (targetCompId !== state.compId) {\r\n const msg: string = `msgType ${msgType} unexpected TargetCompID ${targetCompId}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.CompIDProblem)\r\n return false\r\n }\r\n\r\n const peerCompId = view.getString(MsgTag.SenderCompID)\r\n if (peerCompId !== state.peerCompId) {\r\n const msg: string = `msgType ${msgType} unexpected SenderCompID ${peerCompId}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.CompIDProblem)\r\n return false\r\n }\r\n }\r\n break\r\n\r\n default: {\r\n break\r\n }\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * Override to resend stored messages following a sequence reset.\r\n * @protected\r\n */\r\n protected onResendRequest (view: MsgView) {\r\n const endSeqNo: number = view.getTyped(MsgTag.EndSeqNo)\r\n const resend = this.config.factory.sequenceReset(endSeqNo, true)\r\n this.send(MsgType.SequenceReset, resend)\r\n }\r\n\r\n protected onSessionMsg (msgType: string, view: MsgView): void {\r\n\r\n const factory = this.config.factory\r\n const logger = this.sessionLogger\r\n\r\n switch (msgType) {\r\n case MsgType.Logon: {\r\n this.peerLogon(view)\r\n break\r\n }\r\n\r\n case MsgType.Logout: {\r\n this.peerLogout(view)\r\n break\r\n }\r\n\r\n case MsgType.TestRequest: {\r\n const req: string = view.getString(MsgTag.TestReqID)\r\n this.send(MsgType.Heartbeat, factory.heartbeat(req))\r\n break\r\n }\r\n\r\n case MsgType.Heartbeat: {\r\n this.sessionState.lastTestRequestAt = null\r\n break\r\n }\r\n\r\n case MsgType.ResendRequest: {\r\n logger.info(`peer sends '${msgType}' resend request.`)\r\n this.onResendRequest(view)\r\n break\r\n }\r\n\r\n case MsgType.SequenceReset: {\r\n const newSeqNo: number = view.getTyped(MsgTag.NewSeqNo)\r\n logger.info(`peer sends '${msgType}' sequence reset. newSeqNo = ${newSeqNo}`)\r\n // expect newSeqNo to be the next message's sequence number.\r\n this.sessionState.lastPeerMsgSeqNum = newSeqNo - 1\r\n break\r\n }\r\n\r\n case MsgType.Reject: {\r\n logger.info(`peer rejects type '${msgType}' with text '${view.getTyped(MsgTag.Text)}'`)\r\n break\r\n }\r\n }\r\n }\r\n\r\n protected onMsg (msgType: string, view: MsgView): void {\r\n\r\n if (!this.checkSeqNo(msgType, view)) {\r\n this.sessionLogger.info(`message '${msgType}' failed checkSeqNo.`)\r\n return\r\n }\r\n\r\n if (this.checkMsgIntegrity && !this.checkIntegrity(msgType, view)) {\r\n this.sessionLogger.info(`message '${msgType}' failed checkIntegrity.`)\r\n switch (msgType) {\r\n case MsgType.Logon: {\r\n this.setState(SessionState.PeerLogonRejected)\r\n this.timer = setInterval(() => {\r\n this.tick()\r\n }, 200)\r\n break\r\n }\r\n }\r\n return\r\n }\r\n\r\n switch (msgType) {\r\n case MsgType.Logon:\r\n case MsgType.Logout:\r\n case MsgType.TestRequest:\r\n case MsgType.Reject:\r\n case MsgType.SequenceReset:\r\n case MsgType.Heartbeat:\r\n case MsgType.ResendRequest: {\r\n this.onSessionMsg(msgType, view)\r\n break\r\n }\r\n\r\n default: {\r\n this.checkForwardMsg(msgType, view)\r\n break\r\n }\r\n }\r\n }\r\n\r\n private peerLogon (view: MsgView) {\r\n const logger = this.sessionLogger\r\n const heartBtInt = view.getTyped(MsgTag.HeartBtInt)\r\n const peerCompId = view.getTyped(MsgTag.SenderCompID)\r\n const userName = view.getString(MsgTag.Username)\r\n logger.info(`peerLogon Username = ${userName}, heartBtInt = ${heartBtInt}, peerCompId = ${peerCompId}, userName = ${userName}`)\r\n const state = this.sessionState\r\n state.peerHeartBeatSecs = view.getTyped(MsgTag.HeartBtInt)\r\n state.peerCompId = view.getTyped(MsgTag.SenderCompID)\r\n if (this.acceptor) {\r\n this.setState(SessionState.InitiationLogonResponse)\r\n this.send(MsgType.Logon, this.config.factory.logon())\r\n } else { // as an initiator the acceptor has responded\r\n this.setState(SessionState.InitiationLogonReceived)\r\n }\r\n if (this.heartbeat) {\r\n logger.debug(`start heartbeat timer.`)\r\n this.timer = setInterval(() => {\r\n this.tick()\r\n }, 200)\r\n }\r\n logger.info(`system ready, inform app`)\r\n this.onReady(view)\r\n }\r\n\r\n private tick (): void {\r\n const sessionState = this.sessionState\r\n const action: TickAction = sessionState.calcAction(new Date())\r\n const application: IMsgApplication = this.transport.config.description.application\r\n const factory = this.config.factory\r\n const logger = this.sessionLogger\r\n\r\n switch (action) {\r\n case TickAction.Nothing: {\r\n // all is well\r\n break\r\n }\r\n\r\n case TickAction.TestRequest: {\r\n logger.debug(`send test req. state = ${sessionState.toString()}`)\r\n this.send(MsgType.TestRequest, factory.testRequest())\r\n break\r\n }\r\n\r\n case TickAction.Heartbeat: {\r\n logger.debug(`send heartbeat. state = ${sessionState.toString()}`)\r\n this.send(MsgType.Heartbeat, factory.heartbeat(sessionState.now.toUTCString()))\r\n break\r\n }\r\n\r\n case TickAction.TerminateOnError: {\r\n logger.info(sessionState.toString())\r\n this.terminate(new Error(`${application.name}: peer not responding`))\r\n break\r\n }\r\n\r\n case TickAction.Stop: {\r\n logger.info(sessionState.toString())\r\n logger.info('stopping')\r\n this.stop()\r\n break\r\n }\r\n\r\n default:\r\n throw new Error(`unexpected action`)\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ascii-session.js","sourceRoot":"","sources":["../../../src/transport/ascii/ascii-session.ts"],"names":[],"mappings":"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","sourcesContent":["import { MsgView, SegmentType } from '../../buffer'\r\nimport { MsgTag, MsgType, SessionRejectReason } from '../../types'\r\nimport { IJsFixConfig } from '../../config'\r\nimport { IMsgApplication } from '../session-description'\r\nimport { SessionState, TickAction } from '../fix-session-state'\r\nimport { FixSession } from '../fix-session'\r\nimport { FixMsgAsciiStoreResend, FixMsgMemoryStore, IFixMsgStore, IFixMsgStoreRecord } from '../../store'\r\n\r\nexport abstract class AsciiSession extends FixSession {\r\n\r\n public heartbeat: boolean = true\r\n protected store: IFixMsgStore = null\r\n protected resender: FixMsgAsciiStoreResend\r\n\r\n protected constructor (public readonly config: IJsFixConfig) {\r\n super(config)\r\n this.requestLogoutType = this.respondLogoutType = MsgType.Logout\r\n this.requestLogonType = MsgType.Logon\r\n this.store = new FixMsgMemoryStore(this.config.description.SenderCompId, this.config)\r\n this.resender = new FixMsgAsciiStoreResend(this.store, this.config)\r\n }\r\n\r\n private checkSeqNo (msgType: string, view: MsgView): boolean {\r\n\r\n switch (msgType) {\r\n case MsgType.SequenceReset: {\r\n return true\r\n }\r\n\r\n default: {\r\n const state = this.sessionState\r\n const lastSeq: number = state.lastPeerMsgSeqNum\r\n const seqNo: number = view.getTyped(MsgTag.MsgSeqNum)\r\n let ret: boolean = false\r\n const seqDelta: number = seqNo - lastSeq\r\n if (seqDelta <= 0) {\r\n // serious problem ... drop immediately\r\n this.sessionLogger.warning(`terminate as seqDelta (${seqDelta}) < 0 lastSeq = ${lastSeq} seqNo = ${seqNo}`)\r\n this.stop()\r\n } else if (seqDelta > 1) {\r\n // resend request required as have missed messages.\r\n\r\n // We process a Logon beforehand to confirm the connection even we out of sync\r\n if (msgType === MsgType.Logon) {\r\n this.peerLogon(view)\r\n }\r\n // If the out of sync message is a resend request itself, then we handle it first in order\r\n // to avoid triggering an endless loop of both sides sending resend requests in response to resend requests.\r\n if (msgType === MsgType.ResendRequest) {\r\n this.onResendRequest(view)\r\n }\r\n this.sendResendRequest(lastSeq, seqNo)\r\n } else {\r\n ret = true\r\n state.lastPeerMsgSeqNum = seqNo\r\n }\r\n return ret\r\n }\r\n }\r\n }\r\n\r\n protected checkForwardMsg (msgType: string, view: MsgView): void {\r\n const okToForward = this.validStateApplicationMsg()\r\n if (okToForward) {\r\n this.sessionLogger.info(`ascii forwarding msgType = '${msgType}' to application`)\r\n this.setState(SessionState.ActiveNormalSession)\r\n this.onApplicationMsg(msgType, view)\r\n } else {\r\n this.terminate(new Error(`msgType ${msgType} received in state ${this.stateString()}`))\r\n }\r\n }\r\n\r\n private sendReject (msgType: string, seqNo: number, msg: string, reason: number): void {\r\n const factory = this.config.factory\r\n const reject = factory.reject(msgType, seqNo, msg, reason)\r\n this.sessionLogger.warning(`rejecting with ${JSON.stringify(reject)}`)\r\n this.send(MsgType.Reject, reject)\r\n }\r\n\r\n protected sendResendRequest (lastSeq: number, receivedSeq: number) {\r\n const resend = this.config.factory.resendRequest(lastSeq + 1, 0)\r\n this.sessionLogger.warning(`received seq ${receivedSeq}, but last known seq is ${lastSeq}. Sending resend request for all messages > ${lastSeq}`)\r\n this.send(MsgType.ResendRequest, resend)\r\n }\r\n\r\n private checkIntegrity (msgType: string, view: MsgView): boolean {\r\n const state = this.sessionState\r\n const seqNum = view.getTyped(MsgTag.MsgSeqNum)\r\n\r\n const received: number = parseInt(view.getString(MsgTag.CheckSum), 10)\r\n const computed = view.checksum()\r\n if (received !== computed) {\r\n const msg: string = `msgType ${msgType} checksum failed. received = ${received} computed = ${computed}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.ValueIsIncorrect)\r\n return false\r\n }\r\n\r\n if (view.segment.type === SegmentType.Unknown) {\r\n const msg: string = `msgType ${msgType} unknown`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.InvalidMsgType)\r\n return false\r\n }\r\n\r\n const invalid = view.invalid()\r\n if (invalid.length > 0) {\r\n const msg: string = `msgType ${msgType} invalid tag${invalid.length > 1 ? 's' : ''} ${invalid.join(', ')}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.InvalidTagNumber)\r\n return false\r\n }\r\n\r\n const undefinedMsg: string = view.undefinedForMsg()\r\n if (undefinedMsg) {\r\n const msg: string = `msgType ${msgType} ${undefinedMsg}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.TagNotDefinedForThisMessageType)\r\n return false\r\n }\r\n\r\n const missingRequired = view.missing()\r\n if (missingRequired.length > 0) {\r\n const msg: string = `msgType ${msgType} missing required tag${missingRequired.length > 1 ? 's' : ''} ${missingRequired.join(', ')}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.RequiredTagMissing)\r\n return false\r\n }\r\n\r\n switch (state.state) {\r\n case SessionState.InitiationLogonReceived:\r\n case SessionState.InitiationLogonResponse: {\r\n const targetCompId = view.getString(MsgTag.TargetCompID)\r\n if (targetCompId !== state.compId) {\r\n const msg: string = `msgType ${msgType} unexpected TargetCompID ${targetCompId}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.CompIDProblem)\r\n return false\r\n }\r\n\r\n const peerCompId = view.getString(MsgTag.SenderCompID)\r\n if (peerCompId !== state.peerCompId) {\r\n const msg: string = `msgType ${msgType} unexpected SenderCompID ${peerCompId}`\r\n this.sendReject(msgType, seqNum, msg, SessionRejectReason.CompIDProblem)\r\n return false\r\n }\r\n }\r\n break\r\n\r\n default: {\r\n break\r\n }\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * Override to resend stored messages following a sequence reset.\r\n * @protected\r\n */\r\n protected onResendRequest (view: MsgView) {\r\n // if no records are in store then send a gap fill for entire sequence\r\n this.setState(SessionState.HandleResendRequest)\r\n const [beginSeqNo, endSeqNo] = view.getTypedTags([MsgTag.BeginSeqNo, MsgTag.EndSeqNo])\r\n this.sessionLogger.info(`onResendRequest getResendRequest beginSeqNo = ${beginSeqNo}, endSeqNo = ${endSeqNo}`)\r\n this.resender.getResendRequest(beginSeqNo, endSeqNo).then((records: IFixMsgStoreRecord[]) => {\r\n const validRecords = records.filter(rec => rec.obj !== null)\r\n this.sessionLogger.info(`sending ${validRecords.length}`)\r\n validRecords.forEach(rec => {\r\n this.send(rec.msgType, rec.obj)\r\n })\r\n this.setState(SessionState.ActiveNormalSession)\r\n }).catch(e => {\r\n this.sessionLogger.error(e)\r\n })\r\n }\r\n\r\n okForLogon (): boolean {\r\n const state = this.sessionState.state\r\n if (this.acceptor) {\r\n return state === SessionState.WaitingForALogon\r\n }\r\n return state === SessionState.InitiationLogonSent\r\n }\r\n\r\n protected onSessionMsg (msgType: string, view: MsgView): void {\r\n\r\n const logger = this.sessionLogger\r\n\r\n switch (msgType) {\r\n case MsgType.Logon: {\r\n // only valid to receive a logon when in LogonSent or WaitingALogon\r\n // else will drop connection immediately.\r\n if (this.okForLogon()) {\r\n this.peerLogon(view)\r\n } else {\r\n this.terminate(new Error(`state ${this.stateString()} is illegal for Logon`))\r\n }\r\n break\r\n }\r\n\r\n case MsgType.Logout: {\r\n this.peerLogout(view)\r\n break\r\n }\r\n\r\n case MsgType.TestRequest: {\r\n const req: string = view.getString(MsgTag.TestReqID)\r\n this.sendHeartbeat(req)\r\n break\r\n }\r\n\r\n case MsgType.Heartbeat: {\r\n this.sessionState.lastTestRequestAt = null\r\n this.setState(SessionState.ActiveNormalSession)\r\n break\r\n }\r\n\r\n case MsgType.ResendRequest: {\r\n logger.info(`peer sends '${msgType}' resend request.`)\r\n this.onResendRequest(view)\r\n break\r\n }\r\n\r\n case MsgType.SequenceReset: {\r\n const newSeqNo: number = view.getTyped(MsgTag.NewSeqNo)\r\n logger.info(`peer sends '${msgType}' sequence reset. newSeqNo = ${newSeqNo}`)\r\n // expect newSeqNo to be the next message's sequence number.\r\n this.sessionState.lastPeerMsgSeqNum = newSeqNo - 1\r\n break\r\n }\r\n\r\n case MsgType.Reject: {\r\n logger.info(`peer rejects type '${msgType}' with text '${view.getTyped(MsgTag.Text)}'`)\r\n break\r\n }\r\n }\r\n }\r\n\r\n protected onMsg (msgType: string, view: MsgView): void {\r\n\r\n if (!this.checkSeqNo(msgType, view)) {\r\n this.sessionLogger.info(`message '${msgType}' failed checkSeqNo.`)\r\n return\r\n }\r\n\r\n if (this.checkMsgIntegrity && !this.checkIntegrity(msgType, view)) {\r\n this.sessionLogger.info(`message '${msgType}' failed checkIntegrity.`)\r\n switch (msgType) {\r\n case MsgType.Logon: {\r\n this.setState(SessionState.PeerLogonRejected)\r\n this.startTimer()\r\n break\r\n }\r\n }\r\n return\r\n }\r\n\r\n switch (msgType) {\r\n case MsgType.Logon:\r\n case MsgType.Logout:\r\n case MsgType.TestRequest:\r\n case MsgType.Reject:\r\n case MsgType.SequenceReset:\r\n case MsgType.Heartbeat:\r\n case MsgType.ResendRequest: {\r\n this.onSessionMsg(msgType, view)\r\n break\r\n }\r\n\r\n default: {\r\n this.checkForwardMsg(msgType, view)\r\n break\r\n }\r\n }\r\n }\r\n\r\n private startTimer (interval: number = 200) {\r\n this.timer = setInterval(() => {\r\n this.tick()\r\n }, interval)\r\n }\r\n\r\n private peerLogon (view: MsgView) {\r\n const logger = this.sessionLogger\r\n const [heartBtInt, peerCompId, userName, password] = view.getTypedTags([MsgTag.HeartBtInt, MsgTag.SenderCompID, MsgTag.Username, MsgTag.Password])\r\n logger.info(`peerLogon Username = ${userName}, heartBtInt = ${heartBtInt}, peerCompId = ${peerCompId}, userName = ${userName}`)\r\n const state = this.sessionState\r\n state.peerHeartBeatSecs = view.getTyped(MsgTag.HeartBtInt)\r\n state.peerCompId = view.getTyped(MsgTag.SenderCompID)\r\n const res = this.onLogon(view, userName, password)\r\n // currently not using this.\r\n logger.info(`peerLogon onLogon returns ${res}`)\r\n if (this.acceptor) {\r\n this.setState(SessionState.InitiationLogonResponse)\r\n logger.info('acceptor responds to logon request')\r\n this.sendLogon() // if res send response else reject, terminate\r\n } else { // as an initiator the acceptor has responded\r\n logger.info('initiator receives logon response')\r\n this.setState(SessionState.InitiationLogonReceived)\r\n }\r\n if (this.heartbeat) {\r\n logger.debug(`start heartbeat timer.`)\r\n this.startTimer()\r\n }\r\n logger.info(`system ready, inform app`)\r\n this.onReady(view)\r\n }\r\n\r\n private sendTestRequest () {\r\n const factory = this.config.factory\r\n this.setState(SessionState.AwaitingProcessingResponseToTestRequest)\r\n this.send(MsgType.TestRequest, factory.testRequest())\r\n }\r\n\r\n private sendHeartbeat (testReqId: string) {\r\n const factory = this.config.factory\r\n this.send(MsgType.Heartbeat, factory.heartbeat(testReqId))\r\n }\r\n\r\n private tick (): void {\r\n const sessionState = this.sessionState\r\n const action: TickAction = sessionState.calcAction(new Date())\r\n const application: IMsgApplication = this.transport.config.description.application\r\n const logger = this.sessionLogger\r\n\r\n switch (action) {\r\n case TickAction.Nothing: {\r\n // all is well\r\n break\r\n }\r\n\r\n case TickAction.TestRequest: {\r\n logger.debug(`send test req. state = ${sessionState.toString()}`)\r\n this.sendTestRequest()\r\n break\r\n }\r\n\r\n case TickAction.Heartbeat: {\r\n logger.debug(`send heartbeat. state = ${sessionState.toString()}`)\r\n this.sendHeartbeat(sessionState.now.toUTCString())\r\n break\r\n }\r\n\r\n case TickAction.TerminateOnError: {\r\n logger.info(sessionState.toString())\r\n this.terminate(new Error(`${application.name}: peer not responding`))\r\n break\r\n }\r\n\r\n case TickAction.Stop: {\r\n logger.info(sessionState.toString())\r\n logger.info('stopping')\r\n this.stop()\r\n break\r\n }\r\n\r\n default:\r\n throw new Error(`unexpected action`)\r\n }\r\n }\r\n}\r\n"]}
@@ -11,7 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.HttpDuplex = void 0;
13
13
  const fix_duplex_1 = require("./fix-duplex");
14
- const requestPromise = require("request-promise");
14
+ const rp = require("request-promise-native");
15
15
  class HttpDuplex extends fix_duplex_1.FixDuplex {
16
16
  constructor(adapter) {
17
17
  super();
@@ -35,7 +35,7 @@ class HttpDuplex extends fix_duplex_1.FixDuplex {
35
35
  try {
36
36
  const adapter = this.adapter;
37
37
  const options = adapter.getOptions(data);
38
- requestPromise(options).then((message) => {
38
+ rp(options).then((message) => {
39
39
  const body = adapter.endMessage(message);
40
40
  forward.push(body);
41
41
  done();
@@ -1 +1 @@
1
- {"version":3,"file":"http-duplex.js","sourceRoot":"","sources":["../../../src/transport/duplex/http-duplex.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAwC;AAGxC,kDAAiD;AAEjD,MAAa,UAAW,SAAQ,sBAAS;IACvC,YAAoC,OAAqB;QACvD,KAAK,EAAE,CAAA;QAD2B,YAAO,GAAP,OAAO,CAAc;QAEvD,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,YAAY,EAAE,CAAA;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IACrC,CAAC;IAEO,MAAM,CAAC,YAAY;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAA;QAC3C,MAAM,MAAM,GAAG;YACb,IAAI,EAAG,GAAG,EAAE;YAEZ,CAAC;SACF,CAAA;QACD,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAAa,IAAI,CAAC,QAAQ,CAAA;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAA;QAC3C,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,CAAO,IAAY,EAAE,CAAM,EAAE,IAAc,EAAE,EAAE;gBACpD,IAAI;oBACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;oBAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;oBACxC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAY,EAAE,EAAE;wBAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;wBACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBAClB,IAAI,EAAE,CAAA;oBACR,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBACtB,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;oBAC7B,CAAC,CAAC,CAAA;iBACH;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,CAAC,CAAC,CAAC,CAAA;iBACR;YACH,CAAC,CAAA;SACF,CAAA;QACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEM,GAAG;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;CACF;AA5CD,gCA4CC","sourcesContent":["import { FixDuplex } from './fix-duplex'\r\nimport { Readable, Writable } from 'stream'\r\nimport { IHttpAdapter } from '../session-description'\r\nimport * as requestPromise from 'request-promise'\r\n\r\nexport class HttpDuplex extends FixDuplex {\r\n public constructor (public readonly adapter: IHttpAdapter) {\r\n super()\r\n this.readable = HttpDuplex.makeReadable()\r\n this.writable = this.makeWritable()\r\n }\r\n\r\n private static makeReadable (): Readable {\r\n const Readable = require('stream').Readable\r\n const reader = {\r\n read: () => {\r\n // nothing\r\n }\r\n }\r\n return new Readable(reader)\r\n }\r\n\r\n private makeWritable (): Writable {\r\n const forward: Readable = this.readable\r\n const Writable = require('stream').Writable\r\n const writer = {\r\n write: async (data: Buffer, _: any, done: Function) => {\r\n try {\r\n const adapter = this.adapter\r\n const options = adapter.getOptions(data)\r\n requestPromise(options).then((message: any) => {\r\n const body = adapter.endMessage(message)\r\n forward.push(body)\r\n done()\r\n }).catch((err: Error) => {\r\n receiver.emit('error', err)\r\n })\r\n } catch (e) {\r\n done(e)\r\n }\r\n }\r\n }\r\n const receiver = new Writable(writer)\r\n return receiver\r\n }\r\n\r\n public end (): void {\r\n this.readable.push(null)\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"http-duplex.js","sourceRoot":"","sources":["../../../src/transport/duplex/http-duplex.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAwC;AAGxC,6CAA4C;AAE5C,MAAa,UAAW,SAAQ,sBAAS;IACvC,YAAoC,OAAqB;QACvD,KAAK,EAAE,CAAA;QAD2B,YAAO,GAAP,OAAO,CAAc;QAEvD,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,YAAY,EAAE,CAAA;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IACrC,CAAC;IAEO,MAAM,CAAC,YAAY;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAA;QAC3C,MAAM,MAAM,GAAG;YACb,IAAI,EAAG,GAAG,EAAE;YAEZ,CAAC;SACF,CAAA;QACD,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAAa,IAAI,CAAC,QAAQ,CAAA;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAA;QAC3C,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,CAAO,IAAY,EAAE,CAAM,EAAE,IAAc,EAAE,EAAE;gBACpD,IAAI;oBACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;oBAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;oBACxC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAY,EAAE,EAAE;wBAChC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;wBACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBAClB,IAAI,EAAE,CAAA;oBACR,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBACtB,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;oBAC7B,CAAC,CAAC,CAAA;iBACH;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,CAAC,CAAC,CAAC,CAAA;iBACR;YACH,CAAC,CAAA;SACF,CAAA;QACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEM,GAAG;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;CACF;AA5CD,gCA4CC","sourcesContent":["import { FixDuplex } from './fix-duplex'\r\nimport { Readable, Writable } from 'stream'\r\nimport { IHttpAdapter } from '../session-description'\r\nimport * as rp from 'request-promise-native'\r\n\r\nexport class HttpDuplex extends FixDuplex {\r\n public constructor (public readonly adapter: IHttpAdapter) {\r\n super()\r\n this.readable = HttpDuplex.makeReadable()\r\n this.writable = this.makeWritable()\r\n }\r\n\r\n private static makeReadable (): Readable {\r\n const Readable = require('stream').Readable\r\n const reader = {\r\n read: () => {\r\n // nothing\r\n }\r\n }\r\n return new Readable(reader)\r\n }\r\n\r\n private makeWritable (): Writable {\r\n const forward: Readable = this.readable\r\n const Writable = require('stream').Writable\r\n const writer = {\r\n write: async (data: Buffer, _: any, done: Function) => {\r\n try {\r\n const adapter = this.adapter\r\n const options = adapter.getOptions(data)\r\n rp(options).then((message: any) => {\r\n const body = adapter.endMessage(message)\r\n forward.push(body)\r\n done()\r\n }).catch((err: Error) => {\r\n receiver.emit('error', err)\r\n })\r\n } catch (e) {\r\n done(e)\r\n }\r\n }\r\n }\r\n const receiver = new Writable(writer)\r\n return receiver\r\n }\r\n\r\n public end (): void {\r\n this.readable.push(null)\r\n }\r\n}\r\n"]}
@@ -67,6 +67,7 @@ class FixSessionState {
67
67
  this.secondsSinceReceive = -1;
68
68
  this.peerHeartBeatSecs = 0;
69
69
  this.logoutSentAt = null;
70
+ this.nextTickAction = TickAction.Nothing;
70
71
  if (resetSeqNo) {
71
72
  this.lastPeerMsgSeqNum = 0;
72
73
  }
@@ -82,7 +83,7 @@ class FixSessionState {
82
83
  buffer.writeString(`compId = ${this.compId}, `);
83
84
  buffer.writeString(`heartBeat = ${this.heartBeat}, `);
84
85
  buffer.writeString(`state = ${SessionState[this.state]} (${this.state}), `);
85
- buffer.writeString(`nextTickAction = ${this.nextTickAction}, `);
86
+ buffer.writeString(`nextTickAction = ${TickAction[this.nextTickAction]} (${this.nextTickAction}), `);
86
87
  buffer.writeString(`now = ${FixSessionState.dateAsString(this.now)}, `);
87
88
  buffer.writeString(`timeToDie = ${this.timeToDie()}, `);
88
89
  buffer.writeString(`timeToHeartbeat = ${this.timeToHeartbeat()}, `);
@@ -117,6 +118,8 @@ class FixSessionState {
117
118
  }
118
119
  break;
119
120
  }
121
+ case SessionState.ActiveNormalSession:
122
+ case SessionState.AwaitingProcessingResponseToTestRequest:
120
123
  case SessionState.InitiationLogonReceived:
121
124
  case SessionState.InitiationLogonResponse: {
122
125
  if (this.timeToHeartbeat()) {
@@ -1 +1 @@
1
- {"version":3,"file":"fix-session-state.js","sourceRoot":"","sources":["../../src/transport/fix-session-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { ElasticBuffer } from '../buffer'\r\nimport moment = require('moment')\r\n\r\nexport enum SessionState {\r\n DisconnectedNoConnectionToday = 1,\r\n DisconnectedConnectionToday = 2,\r\n DetectBrokenNetworkConnection = 3,\r\n AwaitingConnection = 4,\r\n InitiateConnection = 5,\r\n NetworkConnectionEstablished = 6,\r\n InitiationLogonSent = 7,\r\n InitiationLogonReceived = 8,\r\n InitiationLogonResponse = 9,\r\n HandleResendRequest = 10,\r\n ReceiveMsgSeqNumTooHigh = 11,\r\n AwaitingProcessingResponseToResendRequest = 12,\r\n NoMessagesReceivedInInterval = 13,\r\n AwaitingProcessingResponseToTestRequest = 14,\r\n ReceiveLogout = 15,\r\n InitiateLogout = 16,\r\n ActiveNormalSession = 17,\r\n WaitingForALogon = 18,\r\n PeerLogonRejected = 20,\r\n WaitingLogoutConfirm = 21,\r\n ConfirmingLogout = 22,\r\n Stopped = 23,\r\n Idle = 24\r\n}\r\n\r\nexport enum TickAction {\r\n Nothing = 1,\r\n Heartbeat = 2,\r\n TestRequest = 3,\r\n TerminateOnError = 4,\r\n WaitLogoutConfirmExpired = 5,\r\n Stop = 6\r\n}\r\n\r\ninterface IFixSessionStateArgs {\r\n heartBeat: number\r\n state?: SessionState\r\n waitLogoutConfirmSeconds?: number\r\n stopSeconds?: number\r\n lastPeerMsgSeqNum?: number\r\n}\r\n\r\nexport class FixSessionState {\r\n public nextTickAction: TickAction = TickAction.Nothing\r\n\r\n public lastReceivedAt: Date = null\r\n public LastSentAt: Date = null\r\n public lastTestRequestAt: Date = null\r\n public logoutSentAt: Date = null\r\n public now: Date = new Date()\r\n public compId: string = ''\r\n public peerCompId: string = ''\r\n public peerHeartBeatSecs: number = 0\r\n public lastPeerMsgSeqNum: number\r\n public readonly heartBeat: number\r\n public state: SessionState\r\n public readonly waitLogoutConfirmSeconds: number\r\n public readonly stopSeconds: number\r\n\r\n private secondsSinceLogoutSent: number = -1\r\n private secondsSinceSent: number = -1\r\n private secondsSinceReceive: number = -1\r\n\r\n public reset (resetSeqNo: boolean): void {\r\n this.lastReceivedAt = null\r\n this.LastSentAt = null\r\n this.lastTestRequestAt = null\r\n this.secondsSinceLogoutSent = -1\r\n this.secondsSinceSent = -1\r\n this.secondsSinceReceive = -1\r\n this.peerHeartBeatSecs = 0\r\n this.logoutSentAt = null\r\n if (resetSeqNo) {\r\n this.lastPeerMsgSeqNum = 0\r\n }\r\n }\r\n\r\n public constructor ({ heartBeat,\r\n state = SessionState.Idle,\r\n waitLogoutConfirmSeconds = 5,\r\n stopSeconds = 2,\r\n lastPeerMsgSeqNum = 0 }: IFixSessionStateArgs) {\r\n this.heartBeat = heartBeat\r\n this.state = state\r\n this.waitLogoutConfirmSeconds = waitLogoutConfirmSeconds\r\n this.stopSeconds = stopSeconds\r\n this.lastPeerMsgSeqNum = lastPeerMsgSeqNum\r\n }\r\n\r\n private static dateAsString (d: Date) {\r\n if (!d) {\r\n return 'null'\r\n }\r\n return moment(d).format('HH:mm:ss.SSS')\r\n }\r\n\r\n public toString (): string {\r\n\r\n const buffer = new ElasticBuffer(1024)\r\n\r\n buffer.writeString(`compId = ${this.compId}, `)\r\n buffer.writeString(`heartBeat = ${this.heartBeat}, `)\r\n buffer.writeString(`state = ${SessionState[this.state]} (${this.state}), `)\r\n buffer.writeString(`nextTickAction = ${this.nextTickAction}, `)\r\n buffer.writeString(`now = ${FixSessionState.dateAsString(this.now)}, `)\r\n buffer.writeString(`timeToDie = ${this.timeToDie()}, `)\r\n buffer.writeString(`timeToHeartbeat = ${this.timeToHeartbeat()}, `)\r\n buffer.writeString(`timeToTerminate = ${this.timeToTerminate()}, `)\r\n buffer.writeString(`timeToTestRequest = ${this.timeToTestRequest()}, `)\r\n buffer.writeString(`lastReceivedAt = ${FixSessionState.dateAsString(this.lastReceivedAt)}, `)\r\n buffer.writeString(`LastSentAt = ${FixSessionState.dateAsString(this.LastSentAt)}, `)\r\n buffer.writeString(`lastTestRequestAt = ${FixSessionState.dateAsString(this.lastTestRequestAt)}, `)\r\n buffer.writeString(`logoutSentAt = ${FixSessionState.dateAsString(this.logoutSentAt)}, `)\r\n buffer.writeString(`peerHeartBeatSecs = ${this.peerHeartBeatSecs}, `)\r\n buffer.writeString(`peerCompId = ${this.peerCompId}, `)\r\n buffer.writeString(`lastPeerMsgSeqNum = ${this.lastPeerMsgSeqNum}, `)\r\n buffer.writeString(`secondsSinceLogoutSent = ${this.secondsSinceLogoutSent}, `)\r\n buffer.writeString(`secondsSinceSent = ${this.secondsSinceSent}, `)\r\n buffer.writeString(`secondsSinceReceive = ${this.secondsSinceReceive}`)\r\n\r\n return buffer.toString()\r\n }\r\n\r\n public calcAction (now: Date): TickAction {\r\n this.now = now\r\n this.calcState()\r\n\r\n switch (this.state) {\r\n\r\n case SessionState.PeerLogonRejected: {\r\n if (this.secondsSinceSent >= this.stopSeconds) {\r\n this.nextTickAction = TickAction.Stop\r\n }\r\n break\r\n }\r\n\r\n case SessionState.WaitingLogoutConfirm:\r\n case SessionState.ConfirmingLogout: {\r\n if (this.timeToDie()) {\r\n this.nextTickAction = TickAction.Stop\r\n }\r\n break\r\n }\r\n\r\n case SessionState.InitiationLogonReceived:\r\n case SessionState.InitiationLogonResponse : {\r\n if (this.timeToHeartbeat()) {\r\n // have not sent anything for heartbeat period so let other side know still alive.\r\n this.nextTickAction = TickAction.Heartbeat\r\n } else {\r\n // console.log(`${application.name}: secondsSinceSent = ${secondsSinceSent} secondsSinceReceive = ${secondsSinceReceive}`)\r\n if (this.timeToTerminate()) {\r\n this.nextTickAction = TickAction.TerminateOnError\r\n } else if (this.timeToTestRequest()) {\r\n if (!this.lastTestRequestAt) {\r\n // not received anything from peer\r\n this.nextTickAction = TickAction.TestRequest\r\n this.lastTestRequestAt = this.now\r\n }\r\n }\r\n }\r\n break\r\n }\r\n }\r\n\r\n return this.nextTickAction\r\n }\r\n\r\n public timeToDie (): boolean {\r\n return this.secondsSinceLogoutSent > this.waitLogoutConfirmSeconds ||\r\n this.secondsSinceLogoutSent > this.stopSeconds\r\n }\r\n\r\n public timeToHeartbeat (): boolean {\r\n return this.secondsSinceSent >= this.heartBeat\r\n }\r\n\r\n public timeToTerminate (): boolean {\r\n return this.secondsSinceReceive >= 2.5 * this.peerHeartBeatSecs\r\n }\r\n\r\n public timeToTestRequest (): boolean {\r\n return this.secondsSinceReceive >= 1.5 * this.peerHeartBeatSecs\r\n }\r\n\r\n private calcState (): void {\r\n const time = this.now.getTime()\r\n this.nextTickAction = TickAction.Nothing\r\n this.secondsSinceLogoutSent = this.logoutSentAt ? (time - this.logoutSentAt.getTime()) / 1000 : -1\r\n this.secondsSinceSent = (time - this.LastSentAt.getTime()) / 1000\r\n this.secondsSinceReceive = (time - this.lastReceivedAt.getTime()) / 1000\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"fix-session-state.js","sourceRoot":"","sources":["../../src/transport/fix-session-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { ElasticBuffer } from '../buffer'\r\nimport moment = require('moment')\r\n\r\nexport enum SessionState {\r\n DisconnectedNoConnectionToday = 1,\r\n DisconnectedConnectionToday = 2,\r\n DetectBrokenNetworkConnection = 3,\r\n AwaitingConnection = 4,\r\n InitiateConnection = 5,\r\n NetworkConnectionEstablished = 6,\r\n InitiationLogonSent = 7,\r\n InitiationLogonReceived = 8,\r\n InitiationLogonResponse = 9,\r\n HandleResendRequest = 10,\r\n ReceiveMsgSeqNumTooHigh = 11,\r\n AwaitingProcessingResponseToResendRequest = 12,\r\n NoMessagesReceivedInInterval = 13,\r\n AwaitingProcessingResponseToTestRequest = 14,\r\n ReceiveLogout = 15,\r\n InitiateLogout = 16,\r\n ActiveNormalSession = 17,\r\n WaitingForALogon = 18,\r\n PeerLogonRejected = 20,\r\n WaitingLogoutConfirm = 21,\r\n ConfirmingLogout = 22,\r\n Stopped = 23,\r\n Idle = 24\r\n}\r\n\r\nexport enum TickAction {\r\n Nothing = 1,\r\n Heartbeat = 2,\r\n TestRequest = 3,\r\n TerminateOnError = 4,\r\n WaitLogoutConfirmExpired = 5,\r\n Stop = 6\r\n}\r\n\r\ninterface IFixSessionStateArgs {\r\n heartBeat: number\r\n state?: SessionState\r\n waitLogoutConfirmSeconds?: number\r\n stopSeconds?: number\r\n lastPeerMsgSeqNum?: number\r\n}\r\n\r\nexport class FixSessionState {\r\n public nextTickAction: TickAction = TickAction.Nothing\r\n\r\n public lastReceivedAt: Date = null\r\n public LastSentAt: Date = null\r\n public lastTestRequestAt: Date = null\r\n public logoutSentAt: Date = null\r\n public now: Date = new Date()\r\n public compId: string = ''\r\n public peerCompId: string = ''\r\n public peerHeartBeatSecs: number = 0\r\n public lastPeerMsgSeqNum: number\r\n public readonly heartBeat: number\r\n public state: SessionState\r\n public readonly waitLogoutConfirmSeconds: number\r\n public readonly stopSeconds: number\r\n\r\n private secondsSinceLogoutSent: number = -1\r\n private secondsSinceSent: number = -1\r\n private secondsSinceReceive: number = -1\r\n\r\n public reset (resetSeqNo: boolean): void {\r\n this.lastReceivedAt = null\r\n this.LastSentAt = null\r\n this.lastTestRequestAt = null\r\n this.secondsSinceLogoutSent = -1\r\n this.secondsSinceSent = -1\r\n this.secondsSinceReceive = -1\r\n this.peerHeartBeatSecs = 0\r\n this.logoutSentAt = null\r\n this.nextTickAction = TickAction.Nothing\r\n if (resetSeqNo) {\r\n this.lastPeerMsgSeqNum = 0\r\n }\r\n }\r\n\r\n public constructor ({ heartBeat,\r\n state = SessionState.Idle,\r\n waitLogoutConfirmSeconds = 5,\r\n stopSeconds = 2,\r\n lastPeerMsgSeqNum = 0 }: IFixSessionStateArgs) {\r\n this.heartBeat = heartBeat\r\n this.state = state\r\n this.waitLogoutConfirmSeconds = waitLogoutConfirmSeconds\r\n this.stopSeconds = stopSeconds\r\n this.lastPeerMsgSeqNum = lastPeerMsgSeqNum\r\n }\r\n\r\n private static dateAsString (d: Date) {\r\n if (!d) {\r\n return 'null'\r\n }\r\n return moment(d).format('HH:mm:ss.SSS')\r\n }\r\n\r\n public toString (): string {\r\n\r\n const buffer = new ElasticBuffer(1024)\r\n\r\n buffer.writeString(`compId = ${this.compId}, `)\r\n buffer.writeString(`heartBeat = ${this.heartBeat}, `)\r\n buffer.writeString(`state = ${SessionState[this.state]} (${this.state}), `)\r\n buffer.writeString(`nextTickAction = ${TickAction[this.nextTickAction]} (${this.nextTickAction}), `)\r\n buffer.writeString(`now = ${FixSessionState.dateAsString(this.now)}, `)\r\n buffer.writeString(`timeToDie = ${this.timeToDie()}, `)\r\n buffer.writeString(`timeToHeartbeat = ${this.timeToHeartbeat()}, `)\r\n buffer.writeString(`timeToTerminate = ${this.timeToTerminate()}, `)\r\n buffer.writeString(`timeToTestRequest = ${this.timeToTestRequest()}, `)\r\n buffer.writeString(`lastReceivedAt = ${FixSessionState.dateAsString(this.lastReceivedAt)}, `)\r\n buffer.writeString(`LastSentAt = ${FixSessionState.dateAsString(this.LastSentAt)}, `)\r\n buffer.writeString(`lastTestRequestAt = ${FixSessionState.dateAsString(this.lastTestRequestAt)}, `)\r\n buffer.writeString(`logoutSentAt = ${FixSessionState.dateAsString(this.logoutSentAt)}, `)\r\n buffer.writeString(`peerHeartBeatSecs = ${this.peerHeartBeatSecs}, `)\r\n buffer.writeString(`peerCompId = ${this.peerCompId}, `)\r\n buffer.writeString(`lastPeerMsgSeqNum = ${this.lastPeerMsgSeqNum}, `)\r\n buffer.writeString(`secondsSinceLogoutSent = ${this.secondsSinceLogoutSent}, `)\r\n buffer.writeString(`secondsSinceSent = ${this.secondsSinceSent}, `)\r\n buffer.writeString(`secondsSinceReceive = ${this.secondsSinceReceive}`)\r\n\r\n return buffer.toString()\r\n }\r\n\r\n public calcAction (now: Date): TickAction {\r\n this.now = now\r\n this.calcState()\r\n\r\n switch (this.state) {\r\n\r\n case SessionState.PeerLogonRejected: {\r\n if (this.secondsSinceSent >= this.stopSeconds) {\r\n this.nextTickAction = TickAction.Stop\r\n }\r\n break\r\n }\r\n\r\n case SessionState.WaitingLogoutConfirm:\r\n case SessionState.ConfirmingLogout: {\r\n if (this.timeToDie()) {\r\n this.nextTickAction = TickAction.Stop\r\n }\r\n break\r\n }\r\n\r\n case SessionState.ActiveNormalSession:\r\n case SessionState.AwaitingProcessingResponseToTestRequest:\r\n case SessionState.InitiationLogonReceived:\r\n case SessionState.InitiationLogonResponse : {\r\n if (this.timeToHeartbeat()) {\r\n // have not sent anything for heartbeat period so let other side know still alive.\r\n this.nextTickAction = TickAction.Heartbeat\r\n } else {\r\n // console.log(`${application.name}: secondsSinceSent = ${secondsSinceSent} secondsSinceReceive = ${secondsSinceReceive}`)\r\n if (this.timeToTerminate()) {\r\n this.nextTickAction = TickAction.TerminateOnError\r\n } else if (this.timeToTestRequest()) {\r\n if (!this.lastTestRequestAt) {\r\n // not received anything from peer\r\n this.nextTickAction = TickAction.TestRequest\r\n this.lastTestRequestAt = this.now\r\n }\r\n }\r\n }\r\n break\r\n }\r\n }\r\n\r\n return this.nextTickAction\r\n }\r\n\r\n public timeToDie (): boolean {\r\n return this.secondsSinceLogoutSent > this.waitLogoutConfirmSeconds ||\r\n this.secondsSinceLogoutSent > this.stopSeconds\r\n }\r\n\r\n public timeToHeartbeat (): boolean {\r\n return this.secondsSinceSent >= this.heartBeat\r\n }\r\n\r\n public timeToTerminate (): boolean {\r\n return this.secondsSinceReceive >= 2.5 * this.peerHeartBeatSecs\r\n }\r\n\r\n public timeToTestRequest (): boolean {\r\n return this.secondsSinceReceive >= 1.5 * this.peerHeartBeatSecs\r\n }\r\n\r\n private calcState (): void {\r\n const time = this.now.getTime()\r\n this.nextTickAction = TickAction.Nothing\r\n this.secondsSinceLogoutSent = this.logoutSentAt ? (time - this.logoutSentAt.getTime()) / 1000 : -1\r\n this.secondsSinceSent = (time - this.LastSentAt.getTime()) / 1000\r\n this.secondsSinceReceive = (time - this.lastReceivedAt.getTime()) / 1000\r\n }\r\n}\r\n"]}
@@ -23,12 +23,18 @@ export declare abstract class FixSession extends events.EventEmitter {
23
23
  protected constructor(config: IJsFixConfig);
24
24
  setState(state: SessionState): void;
25
25
  getState(): SessionState;
26
+ sendLogon(): void;
27
+ private waitPromise;
26
28
  run(transport: MsgTransport): Promise<number>;
29
+ protected expectedState(): boolean;
27
30
  protected subscribe(): void;
31
+ protected validStateApplicationMsg(): boolean;
32
+ protected stateString(): string;
28
33
  protected checkForwardMsg(msgType: string, view: MsgView): void;
29
34
  protected terminate(error: Error): void;
30
35
  protected peerLogout(view: MsgView): void;
31
36
  protected send(msgType: string, obj: ILooseObject): void;
37
+ protected sendLogout(msg: string): void;
32
38
  protected sessionLogout(): void;
33
39
  done(): void;
34
40
  reset(): void;
@@ -29,28 +29,26 @@ class FixSession extends events.EventEmitter {
29
29
  return;
30
30
  const logger = this.sessionLogger;
31
31
  const prevState = this.sessionState.state;
32
- logger.info(`current state ${fix_session_state_1.SessionState[prevState]} (${prevState}) moves to ${fix_session_state_1.SessionState[state]} (${state})`);
32
+ const msg = `current state ${fix_session_state_1.SessionState[prevState]} (${prevState}) moves to ${fix_session_state_1.SessionState[state]} (${state})`;
33
+ logger.info(msg);
33
34
  this.sessionState.state = state;
34
35
  }
35
36
  getState() {
36
37
  return this.sessionState.state;
37
38
  }
38
- run(transport) {
39
+ sendLogon() {
40
+ this.send(this.requestLogonType, this.config.factory.logon());
41
+ }
42
+ waitPromise() {
39
43
  const logger = this.sessionLogger;
40
- if (this.transport) {
41
- logger.info('reset from previous transport.');
42
- this.reset();
43
- }
44
- this.transport = transport;
45
- this.subscribe();
46
44
  return new Promise((accept, reject) => {
47
45
  if (this.initiator) {
48
- logger.debug('initiator sending logon');
49
- this.send(this.requestLogonType, this.config.factory.logon());
46
+ logger.debug(`initiator sending logon state = ${this.stateString()}`);
47
+ this.sendLogon();
50
48
  this.setState(fix_session_state_1.SessionState.InitiationLogonSent);
51
49
  }
52
50
  else {
53
- logger.debug('acceptor waits for logon');
51
+ logger.debug(`acceptor waits for logon state = ${this.stateString()}`);
54
52
  this.setState(fix_session_state_1.SessionState.WaitingForALogon);
55
53
  }
56
54
  this.on('error', (e) => {
@@ -62,6 +60,30 @@ class FixSession extends events.EventEmitter {
62
60
  });
63
61
  });
64
62
  }
63
+ run(transport) {
64
+ const logger = this.sessionLogger;
65
+ if (this.transport) {
66
+ logger.info(`reset from previous transport. state ${this.stateString()}`);
67
+ this.reset();
68
+ }
69
+ this.transport = transport;
70
+ this.subscribe();
71
+ return this.waitPromise();
72
+ }
73
+ expectedState() {
74
+ switch (this.sessionState.state) {
75
+ case fix_session_state_1.SessionState.ActiveNormalSession:
76
+ case fix_session_state_1.SessionState.ReceiveLogout:
77
+ case fix_session_state_1.SessionState.Stopped:
78
+ case fix_session_state_1.SessionState.ConfirmingLogout:
79
+ case fix_session_state_1.SessionState.HandleResendRequest:
80
+ case fix_session_state_1.SessionState.AwaitingProcessingResponseToTestRequest:
81
+ case fix_session_state_1.SessionState.AwaitingProcessingResponseToResendRequest:
82
+ return true;
83
+ default:
84
+ return false;
85
+ }
86
+ }
65
87
  subscribe() {
66
88
  const transport = this.transport;
67
89
  const logger = this.sessionLogger;
@@ -91,22 +113,15 @@ class FixSession extends events.EventEmitter {
91
113
  });
92
114
  rx.on('end', () => {
93
115
  logger.info(`rx end received sessionState = [${this.sessionState.toString()}]`);
94
- switch (this.sessionState.state) {
95
- case fix_session_state_1.SessionState.ReceiveLogout:
96
- case fix_session_state_1.SessionState.Stopped:
97
- case fix_session_state_1.SessionState.ConfirmingLogout:
98
- {
99
- logger.info(`rx graceful end state = ${fix_session_state_1.SessionState[this.sessionState.state]}`);
100
- this.done();
101
- }
102
- break;
103
- default:
104
- {
105
- const e = new Error(`unexpected state - transport failed? = ${fix_session_state_1.SessionState[this.sessionState.state]}`);
106
- logger.info(`rx error ${e.message}`);
107
- this.terminate(e);
108
- }
109
- break;
116
+ const expectedState = this.expectedState();
117
+ if (expectedState) {
118
+ logger.info(`rx graceful end state = ${this.stateString()}`);
119
+ this.done();
120
+ }
121
+ else {
122
+ const e = new Error(`unexpected state - transport failed? = ${this.stateString()}`);
123
+ logger.info(`rx error ${e.message}`);
124
+ this.terminate(e);
110
125
  }
111
126
  });
112
127
  rx.on('decoded', (msgType, data, ptr) => {
@@ -122,27 +137,53 @@ class FixSession extends events.EventEmitter {
122
137
  this.onEncoded(msgType, data);
123
138
  });
124
139
  }
140
+ validStateApplicationMsg() {
141
+ switch (this.sessionState.state) {
142
+ case fix_session_state_1.SessionState.Idle:
143
+ case fix_session_state_1.SessionState.InitiateConnection:
144
+ case fix_session_state_1.SessionState.InitiationLogonSent:
145
+ case fix_session_state_1.SessionState.WaitingForALogon:
146
+ case fix_session_state_1.SessionState.HandleResendRequest:
147
+ case fix_session_state_1.SessionState.AwaitingProcessingResponseToTestRequest:
148
+ case fix_session_state_1.SessionState.AwaitingProcessingResponseToResendRequest:
149
+ return false;
150
+ default:
151
+ return true;
152
+ }
153
+ }
154
+ stateString() {
155
+ return fix_session_state_1.SessionState[this.sessionState.state];
156
+ }
125
157
  checkForwardMsg(msgType, view) {
126
158
  this.sessionLogger.info(`forwarding msgType = '${msgType}' to application`);
159
+ this.setState(fix_session_state_1.SessionState.ActiveNormalSession);
127
160
  this.onApplicationMsg(msgType, view);
128
161
  }
129
162
  terminate(error) {
163
+ if (this.sessionState.state === fix_session_state_1.SessionState.Stopped)
164
+ return;
130
165
  this.sessionLogger.error(error);
131
- clearInterval(this.timer);
132
- this.transport.end();
166
+ if (this.timer) {
167
+ clearInterval(this.timer);
168
+ }
169
+ if (this.transport) {
170
+ this.transport.end();
171
+ }
133
172
  this.transport = null;
134
- this.sessionState.state = fix_session_state_1.SessionState.Stopped;
173
+ this.setState(fix_session_state_1.SessionState.Stopped);
135
174
  this.emit('error', error);
136
175
  }
137
176
  peerLogout(view) {
138
177
  const msg = view.getString(types_1.MsgTag.Text);
139
- switch (this.sessionState.state) {
178
+ const state = this.sessionState.state;
179
+ switch (state) {
140
180
  case fix_session_state_1.SessionState.WaitingLogoutConfirm: {
141
181
  this.sessionLogger.info(`peer confirms logout Text = '${msg}'`);
142
182
  this.stop();
143
183
  break;
144
184
  }
145
185
  case fix_session_state_1.SessionState.InitiationLogonResponse:
186
+ case fix_session_state_1.SessionState.ActiveNormalSession:
146
187
  case fix_session_state_1.SessionState.InitiationLogonReceived: {
147
188
  this.setState(fix_session_state_1.SessionState.ConfirmingLogout);
148
189
  this.sessionLogger.info(`peer initiates logout Text = '${msg}'`);
@@ -151,9 +192,10 @@ class FixSession extends events.EventEmitter {
151
192
  }
152
193
  }
153
194
  send(msgType, obj) {
154
- switch (this.sessionState.state) {
195
+ const state = this.sessionState.state;
196
+ switch (state) {
155
197
  case fix_session_state_1.SessionState.Stopped: {
156
- this.sessionLogger.warning(`can't send in stopped state`);
198
+ this.sessionLogger.warning(`can't send in state ${this.stateString()}`);
157
199
  break;
158
200
  }
159
201
  default: {
@@ -163,27 +205,32 @@ class FixSession extends events.EventEmitter {
163
205
  }
164
206
  }
165
207
  }
208
+ sendLogout(msg) {
209
+ const factory = this.config.factory;
210
+ this.sessionLogger.info(`sending logout with ${msg}`);
211
+ this.send(this.requestLogoutType, factory.logout(this.requestLogoutType, msg));
212
+ }
166
213
  sessionLogout() {
167
214
  const sessionState = this.sessionState;
168
215
  if (sessionState.logoutSentAt) {
169
216
  return;
170
217
  }
171
- const factory = this.config.factory;
172
218
  switch (sessionState.state) {
219
+ case fix_session_state_1.SessionState.ActiveNormalSession:
173
220
  case fix_session_state_1.SessionState.InitiationLogonResponse:
174
221
  case fix_session_state_1.SessionState.InitiationLogonReceived: {
175
222
  this.setState(fix_session_state_1.SessionState.WaitingLogoutConfirm);
176
223
  sessionState.logoutSentAt = new Date();
177
224
  const msg = `${this.me} initiate logout`;
178
225
  this.sessionLogger.info(msg);
179
- this.send(this.requestLogoutType, factory.logout(this.requestLogoutType, msg));
226
+ this.sendLogout(msg);
180
227
  break;
181
228
  }
182
229
  case fix_session_state_1.SessionState.ConfirmingLogout: {
183
230
  sessionState.logoutSentAt = new Date();
184
231
  const msg = `${this.me} confirming logout`;
185
232
  this.sessionLogger.info(msg);
186
- this.send(this.respondLogoutType, factory.logout(this.respondLogoutType, msg));
233
+ this.sendLogout(msg);
187
234
  break;
188
235
  }
189
236
  default: {
@@ -194,6 +241,7 @@ class FixSession extends events.EventEmitter {
194
241
  done() {
195
242
  switch (this.sessionState.state) {
196
243
  case fix_session_state_1.SessionState.InitiationLogonResponse:
244
+ case fix_session_state_1.SessionState.ActiveNormalSession:
197
245
  case fix_session_state_1.SessionState.InitiationLogonReceived: {
198
246
  this.sessionLogout();
199
247
  break;
@@ -206,9 +254,12 @@ class FixSession extends events.EventEmitter {
206
254
  break;
207
255
  }
208
256
  }
209
- this.sessionLogger.info(`done. check logout sequence`);
257
+ this.sessionLogger.info(`done. check logout sequence state ${this.stateString()}`);
210
258
  }
211
259
  reset() {
260
+ if (this.timer) {
261
+ clearInterval(this.timer);
262
+ }
212
263
  this.transport = null;
213
264
  this.sessionState.reset(true);
214
265
  this.setState(fix_session_state_1.SessionState.NetworkConnectionEstablished);
@@ -217,7 +268,9 @@ class FixSession extends events.EventEmitter {
217
268
  if (this.sessionState.state === fix_session_state_1.SessionState.Stopped) {
218
269
  return;
219
270
  }
220
- clearInterval(this.timer);
271
+ if (this.timer) {
272
+ clearInterval(this.timer);
273
+ }
221
274
  this.sessionLogger.info(`stop: kill transport`);
222
275
  this.transport.end();
223
276
  if (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"fix-session.js","sourceRoot":"","sources":["../../src/transport/fix-session.ts"],"names":[],"mappings":"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","sourcesContent":["import { ElasticBuffer, MsgView, SegmentType } from '../buffer'\r\nimport { IJsFixConfig, IJsFixLogger } from '../config'\r\nimport { FixSessionState, SessionState } from './fix-session-state'\r\nimport { MsgTransport } from './msg-transport'\r\nimport { MsgTag } from '../types'\r\nimport { ILooseObject } from '../collections/collection'\r\n\r\nimport * as events from 'events'\r\n\r\nexport abstract class FixSession extends events.EventEmitter {\r\n public logReceivedMsgs: boolean = false\r\n protected timer: NodeJS.Timer = null\r\n protected transport: MsgTransport = null\r\n public manageSession: boolean = true\r\n public checkMsgIntegrity: boolean = false\r\n protected readonly me: string\r\n protected readonly initiator: boolean\r\n protected readonly acceptor: boolean\r\n protected readonly sessionState: FixSessionState\r\n protected readonly sessionLogger: IJsFixLogger\r\n protected requestLogoutType: string\r\n protected respondLogoutType: string\r\n protected requestLogonType: string\r\n\r\n protected constructor (public readonly config: IJsFixConfig) {\r\n super()\r\n const description = config.description\r\n this.me = description.application.name\r\n this.sessionState = new FixSessionState(\r\n { heartBeat: config.description.HeartBtInt,\r\n lastPeerMsgSeqNum: config.description.LastReceivedSeqNum})\r\n this.sessionLogger = config.logFactory.logger(`${this.me}:FixSession`)\r\n this.initiator = description.application.type === 'initiator'\r\n this.acceptor = !this.initiator\r\n this.checkMsgIntegrity = this.acceptor\r\n this.sessionState.compId = description.SenderCompId\r\n }\r\n\r\n public setState (state: SessionState) {\r\n if (state === this.sessionState.state) return\r\n const logger = this.sessionLogger\r\n const prevState = this.sessionState.state\r\n logger.info(`current state ${SessionState[prevState]} (${prevState}) moves to ${SessionState[state]} (${state})`)\r\n this.sessionState.state = state\r\n }\r\n\r\n public getState (): SessionState {\r\n return this.sessionState.state\r\n }\r\n\r\n public run (transport: MsgTransport): Promise<number> {\r\n const logger = this.sessionLogger\r\n if (this.transport) {\r\n logger.info('reset from previous transport.')\r\n this.reset()\r\n }\r\n this.transport = transport\r\n this.subscribe()\r\n return new Promise<any>((accept, reject) => {\r\n if (this.initiator) {\r\n logger.debug('initiator sending logon')\r\n this.send(this.requestLogonType, this.config.factory.logon())\r\n this.setState(SessionState.InitiationLogonSent)\r\n } else {\r\n logger.debug('acceptor waits for logon')\r\n this.setState(SessionState.WaitingForALogon)\r\n }\r\n\r\n this.on('error', (e: Error) => {\r\n logger.error(e)\r\n reject(e)\r\n })\r\n this.on('done', () => {\r\n accept(this.transport.id)\r\n })\r\n })\r\n }\r\n\r\n protected subscribe () {\r\n\r\n const transport = this.transport\r\n const logger = this.sessionLogger\r\n\r\n const rx = transport.receiver\r\n const tx = transport.transmitter\r\n\r\n rx.on('msg', (msgType: string, view: MsgView) => {\r\n if (this.logReceivedMsgs) {\r\n const name = view.segment.type !== SegmentType.Unknown ? view.segment.set.name : 'unknown'\r\n logger.info(`${msgType}: ${name}`)\r\n logger.info(`${view.toString()}`)\r\n }\r\n this.sessionState.lastReceivedAt = new Date()\r\n if (this.manageSession) {\r\n this.onMsg(msgType, view)\r\n } else {\r\n this.checkForwardMsg(msgType, view)\r\n }\r\n })\r\n\r\n rx.on('error', (e: Error) => {\r\n logger.warning(`rx error event: ${e.message} ${e.stack || ''}`)\r\n this.terminate(e)\r\n })\r\n\r\n rx.on('done', () => {\r\n logger.info('rx done received')\r\n this.done()\r\n })\r\n\r\n rx.on('end', () => {\r\n logger.info(`rx end received sessionState = [${this.sessionState.toString()}]`)\r\n switch (this.sessionState.state) {\r\n case SessionState.ReceiveLogout:\r\n case SessionState.Stopped:\r\n case SessionState.ConfirmingLogout: {\r\n logger.info(`rx graceful end state = ${SessionState[this.sessionState.state]}`)\r\n this.done()\r\n }\r\n break\r\n\r\n default: {\r\n const e = new Error(`unexpected state - transport failed? = ${SessionState[this.sessionState.state]}`)\r\n logger.info(`rx error ${e.message}`)\r\n this.terminate(e)\r\n }\r\n break\r\n }\r\n })\r\n\r\n rx.on('decoded', (msgType: string, data: ElasticBuffer, ptr: number) => {\r\n logger.debug(`rx: [${msgType}] ${ptr} bytes`)\r\n this.onDecoded(msgType, data.toString(ptr))\r\n })\r\n\r\n tx.on('error', (e: Error) => {\r\n logger.warning(`tx error event: ${e.message} ${e.stack || ''}`)\r\n this.terminate(e)\r\n })\r\n\r\n tx.on('encoded', (msgType: string, data: string) => {\r\n logger.debug(`tx: [${msgType}] ${data.length} bytes`)\r\n this.onEncoded(msgType, data)\r\n })\r\n }\r\n\r\n protected checkForwardMsg (msgType: string, view: MsgView): void {\r\n this.sessionLogger.info(`forwarding msgType = '${msgType}' to application`)\r\n this.onApplicationMsg(msgType, view)\r\n }\r\n\r\n protected terminate (error: Error): void {\r\n this.sessionLogger.error(error)\r\n clearInterval(this.timer)\r\n this.transport.end()\r\n this.transport = null\r\n this.sessionState.state = SessionState.Stopped\r\n this.emit('error', error)\r\n }\r\n\r\n protected peerLogout (view: MsgView) {\r\n const msg = view.getString(MsgTag.Text)\r\n switch (this.sessionState.state) {\r\n case SessionState.WaitingLogoutConfirm: {\r\n this.sessionLogger.info(`peer confirms logout Text = '${msg}'`)\r\n this.stop()\r\n break\r\n }\r\n\r\n case SessionState.InitiationLogonResponse:\r\n case SessionState.InitiationLogonReceived: {\r\n this.setState(SessionState.ConfirmingLogout)\r\n this.sessionLogger.info(`peer initiates logout Text = '${msg}'`)\r\n this.sessionLogout()\r\n }\r\n }\r\n }\r\n\r\n protected send (msgType: string, obj: ILooseObject) {\r\n switch (this.sessionState.state) {\r\n case SessionState.Stopped: {\r\n this.sessionLogger.warning(`can't send in stopped state`)\r\n break\r\n }\r\n\r\n default: {\r\n this.sessionState.LastSentAt = new Date()\r\n this.transport.transmitter.send(msgType, obj)\r\n break\r\n }\r\n }\r\n }\r\n\r\n protected sessionLogout (): void {\r\n const sessionState = this.sessionState\r\n if (sessionState.logoutSentAt) {\r\n return\r\n }\r\n const factory = this.config.factory\r\n switch (sessionState.state) {\r\n case SessionState.InitiationLogonResponse:\r\n case SessionState.InitiationLogonReceived: {\r\n // this instance initiates logout\r\n this.setState(SessionState.WaitingLogoutConfirm)\r\n sessionState.logoutSentAt = new Date()\r\n const msg = `${this.me} initiate logout`\r\n this.sessionLogger.info(msg)\r\n this.send(this.requestLogoutType, factory.logout(this.requestLogoutType,msg))\r\n break\r\n }\r\n\r\n case SessionState.ConfirmingLogout: {\r\n // this instance responds to logout\r\n sessionState.logoutSentAt = new Date()\r\n const msg = `${this.me} confirming logout`\r\n this.sessionLogger.info(msg)\r\n this.send(this.respondLogoutType, factory.logout(this.respondLogoutType,msg))\r\n break\r\n }\r\n\r\n default: {\r\n this.sessionLogger.info(`sessionLogout ignored as in state ${sessionState.state}`)\r\n }\r\n }\r\n }\r\n\r\n public done (): void {\r\n switch (this.sessionState.state) {\r\n case SessionState.InitiationLogonResponse:\r\n case SessionState.InitiationLogonReceived: {\r\n this.sessionLogout()\r\n break\r\n }\r\n\r\n case SessionState.Stopped:\r\n this.sessionLogger.info(`done. session is now stopped`)\r\n break\r\n\r\n default: {\r\n this.stop()\r\n break\r\n }\r\n }\r\n this.sessionLogger.info(`done. check logout sequence`)\r\n }\r\n\r\n public reset (): void {\r\n this.transport = null\r\n this.sessionState.reset(true) // from header def ... eventually\r\n this.setState(SessionState.NetworkConnectionEstablished)\r\n }\r\n\r\n protected stop (error: Error = null): void {\r\n if (this.sessionState.state === SessionState.Stopped) {\r\n return\r\n }\r\n clearInterval(this.timer)\r\n this.sessionLogger.info(`stop: kill transport`)\r\n this.transport.end()\r\n if (error) {\r\n this.sessionLogger.info(`stop: emit error ${error.message}`)\r\n this.emit('error', error)\r\n } else {\r\n this.emit('done')\r\n }\r\n\r\n this.setState(SessionState.Stopped)\r\n this.onStopped(error)\r\n this.transport = null\r\n }\r\n\r\n protected abstract onMsg (msgType: string, view: MsgView): void\r\n // application responsible for writing its own log\r\n protected abstract onDecoded (msgType: string, txt: string): void\r\n protected abstract onEncoded (msgType: string, txt: string): void\r\n // an application level message to be handled by implementation, unless\r\n // manageSession = false in which case all messages will be forwarded\r\n protected abstract onApplicationMsg (msgType: string, view: MsgView): void\r\n // inform application peer has logged in - provide login message\r\n protected abstract onReady (view: MsgView): void\r\n // inform application this session has now ended - either from logout or connection dropped\r\n protected abstract onStopped (error?: Error): void\r\n // does the application accept the inbound logon request\r\n protected abstract onLogon (view: MsgView, user: string, password: string): boolean\r\n}\r\n"]}
1
+ {"version":3,"file":"fix-session.js","sourceRoot":"","sources":["../../src/transport/fix-session.ts"],"names":[],"mappings":"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","sourcesContent":["import { ElasticBuffer, MsgView, SegmentType } from '../buffer'\r\nimport { IJsFixConfig, IJsFixLogger } from '../config'\r\nimport { FixSessionState, SessionState } from './fix-session-state'\r\nimport { MsgTransport } from './msg-transport'\r\nimport { MsgTag } from '../types'\r\nimport { ILooseObject } from '../collections/collection'\r\n\r\nimport * as events from 'events'\r\n\r\nexport abstract class FixSession extends events.EventEmitter {\r\n public logReceivedMsgs: boolean = false\r\n protected timer: NodeJS.Timer = null\r\n protected transport: MsgTransport = null\r\n public manageSession: boolean = true\r\n public checkMsgIntegrity: boolean = false\r\n protected readonly me: string\r\n protected readonly initiator: boolean\r\n protected readonly acceptor: boolean\r\n protected readonly sessionState: FixSessionState\r\n protected readonly sessionLogger: IJsFixLogger\r\n protected requestLogoutType: string\r\n protected respondLogoutType: string\r\n protected requestLogonType: string\r\n\r\n protected constructor (public readonly config: IJsFixConfig) {\r\n super()\r\n const description = config.description\r\n this.me = description.application.name\r\n this.sessionState = new FixSessionState(\r\n { heartBeat: config.description.HeartBtInt,\r\n lastPeerMsgSeqNum: config.description.LastReceivedSeqNum})\r\n this.sessionLogger = config.logFactory.logger(`${this.me}:FixSession`)\r\n this.initiator = description.application.type === 'initiator'\r\n this.acceptor = !this.initiator\r\n this.checkMsgIntegrity = this.acceptor\r\n this.sessionState.compId = description.SenderCompId\r\n }\r\n\r\n public setState (state: SessionState) {\r\n if (state === this.sessionState.state) return\r\n const logger = this.sessionLogger\r\n const prevState = this.sessionState.state\r\n const msg = `current state ${SessionState[prevState]} (${prevState}) moves to ${SessionState[state]} (${state})`\r\n logger.info(msg)\r\n this.sessionState.state = state\r\n }\r\n\r\n public getState (): SessionState {\r\n return this.sessionState.state\r\n }\r\n\r\n public sendLogon () {\r\n this.send(this.requestLogonType, this.config.factory.logon())\r\n }\r\n\r\n private waitPromise (): Promise<any> {\r\n const logger = this.sessionLogger\r\n return new Promise<any>((accept, reject) => {\r\n if (this.initiator) {\r\n logger.debug(`initiator sending logon state = ${this.stateString()}`)\r\n this.sendLogon()\r\n this.setState(SessionState.InitiationLogonSent)\r\n } else {\r\n logger.debug(`acceptor waits for logon state = ${this.stateString()}`)\r\n this.setState(SessionState.WaitingForALogon)\r\n }\r\n\r\n this.on('error', (e: Error) => {\r\n logger.error(e)\r\n reject(e)\r\n })\r\n\r\n this.on('done', () => {\r\n accept(this.transport.id)\r\n })\r\n })\r\n }\r\n\r\n public run (transport: MsgTransport): Promise<number> {\r\n const logger = this.sessionLogger\r\n if (this.transport) {\r\n logger.info(`reset from previous transport. state ${this.stateString()}`)\r\n this.reset()\r\n }\r\n this.transport = transport\r\n this.subscribe()\r\n return this.waitPromise()\r\n }\r\n\r\n protected expectedState (): boolean {\r\n switch (this.sessionState.state) {\r\n case SessionState.ActiveNormalSession:\r\n case SessionState.ReceiveLogout:\r\n case SessionState.Stopped:\r\n case SessionState.ConfirmingLogout:\r\n case SessionState.HandleResendRequest:\r\n case SessionState.AwaitingProcessingResponseToTestRequest:\r\n case SessionState.AwaitingProcessingResponseToResendRequest:\r\n return true\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n protected subscribe () {\r\n\r\n const transport = this.transport\r\n const logger = this.sessionLogger\r\n\r\n const rx = transport.receiver\r\n const tx = transport.transmitter\r\n\r\n rx.on('msg', (msgType: string, view: MsgView) => {\r\n if (this.logReceivedMsgs) {\r\n const name = view.segment.type !== SegmentType.Unknown ? view.segment.set.name : 'unknown'\r\n logger.info(`${msgType}: ${name}`)\r\n logger.info(`${view.toString()}`)\r\n }\r\n this.sessionState.lastReceivedAt = new Date()\r\n if (this.manageSession) {\r\n this.onMsg(msgType, view)\r\n } else {\r\n this.checkForwardMsg(msgType, view)\r\n }\r\n })\r\n\r\n rx.on('error', (e: Error) => {\r\n logger.warning(`rx error event: ${e.message} ${e.stack || ''}`)\r\n this.terminate(e)\r\n })\r\n\r\n rx.on('done', () => {\r\n logger.info('rx done received')\r\n this.done()\r\n })\r\n\r\n rx.on('end', () => {\r\n logger.info(`rx end received sessionState = [${this.sessionState.toString()}]`)\r\n const expectedState = this.expectedState()\r\n if (expectedState) {\r\n logger.info(`rx graceful end state = ${this.stateString()}`)\r\n this.done()\r\n } else {\r\n const e = new Error(`unexpected state - transport failed? = ${this.stateString()}`)\r\n logger.info(`rx error ${e.message}`)\r\n this.terminate(e)\r\n }\r\n })\r\n\r\n rx.on('decoded', (msgType: string, data: ElasticBuffer, ptr: number) => {\r\n logger.debug(`rx: [${msgType}] ${ptr} bytes`)\r\n this.onDecoded(msgType, data.toString(ptr))\r\n })\r\n\r\n tx.on('error', (e: Error) => {\r\n logger.warning(`tx error event: ${e.message} ${e.stack || ''}`)\r\n this.terminate(e)\r\n })\r\n\r\n tx.on('encoded', (msgType: string, data: string) => {\r\n logger.debug(`tx: [${msgType}] ${data.length} bytes`)\r\n this.onEncoded(msgType, data)\r\n })\r\n }\r\n\r\n protected validStateApplicationMsg (): boolean {\r\n switch (this.sessionState.state) {\r\n case SessionState.Idle:\r\n case SessionState.InitiateConnection:\r\n case SessionState.InitiationLogonSent:\r\n case SessionState.WaitingForALogon:\r\n case SessionState.HandleResendRequest:\r\n case SessionState.AwaitingProcessingResponseToTestRequest:\r\n case SessionState.AwaitingProcessingResponseToResendRequest:\r\n return false\r\n default:\r\n return true\r\n }\r\n }\r\n\r\n protected stateString (): string {\r\n return SessionState[this.sessionState.state]\r\n }\r\n\r\n protected checkForwardMsg (msgType: string, view: MsgView): void {\r\n this.sessionLogger.info(`forwarding msgType = '${msgType}' to application`)\r\n this.setState(SessionState.ActiveNormalSession)\r\n this.onApplicationMsg(msgType, view)\r\n }\r\n\r\n protected terminate (error: Error): void {\r\n if (this.sessionState.state === SessionState.Stopped) return\r\n this.sessionLogger.error(error)\r\n if (this.timer) {\r\n clearInterval(this.timer)\r\n }\r\n if (this.transport) {\r\n this.transport.end()\r\n }\r\n this.transport = null\r\n this.setState(SessionState.Stopped)\r\n this.emit('error', error)\r\n }\r\n\r\n protected peerLogout (view: MsgView) {\r\n const msg = view.getString(MsgTag.Text)\r\n const state = this.sessionState.state\r\n switch (state) {\r\n case SessionState.WaitingLogoutConfirm: {\r\n this.sessionLogger.info(`peer confirms logout Text = '${msg}'`)\r\n this.stop()\r\n break\r\n }\r\n\r\n case SessionState.InitiationLogonResponse:\r\n case SessionState.ActiveNormalSession:\r\n case SessionState.InitiationLogonReceived: {\r\n this.setState(SessionState.ConfirmingLogout)\r\n this.sessionLogger.info(`peer initiates logout Text = '${msg}'`)\r\n this.sessionLogout()\r\n }\r\n }\r\n }\r\n\r\n protected send (msgType: string, obj: ILooseObject) {\r\n const state = this.sessionState.state\r\n switch (state) {\r\n case SessionState.Stopped: {\r\n this.sessionLogger.warning(`can't send in state ${this.stateString()}`)\r\n break\r\n }\r\n\r\n default: {\r\n this.sessionState.LastSentAt = new Date()\r\n this.transport.transmitter.send(msgType, obj)\r\n break\r\n }\r\n }\r\n }\r\n\r\n protected sendLogout (msg: string) {\r\n const factory = this.config.factory\r\n this.sessionLogger.info(`sending logout with ${msg}`)\r\n this.send(this.requestLogoutType, factory.logout(this.requestLogoutType, msg))\r\n }\r\n\r\n protected sessionLogout (): void {\r\n const sessionState = this.sessionState\r\n if (sessionState.logoutSentAt) {\r\n return\r\n }\r\n\r\n switch (sessionState.state) {\r\n case SessionState.ActiveNormalSession:\r\n case SessionState.InitiationLogonResponse:\r\n case SessionState.InitiationLogonReceived: {\r\n // this instance initiates logout\r\n this.setState(SessionState.WaitingLogoutConfirm)\r\n sessionState.logoutSentAt = new Date()\r\n const msg = `${this.me} initiate logout`\r\n this.sessionLogger.info(msg)\r\n this.sendLogout(msg)\r\n break\r\n }\r\n\r\n case SessionState.ConfirmingLogout: {\r\n // this instance responds to logout\r\n sessionState.logoutSentAt = new Date()\r\n const msg = `${this.me} confirming logout`\r\n this.sessionLogger.info(msg)\r\n this.sendLogout(msg)\r\n break\r\n }\r\n\r\n default: {\r\n this.sessionLogger.info(`sessionLogout ignored as in state ${sessionState.state}`)\r\n }\r\n }\r\n }\r\n\r\n public done (): void {\r\n switch (this.sessionState.state) {\r\n case SessionState.InitiationLogonResponse:\r\n case SessionState.ActiveNormalSession:\r\n case SessionState.InitiationLogonReceived: {\r\n this.sessionLogout()\r\n break\r\n }\r\n\r\n case SessionState.Stopped:\r\n this.sessionLogger.info(`done. session is now stopped`)\r\n break\r\n\r\n default: {\r\n this.stop()\r\n break\r\n }\r\n }\r\n this.sessionLogger.info(`done. check logout sequence state ${this.stateString()}`)\r\n }\r\n\r\n public reset (): void {\r\n if (this.timer) {\r\n clearInterval(this.timer)\r\n }\r\n this.transport = null\r\n this.sessionState.reset(true) // from header def ... eventually\r\n this.setState(SessionState.NetworkConnectionEstablished)\r\n }\r\n\r\n protected stop (error: Error = null): void {\r\n if (this.sessionState.state === SessionState.Stopped) {\r\n return\r\n }\r\n if (this.timer) {\r\n clearInterval(this.timer)\r\n }\r\n this.sessionLogger.info(`stop: kill transport`)\r\n this.transport.end()\r\n if (error) {\r\n this.sessionLogger.info(`stop: emit error ${error.message}`)\r\n this.emit('error', error)\r\n } else {\r\n this.emit('done')\r\n }\r\n\r\n this.setState(SessionState.Stopped)\r\n this.onStopped(error)\r\n this.transport = null\r\n }\r\n\r\n protected abstract onMsg (msgType: string, view: MsgView): void\r\n // application responsible for writing its own log\r\n protected abstract onDecoded (msgType: string, txt: string): void\r\n protected abstract onEncoded (msgType: string, txt: string): void\r\n // an application level message to be handled by implementation, unless\r\n // manageSession = false in which case all messages will be forwarded\r\n protected abstract onApplicationMsg (msgType: string, view: MsgView): void\r\n // inform application peer has logged in - provide login message\r\n protected abstract onReady (view: MsgView): void\r\n // inform application this session has now ended - either from logout or connection dropped\r\n protected abstract onStopped (error?: Error): void\r\n // does the application accept the inbound logon request\r\n protected abstract onLogon (view: MsgView, user: string, password: string): boolean\r\n}\r\n"]}