@coderoftime/fints 0.0.0-stage → 0.1.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 (254) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +28 -0
  3. package/README.md +156 -2
  4. package/dist/core/account.d.ts +140 -0
  5. package/dist/core/account.d.ts.map +1 -0
  6. package/dist/core/account.js +174 -0
  7. package/dist/core/account.js.map +1 -0
  8. package/dist/core/amount.d.ts +62 -0
  9. package/dist/core/amount.d.ts.map +1 -0
  10. package/dist/core/amount.js +189 -0
  11. package/dist/core/amount.js.map +1 -0
  12. package/dist/core/balance.d.ts +54 -0
  13. package/dist/core/balance.d.ts.map +1 -0
  14. package/dist/core/balance.js +53 -0
  15. package/dist/core/balance.js.map +1 -0
  16. package/dist/core/bank-info.d.ts +49 -0
  17. package/dist/core/bank-info.d.ts.map +1 -0
  18. package/dist/core/bank-info.js +52 -0
  19. package/dist/core/bank-info.js.map +1 -0
  20. package/dist/core/client.d.ts +126 -0
  21. package/dist/core/client.d.ts.map +1 -0
  22. package/dist/core/client.js +2 -0
  23. package/dist/core/client.js.map +1 -0
  24. package/dist/core/config.d.ts +68 -0
  25. package/dist/core/config.d.ts.map +1 -0
  26. package/dist/core/config.js +113 -0
  27. package/dist/core/config.js.map +1 -0
  28. package/dist/core/errors.d.ts +91 -0
  29. package/dist/core/errors.d.ts.map +1 -0
  30. package/dist/core/errors.js +182 -0
  31. package/dist/core/errors.js.map +1 -0
  32. package/dist/core/feedback.d.ts +69 -0
  33. package/dist/core/feedback.d.ts.map +1 -0
  34. package/dist/core/feedback.js +124 -0
  35. package/dist/core/feedback.js.map +1 -0
  36. package/dist/core/transaction.d.ts +98 -0
  37. package/dist/core/transaction.d.ts.map +1 -0
  38. package/dist/core/transaction.js +91 -0
  39. package/dist/core/transaction.js.map +1 -0
  40. package/dist/core/transport.d.ts +37 -0
  41. package/dist/core/transport.d.ts.map +1 -0
  42. package/dist/core/transport.js +92 -0
  43. package/dist/core/transport.js.map +1 -0
  44. package/dist/formats/camt.d.ts +12 -0
  45. package/dist/formats/camt.d.ts.map +1 -0
  46. package/dist/formats/camt.js +159 -0
  47. package/dist/formats/camt.js.map +1 -0
  48. package/dist/formats/mt940.d.ts +42 -0
  49. package/dist/formats/mt940.d.ts.map +1 -0
  50. package/dist/formats/mt940.js +297 -0
  51. package/dist/formats/mt940.js.map +1 -0
  52. package/dist/formats/readers.d.ts +11 -0
  53. package/dist/formats/readers.d.ts.map +1 -0
  54. package/dist/formats/readers.js +47 -0
  55. package/dist/formats/readers.js.map +1 -0
  56. package/dist/formats/sepa-purpose.d.ts +22 -0
  57. package/dist/formats/sepa-purpose.d.ts.map +1 -0
  58. package/dist/formats/sepa-purpose.js +68 -0
  59. package/dist/formats/sepa-purpose.js.map +1 -0
  60. package/dist/index.d.ts +28 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +27 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/session/app-approval.d.ts +60 -0
  65. package/dist/session/app-approval.d.ts.map +1 -0
  66. package/dist/session/app-approval.js +215 -0
  67. package/dist/session/app-approval.js.map +1 -0
  68. package/dist/session/bank-connection.d.ts +28 -0
  69. package/dist/session/bank-connection.d.ts.map +1 -0
  70. package/dist/session/bank-connection.js +48 -0
  71. package/dist/session/bank-connection.js.map +1 -0
  72. package/dist/session/dialog-runner.d.ts +34 -0
  73. package/dist/session/dialog-runner.d.ts.map +1 -0
  74. package/dist/session/dialog-runner.js +112 -0
  75. package/dist/session/dialog-runner.js.map +1 -0
  76. package/dist/session/login-guard.d.ts +73 -0
  77. package/dist/session/login-guard.d.ts.map +1 -0
  78. package/dist/session/login-guard.js +109 -0
  79. package/dist/session/login-guard.js.map +1 -0
  80. package/dist/session/parameter-data.d.ts +83 -0
  81. package/dist/session/parameter-data.d.ts.map +1 -0
  82. package/dist/session/parameter-data.js +68 -0
  83. package/dist/session/parameter-data.js.map +1 -0
  84. package/dist/session/pin-tan-client.d.ts +54 -0
  85. package/dist/session/pin-tan-client.d.ts.map +1 -0
  86. package/dist/session/pin-tan-client.js +153 -0
  87. package/dist/session/pin-tan-client.js.map +1 -0
  88. package/dist/session/pin-tan-dialog.d.ts +71 -0
  89. package/dist/session/pin-tan-dialog.d.ts.map +1 -0
  90. package/dist/session/pin-tan-dialog.js +124 -0
  91. package/dist/session/pin-tan-dialog.js.map +1 -0
  92. package/dist/session/protocol.d.ts +209 -0
  93. package/dist/session/protocol.d.ts.map +1 -0
  94. package/dist/session/protocol.js +75 -0
  95. package/dist/session/protocol.js.map +1 -0
  96. package/dist/session/response-handler.d.ts +48 -0
  97. package/dist/session/response-handler.d.ts.map +1 -0
  98. package/dist/session/response-handler.js +121 -0
  99. package/dist/session/response-handler.js.map +1 -0
  100. package/dist/session/sepa-accounts.d.ts +34 -0
  101. package/dist/session/sepa-accounts.d.ts.map +1 -0
  102. package/dist/session/sepa-accounts.js +96 -0
  103. package/dist/session/sepa-accounts.js.map +1 -0
  104. package/dist/session/session-setup.d.ts +72 -0
  105. package/dist/session/session-setup.d.ts.map +1 -0
  106. package/dist/session/session-setup.js +160 -0
  107. package/dist/session/session-setup.js.map +1 -0
  108. package/dist/session/session-state.d.ts +47 -0
  109. package/dist/session/session-state.d.ts.map +1 -0
  110. package/dist/session/session-state.js +147 -0
  111. package/dist/session/session-state.js.map +1 -0
  112. package/dist/session/tan-selection.d.ts +88 -0
  113. package/dist/session/tan-selection.d.ts.map +1 -0
  114. package/dist/session/tan-selection.js +178 -0
  115. package/dist/session/tan-selection.js.map +1 -0
  116. package/dist/session/user-prompts.d.ts +61 -0
  117. package/dist/session/user-prompts.d.ts.map +1 -0
  118. package/dist/session/user-prompts.js +164 -0
  119. package/dist/session/user-prompts.js.map +1 -0
  120. package/dist/tan/challenge.d.ts +114 -0
  121. package/dist/tan/challenge.d.ts.map +1 -0
  122. package/dist/tan/challenge.js +185 -0
  123. package/dist/tan/challenge.js.map +1 -0
  124. package/dist/tan/flicker.d.ts +36 -0
  125. package/dist/tan/flicker.d.ts.map +1 -0
  126. package/dist/tan/flicker.js +262 -0
  127. package/dist/tan/flicker.js.map +1 -0
  128. package/dist/tan/tan-image.d.ts +21 -0
  129. package/dist/tan/tan-image.d.ts.map +1 -0
  130. package/dist/tan/tan-image.js +41 -0
  131. package/dist/tan/tan-image.js.map +1 -0
  132. package/dist/tan/tan-models.d.ts +145 -0
  133. package/dist/tan/tan-models.d.ts.map +1 -0
  134. package/dist/tan/tan-models.js +148 -0
  135. package/dist/tan/tan-models.js.map +1 -0
  136. package/dist/util/async.d.ts +24 -0
  137. package/dist/util/async.d.ts.map +1 -0
  138. package/dist/util/async.js +49 -0
  139. package/dist/util/async.js.map +1 -0
  140. package/dist/util/bytes.d.ts +23 -0
  141. package/dist/util/bytes.d.ts.map +1 -0
  142. package/dist/util/bytes.js +136 -0
  143. package/dist/util/bytes.js.map +1 -0
  144. package/dist/util/call-context.d.ts +12 -0
  145. package/dist/util/call-context.d.ts.map +1 -0
  146. package/dist/util/call-context.js +29 -0
  147. package/dist/util/call-context.js.map +1 -0
  148. package/dist/util/dates.d.ts +62 -0
  149. package/dist/util/dates.d.ts.map +1 -0
  150. package/dist/util/dates.js +169 -0
  151. package/dist/util/dates.js.map +1 -0
  152. package/dist/util/errors.d.ts +9 -0
  153. package/dist/util/errors.d.ts.map +1 -0
  154. package/dist/util/errors.js +15 -0
  155. package/dist/util/errors.js.map +1 -0
  156. package/dist/util/immutable-map.d.ts +16 -0
  157. package/dist/util/immutable-map.d.ts.map +1 -0
  158. package/dist/util/immutable-map.js +38 -0
  159. package/dist/util/immutable-map.js.map +1 -0
  160. package/dist/util/json.d.ts +13 -0
  161. package/dist/util/json.d.ts.map +1 -0
  162. package/dist/util/json.js +44 -0
  163. package/dist/util/json.js.map +1 -0
  164. package/dist/util/text.d.ts +20 -0
  165. package/dist/util/text.d.ts.map +1 -0
  166. package/dist/util/text.js +78 -0
  167. package/dist/util/text.js.map +1 -0
  168. package/dist/util/xml.d.ts +35 -0
  169. package/dist/util/xml.d.ts.map +1 -0
  170. package/dist/util/xml.js +183 -0
  171. package/dist/util/xml.js.map +1 -0
  172. package/dist/v3/account-extension.d.ts +25 -0
  173. package/dist/v3/account-extension.d.ts.map +1 -0
  174. package/dist/v3/account-extension.js +176 -0
  175. package/dist/v3/account-extension.js.map +1 -0
  176. package/dist/v3/client.d.ts +24 -0
  177. package/dist/v3/client.d.ts.map +1 -0
  178. package/dist/v3/client.js +16 -0
  179. package/dist/v3/client.js.map +1 -0
  180. package/dist/v3/dialog.d.ts +78 -0
  181. package/dist/v3/dialog.d.ts.map +1 -0
  182. package/dist/v3/dialog.js +138 -0
  183. package/dist/v3/dialog.js.map +1 -0
  184. package/dist/v3/message.d.ts +72 -0
  185. package/dist/v3/message.d.ts.map +1 -0
  186. package/dist/v3/message.js +259 -0
  187. package/dist/v3/message.js.map +1 -0
  188. package/dist/v3/parameters.d.ts +79 -0
  189. package/dist/v3/parameters.d.ts.map +1 -0
  190. package/dist/v3/parameters.js +396 -0
  191. package/dist/v3/parameters.js.map +1 -0
  192. package/dist/v3/protocol.d.ts +68 -0
  193. package/dist/v3/protocol.d.ts.map +1 -0
  194. package/dist/v3/protocol.js +263 -0
  195. package/dist/v3/protocol.js.map +1 -0
  196. package/dist/v3/segments.d.ts +89 -0
  197. package/dist/v3/segments.d.ts.map +1 -0
  198. package/dist/v3/segments.js +283 -0
  199. package/dist/v3/segments.js.map +1 -0
  200. package/dist/v3/syntax.d.ts +76 -0
  201. package/dist/v3/syntax.d.ts.map +1 -0
  202. package/dist/v3/syntax.js +301 -0
  203. package/dist/v3/syntax.js.map +1 -0
  204. package/package.json +63 -4
  205. package/src/core/account.ts +250 -0
  206. package/src/core/amount.ts +209 -0
  207. package/src/core/balance.ts +84 -0
  208. package/src/core/bank-info.ts +66 -0
  209. package/src/core/client.ts +149 -0
  210. package/src/core/config.ts +141 -0
  211. package/src/core/errors.ts +203 -0
  212. package/src/core/feedback.ts +137 -0
  213. package/src/core/transaction.ts +156 -0
  214. package/src/core/transport.ts +114 -0
  215. package/src/formats/camt.ts +169 -0
  216. package/src/formats/mt940.ts +333 -0
  217. package/src/formats/readers.ts +56 -0
  218. package/src/formats/sepa-purpose.ts +75 -0
  219. package/src/index.ts +68 -0
  220. package/src/session/app-approval.ts +265 -0
  221. package/src/session/bank-connection.ts +51 -0
  222. package/src/session/dialog-runner.ts +119 -0
  223. package/src/session/login-guard.ts +135 -0
  224. package/src/session/parameter-data.ts +137 -0
  225. package/src/session/pin-tan-client.ts +186 -0
  226. package/src/session/pin-tan-dialog.ts +160 -0
  227. package/src/session/protocol.ts +311 -0
  228. package/src/session/response-handler.ts +130 -0
  229. package/src/session/sepa-accounts.ts +97 -0
  230. package/src/session/session-setup.ts +165 -0
  231. package/src/session/session-state.ts +170 -0
  232. package/src/session/tan-selection.ts +192 -0
  233. package/src/session/user-prompts.ts +174 -0
  234. package/src/tan/challenge.ts +252 -0
  235. package/src/tan/flicker.ts +270 -0
  236. package/src/tan/tan-image.ts +36 -0
  237. package/src/tan/tan-models.ts +247 -0
  238. package/src/util/async.ts +53 -0
  239. package/src/util/bytes.ts +135 -0
  240. package/src/util/call-context.ts +40 -0
  241. package/src/util/dates.ts +193 -0
  242. package/src/util/errors.ts +16 -0
  243. package/src/util/immutable-map.ts +47 -0
  244. package/src/util/json.ts +51 -0
  245. package/src/util/text.ts +82 -0
  246. package/src/util/xml.ts +172 -0
  247. package/src/v3/account-extension.ts +190 -0
  248. package/src/v3/client.ts +29 -0
  249. package/src/v3/dialog.ts +199 -0
  250. package/src/v3/message.ts +321 -0
  251. package/src/v3/parameters.ts +451 -0
  252. package/src/v3/protocol.ts +331 -0
  253. package/src/v3/segments.ts +331 -0
  254. package/src/v3/syntax.ts +307 -0
