@coderoftime/fints 0.1.0 → 0.2.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 (272) hide show
  1. package/CHANGELOG.md +142 -1
  2. package/README.md +127 -37
  3. package/dist/client.d.ts +48 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +199 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/core/account.d.ts +35 -7
  8. package/dist/core/account.d.ts.map +1 -1
  9. package/dist/core/account.js +84 -13
  10. package/dist/core/account.js.map +1 -1
  11. package/dist/core/amount.d.ts +2 -1
  12. package/dist/core/amount.d.ts.map +1 -1
  13. package/dist/core/amount.js +4 -1
  14. package/dist/core/amount.js.map +1 -1
  15. package/dist/core/balance.d.ts +1 -0
  16. package/dist/core/balance.d.ts.map +1 -1
  17. package/dist/core/balance.js +6 -5
  18. package/dist/core/balance.js.map +1 -1
  19. package/dist/core/bank-info.d.ts +1 -1
  20. package/dist/core/bank-info.js +1 -1
  21. package/dist/core/client.d.ts +50 -15
  22. package/dist/core/client.d.ts.map +1 -1
  23. package/dist/core/config.d.ts +28 -16
  24. package/dist/core/config.d.ts.map +1 -1
  25. package/dist/core/config.js +66 -26
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/errors.d.ts +85 -23
  28. package/dist/core/errors.d.ts.map +1 -1
  29. package/dist/core/errors.js +112 -47
  30. package/dist/core/errors.js.map +1 -1
  31. package/dist/core/feedback.d.ts +4 -1
  32. package/dist/core/feedback.d.ts.map +1 -1
  33. package/dist/core/feedback.js +4 -1
  34. package/dist/core/feedback.js.map +1 -1
  35. package/dist/core/transaction.d.ts +6 -1
  36. package/dist/core/transaction.d.ts.map +1 -1
  37. package/dist/core/transaction.js +9 -4
  38. package/dist/core/transaction.js.map +1 -1
  39. package/dist/core/transport.d.ts +33 -6
  40. package/dist/core/transport.d.ts.map +1 -1
  41. package/dist/core/transport.js +77 -20
  42. package/dist/core/transport.js.map +1 -1
  43. package/dist/formats/camt.d.ts +24 -4
  44. package/dist/formats/camt.d.ts.map +1 -1
  45. package/dist/formats/camt.js +124 -41
  46. package/dist/formats/camt.js.map +1 -1
  47. package/dist/formats/mt940.d.ts +15 -3
  48. package/dist/formats/mt940.d.ts.map +1 -1
  49. package/dist/formats/mt940.js +161 -82
  50. package/dist/formats/mt940.js.map +1 -1
  51. package/dist/formats/readers.d.ts +6 -2
  52. package/dist/formats/readers.d.ts.map +1 -1
  53. package/dist/formats/readers.js +24 -29
  54. package/dist/formats/readers.js.map +1 -1
  55. package/dist/formats/record-budget.d.ts +7 -0
  56. package/dist/formats/record-budget.d.ts.map +1 -0
  57. package/dist/formats/record-budget.js +17 -0
  58. package/dist/formats/record-budget.js.map +1 -0
  59. package/dist/formats/sepa-purpose.d.ts +6 -0
  60. package/dist/formats/sepa-purpose.d.ts.map +1 -1
  61. package/dist/formats/sepa-purpose.js +23 -2
  62. package/dist/formats/sepa-purpose.js.map +1 -1
  63. package/dist/index.d.ts +3 -3
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +2 -2
  66. package/dist/index.js.map +1 -1
  67. package/dist/session/app-approval.d.ts +11 -5
  68. package/dist/session/app-approval.d.ts.map +1 -1
  69. package/dist/session/app-approval.js +23 -12
  70. package/dist/session/app-approval.js.map +1 -1
  71. package/dist/session/dialog-runner.d.ts +7 -10
  72. package/dist/session/dialog-runner.d.ts.map +1 -1
  73. package/dist/session/dialog-runner.js +15 -16
  74. package/dist/session/dialog-runner.js.map +1 -1
  75. package/dist/session/login-guard.d.ts +54 -49
  76. package/dist/session/login-guard.d.ts.map +1 -1
  77. package/dist/session/login-guard.js +156 -84
  78. package/dist/session/login-guard.js.map +1 -1
  79. package/dist/session/sepa-accounts.d.ts +20 -14
  80. package/dist/session/sepa-accounts.d.ts.map +1 -1
  81. package/dist/session/sepa-accounts.js +62 -46
  82. package/dist/session/sepa-accounts.js.map +1 -1
  83. package/dist/session/session-setup.d.ts +33 -25
  84. package/dist/session/session-setup.d.ts.map +1 -1
  85. package/dist/session/session-setup.js +87 -65
  86. package/dist/session/session-setup.js.map +1 -1
  87. package/dist/session/session-state.d.ts +9 -6
  88. package/dist/session/session-state.d.ts.map +1 -1
  89. package/dist/session/session-state.js +52 -17
  90. package/dist/session/session-state.js.map +1 -1
  91. package/dist/session/signed-dialog.d.ts +77 -0
  92. package/dist/session/signed-dialog.d.ts.map +1 -0
  93. package/dist/session/signed-dialog.js +170 -0
  94. package/dist/session/signed-dialog.js.map +1 -0
  95. package/dist/session/tan-selection.d.ts +26 -18
  96. package/dist/session/tan-selection.d.ts.map +1 -1
  97. package/dist/session/tan-selection.js +44 -33
  98. package/dist/session/tan-selection.js.map +1 -1
  99. package/dist/session/user-prompts.d.ts +8 -4
  100. package/dist/session/user-prompts.d.ts.map +1 -1
  101. package/dist/session/user-prompts.js +34 -14
  102. package/dist/session/user-prompts.js.map +1 -1
  103. package/dist/tan/challenge.d.ts +34 -13
  104. package/dist/tan/challenge.d.ts.map +1 -1
  105. package/dist/tan/challenge.js +25 -26
  106. package/dist/tan/challenge.js.map +1 -1
  107. package/dist/tan/flicker.d.ts +7 -1
  108. package/dist/tan/flicker.d.ts.map +1 -1
  109. package/dist/tan/flicker.js +40 -6
  110. package/dist/tan/flicker.js.map +1 -1
  111. package/dist/tan/tan-image.d.ts +3 -2
  112. package/dist/tan/tan-image.d.ts.map +1 -1
  113. package/dist/tan/tan-image.js +7 -5
  114. package/dist/tan/tan-image.js.map +1 -1
  115. package/dist/tan/tan-models.d.ts +5 -1
  116. package/dist/tan/tan-models.d.ts.map +1 -1
  117. package/dist/tan/tan-models.js +10 -5
  118. package/dist/tan/tan-models.js.map +1 -1
  119. package/dist/util/async.d.ts +0 -2
  120. package/dist/util/async.d.ts.map +1 -1
  121. package/dist/util/async.js +0 -4
  122. package/dist/util/async.js.map +1 -1
  123. package/dist/util/bytes.d.ts +2 -3
  124. package/dist/util/bytes.d.ts.map +1 -1
  125. package/dist/util/bytes.js +12 -20
  126. package/dist/util/bytes.js.map +1 -1
  127. package/dist/util/call-context.d.ts.map +1 -1
  128. package/dist/util/call-context.js +3 -2
  129. package/dist/util/call-context.js.map +1 -1
  130. package/dist/util/dates.d.ts +9 -16
  131. package/dist/util/dates.d.ts.map +1 -1
  132. package/dist/util/dates.js +39 -19
  133. package/dist/util/dates.js.map +1 -1
  134. package/dist/util/errors.d.ts +9 -1
  135. package/dist/util/errors.d.ts.map +1 -1
  136. package/dist/util/errors.js +12 -3
  137. package/dist/util/errors.js.map +1 -1
  138. package/dist/util/json.d.ts +4 -0
  139. package/dist/util/json.d.ts.map +1 -1
  140. package/dist/util/json.js +18 -0
  141. package/dist/util/json.js.map +1 -1
  142. package/dist/util/text.d.ts +21 -4
  143. package/dist/util/text.d.ts.map +1 -1
  144. package/dist/util/text.js +42 -13
  145. package/dist/util/text.js.map +1 -1
  146. package/dist/util/xml.d.ts +4 -3
  147. package/dist/util/xml.d.ts.map +1 -1
  148. package/dist/util/xml.js +37 -26
  149. package/dist/util/xml.js.map +1 -1
  150. package/dist/v3/account-extension.d.ts.map +1 -1
  151. package/dist/v3/account-extension.js +7 -10
  152. package/dist/v3/account-extension.js.map +1 -1
  153. package/dist/v3/bank-connection.d.ts +34 -0
  154. package/dist/v3/bank-connection.d.ts.map +1 -0
  155. package/dist/v3/bank-connection.js +58 -0
  156. package/dist/v3/bank-connection.js.map +1 -0
  157. package/dist/v3/dialog.d.ts +80 -46
  158. package/dist/v3/dialog.d.ts.map +1 -1
  159. package/dist/v3/dialog.js +162 -59
  160. package/dist/v3/dialog.js.map +1 -1
  161. package/dist/v3/message.d.ts +17 -4
  162. package/dist/v3/message.d.ts.map +1 -1
  163. package/dist/v3/message.js +62 -18
  164. package/dist/v3/message.js.map +1 -1
  165. package/dist/v3/parameter-store.d.ts +75 -0
  166. package/dist/v3/parameter-store.d.ts.map +1 -0
  167. package/dist/v3/parameter-store.js +143 -0
  168. package/dist/v3/parameter-store.js.map +1 -0
  169. package/dist/v3/parameters.d.ts +38 -12
  170. package/dist/v3/parameters.d.ts.map +1 -1
  171. package/dist/v3/parameters.js +91 -37
  172. package/dist/v3/parameters.js.map +1 -1
  173. package/dist/v3/protocol.d.ts +43 -50
  174. package/dist/v3/protocol.d.ts.map +1 -1
  175. package/dist/v3/protocol.js +58 -208
  176. package/dist/v3/protocol.js.map +1 -1
  177. package/dist/v3/queries.d.ts +51 -0
  178. package/dist/v3/queries.d.ts.map +1 -0
  179. package/dist/v3/queries.js +120 -0
  180. package/dist/v3/queries.js.map +1 -0
  181. package/dist/v3/segments.d.ts +29 -12
  182. package/dist/v3/segments.d.ts.map +1 -1
  183. package/dist/v3/segments.js +65 -23
  184. package/dist/v3/segments.js.map +1 -1
  185. package/dist/v3/syntax.d.ts +65 -14
  186. package/dist/v3/syntax.d.ts.map +1 -1
  187. package/dist/v3/syntax.js +167 -101
  188. package/dist/v3/syntax.js.map +1 -1
  189. package/package.json +10 -6
  190. package/src/client.ts +252 -0
  191. package/src/core/account.ts +86 -13
  192. package/src/core/amount.ts +3 -1
  193. package/src/core/balance.ts +6 -5
  194. package/src/core/bank-info.ts +1 -1
  195. package/src/core/client.ts +52 -15
  196. package/src/core/config.ts +69 -28
  197. package/src/core/errors.ts +122 -48
  198. package/src/core/feedback.ts +4 -1
  199. package/src/core/transaction.ts +9 -4
  200. package/src/core/transport.ts +98 -23
  201. package/src/formats/camt.ts +136 -39
  202. package/src/formats/mt940.ts +167 -81
  203. package/src/formats/readers.ts +24 -31
  204. package/src/formats/record-budget.ts +18 -0
  205. package/src/formats/sepa-purpose.ts +21 -2
  206. package/src/index.ts +4 -2
  207. package/src/session/app-approval.ts +51 -38
  208. package/src/session/dialog-runner.ts +31 -28
  209. package/src/session/login-guard.ts +174 -88
  210. package/src/session/sepa-accounts.ts +63 -45
  211. package/src/session/session-setup.ts +90 -71
  212. package/src/session/session-state.ts +56 -22
  213. package/src/session/signed-dialog.ts +192 -0
  214. package/src/session/tan-selection.ts +50 -39
  215. package/src/session/user-prompts.ts +35 -16
  216. package/src/tan/challenge.ts +40 -31
  217. package/src/tan/flicker.ts +44 -6
  218. package/src/tan/tan-image.ts +7 -5
  219. package/src/tan/tan-models.ts +10 -5
  220. package/src/util/async.ts +0 -5
  221. package/src/util/bytes.ts +13 -19
  222. package/src/util/call-context.ts +3 -2
  223. package/src/util/dates.ts +41 -24
  224. package/src/util/errors.ts +14 -3
  225. package/src/util/json.ts +16 -0
  226. package/src/util/text.ts +42 -12
  227. package/src/util/xml.ts +37 -26
  228. package/src/v3/account-extension.ts +7 -12
  229. package/src/v3/bank-connection.ts +67 -0
  230. package/src/v3/dialog.ts +175 -91
  231. package/src/v3/message.ts +69 -17
  232. package/src/v3/parameter-store.ts +160 -0
  233. package/src/v3/parameters.ts +110 -37
  234. package/src/v3/protocol.ts +70 -253
  235. package/src/v3/queries.ts +190 -0
  236. package/src/v3/segments.ts +65 -22
  237. package/src/v3/syntax.ts +153 -91
  238. package/dist/session/bank-connection.d.ts +0 -28
  239. package/dist/session/bank-connection.d.ts.map +0 -1
  240. package/dist/session/bank-connection.js +0 -48
  241. package/dist/session/bank-connection.js.map +0 -1
  242. package/dist/session/parameter-data.d.ts +0 -83
  243. package/dist/session/parameter-data.d.ts.map +0 -1
  244. package/dist/session/parameter-data.js +0 -68
  245. package/dist/session/parameter-data.js.map +0 -1
  246. package/dist/session/pin-tan-client.d.ts +0 -54
  247. package/dist/session/pin-tan-client.d.ts.map +0 -1
  248. package/dist/session/pin-tan-client.js +0 -153
  249. package/dist/session/pin-tan-client.js.map +0 -1
  250. package/dist/session/pin-tan-dialog.d.ts +0 -71
  251. package/dist/session/pin-tan-dialog.d.ts.map +0 -1
  252. package/dist/session/pin-tan-dialog.js +0 -124
  253. package/dist/session/pin-tan-dialog.js.map +0 -1
  254. package/dist/session/protocol.d.ts +0 -209
  255. package/dist/session/protocol.d.ts.map +0 -1
  256. package/dist/session/protocol.js +0 -75
  257. package/dist/session/protocol.js.map +0 -1
  258. package/dist/session/response-handler.d.ts +0 -48
  259. package/dist/session/response-handler.d.ts.map +0 -1
  260. package/dist/session/response-handler.js +0 -121
  261. package/dist/session/response-handler.js.map +0 -1
  262. package/dist/v3/client.d.ts +0 -24
  263. package/dist/v3/client.d.ts.map +0 -1
  264. package/dist/v3/client.js +0 -16
  265. package/dist/v3/client.js.map +0 -1
  266. package/src/session/bank-connection.ts +0 -51
  267. package/src/session/parameter-data.ts +0 -137
  268. package/src/session/pin-tan-client.ts +0 -186
  269. package/src/session/pin-tan-dialog.ts +0 -160
  270. package/src/session/protocol.ts +0 -311
  271. package/src/session/response-handler.ts +0 -130
  272. package/src/v3/client.ts +0 -29
