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
@@ -16,6 +16,7 @@ const duplex_1 = require("../duplex");
16
16
  const collections_1 = require("../../collections");
17
17
  const express = require("express");
18
18
  const bodyParser = require("body-parser");
19
+ const uuid_1 = require("uuid");
19
20
  class HttpAcceptor extends fix_acceptor_1.FixAcceptor {
20
21
  constructor(config) {
21
22
  super(config.description.application);
@@ -50,11 +51,9 @@ class HttpAcceptor extends fix_acceptor_1.FixAcceptor {
50
51
  this.server.close(callback);
51
52
  }
52
53
  saveTransport(tid, transport) {
53
- const uuidv3 = require('uuid/v3');
54
54
  this.transports[tid] = transport;
55
- const app = this.config.description.application;
56
55
  const keys = Object.keys(this.transports);
57
- const a = uuidv3(app.http.uri, uuidv3.URL);
56
+ const a = uuid_1.v4();
58
57
  this.keys.addUpdate(a, transport);
59
58
  this.logger.info(`new transport id = ${tid} token = ${a} created total transports = ${keys.length}`);
60
59
  this.emit('transport', transport);
@@ -131,16 +130,16 @@ class HttpAcceptor extends fix_acceptor_1.FixAcceptor {
131
130
  const authorise = `${root}authorise`;
132
131
  const query = `${root}query`;
133
132
  this.logger.info(`uri: authorise ${authorise}, query ${query}`);
134
- router.post(authorise, (req, res) => {
133
+ router.post(authorise, (req, res) => __awaiter(this, void 0, void 0, function* () {
135
134
  if (!req.headers.authorization) {
136
135
  this.logger.info('logon');
137
- this.logon(req, res);
136
+ yield this.logon(req, res);
138
137
  }
139
138
  else {
140
139
  this.logger.info('logout');
141
- this.logout(req, res);
140
+ yield this.logout(req, res);
142
141
  }
143
- });
142
+ }));
144
143
  router.get(query, (req, res) => __awaiter(this, void 0, void 0, function* () {
145
144
  const headers = req.headers;
146
145
  const body = req.body;
@@ -155,6 +154,8 @@ class HttpAcceptor extends fix_acceptor_1.FixAcceptor {
155
154
  const d = t.duplex;
156
155
  this.respond(d, res).then(() => {
157
156
  this.logger.info(`responded to ${req.url}`);
157
+ }).catch(e => {
158
+ res.send(e);
158
159
  });
159
160
  d.readable.push(body.fixml);
160
161
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http-acceptor.js","sourceRoot":"","sources":["../../../src/transport/http/http-acceptor.ts"],"names":[],"mappings":"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","sourcesContent":["import { MsgTransport } from '../msg-transport'\r\nimport { FixAcceptor } from '../fix-acceptor'\r\nimport { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { IFixmlRequest } from '../fixml'\r\nimport { StringDuplex, FixDuplex } from '../duplex'\r\nimport { Dictionary } from '../../collections'\r\n\r\nimport * as express from 'express'\r\nimport * as bodyParser from 'body-parser'\r\nimport * as http from 'http'\r\n\r\nexport class HttpAcceptor extends FixAcceptor {\r\n private app: express.Express = express()\r\n private server: http.Server\r\n private readonly logger: IJsFixLogger\r\n private readonly router: express.Router\r\n private nextId: number = 0\r\n private keys: Dictionary<MsgTransport> = new Dictionary()\r\n\r\n constructor (public readonly config: IJsFixConfig) {\r\n super(config.description.application)\r\n this.logger = config.logFactory.logger(`${config.description.application.name}:HttpAcceptor`)\r\n this.logger.info('creating http server')\r\n this.router = express.Router()\r\n this.router.use(bodyParser.json())\r\n this.subscribe()\r\n this.app.use('/', this.router)\r\n }\r\n\r\n public listen (): void {\r\n const app = this.config.description.application\r\n const port = app.http.port\r\n const logger = this.logger\r\n logger.info(`start to listen ${port}`)\r\n this.server = this.app.listen(port, () => {\r\n logger.info(`app listening at http://localhost:${port}${app.http.uri}`)\r\n })\r\n this.server.on('error', ((err: Error) => {\r\n logger.error(err)\r\n this.emit('error', err)\r\n }))\r\n }\r\n\r\n public close (callback?: (err?: Error) => void): void {\r\n const app = this.config.description.application\r\n const port = app.http.port\r\n this.logger.info(`close listener on port ${port}`)\r\n this.server.close(callback)\r\n }\r\n\r\n private saveTransport (tid: number, transport: MsgTransport): string {\r\n const uuidv3 = require('uuid/v3')\r\n this.transports[tid] = transport\r\n const app = this.config.description.application\r\n const keys: string[] = Object.keys(this.transports)\r\n const a = uuidv3(app.http.uri, uuidv3.URL)\r\n this.keys.addUpdate(a, transport)\r\n this.logger.info(`new transport id = ${tid} token = ${a} created total transports = ${keys.length}`)\r\n this.emit('transport', transport)\r\n return a\r\n }\r\n\r\n private harvestTransport (token: string, tid: number): void {\r\n delete this.transports[tid]\r\n this.keys.remove(token)\r\n const keys: string[] = Object.keys(this.transports)\r\n this.logger.info(`transport ${tid} ends total transports = ${keys.length}`)\r\n }\r\n\r\n private respond (duplex: FixDuplex, res: express.Response, token: string = null): Promise<any> {\r\n return new Promise<any>((accept, reject) => {\r\n res.setHeader('Content-Type', 'application/json')\r\n const timer = setTimeout(() => {\r\n const businessReject = `<FIXML><BizMsgRej BizRejRsn=\"4\" Txt=\"no response from application\"/></FIXML>`\r\n const b = Buffer.from(businessReject, 'utf-8')\r\n duplex.writable.removeListener('data', transmit)\r\n res.send(b)\r\n reject(new Error('no response'))\r\n }, 5000)\r\n\r\n const transmit = (d: Buffer) => {\r\n this.logger.info('responding to request')\r\n clearTimeout(timer)\r\n if (token) {\r\n res.setHeader('authorization', token)\r\n }\r\n duplex.writable.removeListener('data', transmit)\r\n res.send(d)\r\n accept(true)\r\n }\r\n\r\n duplex.writable.on('data', transmit)\r\n })\r\n }\r\n\r\n private async logon (req: express.Request, res: express.Response) {\r\n const body: IFixmlRequest = req.body\r\n const id = this.nextId++\r\n this.logger.info(JSON.stringify(body, null,4))\r\n // check hand back session key\r\n const d = new StringDuplex()\r\n const transport = new MsgTransport(id, this.config, d)\r\n const token = this.saveTransport(id, transport)\r\n this.respond(d, res, token).then(() => {\r\n this.logger.info('responded to logon')\r\n }).catch((e: Error) => {\r\n this.logger.error(e)\r\n })\r\n d.readable.push(body.fixml)\r\n }\r\n\r\n private async logout (req: express.Request, res: express.Response) {\r\n const headers = req.headers\r\n const body: IFixmlRequest = req.body\r\n const t: MsgTransport = this.keys.get(headers.authorization)\r\n if (t) {\r\n const token = req.headers.authorization\r\n this.harvestTransport(token, t.id)\r\n const d = t.duplex\r\n this.respond(d, res, token).then(() => {\r\n this.logger.info('responded to logout')\r\n t.end()\r\n }).catch((e: Error) => {\r\n this.logger.error(e)\r\n })\r\n d.readable.push(body.fixml)\r\n }\r\n }\r\n\r\n private subscribe (): void {\r\n const router = this.router\r\n const app = this.config.description.application\r\n const root = app.http.uri\r\n const authorise = `${root}authorise`\r\n const query = `${root}query`\r\n this.logger.info(`uri: authorise ${authorise}, query ${query}`)\r\n router.post(authorise, (req: express.Request, res: express.Response) => {\r\n if (!req.headers.authorization) {\r\n this.logger.info('logon')\r\n this.logon(req, res)\r\n } else {\r\n this.logger.info('logout')\r\n this.logout(req, res)\r\n }\r\n })\r\n\r\n router.get(query, async (req: express.Request, res: express.Response) => {\r\n const headers = req.headers\r\n const body: IFixmlRequest = req.body\r\n const t: MsgTransport = this.keys.get(headers.authorization)\r\n if (!t) {\r\n this.logger.info(`received request with no token`)\r\n res.send({\r\n error: 'no key with query'\r\n })\r\n } else {\r\n const d = t.duplex\r\n this.respond(d, res).then(() => {\r\n this.logger.info(`responded to ${req.url}`)\r\n })\r\n d.readable.push(body.fixml)\r\n }\r\n })\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"http-acceptor.js","sourceRoot":"","sources":["../../../src/transport/http/http-acceptor.ts"],"names":[],"mappings":"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","sourcesContent":["import { MsgTransport } from '../msg-transport'\r\nimport { FixAcceptor } from '../fix-acceptor'\r\nimport { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { IFixmlRequest } from '../fixml'\r\nimport { StringDuplex, FixDuplex } from '../duplex'\r\nimport { Dictionary } from '../../collections'\r\n\r\nimport * as express from 'express'\r\nimport * as bodyParser from 'body-parser'\r\nimport * as http from 'http'\r\nimport { v4 as uuidv4 } from 'uuid'\r\n\r\nexport class HttpAcceptor extends FixAcceptor {\r\n private app: express.Express = express()\r\n private server: http.Server\r\n private readonly logger: IJsFixLogger\r\n private readonly router: express.Router\r\n private nextId: number = 0\r\n private keys: Dictionary<MsgTransport> = new Dictionary()\r\n\r\n constructor (public readonly config: IJsFixConfig) {\r\n super(config.description.application)\r\n this.logger = config.logFactory.logger(`${config.description.application.name}:HttpAcceptor`)\r\n this.logger.info('creating http server')\r\n this.router = express.Router()\r\n this.router.use(bodyParser.json())\r\n this.subscribe()\r\n this.app.use('/', this.router)\r\n }\r\n\r\n public listen (): void {\r\n const app = this.config.description.application\r\n const port = app.http.port\r\n const logger = this.logger\r\n logger.info(`start to listen ${port}`)\r\n this.server = this.app.listen(port, () => {\r\n logger.info(`app listening at http://localhost:${port}${app.http.uri}`)\r\n })\r\n this.server.on('error', ((err: Error) => {\r\n logger.error(err)\r\n this.emit('error', err)\r\n }))\r\n }\r\n\r\n public close (callback?: (err?: Error) => void): void {\r\n const app = this.config.description.application\r\n const port = app.http.port\r\n this.logger.info(`close listener on port ${port}`)\r\n this.server.close(callback)\r\n }\r\n\r\n private saveTransport (tid: number, transport: MsgTransport): string {\r\n this.transports[tid] = transport\r\n const keys: string[] = Object.keys(this.transports)\r\n const a = uuidv4()\r\n this.keys.addUpdate(a, transport)\r\n this.logger.info(`new transport id = ${tid} token = ${a} created total transports = ${keys.length}`)\r\n this.emit('transport', transport)\r\n return a\r\n }\r\n\r\n private harvestTransport (token: string, tid: number): void {\r\n delete this.transports[tid]\r\n this.keys.remove(token)\r\n const keys: string[] = Object.keys(this.transports)\r\n this.logger.info(`transport ${tid} ends total transports = ${keys.length}`)\r\n }\r\n\r\n private respond (duplex: FixDuplex, res: express.Response, token: string = null): Promise<any> {\r\n return new Promise<any>((accept, reject) => {\r\n res.setHeader('Content-Type', 'application/json')\r\n const timer = setTimeout(() => {\r\n const businessReject = `<FIXML><BizMsgRej BizRejRsn=\"4\" Txt=\"no response from application\"/></FIXML>`\r\n const b = Buffer.from(businessReject, 'utf-8')\r\n duplex.writable.removeListener('data', transmit)\r\n res.send(b)\r\n reject(new Error('no response'))\r\n }, 5000)\r\n\r\n const transmit = (d: Buffer) => {\r\n this.logger.info('responding to request')\r\n clearTimeout(timer)\r\n if (token) {\r\n res.setHeader('authorization', token)\r\n }\r\n duplex.writable.removeListener('data', transmit)\r\n res.send(d)\r\n accept(true)\r\n }\r\n\r\n duplex.writable.on('data', transmit)\r\n })\r\n }\r\n\r\n private async logon (req: express.Request, res: express.Response) {\r\n const body: IFixmlRequest = req.body\r\n const id = this.nextId++\r\n this.logger.info(JSON.stringify(body, null,4))\r\n // check hand back session key\r\n const d = new StringDuplex()\r\n const transport = new MsgTransport(id, this.config, d)\r\n const token = this.saveTransport(id, transport)\r\n this.respond(d, res, token).then(() => {\r\n this.logger.info('responded to logon')\r\n }).catch((e: Error) => {\r\n this.logger.error(e)\r\n })\r\n d.readable.push(body.fixml)\r\n }\r\n\r\n private async logout (req: express.Request, res: express.Response) {\r\n const headers = req.headers\r\n const body: IFixmlRequest = req.body\r\n const t: MsgTransport = this.keys.get(headers.authorization)\r\n if (t) {\r\n const token = req.headers.authorization\r\n this.harvestTransport(token, t.id)\r\n const d = t.duplex\r\n this.respond(d, res, token).then(() => {\r\n this.logger.info('responded to logout')\r\n t.end()\r\n }).catch((e: Error) => {\r\n this.logger.error(e)\r\n })\r\n d.readable.push(body.fixml)\r\n }\r\n }\r\n\r\n private subscribe (): void {\r\n const router = this.router\r\n const app = this.config.description.application\r\n const root = app.http.uri\r\n const authorise = `${root}authorise`\r\n const query = `${root}query`\r\n this.logger.info(`uri: authorise ${authorise}, query ${query}`)\r\n router.post(authorise, async (req: express.Request, res: express.Response) => {\r\n if (!req.headers.authorization) {\r\n this.logger.info('logon')\r\n await this.logon(req, res)\r\n } else {\r\n this.logger.info('logout')\r\n await this.logout(req, res)\r\n }\r\n })\r\n\r\n router.get(query, async (req: express.Request, res: express.Response) => {\r\n const headers = req.headers\r\n const body: IFixmlRequest = req.body\r\n const t: MsgTransport = this.keys.get(headers.authorization)\r\n if (!t) {\r\n this.logger.info(`received request with no token`)\r\n res.send({\r\n error: 'no key with query'\r\n })\r\n } else {\r\n const d = t.duplex\r\n this.respond(d, res).then(() => {\r\n this.logger.info(`responded to ${req.url}`)\r\n }).catch(e => {\r\n res.send(e)\r\n })\r\n d.readable.push(body.fixml)\r\n }\r\n })\r\n }\r\n}\r\n"]}
@@ -17,7 +17,7 @@ function makeConfig(description, logFactory, msgFactory) {
17
17
  return __awaiter(this, void 0, void 0, function* () {
18
18
  return new Promise((accept, reject) => __awaiter(this, void 0, void 0, function* () {
19
19
  try {
20
- const definitions = yield (0, util_1.getDefinitions)(description.application.dictionary, (t) => logFactory.logger(`${description.application.type}.${t}`));
20
+ const definitions = yield util_1.getDefinitions(description.application.dictionary, (t) => logFactory.logger(`${description.application.type}.${t}`));
21
21
  const config = new config_1.JsFixConfig(msgFactory, definitions, description, buffer_1.AsciiChars.Soh, logFactory);
22
22
  accept(config);
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"make-config.js","sourceRoot":"","sources":["../../src/transport/make-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAsC;AAGtC,sCAAyE;AAEzE,kCAAwC;AAExC,SAAsB,UAAU,CAAE,WAAgC,EAAE,UAA8B,EAAE,UAA8B;;QAChI,OAAO,IAAI,OAAO,CAAe,CAAO,MAAM,EAAE,MAAM,EAAE,EAAE;YACxD,IAAI;gBACF,MAAM,WAAW,GAAmB,MAAM,IAAA,qBAAc,EAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EACzF,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC3E,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;gBAChG,MAAM,CAAC,MAAM,CAAC,CAAA;aACf;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,CAAC,CAAC,CAAC,CAAA;aACV;QACH,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC;CAAA;AAXD,gCAWC","sourcesContent":["import { AsciiChars } from '../buffer'\r\nimport { ISessionDescription } from './session-description'\r\nimport { ISessionMsgFactory } from './fix-msg-factory'\r\nimport { IJsFixConfig, JsFixConfig, JsFixLoggerFactory } from '../config'\r\nimport { FixDefinitions } from '../dictionary'\r\nimport { getDefinitions } from '../util'\r\n\r\nexport async function makeConfig (description: ISessionDescription, logFactory: JsFixLoggerFactory, msgFactory: ISessionMsgFactory): Promise<IJsFixConfig> {\r\n return new Promise<IJsFixConfig>(async (accept, reject) => {\r\n try {\r\n const definitions: FixDefinitions = await getDefinitions(description.application.dictionary,\r\n (t: string) => logFactory.logger(`${description.application.type}.${t}`))\r\n const config = new JsFixConfig(msgFactory, definitions, description, AsciiChars.Soh, logFactory)\r\n accept(config)\r\n } catch (e) {\r\n reject(e)\r\n }\r\n })\r\n}\r\n"]}
1
+ {"version":3,"file":"make-config.js","sourceRoot":"","sources":["../../src/transport/make-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAsC;AAGtC,sCAAyE;AAEzE,kCAAwC;AAExC,SAAsB,UAAU,CAAE,WAAgC,EAAE,UAA8B,EAAE,UAA8B;;QAChI,OAAO,IAAI,OAAO,CAAe,CAAO,MAAM,EAAE,MAAM,EAAE,EAAE;YACxD,IAAI;gBACF,MAAM,WAAW,GAAmB,MAAM,qBAAc,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EACzF,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC3E,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;gBAChG,MAAM,CAAC,MAAM,CAAC,CAAA;aACf;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,CAAC,CAAC,CAAC,CAAA;aACV;QACH,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC;CAAA;AAXD,gCAWC","sourcesContent":["import { AsciiChars } from '../buffer'\r\nimport { ISessionDescription } from './session-description'\r\nimport { ISessionMsgFactory } from './fix-msg-factory'\r\nimport { IJsFixConfig, JsFixConfig, JsFixLoggerFactory } from '../config'\r\nimport { FixDefinitions } from '../dictionary'\r\nimport { getDefinitions } from '../util'\r\n\r\nexport async function makeConfig (description: ISessionDescription, logFactory: JsFixLoggerFactory, msgFactory: ISessionMsgFactory): Promise<IJsFixConfig> {\r\n return new Promise<IJsFixConfig>(async (accept, reject) => {\r\n try {\r\n const definitions: FixDefinitions = await getDefinitions(description.application.dictionary,\r\n (t: string) => logFactory.logger(`${description.application.type}.${t}`))\r\n const config = new JsFixConfig(msgFactory, definitions, description, AsciiChars.Soh, logFactory)\r\n accept(config)\r\n } catch (e) {\r\n reject(e)\r\n }\r\n })\r\n}\r\n"]}
@@ -1,6 +1,28 @@
1
- import { AsciiSessionMsgFactory, ISessionDescription, ObjectMutator } from '.';
2
- export declare class SessionMsgFactory extends AsciiSessionMsgFactory {
1
+ import { ISessionMsgFactory } from './fix-msg-factory';
2
+ import { ISessionDescription } from './session-description';
3
+ import { ILooseObject } from '../collections/collection';
4
+ import { IStandardHeader } from '../types/FIX4.4/repo';
5
+ export interface ObjectMutator {
6
+ (description: ISessionDescription, type: string, o: ILooseObject): ILooseObject;
7
+ }
8
+ export declare class SessionMsgFactory implements ISessionMsgFactory {
3
9
  readonly description: ISessionDescription;
4
10
  mutator: ObjectMutator;
11
+ isAscii: boolean;
5
12
  constructor(description: ISessionDescription, mutator?: ObjectMutator);
13
+ reject(msgType: string, seqNo: number, msg: string, reason: number): ILooseObject;
14
+ logon(userRequestId?: string, isResponse?: boolean): ILooseObject;
15
+ logout(msgType: string, text: string): ILooseObject;
16
+ testRequest(reqId?: string): ILooseObject;
17
+ heartbeat(testReqId: string): ILooseObject;
18
+ resendRequest(from: number, to: number): ILooseObject;
19
+ sequenceReset(newSeqNo: number, gapFill?: boolean): ILooseObject;
20
+ header(msgType: string, seqNum?: number, time?: Date, overrideData?: Partial<IStandardHeader>): ILooseObject;
21
+ trailer(checksum: number): ILooseObject;
22
+ private asciiLogon;
23
+ private asciiLogout;
24
+ private fixmlLogon;
25
+ private fixmlLogout;
26
+ protected asciiHeader(msgType: string, seqNum: number, time: Date, overrideData?: Partial<IStandardHeader>): ILooseObject;
27
+ private fixmlHeader;
6
28
  }
@@ -1,12 +1,152 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SessionMsgFactory = void 0;
4
- const _1 = require(".");
5
- class SessionMsgFactory extends _1.AsciiSessionMsgFactory {
4
+ const types_1 = require("../types");
5
+ const repo_1 = require("../types/FIX4.4/repo");
6
+ const FIXML50SP2_1 = require("../types/FIXML50SP2");
7
+ class SessionMsgFactory {
6
8
  constructor(description, mutator = null) {
7
- super(description, mutator);
8
9
  this.description = description;
9
10
  this.mutator = mutator;
11
+ this.isAscii = description.application.protocol === 'ascii';
12
+ }
13
+ reject(msgType, seqNo, msg, reason) {
14
+ const o = {
15
+ RefMsgType: msgType,
16
+ SessionRejectReason: reason,
17
+ RefSeqNum: seqNo,
18
+ Text: msg
19
+ };
20
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Reject, o) : o;
21
+ }
22
+ logon(userRequestId = '', isResponse = false) {
23
+ if (this.isAscii) {
24
+ return this.asciiLogon();
25
+ }
26
+ else {
27
+ return this.fixmlLogon(userRequestId, isResponse);
28
+ }
29
+ }
30
+ logout(msgType, text) {
31
+ if (this.isAscii) {
32
+ return this.asciiLogout(text);
33
+ }
34
+ else {
35
+ return this.fixmlLogout(text, msgType !== 'UserReq');
36
+ }
37
+ }
38
+ testRequest(reqId = `ping-${new Date().toUTCString()}`) {
39
+ const o = {
40
+ TestReqID: reqId
41
+ };
42
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.TestRequest, o) : o;
43
+ }
44
+ heartbeat(testReqId) {
45
+ const o = {
46
+ TestReqID: testReqId
47
+ };
48
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Heartbeat, o) : o;
49
+ }
50
+ resendRequest(from, to) {
51
+ const o = {
52
+ BeginSeqNo: from,
53
+ EndSeqNo: to
54
+ };
55
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.ResendRequest, o) : o;
56
+ }
57
+ sequenceReset(newSeqNo, gapFill) {
58
+ const o = {
59
+ GapFillFlag: gapFill === true,
60
+ NewSeqNo: newSeqNo
61
+ };
62
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.SequenceReset, o) : o;
63
+ }
64
+ header(msgType, seqNum = 0, time = new Date(), overrideData) {
65
+ if (this.isAscii) {
66
+ return this.asciiHeader(msgType, seqNum, time, overrideData);
67
+ }
68
+ else {
69
+ return this.fixmlHeader();
70
+ }
71
+ }
72
+ trailer(checksum) {
73
+ const s = checksum.toString();
74
+ const padded = s.padStart(3, '0');
75
+ return {
76
+ CheckSum: padded
77
+ };
78
+ }
79
+ asciiLogon() {
80
+ const description = this.description;
81
+ const o = {
82
+ Username: description.Username,
83
+ Password: description.Password,
84
+ HeartBtInt: description.HeartBtInt,
85
+ ResetSeqNumFlag: description.ResetSeqNumFlag,
86
+ EncryptMethod: repo_1.EncryptMethod.None
87
+ };
88
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Logon, o) : o;
89
+ }
90
+ asciiLogout(text) {
91
+ const o = {
92
+ Text: text
93
+ };
94
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Logout, o) : o;
95
+ }
96
+ fixmlLogon(userRequestId, isResponse) {
97
+ const description = this.description;
98
+ if (!isResponse) {
99
+ const o = {
100
+ Username: description.Username,
101
+ Password: description.Password,
102
+ UserRequestID: userRequestId,
103
+ UserRequestType: FIXML50SP2_1.UserRequestType.LogOnUser
104
+ };
105
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Logon, o) : o;
106
+ }
107
+ else {
108
+ const o = {
109
+ Username: description.Username,
110
+ UserRequestID: userRequestId,
111
+ UserStatus: FIXML50SP2_1.UserStatus.LoggedIn
112
+ };
113
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Logon, o) : o;
114
+ }
115
+ }
116
+ fixmlLogout(userRequestId, isResponse) {
117
+ if (!isResponse) {
118
+ const o = {
119
+ Username: this.description.Username,
120
+ UserRequestID: userRequestId,
121
+ UserRequestType: FIXML50SP2_1.UserRequestType.LogOffUser
122
+ };
123
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Logon, o) : o;
124
+ }
125
+ else {
126
+ const o = {
127
+ Username: this.description.Username,
128
+ UserRequestID: userRequestId,
129
+ UserStatus: FIXML50SP2_1.UserStatus.NotLoggedIn
130
+ };
131
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Logon, o) : o;
132
+ }
133
+ }
134
+ asciiHeader(msgType, seqNum, time, overrideData) {
135
+ const description = this.description;
136
+ const bodyLength = Math.max(4, description.BodyLengthChars || 7);
137
+ const placeHolder = Math.pow(10, bodyLength - 1) + 1;
138
+ const o = Object.assign({ BeginString: description.BeginString, BodyLength: placeHolder, MsgType: msgType, SenderCompID: description.SenderCompId, MsgSeqNum: seqNum, SendingTime: time, TargetCompID: description.TargetCompID, TargetSubID: description.TargetSubID }, overrideData);
139
+ return this.mutator ? this.mutator(description, 'StandardHeader', o) : o;
140
+ }
141
+ fixmlHeader() {
142
+ const description = this.description;
143
+ const o = {
144
+ SenderCompID: description.SenderCompId,
145
+ TargetCompID: description.TargetCompID,
146
+ SenderSubID: description.SenderSubID,
147
+ TargetSubID: description.TargetSubID
148
+ };
149
+ return this.mutator ? this.mutator(this.description, types_1.MsgType.Logon, o) : o;
10
150
  }
11
151
  }
12
152
  exports.SessionMsgFactory = SessionMsgFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"session-msg-factory.js","sourceRoot":"","sources":["../../src/transport/session-msg-factory.ts"],"names":[],"mappings":";;;AAAA,wBAA8E;AAE9E,MAAa,iBAAkB,SAAQ,yBAAsB;IAC3D,YAA6B,WAAgC,EAAS,UAAyB,IAAI;QACjG,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QADA,gBAAW,GAAX,WAAW,CAAqB;QAAS,YAAO,GAAP,OAAO,CAAsB;IAEnG,CAAC;CACF;AAJD,8CAIC","sourcesContent":["import { AsciiSessionMsgFactory, ISessionDescription, ObjectMutator } from '.'\r\n\r\nexport class SessionMsgFactory extends AsciiSessionMsgFactory {\r\n constructor (public readonly description: ISessionDescription, public mutator: ObjectMutator = null) {\r\n super(description, mutator)\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"session-msg-factory.js","sourceRoot":"","sources":["../../src/transport/session-msg-factory.ts"],"names":[],"mappings":"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","sourcesContent":["import { ISessionMsgFactory } from './fix-msg-factory'\r\nimport { ISessionDescription } from './session-description'\r\nimport { ILooseObject } from '../collections/collection'\r\nimport { MsgType } from '../types'\r\n\r\nimport {\r\n EncryptMethod,\r\n IHeartbeat,\r\n ILogon,\r\n ILogout,\r\n IReject,\r\n IResendRequest,\r\n ISequenceReset,\r\n IStandardHeader,\r\n IStandardTrailer,\r\n ITestRequest\r\n} from '../types/FIX4.4/repo'\r\n\r\nimport {\r\n IStandardHeader as IStandardHeaderFixml,\r\n IUserRequest,\r\n IUserResponse,\r\n UserRequestType,\r\n UserStatus\r\n} from '../types/FIXML50SP2'\r\n\r\nexport interface ObjectMutator { (description: ISessionDescription, type: string, o: ILooseObject): ILooseObject\r\n}\r\n\r\n\r\n\r\nexport class SessionMsgFactory implements ISessionMsgFactory {\r\n\r\n public isAscii: boolean\r\n\r\n constructor (public readonly description: ISessionDescription, public mutator: ObjectMutator = null) {\r\n this.isAscii = description.application.protocol === 'ascii'\r\n }\r\n\r\n public reject (msgType: string, seqNo: number, msg: string, reason: number): ILooseObject {\r\n const o: IReject = {\r\n RefMsgType: msgType,\r\n SessionRejectReason: reason,\r\n RefSeqNum: seqNo,\r\n Text: msg\r\n } as IReject\r\n return this.mutator ? this.mutator(this.description, MsgType.Reject, o) : o\r\n }\r\n\r\n public logon (userRequestId: string = '', isResponse: boolean = false): ILooseObject {\r\n if (this.isAscii) {\r\n return this.asciiLogon()\r\n } else {\r\n return this.fixmlLogon(userRequestId, isResponse)\r\n }\r\n }\r\n\r\n public logout (msgType: string, text: string): ILooseObject {\r\n if (this.isAscii) {\r\n return this.asciiLogout(text)\r\n } else {\r\n return this.fixmlLogout(text, msgType !== 'UserReq')\r\n }\r\n }\r\n\r\n public testRequest (reqId: string = `ping-${new Date().toUTCString()}`): ILooseObject {\r\n const o: ITestRequest = {\r\n TestReqID: reqId\r\n } as ITestRequest\r\n return this.mutator ? this.mutator(this.description, MsgType.TestRequest, o) : o\r\n }\r\n\r\n public heartbeat (testReqId: string): ILooseObject {\r\n const o: IHeartbeat = {\r\n TestReqID: testReqId\r\n } as IHeartbeat\r\n return this.mutator ? this.mutator(this.description, MsgType.Heartbeat, o) : o\r\n }\r\n\r\n public resendRequest (from: number, to: number): ILooseObject {\r\n const o: IResendRequest = {\r\n BeginSeqNo: from,\r\n EndSeqNo: to\r\n } as IResendRequest\r\n return this.mutator ? this.mutator(this.description, MsgType.ResendRequest, o) : o\r\n }\r\n\r\n public sequenceReset (newSeqNo: number, gapFill?: boolean): ILooseObject {\r\n const o: ISequenceReset = {\r\n GapFillFlag: gapFill === true,\r\n NewSeqNo: newSeqNo\r\n } as ISequenceReset\r\n return this.mutator ? this.mutator(this.description, MsgType.SequenceReset, o) : o\r\n }\r\n\r\n public header (msgType: string, seqNum: number = 0, time: Date = new Date(), overrideData?: Partial<IStandardHeader>): ILooseObject {\r\n if (this.isAscii) {\r\n return this.asciiHeader(msgType, seqNum, time, overrideData)\r\n } else {\r\n return this.fixmlHeader()\r\n }\r\n }\r\n\r\n public trailer (checksum: number): ILooseObject {\r\n const s = checksum.toString()\r\n const padded = s.padStart(3, '0')\r\n return {\r\n CheckSum: padded\r\n } as IStandardTrailer\r\n }\r\n\r\n private asciiLogon (): ILooseObject {\r\n const description = this.description\r\n const o: ILogon = {\r\n Username: description.Username,\r\n Password: description.Password,\r\n HeartBtInt: description.HeartBtInt,\r\n ResetSeqNumFlag: description.ResetSeqNumFlag,\r\n EncryptMethod: EncryptMethod.None\r\n } as ILogon\r\n return this.mutator ? this.mutator(this.description, MsgType.Logon, o) : o\r\n }\r\n\r\n private asciiLogout (text: string): ILooseObject {\r\n const o: ILogout = {\r\n Text: text\r\n } as ILogout\r\n return this.mutator ? this.mutator(this.description, MsgType.Logout, o) : o\r\n }\r\n\r\n private fixmlLogon (userRequestId: string, isResponse: boolean): ILooseObject {\r\n const description = this.description\r\n if (!isResponse) {\r\n const o: IUserRequest = {\r\n Username: description.Username,\r\n Password: description.Password,\r\n UserRequestID: userRequestId,\r\n UserRequestType: UserRequestType.LogOnUser\r\n } as IUserRequest\r\n return this.mutator ? this.mutator(this.description, MsgType.Logon, o) : o\r\n } else {\r\n const o: IUserResponse = {\r\n Username: description.Username,\r\n UserRequestID: userRequestId,\r\n UserStatus: UserStatus.LoggedIn\r\n } as IUserResponse\r\n return this.mutator ? this.mutator(this.description, MsgType.Logon, o) : o\r\n }\r\n }\r\n\r\n private fixmlLogout (userRequestId: string, isResponse: boolean): ILooseObject {\r\n if (!isResponse) {\r\n const o: IUserRequest = {\r\n Username: this.description.Username,\r\n UserRequestID: userRequestId,\r\n UserRequestType: UserRequestType.LogOffUser\r\n } as IUserRequest\r\n return this.mutator ? this.mutator(this.description, MsgType.Logon, o) : o\r\n } else {\r\n const o: IUserResponse = {\r\n Username: this.description.Username,\r\n UserRequestID: userRequestId,\r\n UserStatus: UserStatus.NotLoggedIn\r\n } as IUserResponse\r\n return this.mutator ? this.mutator(this.description, MsgType.Logon, o) : o\r\n }\r\n }\r\n\r\n protected asciiHeader (msgType: string, seqNum: number, time: Date, overrideData?: Partial<IStandardHeader>): ILooseObject {\r\n const description = this.description\r\n const bodyLength: number = Math.max(4, description.BodyLengthChars || 7)\r\n const placeHolder = Math.pow(10, bodyLength - 1) + 1\r\n const o: IStandardHeader = {\r\n BeginString: description.BeginString,\r\n BodyLength: placeHolder,\r\n MsgType: msgType,\r\n SenderCompID: description.SenderCompId,\r\n MsgSeqNum: seqNum,\r\n SendingTime: time,\r\n TargetCompID: description.TargetCompID,\r\n TargetSubID: description.TargetSubID,\r\n ...overrideData\r\n }\r\n return this.mutator ? this.mutator(description, 'StandardHeader', o) : o\r\n }\r\n\r\n private fixmlHeader (): ILooseObject {\r\n const description = this.description\r\n const o: IStandardHeaderFixml = {\r\n SenderCompID: description.SenderCompId,\r\n TargetCompID: description.TargetCompID,\r\n SenderSubID: description.SenderSubID,\r\n TargetSubID: description.TargetSubID\r\n } as IStandardHeaderFixml\r\n return this.mutator ? this.mutator(this.description, MsgType.Logon, o) : o\r\n } \r\n}\r\n"]}
@@ -0,0 +1,17 @@
1
+ /// <reference types="node" />
2
+ import { ITcpTransportDescription } from '../session-description';
3
+ import { IJsFixConfig } from '../../config';
4
+ import { InitiatorState } from './tcp-initiator';
5
+ import { MakeFixSession } from '../make-fixl-session';
6
+ import { FixSession } from '../fix-session';
7
+ import * as events from 'events';
8
+ export declare class RecoveringInitiator extends events.EventEmitter {
9
+ readonly jsFixConfig: IJsFixConfig;
10
+ readonly sessionFactory: MakeFixSession;
11
+ tcp: ITcpTransportDescription;
12
+ session: FixSession;
13
+ state: InitiatorState;
14
+ private readonly logger;
15
+ private application;
16
+ constructor(jsFixConfig: IJsFixConfig, sessionFactory: MakeFixSession);
17
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecoveringInitiator = void 0;
4
+ const tcp_initiator_1 = require("./tcp-initiator");
5
+ const events = require("events");
6
+ class RecoveringInitiator extends events.EventEmitter {
7
+ constructor(jsFixConfig, sessionFactory) {
8
+ super();
9
+ this.jsFixConfig = jsFixConfig;
10
+ this.sessionFactory = sessionFactory;
11
+ this.state = tcp_initiator_1.InitiatorState.Idle;
12
+ this.application = this.jsFixConfig.description.application;
13
+ this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`);
14
+ if (!this.application) {
15
+ const e = new Error(`no application in session description.`);
16
+ this.logger.error(e);
17
+ throw e;
18
+ }
19
+ this.tcp = this.application.tcp;
20
+ if (!this.tcp) {
21
+ const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`);
22
+ this.logger.error(e);
23
+ throw e;
24
+ }
25
+ this.logger.info('creating an application session');
26
+ this.session = sessionFactory(jsFixConfig);
27
+ }
28
+ }
29
+ exports.RecoveringInitiator = RecoveringInitiator;
30
+ //# sourceMappingURL=recovering-initiator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovering-initiator.js","sourceRoot":"","sources":["../../../src/transport/tcp/recovering-initiator.ts"],"names":[],"mappings":";;;AAEA,mDAAgD;AAGhD,iCAAgC;AAQhC,MAAa,mBAAoB,SAAQ,MAAM,CAAC,YAAY;IAO1D,YAA6B,WAAyB,EAAkB,cAA8B;QACpG,KAAK,EAAE,CAAA;QADoB,gBAAW,GAAX,WAAW,CAAc;QAAkB,mBAAc,GAAd,cAAc,CAAgB;QAJ/F,UAAK,GAAmB,8BAAc,CAAC,IAAI,CAAA;QAMhD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAA;QAC3D,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,CAAA;QACpF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,CAAC,GAAU,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;YACpE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACpB,MAAM,CAAC,CAAA;SACR;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;YAC5F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACpB,MAAM,CAAC,CAAA;SACR;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;QACnD,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;IAC5C,CAAC;CACF;AAzBD,kDAyBC","sourcesContent":["import { IMsgApplication, ITcpTransportDescription } from '../session-description'\r\nimport { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { InitiatorState } from './tcp-initiator'\r\nimport { MakeFixSession } from '../make-fixl-session'\r\nimport { FixSession } from '../fix-session'\r\nimport * as events from 'events'\r\n\r\n/*\r\n create one application session instance - and recover a lost transport. Hence the application\r\n will automatically re-connected and the \"message recovery\" policy enacted i.e. replay from\r\n last known sequence number or sequence reset.\r\n */\r\n\r\nexport class RecoveringInitiator extends events.EventEmitter {\r\n public tcp: ITcpTransportDescription\r\n public session: FixSession\r\n public state: InitiatorState = InitiatorState.Idle\r\n private readonly logger: IJsFixLogger\r\n private application: IMsgApplication\r\n\r\n constructor (public readonly jsFixConfig: IJsFixConfig, public readonly sessionFactory: MakeFixSession) {\r\n super()\r\n this.application = this.jsFixConfig.description.application\r\n this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`)\r\n if (!this.application) {\r\n const e: Error = new Error(`no application in session description.`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n this.tcp = this.application.tcp\r\n if (!this.tcp) {\r\n const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n this.logger.info('creating an application session')\r\n this.session = sessionFactory(jsFixConfig)\r\n }\r\n}\r\n"]}
@@ -0,0 +1,12 @@
1
+ import { ITcpTransportDescription } from '../session-description';
2
+ import { IJsFixConfig } from '../../config';
3
+ import { InitiatorState } from './tcp-initiator';
4
+ import { MakeFixSession } from '../make-fixl-session';
5
+ export declare class RecoveringInitiator {
6
+ readonly jsFixConfig: IJsFixConfig;
7
+ tcp: ITcpTransportDescription;
8
+ state: InitiatorState;
9
+ private readonly logger;
10
+ private application;
11
+ constructor(jsFixConfig: IJsFixConfig, sessionFactory: MakeFixSession);
12
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecoveringInitiator = void 0;
4
+ const tcp_initiator_1 = require("./tcp-initiator");
5
+ class RecoveringInitiator {
6
+ constructor(jsFixConfig, sessionFactory) {
7
+ this.jsFixConfig = jsFixConfig;
8
+ this.state = tcp_initiator_1.InitiatorState.Idle;
9
+ this.application = this.jsFixConfig.description.application;
10
+ this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`);
11
+ if (!this.application) {
12
+ const e = new Error(`no application in session description.`);
13
+ this.logger.error(e);
14
+ throw e;
15
+ }
16
+ this.tcp = this.application.tcp;
17
+ if (!this.tcp) {
18
+ const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`);
19
+ this.logger.error(e);
20
+ throw e;
21
+ }
22
+ }
23
+ }
24
+ exports.RecoveringInitiator = RecoveringInitiator;
25
+ //# sourceMappingURL=recovering_initiator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovering_initiator.js","sourceRoot":"","sources":["../../../src/transport/tcp/recovering_initiator.ts"],"names":[],"mappings":";;;AAEA,mDAAgD;AAGhD,MAAa,mBAAmB;IAK9B,YAA6B,WAAyB,EAAE,cAA8B;QAAzD,gBAAW,GAAX,WAAW,CAAc;QAH/C,UAAK,GAAmB,8BAAc,CAAC,IAAI,CAAA;QAIhD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAA;QAC3D,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,CAAA;QACpF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,CAAC,GAAU,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;YACpE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACpB,MAAM,CAAC,CAAA;SACR;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;YAC5F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACpB,MAAM,CAAC,CAAA;SACR;IACH,CAAC;CACF;AApBD,kDAoBC","sourcesContent":["import { IMsgApplication, ITcpTransportDescription } from '../session-description'\r\nimport { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { InitiatorState } from './tcp-initiator'\r\nimport { MakeFixSession } from '../make-fixl-session'\r\n\r\nexport class RecoveringInitiator {\r\n public tcp: ITcpTransportDescription\r\n public state: InitiatorState = InitiatorState.Idle\r\n private readonly logger: IJsFixLogger\r\n private application: IMsgApplication\r\n constructor (public readonly jsFixConfig: IJsFixConfig, sessionFactory: MakeFixSession) {\r\n this.application = this.jsFixConfig.description.application\r\n this.logger = jsFixConfig.logFactory.logger(`${this.application.name}:TcpInitiator`)\r\n if (!this.application) {\r\n const e: Error = new Error(`no application in session description.`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n this.tcp = this.application.tcp\r\n if (!this.tcp) {\r\n const e = new Error(`no tcp in session description need tcp { host: hostname, port: port }`)\r\n this.logger.error(e)\r\n throw e\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import * as events from 'events';
3
+ import { IJsFixConfig } from '../../config';
4
+ import { MakeFixSession } from '../make-fixl-session';
5
+ export declare class ResilientInitiator extends events.EventEmitter {
6
+ readonly jsFixConfig: IJsFixConfig;
7
+ readonly sessionFactory: MakeFixSession;
8
+ readonly reconnectTimeout: number;
9
+ private readonly logger;
10
+ constructor(jsFixConfig: IJsFixConfig, sessionFactory: MakeFixSession, reconnectTimeout?: number);
11
+ private o;
12
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ResilientInitiator = void 0;
13
+ const events = require("events");
14
+ const tcp_initiator_1 = require("./tcp-initiator");
15
+ class ResilientInitiator extends events.EventEmitter {
16
+ constructor(jsFixConfig, sessionFactory, reconnectTimeout = 0) {
17
+ super();
18
+ this.jsFixConfig = jsFixConfig;
19
+ this.sessionFactory = sessionFactory;
20
+ this.reconnectTimeout = reconnectTimeout;
21
+ this.logger = jsFixConfig.logFactory.logger(`${jsFixConfig.description.application.name}:ResilientInitiator`);
22
+ }
23
+ o(config, initiatorSession) {
24
+ return new Promise((accept, reject) => __awaiter(this, void 0, void 0, function* () {
25
+ const logger = config.logFactory.logger('initiator');
26
+ const initiator = new tcp_initiator_1.TcpInitiator(config);
27
+ logger.info('connecting ...');
28
+ const initiatorTransport = yield initiator.connect(22);
29
+ logger.info('... connected, run session');
30
+ initiatorSession.run(initiatorTransport).then(() => {
31
+ logger.info('ends');
32
+ accept(true);
33
+ }).catch((e) => {
34
+ logger.error(e);
35
+ reject(e);
36
+ });
37
+ }));
38
+ }
39
+ }
40
+ exports.ResilientInitiator = ResilientInitiator;
41
+ //# sourceMappingURL=resilient-initiator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilient-initiator.js","sourceRoot":"","sources":["../../../src/transport/tcp/resilient-initiator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iCAAgC;AAKhC,mDAA8C;AAG9C,MAAa,kBAAmB,SAAQ,MAAM,CAAC,YAAY;IAGzD,YAA6B,WAAyB,EACzB,cAA8B,EAC9B,mBAA2B,CAAC;QACvD,KAAK,EAAE,CAAA;QAHoB,gBAAW,GAAX,WAAW,CAAc;QACzB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,qBAAgB,GAAhB,gBAAgB,CAAY;QAEvD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,qBAAqB,CAAC,CAAA;IAC/G,CAAC;IAEO,CAAC,CAAE,MAAoB,EAAE,gBAA4B;QAC3D,OAAO,IAAI,OAAO,CAAM,CAAO,MAAM,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACpD,MAAM,SAAS,GAAiB,IAAI,4BAAY,CAAC,MAAM,CAAC,CAAA;YACxD,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC7B,MAAM,kBAAkB,GAAiB,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACpE,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;YACzC,gBAAgB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACnB,MAAM,CAAC,IAAI,CAAC,CAAA;YACd,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;gBACpB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACf,MAAM,CAAC,CAAC,CAAC,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC;CACF;AA1BD,gDA0BC","sourcesContent":["import * as events from 'events'\r\nimport { IJsFixConfig, IJsFixLogger } from '../../config'\r\nimport { MakeFixSession } from '../make-fixl-session'\r\nimport { FixSession } from '../fix-session'\r\nimport { FixInitiator } from '../fix-initiator'\r\nimport { TcpInitiator } from './tcp-initiator'\r\nimport { MsgTransport } from '../msg-transport'\r\n\r\nexport class ResilientInitiator extends events.EventEmitter {\r\n private readonly logger: IJsFixLogger\r\n\r\n constructor (public readonly jsFixConfig: IJsFixConfig,\r\n public readonly sessionFactory: MakeFixSession,\r\n public readonly reconnectTimeout: number = 0) {\r\n super()\r\n this.logger = jsFixConfig.logFactory.logger(`${jsFixConfig.description.application.name}:ResilientInitiator`)\r\n }\r\n\r\n private o (config: IJsFixConfig, initiatorSession: FixSession): Promise<any> {\r\n return new Promise<any>(async (accept, reject) => {\r\n const logger = config.logFactory.logger('initiator')\r\n const initiator: FixInitiator = new TcpInitiator(config)\r\n logger.info('connecting ...')\r\n const initiatorTransport: MsgTransport = await initiator.connect(22)\r\n logger.info('... connected, run session')\r\n initiatorSession.run(initiatorTransport).then(() => {\r\n logger.info('ends')\r\n accept(true)\r\n }).catch((e: Error) => {\r\n logger.error(e)\r\n reject(e)\r\n })\r\n })\r\n }\r\n}\r\n"]}
@@ -1,10 +1,17 @@
1
+ /// <reference types="node" />
1
2
  import { FixAcceptor } from '../fix-acceptor';
2
3
  import { IJsFixConfig } from '../../config';
4
+ import { TlsOptions } from 'tls';
3
5
  export declare class TcpAcceptor extends FixAcceptor {
4
6
  readonly config: IJsFixConfig;
5
7
  private server;
6
8
  private logger;
9
+ private nextId;
7
10
  constructor(config: IJsFixConfig);
11
+ getId(): number;
12
+ tlsServer(): void;
13
+ unsecureServer(): void;
14
+ tlsOptions(): TlsOptions;
8
15
  private onSocket;
9
16
  listen(): void;
10
17
  close(callback?: (err?: Error) => void): void;