@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
@@ -1,83 +1,50 @@
1
1
  // Internal to the package, and named after the FinTS specification. Documentation is where the meaning is not evident.
2
- import { requirePin } from '../core/config.js';
3
- import { FinTsError, FinTsTransportError, FinTsUnsupportedError } from '../core/errors.js';
4
- import { hasErrors } from '../core/feedback.js';
5
- import { camtTransactions, mt940Transactions } from '../formats/readers.js';
6
- import { BankConnection, checkMessageSize } from '../session/bank-connection.js';
7
- import { LoginGuard } from '../session/login-guard.js';
8
- import { offeredVersion, requireBankParameters } from '../session/parameter-data.js';
9
- import { balanceQuery, checkBeforeSigning, chooseTransactions, } from '../session/protocol.js';
10
- import { invalidArgument } from '../util/errors.js';
11
- import { readOptionalString } from '../util/json.js';
2
+ import { requirePinLength } from '../core/config.js';
3
+ import { clientClosedError } from '../core/errors.js';
12
4
  import { decodeBankText } from '../util/text.js';
13
- import { FinTs3Dialog } from './dialog.js';
14
- import { buildMessage, decodeTransport, encodeTransport, IncomingMessage3 } from './message.js';
15
- import { Bpd3, decodeSegments, encodeSegments, Upd3 } from './parameters.js';
16
- import { balanceAccount, parseBalance, parseSepaAccounts, parseTanMedia, Segments } from './segments.js';
17
- import { isLatin1 } from './syntax.js';
5
+ import { BankConnection, checkMessageSize } from './bank-connection.js';
6
+ import { buildMessage, decodeTransport, encodeTransport } from './message.js';
7
+ import { Segments } from './segments.js';
18
8
  /** Customer ID the specification reserves for anonymous dialogs. */
19
9
  const anonymousCustomerId = '9999999999';
