@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.
- package/CHANGELOG.md +142 -1
- package/README.md +127 -37
- package/dist/client.d.ts +48 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +199 -0
- package/dist/client.js.map +1 -0
- package/dist/core/account.d.ts +35 -7
- package/dist/core/account.d.ts.map +1 -1
- package/dist/core/account.js +84 -13
- package/dist/core/account.js.map +1 -1
- package/dist/core/amount.d.ts +2 -1
- package/dist/core/amount.d.ts.map +1 -1
- package/dist/core/amount.js +4 -1
- package/dist/core/amount.js.map +1 -1
- package/dist/core/balance.d.ts +1 -0
- package/dist/core/balance.d.ts.map +1 -1
- package/dist/core/balance.js +6 -5
- package/dist/core/balance.js.map +1 -1
- package/dist/core/bank-info.d.ts +1 -1
- package/dist/core/bank-info.js +1 -1
- package/dist/core/client.d.ts +50 -15
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/config.d.ts +28 -16
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +66 -26
- package/dist/core/config.js.map +1 -1
- package/dist/core/errors.d.ts +85 -23
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +112 -47
- package/dist/core/errors.js.map +1 -1
- package/dist/core/feedback.d.ts +4 -1
- package/dist/core/feedback.d.ts.map +1 -1
- package/dist/core/feedback.js +4 -1
- package/dist/core/feedback.js.map +1 -1
- package/dist/core/transaction.d.ts +6 -1
- package/dist/core/transaction.d.ts.map +1 -1
- package/dist/core/transaction.js +9 -4
- package/dist/core/transaction.js.map +1 -1
- package/dist/core/transport.d.ts +33 -6
- package/dist/core/transport.d.ts.map +1 -1
- package/dist/core/transport.js +77 -20
- package/dist/core/transport.js.map +1 -1
- package/dist/formats/camt.d.ts +24 -4
- package/dist/formats/camt.d.ts.map +1 -1
- package/dist/formats/camt.js +124 -41
- package/dist/formats/camt.js.map +1 -1
- package/dist/formats/mt940.d.ts +15 -3
- package/dist/formats/mt940.d.ts.map +1 -1
- package/dist/formats/mt940.js +161 -82
- package/dist/formats/mt940.js.map +1 -1
- package/dist/formats/readers.d.ts +6 -2
- package/dist/formats/readers.d.ts.map +1 -1
- package/dist/formats/readers.js +24 -29
- package/dist/formats/readers.js.map +1 -1
- package/dist/formats/record-budget.d.ts +7 -0
- package/dist/formats/record-budget.d.ts.map +1 -0
- package/dist/formats/record-budget.js +17 -0
- package/dist/formats/record-budget.js.map +1 -0
- package/dist/formats/sepa-purpose.d.ts +6 -0
- package/dist/formats/sepa-purpose.d.ts.map +1 -1
- package/dist/formats/sepa-purpose.js +23 -2
- package/dist/formats/sepa-purpose.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/session/app-approval.d.ts +11 -5
- package/dist/session/app-approval.d.ts.map +1 -1
- package/dist/session/app-approval.js +23 -12
- package/dist/session/app-approval.js.map +1 -1
- package/dist/session/dialog-runner.d.ts +7 -10
- package/dist/session/dialog-runner.d.ts.map +1 -1
- package/dist/session/dialog-runner.js +15 -16
- package/dist/session/dialog-runner.js.map +1 -1
- package/dist/session/login-guard.d.ts +54 -49
- package/dist/session/login-guard.d.ts.map +1 -1
- package/dist/session/login-guard.js +156 -84
- package/dist/session/login-guard.js.map +1 -1
- package/dist/session/sepa-accounts.d.ts +20 -14
- package/dist/session/sepa-accounts.d.ts.map +1 -1
- package/dist/session/sepa-accounts.js +62 -46
- package/dist/session/sepa-accounts.js.map +1 -1
- package/dist/session/session-setup.d.ts +33 -25
- package/dist/session/session-setup.d.ts.map +1 -1
- package/dist/session/session-setup.js +87 -65
- package/dist/session/session-setup.js.map +1 -1
- package/dist/session/session-state.d.ts +9 -6
- package/dist/session/session-state.d.ts.map +1 -1
- package/dist/session/session-state.js +52 -17
- package/dist/session/session-state.js.map +1 -1
- package/dist/session/signed-dialog.d.ts +77 -0
- package/dist/session/signed-dialog.d.ts.map +1 -0
- package/dist/session/signed-dialog.js +170 -0
- package/dist/session/signed-dialog.js.map +1 -0
- package/dist/session/tan-selection.d.ts +26 -18
- package/dist/session/tan-selection.d.ts.map +1 -1
- package/dist/session/tan-selection.js +44 -33
- package/dist/session/tan-selection.js.map +1 -1
- package/dist/session/user-prompts.d.ts +8 -4
- package/dist/session/user-prompts.d.ts.map +1 -1
- package/dist/session/user-prompts.js +34 -14
- package/dist/session/user-prompts.js.map +1 -1
- package/dist/tan/challenge.d.ts +34 -13
- package/dist/tan/challenge.d.ts.map +1 -1
- package/dist/tan/challenge.js +25 -26
- package/dist/tan/challenge.js.map +1 -1
- package/dist/tan/flicker.d.ts +7 -1
- package/dist/tan/flicker.d.ts.map +1 -1
- package/dist/tan/flicker.js +40 -6
- package/dist/tan/flicker.js.map +1 -1
- package/dist/tan/tan-image.d.ts +3 -2
- package/dist/tan/tan-image.d.ts.map +1 -1
- package/dist/tan/tan-image.js +7 -5
- package/dist/tan/tan-image.js.map +1 -1
- package/dist/tan/tan-models.d.ts +5 -1
- package/dist/tan/tan-models.d.ts.map +1 -1
- package/dist/tan/tan-models.js +10 -5
- package/dist/tan/tan-models.js.map +1 -1
- package/dist/util/async.d.ts +0 -2
- package/dist/util/async.d.ts.map +1 -1
- package/dist/util/async.js +0 -4
- package/dist/util/async.js.map +1 -1
- package/dist/util/bytes.d.ts +2 -3
- package/dist/util/bytes.d.ts.map +1 -1
- package/dist/util/bytes.js +12 -20
- package/dist/util/bytes.js.map +1 -1
- package/dist/util/call-context.d.ts.map +1 -1
- package/dist/util/call-context.js +3 -2
- package/dist/util/call-context.js.map +1 -1
- package/dist/util/dates.d.ts +9 -16
- package/dist/util/dates.d.ts.map +1 -1
- package/dist/util/dates.js +39 -19
- package/dist/util/dates.js.map +1 -1
- package/dist/util/errors.d.ts +9 -1
- package/dist/util/errors.d.ts.map +1 -1
- package/dist/util/errors.js +12 -3
- package/dist/util/errors.js.map +1 -1
- package/dist/util/json.d.ts +4 -0
- package/dist/util/json.d.ts.map +1 -1
- package/dist/util/json.js +18 -0
- package/dist/util/json.js.map +1 -1
- package/dist/util/text.d.ts +21 -4
- package/dist/util/text.d.ts.map +1 -1
- package/dist/util/text.js +42 -13
- package/dist/util/text.js.map +1 -1
- package/dist/util/xml.d.ts +4 -3
- package/dist/util/xml.d.ts.map +1 -1
- package/dist/util/xml.js +37 -26
- package/dist/util/xml.js.map +1 -1
- package/dist/v3/account-extension.d.ts.map +1 -1
- package/dist/v3/account-extension.js +7 -10
- package/dist/v3/account-extension.js.map +1 -1
- package/dist/v3/bank-connection.d.ts +34 -0
- package/dist/v3/bank-connection.d.ts.map +1 -0
- package/dist/v3/bank-connection.js +58 -0
- package/dist/v3/bank-connection.js.map +1 -0
- package/dist/v3/dialog.d.ts +80 -46
- package/dist/v3/dialog.d.ts.map +1 -1
- package/dist/v3/dialog.js +162 -59
- package/dist/v3/dialog.js.map +1 -1
- package/dist/v3/message.d.ts +17 -4
- package/dist/v3/message.d.ts.map +1 -1
- package/dist/v3/message.js +62 -18
- package/dist/v3/message.js.map +1 -1
- package/dist/v3/parameter-store.d.ts +75 -0
- package/dist/v3/parameter-store.d.ts.map +1 -0
- package/dist/v3/parameter-store.js +143 -0
- package/dist/v3/parameter-store.js.map +1 -0
- package/dist/v3/parameters.d.ts +38 -12
- package/dist/v3/parameters.d.ts.map +1 -1
- package/dist/v3/parameters.js +91 -37
- package/dist/v3/parameters.js.map +1 -1
- package/dist/v3/protocol.d.ts +43 -50
- package/dist/v3/protocol.d.ts.map +1 -1
- package/dist/v3/protocol.js +58 -208
- package/dist/v3/protocol.js.map +1 -1
- package/dist/v3/queries.d.ts +51 -0
- package/dist/v3/queries.d.ts.map +1 -0
- package/dist/v3/queries.js +120 -0
- package/dist/v3/queries.js.map +1 -0
- package/dist/v3/segments.d.ts +29 -12
- package/dist/v3/segments.d.ts.map +1 -1
- package/dist/v3/segments.js +65 -23
- package/dist/v3/segments.js.map +1 -1
- package/dist/v3/syntax.d.ts +65 -14
- package/dist/v3/syntax.d.ts.map +1 -1
- package/dist/v3/syntax.js +167 -101
- package/dist/v3/syntax.js.map +1 -1
- package/package.json +10 -6
- package/src/client.ts +252 -0
- package/src/core/account.ts +86 -13
- package/src/core/amount.ts +3 -1
- package/src/core/balance.ts +6 -5
- package/src/core/bank-info.ts +1 -1
- package/src/core/client.ts +52 -15
- package/src/core/config.ts +69 -28
- package/src/core/errors.ts +122 -48
- package/src/core/feedback.ts +4 -1
- package/src/core/transaction.ts +9 -4
- package/src/core/transport.ts +98 -23
- package/src/formats/camt.ts +136 -39
- package/src/formats/mt940.ts +167 -81
- package/src/formats/readers.ts +24 -31
- package/src/formats/record-budget.ts +18 -0
- package/src/formats/sepa-purpose.ts +21 -2
- package/src/index.ts +4 -2
- package/src/session/app-approval.ts +51 -38
- package/src/session/dialog-runner.ts +31 -28
- package/src/session/login-guard.ts +174 -88
- package/src/session/sepa-accounts.ts +63 -45
- package/src/session/session-setup.ts +90 -71
- package/src/session/session-state.ts +56 -22
- package/src/session/signed-dialog.ts +192 -0
- package/src/session/tan-selection.ts +50 -39
- package/src/session/user-prompts.ts +35 -16
- package/src/tan/challenge.ts +40 -31
- package/src/tan/flicker.ts +44 -6
- package/src/tan/tan-image.ts +7 -5
- package/src/tan/tan-models.ts +10 -5
- package/src/util/async.ts +0 -5
- package/src/util/bytes.ts +13 -19
- package/src/util/call-context.ts +3 -2
- package/src/util/dates.ts +41 -24
- package/src/util/errors.ts +14 -3
- package/src/util/json.ts +16 -0
- package/src/util/text.ts +42 -12
- package/src/util/xml.ts +37 -26
- package/src/v3/account-extension.ts +7 -12
- package/src/v3/bank-connection.ts +67 -0
- package/src/v3/dialog.ts +175 -91
- package/src/v3/message.ts +69 -17
- package/src/v3/parameter-store.ts +160 -0
- package/src/v3/parameters.ts +110 -37
- package/src/v3/protocol.ts +70 -253
- package/src/v3/queries.ts +190 -0
- package/src/v3/segments.ts +65 -22
- package/src/v3/syntax.ts +153 -91
- package/dist/session/bank-connection.d.ts +0 -28
- package/dist/session/bank-connection.d.ts.map +0 -1
- package/dist/session/bank-connection.js +0 -48
- package/dist/session/bank-connection.js.map +0 -1
- package/dist/session/parameter-data.d.ts +0 -83
- package/dist/session/parameter-data.d.ts.map +0 -1
- package/dist/session/parameter-data.js +0 -68
- package/dist/session/parameter-data.js.map +0 -1
- package/dist/session/pin-tan-client.d.ts +0 -54
- package/dist/session/pin-tan-client.d.ts.map +0 -1
- package/dist/session/pin-tan-client.js +0 -153
- package/dist/session/pin-tan-client.js.map +0 -1
- package/dist/session/pin-tan-dialog.d.ts +0 -71
- package/dist/session/pin-tan-dialog.d.ts.map +0 -1
- package/dist/session/pin-tan-dialog.js +0 -124
- package/dist/session/pin-tan-dialog.js.map +0 -1
- package/dist/session/protocol.d.ts +0 -209
- package/dist/session/protocol.d.ts.map +0 -1
- package/dist/session/protocol.js +0 -75
- package/dist/session/protocol.js.map +0 -1
- package/dist/session/response-handler.d.ts +0 -48
- package/dist/session/response-handler.d.ts.map +0 -1
- package/dist/session/response-handler.js +0 -121
- package/dist/session/response-handler.js.map +0 -1
- package/dist/v3/client.d.ts +0 -24
- package/dist/v3/client.d.ts.map +0 -1
- package/dist/v3/client.js +0 -16
- package/dist/v3/client.js.map +0 -1
- package/src/session/bank-connection.ts +0 -51
- package/src/session/parameter-data.ts +0 -137
- package/src/session/pin-tan-client.ts +0 -186
- package/src/session/pin-tan-dialog.ts +0 -160
- package/src/session/protocol.ts +0 -311
- package/src/session/response-handler.ts +0 -130
- package/src/v3/client.ts +0 -29
package/dist/util/json.js
CHANGED
|
@@ -21,6 +21,15 @@ export function readOptionalInt(json, key) {
|
|
|
21
21
|
}
|
|
22
22
|
return value;
|
|
23
23
|
}
|
|
24
|
+
/** The optional boolean at `key`; throws `FormatError` for a value of another type. */
|
|
25
|
+
export function readOptionalBoolean(json, key) {
|
|
26
|
+
const value = json[key];
|
|
27
|
+
if (value === undefined || value === null)
|
|
28
|
+
return undefined;
|
|
29
|
+
if (typeof value !== 'boolean')
|
|
30
|
+
throw new FormatError(`Saved state: "${key}" is not a boolean`);
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
24
33
|
/** The object at `key`; throws `FormatError` if it is missing or not an object. */
|
|
25
34
|
export function readObject(json, key) {
|
|
26
35
|
const value = json[key];
|
|
@@ -28,6 +37,15 @@ export function readObject(json, key) {
|
|
|
28
37
|
throw new FormatError(`Saved state: "${key}" is not an object`);
|
|
29
38
|
return value;
|
|
30
39
|
}
|
|
40
|
+
/** The optional object at `key`; throws `FormatError` for a value of another type. */
|
|
41
|
+
export function readOptionalObject(json, key) {
|
|
42
|
+
const value = json[key];
|
|
43
|
+
if (value === undefined || value === null)
|
|
44
|
+
return undefined;
|
|
45
|
+
if (!isJsonObject(value))
|
|
46
|
+
throw new FormatError(`Saved state: "${key}" is not an object`);
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
31
49
|
/** The optional list at `key`, each element checked by `isElement`; throws `FormatError` for anything else. */
|
|
32
50
|
export function readOptionalList(json, key, isElement) {
|
|
33
51
|
const value = json[key];
|
package/dist/util/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/util/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAAC,IAAgB,EAAE,GAAW;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,CAAC;IAC9F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,GAAW;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,gBAAgB,CAC9B,IAAgB,EAChB,GAAW,EACX,SAAyC;IAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,WAAW,CAAC,iBAAiB,GAAG,wCAAwC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC"}
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/util/json.ts"],"names":[],"mappings":"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"}
|
package/dist/util/text.d.ts
CHANGED
|
@@ -1,20 +1,37 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Decodes text from the bank, which may be UTF-8 (with or without BOM) or ISO 8859-1; ASCII reads the same in both.
|
|
3
|
+
*
|
|
4
|
+
* UTF-8 comes first, since some banks send it. ISO 8859-1 text that happens to be valid UTF-8, such as `ß°`, reads as
|
|
5
|
+
* UTF-8 then: a rare misreading of text shown, as values sent back to the bank are read byte for byte
|
|
6
|
+
* (`Segment.verbatim`).
|
|
7
|
+
*/
|
|
2
8
|
export declare function decodeBankText(bytes: Uint8Array): string;
|
|
3
9
|
/** Decodes an XML document, honouring an ISO 8859-1 or Windows-1252 encoding declaration. */
|
|
4
10
|
export declare function decodeXmlText(bytes: Uint8Array): string;
|
|
5
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* Decodes Windows-1252, which matches ISO 8859-1 except for `€`, typographic quotes and a few letters.
|
|
13
|
+
*
|
|
14
|
+
* @internal Exported for the tests.
|
|
15
|
+
*/
|
|
6
16
|
export declare function decodeWindows1252(bytes: Uint8Array): string;
|
|
7
17
|
/**
|
|
8
18
|
* The last four characters of `id`, such as an IBAN or a card number, after an ellipsis: enough to tell two apart, too
|
|
9
19
|
* little to identify one in a log.
|
|
10
20
|
*/
|
|
11
21
|
export declare function maskedId(id: string): string;
|
|
22
|
+
/** Whether `value` fits into ISO 8859-1, the FinTS 3.0 character set. */
|
|
23
|
+
export declare function isLatin1(value: string): boolean;
|
|
24
|
+
/** `text` without blanks around it; `undefined` if that leaves nothing. */
|
|
25
|
+
export declare function nonBlank(text: string | undefined): string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* The character the numeric character reference `name` names, such as `#x41` or `#65`; `undefined` for any other name,
|
|
28
|
+
* and for a number that is no character as XML defines them: `NUL`, half a surrogate pair, or beyond Unicode.
|
|
29
|
+
*/
|
|
30
|
+
export declare function characterReference(name: string): string | undefined;
|
|
12
31
|
/** `text` without spaces and line breaks. */
|
|
13
32
|
export declare function withoutWhitespace(text: string): string;
|
|
14
33
|
/** Decodes base64 that may be broken into lines; throws `FormatError` if it is invalid. */
|
|
15
34
|
export declare function decodeBase64Lines(text: string): Uint8Array;
|
|
16
|
-
/** `text` with every match of `pattern`, a literal string, escaped for use in a regular expression. */
|
|
17
|
-
export declare function escapeRegExp(text: string): string;
|
|
18
35
|
/** The integer `text` states, decimal digits with an optional sign and blanks around; `undefined` for anything else. */
|
|
19
36
|
export declare function tryParseInt(text: string | undefined): number | undefined;
|
|
20
37
|
//# sourceMappingURL=text.d.ts.map
|
package/dist/util/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"AAMA
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CASxD;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAcvD;AAYD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAO3D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKnE;AAED,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE1D;AAED,wHAAwH;AACxH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIxE"}
|
package/dist/util/text.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { base64Decode, latin1Decode, utf8Decode } from './bytes.js';
|
|
1
|
+
import { base64Decode, fromCharCodes, latin1Decode, utf8Decode } from './bytes.js';
|
|
2
2
|
import { FormatError } from './errors.js';
|
|
3
3
|
const xmlEncodingDeclaration = /encoding\s*=\s*["']([A-Za-z0-9._-]+)["']/;
|
|
4
4
|
const whitespace = /\s/g;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Decodes text from the bank, which may be UTF-8 (with or without BOM) or ISO 8859-1; ASCII reads the same in both.
|
|
7
|
+
*
|
|
8
|
+
* UTF-8 comes first, since some banks send it. ISO 8859-1 text that happens to be valid UTF-8, such as `ß°`, reads as
|
|
9
|
+
* UTF-8 then: a rare misreading of text shown, as values sent back to the bank are read byte for byte
|
|
10
|
+
* (`Segment.verbatim`).
|
|
11
|
+
*/
|
|
6
12
|
export function decodeBankText(bytes) {
|
|
7
13
|
const hasBom = bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf;
|
|
8
14
|
const content = hasBom ? bytes.subarray(3) : bytes;
|
|
9
|
-
if (content.every((b) => b < 0x80))
|
|
10
|
-
return latin1Decode(content);
|
|
11
15
|
try {
|
|
12
16
|
return utf8Decode(content);
|
|
13
17
|
}
|
|
@@ -42,12 +46,18 @@ const windows1252High = [
|
|
|
42
46
|
0x017d, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a,
|
|
43
47
|
0x0153, 0x009d, 0x017e, 0x0178,
|
|
44
48
|
];
|
|
45
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Decodes Windows-1252, which matches ISO 8859-1 except for `€`, typographic quotes and a few letters.
|
|
51
|
+
*
|
|
52
|
+
* @internal Exported for the tests.
|
|
53
|
+
*/
|
|
46
54
|
export function decodeWindows1252(bytes) {
|
|
47
|
-
|
|
48
|
-
for (
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
const codes = new Uint16Array(bytes.length);
|
|
56
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
57
|
+
const b = bytes[i];
|
|
58
|
+
codes[i] = b >= 0x80 && b < 0xa0 ? windows1252High[b - 0x80] : b;
|
|
59
|
+
}
|
|
60
|
+
return fromCharCodes(codes);
|
|
51
61
|
}
|
|
52
62
|
/**
|
|
53
63
|
* The last four characters of `id`, such as an IBAN or a card number, after an ellipsis: enough to tell two apart, too
|
|
@@ -56,6 +66,29 @@ export function decodeWindows1252(bytes) {
|
|
|
56
66
|
export function maskedId(id) {
|
|
57
67
|
return id.length <= 4 ? '…' : `…${id.substring(id.length - 4)}`;
|
|
58
68
|
}
|
|
69
|
+
/** Whether `value` fits into ISO 8859-1, the FinTS 3.0 character set. */
|
|
70
|
+
export function isLatin1(value) {
|
|
71
|
+
for (let i = 0; i < value.length; i++)
|
|
72
|
+
if (value.charCodeAt(i) > 0xff)
|
|
73
|
+
return false;
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
/** `text` without blanks around it; `undefined` if that leaves nothing. */
|
|
77
|
+
export function nonBlank(text) {
|
|
78
|
+
const trimmed = text?.trim();
|
|
79
|
+
return trimmed === '' ? undefined : trimmed;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The character the numeric character reference `name` names, such as `#x41` or `#65`; `undefined` for any other name,
|
|
83
|
+
* and for a number that is no character as XML defines them: `NUL`, half a surrogate pair, or beyond Unicode.
|
|
84
|
+
*/
|
|
85
|
+
export function characterReference(name) {
|
|
86
|
+
const m = /^#(?:x([0-9a-fA-F]+)|([0-9]+))$/.exec(name);
|
|
87
|
+
if (!m)
|
|
88
|
+
return undefined;
|
|
89
|
+
const code = m[1] === undefined ? parseInt(m[2], 10) : parseInt(m[1], 16);
|
|
90
|
+
return code > 0 && (code < 0xd800 || code > 0xdfff) && code <= 0x10ffff ? String.fromCodePoint(code) : undefined;
|
|
91
|
+
}
|
|
59
92
|
/** `text` without spaces and line breaks. */
|
|
60
93
|
export function withoutWhitespace(text) {
|
|
61
94
|
return text.replace(whitespace, '');
|
|
@@ -64,10 +97,6 @@ export function withoutWhitespace(text) {
|
|
|
64
97
|
export function decodeBase64Lines(text) {
|
|
65
98
|
return base64Decode(withoutWhitespace(text));
|
|
66
99
|
}
|
|
67
|
-
/** `text` with every match of `pattern`, a literal string, escaped for use in a regular expression. */
|
|
68
|
-
export function escapeRegExp(text) {
|
|
69
|
-
return text.replace(/[.*+?^${}()|[\]\\/-]/g, '\\$&');
|
|
70
|
-
}
|
|
71
100
|
/** The integer `text` states, decimal digits with an optional sign and blanks around; `undefined` for anything else. */
|
|
72
101
|
export function tryParseInt(text) {
|
|
73
102
|
if (text === undefined)
|
package/dist/util/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/util/text.ts"],"names":[],"mappings":"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"}
|
package/dist/util/xml.d.ts
CHANGED
|
@@ -23,11 +23,12 @@ export declare class XmlElement {
|
|
|
23
23
|
at(path: readonly string[]): XmlElement | undefined;
|
|
24
24
|
/** The trimmed text of the element at `path`, or `undefined` if it is missing or empty. */
|
|
25
25
|
textAt(path: readonly string[]): string | undefined;
|
|
26
|
-
/**
|
|
27
|
-
|
|
26
|
+
/** The child elements called `localName`, in document order. */
|
|
27
|
+
childrenNamed(localName: string): XmlElement[];
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed
|
|
30
|
+
* Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed, nests elements
|
|
31
|
+
* deeper than 256 levels or holds more than a million elements and attributes.
|
|
31
32
|
*
|
|
32
33
|
* A document type declaration is refused: bank data have none, and its entities could expand without limit.
|
|
33
34
|
*/
|
package/dist/util/xml.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,UAAU;IAInB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,4FAA4F;IAC5F,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IANlD,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAM;;IAG9C,yCAAyC;IAChC,SAAS,EAAE,MAAM;IAC1B,4FAA4F;IACnF,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAGlD,IAAI,aAAa,IAAI,UAAU,EAAE,CAEhC;IAED,iDAAiD;IACjD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,kDAAkD;IAClD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIhD,iGAAiG;IACjG,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,SAAS;IAInD,2FAA2F;IAC3F,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS;IAInD,gEAAgE;IAChE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;CAG/C;AAiDD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CA8EhD"}
|
package/dist/util/xml.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FormatError } from './errors.js';
|
|
2
|
+
import { characterReference, nonBlank } from './text.js';
|
|
2
3
|
/**
|
|
3
4
|
* An element of a parsed XML document, looked up by local name: camt documents come with and without namespace
|
|
4
5
|
* prefixes.
|
|
@@ -27,7 +28,7 @@ export class XmlElement {
|
|
|
27
28
|
}
|
|
28
29
|
/** The first child element called `localName`. */
|
|
29
30
|
child(localName) {
|
|
30
|
-
return this.
|
|
31
|
+
return this.children.find((c) => c instanceof XmlElement && c.localName === localName);
|
|
31
32
|
}
|
|
32
33
|
/** The element reached by following child names along `path`; this element for an empty path. */
|
|
33
34
|
at(path) {
|
|
@@ -35,21 +36,11 @@ export class XmlElement {
|
|
|
35
36
|
}
|
|
36
37
|
/** The trimmed text of the element at `path`, or `undefined` if it is missing or empty. */
|
|
37
38
|
textAt(path) {
|
|
38
|
-
|
|
39
|
-
return text === undefined || text === '' ? undefined : text;
|
|
39
|
+
return nonBlank(this.at(path)?.innerText);
|
|
40
40
|
}
|
|
41
|
-
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const visit = (element) => {
|
|
45
|
-
for (const c of element.childElements) {
|
|
46
|
-
if (c.localName === localName)
|
|
47
|
-
found.push(c);
|
|
48
|
-
visit(c);
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
visit(this);
|
|
52
|
-
return found;
|
|
41
|
+
/** The child elements called `localName`, in document order. */
|
|
42
|
+
childrenNamed(localName) {
|
|
43
|
+
return this.children.filter((c) => c instanceof XmlElement && c.localName === localName);
|
|
53
44
|
}
|
|
54
45
|
}
|
|
55
46
|
const namePattern = /[^\s<>/=!?"']+/y;
|
|
@@ -59,7 +50,21 @@ function matchAt(pattern, text, position) {
|
|
|
59
50
|
pattern.lastIndex = position;
|
|
60
51
|
return pattern.exec(text);
|
|
61
52
|
}
|
|
62
|
-
const predefinedEntities =
|
|
53
|
+
const predefinedEntities = new Map([
|
|
54
|
+
['amp', '&'],
|
|
55
|
+
['lt', '<'],
|
|
56
|
+
['gt', '>'],
|
|
57
|
+
['quot', '"'],
|
|
58
|
+
['apos', "'"],
|
|
59
|
+
]);
|
|
60
|
+
/** Deepest nesting of elements the parser takes: camt needs fewer than 20 levels, and `innerText` recurses. */
|
|
61
|
+
const maxDepth = 256;
|
|
62
|
+
/**
|
|
63
|
+
* Most elements and attributes one document may hold. Real camt spends about 20 bytes on each, so the largest answer a
|
|
64
|
+
* bank can send holds fewer than 600,000, while a hostile document stays within about 150 MB of memory.
|
|
65
|
+
*/
|
|
66
|
+
const maxNodes = 1_000_000;
|
|
67
|
+
const noAttributes = new Map();
|
|
63
68
|
function localNameOf(qualified) {
|
|
64
69
|
const colon = qualified.indexOf(':');
|
|
65
70
|
return colon < 0 ? qualified : qualified.substring(colon + 1);
|
|
@@ -70,22 +75,20 @@ function decodeEntities(text) {
|
|
|
70
75
|
if (!match.endsWith(';'))
|
|
71
76
|
throw new FormatError('Invalid XML: unterminated entity reference');
|
|
72
77
|
if (name.startsWith('#')) {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
const code = (hex ? /^[0-9a-fA-F]+$/ : /^\d+$/).test(digits) ? parseInt(digits, hex ? 16 : 10) : NaN;
|
|
76
|
-
if (!(code > 0 && code <= 0x10ffff && (code < 0xd800 || code > 0xdfff))) {
|
|
78
|
+
const character = characterReference(name);
|
|
79
|
+
if (character === undefined)
|
|
77
80
|
throw new FormatError('Invalid XML character reference', match);
|
|
78
|
-
|
|
79
|
-
return String.fromCodePoint(code);
|
|
81
|
+
return character;
|
|
80
82
|
}
|
|
81
|
-
const value = predefinedEntities
|
|
83
|
+
const value = predefinedEntities.get(name);
|
|
82
84
|
if (value === undefined)
|
|
83
85
|
throw new FormatError('Invalid XML: unknown entity', match);
|
|
84
86
|
return value;
|
|
85
87
|
});
|
|
86
88
|
}
|
|
87
89
|
/**
|
|
88
|
-
* Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed
|
|
90
|
+
* Parses an XML document and returns its root element; throws `FormatError` if it is not well-formed, nests elements
|
|
91
|
+
* deeper than 256 levels or holds more than a million elements and attributes.
|
|
89
92
|
*
|
|
90
93
|
* A document type declaration is refused: bank data have none, and its entities could expand without limit.
|
|
91
94
|
*/
|
|
@@ -93,6 +96,7 @@ export function parseXml(xml) {
|
|
|
93
96
|
let position = 0;
|
|
94
97
|
const stack = [];
|
|
95
98
|
let root;
|
|
99
|
+
let nodes = 0;
|
|
96
100
|
const fail = (reason) => {
|
|
97
101
|
throw new FormatError(`Invalid XML: ${reason} at position ${position}`);
|
|
98
102
|
};
|
|
@@ -144,17 +148,24 @@ export function parseXml(xml) {
|
|
|
144
148
|
fail(`unexpected end tag ${name}`);
|
|
145
149
|
}
|
|
146
150
|
else {
|
|
151
|
+
if (stack.length >= maxDepth)
|
|
152
|
+
fail(`elements nested deeper than ${maxDepth} levels`);
|
|
153
|
+
if (++nodes > maxNodes)
|
|
154
|
+
fail(`more than ${maxNodes} elements and attributes`);
|
|
147
155
|
position++;
|
|
148
156
|
const name = matchAt(namePattern, xml, position)?.[0] ?? fail('missing element name');
|
|
149
157
|
position += name.length;
|
|
150
|
-
|
|
158
|
+
let attributes;
|
|
151
159
|
for (;;) {
|
|
152
160
|
const attribute = matchAt(attributePattern, xml, position);
|
|
153
161
|
if (!attribute)
|
|
154
162
|
break;
|
|
155
163
|
position += attribute[0].length;
|
|
164
|
+
if (++nodes > maxNodes)
|
|
165
|
+
fail(`more than ${maxNodes} elements and attributes`);
|
|
156
166
|
const attributeName = attribute[1];
|
|
157
167
|
if (attributeName !== 'xmlns' && !attributeName.startsWith('xmlns:')) {
|
|
168
|
+
attributes ??= new Map();
|
|
158
169
|
attributes.set(localNameOf(attributeName), decodeEntities(attribute[2] ?? attribute[3] ?? ''));
|
|
159
170
|
}
|
|
160
171
|
}
|
|
@@ -164,7 +175,7 @@ export function parseXml(xml) {
|
|
|
164
175
|
if (!selfClosing && xml.charAt(position) !== '>')
|
|
165
176
|
fail(`malformed start tag ${name}`);
|
|
166
177
|
position += selfClosing ? 2 : 1;
|
|
167
|
-
const element = new XmlElement(localNameOf(name), attributes);
|
|
178
|
+
const element = new XmlElement(localNameOf(name), attributes ?? noAttributes);
|
|
168
179
|
const parent = stack.at(-1);
|
|
169
180
|
if (parent)
|
|
170
181
|
parent.children.push(element);
|
package/dist/util/xml.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/util/xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-extension.d.ts","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"account-extension.d.ts","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAyB7C;;;GAGG;AACH,qBAAa,gBAAgB;IAEzB,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAChC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,eAAe;IAPlC,OAAO;IAUP;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAU3D,OAAO,CAAC,MAAM,CAAC,IAAI;IAgBnB,6GAA6G;IAC7G,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;CAkBvD"}
|
|
@@ -3,7 +3,9 @@ import { AccountDataStatus } from '../core/account.js';
|
|
|
3
3
|
import { Amount, withMark } from '../core/amount.js';
|
|
4
4
|
import { Balance } from '../core/balance.js';
|
|
5
5
|
import { parseFintsDate, parseUtcPlusOneDateTime } from '../util/dates.js';
|
|
6
|
-
import { FormatError } from '../util/errors.js';
|
|
6
|
+
import { fail, FormatError } from '../util/errors.js';
|
|
7
|
+
import { isJsonObject } from '../util/json.js';
|
|
8
|
+
import { nonBlank } from '../util/text.js';
|
|
7
9
|
/**
|
|
8
10
|
* The account extension of the user parameter data (HIUPD "Erweiterung, kontobezogen", Formals E.3.1): JSON with the
|
|
9
11
|
* BIC, the balance, and what the bank tells about the data it holds for the account.
|
|
@@ -32,7 +34,7 @@ export class AccountExtension {
|
|
|
32
34
|
static tryParse(json) {
|
|
33
35
|
try {
|
|
34
36
|
const decoded = JSON.parse(json);
|
|
35
|
-
return
|
|
37
|
+
return isJsonObject(decoded) ? AccountExtension.read(new Json(decoded)) : undefined;
|
|
36
38
|
}
|
|
37
39
|
catch (error) {
|
|
38
40
|
if (error instanceof FormatError || error instanceof SyntaxError)
|
|
@@ -57,6 +59,7 @@ export class AccountExtension {
|
|
|
57
59
|
return undefined;
|
|
58
60
|
return new Balance({
|
|
59
61
|
account,
|
|
62
|
+
productName: account.productName,
|
|
60
63
|
booked: b.booked.amount,
|
|
61
64
|
bookedAsOf: b.booked.date,
|
|
62
65
|
bookedAsOfTime: b.booked.time,
|
|
@@ -109,12 +112,6 @@ function moment(json, defaultTime) {
|
|
|
109
112
|
return undefined;
|
|
110
113
|
return parseUtcPlusOneDateTime(json.string('Date'), time) ?? fail('Extension date or time is malformed');
|
|
111
114
|
}
|
|
112
|
-
function fail(message) {
|
|
113
|
-
throw new FormatError(message);
|
|
114
|
-
}
|
|
115
|
-
function isObject(value) {
|
|
116
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
117
|
-
}
|
|
118
115
|
/**
|
|
119
116
|
* A JSON object of the extension, read by key without regard to case: the specification itself spells some keys
|
|
120
117
|
* differently (`OverDraftLim` and `OverdraftLim`). Values of the wrong type are a `FormatError`.
|
|
@@ -134,7 +131,7 @@ class Json {
|
|
|
134
131
|
if (value === undefined || value === null)
|
|
135
132
|
return undefined;
|
|
136
133
|
if (typeof value === 'string')
|
|
137
|
-
return
|
|
134
|
+
return nonBlank(value);
|
|
138
135
|
if (typeof value === 'number')
|
|
139
136
|
return String(value);
|
|
140
137
|
throw new FormatError(`Extension element "${key}" is not text`);
|
|
@@ -153,7 +150,7 @@ class Json {
|
|
|
153
150
|
const value = this.value(key);
|
|
154
151
|
if (value === undefined || value === null)
|
|
155
152
|
return undefined;
|
|
156
|
-
if (
|
|
153
|
+
if (isJsonObject(value))
|
|
157
154
|
return new Json(value);
|
|
158
155
|
throw new FormatError(`Extension element "${key}" is not an object`);
|
|
159
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-extension.js","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"AAAA,uHAAuH;AAEvH,OAAO,EAAE,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"account-extension.js","sourceRoot":"","sources":["../../src/v3/account-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { MessageDirection, MessageLogger } from '../core/client.js';
|
|
2
|
+
import { type FinTsTransport } from '../core/transport.js';
|
|
3
|
+
/**
|
|
4
|
+
* Throws `FinTsProtocolError` if a message of `size` bytes exceeds the bank's `limit` in kilobytes (1024 bytes): the
|
|
5
|
+
* specification does not allow to send such a message.
|
|
6
|
+
*/
|
|
7
|
+
export declare function checkMessageSize(size: number, limit: number | undefined): void;
|
|
8
|
+
/** The bank's FinTS endpoint: posts messages there and reports them to the logger. */
|
|
9
|
+
export declare class BankConnection {
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly transport;
|
|
12
|
+
/** Where the messages go, as `FinTsConfig` checked it. */
|
|
13
|
+
private readonly href;
|
|
14
|
+
/** Aborts the requests on their way (`abortRequests`). */
|
|
15
|
+
private requests;
|
|
16
|
+
/** A connection to `url` through `transport`, an `HttpTransport` by default. */
|
|
17
|
+
constructor(url: URL, transport: FinTsTransport | undefined, logger: MessageLogger | undefined);
|
|
18
|
+
/**
|
|
19
|
+
* Posts `body` to a new copy of the URL, so that a transport that changes the one it is given changes no later
|
|
20
|
+
* request.
|
|
21
|
+
*
|
|
22
|
+
* Reports any failure of the transport as `FinTsTransportError`: a custom transport that calls `fetch` fails with a
|
|
23
|
+
* `TypeError` where the network does, and one that throws another `FinTsError`, such as `FinTsPinError`, would pass
|
|
24
|
+
* for an answer of the bank. Of such an error only the message is kept (`failureMessage`), since it may hold `body`,
|
|
25
|
+
* as the errors of HTTP clients such as axios do.
|
|
26
|
+
*/
|
|
27
|
+
post(body: Uint8Array, contentType: string): Promise<Uint8Array>;
|
|
28
|
+
/** Reports a message to the logger; `message` is only built when a logger is set. */
|
|
29
|
+
log(direction: MessageDirection, message: () => string): void;
|
|
30
|
+
/** Aborts the requests on their way; those posted afterwards, such as the dialog ends of a closing client, go out. */
|
|
31
|
+
abortRequests(): void;
|
|
32
|
+
close(): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=bank-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bank-connection.d.ts","sourceRoot":"","sources":["../../src/v3/bank-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE1F;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAI9E;AAED,sFAAsF;AACtF,qBAAa,cAAc;IAavB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAE3C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAyB;IAEzC,gFAAgF;gBAE9E,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,cAAc,GAAG,SAAS,EACpB,MAAM,EAAE,aAAa,GAAG,SAAS;IAMpD;;;;;;;;OAQG;IACG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAStE,qFAAqF;IACrF,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,MAAM,GAAG,IAAI;IAI7D,sHAAsH;IACtH,aAAa,IAAI,IAAI;IAKrB,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { FinTsProtocolError, FinTsTransportError } from '../core/errors.js';
|
|
2
|
+
import { failureMessage, HttpTransport } from '../core/transport.js';
|
|
3
|
+
/**
|
|
4
|
+
* Throws `FinTsProtocolError` if a message of `size` bytes exceeds the bank's `limit` in kilobytes (1024 bytes): the
|
|
5
|
+
* specification does not allow to send such a message.
|
|
6
|
+
*/
|
|
7
|
+
export function checkMessageSize(size, limit) {
|
|
8
|
+
if (limit !== undefined && limit > 0 && size > limit * 1024) {
|
|
9
|
+
throw new FinTsProtocolError(`A message of ${size} bytes exceeds the bank's maximum message size of ${limit} KB`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** The bank's FinTS endpoint: posts messages there and reports them to the logger. */
|
|
13
|
+
export class BankConnection {
|
|
14
|
+
logger;
|
|
15
|
+
transport;
|
|
16
|
+
/** Where the messages go, as `FinTsConfig` checked it. */
|
|
17
|
+
href;
|
|
18
|
+
/** Aborts the requests on their way (`abortRequests`). */
|
|
19
|
+
requests = new AbortController();
|
|
20
|
+
/** A connection to `url` through `transport`, an `HttpTransport` by default. */
|
|
21
|
+
constructor(url, transport, logger) {
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
this.href = url.href;
|
|
24
|
+
this.transport = transport ?? new HttpTransport();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Posts `body` to a new copy of the URL, so that a transport that changes the one it is given changes no later
|
|
28
|
+
* request.
|
|
29
|
+
*
|
|
30
|
+
* Reports any failure of the transport as `FinTsTransportError`: a custom transport that calls `fetch` fails with a
|
|
31
|
+
* `TypeError` where the network does, and one that throws another `FinTsError`, such as `FinTsPinError`, would pass
|
|
32
|
+
* for an answer of the bank. Of such an error only the message is kept (`failureMessage`), since it may hold `body`,
|
|
33
|
+
* as the errors of HTTP clients such as axios do.
|
|
34
|
+
*/
|
|
35
|
+
async post(body, contentType) {
|
|
36
|
+
try {
|
|
37
|
+
return await this.transport.post(new URL(this.href), body, contentType, this.requests.signal);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof FinTsTransportError)
|
|
41
|
+
throw error;
|
|
42
|
+
throw new FinTsTransportError(failureMessage(error));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Reports a message to the logger; `message` is only built when a logger is set. */
|
|
46
|
+
log(direction, message) {
|
|
47
|
+
this.logger?.(direction, message());
|
|
48
|
+
}
|
|
49
|
+
/** Aborts the requests on their way; those posted afterwards, such as the dialog ends of a closing client, go out. */
|
|
50
|
+
abortRequests() {
|
|
51
|
+
this.requests.abort();
|
|
52
|
+
this.requests = new AbortController();
|
|
53
|
+
}
|
|
54
|
+
close() {
|
|
55
|
+
this.transport.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=bank-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bank-connection.js","sourceRoot":"","sources":["../../src/v3/bank-connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAuB,MAAM,sBAAsB,CAAC;AAE1F;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAyB;IACtE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;QAC5D,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,IAAI,qDAAqD,KAAK,KAAK,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,OAAO,cAAc;IAaN;IAZF,SAAS,CAAiB;IAE3C,0DAA0D;IACzC,IAAI,CAAS;IAE9B,0DAA0D;IAClD,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,gFAAgF;IAChF,YACE,GAAQ,EACR,SAAqC,EACpB,MAAiC;QAAjC,WAAM,GAAN,MAAM,CAA2B;QAElD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,aAAa,EAAE,CAAC;IACpD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,IAAgB,EAAE,WAAmB;QAC9C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB;gBAAE,MAAM,KAAK,CAAC;YACtD,MAAM,IAAI,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,GAAG,CAAC,SAA2B,EAAE,OAAqB;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,sHAAsH;IACtH,aAAa;QACX,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
|