@coderoftime/fints 0.0.0-stage → 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 (249) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/LICENSE +28 -0
  3. package/README.md +246 -2
  4. package/dist/client.d.ts +48 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +199 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/core/account.d.ts +168 -0
  9. package/dist/core/account.d.ts.map +1 -0
  10. package/dist/core/account.js +245 -0
  11. package/dist/core/account.js.map +1 -0
  12. package/dist/core/amount.d.ts +63 -0
  13. package/dist/core/amount.d.ts.map +1 -0
  14. package/dist/core/amount.js +192 -0
  15. package/dist/core/amount.js.map +1 -0
  16. package/dist/core/balance.d.ts +55 -0
  17. package/dist/core/balance.d.ts.map +1 -0
  18. package/dist/core/balance.js +54 -0
  19. package/dist/core/balance.js.map +1 -0
  20. package/dist/core/bank-info.d.ts +49 -0
  21. package/dist/core/bank-info.d.ts.map +1 -0
  22. package/dist/core/bank-info.js +52 -0
  23. package/dist/core/bank-info.js.map +1 -0
  24. package/dist/core/client.d.ts +161 -0
  25. package/dist/core/client.d.ts.map +1 -0
  26. package/dist/core/client.js +2 -0
  27. package/dist/core/client.js.map +1 -0
  28. package/dist/core/config.d.ts +80 -0
  29. package/dist/core/config.d.ts.map +1 -0
  30. package/dist/core/config.js +153 -0
  31. package/dist/core/config.js.map +1 -0
  32. package/dist/core/errors.d.ts +153 -0
  33. package/dist/core/errors.d.ts.map +1 -0
  34. package/dist/core/errors.js +247 -0
  35. package/dist/core/errors.js.map +1 -0
  36. package/dist/core/feedback.d.ts +72 -0
  37. package/dist/core/feedback.d.ts.map +1 -0
  38. package/dist/core/feedback.js +127 -0
  39. package/dist/core/feedback.js.map +1 -0
  40. package/dist/core/transaction.d.ts +103 -0
  41. package/dist/core/transaction.d.ts.map +1 -0
  42. package/dist/core/transaction.js +96 -0
  43. package/dist/core/transaction.js.map +1 -0
  44. package/dist/core/transport.d.ts +64 -0
  45. package/dist/core/transport.d.ts.map +1 -0
  46. package/dist/core/transport.js +149 -0
  47. package/dist/core/transport.js.map +1 -0
  48. package/dist/formats/camt.d.ts +32 -0
  49. package/dist/formats/camt.d.ts.map +1 -0
  50. package/dist/formats/camt.js +242 -0
  51. package/dist/formats/camt.js.map +1 -0
  52. package/dist/formats/mt940.d.ts +54 -0
  53. package/dist/formats/mt940.d.ts.map +1 -0
  54. package/dist/formats/mt940.js +376 -0
  55. package/dist/formats/mt940.js.map +1 -0
  56. package/dist/formats/readers.d.ts +15 -0
  57. package/dist/formats/readers.d.ts.map +1 -0
  58. package/dist/formats/readers.js +42 -0
  59. package/dist/formats/readers.js.map +1 -0
  60. package/dist/formats/record-budget.d.ts +7 -0
  61. package/dist/formats/record-budget.d.ts.map +1 -0
  62. package/dist/formats/record-budget.js +17 -0
  63. package/dist/formats/record-budget.js.map +1 -0
  64. package/dist/formats/sepa-purpose.d.ts +28 -0
  65. package/dist/formats/sepa-purpose.d.ts.map +1 -0
  66. package/dist/formats/sepa-purpose.js +89 -0
  67. package/dist/formats/sepa-purpose.js.map +1 -0
  68. package/dist/index.d.ts +28 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +27 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/session/app-approval.d.ts +66 -0
  73. package/dist/session/app-approval.d.ts.map +1 -0
  74. package/dist/session/app-approval.js +226 -0
  75. package/dist/session/app-approval.js.map +1 -0
  76. package/dist/session/dialog-runner.d.ts +31 -0
  77. package/dist/session/dialog-runner.d.ts.map +1 -0
  78. package/dist/session/dialog-runner.js +111 -0
  79. package/dist/session/dialog-runner.js.map +1 -0
  80. package/dist/session/login-guard.d.ts +78 -0
  81. package/dist/session/login-guard.d.ts.map +1 -0
  82. package/dist/session/login-guard.js +181 -0
  83. package/dist/session/login-guard.js.map +1 -0
  84. package/dist/session/sepa-accounts.d.ts +40 -0
  85. package/dist/session/sepa-accounts.d.ts.map +1 -0
  86. package/dist/session/sepa-accounts.js +112 -0
  87. package/dist/session/sepa-accounts.js.map +1 -0
  88. package/dist/session/session-setup.d.ts +80 -0
  89. package/dist/session/session-setup.d.ts.map +1 -0
  90. package/dist/session/session-setup.js +182 -0
  91. package/dist/session/session-setup.js.map +1 -0
  92. package/dist/session/session-state.d.ts +50 -0
  93. package/dist/session/session-state.d.ts.map +1 -0
  94. package/dist/session/session-state.js +182 -0
  95. package/dist/session/session-state.js.map +1 -0
  96. package/dist/session/signed-dialog.d.ts +77 -0
  97. package/dist/session/signed-dialog.d.ts.map +1 -0
  98. package/dist/session/signed-dialog.js +170 -0
  99. package/dist/session/signed-dialog.js.map +1 -0
  100. package/dist/session/tan-selection.d.ts +96 -0
  101. package/dist/session/tan-selection.d.ts.map +1 -0
  102. package/dist/session/tan-selection.js +189 -0
  103. package/dist/session/tan-selection.js.map +1 -0
  104. package/dist/session/user-prompts.d.ts +65 -0
  105. package/dist/session/user-prompts.d.ts.map +1 -0
  106. package/dist/session/user-prompts.js +184 -0
  107. package/dist/session/user-prompts.js.map +1 -0
  108. package/dist/tan/challenge.d.ts +135 -0
  109. package/dist/tan/challenge.d.ts.map +1 -0
  110. package/dist/tan/challenge.js +184 -0
  111. package/dist/tan/challenge.js.map +1 -0
  112. package/dist/tan/flicker.d.ts +42 -0
  113. package/dist/tan/flicker.d.ts.map +1 -0
  114. package/dist/tan/flicker.js +296 -0
  115. package/dist/tan/flicker.js.map +1 -0
  116. package/dist/tan/tan-image.d.ts +22 -0
  117. package/dist/tan/tan-image.d.ts.map +1 -0
  118. package/dist/tan/tan-image.js +43 -0
  119. package/dist/tan/tan-image.js.map +1 -0
  120. package/dist/tan/tan-models.d.ts +149 -0
  121. package/dist/tan/tan-models.d.ts.map +1 -0
  122. package/dist/tan/tan-models.js +153 -0
  123. package/dist/tan/tan-models.js.map +1 -0
  124. package/dist/util/async.d.ts +22 -0
  125. package/dist/util/async.d.ts.map +1 -0
  126. package/dist/util/async.js +45 -0
  127. package/dist/util/async.js.map +1 -0
  128. package/dist/util/bytes.d.ts +22 -0
  129. package/dist/util/bytes.d.ts.map +1 -0
  130. package/dist/util/bytes.js +128 -0
  131. package/dist/util/bytes.js.map +1 -0
  132. package/dist/util/call-context.d.ts +12 -0
  133. package/dist/util/call-context.d.ts.map +1 -0
  134. package/dist/util/call-context.js +30 -0
  135. package/dist/util/call-context.js.map +1 -0
  136. package/dist/util/dates.d.ts +55 -0
  137. package/dist/util/dates.d.ts.map +1 -0
  138. package/dist/util/dates.js +189 -0
  139. package/dist/util/dates.js.map +1 -0
  140. package/dist/util/errors.d.ts +17 -0
  141. package/dist/util/errors.d.ts.map +1 -0
  142. package/dist/util/errors.js +24 -0
  143. package/dist/util/errors.js.map +1 -0
  144. package/dist/util/immutable-map.d.ts +16 -0
  145. package/dist/util/immutable-map.d.ts.map +1 -0
  146. package/dist/util/immutable-map.js +38 -0
  147. package/dist/util/immutable-map.js.map +1 -0
  148. package/dist/util/json.d.ts +17 -0
  149. package/dist/util/json.d.ts.map +1 -0
  150. package/dist/util/json.js +62 -0
  151. package/dist/util/json.js.map +1 -0
  152. package/dist/util/text.d.ts +37 -0
  153. package/dist/util/text.d.ts.map +1 -0
  154. package/dist/util/text.js +107 -0
  155. package/dist/util/text.js.map +1 -0
  156. package/dist/util/xml.d.ts +36 -0
  157. package/dist/util/xml.d.ts.map +1 -0
  158. package/dist/util/xml.js +194 -0
  159. package/dist/util/xml.js.map +1 -0
  160. package/dist/v3/account-extension.d.ts +25 -0
  161. package/dist/v3/account-extension.d.ts.map +1 -0
  162. package/dist/v3/account-extension.js +173 -0
  163. package/dist/v3/account-extension.js.map +1 -0
  164. package/dist/v3/bank-connection.d.ts +34 -0
  165. package/dist/v3/bank-connection.d.ts.map +1 -0
  166. package/dist/v3/bank-connection.js +58 -0
  167. package/dist/v3/bank-connection.js.map +1 -0
  168. package/dist/v3/dialog.d.ts +112 -0
  169. package/dist/v3/dialog.d.ts.map +1 -0
  170. package/dist/v3/dialog.js +241 -0
  171. package/dist/v3/dialog.js.map +1 -0
  172. package/dist/v3/message.d.ts +85 -0
  173. package/dist/v3/message.d.ts.map +1 -0
  174. package/dist/v3/message.js +303 -0
  175. package/dist/v3/message.js.map +1 -0
  176. package/dist/v3/parameter-store.d.ts +75 -0
  177. package/dist/v3/parameter-store.d.ts.map +1 -0
  178. package/dist/v3/parameter-store.js +143 -0
  179. package/dist/v3/parameter-store.js.map +1 -0
  180. package/dist/v3/parameters.d.ts +105 -0
  181. package/dist/v3/parameters.d.ts.map +1 -0
  182. package/dist/v3/parameters.js +450 -0
  183. package/dist/v3/parameters.js.map +1 -0
  184. package/dist/v3/protocol.d.ts +61 -0
  185. package/dist/v3/protocol.d.ts.map +1 -0
  186. package/dist/v3/protocol.js +113 -0
  187. package/dist/v3/protocol.js.map +1 -0
  188. package/dist/v3/queries.d.ts +51 -0
  189. package/dist/v3/queries.d.ts.map +1 -0
  190. package/dist/v3/queries.js +120 -0
  191. package/dist/v3/queries.js.map +1 -0
  192. package/dist/v3/segments.d.ts +106 -0
  193. package/dist/v3/segments.d.ts.map +1 -0
  194. package/dist/v3/segments.js +325 -0
  195. package/dist/v3/segments.js.map +1 -0
  196. package/dist/v3/syntax.d.ts +127 -0
  197. package/dist/v3/syntax.d.ts.map +1 -0
  198. package/dist/v3/syntax.js +367 -0
  199. package/dist/v3/syntax.js.map +1 -0
  200. package/package.json +67 -4
  201. package/src/client.ts +252 -0
  202. package/src/core/account.ts +323 -0
  203. package/src/core/amount.ts +211 -0
  204. package/src/core/balance.ts +85 -0
  205. package/src/core/bank-info.ts +66 -0
  206. package/src/core/client.ts +186 -0
  207. package/src/core/config.ts +182 -0
  208. package/src/core/errors.ts +277 -0
  209. package/src/core/feedback.ts +140 -0
  210. package/src/core/transaction.ts +161 -0
  211. package/src/core/transport.ts +189 -0
  212. package/src/formats/camt.ts +266 -0
  213. package/src/formats/mt940.ts +419 -0
  214. package/src/formats/readers.ts +49 -0
  215. package/src/formats/record-budget.ts +18 -0
  216. package/src/formats/sepa-purpose.ts +94 -0
  217. package/src/index.ts +70 -0
  218. package/src/session/app-approval.ts +278 -0
  219. package/src/session/dialog-runner.ts +122 -0
  220. package/src/session/login-guard.ts +221 -0
  221. package/src/session/sepa-accounts.ts +115 -0
  222. package/src/session/session-setup.ts +184 -0
  223. package/src/session/session-state.ts +204 -0
  224. package/src/session/signed-dialog.ts +192 -0
  225. package/src/session/tan-selection.ts +203 -0
  226. package/src/session/user-prompts.ts +193 -0
  227. package/src/tan/challenge.ts +261 -0
  228. package/src/tan/flicker.ts +308 -0
  229. package/src/tan/tan-image.ts +38 -0
  230. package/src/tan/tan-models.ts +252 -0
  231. package/src/util/async.ts +48 -0
  232. package/src/util/bytes.ts +129 -0
  233. package/src/util/call-context.ts +41 -0
  234. package/src/util/dates.ts +210 -0
  235. package/src/util/errors.ts +27 -0
  236. package/src/util/immutable-map.ts +47 -0
  237. package/src/util/json.ts +67 -0
  238. package/src/util/text.ts +112 -0
  239. package/src/util/xml.ts +183 -0
  240. package/src/v3/account-extension.ts +185 -0
  241. package/src/v3/bank-connection.ts +67 -0
  242. package/src/v3/dialog.ts +283 -0
  243. package/src/v3/message.ts +373 -0
  244. package/src/v3/parameter-store.ts +160 -0
  245. package/src/v3/parameters.ts +524 -0
  246. package/src/v3/protocol.ts +148 -0
  247. package/src/v3/queries.ts +190 -0
  248. package/src/v3/segments.ts +374 -0
  249. package/src/v3/syntax.ts +369 -0
