jspurefix 3.5.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/appveyor.yml +1 -1
  2. package/dist/buffer/ascii/ascii-encoder.d.ts +2 -2
  3. package/dist/buffer/ascii/ascii-encoder.js +1 -1
  4. package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
  5. package/dist/buffer/ascii/ascii-parser-state.d.ts +3 -2
  6. package/dist/buffer/ascii/ascii-parser-state.js +1 -2
  7. package/dist/buffer/ascii/ascii-parser-state.js.map +1 -1
  8. package/dist/buffer/ascii/ascii-parser.d.ts +1 -1
  9. package/dist/buffer/ascii/ascii-parser.js +5 -4
  10. package/dist/buffer/ascii/ascii-parser.js.map +1 -1
  11. package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
  12. package/dist/buffer/ascii/ascii-view.d.ts +4 -3
  13. package/dist/buffer/ascii/ascii-view.js +8 -5
  14. package/dist/buffer/ascii/ascii-view.js.map +1 -1
  15. package/dist/buffer/encode-proxy.js +1 -1
  16. package/dist/buffer/encode-proxy.js.map +1 -1
  17. package/dist/buffer/fixml/fixml-encoder.d.ts +2 -2
  18. package/dist/buffer/fixml/fixml-encoder.js +1 -1
  19. package/dist/buffer/fixml/fixml-encoder.js.map +1 -1
  20. package/dist/buffer/fixml/fixml-parser.js +2 -2
  21. package/dist/buffer/fixml/fixml-parser.js.map +1 -1
  22. package/dist/buffer/fixml/fixml-view.d.ts +3 -2
  23. package/dist/buffer/fixml/fixml-view.js +5 -4
  24. package/dist/buffer/fixml/fixml-view.js.map +1 -1
  25. package/dist/buffer/msg-encoder.d.ts +2 -2
  26. package/dist/buffer/msg-encoder.js.map +1 -1
  27. package/dist/buffer/msg-view.d.ts +8 -6
  28. package/dist/buffer/msg-view.js +10 -8
  29. package/dist/buffer/msg-view.js.map +1 -1
  30. package/dist/buffer/segment/segment-description.d.ts +3 -3
  31. package/dist/buffer/segment/segment-description.js.map +1 -1
  32. package/dist/buffer/tag/tags.d.ts +2 -5
  33. package/dist/buffer/tag/tags.js +4 -5
  34. package/dist/buffer/tag/tags.js.map +1 -1
  35. package/dist/collections/collection.d.ts +0 -1
  36. package/dist/collections/collection.js.map +1 -1
  37. package/dist/collections/index.d.ts +0 -1
  38. package/dist/collections/index.js +0 -17
  39. package/dist/collections/index.js.map +1 -1
  40. package/dist/config/js-fix-config.d.ts +2 -1
  41. package/dist/config/js-fix-config.js +3 -3
  42. package/dist/config/js-fix-config.js.map +1 -1
  43. package/dist/dictionary/compiler/compiler-type.d.ts +3 -3
  44. package/dist/dictionary/compiler/compiler-type.js.map +1 -1
  45. package/dist/dictionary/compiler/enum-compiler.js +2 -2
  46. package/dist/dictionary/compiler/enum-compiler.js.map +1 -1
  47. package/dist/dictionary/compiler/msg-compiler.d.ts +1 -2
  48. package/dist/dictionary/compiler/msg-compiler.js +6 -7
  49. package/dist/dictionary/compiler/msg-compiler.js.map +1 -1
  50. package/dist/dictionary/contained/contained-component-field.d.ts +1 -1
  51. package/dist/dictionary/contained/contained-component-field.js.map +1 -1
  52. package/dist/dictionary/contained/contained-field-set.d.ts +9 -20
  53. package/dist/dictionary/contained/contained-field-set.js +16 -149
  54. package/dist/dictionary/contained/contained-field-set.js.map +1 -1
  55. package/dist/dictionary/contained/contained-group-field.d.ts +1 -1
  56. package/dist/dictionary/contained/contained-group-field.js.map +1 -1
  57. package/dist/dictionary/contained/contained-set-builder.d.ts +15 -0
  58. package/dist/dictionary/contained/contained-set-builder.js +142 -0
  59. package/dist/dictionary/contained/contained-set-builder.js.map +1 -0
  60. package/dist/dictionary/contained/contained-set.d.ts +32 -0
  61. package/dist/{types/FIX.5.0SP2/quickfix/xm_lnon_fix.js → dictionary/contained/contained-set.js} +1 -1
  62. package/dist/dictionary/contained/contained-set.js.map +1 -0
  63. package/dist/dictionary/contained/contained-simple-field.d.ts +1 -1
  64. package/dist/dictionary/contained/contained-simple-field.js.map +1 -1
  65. package/dist/dictionary/contained/index.d.ts +4 -1
  66. package/dist/dictionary/contained/index.js +4 -1
  67. package/dist/dictionary/contained/index.js.map +1 -1
  68. package/dist/dictionary/definition/category-simple-set.d.ts +1 -2
  69. package/dist/dictionary/definition/category-simple-set.js +1 -2
  70. package/dist/dictionary/definition/category-simple-set.js.map +1 -1
  71. package/dist/dictionary/definition/component-field-definition.d.ts +1 -1
  72. package/dist/dictionary/definition/component-field-definition.js +2 -2
  73. package/dist/dictionary/definition/component-field-definition.js.map +1 -1
  74. package/dist/dictionary/definition/fix-definitions.d.ts +8 -9
  75. package/dist/dictionary/definition/fix-definitions.js +22 -20
  76. package/dist/dictionary/definition/fix-definitions.js.map +1 -1
  77. package/dist/dictionary/definition/group-field-definition.d.ts +1 -1
  78. package/dist/dictionary/definition/group-field-definition.js +2 -2
  79. package/dist/dictionary/definition/group-field-definition.js.map +1 -1
  80. package/dist/dictionary/definition/message-definition.d.ts +1 -1
  81. package/dist/dictionary/definition/message-definition.js +2 -2
  82. package/dist/dictionary/definition/message-definition.js.map +1 -1
  83. package/dist/dictionary/definition/simple-field-definition.d.ts +2 -3
  84. package/dist/dictionary/definition/simple-field-definition.js +6 -7
  85. package/dist/dictionary/definition/simple-field-definition.js.map +1 -1
  86. package/dist/dictionary/parser/fix-repository/repository.js +20 -20
  87. package/dist/dictionary/parser/fix-repository/repository.js.map +1 -1
  88. package/dist/dictionary/parser/fixml/components-parser.js +18 -16
  89. package/dist/dictionary/parser/fixml/components-parser.js.map +1 -1
  90. package/dist/dictionary/parser/fixml/fields-parser.js +2 -3
  91. package/dist/dictionary/parser/fixml/fields-parser.js.map +1 -1
  92. package/dist/dictionary/parser/fixml/include-graph.js +8 -9
  93. package/dist/dictionary/parser/fixml/include-graph.js.map +1 -1
  94. package/dist/dictionary/parser/quickfix/field-definition-parser.js.map +1 -1
  95. package/dist/dictionary/parser/quickfix/message-parser.js +2 -1
  96. package/dist/dictionary/parser/quickfix/message-parser.js.map +1 -1
  97. package/dist/dictionary/parser/quickfix/node-parser.js +3 -2
  98. package/dist/dictionary/parser/quickfix/node-parser.js.map +1 -1
  99. package/dist/dictionary/parser/quickfix/parse-context.d.ts +3 -3
  100. package/dist/dictionary/parser/quickfix/parse-context.js.map +1 -1
  101. package/dist/dictionary/parser/quickfix/parse-progress.d.ts +1 -2
  102. package/dist/dictionary/parser/quickfix/parse-progress.js +2 -3
  103. package/dist/dictionary/parser/quickfix/parse-progress.js.map +1 -1
  104. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-builder.js +4 -5
  105. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-builder.js.map +1 -1
  106. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js +6 -6
  107. package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js.map +1 -1
  108. package/dist/dictionary/parser/quickfix/quick-fix-xml-formatter.d.ts +1 -1
  109. package/dist/dictionary/parser/quickfix/quick-fix-xml-formatter.js.map +1 -1
  110. package/dist/dictionary/set-reduce.d.ts +2 -2
  111. package/dist/dictionary/set-reduce.js.map +1 -1
  112. package/dist/index.d.ts +0 -1
  113. package/dist/index.js +0 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/jsfix-cmd.js +4 -5
  116. package/dist/jsfix-cmd.js.map +1 -1
  117. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js +7 -8
  118. package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js.map +1 -1
  119. package/dist/sample/tcp/trade-capture/trade-capture-client.js +3 -4
  120. package/dist/sample/tcp/trade-capture/trade-capture-client.js.map +1 -1
  121. package/dist/sample/tcp/trade-capture/trade-capture-server.js.map +1 -1
  122. package/dist/store/fix-msg-memory-store.js +3 -4
  123. package/dist/store/fix-msg-memory-store.js.map +1 -1
  124. package/dist/store/fix-msg-store-record.js.map +1 -1
  125. package/dist/test/ascii/ascii-encoder.test.js.map +1 -1
  126. package/dist/test/ascii/fix-log-replay.test.js.map +1 -1
  127. package/dist/test/ascii/fix-repo-dict.test.js.map +1 -1
  128. package/dist/test/ascii/qf-50sp0-dict.test.js +7 -7
  129. package/dist/test/ascii/qf-50sp0-dict.test.js.map +1 -1
  130. package/dist/test/ascii/qf-50sp2-dict.test.js +5 -2
  131. package/dist/test/ascii/qf-50sp2-dict.test.js.map +1 -1
  132. package/dist/test/env/encoder-test.d.ts +3 -3
  133. package/dist/test/env/encoder-test.js.map +1 -1
  134. package/dist/test/env/set-constraint-helper.d.ts +4 -4
  135. package/dist/test/env/set-constraint-helper.js.map +1 -1
  136. package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
  137. package/dist/transport/ascii/ascii-session.js +1 -1
  138. package/dist/transport/ascii/ascii-session.js.map +1 -1
  139. package/dist/transport/fixml/fixml-session.js.map +1 -1
  140. package/dist/transport/http/http-acceptor.js +3 -4
  141. package/dist/transport/http/http-acceptor.js.map +1 -1
  142. package/dist/transport/http/http-json-sample-adapter.js +3 -4
  143. package/dist/transport/http/http-json-sample-adapter.js.map +1 -1
  144. package/dist/transport/session/dynamic-session-manager.d.ts +8 -0
  145. package/dist/transport/session/dynamic-session-manager.js +15 -0
  146. package/dist/transport/session/dynamic-session-manager.js.map +1 -0
  147. package/dist/transport/session/session-description.d.ts +9 -7
  148. package/dist/transport/session/session-description.js.map +1 -1
  149. package/dist/util/json-helper.d.ts +2 -2
  150. package/dist/util/json-helper.js.map +1 -1
  151. package/dist/util/message-generator.js +1 -1
  152. package/dist/util/message-generator.js.map +1 -1
  153. package/package.json +16 -16
  154. package/src/buffer/ascii/ascii-encoder.ts +7 -7
  155. package/src/buffer/ascii/ascii-parser-state.ts +4 -4
  156. package/src/buffer/ascii/ascii-parser.ts +6 -5
  157. package/src/buffer/ascii/ascii-segment-parser.ts +2 -2
  158. package/src/buffer/ascii/ascii-view.ts +9 -7
  159. package/src/buffer/encode-proxy.ts +9 -9
  160. package/src/buffer/fixml/fixml-encoder.ts +14 -10
  161. package/src/buffer/fixml/fixml-parser.ts +5 -5
  162. package/src/buffer/fixml/fixml-view.ts +5 -5
  163. package/src/buffer/msg-encoder.ts +3 -3
  164. package/src/buffer/msg-view.ts +18 -18
  165. package/src/buffer/segment/segment-description.ts +2 -2
  166. package/src/buffer/tag/tags.ts +4 -6
  167. package/src/collections/collection.ts +0 -1
  168. package/src/collections/index.ts +1 -1
  169. package/src/config/js-fix-config.ts +3 -2
  170. package/src/dictionary/compiler/compiler-type.ts +8 -2
  171. package/src/dictionary/compiler/enum-compiler.ts +2 -2
  172. package/src/dictionary/compiler/msg-compiler.ts +11 -12
  173. package/src/dictionary/contained/contained-component-field.ts +1 -1
  174. package/src/dictionary/contained/contained-field-set.ts +21 -176
  175. package/src/dictionary/contained/contained-group-field.ts +1 -1
  176. package/src/dictionary/contained/contained-set-builder.ts +164 -0
  177. package/src/dictionary/contained/contained-set.ts +83 -0
  178. package/src/dictionary/contained/contained-simple-field.ts +1 -1
  179. package/src/dictionary/contained/index.ts +4 -1
  180. package/src/dictionary/definition/category-simple-set.ts +1 -2
  181. package/src/dictionary/definition/component-field-definition.ts +1 -1
  182. package/src/dictionary/definition/fix-definitions.ts +28 -26
  183. package/src/dictionary/definition/group-field-definition.ts +1 -1
  184. package/src/dictionary/definition/message-definition.ts +6 -6
  185. package/src/dictionary/definition/simple-field-definition.ts +9 -10
  186. package/src/dictionary/parser/fix-repository/repository.ts +47 -40
  187. package/src/dictionary/parser/fixml/components-parser.ts +41 -38
  188. package/src/dictionary/parser/fixml/fields-parser.ts +3 -4
  189. package/src/dictionary/parser/fixml/include-graph.ts +13 -14
  190. package/src/dictionary/parser/quickfix/field-definition-parser.ts +5 -5
  191. package/src/dictionary/parser/quickfix/message-parser.ts +7 -5
  192. package/src/dictionary/parser/quickfix/node-parser.ts +13 -6
  193. package/src/dictionary/parser/quickfix/parse-context.ts +2 -2
  194. package/src/dictionary/parser/quickfix/parse-progress.ts +2 -3
  195. package/src/dictionary/parser/quickfix/quick-fix-xml-file-builder.ts +4 -5
  196. package/src/dictionary/parser/quickfix/quick-fix-xml-file-parser.ts +10 -12
  197. package/src/dictionary/parser/quickfix/quick-fix-xml-formatter.ts +1 -1
  198. package/src/dictionary/set-reduce.ts +3 -3
  199. package/src/index.ts +0 -1
  200. package/src/jsfix-cmd.ts +5 -6
  201. package/src/sample/tcp/recovering-skeleton/respawn-acceptor.ts +7 -8
  202. package/src/sample/tcp/trade-capture/trade-capture-client.ts +4 -5
  203. package/src/sample/tcp/trade-capture/trade-capture-server.ts +1 -1
  204. package/src/store/fix-msg-memory-store.ts +3 -4
  205. package/src/store/fix-msg-store-record.ts +1 -1
  206. package/src/transport/ascii/ascii-msg-transmitter.ts +6 -6
  207. package/src/transport/ascii/ascii-session.ts +6 -6
  208. package/src/transport/fixml/fixml-session.ts +3 -3
  209. package/src/transport/http/http-acceptor.ts +4 -5
  210. package/src/transport/http/http-json-sample-adapter.ts +3 -4
  211. package/src/transport/session/dynamic-session-manager.ts +16 -0
  212. package/src/transport/session/session-description.ts +10 -7
  213. package/src/util/json-helper.ts +3 -3
  214. package/src/util/message-generator.ts +4 -4
  215. package/dist/collections/dictionary.d.ts +0 -15
  216. package/dist/collections/dictionary.js +0 -57
  217. package/dist/collections/dictionary.js.map +0 -1
  218. package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.d.ts +0 -31
  219. package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.js +0 -3
  220. package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.js.map +0 -1
  221. package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.d.ts +0 -26
  222. package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.js +0 -3
  223. package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.js.map +0 -1
  224. package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.d.ts +0 -5
  225. package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.js +0 -3
  226. package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.js.map +0 -1
  227. package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.d.ts +0 -8
  228. package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.js +0 -3
  229. package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.js.map +0 -1
  230. package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.d.ts +0 -4
  231. package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.js +0 -3
  232. package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.js.map +0 -1
  233. package/dist/types/FIX.5.0SP2/quickfix/xm_lnon_fix.d.ts +0 -6
  234. package/dist/types/FIX.5.0SP2/quickfix/xm_lnon_fix.js.map +0 -1
  235. package/src/collections/dictionary.ts +0 -62
