@coderoftime/fints 0.1.0 → 0.3.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 (289) hide show
  1. package/CHANGELOG.md +519 -1
  2. package/README.md +138 -40
  3. package/dist/client.d.ts +49 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +242 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/core/account.d.ts +46 -7
  8. package/dist/core/account.d.ts.map +1 -1
  9. package/dist/core/account.js +143 -24
  10. package/dist/core/account.js.map +1 -1
  11. package/dist/core/amount.d.ts +15 -4
  12. package/dist/core/amount.d.ts.map +1 -1
  13. package/dist/core/amount.js +46 -9
  14. package/dist/core/amount.js.map +1 -1
  15. package/dist/core/balance.d.ts +4 -0
  16. package/dist/core/balance.d.ts.map +1 -1
  17. package/dist/core/balance.js +11 -5
  18. package/dist/core/balance.js.map +1 -1
  19. package/dist/core/bank-info.d.ts +21 -4
  20. package/dist/core/bank-info.d.ts.map +1 -1
  21. package/dist/core/bank-info.js +26 -5
  22. package/dist/core/bank-info.js.map +1 -1
  23. package/dist/core/client.d.ts +81 -19
  24. package/dist/core/client.d.ts.map +1 -1
  25. package/dist/core/config.d.ts +40 -20
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +85 -30
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/errors.d.ts +100 -26
  30. package/dist/core/errors.d.ts.map +1 -1
  31. package/dist/core/errors.js +136 -53
  32. package/dist/core/errors.js.map +1 -1
  33. package/dist/core/feedback.d.ts +11 -1
  34. package/dist/core/feedback.d.ts.map +1 -1
  35. package/dist/core/feedback.js +14 -2
  36. package/dist/core/feedback.js.map +1 -1
  37. package/dist/core/transaction.d.ts +11 -1
  38. package/dist/core/transaction.d.ts.map +1 -1
  39. package/dist/core/transaction.js +21 -4
  40. package/dist/core/transaction.js.map +1 -1
  41. package/dist/core/transport.d.ts +48 -6
  42. package/dist/core/transport.d.ts.map +1 -1
  43. package/dist/core/transport.js +126 -29
  44. package/dist/core/transport.js.map +1 -1
  45. package/dist/formats/camt.d.ts +28 -5
  46. package/dist/formats/camt.d.ts.map +1 -1
  47. package/dist/formats/camt.js +132 -50
  48. package/dist/formats/camt.js.map +1 -1
  49. package/dist/formats/mt940.d.ts +29 -5
  50. package/dist/formats/mt940.d.ts.map +1 -1
  51. package/dist/formats/mt940.js +209 -113
  52. package/dist/formats/mt940.js.map +1 -1
  53. package/dist/formats/readers.d.ts +6 -2
  54. package/dist/formats/readers.d.ts.map +1 -1
  55. package/dist/formats/readers.js +28 -29
  56. package/dist/formats/readers.js.map +1 -1
  57. package/dist/formats/record-budget.d.ts +7 -0
  58. package/dist/formats/record-budget.d.ts.map +1 -0
  59. package/dist/formats/record-budget.js +17 -0
  60. package/dist/formats/record-budget.js.map +1 -0
  61. package/dist/formats/sepa-purpose.d.ts +9 -0
  62. package/dist/formats/sepa-purpose.d.ts.map +1 -1
  63. package/dist/formats/sepa-purpose.js +32 -2
  64. package/dist/formats/sepa-purpose.js.map +1 -1
  65. package/dist/index.d.ts +3 -3
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/session/app-approval.d.ts +11 -5
  70. package/dist/session/app-approval.d.ts.map +1 -1
  71. package/dist/session/app-approval.js +23 -12
  72. package/dist/session/app-approval.js.map +1 -1
  73. package/dist/session/dialog-runner.d.ts +11 -11
  74. package/dist/session/dialog-runner.d.ts.map +1 -1
  75. package/dist/session/dialog-runner.js +34 -19
  76. package/dist/session/dialog-runner.js.map +1 -1
  77. package/dist/session/login-guard.d.ts +54 -49
  78. package/dist/session/login-guard.d.ts.map +1 -1
  79. package/dist/session/login-guard.js +170 -83
  80. package/dist/session/login-guard.js.map +1 -1
  81. package/dist/session/sepa-accounts.d.ts +20 -14
  82. package/dist/session/sepa-accounts.d.ts.map +1 -1
  83. package/dist/session/sepa-accounts.js +62 -46
  84. package/dist/session/sepa-accounts.js.map +1 -1
  85. package/dist/session/session-setup.d.ts +41 -24
  86. package/dist/session/session-setup.d.ts.map +1 -1
  87. package/dist/session/session-setup.js +106 -63
  88. package/dist/session/session-setup.js.map +1 -1
  89. package/dist/session/session-state.d.ts +10 -6
  90. package/dist/session/session-state.d.ts.map +1 -1
  91. package/dist/session/session-state.js +72 -18
  92. package/dist/session/session-state.js.map +1 -1
  93. package/dist/session/signed-dialog.d.ts +83 -0
  94. package/dist/session/signed-dialog.d.ts.map +1 -0
  95. package/dist/session/signed-dialog.js +185 -0
  96. package/dist/session/signed-dialog.js.map +1 -0
  97. package/dist/session/tan-selection.d.ts +26 -18
  98. package/dist/session/tan-selection.d.ts.map +1 -1
  99. package/dist/session/tan-selection.js +44 -33
  100. package/dist/session/tan-selection.js.map +1 -1
  101. package/dist/session/user-prompts.d.ts +14 -5
  102. package/dist/session/user-prompts.d.ts.map +1 -1
  103. package/dist/session/user-prompts.js +53 -18
  104. package/dist/session/user-prompts.js.map +1 -1
  105. package/dist/tan/challenge.d.ts +47 -24
  106. package/dist/tan/challenge.d.ts.map +1 -1
  107. package/dist/tan/challenge.js +56 -51
  108. package/dist/tan/challenge.js.map +1 -1
  109. package/dist/tan/flicker.d.ts +11 -1
  110. package/dist/tan/flicker.d.ts.map +1 -1
  111. package/dist/tan/flicker.js +70 -24
  112. package/dist/tan/flicker.js.map +1 -1
  113. package/dist/tan/tan-image.d.ts +6 -2
  114. package/dist/tan/tan-image.d.ts.map +1 -1
  115. package/dist/tan/tan-image.js +14 -6
  116. package/dist/tan/tan-image.js.map +1 -1
  117. package/dist/tan/tan-models.d.ts +14 -2
  118. package/dist/tan/tan-models.d.ts.map +1 -1
  119. package/dist/tan/tan-models.js +24 -7
  120. package/dist/tan/tan-models.js.map +1 -1
  121. package/dist/util/arguments.d.ts +13 -0
  122. package/dist/util/arguments.d.ts.map +1 -0
  123. package/dist/util/arguments.js +40 -0
  124. package/dist/util/arguments.js.map +1 -0
  125. package/dist/util/async.d.ts +4 -3
  126. package/dist/util/async.d.ts.map +1 -1
  127. package/dist/util/async.js +6 -7
  128. package/dist/util/async.js.map +1 -1
  129. package/dist/util/bytes.d.ts +3 -4
  130. package/dist/util/bytes.d.ts.map +1 -1
  131. package/dist/util/bytes.js +13 -21
  132. package/dist/util/bytes.js.map +1 -1
  133. package/dist/util/call-context.d.ts.map +1 -1
  134. package/dist/util/call-context.js +3 -2
  135. package/dist/util/call-context.js.map +1 -1
  136. package/dist/util/dates.d.ts +6 -20
  137. package/dist/util/dates.d.ts.map +1 -1
  138. package/dist/util/dates.js +58 -28
  139. package/dist/util/dates.js.map +1 -1
  140. package/dist/util/errors.d.ts +13 -3
  141. package/dist/util/errors.d.ts.map +1 -1
  142. package/dist/util/errors.js +19 -6
  143. package/dist/util/errors.js.map +1 -1
  144. package/dist/util/immutable-map.d.ts +5 -2
  145. package/dist/util/immutable-map.d.ts.map +1 -1
  146. package/dist/util/immutable-map.js +15 -12
  147. package/dist/util/immutable-map.js.map +1 -1
  148. package/dist/util/inspect.d.ts +11 -0
  149. package/dist/util/inspect.d.ts.map +1 -0
  150. package/dist/util/inspect.js +14 -0
  151. package/dist/util/inspect.js.map +1 -0
  152. package/dist/util/json.d.ts +4 -0
  153. package/dist/util/json.d.ts.map +1 -1
  154. package/dist/util/json.js +18 -0
  155. package/dist/util/json.js.map +1 -1
  156. package/dist/util/text.d.ts +38 -5
  157. package/dist/util/text.d.ts.map +1 -1
  158. package/dist/util/text.js +90 -16
  159. package/dist/util/text.js.map +1 -1
  160. package/dist/util/xml.d.ts +9 -6
  161. package/dist/util/xml.d.ts.map +1 -1
  162. package/dist/util/xml.js +129 -56
  163. package/dist/util/xml.js.map +1 -1
  164. package/dist/v3/account-extension.d.ts.map +1 -1
  165. package/dist/v3/account-extension.js +7 -10
  166. package/dist/v3/account-extension.js.map +1 -1
  167. package/dist/v3/bank-connection.d.ts +54 -0
  168. package/dist/v3/bank-connection.d.ts.map +1 -0
  169. package/dist/v3/bank-connection.js +118 -0
  170. package/dist/v3/bank-connection.js.map +1 -0
  171. package/dist/v3/dialog.d.ts +84 -46
  172. package/dist/v3/dialog.d.ts.map +1 -1
  173. package/dist/v3/dialog.js +174 -60
  174. package/dist/v3/dialog.js.map +1 -1
  175. package/dist/v3/message.d.ts +32 -11
  176. package/dist/v3/message.d.ts.map +1 -1
  177. package/dist/v3/message.js +144 -83
  178. package/dist/v3/message.js.map +1 -1
  179. package/dist/v3/parameter-store.d.ts +111 -0
  180. package/dist/v3/parameter-store.d.ts.map +1 -0
  181. package/dist/v3/parameter-store.js +197 -0
  182. package/dist/v3/parameter-store.js.map +1 -0
  183. package/dist/v3/parameters.d.ts +44 -17
  184. package/dist/v3/parameters.d.ts.map +1 -1
  185. package/dist/v3/parameters.js +136 -60
  186. package/dist/v3/parameters.js.map +1 -1
  187. package/dist/v3/protocol.d.ts +50 -50
  188. package/dist/v3/protocol.d.ts.map +1 -1
  189. package/dist/v3/protocol.js +91 -210
  190. package/dist/v3/protocol.js.map +1 -1
  191. package/dist/v3/queries.d.ts +51 -0
  192. package/dist/v3/queries.d.ts.map +1 -0
  193. package/dist/v3/queries.js +128 -0
  194. package/dist/v3/queries.js.map +1 -0
  195. package/dist/v3/segments.d.ts +43 -19
  196. package/dist/v3/segments.d.ts.map +1 -1
  197. package/dist/v3/segments.js +84 -33
  198. package/dist/v3/segments.js.map +1 -1
  199. package/dist/v3/syntax.d.ts +68 -13
  200. package/dist/v3/syntax.d.ts.map +1 -1
  201. package/dist/v3/syntax.js +183 -102
  202. package/dist/v3/syntax.js.map +1 -1
  203. package/package.json +10 -6
  204. package/src/client.ts +293 -0
  205. package/src/core/account.ts +153 -24
  206. package/src/core/amount.ts +45 -10
  207. package/src/core/balance.ts +12 -5
  208. package/src/core/bank-info.ts +29 -5
  209. package/src/core/client.ts +83 -19
  210. package/src/core/config.ts +95 -35
  211. package/src/core/errors.ts +148 -54
  212. package/src/core/feedback.ts +16 -2
  213. package/src/core/transaction.ts +22 -4
  214. package/src/core/transport.ts +153 -32
  215. package/src/formats/camt.ts +153 -45
  216. package/src/formats/mt940.ts +244 -122
  217. package/src/formats/readers.ts +28 -31
  218. package/src/formats/record-budget.ts +18 -0
  219. package/src/formats/sepa-purpose.ts +29 -2
  220. package/src/index.ts +4 -2
  221. package/src/session/app-approval.ts +51 -38
  222. package/src/session/dialog-runner.ts +61 -31
  223. package/src/session/login-guard.ts +189 -87
  224. package/src/session/sepa-accounts.ts +63 -45
  225. package/src/session/session-setup.ts +105 -68
  226. package/src/session/session-state.ts +74 -23
  227. package/src/session/signed-dialog.ts +222 -0
  228. package/src/session/tan-selection.ts +50 -39
  229. package/src/session/user-prompts.ts +62 -18
  230. package/src/tan/challenge.ts +87 -64
  231. package/src/tan/flicker.ts +72 -23
  232. package/src/tan/tan-image.ts +15 -6
  233. package/src/tan/tan-models.ts +26 -7
  234. package/src/util/arguments.ts +40 -0
  235. package/src/util/async.ts +10 -9
  236. package/src/util/bytes.ts +14 -20
  237. package/src/util/call-context.ts +3 -2
  238. package/src/util/dates.ts +64 -33
  239. package/src/util/errors.ts +22 -6
  240. package/src/util/immutable-map.ts +15 -12
  241. package/src/util/inspect.ts +14 -0
  242. package/src/util/json.ts +16 -0
  243. package/src/util/text.ts +87 -15
  244. package/src/util/xml.ts +130 -52
  245. package/src/v3/account-extension.ts +7 -12
  246. package/src/v3/bank-connection.ts +126 -0
  247. package/src/v3/dialog.ts +186 -92
  248. package/src/v3/message.ts +140 -79
  249. package/src/v3/parameter-store.ts +226 -0
  250. package/src/v3/parameters.ts +166 -66
  251. package/src/v3/protocol.ts +103 -253
  252. package/src/v3/queries.ts +198 -0
  253. package/src/v3/segments.ts +86 -31
  254. package/src/v3/syntax.ts +172 -93
  255. package/dist/session/bank-connection.d.ts +0 -28
  256. package/dist/session/bank-connection.d.ts.map +0 -1
  257. package/dist/session/bank-connection.js +0 -48
  258. package/dist/session/bank-connection.js.map +0 -1
  259. package/dist/session/parameter-data.d.ts +0 -83
  260. package/dist/session/parameter-data.d.ts.map +0 -1
  261. package/dist/session/parameter-data.js +0 -68
  262. package/dist/session/parameter-data.js.map +0 -1
  263. package/dist/session/pin-tan-client.d.ts +0 -54
  264. package/dist/session/pin-tan-client.d.ts.map +0 -1
  265. package/dist/session/pin-tan-client.js +0 -153
  266. package/dist/session/pin-tan-client.js.map +0 -1
  267. package/dist/session/pin-tan-dialog.d.ts +0 -71
  268. package/dist/session/pin-tan-dialog.d.ts.map +0 -1
  269. package/dist/session/pin-tan-dialog.js +0 -124
  270. package/dist/session/pin-tan-dialog.js.map +0 -1
  271. package/dist/session/protocol.d.ts +0 -209
  272. package/dist/session/protocol.d.ts.map +0 -1
  273. package/dist/session/protocol.js +0 -75
  274. package/dist/session/protocol.js.map +0 -1
  275. package/dist/session/response-handler.d.ts +0 -48
  276. package/dist/session/response-handler.d.ts.map +0 -1
  277. package/dist/session/response-handler.js +0 -121
  278. package/dist/session/response-handler.js.map +0 -1
  279. package/dist/v3/client.d.ts +0 -24
  280. package/dist/v3/client.d.ts.map +0 -1
  281. package/dist/v3/client.js +0 -16
  282. package/dist/v3/client.js.map +0 -1
  283. package/src/session/bank-connection.ts +0 -51
  284. package/src/session/parameter-data.ts +0 -137
  285. package/src/session/pin-tan-client.ts +0 -186
  286. package/src/session/pin-tan-dialog.ts +0 -160
  287. package/src/session/protocol.ts +0 -311
  288. package/src/session/response-handler.ts +0 -130
  289. package/src/v3/client.ts +0 -29