@@ -0,0 +1,153 @@
1
+ import { copyDate } from '../util/dates.js';
2
+ import { maskedId } from '../util/text.js';
3
+ /** Reads the FinTS code: `0` not allowed, `1` optional, `2` required. */
4
+ export function tanMediumRequirementOf(code) {
5
+ return code === '1' ? 'optional' : code === '2' ? 'required' : 'notAllowed';
6
+ }
7
+ /** A TAN procedure offered by the bank (FinTS "Sicherheitsfunktion"). */
8
+ export class TanMethod {
9
+ /** Bank-specific code of the procedure, for example `942`; `999` is the one-step procedure. */
10
+ securityFunction;
11
+ /** The name the bank gives the procedure, for example `pushTAN`. */
12
+ name;
13
+ /** The bank's technical identification of the procedure. */
14
+ technicalId;
15
+ /** DK procedure family such as `HHD1.4`, `mobileTAN` or `Decoupled`. */
16
+ dkMethod;
17
+ /** Version of the `dkMethod`. */
18
+ dkVersion;
19
+ /** Longest TAN the user may enter. */
20
+ maxTanLength;
21
+ /** Whether the TAN consists of digits only. */
22
+ numericTan;
23
+ /** The bank's label for the value the user sends back, for example `TAN`. */
24
+ returnValueText;
25
+ /** Longest challenge text the bank sends for this procedure. */
26
+ maxChallengeLength;
27
+ /** Whether a TAN medium name goes with this procedure. */
28
+ mediumRequirement;
29
+ /**
30
+ * Most TAN media a user can have active at once for this procedure, as the bank's parameters state it ("Anzahl
31
+ * unterstützter aktiver TAN-Medien"); not how many the user has.
32
+ *
33
+ * Where it is above 1 and `needsMediumName`, each message names the medium, since the user may have several.
34
+ */
35
+ activeMediaCount;
36
+ /** Whether the challenge text is structured (marked up) rather than plain. */
37
+ structuredChallenge;
38
+ /** Whether approval happens in a separate app instead of entering a TAN. */
39
+ decoupled;
40
+ /**
41
+ * Most status requests the bank allows for a decoupled approval, 0 for any number. The client sends 60 where the bank
42
+ * states none, and polls for 10 minutes at most.
43
+ */
44
+ decoupledMaxPolls;
45
+ /** How long to wait before the first status request of a decoupled approval, in seconds. */
46
+ decoupledFirstPollDelaySeconds;
47
+ /** How long to wait between two status requests of a decoupled approval, in seconds. */
48
+ decoupledPollIntervalSeconds;
49
+ /** Whether the user may report the approval, rather than the client asking the bank by itself. */
50
+ decoupledManualConfirmation;
51
+ /** Whether the bank allows the client to ask for the approval by itself. */
52
+ decoupledAutomaticPolling;
53
+ constructor(init) {
54
+ this.securityFunction = init.securityFunction;
55
+ this.name = init.name;
56
+ this.technicalId = init.technicalId;
57
+ this.dkMethod = init.dkMethod;
58
+ this.dkVersion = init.dkVersion;
59
+ this.maxTanLength = init.maxTanLength;
60
+ this.numericTan = init.numericTan ?? true;
61
+ this.returnValueText = init.returnValueText;
62
+ this.maxChallengeLength = init.maxChallengeLength;
63
+ this.mediumRequirement = init.mediumRequirement ?? 'notAllowed';
64
+ this.activeMediaCount = init.activeMediaCount;
65
+ this.structuredChallenge = init.structuredChallenge ?? false;
66
+ this.decoupled = init.decoupled ?? false;
67
+ this.decoupledMaxPolls = init.decoupledMaxPolls;
68
+ this.decoupledFirstPollDelaySeconds = init.decoupledFirstPollDelaySeconds;
69
+ this.decoupledPollIntervalSeconds = init.decoupledPollIntervalSeconds;
70
+ this.decoupledManualConfirmation = init.decoupledManualConfirmation ?? true;
71
+ this.decoupledAutomaticPolling = init.decoupledAutomaticPolling ?? true;
72
+ }
73
+ /** The one-step procedure (PIN only, no TAN). */
74
+ static oneStep = new TanMethod({ securityFunction: '999', name: 'One-step (PIN only)' });
75
+ /** Whether this is the one-step procedure. */
76
+ get isOneStep() {
77
+ return this.securityFunction === TanMethod.oneStep.securityFunction;
78
+ }
79
+ /** Whether the bank needs the name of a TAN medium for this procedure. */
80
+ get needsMediumName() {
81
+ return this.mediumRequirement === 'required';
82
+ }
83
+ toString() {
84
+ return `TanMethod(${this.securityFunction}, ${this.name})`;
85
+ }
86
+ }
87
+ /** Reads the FinTS code `1` to `4`. */
88
+ export function tanMediumStatusOf(code) {
89
+ switch (code) {
90
+ case '1':
91
+ return 'active';
92
+ case '2':
93
+ return 'available';
94
+ case '3':
95
+ return 'activeFollowUpCard';
96
+ case '4':
97
+ return 'availableFollowUpCard';
98
+ default:
99
+ return 'unknown';
100
+ }
101
+ }
102
+ /** A TAN device registered for the user, such as a phone or TAN generator. */
103
+ export class TanMedium {
104
+ /** `G` TAN generator, `M` mobile phone, `L` TAN list, `S` secoder, `B` bilateral. */
105
+ mediumClass;
106
+ /** Whether the medium is in use. */
107
+ status;
108
+ /** The name the medium is registered under; this is what the bank wants back to pick the medium. */
109
+ name;
110
+ /** The TAN procedure the medium belongs to (HITAB version 5). */
111
+ securityFunction;
112
+ /** Card number of a TAN generator. */
113
+ cardNumber;
114
+ /** Sequence number of the card of a TAN generator. */
115
+ cardSequenceNumber;
116
+ /** Phone number of a mobile phone medium, if the bank states it in full. */
117
+ mobileNumber;
118
+ /** Phone number with the middle digits hidden. */
119
+ mobileNumberMasked;
120
+ /** The medium is valid from this date. */
121
+ validFrom;
122
+ /** The medium is valid until this date. */
123
+ validUntil;
124
+ /** When the medium was used last. */
125
+ lastUsed;
126
+ /** When the medium was activated. */
127
+ activatedOn;
128
+ /** Takes copies of the dates of `init`: each medium has its own, which no other one shares. */
129
+ constructor(init) {
130
+ this.mediumClass = init.mediumClass;
131
+ this.status = init.status;
132
+ this.name = init.name;
133
+ this.securityFunction = init.securityFunction;
134
+ this.cardNumber = init.cardNumber;
135
+ this.cardSequenceNumber = init.cardSequenceNumber;
136
+ this.mobileNumber = init.mobileNumber;
137
+ this.mobileNumberMasked = init.mobileNumberMasked;
138
+ this.validFrom = copyDate(init.validFrom);
139
+ this.validUntil = copyDate(init.validUntil);
140
+ this.lastUsed = copyDate(init.lastUsed);
141
+ this.activatedOn = copyDate(init.activatedOn);
142
+ }
143
+ /** Whether the medium is the one in use. */
144
+ get isActive() {
145
+ return this.status === 'active' || this.status === 'activeFollowUpCard';
146
+ }
147
+ /** The name, or the last digits of the card number, so that logs and crash reports do not collect the number. */
148
+ toString() {
149
+ const label = this.name ?? (this.cardNumber === undefined ? this.mediumClass : maskedId(this.cardNumber));
150
+ return `TanMedium(${label}, ${this.status})`;
151
+ }
152
+ }
153
+ //# sourceMappingURL=tan-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tan-models.js","sourceRoot":"","sources":["../../src/tan/tan-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** A promise with its resolve and reject functions, which tells whether it has settled. */
2
+ export declare class Deferred<T> {
3
+ readonly promise: Promise<T>;
4
+ private resolveFn;
5
+ private rejectFn;
6
+ private settled;
7
+ constructor();
8
+ get isCompleted(): boolean;
9
+ resolve(value: T): void;
10
+ reject(error: unknown): void;
11
+ }
12
+ /**
13
+ * Runs asynchronous actions one after another, in the order they were submitted.
14
+ *
15
+ * A failing action does not stop the ones queued after it.
16
+ */
17
+ export declare class SerialExecutor {
18
+ private last;
19
+ /** Runs `action` once the actions submitted before have finished; the result is that of `action`. */
20
+ run<T>(action: () => Promise<T>): Promise<T>;
21
+ }
22
+ //# sourceMappingURL=async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/util/async.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,qBAAa,QAAQ,CAAC,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,OAAO,CAAS;;IAWxB,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAMvB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAK7B;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAuC;IAEnD,qGAAqG;IACrG,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAK7C"}
@@ -0,0 +1,45 @@
1
+ /** A promise with its resolve and reject functions, which tells whether it has settled. */
2
+ export class Deferred {
3
+ promise;
4
+ resolveFn;
5
+ rejectFn;
6
+ settled = false;
7
+ constructor() {
8
+ this.promise = new Promise((resolve, reject) => {
9
+ this.resolveFn = resolve;
10
+ this.rejectFn = reject;
11
+ });
12
+ // A rejection nobody waits for is not an unhandled one: whoever awaits the promise still gets it.
13
+ this.promise.catch(() => undefined);
14
+ }
15
+ get isCompleted() {
16
+ return this.settled;
17
+ }
18
+ resolve(value) {
19
+ if (this.settled)
20
+ return;
21
+ this.settled = true;
22
+ this.resolveFn(value);
23
+ }
24
+ reject(error) {
25
+ if (this.settled)
26
+ return;
27
+ this.settled = true;
28
+ this.rejectFn(error);
29
+ }
30
+ }
31
+ /**
32
+ * Runs asynchronous actions one after another, in the order they were submitted.
33
+ *
34
+ * A failing action does not stop the ones queued after it.
35
+ */
36
+ export class SerialExecutor {
37
+ last = Promise.resolve();
38
+ /** Runs `action` once the actions submitted before have finished; the result is that of `action`. */
39
+ run(action) {
40
+ const result = this.last.then(action);
41
+ this.last = result.catch(() => undefined);
42
+ return result;
43
+ }
44
+ }
45
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/util/async.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,OAAO,QAAQ;IACV,OAAO,CAAa;IACrB,SAAS,CAAsB;IAC/B,QAAQ,CAA4B;IACpC,OAAO,GAAG,KAAK,CAAC;IAExB;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,kGAAkG;QAClG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,OAAO,CAAC,KAAQ;QACd,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAc;QACnB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACjB,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEnD,qGAAqG;IACrG,GAAG,CAAI,MAAwB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /** The `parts` joined into one array. */
2
+ export declare function concatBytes(parts: readonly Uint8Array[]): Uint8Array;
3
+ /** Collects bytes, like a growing buffer. */
4
+ export declare class BytesBuilder {
5
+ private readonly parts;
6
+ add(bytes: Uint8Array | readonly number[]): void;
7
+ addByte(byte: number): void;
8
+ takeBytes(): Uint8Array;
9
+ }
10
+ /** ISO 8859-1 bytes of `text`, which must contain no character beyond U+00FF. */
11
+ export declare function latin1Encode(text: string): Uint8Array;
12
+ /** The text of ISO 8859-1 `bytes`. */
13
+ export declare function latin1Decode(bytes: Uint8Array): string;
14
+ /** The text of the UTF-16 code units `codes`. */
15
+ export declare function fromCharCodes(codes: Uint8Array | Uint16Array): string;
16
+ export declare function utf8Encode(text: string): Uint8Array;
17
+ /** Decodes UTF-8; throws `FormatError` for malformed data unless `allowMalformed`. */
18
+ export declare function utf8Decode(bytes: Uint8Array, allowMalformed?: boolean): string;
19
+ export declare function base64Encode(bytes: Uint8Array): string;
20
+ /** Decodes base64, in the standard or the URL-safe alphabet; throws `FormatError` if `text` is not base64. */
21
+ export declare function base64Decode(text: string): Uint8Array;
22
+ //# sourceMappingURL=bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/util/bytes.ts"],"names":[],"mappings":"AAEA,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAUpE;AAED,6CAA6C;AAC7C,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAE1C,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI;IAIhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,SAAS,IAAI,UAAU;CAKxB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAIrD;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEtD;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAQrE;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,UAAQ,GAAG,MAAM,CAM5E;AAYD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAoBtD;AAED,8GAA8G;AAC9G,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAqBrD"}
@@ -0,0 +1,128 @@
1
+ import { FormatError } from './errors.js';
2
+ /** The `parts` joined into one array. */
3
+ export function concatBytes(parts) {
4
+ let length = 0;
5
+ for (const part of parts)
6
+ length += part.length;
7
+ const result = new Uint8Array(length);
8
+ let offset = 0;
9
+ for (const part of parts) {
10
+ result.set(part, offset);
11
+ offset += part.length;
12
+ }
13
+ return result;
14
+ }
15
+ /** Collects bytes, like a growing buffer. */
16
+ export class BytesBuilder {
17
+ parts = [];
18
+ add(bytes) {
19
+ this.parts.push(bytes instanceof Uint8Array ? bytes : Uint8Array.from(bytes));
20
+ }
21
+ addByte(byte) {
22
+ this.add(Uint8Array.of(byte));
23
+ }
24
+ takeBytes() {
25
+ const result = concatBytes(this.parts);
26
+ this.parts.length = 0;
27
+ return result;
28
+ }
29
+ }
30
+ /** ISO 8859-1 bytes of `text`, which must contain no character beyond U+00FF. */
31
+ export function latin1Encode(text) {
32
+ const bytes = new Uint8Array(text.length);
33
+ for (let i = 0; i < text.length; i++)
34
+ bytes[i] = text.charCodeAt(i) & 0xff;
35
+ return bytes;
36
+ }
37
+ /** The text of ISO 8859-1 `bytes`. */
38
+ export function latin1Decode(bytes) {
39
+ return fromCharCodes(bytes);
40
+ }
41
+ /** The text of the UTF-16 code units `codes`. */
42
+ export function fromCharCodes(codes) {
43
+ let text = '';
44
+ // In chunks, since a large array exceeds the argument limit of some engines. `apply` takes the array as it is, where a
45
+ // spread would iterate over it.
46
+ for (let i = 0; i < codes.length; i += 0x8000) {
47
+ text += Reflect.apply(String.fromCharCode, undefined, codes.subarray(i, i + 0x8000));
48
+ }
49
+ return text;
50
+ }
51
+ const utf8Encoder = new TextEncoder();
52
+ const utf8Decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
53
+ const lenientUtf8Decoder = new TextDecoder('utf-8', { ignoreBOM: true });
54
+ export function utf8Encode(text) {
55
+ return utf8Encoder.encode(text);
56
+ }
57
+ /** Decodes UTF-8; throws `FormatError` for malformed data unless `allowMalformed`. */
58
+ export function utf8Decode(bytes, allowMalformed = false) {
59
+ try {
60
+ return (allowMalformed ? lenientUtf8Decoder : utf8Decoder).decode(bytes);
61
+ }
62
+ catch {
63
+ throw new FormatError('Invalid UTF-8');
64
+ }
65
+ }
66
+ const base64Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
67
+ const base64Values = (() => {
68
+ const values = new Int16Array(128).fill(-1);
69
+ for (let i = 0; i < base64Alphabet.length; i++)
70
+ values[base64Alphabet.charCodeAt(i)] = i;
71
+ // The URL-safe alphabet as well.
72
+ values['-'.charCodeAt(0)] = 62;
73
+ values['_'.charCodeAt(0)] = 63;
74
+ return values;
75
+ })();
76
+ export function base64Encode(bytes) {
77
+ let out = '';
78
+ let i = 0;
79
+ for (; i + 2 < bytes.length; i += 3) {
80
+ const n = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
81
+ out +=
82
+ base64Alphabet[n >> 18] +
83
+ base64Alphabet[(n >> 12) & 63] +
84
+ base64Alphabet[(n >> 6) & 63] +
85
+ base64Alphabet[n & 63];
86
+ }
87
+ const rest = bytes.length - i;
88
+ if (rest === 1) {
89
+ const n = bytes[i] << 16;
90
+ out += base64Alphabet[n >> 18] + base64Alphabet[(n >> 12) & 63] + '==';
91
+ }
92
+ else if (rest === 2) {
93
+ const n = (bytes[i] << 16) | (bytes[i + 1] << 8);
94
+ out += base64Alphabet[n >> 18] + base64Alphabet[(n >> 12) & 63] + base64Alphabet[(n >> 6) & 63] + '=';
95
+ }
96
+ return out;
97
+ }
98
+ /** Decodes base64, in the standard or the URL-safe alphabet; throws `FormatError` if `text` is not base64. */
99
+ export function base64Decode(text) {
100
+ if (text.length % 4 !== 0)
101
+ throw new FormatError('Invalid base64 length, must be a multiple of four');
102
+ let padding = 0;
103
+ if (text.endsWith('=='))
104
+ padding = 2;
105
+ else if (text.endsWith('='))
106
+ padding = 1;
107
+ const out = new Uint8Array((text.length / 4) * 3 - padding);
108
+ let o = 0;
109
+ for (let i = 0; i < text.length; i += 4) {
110
+ let n = 0;
111
+ for (let j = 0; j < 4; j++) {
112
+ const c = text.charCodeAt(i + j);
113
+ const isPadding = c === 0x3d && i + 4 === text.length && j >= 4 - padding;
114
+ const value = isPadding ? 0 : c < 128 ? base64Values[c] : -1;
115
+ if (value < 0)
116
+ throw new FormatError('Invalid base64 character', text.charAt(i + j));
117
+ n = (n << 6) | value;
118
+ }
119
+ if (o < out.length)
120
+ out[o++] = n >> 16;
121
+ if (o < out.length)
122
+ out[o++] = (n >> 8) & 0xff;
123
+ if (o < out.length)
124
+ out[o++] = n & 0xff;
125
+ }
126
+ return out;
127
+ }
128
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/util/bytes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tells which asynchronous call an operation runs in, through every `await` and callback it starts. Where the runtime
3
+ * cannot track that, as in browsers, `current` is always `undefined`.
4
+ */
5
+ export declare class CallContext<T extends object> {
6
+ private readonly storage;
7
+ /** The value of the call that runs now, if the runtime can tell. */
8
+ get current(): T | undefined;
9
+ /** Runs `action` as the call `value`. */
10
+ run<R>(value: T, action: () => R): R;
11
+ }
12
+ //# sourceMappingURL=call-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-context.d.ts","sourceRoot":"","sources":["../../src/util/call-context.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2F;IAEnH,oEAAoE;IACpE,IAAI,OAAO,IAAI,CAAC,GAAG,SAAS,CAE3B;IAED,yCAAyC;IACzC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;CAGrC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `AsyncLocalStorage` where the runtime has it, found through `process.getBuiltinModule` (Node.js 22.3, Deno 2.1 and
3
+ * Bun 1.2.6 or later) rather than by importing `node:async_hooks`, so that bundlers for the browser have nothing to
4
+ * resolve.
5
+ */
6
+ const AsyncStorageClass = (() => {
7
+ const runtime = globalThis;
8
+ try {
9
+ return runtime.process?.getBuiltinModule?.('node:async_hooks')?.AsyncLocalStorage;
10
+ }
11
+ catch {
12
+ return undefined;
13
+ }
14
+ })();
15
+ /**
16
+ * Tells which asynchronous call an operation runs in, through every `await` and callback it starts. Where the runtime
17
+ * cannot track that, as in browsers, `current` is always `undefined`.
18
+ */
19
+ export class CallContext {
20
+ storage = AsyncStorageClass ? new AsyncStorageClass() : undefined;
21
+ /** The value of the call that runs now, if the runtime can tell. */
22
+ get current() {
23
+ return this.storage?.getStore();
24
+ }
25
+ /** Runs `action` as the call `value`. */
26
+ run(value, action) {
27
+ return this.storage ? this.storage.run(value, action) : action();
28
+ }
29
+ }
30
+ //# sourceMappingURL=call-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-context.js","sourceRoot":"","sources":["../../src/util/call-context.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,MAAM,iBAAiB,GAAwC,CAAC,GAAG,EAAE;IACnE,MAAM,OAAO,GAAG,UAEf,CAAC;IACF,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL;;;GAGG;AACH,MAAM,OAAO,WAAW;IACL,OAAO,GAAgC,iBAAiB,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnH,oEAAoE;IACpE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,yCAAyC;IACzC,GAAG,CAAI,KAAQ,EAAE,MAAe;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnE,CAAC;CACF"}
@@ -0,0 +1,55 @@
1
+ /** `YYYYMMDD`, the FinTS 3.0 date format. */
2
+ export declare function formatFintsDate(d: Date): string;
3
+ /** `HHMMSS`, the FinTS 3.0 time format. */
4
+ export declare function formatFintsTime(d: Date): string;
5
+ /** `YYYY-MM-DD`, the ISO 8601 date format of camt. */
6
+ export declare function formatIsoDate(d: Date): string;
7
+ /** Parses a FinTS 3.0 date `YYYYMMDD` as a calendar date; `undefined` if it is missing or invalid. */
8
+ export declare function parseFintsDate(date: string | undefined): Date | undefined;
9
+ /**
10
+ * Parses a FinTS 3.0 date `YYYYMMDD` and time `HHMMSS` as the moment they name; `undefined` if either is missing or
11
+ * invalid.
12
+ */
13
+ export declare function parseFintsDateTime(date: string | undefined, time: string | undefined): Date | undefined;
14
+ /**
15
+ * Parses an ISO 8601 date `YYYY-MM-DD` as a calendar date, ignoring extra characters such as a time part; `undefined`
16
+ * if it is missing or invalid.
17
+ */
18
+ export declare function parseIsoDate(date: string | undefined): Date | undefined;
19
+ /**
20
+ * Parses an ISO 8601 date and time as XML Schema writes it, `YYYY-MM-DDThh:mm:ss` with optional fractional seconds and
21
+ * UTC offset (`Z` or `±hh:mm`), as the moment it names, to the second: in German time where it states no offset.
22
+ * `undefined` if it is missing or invalid.
23
+ */
24
+ export declare function parseIsoMoment(dateTime: string | undefined): Date | undefined;
25
+ /**
26
+ * Parses a FinTS 3.0 date `YYYYMMDD` and time `HHMMSS` given in UTC+01:00 all year round, as the account extension of
27
+ * the user parameter data states its times (Formals E.3.1); `undefined` if either is missing or invalid. A time with
28
+ * fewer than six digits lost its leading zeros as a JSON number.
29
+ */
30
+ export declare function parseUtcPlusOneDateTime(date: string | undefined, time: string | undefined): Date | undefined;
31
+ /** The calendar day a German clock shows at `moment`, as a local `Date` at midnight like every calendar date. */
32
+ export declare function germanDay(moment: Date): Date;
33
+ /**
34
+ * The date, with a day beyond the end of the month moved to its last day: banks write 30 February or 31 April for
35
+ * month-end bookings. `undefined` for a month or day that no month has.
36
+ */
37
+ export declare function clampedDate(year: number, month: number, day: number): Date | undefined;
38
+ /**
39
+ * Parses a SWIFT date `YYMMDD`, as MT940 writes it, with month ends as `clampedDate` reads them; years from 80 on count
40
+ * as 19xx. `undefined` if the date is invalid.
41
+ */
42
+ export declare function parseSwiftDate(yymmdd: string): Date | undefined;
43
+ /** A copy of `d`, so that a model keeps dates of its own: a `Date` can be changed in place. */
44
+ export declare function copyDate(d: Date): Date;
45
+ export declare function copyDate(d: Date | undefined): Date | undefined;
46
+ /** The calendar day `moment` falls on in local time, as a local `Date` at midnight. */
47
+ export declare function calendarDay(moment: Date): Date;
48
+ /**
49
+ * The calendar `day`, moved back to the bank's today if it lies after it: banks reject future dates in queries.
50
+ *
51
+ * The bank's today is the German day at `now`, the current time by default; east of Germany the local day starts
52
+ * earlier.
53
+ */
54
+ export declare function notAfterToday(day: Date | undefined, now?: Date): Date | undefined;
55
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../src/util/dates.ts"],"names":[],"mappings":"AAcA,6CAA6C;AAC7C,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAE/C;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAE/C;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAE7C;AAQD,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAEzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAEvG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAEvE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAU7E;AAsBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAK5G;AAeD,iHAAiH;AACjH,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAI5C;AAoCD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAGtF;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAK/D;AAQD,+FAA+F;AAC/F,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;AACxC,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;AAKhE,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,GAAG,SAAS,CAI7F"}