@@ -3,7 +3,7 @@ import { FixDefinitions, MessageDefinition, SimpleFieldDefinition } from '../dic
3
3
  import {
4
4
  ContainedComponentField,
5
5
  ContainedField,
6
- ContainedFieldSet,
6
+ IContainedSet,
7
7
  ContainedFieldType,
8
8
  ContainedGroupField,
9
9
  ContainedSimpleField
@@ -17,7 +17,7 @@ export class EncodeProxy {
17
17
  private static SimpleFieldCheck (field: ContainedSimpleField, val: any): void {
18
18
  const definition: SimpleFieldDefinition = field.definition
19
19
  if (definition.isEnum()) {
20
- const resolved: boolean = definition.containsEnum(val)
20
+ const resolved: boolean = definition.containsEnum(String(val))
21
21
  if (!resolved) {
22
22
  throw new Error(`enum field ${field.name} does not support "${val}"`)
23
23
  }
@@ -59,7 +59,7 @@ export class EncodeProxy {
59
59
  case TagType.Int:
60
60
  case TagType.Float:
61
61
  case TagType.Length: {
62
- if (isNaN(val)) {
62
+ if (isNaN(val as number)) {
63
63
  throw new Error(`field ${field.name} expects number but receives "${typeof val}"`)
64
64
  }
65
65
  break
@@ -80,17 +80,17 @@ export class EncodeProxy {
80
80
  if (!isComplex) {
81
81
  throw new Error(`type ${field.name} is a component but is given type "${typeof val}"`)
82
82
  }
83
- return EncodeProxy.checkProperties(new Proxy({}, EncodeProxy.handler(field.definition)), val)
83
+ return EncodeProxy.checkProperties(new Proxy({}, EncodeProxy.handler(field.definition)), val as ILooseObject)
84
84
  }
85
85
 
86
86
  private static GroupFieldCheck (field: ContainedGroupField, val: any): object {
87
- const accepted: boolean = Array.isArray(val) || !isNaN(val)
87
+ const accepted: boolean = Array.isArray(val) || !isNaN(val as number)
88
88
  if (!accepted) {
89
89
  throw new Error(`type ${field.name} is a group and needs array or number, not "${typeof val}"`)
90
90
  }
91
91
  const gf: ContainedComponentField = field as ContainedComponentField
92
92
  const j: number = val
93
- const isNumber: boolean = !isNaN(val)
93
+ const isNumber: boolean = !isNaN(val as number)
94
94
  if (isNumber) {
95
95
  const arr: ILooseObject[] = new Array(j)
96
96
  for (let i: number = 0; i < j; ++i) {
@@ -106,10 +106,10 @@ export class EncodeProxy {
106
106
  }
107
107
  }
108
108
 
109
- private static handler (set: ContainedFieldSet): Object {
109
+ private static handler (set: IContainedSet): Object {
110
110
  return {
111
111
  set (target: ILooseObject, prop: string, val: any): boolean {
112
- const field: ContainedField | null = set.localNameToField.get(prop)
112
+ const field: ContainedField | undefined = set.localNameToField.get(prop)
113
113
  if (!field) {
114
114
  throw new Error(`type ${set.name} has no field named ${prop}`)
115
115
  }
@@ -140,7 +140,7 @@ export class EncodeProxy {
140
140
  }
141
141
 
142
142
  public wrap (msgName: string): ILooseObject {
143
- const msg: MessageDefinition | null = this.definitions.message.get(msgName)
143
+ const msg: MessageDefinition | undefined = this.definitions.message.get(msgName)
144
144
  if (!msg) {
145
145
  throw new Error(`no message defined for type ${msgName}`)
146
146
  }
@@ -1,7 +1,11 @@
1
1
  import { ILooseObject } from '../../collections/collection'
2
2
  import {
3
- ContainedFieldSet, ContainedField, ContainedGroupField,
4
- ContainedComponentField, ContainedSimpleField, FieldsDispatch
3
+ IContainedSet,
4
+ ContainedField,
5
+ ContainedGroupField,
6
+ ContainedComponentField,
7
+ ContainedSimpleField,
8
+ FieldsDispatch
5
9
  } from '../../dictionary/contained'
6
10
  import { AsciiChars } from '../ascii'
7
11
  import { MsgEncoder } from '../msg-encoder'
@@ -66,7 +70,7 @@ export class FixmlEncoder extends MsgEncoder {
66
70
  return ''
67
71
  }
68
72
 
69
- public encodeSet (o: ILooseObject, set: ContainedFieldSet): void {
73
+ public encodeSet (o: ILooseObject, set: IContainedSet): void {
70
74
  const batch: ILooseObject[] = o.Batch
71
75
  const toWrite: ILooseObject[] = batch || [o]
72
76
  const depth = batch ? 1 : 0
@@ -91,11 +95,11 @@ export class FixmlEncoder extends MsgEncoder {
91
95
  buffer.writeString(this.endDoc)
92
96
  }
93
97
 
94
- private batchStart (o: ILooseObject, set: ContainedFieldSet, depth: number): void {
98
+ private batchStart (o: ILooseObject, set: IContainedSet, depth: number): void {
95
99
  const buffer = this.buffer
96
100
  const indent: string = '\t'
97
101
  const beginBatch = this.beginBatch
98
- const hdr = o.StandardHeader
102
+ const hdr: ILooseObject = o.StandardHeader
99
103
  const eol = this.eol
100
104
  buffer.writeString(`${indent}${beginBatch}`)
101
105
  if (hdr) {
@@ -105,7 +109,7 @@ export class FixmlEncoder extends MsgEncoder {
105
109
  }
106
110
  }
107
111
 
108
- private toXml (o: ILooseObject, name: string, set: ContainedFieldSet, depth: number): void {
112
+ private toXml (o: ILooseObject, name: string, set: IContainedSet, depth: number): void {
109
113
  const buffer = this.buffer
110
114
  const selfClose: string = '/>'
111
115
  const close: string = '>'
@@ -128,11 +132,11 @@ export class FixmlEncoder extends MsgEncoder {
128
132
  }
129
133
  }
130
134
 
131
- private getPopulatedFields (set: ContainedFieldSet, o: ILooseObject): ContainedField[] {
135
+ private getPopulatedFields (set: IContainedSet, o: ILooseObject): ContainedField[] {
132
136
  const keys: string[] = Object.keys(o)
133
137
  const fields: ContainedField[] = keys.reduce((a: ContainedField[], current: string) => {
134
- const field: ContainedField | null = set.localNameToField.get(current)
135
- if (field && !set.nameToLocalAttribute.containsKey(current)) {
138
+ const field: ContainedField | undefined = set.localNameToField.get(current)
139
+ if (field && !set.nameToLocalAttribute.has(current)) {
136
140
  a.push(field)
137
141
  }
138
142
  return a
@@ -153,7 +157,7 @@ export class FixmlEncoder extends MsgEncoder {
153
157
  buffer.writeChar(AsciiChars.Dq)
154
158
  }
155
159
 
156
- private attributes (o: ILooseObject, set: ContainedFieldSet, depth: number, attributePerLine: boolean): void {
160
+ private attributes (o: ILooseObject, set: IContainedSet, depth: number, attributePerLine: boolean): void {
157
161
  const newLine = this.eol
158
162
  const indent: string = '\t'.repeat(depth + 1)
159
163
  const attributes = set.localAttribute
@@ -5,7 +5,7 @@ import { FixDefinitions, MessageDefinition } from '../../dictionary/definition'
5
5
  import {
6
6
  ContainedField, ContainedComponentField,
7
7
  ContainedFieldType, ContainedGroupField,
8
- ContainedSimpleField, ContainedFieldSet
8
+ ContainedSimpleField, IContainedSet
9
9
  } from '../../dictionary/contained'
10
10
  import { SegmentDescription } from '../segment/segment-description'
11
11
  import { IJsFixConfig, IJsFixLogger } from '../../config'
@@ -39,7 +39,7 @@ export class FiXmlParser extends MsgParser {
39
39
  const me = description?.application?.name
40
40
  this.logger = config.logFactory.logger(`${me}:FiXmlParser`)
41
41
  this.saxStream = require('sax').createStream(true, {})
42
- this.locations = new Tags(this.definitions, maxMessageLocations)
42
+ this.locations = new Tags(maxMessageLocations)
43
43
  this.logger.info('subscribe to stream')
44
44
  this.subscribe()
45
45
  }
@@ -180,7 +180,7 @@ export class FiXmlParser extends MsgParser {
180
180
  private getView (): MsgView {
181
181
  const structure: Structure = new Structure(this.locations, this.segments)
182
182
  const last = structure.segments[structure.segments.length - 1]
183
- return new FixmlView(last, this.values, structure)
183
+ return new FixmlView(this.definitions, last, this.values, structure)
184
184
  }
185
185
 
186
186
  private pop (name: string): SegmentDescription | null {
@@ -333,7 +333,7 @@ export class FiXmlParser extends MsgParser {
333
333
  private msg (saxNode: ISaxNode, inBatch: boolean = false): void {
334
334
  this.logger.debug(`${saxNode.name}: begin parse msg`)
335
335
  const type: string = saxNode.name
336
- const def: MessageDefinition | null = this.definitions.message.get(type)
336
+ const def: MessageDefinition | undefined = this.definitions.message.get(type)
337
337
  if (!def) {
338
338
  throw new Error(`unknown message type ${type}`)
339
339
  }
@@ -347,7 +347,7 @@ export class FiXmlParser extends MsgParser {
347
347
  }
348
348
  }
349
349
 
350
- private parseAttributes (name: string, set: ContainedFieldSet, saxNode: ISaxNode, type: SegmentType): SegmentDescription | null {
350
+ private parseAttributes (name: string, set: IContainedSet, saxNode: ISaxNode, type: SegmentType): SegmentDescription | null {
351
351
  const locations = this.locations
352
352
  const attributes = saxNode.attributes
353
353
  const values = this.values
@@ -1,5 +1,5 @@
1
1
  import { MsgView } from '../msg-view'
2
- import { SimpleFieldDefinition } from '../../dictionary/definition'
2
+ import { FixDefinitions, SimpleFieldDefinition } from '../../dictionary/definition'
3
3
  import { Structure } from '../structure'
4
4
  import { SegmentDescription } from '../segment/segment-description'
5
5
  import { AsciiChars } from '../ascii/'
@@ -7,10 +7,10 @@ import * as moment from 'moment'
7
7
  import { TagType } from '../tag/tag-type'
8
8
 
9
9
  export class FixmlView extends MsgView {
10
- constructor (public readonly segment: SegmentDescription,
10
+ constructor (public definitions: FixDefinitions, public readonly segment: SegmentDescription,
11
11
  public readonly values: string[],
12
12
  public readonly structure: Structure) {
13
- super(segment, structure)
13
+ super(definitions, segment, structure)
14
14
  }
15
15
 
16
16
  private static getTimestamp (s: string, useUtc: boolean): Date {
@@ -37,7 +37,7 @@ export class FixmlView extends MsgView {
37
37
 
38
38
  // if the view is to be kept beyond the event on which it arrives, must be cloned
39
39
  public clone (): MsgView {
40
- return new FixmlView(this.segment, this.values, new Structure(this.structure.tags.clone(), this.structure.segments))
40
+ return new FixmlView(this.definitions, this.segment, this.values, new Structure(this.structure.tags.clone(), this.structure.segments))
41
41
  }
42
42
 
43
43
  public checksum (): number {
@@ -45,7 +45,7 @@ export class FixmlView extends MsgView {
45
45
  }
46
46
 
47
47
  protected create (singleton: SegmentDescription): FixmlView {
48
- return new FixmlView(singleton,
48
+ return new FixmlView(this.definitions, singleton,
49
49
  this.values,
50
50
  this.structure)
51
51
  }
@@ -1,6 +1,6 @@
1
1
  import { ILooseObject } from '../collections/collection'
2
2
  import { FixDefinitions } from '../dictionary/definition'
3
- import { ContainedFieldSet } from '../dictionary/contained'
3
+ import { IContainedSet } from '../dictionary/contained'
4
4
  import * as events from 'events'
5
5
 
6
6
  export abstract class MsgEncoder extends events.EventEmitter {
@@ -9,7 +9,7 @@ export abstract class MsgEncoder extends events.EventEmitter {
9
9
  }
10
10
 
11
11
  public encode (o: ILooseObject, name: string): void {
12
- const set: ContainedFieldSet | null = this.definitions.message.get(name) ??
12
+ const set: IContainedSet | undefined = this.definitions.message.get(name) ??
13
13
  this.definitions.component.get(name)
14
14
  if (!set) {
15
15
  return
@@ -19,5 +19,5 @@ export abstract class MsgEncoder extends events.EventEmitter {
19
19
 
20
20
  public abstract reset (): void
21
21
  public abstract trim (): Buffer
22
- public abstract encodeSet (o: ILooseObject, set: ContainedFieldSet): void
22
+ public abstract encodeSet (o: ILooseObject, set: IContainedSet): void
23
23
  }
@@ -1,19 +1,18 @@
1
1
  import { TagPos } from './tag/tag-pos'
2
2
  import { SegmentDescription } from './segment/segment-description'
3
3
  import { Structure } from './structure'
4
- import { Dictionary } from '../collections'
5
4
  import { Tags } from './tag/tags'
6
5
  import {
7
6
  ContainedComponentField,
8
7
  ContainedField,
9
- ContainedFieldSet,
8
+ IContainedSet,
10
9
  ContainedGroupField,
11
10
  ContainedSimpleField
12
11
  } from '../dictionary/contained'
13
12
  import { SetReduce } from '../dictionary'
14
13
  import { ILooseObject } from '../collections/collection'
15
14
  import { ElasticBuffer } from './elastic-buffer'
16
- import { GroupFieldDefinition, SimpleFieldDefinition } from '../dictionary/definition'
15
+ import { FixDefinitions, GroupFieldDefinition, SimpleFieldDefinition } from '../dictionary/definition'
17
16
  import { ITypeDispatcher } from '../dictionary/type-dispatcher'
18
17
  import { ContainedSetType } from '../dictionary/contained-set-type'
19
18
 
@@ -22,7 +21,7 @@ export abstract class MsgView {
22
21
  protected sortedTagPosBackwards: TagPos[]
23
22
  private readonly reducer: SetReduce<ILooseObject> = new SetReduce<ILooseObject>()
24
23
 
25
- protected constructor (public readonly segment: SegmentDescription, public readonly structure: Structure | null) {
24
+ protected constructor (public readonly definitions: FixDefinitions, public readonly segment: SegmentDescription, public readonly structure: Structure | null) {
26
25
  }
27
26
 
28
27
  protected static asVerbose = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {
@@ -185,12 +184,12 @@ export abstract class MsgView {
185
184
  * returns typed value of a sinple field within this view
186
185
  * @param tagOrName the name or tag of required field e.g. 8, BeginString
187
186
  */
188
- public getTyped (tagOrName: number | string): any {
187
+ public getTyped (tagOrName: number | string): (boolean | string | number | Date | Buffer | null) {
189
188
  const tag: number = this.resolveTag(tagOrName)
190
189
  if (tag == null) {
191
190
  return null
192
191
  }
193
- const field: SimpleFieldDefinition | null = this.structure?.tags.definitions.tagToSimple[tag] ?? null
192
+ const field: SimpleFieldDefinition | null = this.definitions.tagToSimple[tag] ?? null
194
193
  if (field == null) {
195
194
  return null
196
195
  }
@@ -201,7 +200,7 @@ export abstract class MsgView {
201
200
  * use a varargs list of tags or tag names to fetch typed values for those fields within this view.
202
201
  * @param tagOrNames list of tags e.g. 'BeginString', 'BodyLength', ...
203
202
  */
204
- public getTypedList (...tagOrNames: Array<number | string>): Array<boolean | string | number | Date | null> {
203
+ public getTypedList (...tagOrNames: Array<number | string>): Array<boolean | string | number | Date | Buffer | null> {
205
204
  return tagOrNames.map((s) => this.getTyped(s))
206
205
  }
207
206
 
@@ -209,7 +208,7 @@ export abstract class MsgView {
209
208
  * use an array of tags or tag names to fetch typed values for those fields within this view.
210
209
  * @param tagOrName the list of params as array ['BeginString','BodyLength', 'MsgType']
211
210
  */
212
- public getTypedTags (tagOrName: Array<string | number>): Array<boolean | string | number | Date | null> {
211
+ public getTypedTags (tagOrName: Array<string | number>): Array<boolean | string | number | Date | Buffer | null> {
213
212
  return tagOrName.map((s) => this.getTyped(s))
214
213
  }
215
214
 
@@ -297,14 +296,15 @@ export abstract class MsgView {
297
296
 
298
297
  protected abstract stringAtPosition (position: number): string | null
299
298
 
300
- protected abstract toTyped (field: SimpleFieldDefinition): boolean | string | number | Date
299
+ protected abstract toTyped (field: SimpleFieldDefinition): boolean | string | number | Date | Buffer | null
301
300
 
302
301
  protected resolveTag (tagOrName: number | string): number {
303
302
  let tag: number
303
+ const set = this.segment.set
304
304
  if (typeof (tagOrName) === 'string') {
305
- if (this.segment.set == null) return 0
306
- const cf = this.segment.set.simple.get(tagOrName)
307
- const f: SimpleFieldDefinition | null = cf ? cf.definition : this.structure?.tags.definitions.simple.get(tagOrName) ?? null
305
+ if (set == null) return 0
306
+ const cf = set.simple.get(tagOrName)
307
+ const f: SimpleFieldDefinition | null = cf ? cf.definition : this.definitions.simple.get(tagOrName) ?? null
308
308
  if (f == null) {
309
309
  return -1
310
310
  }
@@ -382,7 +382,7 @@ export abstract class MsgView {
382
382
  return groupArray
383
383
  }
384
384
 
385
- private asLoose (def: ContainedFieldSet): ILooseObject {
385
+ private asLoose (def: IContainedSet): ILooseObject {
386
386
  // eslint-disable-next-line
387
387
  return this.reducer.reduce(def, {
388
388
  group: (a: ILooseObject, field: ContainedGroupField) => { this.asLooseGroup(a, field) },
@@ -398,7 +398,7 @@ export abstract class MsgView {
398
398
  }, {}))
399
399
  }
400
400
 
401
- private missingRequired (def: ContainedFieldSet, tags: number []): number[] {
401
+ private missingRequired (def: IContainedSet, tags: number []): number[] {
402
402
  const reducer = new SetReduce<number[]>()
403
403
  const dispatcher: ITypeDispatcher<number[]> = {
404
404
  group: (a: number[], field: ContainedGroupField) => { this.missingGroup(def, field, a) },
@@ -421,7 +421,7 @@ export abstract class MsgView {
421
421
  }
422
422
  }
423
423
 
424
- private missingGroup (def: ContainedFieldSet, gf: ContainedGroupField, tags: number []): void {
424
+ private missingGroup (def: IContainedSet, gf: ContainedGroupField, tags: number []): void {
425
425
  const name = gf.definition.noOfField ? gf.definition.noOfField.name : def.name
426
426
  const groupView: MsgView | null = this.getView(name) ?? this.getView(gf.definition.name)
427
427
  if (groupView == null) {
@@ -448,7 +448,7 @@ export abstract class MsgView {
448
448
  const def = sf.definition
449
449
  const position: number = this.getPosition(def.tag)
450
450
  if (position >= 0) {
451
- const asSimple: boolean | string | number | Date = this.toTyped(def)
451
+ const asSimple: boolean | string | number | Date | Buffer | null = this.toTyped(def)
452
452
  if (asSimple != null) { // beware, may be false value
453
453
  a[sf.name] = asSimple
454
454
  }
@@ -483,11 +483,11 @@ export abstract class MsgView {
483
483
  if (structure == null) return ''
484
484
  const tags: Tags = structure.tags
485
485
  const count: number = segment.endPosition - segment.startPosition
486
- const simple: Dictionary<SimpleFieldDefinition> = tags.definitions.simple
486
+ const simple: Map<string, SimpleFieldDefinition> = this.definitions.simple
487
487
 
488
488
  for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {
489
489
  const tagPos: TagPos = tags.tagPos[i]
490
- const field: SimpleFieldDefinition | null = simple.get(tagPos.tag.toString())
490
+ const field: SimpleFieldDefinition | undefined = simple.get(tagPos.tag.toString())
491
491
  const val: string | null = this.stringAtPosition(i) ?? ''
492
492
  // [0] 8 (BeginString) = FIX4.4
493
493
  const token = field ? getToken(field, val, i - segment.startPosition, count, tagPos) : `[${i}] ${tagPos.tag} (unknown) = ${val}, `
@@ -1,5 +1,5 @@
1
1
  import { INumericKeyed } from '../../collections/collection'
2
- import { ContainedField, ContainedFieldSet } from '../../dictionary/contained'
2
+ import { ContainedField, IContainedSet } from '../../dictionary/contained'
3
3
  import { GroupFieldDefinition } from '../../dictionary/definition'
4
4
  import { SegmentType } from './segment-type'
5
5
  import { ElasticBuffer } from '../elastic-buffer'
@@ -16,7 +16,7 @@ export class SegmentDescription {
16
16
  constructor (
17
17
  public name: string,
18
18
  public startTag: number,
19
- public set: ContainedFieldSet | null,
19
+ public set: IContainedSet | null,
20
20
  public startPosition: number,
21
21
  public readonly depth: number,
22
22
  public readonly type: SegmentType) {
@@ -1,5 +1,3 @@
1
- import { FixDefinitions } from '../../dictionary/definition'
2
- import { ContainedSimpleField } from '../../dictionary/contained'
3
1
  import { TagPos } from './tag-pos'
4
2
  import { MsgTag } from '../../types'
5
3
  import { TagType } from './tag-type'
@@ -13,11 +11,11 @@ export class Tags {
13
11
  public tagPos: TagPos[] = new Array(this.startingLength)
14
12
  public nextTagPos: number = 0
15
13
 
16
- constructor (public readonly definitions: FixDefinitions, public readonly startingLength: number = 30 * 1000) {
14
+ constructor (public readonly startingLength: number = 30 * 1000) {
17
15
  }
18
16
 
19
- public static toJSType (simple: ContainedSimpleField): string {
20
- switch (simple.definition.tagType) {
17
+ public static toJSType (tagType: TagType): string {
18
+ switch (tagType) {
21
19
  case TagType.String:
22
20
  return 'string'
23
21
 
@@ -103,7 +101,7 @@ export class Tags {
103
101
 
104
102
  public clone (): Tags {
105
103
  const next: number = this.nextTagPos
106
- const cloned: Tags = new Tags(this.definitions, next)
104
+ const cloned: Tags = new Tags(next)
107
105
  cloned.nextTagPos = next
108
106
  for (let i = 0; i < next; ++i) {
109
107
  cloned.tagPos[i] = this.tagPos[i].clone()
@@ -2,4 +2,3 @@ export type INumericKeyed<T> = Record<number, T>
2
2
 
3
3
  export type ILooseObject = Record<string, any>
4
4
 
5
- export type IDictIteratorCb<T> = (key: string, val: T) => void
@@ -1 +1 @@
1
- export * from './dictionary'
1
+
@@ -1,8 +1,9 @@
1
1
  import { FixDefinitions } from '../dictionary/definition'
2
- import { ISessionDescription, ISessionMsgFactory } from '../transport'
2
+ import { ISessionDescription } from '../transport/session/session-description'
3
+ import { ISessionMsgFactory } from '../transport/session/session-msg-factory'
3
4
  import { JsFixLoggerFactory } from './js-fix-logger-factory'
4
5
  import { EmptyLogFactory } from './empty-log-factory'
5
- import { AsciiChars } from '../buffer/ascii'
6
+ import { AsciiChars } from '../buffer/ascii/ascii-chars'
6
7
  import { DependencyContainer } from 'tsyringe'
7
8
 
8
9
  export interface IJsFixConfig {
@@ -1,4 +1,10 @@
1
- import { ContainedField, ContainedFieldSet, ContainedGroupField, ContainedComponentField, ContainedFieldType } from '../contained'
1
+ import {
2
+ ContainedField,
3
+ ContainedGroupField,
4
+ ContainedComponentField,
5
+ ContainedFieldType,
6
+ IContainedSet
7
+ } from '../contained'
2
8
  import { FixDefinitions } from '../definition'
3
9
 
4
10
  import _ = require('lodash')
@@ -7,7 +13,7 @@ import { FixDefinitionSource } from '../fix-definition-source'
7
13
 
8
14
  export class CompilerType {
9
15
  public readonly snaked: string
10
- constructor (public readonly definitions: FixDefinitions, public readonly set: ContainedFieldSet, public readonly qualifiedName: string) {
16
+ constructor (public readonly definitions: FixDefinitions, public readonly set: IContainedSet, public readonly qualifiedName: string) {
11
17
  const snake = _.snakeCase(this.qualifiedName)
12
18
  if (set.type === ContainedSetType.Msg) {
13
19
  this.snaked = `./${snake}`
@@ -73,7 +73,7 @@ export class EnumCompiler {
73
73
  }
74
74
  return this.create(field.name, field.description, () => {
75
75
  const newLine = require('os').EOL
76
- return field.enums.keys().reduce((a: number, latest: string, i: number, arr: string[]) => {
76
+ return Array.from(field.enums.keys()).reduce((a: number, latest: string, i: number, arr: string[]) => {
77
77
  const k = field.resolveEnum(latest)
78
78
  let v: any = latest
79
79
  switch (field.tagType) {
@@ -120,7 +120,7 @@ export class EnumCompiler {
120
120
 
121
121
  private toDo (): SimpleFieldDefinition[] {
122
122
  const done: ILooseObject = {}
123
- return this.definitions.simple.values().reduce((a: SimpleFieldDefinition[], latest: SimpleFieldDefinition) => {
123
+ return Array.from(this.definitions.simple.values()).reduce((a: SimpleFieldDefinition[], latest: SimpleFieldDefinition) => {
124
124
  if (latest.isEnum() && !done[latest.name]) {
125
125
  done[latest.name] = true
126
126
  a.push(latest)
@@ -4,14 +4,13 @@ import { ICompilerSettings } from './compiler-settings'
4
4
  import { FixDefinitions } from '../definition'
5
5
  import {
6
6
  ContainedComponentField,
7
- ContainedFieldSet,
7
+ IContainedSet,
8
8
  ContainedGroupField,
9
9
  ContainedSimpleField,
10
10
  FieldsDispatch
11
11
  } from '../contained'
12
12
  import { StandardSnippet } from './standard-snippet'
13
13
  import { CompilerType } from './compiler-type'
14
- import { Dictionary } from '../../collections'
15
14
 
16
15
  import * as fs from 'fs'
17
16
  import * as Util from 'util'
@@ -20,22 +19,22 @@ import { SetReduce } from '../set-reduce'
20
19
  import { ContainedSetType } from '../contained-set-type'
21
20
  import { TagType } from '../../buffer/tag/tag-type'
22
21
 
23
- const newLine = require('os').EOL
22
+ const newLine: string = require('os').EOL
24
23
  const justifiedWidth: number = 50
25
24
 
26
25
  export class MsgCompiler {
27
26
  readonly queue: CompilerType[] = []
28
27
  readonly snippets: StandardSnippet
29
28
  readonly buffer: ElasticBuffer = new ElasticBuffer()
30
- readonly completed: Dictionary<CompilerType>
29
+ readonly completed: Map<string, CompilerType>
31
30
 
32
31
  constructor (public readonly definitions: FixDefinitions, public readonly settings: ICompilerSettings) {
33
- this.completed = new Dictionary<CompilerType>()
32
+ this.completed = new Map<string, CompilerType>()
34
33
  this.snippets = new StandardSnippet(this.settings)
35
34
  }
36
35
 
37
36
  public async generate (): Promise<void> {
38
- const types: string[] = this.settings.types ?? this.definitions.message.keys()
37
+ const types: string[] = this.settings.types ?? Array.from(this.definitions.message.keys())
39
38
  await this.createTypes(types)
40
39
  }
41
40
 
@@ -76,7 +75,7 @@ export class MsgCompiler {
76
75
  const writeFile = Util.promisify(fs.writeFile)
77
76
  const settings = this.settings
78
77
  const fileName = 'index.ts'
79
- const done = this.completed.values()
78
+ const done = Array.from(this.completed.values())
80
79
  const exports: string[] = done.reduce<string[]>((prev: string[], current: CompilerType) => {
81
80
  prev.push(`export * from '${current.snaked}'`)
82
81
  return prev
@@ -126,7 +125,7 @@ export class MsgCompiler {
126
125
  return
127
126
  }
128
127
  this.queue.push(ct)
129
- completed.addUpdate(fullName, ct)
128
+ completed.set(fullName, ct)
130
129
  }
131
130
 
132
131
  private simpleComment (simple: ContainedSimpleField): string {
@@ -137,7 +136,7 @@ export class MsgCompiler {
137
136
  const snippets = this.snippets
138
137
  const settings = this.settings
139
138
  const buffer = this.buffer
140
- const len = buffer.writeString(snippets.simple(simple.name, Tags.toJSType(simple), simple.required, 1))
139
+ const len = buffer.writeString(snippets.simple(simple.name, Tags.toJSType(simple.definition.tagType), simple.required, 1))
141
140
  if (settings.tags) {
142
141
  buffer.writeString(snippets.commentLine(this.simpleComment(simple), justifiedWidth - len))
143
142
  }
@@ -155,7 +154,7 @@ export class MsgCompiler {
155
154
  buffer.writeString(newLine)
156
155
  }
157
156
 
158
- private tagSummary (definition: ContainedFieldSet, max: number = 3): string {
157
+ private tagSummary (definition: IContainedSet, max: number = 3): string {
159
158
  function tagTxt (tag: number): string {
160
159
  const name = definition.getFieldName(tag)
161
160
  return `${name}.${tag}`
@@ -174,7 +173,7 @@ export class MsgCompiler {
174
173
  return `${front} .. ${tagTxt(flattened[flattened.length - 1])}`
175
174
  }
176
175
 
177
- private setComment (set: ContainedFieldSet, position: number, len: number): void {
176
+ private setComment (set: IContainedSet, position: number, len: number): void {
178
177
  if (this.settings.tags) {
179
178
  const tagTxt = this.tagSummary(set)
180
179
  const buffer = this.buffer
@@ -206,7 +205,7 @@ export class MsgCompiler {
206
205
  const snippets = this.snippets
207
206
  const buffer = this.buffer
208
207
  compilerType.set.localAttribute.forEach((simple: ContainedSimpleField) => {
209
- const len = buffer.writeString(snippets.simple(simple.definition.name, Tags.toJSType(simple), simple.required, 1))
208
+ const len = buffer.writeString(snippets.simple(simple.definition.name, Tags.toJSType(simple.definition.tagType), simple.required, 1))
210
209
  if (settings.tags) {
211
210
  buffer.writeString(snippets.commentLine(this.simpleComment(simple), justifiedWidth - len))
212
211
  }
@@ -1,4 +1,4 @@
1
- import { ComponentFieldDefinition } from '../definition'
1
+ import { ComponentFieldDefinition } from '../definition/component-field-definition'
2
2
  import { ContainedField } from './contained-field'
3
3
  import { ContainedFieldType } from './contained-field-type'
4
4