@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/v3/syntax.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Internal to the package, and named after the FinTS specification. Documentation is where the meaning is not evident.
2
2
  import { BytesBuilder, latin1Decode, latin1Encode, utf8Encode } from '../util/bytes.js';
3
3
  import { FormatError } from '../util/errors.js';
4
- import { decodeBankText, tryParseInt } from '../util/text.js';
4
+ import { decodeBankText, isLatin1, trimBlanks, tryParseInt } from '../util/text.js';
5
5
  // FinTS 3.0 syntax characters.
6
6
  const dataElementSeparator = 0x2b; // '+'
7
7
  const groupElementSeparator = 0x3a; // ':'
@@ -15,17 +15,33 @@ function isSyntaxCharacter(byte) {
15
15
  byte === escapeCharacter ||
16
16
  byte === binaryMarker);
17
17
  }
18
- /** One (group) data element of a received segment: unescaped text bytes or binary data. */
18
+ /**
19
+ * One (group) data element of a received segment: text or binary data, from `start` to `end` in `source`. A view or
20
+ * copy of its own would take more memory than most elements hold.
21
+ */
19
22
  export class DataElement {
20
- bytes;
23
+ source;
24
+ start;
25
+ end;
21
26
  isBinary;
27
+ escaped;
22
28
  decoded;
23
- constructor(bytes, isBinary) {
24
- this.bytes = bytes;
29
+ constructor(source, start, end, isBinary,
30
+ /** Whether the text holds escape characters, which `bytes` leaves out. */
31
+ escaped = false) {
32
+ this.source = source;
33
+ this.start = start;
34
+ this.end = end;
25
35
  this.isBinary = isBinary;
36
+ this.escaped = escaped;
37
+ }
38
+ /** The binary data, or the text without escape characters. */
39
+ get bytes() {
40
+ const bytes = this.source.subarray(this.start, this.end);
41
+ return this.escaped ? unescape(bytes) : bytes;
26
42
  }
27
43
  get isEmpty() {
28
- return !this.isBinary && this.bytes.length === 0;
44
+ return !this.isBinary && this.start === this.end;
29
45
  }
30
46
  get text() {
31
47
  this.decoded ??= decodeBankText(this.bytes);
@@ -39,11 +55,21 @@ export class DataElement {
39
55
  */
40
56
  export class Segment {
41
57
  elements;
42
- constructor(elements) {
58
+ source;
59
+ start;
60
+ end;
61
+ typeValue;
62
+ constructor(elements,
63
+ /** The bytes the segment was read from: `start` to `end` in `source`, terminator included. */
64
+ source, start, end) {
43
65
  this.elements = elements;
66
+ this.source = source;
67
+ this.start = start;
68
+ this.end = end;
44
69
  }
45
70
  get type() {
46
- return this.text(0)?.trim() ?? '';
71
+ this.typeValue ??= trimBlanks(this.text(0) ?? '');
72
+ return this.typeValue;
47
73
  }
48
74
  get version() {
49
75
  return this.integer(0, 2) ?? 0;
@@ -63,38 +89,37 @@ export class Segment {
63
89
  return undefined;
64
90
  return e.text;
65
91
  }
92
+ /** The binary data at `index`; `undefined` for an element that holds text. */
66
93
  binary(index, sub = 0) {
94
+ const e = this.element(index, sub);
95
+ return e?.isBinary === true ? e.bytes : undefined;
96
+ }
97
+ /** The binary data or the text without escape characters at `index`; `undefined` for an empty element. */
98
+ bytes(index, sub = 0) {
99
+ const e = this.element(index, sub);
100
+ return e === undefined || e.isEmpty ? undefined : e.bytes;
101
+ }
102
+ /**
103
+ * The element at `index` as the bank sent it, for a value the client sends back, such as the dialog ID: untrimmed,
104
+ * and one character per byte (ISO 8859-1, the FinTS 3.0 character set), so that `Verbatim` gives the bank back the
105
+ * very bytes it sent, in whatever encoding. `undefined` for an empty element.
106
+ */
107
+ verbatim(index, sub = 0) {
67
108
  const e = this.element(index, sub);
68
109
  if (e === undefined || e.isEmpty)
69
110
  return undefined;
70
- return e.bytes;
111
+ return latin1Decode(e.bytes);
71
112
  }
72
113
  integer(index, sub = 0) {
73
- return tryParseInt(this.text(index, sub)?.trim());
114
+ return tryParseInt(this.text(index, sub));
74
115
  }
75
116
  /** The texts of the group at `index`; `undefined` for empty elements. */
76
117
  texts(index) {
77
118
  return this.group(index).map((e) => (e.isEmpty ? undefined : e.text));
78
119
  }
120
+ /** The bytes the segment was read from, as the bank sent them, terminator included. */
79
121
  encode() {
80
- const out = new BytesBuilder();
81
- this.elements.forEach((g, i) => {
82
- if (i > 0)
83
- out.addByte(dataElementSeparator);
84
- g.forEach((e, j) => {
85
- if (j > 0)
86
- out.addByte(groupElementSeparator);
87
- if (e.isBinary)
88
- writeBinary(out, e.bytes);
89
- else
90
- writeEscaped(out, e.bytes);
91
- });
92
- });
93
- out.addByte(segmentTerminator);
94
- return out.takeBytes();
95
- }
96
- toString() {
97
- return decodeBankText(this.encode());
122
+ return this.source.subarray(this.start, this.end);
98
123
  }
99
124
  }
100
125
  function writeEscaped(out, bytes) {
@@ -112,99 +137,136 @@ function writeBinary(out, bytes) {
112
137
  }
113
138
  /**
114
139
  * Encodes `value` in ISO 8859-1, the FinTS 3.0 character set, or in UTF-8 where it does not fit: such text can only
115
- * come from a bank that sends UTF-8, such as a TAN medium named `Max’s iPhone`. The clients check the login data for
116
- * ISO 8859-1 up front.
140
+ * come from a bank that sends UTF-8, such as a TAN medium named `Max’s iPhone`. `FinTsConfig` checks the login data for
141
+ * ISO 8859-1 up front, and the client the PIN and the TAN.
142
+ *
143
+ * @internal Exported for the tests.
117
144
  */
118
145
  export function encodeText(value) {
119
146
  return isLatin1(value) ? latin1Encode(value) : utf8Encode(value);
120
147
  }
121
- /** Whether `value` fits into ISO 8859-1, the FinTS 3.0 character set. */
122
- export function isLatin1(value) {
123
- for (let i = 0; i < value.length; i++)
124
- if (value.charCodeAt(i) > 0xff)
125
- return false;
126
- return true;
148
+ /**
149
+ * The data elements and segments one parse may produce together, segment headers and group elements included: what
150
+ * the user parameter data of 6,000 accounts take, at about 155 data elements each, which is about what 9,999 KB, the
151
+ * largest message size HIBPA can state, hold of real data. Without a limit, a message of nothing but separators would
152
+ * take a hundred times its size in memory.
153
+ *
154
+ * @internal Exported for the tests.
155
+ */
156
+ export const maxParts = 1_000_000;
157
+ /**
158
+ * What `IncomingMessage3.size` counts for each data element it keeps: more than any of them takes once parsed, so that
159
+ * a message of many short elements counts as the memory it holds rather than its bytes.
160
+ */
161
+ export const parsedElementBytes = 512;
162
+ /** Every empty data element of a received segment; it has no bytes to change. */
163
+ const emptyElement = new DataElement(new Uint8Array(0), 0, 0, false);
164
+ function isSeparator(byte) {
165
+ return byte === dataElementSeparator || byte === groupElementSeparator || byte === segmentTerminator;
166
+ }
167
+ /** Line breaks and spaces between segments are padding, not content. */
168
+ function isPadding(byte) {
169
+ return byte === 0x0a || byte === 0x0d || byte === 0x20;
170
+ }
171
+ function isDigit(byte) {
172
+ return byte !== undefined && byte >= 0x30 && byte <= 0x39;
127
173
  }
128
174
  /**
129
175
  * Splits a FinTS 3.0 message into segments, resolving escapes and binary data (`@length@bytes`).
130
176
  *
131
- * Throws `FormatError` for a negative binary length.
177
+ * The elements share the memory of `data`. Throws `FormatError` for anything a complete message cannot hold: a
178
+ * malformed binary length, binary data beyond the end of `data` or not followed by a separator, a last segment without
179
+ * terminator, and more than `maxParts` data elements and segments, an empty one included.
132
180
  */
133
181
  export function parseSegments(data) {
134
182
  const segments = [];
135
- let elements = [];
136
- let group = [];
137
- let current = [];
138
- let binary;
139
- let segmentStarted = false;
140
- const endElement = () => {
141
- group.push(binary !== undefined ? new DataElement(binary, true) : new DataElement(Uint8Array.from(current), false));
142
- current = [];
143
- binary = undefined;
144
- };
145
- const endSegment = () => {
146
- endElement();
147
- elements.push(group);
148
- const segment = new Segment(elements);
149
- // Skip empty segments, such as a stray double terminator.
150
- if (segment.type !== '')
151
- segments.push(segment);
152
- elements = [];
153
- group = [];
154
- segmentStarted = false;
183
+ let parts = 0;
184
+ const count = () => {
185
+ if (++parts > maxParts)
186
+ throw new FormatError(`More than ${maxParts} data elements and segments`);
155
187
  };
188
+ // Created with their first element: an array that starts empty reserves room for more than most of them hold.
189
+ let elements;
190
+ let group;
191
+ let segmentStart = 0;
156
192
  let i = 0;
157
- while (i < data.length) {
158
- const c = data[i];
159
- if (c === escapeCharacter) {
160
- if (i + 1 < data.length)
161
- current.push(data[i + 1]);
162
- segmentStarted = true;
163
- i += 2;
164
- continue;
193
+ const readBinary = () => {
194
+ let end = i + 1;
195
+ let length = 0;
196
+ while (isDigit(data[end])) {
197
+ length = length * 10 + data[end++] - 0x30;
198
+ if (length > data.length)
199
+ throw new FormatError('Binary data beyond the end of the message');
165
200
  }
166
- if (c === binaryMarker && current.length === 0 && binary === undefined) {
167
- const end = data.indexOf(binaryMarker, i + 1);
168
- const length = end > i + 1 ? tryParseInt(latin1Decode(data.subarray(i + 1, end))) : undefined;
169
- if (length !== undefined && length < 0)
170
- throw new FormatError('Negative binary length');
171
- // Compared this way round, a huge length cannot overflow the sum.
172
- if (length !== undefined && length <= data.length - (end + 1)) {
173
- binary = data.subarray(end + 1, end + 1 + length);
174
- segmentStarted = true;
175
- i = end + 1 + length;
176
- continue;
201
+ if (end === i + 1 || data[end] !== binaryMarker)
202
+ throw new FormatError('Malformed binary length');
203
+ const start = end + 1;
204
+ if (length > data.length - start)
205
+ throw new FormatError('Binary data beyond the end of the message');
206
+ i = start + length;
207
+ if (i < data.length && !isSeparator(data[i]))
208
+ throw new FormatError('Binary data not followed by a separator');
209
+ return new DataElement(data, start, i, true);
210
+ };
211
+ const readText = () => {
212
+ const start = i;
213
+ let escaped = false;
214
+ while (i < data.length && !isSeparator(data[i])) {
215
+ if (data[i] === escapeCharacter) {
216
+ escaped = true;
217
+ i++;
177
218
  }
219
+ i++;
178
220
  }
179
- if (c === groupElementSeparator) {
180
- endElement();
221
+ if (i > data.length)
222
+ throw new FormatError('Escape character at the end of the message');
223
+ return i === start ? emptyElement : new DataElement(data, start, i, false, escaped);
224
+ };
225
+ while (i < data.length) {
226
+ if (elements === undefined && group === undefined && isPadding(data[i])) {
227
+ i++;
228
+ continue;
181
229
  }
182
- else if (c === dataElementSeparator) {
183
- endElement();
230
+ count();
231
+ if (elements === undefined && group === undefined)
232
+ segmentStart = i;
233
+ const element = data[i] === binaryMarker ? readBinary() : readText();
234
+ if (group === undefined)
235
+ group = [element];
236
+ else
237
+ group.push(element);
238
+ const separator = data[i++];
239
+ if (separator === groupElementSeparator)
240
+ continue;
241
+ if (elements === undefined)
242
+ elements = [group];
243
+ else
184
244
  elements.push(group);
185
- group = [];
245
+ group = undefined;
246
+ if (separator === segmentTerminator) {
247
+ count();
248
+ const segment = new Segment(elements, data, segmentStart, i);
249
+ // Skip empty segments, such as a stray double terminator.
250
+ if (segment.type !== '')
251
+ segments.push(segment);
252
+ elements = undefined;
186
253
  }
187
- else if (c === segmentTerminator) {
188
- endSegment();
189
- }
190
- else {
191
- // Line breaks and spaces between segments are padding, not content.
192
- const isPadding = !segmentStarted &&
193
- current.length === 0 &&
194
- elements.length === 0 &&
195
- group.length === 0 &&
196
- (c === 0x0a || c === 0x0d || c === 0x20);
197
- if (!isPadding) {
198
- current.push(c);
199
- segmentStarted = true;
200
- }
201
- }
202
- i++;
203
254
  }
204
- if (segmentStarted && current.length > 0)
205
- endSegment();
255
+ if (elements !== undefined || group !== undefined)
256
+ throw new FormatError('Segment without terminator');
206
257
  return segments;
207
258
  }
259
+ /** `text` without the escape characters in front of syntax characters. */
260
+ function unescape(text) {
261
+ const out = new Uint8Array(text.length);
262
+ let o = 0;
263
+ for (let j = 0; j < text.length; j++) {
264
+ if (text[j] === escapeCharacter)
265
+ j++;
266
+ out[o++] = text[j];
267
+ }
268
+ return out.subarray(0, o);
269
+ }
208
270
  /** Binary data in a segment to send, written as `@length@bytes`. */
209
271
  export class Binary {
210
272
  bytes;
@@ -212,12 +274,28 @@ export class Binary {
212
274
  this.bytes = bytes;
213
275
  }
214
276
  }
277
+ /**
278
+ * A value the bank issued, such as the dialog ID, to send back as `Segment.verbatim` reads it: escaped, but not
279
+ * trimmed, so that the bank gets back the very bytes it sent. Text from elsewhere, such as a TAN medium name the app
280
+ * passes, goes out as `encodeText` encodes it.
281
+ */
282
+ export class Verbatim {
283
+ text;
284
+ constructor(text) {
285
+ this.text = text;
286
+ }
287
+ /** `text` as a `Verbatim`; `undefined` stays empty. */
288
+ static of(text) {
289
+ return text === undefined ? undefined : new Verbatim(text);
290
+ }
291
+ }
215
292
  /**
216
293
  * A segment to send.
217
294
  *
218
295
  * `elements` holds the data elements after the header: `null` or `undefined` for an empty element, an array for a data
219
- * element group, a boolean for `J`/`N`, `Binary` for binary data and anything else as its text, without leading and
220
- * trailing blanks. Trailing empty elements are left out, as the specification asks.
296
+ * element group, a boolean for `J`/`N`, `Binary` for binary data, `Verbatim` for a value the bank issued, and anything
297
+ * else as its text, without leading and trailing blanks. Trailing empty elements are left out, as the specification
298
+ * asks.
221
299
  */
222
300
  export class SegmentSpec {
223
301
  type;
@@ -288,13 +366,16 @@ function encodeValue(value) {
288
366
  else if (value instanceof Binary) {
289
367
  writeBinary(out, value.bytes);
290
368
  }
369
+ else if (value instanceof Verbatim) {
370
+ writeEscaped(out, encodeText(value.text));
371
+ }
291
372
  else if (typeof value === 'boolean') {
292
373
  out.addByte(value ? 0x4a : 0x4e); // 'J' or 'N'
293
374
  }
294
375
  else {
295
376
  // All but binary data go without leading and trailing blanks (Formals B.4.1). Encode first, then escape the bytes,
296
377
  // so that nothing unescaped slips into the syntax.
297
- writeEscaped(out, encodeText(String(value).trim()));
378
+ writeEscaped(out, encodeText(trimBlanks(String(value))));
298
379
  }
299
380
  return out.takeBytes();
300
381
  }
@@ -1 +1 @@
1
- {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/v3/syntax.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/v3/syntax.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coderoftime/fints",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "FinTS 3.0 client for German banks: accounts, balances and transactions with PIN/TAN, PSD2 strong customer authentication and decoupled app approval.",
5
5
  "keywords": [
6
6
  "fints",
@@ -39,25 +39,29 @@
39
39
  },
40
40
  "scripts": {
41
41
  "build": "rm -rf dist && tsc -p tsconfig.build.json",
42
- "typecheck": "tsc --noEmit",
42
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.build.json --noEmit",
43
43
  "lint": "eslint .",
44
44
  "format": "prettier --write .",
45
45
  "format:check": "prettier --check .",
46
+ "knip": "knip && knip --production",
46
47
  "test": "vitest run",
47
- "check": "npm run typecheck && npm run lint && npm run format:check && npm test",
48
+ "test:coverage": "vitest run --coverage",
49
+ "check": "npm run typecheck && npm run lint && npm run knip && npm run format:check && npm run test:coverage",
48
50
  "prepublishOnly": "npm run check && npm run build",
49
- "test:ci": "vitest run --reporter=default --reporter=junit --outputFile.junit=reports/junit.xml",
50
51
  "check:package": "npm run build && publint && npm pack --dry-run"
51
52
  },
52
53
  "devDependencies": {
53
54
  "@eslint/js": "^10.0.1",
54
- "@types/node": "^26.6.4",
55
+ "@types/node": "22.12.0",
56
+ "@vitest/coverage-v8": "5.0.2",
55
57
  "eslint": "^10.12.0",
58
+ "fast-check": "4.10.2",
59
+ "knip": "6.38.0",
56
60
  "prettier": "^3.9.9",
57
61
  "publint": "^0.3.25",
58
62
  "typescript": "~6.0.3",
59
63
  "typescript-eslint": "^8.71.1",
60
- "vitest": "^5.0.3"
64
+ "vitest": "5.0.2"
61
65
  },
62
66
  "publishConfig": {
63
67
  "access": "public"