@@ -0,0 +1,145 @@
1
+ /** Whether a TAN method needs the name of a TAN medium. */
2
+ export type TanMediumRequirement =
3
+ /** The method takes no medium name. */
4
+ 'notAllowed'
5
+ /** The method takes a medium name but works without one. */
6
+ | 'optional'
7
+ /** The method needs the name of the medium. */
8
+ | 'required';
9
+ /** Reads the FinTS code: `0` not allowed, `1` optional, `2` required. */
10
+ export declare function tanMediumRequirementOf(code: string | undefined): TanMediumRequirement;
11
+ /** What `TanMethod` takes; the bank states the details it knows. */
12
+ export interface TanMethodInit {
13
+ securityFunction: string;
14
+ name: string;
15
+ technicalId?: string | undefined;
16
+ dkMethod?: string | undefined;
17
+ dkVersion?: string | undefined;
18
+ maxTanLength?: number | undefined;
19
+ numericTan?: boolean;
20
+ returnValueText?: string | undefined;
21
+ maxChallengeLength?: number | undefined;
22
+ mediumRequirement?: TanMediumRequirement;
23
+ activeMediaCount?: number | undefined;
24
+ structuredChallenge?: boolean;
25
+ decoupled?: boolean;
26
+ decoupledMaxPolls?: number | undefined;
27
+ decoupledFirstPollDelaySeconds?: number | undefined;
28
+ decoupledPollIntervalSeconds?: number | undefined;
29
+ decoupledManualConfirmation?: boolean;
30
+ decoupledAutomaticPolling?: boolean;
31
+ }
32
+ /** A TAN procedure offered by the bank (FinTS "Sicherheitsfunktion"). */
33
+ export declare class TanMethod {
34
+ /** Bank-specific code of the procedure, for example `942`; `999` is the one-step procedure. */
35
+ readonly securityFunction: string;
36
+ /** The name the bank gives the procedure, for example `pushTAN`. */
37
+ readonly name: string;
38
+ /** The bank's technical identification of the procedure. */
39
+ readonly technicalId: string | undefined;
40
+ /** DK procedure family such as `HHD1.4`, `mobileTAN` or `Decoupled`. */
41
+ readonly dkMethod: string | undefined;
42
+ /** Version of the `dkMethod`. */
43
+ readonly dkVersion: string | undefined;
44
+ /** Longest TAN the user may enter. */
45
+ readonly maxTanLength: number | undefined;
46
+ /** Whether the TAN consists of digits only. */
47
+ readonly numericTan: boolean;
48
+ /** The bank's label for the value the user sends back, for example `TAN`. */
49
+ readonly returnValueText: string | undefined;
50
+ /** Longest challenge text the bank sends for this procedure. */
51
+ readonly maxChallengeLength: number | undefined;
52
+ /** Whether a TAN medium name goes with this procedure. */
53
+ readonly mediumRequirement: TanMediumRequirement;
54
+ /**
55
+ * Most TAN media a user can have active at once for this procedure, as the bank's parameters state it ("Anzahl
56
+ * unterstützter aktiver TAN-Medien"); not how many the user has.
57
+ *
58
+ * Where it is above 1 and `needsMediumName`, each message names the medium, since the user may have several.
59
+ */
60
+ readonly activeMediaCount: number | undefined;
61
+ /** Whether the challenge text is structured (marked up) rather than plain. */
62
+ readonly structuredChallenge: boolean;
63
+ /** Whether approval happens in a separate app instead of entering a TAN. */
64
+ readonly decoupled: boolean;
65
+ /** Most status requests the bank allows for a decoupled approval; 0 allows any number. */
66
+ readonly decoupledMaxPolls: number | undefined;
67
+ /** How long to wait before the first status request of a decoupled approval, in seconds. */
68
+ readonly decoupledFirstPollDelaySeconds: number | undefined;
69
+ /** How long to wait between two status requests of a decoupled approval, in seconds. */
70
+ readonly decoupledPollIntervalSeconds: number | undefined;
71
+ /** Whether the user may report the approval, rather than the client asking the bank by itself. */
72
+ readonly decoupledManualConfirmation: boolean;
73
+ /** Whether the bank allows the client to ask for the approval by itself. */
74
+ readonly decoupledAutomaticPolling: boolean;
75
+ constructor(init: TanMethodInit);
76
+ /** The one-step procedure (PIN only, no TAN). */
77
+ static readonly oneStep: TanMethod;
78
+ /** Whether this is the one-step procedure. */
79
+ get isOneStep(): boolean;
80
+ /** Whether the bank needs the name of a TAN medium for this procedure. */
81
+ get needsMediumName(): boolean;
82
+ toString(): string;
83
+ }
84
+ /** State of a TAN medium as reported by the bank. */
85
+ export type TanMediumStatus =
86
+ /** The medium is in use. */
87
+ 'active'
88
+ /** The medium can be used but is not the active one. */
89
+ | 'available'
90
+ /** The medium is the active follow-up card. */
91
+ | 'activeFollowUpCard'
92
+ /** The medium is an available follow-up card. */
93
+ | 'availableFollowUpCard'
94
+ /** The bank states no status, or one that is not known. */
95
+ | 'unknown';
96
+ /** Reads the FinTS code `1` to `4`. */
97
+ export declare function tanMediumStatusOf(code: string | undefined): TanMediumStatus;
98
+ /** What `TanMedium` takes; the bank states the details it knows. */
99
+ export interface TanMediumInit {
100
+ mediumClass: string;
101
+ status: TanMediumStatus;
102
+ name?: string | undefined;
103
+ securityFunction?: string | undefined;
104
+ cardNumber?: string | undefined;
105
+ cardSequenceNumber?: string | undefined;
106
+ mobileNumber?: string | undefined;
107
+ mobileNumberMasked?: string | undefined;
108
+ validFrom?: Date | undefined;
109
+ validUntil?: Date | undefined;
110
+ lastUsed?: Date | undefined;
111
+ activatedOn?: Date | undefined;
112
+ }
113
+ /** A TAN device registered for the user, such as a phone or TAN generator. */
114
+ export declare class TanMedium {
115
+ /** `G` TAN generator, `M` mobile phone, `L` TAN list, `S` secoder, `B` bilateral. */
116
+ readonly mediumClass: string;
117
+ /** Whether the medium is in use. */
118
+ readonly status: TanMediumStatus;
119
+ /** The name the medium is registered under; this is what the bank wants back to pick the medium. */
120
+ readonly name: string | undefined;
121
+ /** The TAN procedure the medium belongs to (HITAB version 5). */
122
+ readonly securityFunction: string | undefined;
123
+ /** Card number of a TAN generator. */
124
+ readonly cardNumber: string | undefined;
125
+ /** Sequence number of the card of a TAN generator. */
126
+ readonly cardSequenceNumber: string | undefined;
127
+ /** Phone number of a mobile phone medium, if the bank states it in full. */
128
+ readonly mobileNumber: string | undefined;
129
+ /** Phone number with the middle digits hidden. */
130
+ readonly mobileNumberMasked: string | undefined;
131
+ /** The medium is valid from this date. */
132
+ readonly validFrom: Date | undefined;
133
+ /** The medium is valid until this date. */
134
+ readonly validUntil: Date | undefined;
135
+ /** When the medium was used last. */
136
+ readonly lastUsed: Date | undefined;
137
+ /** When the medium was activated. */
138
+ readonly activatedOn: Date | undefined;
139
+ constructor(init: TanMediumInit);
140
+ /** Whether the medium is the one in use. */
141
+ get isActive(): boolean;
142
+ /** The name, or the last digits of the card number, so that logs and crash reports do not collect the number. */
143
+ toString(): string;
144
+ }
145
+ //# sourceMappingURL=tan-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tan-models.d.ts","sourceRoot":"","sources":["../../src/tan/tan-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import { maskedId } from '../util/text.js';
2
+ /** Reads the FinTS code: `0` not allowed, `1` optional, `2` required. */
3
+ export function tanMediumRequirementOf(code) {
4
+ return code === '1' ? 'optional' : code === '2' ? 'required' : 'notAllowed';
5
+ }
6
+ /** A TAN procedure offered by the bank (FinTS "Sicherheitsfunktion"). */
7
+ export class TanMethod {
8
+ /** Bank-specific code of the procedure, for example `942`; `999` is the one-step procedure. */
9
+ securityFunction;
10
+ /** The name the bank gives the procedure, for example `pushTAN`. */
11
+ name;
12
+ /** The bank's technical identification of the procedure. */
13
+ technicalId;
14
+ /** DK procedure family such as `HHD1.4`, `mobileTAN` or `Decoupled`. */
15
+ dkMethod;
16
+ /** Version of the `dkMethod`. */
17
+ dkVersion;
18
+ /** Longest TAN the user may enter. */
19
+ maxTanLength;
20
+ /** Whether the TAN consists of digits only. */
21
+ numericTan;
22
+ /** The bank's label for the value the user sends back, for example `TAN`. */
23
+ returnValueText;
24
+ /** Longest challenge text the bank sends for this procedure. */
25
+ maxChallengeLength;
26
+ /** Whether a TAN medium name goes with this procedure. */
27
+ mediumRequirement;
28
+ /**
29
+ * Most TAN media a user can have active at once for this procedure, as the bank's parameters state it ("Anzahl
30
+ * unterstützter aktiver TAN-Medien"); not how many the user has.
31
+ *
32
+ * Where it is above 1 and `needsMediumName`, each message names the medium, since the user may have several.
33
+ */
34
+ activeMediaCount;
35
+ /** Whether the challenge text is structured (marked up) rather than plain. */
36
+ structuredChallenge;
37
+ /** Whether approval happens in a separate app instead of entering a TAN. */
38
+ decoupled;
39
+ /** Most status requests the bank allows for a decoupled approval; 0 allows any number. */
40
+ decoupledMaxPolls;
41
+ /** How long to wait before the first status request of a decoupled approval, in seconds. */
42
+ decoupledFirstPollDelaySeconds;
43
+ /** How long to wait between two status requests of a decoupled approval, in seconds. */
44
+ decoupledPollIntervalSeconds;
45
+ /** Whether the user may report the approval, rather than the client asking the bank by itself. */
46
+ decoupledManualConfirmation;
47
+ /** Whether the bank allows the client to ask for the approval by itself. */
48
+ decoupledAutomaticPolling;
49
+ constructor(init) {
50
+ this.securityFunction = init.securityFunction;
51
+ this.name = init.name;
52
+ this.technicalId = init.technicalId;
53
+ this.dkMethod = init.dkMethod;
54
+ this.dkVersion = init.dkVersion;
55
+ this.maxTanLength = init.maxTanLength;
56
+ this.numericTan = init.numericTan ?? true;
57
+ this.returnValueText = init.returnValueText;
58
+ this.maxChallengeLength = init.maxChallengeLength;
59
+ this.mediumRequirement = init.mediumRequirement ?? 'notAllowed';
60
+ this.activeMediaCount = init.activeMediaCount;
61
+ this.structuredChallenge = init.structuredChallenge ?? false;
62
+ this.decoupled = init.decoupled ?? false;
63
+ this.decoupledMaxPolls = init.decoupledMaxPolls;
64
+ this.decoupledFirstPollDelaySeconds = init.decoupledFirstPollDelaySeconds;
65
+ this.decoupledPollIntervalSeconds = init.decoupledPollIntervalSeconds;
66
+ this.decoupledManualConfirmation = init.decoupledManualConfirmation ?? true;
67
+ this.decoupledAutomaticPolling = init.decoupledAutomaticPolling ?? true;
68
+ }
69
+ /** The one-step procedure (PIN only, no TAN). */
70
+ static oneStep = new TanMethod({ securityFunction: '999', name: 'One-step (PIN only)' });
71
+ /** Whether this is the one-step procedure. */
72
+ get isOneStep() {
73
+ return this.securityFunction === TanMethod.oneStep.securityFunction;
74
+ }
75
+ /** Whether the bank needs the name of a TAN medium for this procedure. */
76
+ get needsMediumName() {
77
+ return this.mediumRequirement === 'required';
78
+ }
79
+ toString() {
80
+ return `TanMethod(${this.securityFunction}, ${this.name})`;
81
+ }
82
+ }
83
+ /** Reads the FinTS code `1` to `4`. */
84
+ export function tanMediumStatusOf(code) {
85
+ switch (code) {
86
+ case '1':
87
+ return 'active';
88
+ case '2':
89
+ return 'available';
90
+ case '3':
91
+ return 'activeFollowUpCard';
92
+ case '4':
93
+ return 'availableFollowUpCard';
94
+ default:
95
+ return 'unknown';
96
+ }
97
+ }
98
+ /** A TAN device registered for the user, such as a phone or TAN generator. */
99
+ export class TanMedium {
100
+ /** `G` TAN generator, `M` mobile phone, `L` TAN list, `S` secoder, `B` bilateral. */
101
+ mediumClass;
102
+ /** Whether the medium is in use. */
103
+ status;
104
+ /** The name the medium is registered under; this is what the bank wants back to pick the medium. */
105
+ name;
106
+ /** The TAN procedure the medium belongs to (HITAB version 5). */
107
+ securityFunction;
108
+ /** Card number of a TAN generator. */
109
+ cardNumber;
110
+ /** Sequence number of the card of a TAN generator. */
111
+ cardSequenceNumber;
112
+ /** Phone number of a mobile phone medium, if the bank states it in full. */
113
+ mobileNumber;
114
+ /** Phone number with the middle digits hidden. */
115
+ mobileNumberMasked;
116
+ /** The medium is valid from this date. */
117
+ validFrom;
118
+ /** The medium is valid until this date. */
119
+ validUntil;
120
+ /** When the medium was used last. */
121
+ lastUsed;
122
+ /** When the medium was activated. */
123
+ activatedOn;
124
+ constructor(init) {
125
+ this.mediumClass = init.mediumClass;
126
+ this.status = init.status;
127
+ this.name = init.name;
128
+ this.securityFunction = init.securityFunction;
129
+ this.cardNumber = init.cardNumber;
130
+ this.cardSequenceNumber = init.cardSequenceNumber;
131
+ this.mobileNumber = init.mobileNumber;
132
+ this.mobileNumberMasked = init.mobileNumberMasked;
133
+ this.validFrom = init.validFrom;
134
+ this.validUntil = init.validUntil;
135
+ this.lastUsed = init.lastUsed;
136
+ this.activatedOn = init.activatedOn;
137
+ }
138
+ /** Whether the medium is the one in use. */
139
+ get isActive() {
140
+ return this.status === 'active' || this.status === 'activeFollowUpCard';
141
+ }
142
+ /** The name, or the last digits of the card number, so that logs and crash reports do not collect the number. */
143
+ toString() {
144
+ const label = this.name ?? (this.cardNumber === undefined ? this.mediumClass : maskedId(this.cardNumber));
145
+ return `TanMedium(${label}, ${this.status})`;
146
+ }
147
+ }
148
+ //# sourceMappingURL=tan-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tan-models.js","sourceRoot":"","sources":["../../src/tan/tan-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAW3C,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CAAC,IAAwB;IAC7D,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;AAC9E,CAAC;AAwBD,yEAAyE;AACzE,MAAM,OAAO,SAAS;IACpB,+FAA+F;IACtF,gBAAgB,CAAS;IAElC,oEAAoE;IAC3D,IAAI,CAAS;IAEtB,4DAA4D;IACnD,WAAW,CAAqB;IAEzC,wEAAwE;IAC/D,QAAQ,CAAqB;IAEtC,iCAAiC;IACxB,SAAS,CAAqB;IAEvC,sCAAsC;IAC7B,YAAY,CAAqB;IAE1C,+CAA+C;IACtC,UAAU,CAAU;IAE7B,6EAA6E;IACpE,eAAe,CAAqB;IAE7C,gEAAgE;IACvD,kBAAkB,CAAqB;IAEhD,0DAA0D;IACjD,iBAAiB,CAAuB;IAEjD;;;;;OAKG;IACM,gBAAgB,CAAqB;IAE9C,8EAA8E;IACrE,mBAAmB,CAAU;IAEtC,4EAA4E;IACnE,SAAS,CAAU;IAE5B,0FAA0F;IACjF,iBAAiB,CAAqB;IAE/C,4FAA4F;IACnF,8BAA8B,CAAqB;IAE5D,wFAAwF;IAC/E,4BAA4B,CAAqB;IAE1D,kGAAkG;IACzF,2BAA2B,CAAU;IAE9C,4EAA4E;IACnE,yBAAyB,CAAU;IAE5C,YAAY,IAAmB;QAC7B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,YAAY,CAAC;QAChE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,IAAI,KAAK,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,8BAA8B,CAAC;QAC1E,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC;QACtE,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,2BAA2B,IAAI,IAAI,CAAC;QAC5E,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC;IAC1E,CAAC;IAED,iDAAiD;IACjD,MAAM,CAAU,OAAO,GAAG,IAAI,SAAS,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAElG,8CAA8C;IAC9C,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACtE,CAAC;IAED,0EAA0E;IAC1E,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,iBAAiB,KAAK,UAAU,CAAC;IAC/C,CAAC;IAED,QAAQ;QACN,OAAO,aAAa,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC;IAC7D,CAAC;;AAgBH,uCAAuC;AACvC,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,GAAG;YACN,OAAO,QAAQ,CAAC;QAClB,KAAK,GAAG;YACN,OAAO,WAAW,CAAC;QACrB,KAAK,GAAG;YACN,OAAO,oBAAoB,CAAC;QAC9B,KAAK,GAAG;YACN,OAAO,uBAAuB,CAAC;QACjC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAkBD,8EAA8E;AAC9E,MAAM,OAAO,SAAS;IACpB,qFAAqF;IAC5E,WAAW,CAAS;IAE7B,oCAAoC;IAC3B,MAAM,CAAkB;IAEjC,oGAAoG;IAC3F,IAAI,CAAqB;IAElC,iEAAiE;IACxD,gBAAgB,CAAqB;IAE9C,sCAAsC;IAC7B,UAAU,CAAqB;IAExC,sDAAsD;IAC7C,kBAAkB,CAAqB;IAEhD,4EAA4E;IACnE,YAAY,CAAqB;IAE1C,kDAAkD;IACzC,kBAAkB,CAAqB;IAEhD,0CAA0C;IACjC,SAAS,CAAmB;IAErC,2CAA2C;IAClC,UAAU,CAAmB;IAEtC,qCAAqC;IAC5B,QAAQ,CAAmB;IAEpC,qCAAqC;IAC5B,WAAW,CAAmB;IAEvC,YAAY,IAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,CAAC;IAED,4CAA4C;IAC5C,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,oBAAoB,CAAC;IAC1E,CAAC;IAED,iHAAiH;IACjH,QAAQ;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1G,OAAO,aAAa,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,24 @@
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
+ /** Waits for `promise` and ignores its result, so that neither a value nor an error goes unhandled. */
23
+ export declare function ignoreOutcome(promise: Promise<unknown>): void;
24
+ //# 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;AAED,uGAAuG;AACvG,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAE7D"}
@@ -0,0 +1,49 @@
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
+ /** Waits for `promise` and ignores its result, so that neither a value nor an error goes unhandled. */
46
+ export function ignoreOutcome(promise) {
47
+ promise.catch(() => undefined);
48
+ }
49
+ //# 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;AAED,uGAAuG;AACvG,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,23 @@
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
+ private size;
7
+ get length(): number;
8
+ add(bytes: Uint8Array | readonly number[]): void;
9
+ addByte(byte: number): void;
10
+ takeBytes(): Uint8Array;
11
+ }
12
+ /** ISO 8859-1 bytes of `text`, which must contain no character beyond U+00FF. */
13
+ export declare function latin1Encode(text: string): Uint8Array;
14
+ /** The text of ISO 8859-1 `bytes`. */
15
+ export declare function latin1Decode(bytes: Uint8Array): 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
+ export declare function bytesEqual(a: Uint8Array, b: Uint8Array): boolean;
23
+ //# 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;IAC1C,OAAO,CAAC,IAAI,CAAK;IAEjB,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI;IAMhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,SAAS,IAAI,UAAU;CAMxB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAIrD;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAOtD;AAID,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;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAIhE"}
@@ -0,0 +1,136 @@
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
+ size = 0;
19
+ get length() {
20
+ return this.size;
21
+ }
22
+ add(bytes) {
23
+ const part = bytes instanceof Uint8Array ? bytes : Uint8Array.from(bytes);
24
+ this.parts.push(part);
25
+ this.size += part.length;
26
+ }
27
+ addByte(byte) {
28
+ this.add(Uint8Array.of(byte));
29
+ }
30
+ takeBytes() {
31
+ const result = concatBytes(this.parts);
32
+ this.parts.length = 0;
33
+ this.size = 0;
34
+ return result;
35
+ }
36
+ }
37
+ /** ISO 8859-1 bytes of `text`, which must contain no character beyond U+00FF. */
38
+ export function latin1Encode(text) {
39
+ const bytes = new Uint8Array(text.length);
40
+ for (let i = 0; i < text.length; i++)
41
+ bytes[i] = text.charCodeAt(i) & 0xff;
42
+ return bytes;
43
+ }
44
+ /** The text of ISO 8859-1 `bytes`. */
45
+ export function latin1Decode(bytes) {
46
+ let text = '';
47
+ // In chunks, since a spread of a large array exceeds the argument limit of some engines.
48
+ for (let i = 0; i < bytes.length; i += 0x8000) {
49
+ text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
50
+ }
51
+ return text;
52
+ }
53
+ const utf8Encoder = new TextEncoder();
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 new TextDecoder('utf-8', { fatal: !allowMalformed, ignoreBOM: true }).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
+ export function bytesEqual(a, b) {
129
+ if (a.length !== b.length)
130
+ return false;
131
+ for (let i = 0; i < a.length; i++)
132
+ if (a[i] !== b[i])
133
+ return false;
134
+ return true;
135
+ }
136
+ //# 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":"AAuBA;;;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,29 @@
1
+ /**
2
+ * `AsyncLocalStorage` where the runtime has it (Node.js, Deno, Bun), found without importing `node:async_hooks`, so that
3
+ * bundlers for the browser have nothing to resolve.
4
+ */
5
+ const AsyncStorageClass = (() => {
6
+ const runtime = globalThis;
7
+ try {
8
+ return runtime.process?.getBuiltinModule?.('node:async_hooks')?.AsyncLocalStorage;
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ })();
14
+ /**
15
+ * Tells which asynchronous call an operation runs in, through every `await` and callback it starts. Where the runtime
16
+ * cannot track that, as in browsers, `current` is always `undefined`.
17
+ */
18
+ export class CallContext {
19
+ storage = AsyncStorageClass ? new AsyncStorageClass() : undefined;
20
+ /** The value of the call that runs now, if the runtime can tell. */
21
+ get current() {
22
+ return this.storage?.getStore();
23
+ }
24
+ /** Runs `action` as the call `value`. */
25
+ run(value, action) {
26
+ return this.storage ? this.storage.run(value, action) : action();
27
+ }
28
+ }
29
+ //# 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;;;GAGG;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"}