20
- /** Longest product ID (Produktbezeichnung) and product version HKVVB takes. */
21
- const maxProductIdLength = 25;
22
- const maxProductVersionLength = 5;
23
- function requireLatin1(text, name) {
24
- // The message leaves out the value, which may be the PIN.
25
- if (!isLatin1(text))
26
- throw invalidArgument(`${name} contains characters FinTS 3.0 cannot send (ISO 8859-1 only)`);
27
- return text;
10
+ /**
11
+ * How long the request on its way when the client is closed may take, and then its dialog ends, where the transport
12
+ * takes the abort (`beginClose`).
13
+ */
14
+ const closingGraceMs = 5000;
15
+ /**
16
+ * Throws if `limits` rule out a message of `size` bytes, or the length of `loginPin`, the PIN of a login: `TypeError`
17
+ * for the PIN, which the bank would count as a failed attempt, and `FinTsProtocolError` for the size.
18
+ */
19
+ function checkLimits(limits, size, loginPin) {
20
+ if (loginPin !== undefined)
21
+ requirePinLength(loginPin, limits.pinLength?.min, limits.pinLength?.max);
22
+ checkMessageSize(size, limits.maxMessageSize);
28
23
  }
29
- function requireMaxLength(text, maxLength, name) {
30
- if (text.length > maxLength)
31
- throw invalidArgument(`At most ${maxLength} characters in FinTS 3.0`, name);
24
+ /** Whether `segments` are those of a dialog end, the one message a closing client still sends. */
25
+ function isDialogEnd(segments) {
26
+ return segments.length === 1 && segments[0].type === 'HKEND';
32
27
  }
33
- function requireSendable(config) {
34
- requireLatin1(config.userId, 'userId');
35
- requireLatin1(config.customerId, 'customerId');
36
- requireLatin1(config.productId, 'productId');
37
- requireLatin1(config.productVersion, 'productVersion');
38
- // Cut short, the product would be one the bank does not know.
39
- requireMaxLength(config.productId, maxProductIdLength, 'productId');
40
- requireMaxLength(config.productVersion, maxProductVersionLength, 'productVersion');
41
- return config;
42
- }
43
- /** The segments of `type` in all `pages`. */
44
- function all(pages, type) {
45
- return pages.flatMap((p) => p.findAll(type));
46
- }
47
- /** FinTS 3.0 messages and business transactions (HBCI segment syntax, PIN/TAN security). */
28
+ /**
29
+ * Builds, signs and posts FinTS 3.0 messages (HBCI segment syntax, PIN/TAN security) for the user `parameters.config`
30
+ * names, with the parameter data and IDs `parameters` keeps. Every message signed with the PIN takes it from the
31
+ * `PinGuard` (`post`), which keeps it from going out after a refused login.
32
+ */
48
33
  export class FinTs3Protocol {
34
+ parameters;
35
+ guard;
49
36
  config;
50
- pin;
51
37
  connection;
52
- loginGuard = new LoginGuard();
53
- /** Customer system ID the bank assigned in the synchronization. */
54
- systemId;
55
- bpd;
56
- upd;
57
- /**
58
- * Throws `TypeError` if the PIN is empty, if the PIN or login data contain characters FinTS 3.0 cannot send (ISO
59
- * 8859-1 only), or the product ID or version is longer than its field in HKVVB.
60
- */
61
- constructor(config, pin, transport, logger) {
62
- this.config = requireSendable(config);
63
- this.pin = requireLatin1(requirePin(pin), 'pin');
64
- this.connection = new BankConnection(config.url, transport, logger);
65
- }
66
- get bankParameters() {
67
- return this.bpd;
68
- }
69
- get userParameters() {
70
- return this.upd;
71
- }
72
- /** Dialogs cannot start without the customer system ID. */
73
- get synchronization() {
74
- return this.systemId === undefined ? 'required' : 'none';
75
- }
76
- forgetSystemId() {
77
- const had = this.systemId !== undefined;
78
- this.systemId = undefined;
79
- return had;
80
- }
38
+ closing = false;
39
+ /** The error with which the limits last stopped a login (`stoppedLogin`). */
40
+ stoppedLoginError;
41
+ constructor(parameters, guard, transport, logger) {
42
+ this.parameters = parameters;
43
+ this.guard = guard;
44
+ this.config = parameters.config;
45
+ this.connection = new BankConnection(this.config.url, transport, logger);
46
+ }
47
+ /** Identification (HKIDN) and processing preparation (HKVVB), which open every dialog. */
81
48
  initSegments(systemId, anonymous = false) {
82
49
  return [
83
50
  Segments.identification({
@@ -88,173 +55,87 @@ export class FinTs3Protocol {
88
55
  systemIdRequired: !anonymous,
89
56
  }),
90
57
  Segments.processingPreparation({
91
- bpdVersion: this.bpd?.version ?? 0,
92
- updVersion: anonymous ? 0 : (this.upd?.version ?? 0),
93
- language: this.bpd?.dialogLanguage ?? 0,
58
+ bpdVersion: this.parameters.reportedBpdVersion,
59
+ updVersion: anonymous ? 0 : this.parameters.reportedUpdVersion,
60
+ language: this.parameters.bankParameters?.dialogLanguage ?? 0,
94
61
  productId: this.config.productId,
95
62
  productVersion: this.config.productVersion,
96
63
  }),
97
64
  ];
98
65
  }
66
+ /**
67
+ * Sends `segments` as message `number` of the dialog `dialogId` and returns the bank's answer, not yet parsed.
68
+ *
69
+ * With `signing` the message is signed with the PIN, which `PinGuard.pin` hands out, and the `tan`; without, it
70
+ * goes out unsigned, as in an anonymous dialog.
71
+ */
99
72
  async post(message) {
73
+ if (this.closing && !isDialogEnd(message.segments))
74
+ throw clientClosedError();
100
75
  const signing = message.signing;
101
- if (signing !== undefined)
102
- checkBeforeSigning(this.loginGuard, this.pin, this.bpd);
76
+ const security = signing === undefined
77
+ ? undefined
78
+ : {
79
+ countryCode: this.config.countryCode,
80
+ bankCode: this.config.bankCode,
81
+ userId: this.config.userId,
82
+ systemId: signing.systemId,
83
+ pin: this.guard.pin,
84
+ securityFunction: signing.securityFunction,
85
+ };
86
+ // The first message of a signed dialog logs in: from here on the bank may count the PIN.
87
+ const login = security !== undefined && message.number === 1;
103
88
  const outgoing = buildMessage({
104
89
  dialogId: message.dialogId,
105
90
  messageNumber: message.number,
106
91
  segments: message.segments,
107
- security: signing === undefined
108
- ? undefined
109
- : {
110
- countryCode: this.config.countryCode,
111
- bankCode: this.config.bankCode,
112
- userId: this.config.userId,
113
- systemId: signing.systemId,
114
- pin: this.pin,
115
- securityFunction: signing.securityFunction,
116
- },
92
+ security,
117
93
  tan: message.tan,
118
94
  });
119
- checkMessageSize(outgoing.bytes.length, this.bpd?.bankInfo.maxMessageSize);
95
+ this.checkOutgoing(outgoing.bytes.length, login ? security.pin : undefined);
96
+ this.connection.checkSendable();
120
97
  this.connection.log('outgoing', () => outgoing.masked);
98
+ if (login)
99
+ this.guard.loginSent();
121
100
  const bytes = decodeTransport(await this.connection.post(encodeTransport(outgoing.bytes), 'text/plain'));
122
101
  this.connection.log('incoming', () => decodeBankText(bytes));
123
102
  return bytes;
124
103
  }
125
- keepParameterData(response) {
126
- this.keepBankParameters(response);
127
- this.upd = Upd3.fromSegments(response.segments, this.config.bankCode, this.config.countryCode) ?? this.upd;
128
- this.systemId = response.find('HISYN')?.text(1) ?? this.systemId;
129
- }
130
- keepBankParameters(response) {
131
- this.bpd = Bpd3.fromSegments(response.segments, this.config.bankCode) ?? this.bpd;
132
- }
133
- /** Keeps the bank parameter data of an anonymous dialog, and nothing that belongs to a user. */
134
- async fetchBankParametersAnonymously() {
135
- const response = await this.requestBankParametersAnonymously();
136
- this.keepBankParameters(response);
137
- return response;
138
- }
139
104
  /**
140
- * Asks for the bank parameter data in an anonymous dialog that announces strong customer authentication; a bank that
141
- * rejects the announcement, with a return code or by failing on it, is asked again without it.
105
+ * Throws if the limits of the parameter data rule out a message of `size` bytes, or the length of `loginPin`, the PIN
106
+ * of a login (`checkLimits`). The later messages of a dialog, its end included, take the PIN the bank has accepted,
107
+ * whatever the parameter data it delivered since say.
142
108
  *
143
- * A timeout or a broken connection is not a reason to ask again: it would only double the wait.
109
+ * Remembers the error that stops a login (`stoppedLogin`): the parameter data may be outdated, as saved ones are,
110
+ * and new ones would come only in answer to the login they rule out.
144
111
  */
145
- async requestBankParametersAnonymously() {
146
- let announced;
112
+ checkOutgoing(size, loginPin) {
147
113
  try {
148
- announced = await this.anonymousDialog(true);
114
+ checkLimits(this.parameters.limits, size, loginPin);
149
115
  }
150
116
  catch (error) {
151
- if (error instanceof FinTsTransportError && error.statusCode === undefined)
152
- throw error;
153
- if (!(error instanceof FinTsError))
154
- throw error;
155
- return this.anonymousDialog(false);
117
+ if (loginPin !== undefined)
118
+ this.stoppedLoginError = error;
119
+ throw error;
156
120
  }
157
- if (!hasErrors(announced.feedback) || announced.find('HIBPA') !== undefined)
158
- return announced;
159
- return this.anonymousDialog(false);
160
121
  }
161
- async anonymousDialog(announceSca) {
162
- const dialog = FinTs3Dialog.anonymous(this);
163
- try {
164
- return await dialog.requestBankParameters(announceSca);
165
- }
166
- finally {
167
- await dialog.end();
168
- }
169
- }
170
- newDialog(method, tanMedium) {
171
- return FinTs3Dialog.signed(this, method, tanMedium);
172
- }
173
- combine(first, second) {
174
- return IncomingMessage3.combine(first, second);
175
- }
176
- // --- Business transactions ---
177
- version(transaction, implemented, options = {}) {
178
- return offeredVersion(this.bpd, this.upd, transaction, new Set(implemented), options);
179
- }
180
- tanMedia() {
181
- const version = this.version('HKTAB', [4, 5]);
182
- if (version === undefined)
183
- return undefined;
184
- return {
185
- order: () => Segments.tanMedia(version),
186
- read: (pages) => all(pages, 'HITAB').flatMap(parseTanMedia),
187
- };
188
- }
189
- sepaAccounts() {
190
- const version = this.version('HKSPA', [1, 2, 3], { requiresEntry: true });
191
- if (version === undefined)
192
- return undefined;
193
- return {
194
- order: (continuation) => Segments.sepaAccounts(version, continuation),
195
- read: (pages) => all(pages, 'HISPA').flatMap((s) => parseSepaAccounts(s, this.config.countryCode, this.config.bankCode)),
196
- };
197
- }
198
- balance(account) {
199
- const version = this.version('HKSAL', [6, 7, 8], { account });
200
- if (version === undefined) {
201
- throw new FinTsUnsupportedError('The bank reports no balance (HKSAL) for this account');
202
- }
203
- return balanceQuery(account, {
204
- order: (continuation) => Segments.balance(version, account, continuation),
205
- records: (pages) => all(pages, 'HISAL'),
206
- accountOf: balanceAccount,
207
- read: parseBalance,
208
- });
122
+ /** Whether `error` is the one with which the limits of the parameter data last stopped a login. */
123
+ stoppedLogin(error) {
124
+ return this.stoppedLoginError !== undefined && this.stoppedLoginError === error;
209
125
  }
210
- transactions(account, format, from, to) {
211
- const request = chooseTransactions(format, account, this.upd, {
212
- camt: { name: 'HKCAZ', version: this.version('HKCAZ', [1], { account }) },
213
- camtFormats: requireBankParameters(this.bpd).camtFormats,
214
- mt940: { name: 'HKKAZ', version: this.version('HKKAZ', [6, 7], { account }) },
215
- });
216
- const version = request.version;
217
- if (request.camt) {
218
- return {
219
- order: (continuation) => Segments.transactionsCamt(version, account, request.camtFormats, { from, to, continuation }),
220
- // The third element group holds the booked documents, the fourth element the pending one.
221
- read: (pages) => camtTransactions(all(pages, 'HICAZ').flatMap((s) => s
222
- .group(3)
223
- .filter((d) => !d.isEmpty)
224
- .map((d) => d.bytes)), all(pages, 'HICAZ')
225
- .map((s) => s.binary(4))
226
- .filter((d) => d !== undefined)),
227
- };
228
- }
229
- return {
230
- order: (continuation) => Segments.transactionsMt940(version, account, { from, to, continuation }),
231
- // The first element holds the booked transactions, the second the pending ones.
232
- read: (pages) => mt940Transactions(all(pages, 'HIKAZ')
233
- .map((s) => s.binary(1))
234
- .filter((d) => d !== undefined), all(pages, 'HIKAZ')
235
- .map((s) => s.binary(2))
236
- .filter((d) => d !== undefined), request.currency),
237
- };
126
+ /** Whether the client is closing, so that only dialog ends go out (`beginClose`). */
127
+ get isClosing() {
128
+ return this.closing;
238
129
  }
239
- // --- Saved state ---
240
- saveState() {
241
- return {
242
- systemId: this.systemId ?? null,
243
- bpd: this.bpd === undefined ? null : encodeSegments(this.bpd.segments),
244
- upd: this.upd === undefined ? null : encodeSegments(this.upd.segments),
245
- };
246
- }
247
- restoreState(saved) {
248
- const bpd = readOptionalString(saved, 'bpd');
249
- const upd = readOptionalString(saved, 'upd');
250
- const restoredSystemId = readOptionalString(saved, 'systemId');
251
- const restoredBpd = bpd === undefined ? undefined : Bpd3.fromSegments(decodeSegments(bpd), this.config.bankCode);
252
- const restoredUpd = upd === undefined
253
- ? undefined
254
- : Upd3.fromSegments(decodeSegments(upd), this.config.bankCode, this.config.countryCode);
255
- this.systemId = restoredSystemId;
256
- this.bpd = restoredBpd;
257
- this.upd = restoredUpd;
130
+ /**
131
+ * Sends nothing but dialog ends from now on: any other message fails with `FinTsStateError` before it goes out, so
132
+ * that a call under way stops at its next one. The request on its way has `closingGraceMs` to bring its answer, which
133
+ * counts as any other, and is aborted then; the dialog ends have as long again once it is over, and none goes out
134
+ * later. The client calls it as soon as it is closed, and `close` once it has ended its dialog.
135
+ */
136
+ beginClose() {
137
+ this.closing = true;
138
+ this.connection.abortRequestsAfter(closingGraceMs);
258
139
  }
259
140
  close() {
260
141
  this.connection.close();
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/v3/protocol.ts"],"names":[],"mappings":"AAAA,uHAAuH;AAKvH,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GAInB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAmB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAwC,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAkC,MAAM,aAAa,CAAC;AAEvE,oEAAoE;AACpE,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEzC,+EAA+E;AAC/E,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAKlC,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,0DAA0D;IAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,eAAe,CAAC,GAAG,IAAI,8DAA8D,CAAC,CAAC;IAClH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,SAAiB,EAAE,IAAY;IACrE,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS;QAAE,MAAM,eAAe,CAAC,WAAW,SAAS,0BAA0B,EAAE,IAAI,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB;IAC1C,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC/C,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC7C,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACvD,8DAA8D;IAC9D,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;IACpE,gBAAgB,CAAC,MAAM,CAAC,cAAc,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6CAA6C;AAC7C,SAAS,GAAG,CAAC,KAAkC,EAAE,IAAY;IAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,4FAA4F;AAC5F,MAAM,OAAO,cAAc;IAChB,MAAM,CAAc;IACZ,GAAG,CAAS;IACZ,UAAU,CAAiB;IACnC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IAEvC,mEAAmE;IACnE,QAAQ,CAAqB;IACrB,GAAG,CAAmB;IACtB,GAAG,CAAmB;IAE9B;;;OAGG;IACH,YAAY,MAAmB,EAAE,GAAW,EAAE,SAA0B,EAAE,MAAsB;QAC9F,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,2DAA2D;IAC3D,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,cAAc;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,YAAY,CAAC,QAAgB,EAAE,SAAS,GAAG,KAAK;QAC9C,OAAO;YACL,QAAQ,CAAC,cAAc,CAAC;gBACtB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;gBACpE,QAAQ;gBACR,gBAAgB,EAAE,CAAC,SAAS;aAC7B,CAAC;YACF,QAAQ,CAAC,qBAAqB,CAAC;gBAC7B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC;gBAClC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;gBACpD,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,cAAc,IAAI,CAAC;gBACvC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;aAC3C,CAAC;SACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAMV;QACC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,KAAK,SAAS;YAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EACN,OAAO,KAAK,SAAS;gBACnB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;oBACpC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;oBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;iBAC3C;YACP,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;QACzG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB,CAAC,QAA0B;QAC1C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;QAC3G,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;IACnE,CAAC;IAEO,kBAAkB,CAAC,QAA0B;QACnD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;IACpF,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,8BAA8B;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAC/D,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,gCAAgC;QAC5C,IAAI,SAA2B,CAAC;QAChC,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;gBAAE,MAAM,KAAK,CAAC;YACxF,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,KAAK,CAAC;YAChD,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9F,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,WAAoB;QAChD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,SAAS,CAAC,MAAiB,EAAE,SAAkB;QAC7C,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,KAAuB,EAAE,MAAwB;QACvD,OAAO,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,gCAAgC;IAExB,OAAO,CACb,WAAmB,EACnB,WAA8B,EAC9B,UAA0D,EAAE;QAE5D,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IAED,QAAQ;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO;YACL,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;SAC5D,CAAC;IACJ,CAAC;IAED,YAAY;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO;YACL,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC;YACrE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACd,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC1G,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,OAAgB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,qBAAqB,CAAC,sDAAsD,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,YAAY,CAAyC,OAAO,EAAE;YACnE,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC;YACzE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;YACvC,SAAS,EAAE,cAAc;YACzB,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CACV,OAAgB,EAChB,MAAyB,EACzB,IAAsB,EACtB,EAAoB;QAEpB,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;YAC5D,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;YACzE,WAAW,EAAE,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW;YACxD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SAC9E,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,CACtB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC;gBAC9F,0FAA0F;gBAC1F,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACd,gBAAgB,CACd,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAChC,CAAC;qBACE,KAAK,CAAC,CAAC,CAAC;qBACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;qBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CACvB,EACD,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;qBAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;qBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAClC;aACJ,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC;YACjG,gFAAgF;YAChF,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACd,iBAAiB,CACf,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;iBAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,EACjC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;iBAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,EACjC,OAAO,CAAC,QAAQ,CACjB;SACJ,CAAC;IACJ,CAAC;IAED,sBAAsB;IAEtB,SAAS;QACP,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;YAC/B,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YACtE,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;SACvE,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,KAAiB;QAC5B,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjH,MAAM,WAAW,GACf,GAAG,KAAK,SAAS;YACf,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5F,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/v3/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { Account } from '../core/account.js';
2
+ import type { Balance } from '../core/balance.js';
3
+ import type { FinTsFeedback } from '../core/feedback.js';
4
+ import type { Transaction, TransactionFormat } from '../core/transaction.js';
5
+ import type { TanMedium } from '../tan/tan-models.js';
6
+ import type { IncomingMessage3 } from './message.js';
7
+ import type { ParameterStore } from './parameter-store.js';
8
+ import type { Segment, SegmentSpec } from './syntax.js';
9
+ /**
10
+ * A business transaction: the order to send for each page, and how to read all pages the bank sent.
11
+ *
12
+ * Where the bank does not offer the transaction, the builders of the lookups the session makes for itself, of the TAN
13
+ * media and the SEPA accounts, return `undefined`, and those of the app's queries, of a balance and of transactions,
14
+ * throw `FinTsUnsupportedError`.
15
+ */
16
+ export interface Query<T> {
17
+ /** The order for the page at `continuation`; `undefined` for the first page. */
18
+ readonly order: (continuation: string | undefined) => SegmentSpec;
19
+ /** Reads the result; throws `FormatError` for malformed data. */
20
+ readonly read: (pages: readonly IncomingMessage3[]) => T;
21
+ }
22
+ /** Lists the TAN media, and keeps the names as the bank sent them in `parameters`; `undefined` if the bank does not. */
23
+ export declare function tanMediaQuery(parameters: ParameterStore): Query<TanMedium[]> | undefined;
24
+ /** Lists IBAN and BIC of the accounts; `undefined` if the bank does not offer it. */
25
+ export declare function sepaAccountsQuery(parameters: ParameterStore): Query<Account[]> | undefined;
26
+ /**
27
+ * The balance (HISAL) of `account` in `records`: the one whose account matches. A single record must match as well,
28
+ * though the query asked for this one account only: it names the account it is for.
29
+ *
30
+ * Throws `FinTsBankError` with the bank's `feedback` if there is none, and `FinTsProtocolError` if none matches.
31
+ *
32
+ * @internal Exported for the tests.
33
+ */
34
+ export declare function balanceRecord(records: readonly Segment[], account: Account, feedback: readonly FinTsFeedback[]): Segment;
35
+ /**
36
+ * The balance of `account`, which the session has taken as the bank knows it, with the transactions the bank permits
37
+ * for it (`SepaAccounts.complete`); throws `FinTsUnsupportedError` if the bank does not report balances.
38
+ */
39
+ export declare function balanceQuery(parameters: ParameterStore, account: Account): Query<Balance>;
40
+ /**
41
+ * The transactions of `account` in `format`, from the day of `from` to that of `to`. The session has taken `account` as
42
+ * the bank knows it, with the transactions the bank permits for it and its currency (`SepaAccounts.complete`).
43
+ *
44
+ * The client reads camt.052 only, so camt counts as offered only where the bank offers a camt.052 format. With `auto`
45
+ * the client takes camt where the bank offers it, unless MT940 can be requested for the account and the user parameter
46
+ * data list only MT940 transactions for it.
47
+ *
48
+ * Throws `FinTsUnsupportedError` if the bank does not offer the chosen format for the account.
49
+ */
50
+ export declare function transactionsQuery(parameters: ParameterStore, account: Account, format: TransactionFormat, from: Date | undefined, to: Date | undefined): Query<Transaction[]>;
51
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/v3/queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,KAAK,WAAW,CAAC;IAElE,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,KAAK,CAAC,CAAC;CAC1D;AAsBD,wHAAwH;AACxH,wBAAgB,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,SAAS,CAYxF;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAQ1F;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,SAAS,aAAa,EAAE,GACjC,OAAO,CAOT;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAkBzF;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,IAAI,GAAG,SAAS,EACtB,EAAE,EAAE,IAAI,GAAG,SAAS,GACnB,KAAK,CAAC,WAAW,EAAE,CAAC,CA4DtB"}
@@ -0,0 +1,128 @@
1
+ // Internal to the package, and named after the FinTS specification. Documentation is where the meaning is not evident.
2
+ import { FinTsBankError, FinTsProtocolError, FinTsUnsupportedError } from '../core/errors.js';
3
+ import { camtTransactions, mt940Transactions } from '../formats/readers.js';
4
+ import { lists, offeredVersion, requireBankParameters } from './parameters.js';
5
+ import { balanceAccount, camtAccount, parseBalance, parseSepaAccounts, parseTanMedia, Segments } from './segments.js';
6
+ /** The segments of `type` in all `pages`. */
7
+ function all(pages, type) {
8
+ return pages.flatMap((p) => p.findAll(type));
9
+ }
10
+ function version(parameters, transaction, implemented, options = {}) {
11
+ return offeredVersion(parameters.bankParameters, parameters.userParameters, transaction, new Set(implemented), options);
12
+ }
13
+ /** Lists the TAN media, and keeps the names as the bank sent them in `parameters`; `undefined` if the bank does not. */
14
+ export function tanMediaQuery(parameters) {
15
+ const offered = version(parameters, 'HKTAB', [4, 5]);
16
+ if (offered === undefined)
17
+ return undefined;
18
+ return {
19
+ order: () => Segments.tanMedia(offered),
20
+ read: (pages) => {
21
+ const names = new Map();
22
+ const media = all(pages, 'HITAB').flatMap((s) => parseTanMedia(s, names));
23
+ parameters.keepTanMediumNames(names);
24
+ return media;
25
+ },
26
+ };
27
+ }
28
+ /** Lists IBAN and BIC of the accounts; `undefined` if the bank does not offer it. */
29
+ export function sepaAccountsQuery(parameters) {
30
+ const offered = version(parameters, 'HKSPA', [1, 2, 3], { requiresEntry: true });
31
+ if (offered === undefined)
32
+ return undefined;
33
+ const { countryCode, bankCode } = parameters.config;
34
+ return {
35
+ order: (continuation) => Segments.sepaAccounts(offered, continuation),
36
+ read: (pages) => all(pages, 'HISPA').flatMap((s) => parseSepaAccounts(s, countryCode, bankCode)),
37
+ };
38
+ }
39
+ /**
40
+ * The balance (HISAL) of `account` in `records`: the one whose account matches. A single record must match as well,
41
+ * though the query asked for this one account only: it names the account it is for.
42
+ *
43
+ * Throws `FinTsBankError` with the bank's `feedback` if there is none, and `FinTsProtocolError` if none matches.
44
+ *
45
+ * @internal Exported for the tests.
46
+ */
47
+ export function balanceRecord(records, account, feedback) {
48
+ if (records.length === 0)
49
+ throw new FinTsBankError(feedback, 'No balance returned');
50
+ const match = records.find((record) => balanceAccount(record).matches(account));
51
+ if (match === undefined) {
52
+ throw new FinTsProtocolError('The bank returned balances, but none for the requested account');
53
+ }
54
+ return match;
55
+ }
56
+ /**
57
+ * The balance of `account`, which the session has taken as the bank knows it, with the transactions the bank permits
58
+ * for it (`SepaAccounts.complete`); throws `FinTsUnsupportedError` if the bank does not report balances.
59
+ */
60
+ export function balanceQuery(parameters, account) {
61
+ const offered = version(parameters, 'HKSAL', [6, 7, 8], { account });
62
+ if (offered === undefined) {
63
+ throw new FinTsUnsupportedError('The bank reports no balance (HKSAL) for this account');
64
+ }
65
+ const nationalAllowed = requireBankParameters(parameters.bankParameters).nationalAccountAllowed;
66
+ return {
67
+ order: (continuation) => Segments.balance(offered, account, nationalAllowed, continuation),
68
+ read: (pages) => parseBalance(balanceRecord(all(pages, 'HISAL'), account, pages.flatMap((p) => p.feedback)), account),
69
+ };
70
+ }
71
+ /**
72
+ * The transactions of `account` in `format`, from the day of `from` to that of `to`. The session has taken `account` as
73
+ * the bank knows it, with the transactions the bank permits for it and its currency (`SepaAccounts.complete`).
74
+ *
75
+ * The client reads camt.052 only, so camt counts as offered only where the bank offers a camt.052 format. With `auto`
76
+ * the client takes camt where the bank offers it, unless MT940 can be requested for the account and the user parameter
77
+ * data list only MT940 transactions for it.
78
+ *
79
+ * Throws `FinTsUnsupportedError` if the bank does not offer the chosen format for the account.
80
+ */
81
+ export function transactionsQuery(parameters, account, format, from, to) {
82
+ const bpd = requireBankParameters(parameters.bankParameters);
83
+ const camtVersion = bpd.camtFormats.length === 0 ? undefined : version(parameters, 'HKCAZ', [1], { account });
84
+ const mt940Version = version(parameters, 'HKKAZ', [6, 7], { account });
85
+ const camt = format === 'camt' ||
86
+ (format === 'auto' &&
87
+ camtVersion !== undefined &&
88
+ (mt940Version === undefined || lists(account, 'HKCAZ') || !lists(account, 'HKKAZ')));
89
+ const offered = camt ? camtVersion : mt940Version;
90
+ if (offered === undefined) {
91
+ throw new FinTsUnsupportedError(`The bank offers no ${camt ? 'camt ' : ''}transactions (${camt ? 'HKCAZ' : 'HKKAZ'}) for this account`);
92
+ }
93
+ if (camt) {
94
+ return {
95
+ order: (continuation) => Segments.transactionsCamt(offered, account, bpd.nationalAccountAllowed, bpd.camtFormats, {
96
+ from,
97
+ to,
98
+ continuation,
99
+ }),
100
+ // The first element names the account, the third element group holds the booked documents, the fourth
101
+ // element the pending one: binary data, which a bank may send as text instead.
102
+ read: (pages) => {
103
+ const segments = all(pages, 'HICAZ');
104
+ if (!segments.every((s) => camtAccount(s).matches(account))) {
105
+ throw new FinTsProtocolError('The bank returned the transactions of another account than the one asked for');
106
+ }
107
+ return camtTransactions(segments.flatMap((s) => s
108
+ .group(3)
109
+ .filter((d) => !d.isEmpty)
110
+ .map((d) => d.bytes)), segments.map((s) => s.bytes(4)).filter((d) => d !== undefined));
111
+ },
112
+ };
113
+ }
114
+ return {
115
+ order: (continuation) => Segments.transactionsMt940(offered, account, bpd.nationalAccountAllowed, { from, to, continuation }),
116
+ // The first element holds the booked transactions, the second the pending ones: binary data, which a bank may send
117
+ // as text instead. Unlike HICAZ, HIKAZ names no account, and banks write the account line of a statement (`:25:`)
118
+ // in many ways, so it is not compared with `account`: a strict comparison would fail every query of such a bank.
119
+ read: (pages) => mt940Transactions(all(pages, 'HIKAZ')
120
+ .map((s) => s.bytes(1))
121
+ .filter((d) => d !== undefined), all(pages, 'HIKAZ')
122
+ .map((s) => s.bytes(2))
123
+ .filter((d) => d !== undefined),
124
+ // The currency of statements that state none.
125
+ account.currency),
126
+ };
127
+ }
128
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/v3/queries.ts"],"names":[],"mappings":"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"}