@@ -22,6 +22,8 @@ export function providedReference(reference) {
22
22
  return reference === notProvided ? undefined : reference;
23
23
  }
24
24
  const keywordPattern = new RegExp(`(${keywords.join('|')})\\+`, 'g');
25
+ /** The keywords German banks write after the remittance information (`SVWZ`). */
26
+ const afterRemittance = new Set(['ABWA', 'ABWE']);
25
27
  /** Parser for the SEPA keywords in a purpose text. */
26
28
  export const SepaPurpose = Object.freeze({
27
29
  /**
@@ -30,6 +32,12 @@ export const SepaPurpose = Object.freeze({
30
32
  * A keyword counts unless a capital letter comes right before it, so `XEREF+` does not open an EREF value. After a
31
33
  * digit or a small letter it does: a purpose line cut at 35 characters is joined to the next one without a space, so
32
34
  * `…4711EREF+` may be where one line ends and the next begins.
35
+ *
36
+ * The remittance information (`SVWZ+`) and the ultimate debtor and creditor (`ABWA+`, `ABWE+`) are text the payer or
37
+ * the payee writes, which banks put after every other keyword. So from the first of them on only `ABWA+` and `ABWE+`
38
+ * start a value: a keyword in that text, such as `IBAN+`, is part of it. A keyword that occurs twice has no value:
39
+ * which of the two the bank wrote cannot be told, since a reference the payee chose, such as `EREF+`, comes before
40
+ * the bank's `CRED+` and may hold `CRED+…` and `SVWZ+`, which turns the bank's value into remittance information.
33
41
  */
34
42
  parse(purpose) {
35
43
  return split(purpose, new Set());
@@ -53,11 +61,24 @@ export const SepaPurpose = Object.freeze({
53
61
  });
54
62
  function split(purpose, partStarts) {
55
63
  const atWordStart = (index) => index === 0 || partStarts.has(index) || !isCapitalLetter(purpose, index - 1);
56
- const matches = [...purpose.matchAll(keywordPattern)].filter((m) => atWordStart(m.index));
64
+ const occurrences = new Map();
65
+ const matches = [];
66
+ let inPayerText = false;
67
+ for (const m of purpose.matchAll(keywordPattern)) {
68
+ if (!atWordStart(m.index))
69
+ continue;
70
+ const keyword = m[1];
71
+ occurrences.set(keyword, (occurrences.get(keyword) ?? 0) + 1);
72
+ if (inPayerText && !afterRemittance.has(keyword))
73
+ continue;
74
+ inPayerText ||= keyword === 'SVWZ' || afterRemittance.has(keyword);
75
+ matches.push(m);
76
+ }
57
77
  const result = new Map();
58
78
  matches.forEach((m, i) => {
59
79
  const end = i + 1 < matches.length ? matches[i + 1].index : purpose.length;
60
- result.set(m[1], purpose.substring(m.index + m[0].length, end).trim());
80
+ if (occurrences.get(m[1]) === 1)
81
+ result.set(m[1], purpose.substring(m.index + m[0].length, end).trim());
61
82
  });
62
83
  return result;
63
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sepa-purpose.js","sourceRoot":"","sources":["../../src/formats/sepa-purpose.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,QAAQ,GAAG;IACf,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;CACP,CAAC;AAEF,+EAA+E;AAC/E,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,yGAAyG;AACzG,MAAM,UAAU,iBAAiB,CAAC,SAA6B;IAC7D,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAErE,sDAAsD;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC;;;;;;OAMG;IACH,KAAK,CAAC,OAAe;QACnB,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,KAAuB;QAChC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,IAAI,IAAI,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACjC,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,KAAK,CAAC,OAAe,EAAE,UAA+B;IAC7D,MAAM,WAAW,GAAG,CAAC,KAAa,EAAW,EAAE,CAC7C,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5E,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAAa;IAClD,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"sepa-purpose.js","sourceRoot":"","sources":["../../src/formats/sepa-purpose.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,17 +6,18 @@
6
6
  *
7
7
  * @packageDocumentation
8
8
  */
9
+ export { FinTs3Client, type FinTs3ClientInit } from './client.js';
9
10
  export { Account, AccountDataStatus, type AccountCategory, type AccountInit } from './core/account.js';
10
11
  export { Amount } from './core/amount.js';
11
12
  export { Balance, type BalanceInit } from './core/balance.js';
12
13
  export { BankInfo, BankMessage } from './core/bank-info.js';
13
14
  export type { BankMessageHandler, FinTsClient, FinTsClientOptions, MessageDirection, MessageLogger, TransactionQuery, WarningHandler, } from './core/client.js';
14
15
  export { FinTsConfig, type FinTsConfigInit } from './core/config.js';
15
- export { FinTsBankError, FinTsDecoupledTimeoutError, FinTsDialogAbortedError, FinTsError, FinTsLoginDataChangedError, FinTsPinError, FinTsProtocolError, FinTsStateError, FinTsTanCancelledError, FinTsTanError, FinTsTransportError, FinTsUnsupportedError, } from './core/errors.js';
16
+ export { FinTsBankError, FinTsDecoupledTimeoutError, FinTsDialogAbortedError, FinTsError, FinTsLoginDataChangedError, FinTsLoginRefusedError, FinTsPinError, FinTsProtocolError, FinTsStateError, FinTsTanCancelledError, FinTsTanError, FinTsTanSetupError, FinTsTransportError, FinTsUnsupportedError, } from './core/errors.js';
16
17
  export { FeedbackCodes, FinTsFeedback } from './core/feedback.js';
17
18
  export { Transaction, type TransactionFormat, type TransactionInit, type TransactionStatus, } from './core/transaction.js';
18
19
  export { HttpTransport, type FinTsTransport, type HttpTransportOptions } from './core/transport.js';
19
- export { Camt } from './formats/camt.js';
20
+ export { Camt, type CamtStatement } from './formats/camt.js';
20
21
  export { Mt940, type Mt940Options, type Mt940Statement } from './formats/mt940.js';
21
22
  export { SepaPurpose } from './formats/sepa-purpose.js';
22
23
  export { TanAnswer, TanChallenge, type TanCallback, type TanChallengeInit, type TanMediumSelector, type TanMethodSelector, } from './tan/challenge.js';
@@ -24,5 +25,4 @@ export { FlickerCode, type HhdVersion } from './tan/flicker.js';
24
25
  export { TanImage } from './tan/tan-image.js';
25
26
  export { TanMedium, TanMethod, type TanMediumInit, type TanMediumRequirement, type TanMediumStatus, type TanMethodInit, } from './tan/tan-models.js';
26
27
  export { FormatError } from './util/errors.js';
27
- export { FinTs3Client, type FinTs3ClientInit } from './v3/client.js';
28
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,0BAA0B,EAC1B,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,0BAA0B,EAC1B,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -6,12 +6,13 @@
6
6
  *
7
7
  * @packageDocumentation
8
8
  */
9
+ export { FinTs3Client } from './client.js';
9
10
  export { Account, AccountDataStatus } from './core/account.js';
10
11
  export { Amount } from './core/amount.js';
11
12
  export { Balance } from './core/balance.js';
12
13
  export { BankInfo, BankMessage } from './core/bank-info.js';
13
14
  export { FinTsConfig } from './core/config.js';
14
- export { FinTsBankError, FinTsDecoupledTimeoutError, FinTsDialogAbortedError, FinTsError, FinTsLoginDataChangedError, FinTsPinError, FinTsProtocolError, FinTsStateError, FinTsTanCancelledError, FinTsTanError, FinTsTransportError, FinTsUnsupportedError, } from './core/errors.js';
15
+ export { FinTsBankError, FinTsDecoupledTimeoutError, FinTsDialogAbortedError, FinTsError, FinTsLoginDataChangedError, FinTsLoginRefusedError, FinTsPinError, FinTsProtocolError, FinTsStateError, FinTsTanCancelledError, FinTsTanError, FinTsTanSetupError, FinTsTransportError, FinTsUnsupportedError, } from './core/errors.js';
15
16
  export { FeedbackCodes, FinTsFeedback } from './core/feedback.js';
16
17
  export { Transaction, } from './core/transaction.js';
17
18
  export { HttpTransport } from './core/transport.js';
@@ -23,5 +24,4 @@ export { FlickerCode } from './tan/flicker.js';
23
24
  export { TanImage } from './tan/tan-image.js';
24
25
  export { TanMedium, TanMethod, } from './tan/tan-models.js';
25
26
  export { FormatError } from './util/errors.js';
26
- export { FinTs3Client } from './v3/client.js';
27
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAA0C,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAoB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAU5D,OAAO,EAAE,WAAW,EAAwB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,0BAA0B,EAC1B,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,WAAW,GAIZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAkD,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAA0C,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,GAKb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,SAAS,GAKV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAyB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAA0C,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAoB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAU5D,OAAO,EAAE,WAAW,EAAwB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,0BAA0B,EAC1B,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,WAAW,GAIZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAkD,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,IAAI,EAAsB,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAA0C,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,GAKb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,SAAS,GAKV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,10 +1,15 @@
1
+ import { type FinTsFeedback } from '../core/feedback.js';
1
2
  import { type TanAnswer, type TanChallenge } from '../tan/challenge.js';
2
3
  import type { TanMethod } from '../tan/tan-models.js';
3
- import type { Approval, BankResponse } from './protocol.js';
4
+ import type { Approval } from '../v3/dialog.js';
5
+ /** What a wait reads of the bank's answer to a status request: its return codes. */
6
+ interface StatusAnswer {
7
+ readonly feedback: readonly FinTsFeedback[];
8
+ }
4
9
  /** Shows a challenge and returns the user's answer. */
5
- export type AskUser = (challenge: TanChallenge) => Promise<TanAnswer>;
10
+ type AskUser = (challenge: TanChallenge) => Promise<TanAnswer>;
6
11
  /** Waits for `delayMs`, or until `interrupt` settles. */
7
- export type Pause = (delayMs: number, interrupt?: Promise<unknown>) => Promise<void>;
12
+ type Pause = (delayMs: number, interrupt?: Promise<unknown>) => Promise<void>;
8
13
  /** What an `AppApprovalWait` needs: `ask` shows a challenge, `pause` waits, `receive` takes in each status response. */
9
14
  export interface AppApprovalHooks<R> {
10
15
  readonly ask: AskUser;
@@ -26,8 +31,8 @@ export interface AppApprovalHooks<R> {
26
31
  * handles one `Approval`; `run` may be called once. A failure of `ask` or `pause`, such as a closed client, ends the
27
32
  * wait.
28
33
  */
29
- export declare function appApprovalWait<R extends BankResponse>(approval: Approval<R>, hooks: AppApprovalHooks<R>): AppApprovalWait<R>;
30
- export declare abstract class AppApprovalWait<R extends BankResponse> {
34
+ export declare function appApprovalWait<R extends StatusAnswer>(approval: Approval<R>, hooks: AppApprovalHooks<R>): AppApprovalWait<R>;
35
+ export declare abstract class AppApprovalWait<R extends StatusAnswer> {
31
36
  protected readonly approval: Approval<R>;
32
37
  protected readonly hooks: AppApprovalHooks<R>;
33
38
  private requests;
@@ -57,4 +62,5 @@ export declare abstract class AppApprovalWait<R extends BankResponse> {
57
62
  */
58
63
  protected nextPrompt(challenge: TanChallenge, pending: R): TanChallenge;
59
64
  }
65
+ export {};
60
66
  //# sourceMappingURL=app-approval.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-approval.d.ts","sourceRoot":"","sources":["../../src/session/app-approval.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAY5D,uDAAuD;AACvD,MAAM,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,YAAY,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAEtE,yDAAyD;AACzD,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErF,wHAAwH;AACxH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EACpD,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GACzB,eAAe,CAAC,CAAC,CAAC,CAIpB;AAED,8BAAsB,eAAe,CAAC,CAAC,SAAS,YAAY;IAOxD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAP/C,OAAO,CAAC,QAAQ,CAAK;IAErB,mFAAmF;IACnF,SAAS,CAAC,QAAQ,SAAK;gBAGF,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAG/C;;;OAGG;IACH,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;IAE1B,SAAS,KAAK,MAAM,IAAI,SAAS,CAEhC;IAED,0FAA0F;IAC1F,SAAS,KAAK,YAAY,IAAI,OAAO,CAEpC;IAED,SAAS,KAAK,cAAc,IAAI,MAAM,CAMrC;IAED,SAAS,KAAK,gBAAgB,IAAI,MAAM,CAEvC;IAED;;;;;OAKG;cACa,aAAa,IAAI,OAAO,CAAC,CAAC,CAAC;IAe3C;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,GAAG,YAAY;CAGxE"}
1
+ {"version":3,"file":"app-approval.d.ts","sourceRoot":"","sources":["../../src/session/app-approval.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAA6B,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,oFAAoF;AACpF,UAAU,YAAY;IACpB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAYD,uDAAuD;AACvD,KAAK,OAAO,GAAG,CAAC,SAAS,EAAE,YAAY,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAE/D,yDAAyD;AACzD,KAAK,KAAK,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9E,wHAAwH;AACxH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EACpD,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GACzB,eAAe,CAAC,CAAC,CAAC,CAIpB;AAED,8BAAsB,eAAe,CAAC,CAAC,SAAS,YAAY;IAOxD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAP/C,OAAO,CAAC,QAAQ,CAAK;IAErB,mFAAmF;IACnF,SAAS,CAAC,QAAQ,SAAK;gBAGF,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAG/C;;;OAGG;IACH,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;IAE1B,SAAS,KAAK,MAAM,IAAI,SAAS,CAEhC;IAED,0FAA0F;IAC1F,SAAS,KAAK,YAAY,IAAI,OAAO,CAEpC;IAED,SAAS,KAAK,cAAc,IAAI,MAAM,CAMrC;IAED,SAAS,KAAK,gBAAgB,IAAI,MAAM,CAEvC;IAED;;;;;OAKG;cACa,aAAa,IAAI,OAAO,CAAC,CAAC,CAAC;IAe3C;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,GAAG,YAAY;CAGxE"}
@@ -80,19 +80,20 @@ export class AppApprovalWait {
80
80
  }
81
81
  }
82
82
  /**
83
- * The client polls by itself while the callback shows the instructions, and settles `TanChallenge.resolved` when it is
84
- * done.
83
+ * The client polls by itself while the callback shows the instructions, and settles the `TanChallenge.resolved` of a
84
+ * prompt when it needs no more answer to it.
85
85
  *
86
86
  * `run` shows the prompt, waits the bank's first delay, then asks the bank until it confirms, waiting the interval in
87
- * between. The callback's answer only records what the user did:
87
+ * between. A status answer with new instructions replaces the prompt with one that shows them. The callback's answer
88
+ * only records what the user did, and counts while its prompt is shown:
88
89
  * - `stopped` settles on a cancel, a TAN or a failing callback; the loop stops before its next request.
89
90
  * - `report` settles on a report of the approval, which cuts the current wait short once, though not below a second.
90
91
  * The report closed the prompt, so it is shown anew while the bank has not confirmed yet.
91
92
  * - A user who cannot report the approval has every answer but `TanAnswer.cancelled` ignored.
92
93
  */
93
94
  class PollingWhileShown extends AppApprovalWait {
94
- /** Settles when the client needs no more answer, which `TanChallenge.resolved` tells the callback. */
95
- finished = new Deferred();
95
+ /** Settles when the prompt shown now needs no more answer, which its `TanChallenge.resolved` tells the callback. */
96
+ shown;
96
97
  /** Settles when the user cancels or the callback fails; `stopReason` holds the error that ends the wait. */
97
98
  stopped = new Deferred();
98
99
  stopReason;
@@ -110,20 +111,29 @@ class PollingWhileShown extends AppApprovalWait {
110
111
  if (!isPending(response))
111
112
  return response;
112
113
  this.throwIfStopped();
113
- // The user reported the approval, which closed the prompt, but the bank has not confirmed it yet.
114
- if (this.userConfirms && this.report === undefined)
115
- this.show((challenge = this.nextPrompt(challenge, response)));
114
+ // A report closed the prompt, but the bank has not confirmed the approval yet; or the bank's instructions changed.
115
+ const reported = this.userConfirms && this.report === undefined;
116
+ const next = this.nextPrompt(challenge, response);
117
+ if (reported || next.message !== challenge.message)
118
+ this.show((challenge = next));
116
119
  await this.sleep(this.pollIntervalMs, minPollIntervalMs);
117
120
  }
118
121
  }
119
122
  finally {
120
- this.finished.resolve();
123
+ this.shown?.resolve();
121
124
  }
122
125
  }
123
- /** Shows `challenge` without waiting for the answer. */
126
+ /** Shows `challenge` in place of the prompt before, without waiting for the answer. */
124
127
  show(challenge) {
128
+ this.shown?.resolve();
129
+ const shown = (this.shown = new Deferred());
125
130
  const report = (this.report = this.userConfirms ? new Deferred() : undefined);
126
- void this.hooks.ask(withResolved(challenge, this.finished.promise)).then((answer) => {
131
+ // Asked a microtask later: the app closes the prompt before on its `resolved` first, and then opens this one.
132
+ void Promise.resolve()
133
+ .then(() => this.hooks.ask(withResolved(challenge, shown.promise)))
134
+ .then((answer) => {
135
+ if (shown.isCompleted)
136
+ return;
127
137
  switch (answer.kind) {
128
138
  case 'cancelled':
129
139
  this.stop(new FinTsTanCancelledError());
@@ -138,7 +148,8 @@ class PollingWhileShown extends AppApprovalWait {
138
148
  // The user cannot report the approval: the client waits for the bank.
139
149
  }
140
150
  }, (error) => {
141
- this.stop(error);
151
+ if (!shown.isCompleted)
152
+ this.stop(error);
142
153
  });
143
154
  }
144
155
  stop(error) {
@@ -1 +1 @@
1
- {"version":3,"file":"app-approval.js","sourceRoot":"","sources":["../../src/session/app-approval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-approval.js","sourceRoot":"","sources":["../../src/session/app-approval.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- import type { BankResponse, ProtocolDialog, Query } from './protocol.js';
2
- import type { ResponseHandler } from './response-handler.js';
1
+ import type { Query } from '../v3/queries.js';
3
2
  import type { SessionSetup } from './session-setup.js';
4
- import type { UserPrompts } from './user-prompts.js';
3
+ import type { SignedDialog } from './signed-dialog.js';
5
4
  /**
6
5
  * Keeps one dialog open for all calls and runs the queries in it.
7
6
  *
@@ -9,14 +8,12 @@ import type { UserPrompts } from './user-prompts.js';
9
8
  * client does not repeat the call by itself, since the bank's answer cannot tell a dialog that had ended before from an
10
9
  * order it refuses along with ending the dialog, and a new login may cost the user another approval.
11
10
  */
12
- export declare class DialogRunner<R extends BankResponse, O> {
11
+ export declare class DialogRunner {
13
12
  private readonly setup;
14
- private readonly responses;
15
- private readonly prompts;
16
13
  private dialog;
17
- constructor(setup: SessionSetup<R, O>, responses: ResponseHandler<R>, prompts: UserPrompts);
14
+ constructor(setup: SessionSetup);
18
15
  /** The open dialog, or a new one once the setup is complete and the user has passed strong authentication. */
19
- open(): Promise<ProtocolDialog<R, O>>;
16
+ open(): Promise<SignedDialog>;
20
17
  private login;
21
18
  /** Ends the open dialog, if there is one. */
22
19
  end(): Promise<void>;
@@ -25,8 +22,8 @@ export declare class DialogRunner<R extends BankResponse, O> {
25
22
  *
26
23
  * The query is built once the dialog is open, since building it takes the parameter data.
27
24
  */
28
- query<T>(build: () => Query<R, O, T>): Promise<T>;
29
- /** Sends `order` in `dialog` and completes its approval. */
25
+ query<T>(build: () => Query<T>): Promise<T>;
26
+ /** Sends `order` in `dialog` and completes its approval, which only the `firstPage` of a query may ask for. */
30
27
  private run;
31
28
  /** Sends the order built by `order` until the bank has delivered all pages (Formals B.6.3, "Aufsetzpunkt"). */
32
29
  private fetchPages;
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-runner.d.ts","sourceRoot":"","sources":["../../src/session/dialog-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQrD;;;;;;GAMG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC;IAI/C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,MAAM,CAAmC;gBAG9B,KAAK,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EACzB,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,WAAW;IAGvC,8GAA8G;IACxG,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAS7B,KAAK;IAanB,6CAA6C;IACvC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1B;;;;OAIG;IACG,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAOvD,4DAA4D;YAC9C,GAAG;IAajB,+GAA+G;YACjG,UAAU;CAgCzB"}
1
+ {"version":3,"file":"dialog-runner.d.ts","sourceRoot":"","sources":["../../src/session/dialog-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAYvD;;;;;;GAMG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,MAAM,CAA2B;gBAEZ,KAAK,EAAE,YAAY;IAEhD,8GAA8G;IACxG,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;YASrB,KAAK;IAanB,6CAA6C;IACvC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1B;;;;OAIG;IACG,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAOjD,+GAA+G;YACjG,GAAG;IAYjB,+GAA+G;YACjG,UAAU;CAmCzB"}
@@ -2,7 +2,11 @@ import { FinTsBankError, FinTsProtocolError, parseBankData } from '../core/error
2
2
  import { continuations, FeedbackCodes, hasCode } from '../core/feedback.js';
3
3
  /** Most pages the client fetches for one query, far more than banks send. */
4
4
  const maxPages = 1000;
5
- /** Most data one query may hold, summed over its pages: the transport bounds a single response only. */
5
+ /**
6
+ * Most data one query may hold, summed over its pages as `IncomingMessage3.size` measures it: the transport and the
7
+ * parser bound a single response only. The statements and transactions read from them have a budget of their own
8
+ * (`RecordBudget`).
9
+ */
6
10
  const maxQueryMebibytes = 128;
7
11
  /**
8
12
  * Keeps one dialog open for all calls and runs the queries in it.
@@ -13,13 +17,9 @@ const maxQueryMebibytes = 128;
13
17
  */
14
18
  export class DialogRunner {
15
19
  setup;
16
- responses;
17
- prompts;
18
20
  dialog;
19
- constructor(setup, responses, prompts) {
21
+ constructor(setup) {
20
22
  this.setup = setup;
21
- this.responses = responses;
22
- this.prompts = prompts;
23
23
  }
24
24
  /** The open dialog, or a new one once the setup is complete and the user has passed strong authentication. */
25
25
  async open() {
@@ -34,7 +34,7 @@ export class DialogRunner {
34
34
  async login() {
35
35
  const dialog = await this.setup.newDialog();
36
36
  try {
37
- await this.responses.startDialog(dialog, () => dialog.start());
37
+ await dialog.login();
38
38
  return dialog;
39
39
  }
40
40
  catch (error) {
@@ -61,11 +61,10 @@ export class DialogRunner {
61
61
  const pages = await this.fetchPages(dialog, query.order);
62
62
  return parseBankData(() => query.read(pages));
63
63
  }
64
- /** Sends `order` in `dialog` and completes its approval. */
65
- async run(dialog, order) {
66
- this.prompts.checkOpen();
64
+ /** Sends `order` in `dialog` and completes its approval, which only the `firstPage` of a query may ask for. */
65
+ async run(dialog, order, firstPage) {
67
66
  try {
68
- return await this.responses.complete(dialog, await dialog.send(order));
67
+ return firstPage ? await dialog.send(order) : await dialog.sendFurtherPage(order);
69
68
  }
70
69
  catch (error) {
71
70
  // The bank rejected the order and the dialog stays usable, or the bank ended the dialog or rejected the PIN and
@@ -83,9 +82,12 @@ export class DialogRunner {
83
82
  let size = 0;
84
83
  let continuation;
85
84
  for (;;) {
86
- const page = await this.run(dialog, order(continuation));
85
+ const page = await this.run(dialog, order(continuation), continuation === undefined);
87
86
  pages.push(page);
88
87
  size += page.size;
88
+ if (size > maxQueryMebibytes * 1024 * 1024) {
89
+ throw new FinTsProtocolError(`The bank sends more than ${maxQueryMebibytes} MiB for one query; ask for a shorter period`);
90
+ }
89
91
  const positions = [...continuations(page.feedback)];
90
92
  // A message carries one order, so the bank names one position at most.
91
93
  if (positions.length > 1)
@@ -98,14 +100,11 @@ export class DialogRunner {
98
100
  }
99
101
  return pages;
100
102
  }
101
- // A repeated position or endless pages would keep the client busy forever, and unbounded pages exhaust memory.
103
+ // A repeated position or endless pages would keep the client busy forever.
102
104
  if (seen.has(continuation) || pages.length === maxPages) {
103
105
  throw new FinTsProtocolError('The bank does not stop sending pages');
104
106
  }
105
107
  seen.add(continuation);
106
- if (size > maxQueryMebibytes * 1024 * 1024) {
107
- throw new FinTsProtocolError(`The bank sends more than ${maxQueryMebibytes} MiB for one query; ask for a shorter period`);
108
- }
109
108
  }
110
109
  }
111
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-runner.js","sourceRoot":"","sources":["../../src/session/dialog-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dialog-runner.js","sourceRoot":"","sources":["../../src/session/dialog-runner.ts"],"names":[],"mappings":"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"}
@@ -1,73 +1,78 @@
1
- import { FinTsBankError } from '../core/errors.js';
1
+ import { FinTsLoginRefusedError, type FinTsBankError } from '../core/errors.js';
2
+ import { type FinTsFeedback } from '../core/feedback.js';
2
3
  import type { TanMethod } from '../tan/tan-models.js';
4
+ import type { PinGuard } from '../v3/protocol.js';
3
5
  /**
4
6
  * The kind of request a bank response answers, which decides what its errors mean for the login (`LoginGuard.judge`)
5
7
  * and whether they can reject a TAN:
6
- * - `login`: the login that opens a dialog;
7
- * - `loginWithOrder`: a login that carries an order in the same message, whose errors may concern the order alone;
8
+ * - `login`: the login that opens a dialog, which carries no order;
8
9
  * - `order`: an order in a dialog the bank has opened;
9
10
  * - `approval`: a message that completes an approval, the TAN or the question whether the user approved in the app.
10
11
  */
11
- export type RequestKind = 'login' | 'loginWithOrder' | 'order' | 'approval';
12
+ export type RequestKind = 'login' | 'order' | 'approval';
12
13
  /**
13
14
  * A reason for a refused login that the session can take care of by itself, after which it logs in once more: the user
14
15
  * may not use the TAN method the login was signed with, or the bank no longer accepts the customer system ID.
15
16
  */
16
17
  export type RefusalReason = 'tanMethodNotAllowed' | 'systemIdRejected';
18
+ /** What the saved state keeps of the guard: the return codes of the bank's refusal, and `unreadLogins`. */
19
+ export interface LoginGuardState {
20
+ readonly refusal: readonly FinTsFeedback[] | undefined;
21
+ readonly unreadLogins: number;
22
+ }
17
23
  /**
18
- * Keeps a retrying app from locking the user's access: once the bank has refused a login, the client does not send the
19
- * PIN again.
20
- *
21
- * Banks lock the access after a few failed attempts, and a return code does not always tell whether the PIN was the
22
- * reason. So `judge` counts as a refused login:
23
- * - a rejected PIN, wherever the bank reports it;
24
- * - any other error in the answer to a login, unless the login carries an order and the bank keeps the dialog open:
25
- * then the error concerns the order.
26
- *
27
- * Errors in the answer to an order or an approval are no refusal, such as a wrong TAN at login: the bank checks the PIN
28
- * before it asks for the approval. New login data (return code 3072) end the old ones for good (`refuse`).
24
+ * Holds the PIN and hands it out only while no login is refused (`pin`), so that a retrying app cannot lock the user's
25
+ * access. `FinTsLoginRefusedError` tells which logins count as refused; `judge` decides it for each answer.
29
26
  *
30
- * The guard fails closed: a refusal counts from the moment `judge` sees it, and only `pardon` lifts it, once the
31
- * session has taken care of a `RefusalReason` the refusal names (`remediableReasons`). The protocol calls `check`
32
- * before every message it signs with the PIN.
27
+ * A refusal counts at once and fails closed: only `remedied` lifts it, within the call that met it (`runCall`), once
28
+ * the session has taken care of a reason it names, each reason once per call, so that a call sends at most three
29
+ * logins the bank refuses. A refusal that outlasts the call is final, and the guard forgets the PIN; only a PIN the
30
+ * user enters anew lifts it (`replacePin`), unless it brings new login data.
33
31
  */
34
- export declare class LoginGuard {
35
- private refusal;
36
- /** The TAN method of the refused login; `undefined` without a refusal, and for new login data. */
37
- private refusedMethodValue;
38
- /** Throws the bank's refusal of an earlier login, so that the PIN is not sent again. */
32
+ export declare class LoginGuard implements PinGuard {
33
+ #private;
34
+ private refusalValue;
35
+ /** The TAN method of the login `refusalValue` refused, which a restored refusal does not tell. */
36
+ private refusedMethod;
37
+ /** Logins sent since the bank last took the PIN whose answer the client has not read. */
38
+ private unreadLogins;
39
+ /** The refusal of `maxUnreadLogins` unread logins, kept so that `check` throws the same error each time. */
40
+ private unreadLoginsRefusal;
41
+ /** The reasons `remedied` has lifted a refusal for in the running call. */
42
+ private readonly pardonedReasons;
43
+ constructor(pin: string);
44
+ /** The PIN to sign a message with; throws the refusal instead (`check`), and `FinTsStateError` once closed. */
45
+ get pin(): string;
46
+ /** Throws the refusal, if there is one. */
39
47
  check(): void;
40
- /** Whether the guard holds a refusal. */
41
- get hasRefusal(): boolean;
42
- /** The TAN method the refused login was signed with; `undefined` where the guard holds no refusal of a login. */
43
- get refusedMethod(): TanMethod | undefined;
48
+ /** The bank's refusal, else that of `maxUnreadLogins` unread logins; `undefined` while there is none. */
49
+ get refusal(): FinTsLoginRefusedError | undefined;
50
+ /** Counts a login signed with the PIN as unread until `judge` reads its answer. */
51
+ loginSent(): void;
44
52
  /**
45
- * Whether `error`, raised for the answer to a request of `kind` in a dialog signed with `method`, refuses the login;
46
- * records it if it does.
47
- *
48
- * `dialogOpen` tells whether the bank keeps the dialog open after its answer.
53
+ * Judges `error`, if the answer to a request of `kind` in a dialog signed with `method` has one: returns the refusal
54
+ * of the login it amounts to, and records it unless the guard holds one already. Any error refuses a login; after the
55
+ * login only one that refuses it itself, a rejected PIN or new login data, since the bank checked the PIN before.
49
56
  */
50
- judge(error: FinTsBankError, kind: RequestKind, dialogOpen: boolean, method: TanMethod): boolean;
51
- /** Records `error` as the reason the client logs in no more, unless it holds a refusal already. */
52
- refuse(error: FinTsBankError): void;
57
+ judge(error: FinTsBankError | undefined, kind: RequestKind, method: TanMethod): FinTsLoginRefusedError | undefined;
58
+ /** Runs `call`, one call of the client; a refusal that outlasts it is final, and the next call remedies anew. */
59
+ runCall<T>(call: () => Promise<T>): Promise<T>;
53
60
  /**
54
- * Runs `lookup`, which only completes data, such as the SEPA account list; `undefined` where the bank rejects it, so
55
- * that the caller carries on without it.
56
- *
57
- * A refused login is thrown, and so is a wrong TAN, which the user must hear of. An aborted dialog counts as a
58
- * rejection: banks end the dialog along with many.
61
+ * Runs `attempt`, which may log in, and runs it once more each time `remedy` takes care of a reason the refusal it
62
+ * failed with names; `remedy` gets the reason and the TAN method of the refused login, and returns whether it could.
59
63
  */
60
- tryLookUp<T>(lookup: () => Promise<T>): Promise<T | undefined>;
64
+ remedied<T>(attempt: () => Promise<T>, remedy: (reason: RefusalReason, rejected: TanMethod) => Promise<boolean>): Promise<T>;
61
65
  /**
62
- * The reasons the session can take care of in `error`: 3920 without the TAN method of the refused login, 9075 after
63
- * the one-step method, and 9391. Empty if `error` is not the refusal the guard holds, rejects the PIN, or brings new
64
- * login data.
65
- *
66
- * Only the return codes of the refusal itself count: TAN methods listed earlier say nothing about this login.
66
+ * Signs with `pin` from now on, a PIN the user has entered anew and the protocol can send, and lifts the refusal.
67
+ * Throws the refusal instead where it brings new login data, which end the old ones for good.
67
68
  */
68
- remediableReasons(error: FinTsBankError): RefusalReason[];
69
- /** Lifts `refusal` once the session has taken care of its reason, so that the next login may send the PIN. */
70
- pardon(refusal: FinTsBankError): void;
71
- private isRefusal;
69
+ replacePin(pin: string): void;
70
+ /** Forgets the PIN; the client calls it once it is closed. */
71
+ close(): void;
72
+ saveState(): LoginGuardState;
73
+ /** Restores what `saveState` returned; a restored refusal is final. */
74
+ restoreState(saved: LoginGuardState): void;
75
+ private liftRefusal;
76
+ private forgetPinIfRefused;
72
77
  }
73
78
  //# sourceMappingURL=login-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login-guard.d.ts","sourceRoot":"","sources":["../../src/session/login-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4D,MAAM,mBAAmB,CAAC;AAE7G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,gBAAgB,GAAG,OAAO,GAAG,UAAU,CAAC;AAE5E;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;AAEvE;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA6B;IAE5C,kGAAkG;IAClG,OAAO,CAAC,kBAAkB,CAAwB;IAElD,wFAAwF;IACxF,KAAK,IAAI,IAAI;IAIb,yCAAyC;IACzC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,iHAAiH;IACjH,IAAI,aAAa,IAAI,SAAS,GAAG,SAAS,CAEzC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO;IAShG,mGAAmG;IACnG,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAInC;;;;;;OAMG;IACG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IASpE;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,EAAE;IAuBzD,8GAA8G;IAC9G,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAMrC,OAAO,CAAC,SAAS;CAGlB"}
1
+ {"version":3,"file":"login-guard.d.ts","sourceRoot":"","sources":["../../src/session/login-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,sBAAsB,EAGtB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA+C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACtG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;AAEvE,2GAA2G;AAC3G,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAQD;;;;;;;;GAQG;AACH,qBAAa,UAAW,YAAW,QAAQ;;IAIzC,OAAO,CAAC,YAAY,CAAqC;IAEzD,kGAAkG;IAClG,OAAO,CAAC,aAAa,CAAwB;IAE7C,yFAAyF;IACzF,OAAO,CAAC,YAAY,CAAK;IAEzB,4GAA4G;IAC5G,OAAO,CAAC,mBAAmB,CAAqC;IAEhE,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;gBAEhD,GAAG,EAAE,MAAM;IAIvB,+GAA+G;IAC/G,IAAI,GAAG,IAAI,MAAM,CAIhB;IAED,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAKb,yGAAyG;IACzG,IAAI,OAAO,IAAI,sBAAsB,GAAG,SAAS,CAQhD;IAED,mFAAmF;IACnF,SAAS,IAAI,IAAI;IAIjB;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAG,sBAAsB,GAAG,SAAS;IAYlH,iHAAiH;IAC3G,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASpD;;;OAGG;IACG,QAAQ,CAAC,CAAC,EACd,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,GACvE,OAAO,CAAC,CAAC,CAAC;IAoBb;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ7B,8DAA8D;IAC9D,KAAK,IAAI,IAAI;IAIb,SAAS,IAAI,eAAe;IAI5B,uEAAuE;IACvE,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAM1C,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,kBAAkB;CAG3B"}