package/dist/util/xml.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { FormatError } from './errors.js';
2
+ import { characterReference, nonBlank } from './text.js';
2
3
  /**
3
4
  * An element of a parsed XML document, looked up by local name: camt documents come with and without namespace
4
5
  * prefixes.
@@ -10,7 +11,7 @@ export class XmlElement {
10
11
  constructor(
11
12
  /** The name without namespace prefix. */
12
13
  localName,
13
- /** The attributes by name without namespace prefix; namespace declarations are left out. */
14
+ /** The attributes by name, namespace prefix and all. */
14
15
  attributes) {
15
16
  this.localName = localName;
16
17
  this.attributes = attributes;
@@ -22,12 +23,13 @@ export class XmlElement {
22
23
  get innerText() {
23
24
  return this.children.map((c) => (c instanceof XmlElement ? c.innerText : c)).join('');
24
25
  }
25
- getAttribute(localName) {
26
- return this.attributes.get(localName);
26
+ /** The attribute called `name`: an unprefixed name finds no prefixed attribute, which is of another namespace. */
27
+ getAttribute(name) {
28
+ return this.attributes.get(name);
27
29
  }
28
30
  /** The first child element called `localName`. */
29
31
  child(localName) {
30
- return this.childElements.find((c) => c.localName === localName);
32
+ return this.children.find((c) => c instanceof XmlElement && c.localName === localName);
31
33
  }
32
34
  /** The element reached by following child names along `path`; this element for an empty path. */
33
35
  at(path) {
@@ -35,67 +37,111 @@ export class XmlElement {
35
37
  }
36
38
  /** The trimmed text of the element at `path`, or `undefined` if it is missing or empty. */
37
39
  textAt(path) {
38
- const text = this.at(path)?.innerText.trim();
39
- return text === undefined || text === '' ? undefined : text;
40
+ return nonBlank(this.at(path)?.innerText);
40
41
  }
41
- /** All elements below this one called `localName`, in document order. */
42
- descendantsNamed(localName) {
43
- const found = [];
44
- const visit = (element) => {
45
- for (const c of element.childElements) {
46
- if (c.localName === localName)
47
- found.push(c);
48
- visit(c);
49
- }
50
- };
51
- visit(this);
52
- return found;
42
+ /** The child elements called `localName`, in document order. */
43
+ childrenNamed(localName) {
44
+ return this.children.filter((c) => c instanceof XmlElement && c.localName === localName);
53
45
  }
54
46
  }
55
- const namePattern = /[^\s<>/=!?"']+/y;
56
- const attributePattern = /\s+([^\s<>/=!?"']+)\s*=\s*(?:"([^"<]*)"|'([^'<]*)')/y;
47
+ /** The characters an XML name starts with (XML 1.0, production 4). */
48
+ const nameStartCharacters = String.raw `:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}`;
49
+ /**
50
+ * An XML name (XML 1.0, production 5). The combining marks lead the class of the characters after the first: after
51
+ * another one, ESLint's `no-misleading-character-class` takes them for a combined character.
52
+ */
53
+ const xmlName = String.raw `[${nameStartCharacters}][\u0300-\u036F${nameStartCharacters}\-.0-9\u00B7\u203F-\u2040]*`;
54
+ const namePattern = new RegExp(xmlName, 'uy');
55
+ /**
56
+ * White space to Unicode, U+0085 (NEL) among them, which separates the parts of a tag, and `<?xml` of the rest of the
57
+ * XML declaration, as the Dart package has it.
58
+ */
59
+ const blank = String.raw `[\s\u0085]`;
60
+ const blankPattern = new RegExp(blank);
61
+ const attributePattern = new RegExp(String.raw `${blank}+(${xmlName})${blank}*=${blank}*(?:"([^"<]*)"|'([^'<]*)')`, 'uy');
62
+ /** The start of the XML declaration, whose content is not read. */
63
+ const declarationPattern = new RegExp(String.raw `<\?xml(?:${blank}|\?>)`, 'y');
64
+ /** The text of a reference after its `&`, up to the `;` that ends it. */
65
+ const referenceNamePattern = /[^;&\s]*/y;
57
66
  /** The match of the sticky `pattern` at `position` in `text`. */
58
67
  function matchAt(pattern, text, position) {
59
68
  pattern.lastIndex = position;
60
69
  return pattern.exec(text);
61
70
  }
62
- const predefinedEntities = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" };
71
+ const predefinedEntities = new Map([
72
+ ['amp', '&'],
73
+ ['lt', '<'],
74
+ ['gt', '>'],
75
+ ['quot', '"'],
76
+ ['apos', "'"],
77
+ ]);
78
+ /** Deepest nesting of elements the parser takes: camt needs fewer than 20 levels, and `innerText` recurses. */
79
+ const maxDepth = 100;
80
+ /**
81
+ * Most nodes besides text a document may hold, unless it is long enough for one node per `charactersPerNode`
82
+ * characters: real camt spends 16 to 40 characters on each, while nodes as short as `<a/>` take a hundred times their
83
+ * length in memory.
84
+ */
85
+ const maxNodes = 500_000;
86
+ const charactersPerNode = 16;
87
+ const noAttributes = new Map();
88
+ /** The name without namespace prefix; `:a` has none, but is no unprefixed `a` either. */
63
89
  function localNameOf(qualified) {
64
90
  const colon = qualified.indexOf(':');
65
- return colon < 0 ? qualified : qualified.substring(colon + 1);
91
+ return colon > 0 ? qualified.substring(colon + 1) : qualified;
66
92
  }
67
- /** Resolves the character and predefined entity references in `text`; throws `FormatError` for any other. */
93
+ /**
94
+ * Resolves the character and predefined entity references in `text`; throws `FormatError` for any other, at the first.
95
+ * A global `replace` would find all of them before it looked at the first: a gigabyte for megabytes of `&`.
96
+ */
68
97
  function decodeEntities(text) {
69
- return text.replace(/&([^;&\s]*);?/g, (match, name) => {
70
- if (!match.endsWith(';'))
98
+ let decoded = '';
99
+ let position = 0;
100
+ for (let ampersand = text.indexOf('&'); ampersand >= 0; ampersand = text.indexOf('&', position)) {
101
+ const name = matchAt(referenceNamePattern, text, ampersand + 1)[0];
102
+ const end = ampersand + 1 + name.length;
103
+ if (text.charAt(end) !== ';')
71
104
  throw new FormatError('Invalid XML: unterminated entity reference');
72
- if (name.startsWith('#')) {
73
- const hex = name.startsWith('#x');
74
- const digits = name.substring(hex ? 2 : 1);
75
- const code = (hex ? /^[0-9a-fA-F]+$/ : /^\d+$/).test(digits) ? parseInt(digits, hex ? 16 : 10) : NaN;
76
- if (!(code > 0 && code <= 0x10ffff && (code < 0xd800 || code > 0xdfff))) {
77
- throw new FormatError('Invalid XML character reference', match);
78
- }
79
- return String.fromCodePoint(code);
80
- }
81
- const value = predefinedEntities[name];
82
- if (value === undefined)
83
- throw new FormatError('Invalid XML: unknown entity', match);
84
- return value;
85
- });
105
+ decoded += text.substring(position, ampersand) + resolved(name, text.substring(ampersand, end + 1));
106
+ position = end + 1;
107
+ }
108
+ return position === 0 ? text : decoded + text.substring(position);
109
+ }
110
+ /** The text the `reference` called `name` stands for. */
111
+ function resolved(name, reference) {
112
+ if (name.startsWith('#')) {
113
+ const character = characterReference(name);
114
+ if (character === undefined)
115
+ throw new FormatError('Invalid XML character reference', reference);
116
+ return character;
117
+ }
118
+ const value = predefinedEntities.get(name);
119
+ if (value === undefined)
120
+ throw new FormatError('Invalid XML: unknown entity', reference);
121
+ return value;
86
122
  }
87
123
  /**
88
- * Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed.
124
+ * Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed, nests elements
125
+ * deeper than 100 levels, or holds more than 500,000 nodes besides text (elements, attributes, comments, processing
126
+ * instructions, the XML declaration and CDATA sections) or one per 16 characters, whichever is more.
89
127
  *
90
128
  * A document type declaration is refused: bank data have none, and its entities could expand without limit.
91
129
  */
92
130
  export function parseXml(xml) {
93
131
  let position = 0;
94
132
  const stack = [];
133
+ const openNames = [];
95
134
  let root;
135
+ let declared = false;
136
+ let nodes = 0;
137
+ const nodeLimit = Math.max(maxNodes, Math.floor(xml.length / charactersPerNode));
96
138
  const fail = (reason) => {
97
139
  throw new FormatError(`Invalid XML: ${reason} at position ${position}`);
98
140
  };
141
+ const countNode = () => {
142
+ if (++nodes > nodeLimit)
143
+ fail(`more than ${nodeLimit} nodes`);
144
+ };
99
145
  const skipPast = (terminator, what) => {
100
146
  const end = xml.indexOf(terminator, position);
101
147
  if (end < 0)
@@ -107,22 +153,42 @@ export function parseXml(xml) {
107
153
  const textEnd = lt < 0 ? xml.length : lt;
108
154
  if (textEnd > position) {
109
155
  const text = xml.substring(position, textEnd);
110
- const parent = stack.at(-1);
111
- if (parent)
112
- parent.children.push(decodeEntities(text));
113
- else if (text.trim() !== '')
114
- fail('text outside the root element');
156
+ // Blanks are dropped only where they follow no text, as between elements: kept, they would double the nodes of a
157
+ // document with line breaks. Between two texts they are content, and a counted node separates the two.
158
+ if (nonBlank(text) !== undefined || typeof stack.at(-1)?.children.at(-1) === 'string') {
159
+ (stack.at(-1) ?? fail('text outside the root element')).children.push(decodeEntities(text));
160
+ }
115
161
  position = textEnd;
116
162
  continue;
117
163
  }
118
164
  if (xml.startsWith('<?', position)) {
165
+ countNode();
166
+ if (matchAt(declarationPattern, xml, position)) {
167
+ if (root)
168
+ fail('XML declaration inside or after the root element');
169
+ if (declared)
170
+ fail('a second XML declaration');
171
+ declared = true;
172
+ }
173
+ else {
174
+ position += 2;
175
+ const target = matchAt(namePattern, xml, position)?.[0] ?? fail('missing processing instruction target');
176
+ position += target.length;
177
+ if (!xml.startsWith('?>', position) && !blankPattern.test(xml.charAt(position))) {
178
+ fail('malformed processing instruction');
179
+ }
180
+ }
119
181
  skipPast('?>', 'processing instruction');
120
182
  }
121
183
  else if (xml.startsWith('<!--', position)) {
184
+ countNode();
185
+ // Past the `<!--`, whose dashes end no comment: `<!-->` starts one.
186
+ position += 4;
122
187
  skipPast('-->', 'comment');
123
188
  }
124
189
  else if (xml.startsWith('<![CDATA[', position)) {
125
190
  const parent = stack.at(-1) ?? fail('CDATA outside the root element');
191
+ countNode();
126
192
  const start = position + 9;
127
193
  skipPast(']]>', 'CDATA section');
128
194
  parent.children.push(xml.substring(start, position - 3));
@@ -134,37 +200,42 @@ export function parseXml(xml) {
134
200
  position += 2;
135
201
  const name = matchAt(namePattern, xml, position)?.[0] ?? fail('missing end tag name');
136
202
  position += name.length;
137
- while (/\s/.test(xml.charAt(position)))
203
+ while (blankPattern.test(xml.charAt(position)))
138
204
  position++;
139
205
  if (xml.charAt(position) !== '>')
140
206
  fail('malformed end tag');
141
207
  position++;
142
- const open = stack.pop();
143
- if (open === undefined || open.localName !== localNameOf(name))
208
+ stack.pop();
209
+ if (openNames.pop() !== name)
144
210
  fail(`unexpected end tag ${name}`);
145
211
  }
146
212
  else {
213
+ if (stack.length >= maxDepth)
214
+ fail(`elements nested deeper than ${maxDepth} levels`);
215
+ countNode();
147
216
  position++;
148
217
  const name = matchAt(namePattern, xml, position)?.[0] ?? fail('missing element name');
149
218
  position += name.length;
150
- const attributes = new Map();
219
+ let attributes;
151
220
  for (;;) {
152
221
  const attribute = matchAt(attributePattern, xml, position);
153
222
  if (!attribute)
154
223
  break;
155
224
  position += attribute[0].length;
225
+ countNode();
156
226
  const attributeName = attribute[1];
157
- if (attributeName !== 'xmlns' && !attributeName.startsWith('xmlns:')) {
158
- attributes.set(localNameOf(attributeName), decodeEntities(attribute[2] ?? attribute[3] ?? ''));
159
- }
227
+ attributes ??= new Map();
228
+ if (attributes.has(attributeName))
229
+ fail(`duplicate attribute ${attributeName}`);
230
+ attributes.set(attributeName, decodeEntities(attribute[2] ?? attribute[3] ?? ''));
160
231
  }
161
- while (/\s/.test(xml.charAt(position)))
232
+ while (blankPattern.test(xml.charAt(position)))
162
233
  position++;
163
234
  const selfClosing = xml.startsWith('/>', position);
164
235
  if (!selfClosing && xml.charAt(position) !== '>')
165
236
  fail(`malformed start tag ${name}`);
166
237
  position += selfClosing ? 2 : 1;
167
- const element = new XmlElement(localNameOf(name), attributes);
238
+ const element = new XmlElement(localNameOf(name), attributes ?? noAttributes);
168
239
  const parent = stack.at(-1);
169
240
  if (parent)
170
241
  parent.children.push(element);
@@ -172,12 +243,14 @@ export function parseXml(xml) {
172
243
  fail('a second root element');
173
244
  else
174
245
  root = element;
175
- if (!selfClosing)
246
+ if (!selfClosing) {
176
247
  stack.push(element);
248
+ openNames.push(name);
249
+ }
177
250
  }
178
251
  }
179
252
  if (stack.length > 0)
180
- fail(`unclosed element ${stack.at(-1).localName}`);
253
+ fail(`unclosed element ${openNames.at(-1)}`);
181
254
  return root ?? fail('no root element');
182
255
  }
183
256
  //# sourceMappingURL=xml.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,OAAO,UAAU;IAKV;IAEA;IANF,QAAQ,GAA4B,EAAE,CAAC;IAEhD;IACE,yCAAyC;IAChC,SAAiB;IAC1B,4FAA4F;IACnF,UAAuC;QAFvC,cAAS,GAAT,SAAS,CAAQ;QAEjB,eAAU,GAAV,UAAU,CAA6B;IAC/C,CAAC;IAEJ,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC;IAC/E,CAAC;IAED,iDAAiD;IACjD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,iGAAiG;IACjG,EAAE,CAAC,IAAuB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5F,CAAC;IAED,2FAA2F;IAC3F,MAAM,CAAC,IAAuB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED,yEAAyE;IACzE,gBAAgB,CAAC,SAAiB;QAChC,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,OAAmB,EAAQ,EAAE;YAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7C,KAAK,CAAC,CAAC,CAAC,CAAC;YACX,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,WAAW,GAAG,iBAAiB,CAAC;AACtC,MAAM,gBAAgB,GAAG,sDAAsD,CAAC;AAEhF,iEAAiE;AACjE,SAAS,OAAO,CAAC,OAAe,EAAE,IAAY,EAAE,QAAgB;IAC9D,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC7B,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AACD,MAAM,kBAAkB,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAExG,SAAS,WAAW,CAAC,SAAiB;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,6GAA6G;AAC7G,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC5D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,WAAW,CAAC,4CAA4C,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACrG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;gBACxE,MAAM,IAAI,WAAW,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,WAAW,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACrF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,IAA4B,CAAC;IAEjC,MAAM,IAAI,GAAG,CAAC,MAAc,EAAS,EAAE;QACrC,MAAM,IAAI,WAAW,CAAC,gBAAgB,MAAM,gBAAgB,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,UAAkB,EAAE,IAAY,EAAQ,EAAE;QAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC;YAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC1C,QAAQ,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,MAAM;gBAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;iBAClD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACnE,QAAQ,GAAG,OAAO,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;YAC3B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1C,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtF,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;YACxB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAE,QAAQ,EAAE,CAAC;YACnD,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC5D,QAAQ,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,QAAQ,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtF,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;YACxB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC7C,SAAS,CAAC;gBACR,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS;oBAAE,MAAM;gBACtB,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAChC,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;gBACpC,IAAI,aAAa,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAE,QAAQ,EAAE,CAAC;YACnD,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;YACtF,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,MAAM;gBAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBACrC,IAAI,IAAI;gBAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;;gBACxC,IAAI,GAAG,OAAO,CAAC;YACpB,IAAI,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,oBAAoB,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1E,OAAO,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"account-extension.d.ts","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAuB7C;;;GAGG;AACH,qBAAa,gBAAgB;IAEzB,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAChC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,eAAe;IAPlC,OAAO;IAUP;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAU3D,OAAO,CAAC,MAAM,CAAC,IAAI;IAgBnB,6GAA6G;IAC7G,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;CAiBvD"}
1
+ {"version":3,"file":"account-extension.d.ts","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAyB7C;;;GAGG;AACH,qBAAa,gBAAgB;IAEzB,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAChC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,eAAe;IAPlC,OAAO;IAUP;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAU3D,OAAO,CAAC,MAAM,CAAC,IAAI;IAgBnB,6GAA6G;IAC7G,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;CAkBvD"}
@@ -3,7 +3,9 @@ import { AccountDataStatus } from '../core/account.js';
3
3
  import { Amount, withMark } from '../core/amount.js';
4
4
  import { Balance } from '../core/balance.js';
5
5
  import { parseFintsDate, parseUtcPlusOneDateTime } from '../util/dates.js';
6
- import { FormatError } from '../util/errors.js';
6
+ import { fail, FormatError } from '../util/errors.js';
7
+ import { isJsonObject } from '../util/json.js';
8
+ import { nonBlank } from '../util/text.js';
7
9
  /**
8
10
  * The account extension of the user parameter data (HIUPD "Erweiterung, kontobezogen", Formals E.3.1): JSON with the
9
11
  * BIC, the balance, and what the bank tells about the data it holds for the account.
@@ -32,7 +34,7 @@ export class AccountExtension {
32
34
  static tryParse(json) {
33
35
  try {
34
36
  const decoded = JSON.parse(json);
35
- return isObject(decoded) ? AccountExtension.read(new Json(decoded)) : undefined;
37
+ return isJsonObject(decoded) ? AccountExtension.read(new Json(decoded)) : undefined;
36
38
  }
37
39
  catch (error) {
38
40
  if (error instanceof FormatError || error instanceof SyntaxError)
@@ -57,6 +59,7 @@ export class AccountExtension {
57
59
  return undefined;
58
60
  return new Balance({
59
61
  account,
62
+ productName: account.productName,
60
63
  booked: b.booked.amount,
61
64
  bookedAsOf: b.booked.date,
62
65
  bookedAsOfTime: b.booked.time,
@@ -109,12 +112,6 @@ function moment(json, defaultTime) {
109
112
  return undefined;
110
113
  return parseUtcPlusOneDateTime(json.string('Date'), time) ?? fail('Extension date or time is malformed');
111
114
  }
112
- function fail(message) {
113
- throw new FormatError(message);
114
- }
115
- function isObject(value) {
116
- return typeof value === 'object' && value !== null && !Array.isArray(value);
117
- }
118
115
  /**
119
116
  * A JSON object of the extension, read by key without regard to case: the specification itself spells some keys
120
117
  * differently (`OverDraftLim` and `OverdraftLim`). Values of the wrong type are a `FormatError`.
@@ -134,7 +131,7 @@ class Json {
134
131
  if (value === undefined || value === null)
135
132
  return undefined;
136
133
  if (typeof value === 'string')
137
- return value.trim() === '' ? undefined : value.trim();
134
+ return nonBlank(value);
138
135
  if (typeof value === 'number')
139
136
  return String(value);
140
137
  throw new FormatError(`Extension element "${key}" is not text`);
@@ -153,7 +150,7 @@ class Json {
153
150
  const value = this.value(key);
154
151
  if (value === undefined || value === null)
155
152
  return undefined;
156
- if (isObject(value))
153
+ if (isJsonObject(value))
157
154
  return new Json(value);
158
155
  throw new FormatError(`Extension element "${key}" is not an object`);
159
156
  }
@@ -1 +1 @@
1
- {"version":3,"file":"account-extension.js","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"account-extension.js","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { MessageDirection, MessageLogger } from '../core/client.js';
2
+ import { type FinTsTransport } from '../core/transport.js';
3
+ /**
4
+ * Throws `FinTsProtocolError` if a message of `size` bytes exceeds the bank's `limit` in kilobytes (1024 bytes): the
5
+ * specification does not allow to send such a message.
6
+ */
7
+ export declare function checkMessageSize(size: number, limit: number | undefined): void;
8
+ /** The bank's FinTS endpoint: posts messages there and reports them to the logger. */
9
+ export declare class BankConnection {
10
+ private readonly logger;
11
+ private readonly transport;
12
+ /** Where the messages go, as `FinTsConfig` checked it. */
13
+ private readonly href;
14
+ /** Aborts the requests posted since the last `abortRequestsAfter`. */
15
+ private requests;
16
+ /** How many requests are on their way. */
17
+ private onTheirWay;
18
+ /** Starts the time of the requests posted after `abortRequestsAfter`, once none posted before is on its way. */
19
+ private startLaterRequests;
20
+ /** The timers of `abortRequestsAfter`, which `close` clears. */
21
+ private readonly deadlines;
22
+ /** A connection to `url` through `transport`, an `HttpTransport` by default. */
23
+ constructor(url: URL, transport: FinTsTransport | undefined, logger: MessageLogger | undefined);
24
+ /**
25
+ * Posts `body` to a new copy of the URL, so that a transport that changes the one it is given changes no later
26
+ * request.
27
+ *
28
+ * Reports any failure of the transport as `FinTsTransportError`: a custom transport that calls `fetch` fails with a
29
+ * `TypeError` where the network does, and one that throws another `FinTsError`, such as `FinTsPinError`, would pass
30
+ * for an answer of the bank. Of such an error only the message is kept (`failureMessage`), since it may hold `body`,
31
+ * as the errors of HTTP clients such as axios do.
32
+ *
33
+ * Once the time `abortRequestsAfter` gives is up, it fails at once, before anything reaches the transport
34
+ * (`checkSendable`), and a request on its way fails then without waiting for the transport, which may ignore the
35
+ * abort.
36
+ */
37
+ post(body: Uint8Array, contentType: string): Promise<Uint8Array>;
38
+ /**
39
+ * Throws the `FinTsTransportError` that `post` fails with once the time `abortRequestsAfter` gives is up; a caller
40
+ * checks it before it reports a message as outgoing, since such a message never goes out.
41
+ */
42
+ checkSendable(): void;
43
+ /** Reports a message to the logger; `message` is only built when a logger is set. */
44
+ log(direction: MessageDirection, message: () => string): void;
45
+ /**
46
+ * Gives the requests on their way `graceMs` to finish, and aborts them then. Those posted later, such as the dialog
47
+ * ends of a closing client, have as long again from the moment the earlier ones are over or aborted, and are aborted
48
+ * in turn once that time is up, as is any posted after it: a bank that has stopped answering would hold them up to
49
+ * the transport's timeout.
50
+ */
51
+ abortRequestsAfter(graceMs: number): void;
52
+ close(): void;
53
+ }
54
+ //# sourceMappingURL=bank-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bank-connection.d.ts","sourceRoot":"","sources":["../../src/v3/bank-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE1F;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAI9E;AAED,sFAAsF;AACtF,qBAAa,cAAc;IAsBvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IArBzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAE3C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAyB;IAEzC,0CAA0C;IAC1C,OAAO,CAAC,UAAU,CAAK;IAEvB,gHAAgH;IAChH,OAAO,CAAC,kBAAkB,CAA2B;IAErD,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IAEjE,gFAAgF;gBAE9E,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,cAAc,GAAG,SAAS,EACpB,MAAM,EAAE,aAAa,GAAG,SAAS;IAMpD;;;;;;;;;;;;OAYG;IACG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBtE;;;OAGG;IACH,aAAa,IAAI,IAAI;IAIrB,qFAAqF;IACrF,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,MAAM,GAAG,IAAI;IAI7D;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAuBzC,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,118 @@
1
+ import { FinTsProtocolError, FinTsTransportError } from '../core/errors.js';
2
+ import { failureMessage, HttpTransport } from '../core/transport.js';
3
+ /**
4
+ * Throws `FinTsProtocolError` if a message of `size` bytes exceeds the bank's `limit` in kilobytes (1024 bytes): the
5
+ * specification does not allow to send such a message.
6
+ */
7
+ export function checkMessageSize(size, limit) {
8
+ if (limit !== undefined && limit > 0 && size > limit * 1024) {
9
+ throw new FinTsProtocolError(`A message of ${size} bytes exceeds the bank's maximum message size of ${limit} KB`);
10
+ }
11
+ }
12
+ /** The bank's FinTS endpoint: posts messages there and reports them to the logger. */
13
+ export class BankConnection {
14
+ logger;
15
+ transport;
16
+ /** Where the messages go, as `FinTsConfig` checked it. */
17
+ href;
18
+ /** Aborts the requests posted since the last `abortRequestsAfter`. */
19
+ requests = new AbortController();
20
+ /** How many requests are on their way. */
21
+ onTheirWay = 0;
22
+ /** Starts the time of the requests posted after `abortRequestsAfter`, once none posted before is on its way. */
23
+ startLaterRequests;
24
+ /** The timers of `abortRequestsAfter`, which `close` clears. */
25
+ deadlines = [];
26
+ /** A connection to `url` through `transport`, an `HttpTransport` by default. */
27
+ constructor(url, transport, logger) {
28
+ this.logger = logger;
29
+ this.href = url.href;
30
+ this.transport = transport ?? new HttpTransport();
31
+ }
32
+ /**
33
+ * Posts `body` to a new copy of the URL, so that a transport that changes the one it is given changes no later
34
+ * request.
35
+ *
36
+ * Reports any failure of the transport as `FinTsTransportError`: a custom transport that calls `fetch` fails with a
37
+ * `TypeError` where the network does, and one that throws another `FinTsError`, such as `FinTsPinError`, would pass
38
+ * for an answer of the bank. Of such an error only the message is kept (`failureMessage`), since it may hold `body`,
39
+ * as the errors of HTTP clients such as axios do.
40
+ *
41
+ * Once the time `abortRequestsAfter` gives is up, it fails at once, before anything reaches the transport
42
+ * (`checkSendable`), and a request on its way fails then without waiting for the transport, which may ignore the
43
+ * abort.
44
+ */
45
+ async post(body, contentType) {
46
+ this.checkSendable();
47
+ const signal = this.requests.signal;
48
+ let stopWaiting;
49
+ const aborted = new Promise((_, reject) => {
50
+ stopWaiting = () => {
51
+ reject(new FinTsTransportError('Request aborted'));
52
+ };
53
+ });
54
+ signal.addEventListener('abort', stopWaiting);
55
+ this.onTheirWay++;
56
+ try {
57
+ return await Promise.race([this.transport.post(new URL(this.href), body, contentType, signal), aborted]);
58
+ }
59
+ catch (error) {
60
+ if (error instanceof FinTsTransportError)
61
+ throw error;
62
+ throw new FinTsTransportError(failureMessage(error));
63
+ }
64
+ finally {
65
+ signal.removeEventListener('abort', stopWaiting);
66
+ this.onTheirWay--;
67
+ if (this.onTheirWay === 0)
68
+ this.startLaterRequests?.();
69
+ }
70
+ }
71
+ /**
72
+ * Throws the `FinTsTransportError` that `post` fails with once the time `abortRequestsAfter` gives is up; a caller
73
+ * checks it before it reports a message as outgoing, since such a message never goes out.
74
+ */
75
+ checkSendable() {
76
+ if (this.requests.signal.aborted)
77
+ throw new FinTsTransportError('Request aborted');
78
+ }
79
+ /** Reports a message to the logger; `message` is only built when a logger is set. */
80
+ log(direction, message) {
81
+ this.logger?.(direction, message());
82
+ }
83
+ /**
84
+ * Gives the requests on their way `graceMs` to finish, and aborts them then. Those posted later, such as the dialog
85
+ * ends of a closing client, have as long again from the moment the earlier ones are over or aborted, and are aborted
86
+ * in turn once that time is up, as is any posted after it: a bank that has stopped answering would hold them up to
87
+ * the transport's timeout.
88
+ */
89
+ abortRequestsAfter(graceMs) {
90
+ const earlier = this.requests;
91
+ const later = new AbortController();
92
+ this.requests = later;
93
+ const afterGrace = (action) => {
94
+ this.deadlines.push(setTimeout(action, graceMs));
95
+ };
96
+ this.startLaterRequests = () => {
97
+ this.startLaterRequests = undefined;
98
+ afterGrace(() => {
99
+ later.abort();
100
+ });
101
+ };
102
+ if (this.onTheirWay === 0) {
103
+ this.startLaterRequests();
104
+ }
105
+ else {
106
+ afterGrace(() => {
107
+ earlier.abort();
108
+ this.startLaterRequests?.();
109
+ });
110
+ }
111
+ }
112
+ close() {
113
+ for (const deadline of this.deadlines)
114
+ clearTimeout(deadline);
115
+ this.transport.close();
116
+ }
117
+ }
118
+ //# sourceMappingURL=bank-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bank-connection.js","sourceRoot":"","sources":["../../src/v3/bank-connection.ts"],"names":[],"mappings":"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"}