@sakeetech/viva-payments-core 0.2.1 → 0.2.3
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/dist/auth/http.js +14 -9
- package/dist/auth/http.js.map +1 -1
- package/dist/auth/index.js +18 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth2-strategy.js +24 -20
- package/dist/auth/oauth2-strategy.js.map +1 -1
- package/dist/auth/reseller-strategy.js +5 -1
- package/dist/auth/reseller-strategy.js.map +1 -1
- package/dist/auth/single-flight.js +8 -3
- package/dist/auth/single-flight.js.map +1 -1
- package/dist/auth/token-cache.js +7 -2
- package/dist/auth/token-cache.js.map +1 -1
- package/dist/errors/api-error.js +6 -2
- package/dist/errors/api-error.js.map +1 -1
- package/dist/errors/auth-error.js +6 -2
- package/dist/errors/auth-error.js.map +1 -1
- package/dist/errors/base.js +5 -1
- package/dist/errors/base.js.map +1 -1
- package/dist/errors/index.js +17 -7
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/mode-mismatch-error.js +6 -2
- package/dist/errors/mode-mismatch-error.js.map +1 -1
- package/dist/errors/rate-limit-error.js +6 -2
- package/dist/errors/rate-limit-error.js.map +1 -1
- package/dist/errors/validation-error.js +6 -2
- package/dist/errors/validation-error.js.map +1 -1
- package/dist/errors/webhook-error.js +6 -2
- package/dist/errors/webhook-error.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/isv/accounts.js +5 -1
- package/dist/isv/accounts.js.map +1 -1
- package/dist/isv/client.js +23 -19
- package/dist/isv/client.js.map +1 -1
- package/dist/isv/index.js +17 -8
- package/dist/isv/index.js.map +1 -1
- package/dist/isv/sources.js +8 -4
- package/dist/isv/sources.js.map +1 -1
- package/dist/isv/webhooks-api.js +5 -1
- package/dist/isv/webhooks-api.js.map +1 -1
- package/dist/legacy/client.js +19 -15
- package/dist/legacy/client.js.map +1 -1
- package/dist/legacy/index.js +5 -1
- package/dist/legacy/index.js.map +1 -1
- package/dist/observability/context.js +15 -11
- package/dist/observability/context.js.map +1 -1
- package/dist/observability/index.js +16 -5
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/logger.js +11 -5
- package/dist/observability/logger.js.map +1 -1
- package/dist/observability/metrics.js +5 -1
- package/dist/observability/metrics.js.map +1 -1
- package/dist/observability/redact.js +4 -1
- package/dist/observability/redact.js.map +1 -1
- package/dist/observability/tracer.js +5 -1
- package/dist/observability/tracer.js.map +1 -1
- package/dist/payments/client.d.ts.map +1 -1
- package/dist/payments/client.js +23 -14
- package/dist/payments/client.js.map +1 -1
- package/dist/payments/index.js +5 -1
- package/dist/payments/index.js.map +1 -1
- package/dist/refunds/fast-refund-client.js +11 -7
- package/dist/refunds/fast-refund-client.js.map +1 -1
- package/dist/refunds/index.js +7 -2
- package/dist/refunds/index.js.map +1 -1
- package/dist/refunds/strategy.js +4 -1
- package/dist/refunds/strategy.js.map +1 -1
- package/dist/types/auth.js +2 -1
- package/dist/types/auth.js.map +1 -1
- package/dist/types/card-types.js +7 -3
- package/dist/types/card-types.js.map +1 -1
- package/dist/types/common.js +8 -4
- package/dist/types/common.js.map +1 -1
- package/dist/types/index.js +14 -6
- package/dist/types/index.js.map +1 -1
- package/dist/types/isv-accounts.js +2 -1
- package/dist/types/isv-accounts.js.map +1 -1
- package/dist/types/isv-payments.js +2 -1
- package/dist/types/isv-payments.js.map +1 -1
- package/dist/types/status.js +2 -1
- package/dist/types/status.js.map +1 -1
- package/dist/types/webhook-events.js +5 -2
- package/dist/types/webhook-events.js.map +1 -1
- package/dist/webhooks/challenge-response.js +6 -3
- package/dist/webhooks/challenge-response.js.map +1 -1
- package/dist/webhooks/event-types.js +10 -4
- package/dist/webhooks/event-types.js.map +1 -1
- package/dist/webhooks/extract-client-ip.js +4 -1
- package/dist/webhooks/extract-client-ip.js.map +1 -1
- package/dist/webhooks/hmac-verify.js +14 -11
- package/dist/webhooks/hmac-verify.js.map +1 -1
- package/dist/webhooks/index.js +22 -6
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/ip-allowlist.js +11 -7
- package/dist/webhooks/ip-allowlist.js.map +1 -1
- package/dist/webhooks/status-lattice.js +8 -3
- package/dist/webhooks/status-lattice.js.map +1 -1
- package/package.json +12 -12
- package/dist/isv/legacy-basic-client.d.ts +0 -122
- package/dist/isv/legacy-basic-client.d.ts.map +0 -1
- package/dist/isv/legacy-basic-client.js +0 -281
- package/dist/isv/legacy-basic-client.js.map +0 -1
- package/dist/isv/payments.d.ts +0 -199
- package/dist/isv/payments.d.ts.map +0 -1
- package/dist/isv/payments.js +0 -385
- package/dist/isv/payments.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-lattice.js","sourceRoot":"","sources":["../../src/webhooks/status-lattice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"status-lattice.js","sourceRoot":"","sources":["../../src/webhooks/status-lattice.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sakeetech/viva-payments-core",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Framework-agnostic Viva Wallet client for ISV integrations. Used by medusa-payment-viva and vendure-payment-viva.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -12,49 +12,49 @@
|
|
|
12
12
|
"bugs": {
|
|
13
13
|
"url": "https://github.com/sakee-tech/vivawallet-npm-public/issues"
|
|
14
14
|
},
|
|
15
|
-
"type": "
|
|
15
|
+
"type": "commonjs",
|
|
16
16
|
"main": "./dist/index.js",
|
|
17
17
|
"types": "./dist/index.d.ts",
|
|
18
18
|
"exports": {
|
|
19
19
|
".": {
|
|
20
20
|
"types": "./dist/index.d.ts",
|
|
21
|
-
"
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
22
|
},
|
|
23
23
|
"./auth": {
|
|
24
24
|
"types": "./dist/auth/index.d.ts",
|
|
25
|
-
"
|
|
25
|
+
"default": "./dist/auth/index.js"
|
|
26
26
|
},
|
|
27
27
|
"./isv": {
|
|
28
28
|
"types": "./dist/isv/index.d.ts",
|
|
29
|
-
"
|
|
29
|
+
"default": "./dist/isv/index.js"
|
|
30
30
|
},
|
|
31
31
|
"./payments": {
|
|
32
32
|
"types": "./dist/payments/index.d.ts",
|
|
33
|
-
"
|
|
33
|
+
"default": "./dist/payments/index.js"
|
|
34
34
|
},
|
|
35
35
|
"./legacy": {
|
|
36
36
|
"types": "./dist/legacy/index.d.ts",
|
|
37
|
-
"
|
|
37
|
+
"default": "./dist/legacy/index.js"
|
|
38
38
|
},
|
|
39
39
|
"./refunds": {
|
|
40
40
|
"types": "./dist/refunds/index.d.ts",
|
|
41
|
-
"
|
|
41
|
+
"default": "./dist/refunds/index.js"
|
|
42
42
|
},
|
|
43
43
|
"./webhooks": {
|
|
44
44
|
"types": "./dist/webhooks/index.d.ts",
|
|
45
|
-
"
|
|
45
|
+
"default": "./dist/webhooks/index.js"
|
|
46
46
|
},
|
|
47
47
|
"./types": {
|
|
48
48
|
"types": "./dist/types/index.d.ts",
|
|
49
|
-
"
|
|
49
|
+
"default": "./dist/types/index.js"
|
|
50
50
|
},
|
|
51
51
|
"./errors": {
|
|
52
52
|
"types": "./dist/errors/index.d.ts",
|
|
53
|
-
"
|
|
53
|
+
"default": "./dist/errors/index.js"
|
|
54
54
|
},
|
|
55
55
|
"./observability": {
|
|
56
56
|
"types": "./dist/observability/index.d.ts",
|
|
57
|
-
"
|
|
57
|
+
"default": "./dist/observability/index.js"
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
60
|
"publishConfig": {
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LegacyBasicClient — HTTP client for Viva legacy API endpoints (Basic auth).
|
|
3
|
-
*
|
|
4
|
-
* Viva exposes a subset of endpoints ONLY on their legacy host
|
|
5
|
-
* (`demo.vivapayments.com` / `www.vivapayments.com`) behind Basic auth
|
|
6
|
-
* (MerchantId:ApiKey). These endpoints are NOT available on the v2/OAuth2
|
|
7
|
-
* surface (`demo-api.vivapayments.com`).
|
|
8
|
-
*
|
|
9
|
-
* Verified against Viva sandbox 2026-04-25:
|
|
10
|
-
* - Refund: `POST /api/transactions/{transactionId}` on legacy host with Basic auth.
|
|
11
|
-
* - Body: `application/x-www-form-urlencoded` — `Amount={minor}&SourceCode={code}`.
|
|
12
|
-
* - Response: PascalCase JSON `{StatusId, Amount, TransactionId, ...}`.
|
|
13
|
-
* - `POST /checkout/v2/transactions/{id}` (v2) returns 405 → NOT valid.
|
|
14
|
-
*
|
|
15
|
-
* Design:
|
|
16
|
-
* - NOT a fallback. This is the PRIMARY (and only) client for legacy endpoints.
|
|
17
|
-
* - Same retry / error-shape conventions as IsvHttpClient.
|
|
18
|
-
* - Form-encoded body builder via URLSearchParams (built-in, zero deps).
|
|
19
|
-
* - Tracing headers (`x-viva-correlationid`, `x-viva-eventid`) extracted and
|
|
20
|
-
* attached to errors and successful responses.
|
|
21
|
-
*
|
|
22
|
-
* @see references/viva-docs/md/tut-create-recurring-payment.txt:288
|
|
23
|
-
* @see references/viva-docs/md/merchant-id-and-api-key.txt:1
|
|
24
|
-
*/
|
|
25
|
-
import type { Dispatcher } from 'undici';
|
|
26
|
-
import type { VivaEnvironment } from '../types/index.js';
|
|
27
|
-
import type { MetricsHook } from '../observability/index.js';
|
|
28
|
-
export interface LegacyBasicClientConfig {
|
|
29
|
-
/**
|
|
30
|
-
* Viva environment selector. Determines legacy host.
|
|
31
|
-
* demo → https://demo.vivapayments.com
|
|
32
|
-
* production → https://www.vivapayments.com
|
|
33
|
-
*/
|
|
34
|
-
environment: VivaEnvironment;
|
|
35
|
-
/**
|
|
36
|
-
* Merchant ID (UUID). Used as the Basic-auth username.
|
|
37
|
-
* @see references/viva-docs/md/merchant-id-and-api-key.txt:1
|
|
38
|
-
*/
|
|
39
|
-
merchantId: string;
|
|
40
|
-
/**
|
|
41
|
-
* API Key. Used as the Basic-auth password.
|
|
42
|
-
* @see references/viva-docs/md/merchant-id-and-api-key.txt:1
|
|
43
|
-
*/
|
|
44
|
-
apiKey: string;
|
|
45
|
-
/** Override undici dispatcher for tests (e.g. MockAgent). */
|
|
46
|
-
dispatcher?: Dispatcher;
|
|
47
|
-
/** Override global fetch. Defaults to undici fetch when dispatcher is provided. */
|
|
48
|
-
fetchImpl?: typeof fetch;
|
|
49
|
-
/** Clock override for tests. Defaults to Date.now. */
|
|
50
|
-
now?: () => number;
|
|
51
|
-
/**
|
|
52
|
-
* Exponential backoff schedule in milliseconds.
|
|
53
|
-
* Default: [500, 1500, 4500].
|
|
54
|
-
*/
|
|
55
|
-
retryBackoffsMs?: number[];
|
|
56
|
-
/** Jitter ratio applied to each backoff (±ratio * backoff). Default: 0.2. */
|
|
57
|
-
jitterRatio?: number;
|
|
58
|
-
/** Default per-request timeout in milliseconds. Default: 30_000. */
|
|
59
|
-
defaultTimeoutMs?: number;
|
|
60
|
-
/** Optional metrics hook. */
|
|
61
|
-
metrics?: MetricsHook;
|
|
62
|
-
}
|
|
63
|
-
export interface LegacyRequestOptions {
|
|
64
|
-
method: 'GET' | 'POST';
|
|
65
|
-
path: string;
|
|
66
|
-
/** Form-encoded key-value pairs (values coerced to string). */
|
|
67
|
-
formBody?: Record<string, string | number | bigint | undefined>;
|
|
68
|
-
/**
|
|
69
|
-
* When true: retries on 429 and 5xx per the backoff schedule.
|
|
70
|
-
* When false: only retries on connection-level errors.
|
|
71
|
-
*/
|
|
72
|
-
idempotent: boolean;
|
|
73
|
-
timeoutMs?: number;
|
|
74
|
-
/** Endpoint label for metrics. */
|
|
75
|
-
endpoint?: string;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Wrapper returned from successful legacy API calls.
|
|
79
|
-
* Includes Viva tracing headers for observability.
|
|
80
|
-
*/
|
|
81
|
-
export interface LegacyApiResult<T> {
|
|
82
|
-
data: T;
|
|
83
|
-
/** `x-viva-correlationid` header value (e.g. "26-115-EDAA55BC"). */
|
|
84
|
-
vivaCorrelationId: string | undefined;
|
|
85
|
-
/** `x-viva-eventid` header value (e.g. "0"). */
|
|
86
|
-
vivaEventId: string | undefined;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* HTTP client for Viva legacy API endpoints (Basic auth + legacy host).
|
|
90
|
-
*
|
|
91
|
-
* Instantiate once per (merchantId + apiKey + environment) tuple.
|
|
92
|
-
* Thread-safe; no shared mutable state.
|
|
93
|
-
*/
|
|
94
|
-
export declare class LegacyBasicClient {
|
|
95
|
-
private readonly legacyBaseUrl;
|
|
96
|
-
private readonly authorizationHeader;
|
|
97
|
-
private readonly dispatcher;
|
|
98
|
-
private readonly fetchImpl;
|
|
99
|
-
private readonly now;
|
|
100
|
-
private readonly backoffsMs;
|
|
101
|
-
private readonly jitterRatio;
|
|
102
|
-
private readonly defaultTimeoutMs;
|
|
103
|
-
private readonly metrics;
|
|
104
|
-
constructor(config: LegacyBasicClientConfig);
|
|
105
|
-
/**
|
|
106
|
-
* Execute a request against the Viva legacy API.
|
|
107
|
-
*
|
|
108
|
-
* Returns a `LegacyApiResult<T>` wrapping both the parsed response and the
|
|
109
|
-
* Viva tracing headers (`x-viva-correlationid`, `x-viva-eventid`).
|
|
110
|
-
*
|
|
111
|
-
* @see references/viva-docs/md/tut-create-recurring-payment.txt:288
|
|
112
|
-
*/
|
|
113
|
-
request<T>(opts: LegacyRequestOptions): Promise<LegacyApiResult<T>>;
|
|
114
|
-
private _executeWithRetry;
|
|
115
|
-
private _attempt;
|
|
116
|
-
private _backoffMs;
|
|
117
|
-
private _retryAfterMs;
|
|
118
|
-
private _parseErrorBody;
|
|
119
|
-
private _isConnectionError;
|
|
120
|
-
private _sleep;
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=legacy-basic-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-basic-client.d.ts","sourceRoot":"","sources":["../../src/isv/legacy-basic-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,WAAW,EAAE,eAAe,CAAC;IAE7B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf,6DAA6D;IAC7D,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAEzB,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAEnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IAChE;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC;IACR,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,gDAAgD;IAChD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AA0BD;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAE1B,MAAM,EAAE,uBAAuB;IAuB3C;;;;;;;OAOG;IACG,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAa3D,iBAAiB;YA0EjB,QAAQ;IA+DtB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,MAAM;CAGf"}
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LegacyBasicClient — HTTP client for Viva legacy API endpoints (Basic auth).
|
|
3
|
-
*
|
|
4
|
-
* Viva exposes a subset of endpoints ONLY on their legacy host
|
|
5
|
-
* (`demo.vivapayments.com` / `www.vivapayments.com`) behind Basic auth
|
|
6
|
-
* (MerchantId:ApiKey). These endpoints are NOT available on the v2/OAuth2
|
|
7
|
-
* surface (`demo-api.vivapayments.com`).
|
|
8
|
-
*
|
|
9
|
-
* Verified against Viva sandbox 2026-04-25:
|
|
10
|
-
* - Refund: `POST /api/transactions/{transactionId}` on legacy host with Basic auth.
|
|
11
|
-
* - Body: `application/x-www-form-urlencoded` — `Amount={minor}&SourceCode={code}`.
|
|
12
|
-
* - Response: PascalCase JSON `{StatusId, Amount, TransactionId, ...}`.
|
|
13
|
-
* - `POST /checkout/v2/transactions/{id}` (v2) returns 405 → NOT valid.
|
|
14
|
-
*
|
|
15
|
-
* Design:
|
|
16
|
-
* - NOT a fallback. This is the PRIMARY (and only) client for legacy endpoints.
|
|
17
|
-
* - Same retry / error-shape conventions as IsvHttpClient.
|
|
18
|
-
* - Form-encoded body builder via URLSearchParams (built-in, zero deps).
|
|
19
|
-
* - Tracing headers (`x-viva-correlationid`, `x-viva-eventid`) extracted and
|
|
20
|
-
* attached to errors and successful responses.
|
|
21
|
-
*
|
|
22
|
-
* @see references/viva-docs/md/tut-create-recurring-payment.txt:288
|
|
23
|
-
* @see references/viva-docs/md/merchant-id-and-api-key.txt:1
|
|
24
|
-
*/
|
|
25
|
-
import { fetch as undiciFetch } from 'undici';
|
|
26
|
-
import { LEGACY_HOST } from '../types/index.js';
|
|
27
|
-
import { VivaApiError, VivaAuthError, VivaRateLimitError } from '../errors/index.js';
|
|
28
|
-
import { NoopMetricsHook } from '../observability/index.js';
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
// Constants
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
const DEFAULT_BACKOFFS_MS = [500, 1500, 4500];
|
|
33
|
-
const DEFAULT_JITTER_RATIO = 0.2;
|
|
34
|
-
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
35
|
-
const MAX_RETRIES = 3;
|
|
36
|
-
const CONNECTION_ERROR_CODES = new Set([
|
|
37
|
-
'ECONNRESET',
|
|
38
|
-
'ENOTFOUND',
|
|
39
|
-
'ETIMEDOUT',
|
|
40
|
-
'ECONNREFUSED',
|
|
41
|
-
'ECONNABORTED',
|
|
42
|
-
'UND_ERR_CONNECT_TIMEOUT',
|
|
43
|
-
'UND_ERR_HEADERS_TIMEOUT',
|
|
44
|
-
'UND_ERR_BODY_TIMEOUT',
|
|
45
|
-
]);
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
47
|
-
// LegacyBasicClient
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
/**
|
|
50
|
-
* HTTP client for Viva legacy API endpoints (Basic auth + legacy host).
|
|
51
|
-
*
|
|
52
|
-
* Instantiate once per (merchantId + apiKey + environment) tuple.
|
|
53
|
-
* Thread-safe; no shared mutable state.
|
|
54
|
-
*/
|
|
55
|
-
export class LegacyBasicClient {
|
|
56
|
-
legacyBaseUrl;
|
|
57
|
-
authorizationHeader;
|
|
58
|
-
dispatcher;
|
|
59
|
-
fetchImpl;
|
|
60
|
-
now;
|
|
61
|
-
backoffsMs;
|
|
62
|
-
jitterRatio;
|
|
63
|
-
defaultTimeoutMs;
|
|
64
|
-
metrics;
|
|
65
|
-
constructor(config) {
|
|
66
|
-
this.legacyBaseUrl = LEGACY_HOST[config.environment];
|
|
67
|
-
// Basic auth: Base64(merchantId:apiKey)
|
|
68
|
-
// @see references/viva-docs/md/merchant-id-and-api-key.txt:1
|
|
69
|
-
const encoded = Buffer.from(`${config.merchantId}:${config.apiKey}`).toString('base64');
|
|
70
|
-
this.authorizationHeader = `Basic ${encoded}`;
|
|
71
|
-
this.now = config.now ?? (() => Date.now());
|
|
72
|
-
this.backoffsMs = config.retryBackoffsMs ?? DEFAULT_BACKOFFS_MS;
|
|
73
|
-
this.jitterRatio = config.jitterRatio ?? DEFAULT_JITTER_RATIO;
|
|
74
|
-
this.defaultTimeoutMs = config.defaultTimeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
75
|
-
this.metrics = config.metrics ?? new NoopMetricsHook();
|
|
76
|
-
if (config.dispatcher) {
|
|
77
|
-
this.dispatcher = config.dispatcher;
|
|
78
|
-
this.fetchImpl = config.fetchImpl ?? undiciFetch;
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
this.dispatcher = undefined;
|
|
82
|
-
this.fetchImpl = config.fetchImpl ?? undiciFetch;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Execute a request against the Viva legacy API.
|
|
87
|
-
*
|
|
88
|
-
* Returns a `LegacyApiResult<T>` wrapping both the parsed response and the
|
|
89
|
-
* Viva tracing headers (`x-viva-correlationid`, `x-viva-eventid`).
|
|
90
|
-
*
|
|
91
|
-
* @see references/viva-docs/md/tut-create-recurring-payment.txt:288
|
|
92
|
-
*/
|
|
93
|
-
async request(opts) {
|
|
94
|
-
const endpoint = opts.endpoint ?? `${opts.method} ${opts.path}`;
|
|
95
|
-
return this.metrics.timeAsync('viva_legacy_api_request_duration_seconds', () => this._executeWithRetry(opts), { endpoint });
|
|
96
|
-
}
|
|
97
|
-
// --------------------------------------------------------------------------
|
|
98
|
-
// Private helpers
|
|
99
|
-
// --------------------------------------------------------------------------
|
|
100
|
-
async _executeWithRetry(opts) {
|
|
101
|
-
let attempt = 0;
|
|
102
|
-
// eslint-disable-next-line no-constant-condition
|
|
103
|
-
while (true) {
|
|
104
|
-
const { response, text } = await this._attempt(opts);
|
|
105
|
-
const vivaCorrelationId = response.headers.get('x-viva-correlationid') ?? undefined;
|
|
106
|
-
const vivaEventId = response.headers.get('x-viva-eventid') ?? undefined;
|
|
107
|
-
// --- happy path ---
|
|
108
|
-
if (response.status >= 200 && response.status < 300) {
|
|
109
|
-
if (!text || response.status === 204) {
|
|
110
|
-
return { data: undefined, vivaCorrelationId, vivaEventId };
|
|
111
|
-
}
|
|
112
|
-
const data = JSON.parse(text);
|
|
113
|
-
return { data, vivaCorrelationId, vivaEventId };
|
|
114
|
-
}
|
|
115
|
-
// --- 401 ---
|
|
116
|
-
if (response.status === 401) {
|
|
117
|
-
throw new VivaAuthError({
|
|
118
|
-
message: 'Viva legacy API authentication failed (HTTP 401) — check merchantId and apiKey',
|
|
119
|
-
httpStatus: 401,
|
|
120
|
-
requestId: vivaCorrelationId,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
// --- 429 ---
|
|
124
|
-
if (response.status === 429) {
|
|
125
|
-
if (opts.idempotent && attempt < MAX_RETRIES) {
|
|
126
|
-
const retryAfterMs = this._retryAfterMs(response) ?? this._backoffMs(attempt);
|
|
127
|
-
await this._sleep(retryAfterMs);
|
|
128
|
-
attempt++;
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
const retryAfterMs = this._retryAfterMs(response);
|
|
132
|
-
throw new VivaRateLimitError({
|
|
133
|
-
message: 'Viva legacy API rate limited (HTTP 429)',
|
|
134
|
-
httpStatus: 429,
|
|
135
|
-
requestId: vivaCorrelationId,
|
|
136
|
-
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
// --- 5xx ---
|
|
140
|
-
if (response.status >= 500) {
|
|
141
|
-
if (opts.idempotent && attempt < MAX_RETRIES) {
|
|
142
|
-
const backoffMs = this._backoffMs(attempt);
|
|
143
|
-
await this._sleep(backoffMs);
|
|
144
|
-
attempt++;
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
const { vivaCode, vivaMessage } = this._parseErrorBody(text);
|
|
148
|
-
throw new VivaApiError({
|
|
149
|
-
message: vivaMessage ?? `Viva legacy API error (HTTP ${response.status})`,
|
|
150
|
-
httpStatus: response.status,
|
|
151
|
-
vivaCode,
|
|
152
|
-
requestId: vivaCorrelationId,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
// --- other 4xx ---
|
|
156
|
-
{
|
|
157
|
-
const { vivaCode, vivaMessage } = this._parseErrorBody(text);
|
|
158
|
-
throw new VivaApiError({
|
|
159
|
-
message: vivaMessage ?? `Viva legacy API error (HTTP ${response.status})`,
|
|
160
|
-
httpStatus: response.status,
|
|
161
|
-
vivaCode,
|
|
162
|
-
requestId: vivaCorrelationId,
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
async _attempt(opts) {
|
|
168
|
-
const url = `${this.legacyBaseUrl}${opts.path}`;
|
|
169
|
-
const timeoutMs = opts.timeoutMs ?? this.defaultTimeoutMs;
|
|
170
|
-
const controller = new AbortController();
|
|
171
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
172
|
-
const headers = {
|
|
173
|
-
Authorization: this.authorizationHeader,
|
|
174
|
-
Accept: 'application/json',
|
|
175
|
-
};
|
|
176
|
-
const fetchOptions = {
|
|
177
|
-
method: opts.method,
|
|
178
|
-
headers,
|
|
179
|
-
signal: controller.signal,
|
|
180
|
-
};
|
|
181
|
-
// Form-encode the body (Viva legacy API uses application/x-www-form-urlencoded)
|
|
182
|
-
if (opts.formBody && Object.keys(opts.formBody).length > 0) {
|
|
183
|
-
const params = new URLSearchParams();
|
|
184
|
-
for (const [k, v] of Object.entries(opts.formBody)) {
|
|
185
|
-
if (v !== undefined) {
|
|
186
|
-
params.set(k, String(v));
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
fetchOptions.body = params.toString();
|
|
190
|
-
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
191
|
-
}
|
|
192
|
-
if (this.dispatcher) {
|
|
193
|
-
fetchOptions['dispatcher'] = this.dispatcher;
|
|
194
|
-
}
|
|
195
|
-
let maxConnectionRetries = opts.idempotent ? 0 : 1;
|
|
196
|
-
let connAttempt = 0;
|
|
197
|
-
// eslint-disable-next-line no-constant-condition
|
|
198
|
-
while (true) {
|
|
199
|
-
try {
|
|
200
|
-
const response = await this.fetchImpl(url, fetchOptions);
|
|
201
|
-
clearTimeout(timeoutId);
|
|
202
|
-
const text = await response.text();
|
|
203
|
-
return { response, text };
|
|
204
|
-
}
|
|
205
|
-
catch (err) {
|
|
206
|
-
clearTimeout(timeoutId);
|
|
207
|
-
const isConnectionError = this._isConnectionError(err);
|
|
208
|
-
const isAbort = err instanceof Error && err.name === 'AbortError';
|
|
209
|
-
if ((isConnectionError || isAbort) && !opts.idempotent && connAttempt < maxConnectionRetries) {
|
|
210
|
-
connAttempt++;
|
|
211
|
-
continue;
|
|
212
|
-
}
|
|
213
|
-
throw new VivaApiError({
|
|
214
|
-
message: isAbort
|
|
215
|
-
? `Viva legacy API request timed out after ${timeoutMs}ms`
|
|
216
|
-
: `Viva legacy API network error: ${err instanceof Error ? err.message : String(err)}`,
|
|
217
|
-
cause: err,
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
_backoffMs(attempt) {
|
|
223
|
-
const base = this.backoffsMs[attempt] ?? this.backoffsMs[this.backoffsMs.length - 1] ?? 500;
|
|
224
|
-
const jitter = base * this.jitterRatio * (Math.random() * 2 - 1);
|
|
225
|
-
return Math.max(0, Math.round(base + jitter));
|
|
226
|
-
}
|
|
227
|
-
_retryAfterMs(response) {
|
|
228
|
-
const header = response.headers.get('Retry-After');
|
|
229
|
-
if (!header)
|
|
230
|
-
return undefined;
|
|
231
|
-
const seconds = parseFloat(header);
|
|
232
|
-
if (!isNaN(seconds))
|
|
233
|
-
return Math.max(0, Math.round(seconds * 1000));
|
|
234
|
-
const date = new Date(header).getTime();
|
|
235
|
-
if (!isNaN(date))
|
|
236
|
-
return Math.max(0, date - this.now());
|
|
237
|
-
return undefined;
|
|
238
|
-
}
|
|
239
|
-
_parseErrorBody(text) {
|
|
240
|
-
if (!text)
|
|
241
|
-
return {};
|
|
242
|
-
try {
|
|
243
|
-
const parsed = JSON.parse(text);
|
|
244
|
-
const vivaCode = typeof parsed['ErrorCode'] === 'number'
|
|
245
|
-
? String(parsed['ErrorCode'])
|
|
246
|
-
: typeof parsed['errorCode'] === 'number'
|
|
247
|
-
? String(parsed['errorCode'])
|
|
248
|
-
: typeof parsed['error'] === 'string'
|
|
249
|
-
? parsed['error']
|
|
250
|
-
: undefined;
|
|
251
|
-
const vivaMessage = typeof parsed['Message'] === 'string'
|
|
252
|
-
? parsed['Message']
|
|
253
|
-
: typeof parsed['message'] === 'string'
|
|
254
|
-
? parsed['message']
|
|
255
|
-
: undefined;
|
|
256
|
-
const result = {};
|
|
257
|
-
if (vivaCode !== undefined)
|
|
258
|
-
result.vivaCode = vivaCode;
|
|
259
|
-
if (vivaMessage !== undefined)
|
|
260
|
-
result.vivaMessage = vivaMessage;
|
|
261
|
-
return result;
|
|
262
|
-
}
|
|
263
|
-
catch {
|
|
264
|
-
return {};
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
_isConnectionError(err) {
|
|
268
|
-
if (!(err instanceof Error))
|
|
269
|
-
return false;
|
|
270
|
-
const code = err.code;
|
|
271
|
-
if (code && CONNECTION_ERROR_CODES.has(code))
|
|
272
|
-
return true;
|
|
273
|
-
if (err.message.includes('ECONNRESET') || err.message.includes('ENOTFOUND'))
|
|
274
|
-
return true;
|
|
275
|
-
return false;
|
|
276
|
-
}
|
|
277
|
-
_sleep(ms) {
|
|
278
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
//# sourceMappingURL=legacy-basic-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-basic-client.js","sourceRoot":"","sources":["../../src/isv/legacy-basic-client.ts"],"names":[],"mappings":"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"}
|