@sakeetech/viva-payments-core 0.2.1

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 (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/dist/auth/http.d.ts +44 -0
  4. package/dist/auth/http.d.ts.map +1 -0
  5. package/dist/auth/http.js +80 -0
  6. package/dist/auth/http.js.map +1 -0
  7. package/dist/auth/index.d.ts +19 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +18 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/oauth2-strategy.d.ts +117 -0
  12. package/dist/auth/oauth2-strategy.d.ts.map +1 -0
  13. package/dist/auth/oauth2-strategy.js +217 -0
  14. package/dist/auth/oauth2-strategy.js.map +1 -0
  15. package/dist/auth/reseller-strategy.d.ts +65 -0
  16. package/dist/auth/reseller-strategy.d.ts.map +1 -0
  17. package/dist/auth/reseller-strategy.js +68 -0
  18. package/dist/auth/reseller-strategy.js.map +1 -0
  19. package/dist/auth/single-flight.d.ts +81 -0
  20. package/dist/auth/single-flight.d.ts.map +1 -0
  21. package/dist/auth/single-flight.js +160 -0
  22. package/dist/auth/single-flight.js.map +1 -0
  23. package/dist/auth/token-cache.d.ts +50 -0
  24. package/dist/auth/token-cache.d.ts.map +1 -0
  25. package/dist/auth/token-cache.js +59 -0
  26. package/dist/auth/token-cache.js.map +1 -0
  27. package/dist/errors/api-error.d.ts +15 -0
  28. package/dist/errors/api-error.d.ts.map +1 -0
  29. package/dist/errors/api-error.js +18 -0
  30. package/dist/errors/api-error.js.map +1 -0
  31. package/dist/errors/auth-error.d.ts +14 -0
  32. package/dist/errors/auth-error.d.ts.map +1 -0
  33. package/dist/errors/auth-error.js +17 -0
  34. package/dist/errors/auth-error.js.map +1 -0
  35. package/dist/errors/base.d.ts +59 -0
  36. package/dist/errors/base.d.ts.map +1 -0
  37. package/dist/errors/base.js +51 -0
  38. package/dist/errors/base.js.map +1 -0
  39. package/dist/errors/index.d.ts +18 -0
  40. package/dist/errors/index.d.ts.map +1 -0
  41. package/dist/errors/index.js +16 -0
  42. package/dist/errors/index.js.map +1 -0
  43. package/dist/errors/mode-mismatch-error.d.ts +19 -0
  44. package/dist/errors/mode-mismatch-error.d.ts.map +1 -0
  45. package/dist/errors/mode-mismatch-error.js +22 -0
  46. package/dist/errors/mode-mismatch-error.js.map +1 -0
  47. package/dist/errors/rate-limit-error.d.ts +20 -0
  48. package/dist/errors/rate-limit-error.d.ts.map +1 -0
  49. package/dist/errors/rate-limit-error.js +20 -0
  50. package/dist/errors/rate-limit-error.js.map +1 -0
  51. package/dist/errors/validation-error.d.ts +14 -0
  52. package/dist/errors/validation-error.d.ts.map +1 -0
  53. package/dist/errors/validation-error.js +17 -0
  54. package/dist/errors/validation-error.js.map +1 -0
  55. package/dist/errors/webhook-error.d.ts +14 -0
  56. package/dist/errors/webhook-error.d.ts.map +1 -0
  57. package/dist/errors/webhook-error.js +17 -0
  58. package/dist/errors/webhook-error.js.map +1 -0
  59. package/dist/index.d.ts +15 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +15 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/isv/accounts.d.ts +38 -0
  64. package/dist/isv/accounts.d.ts.map +1 -0
  65. package/dist/isv/accounts.js +60 -0
  66. package/dist/isv/accounts.js.map +1 -0
  67. package/dist/isv/client.d.ts +187 -0
  68. package/dist/isv/client.d.ts.map +1 -0
  69. package/dist/isv/client.js +465 -0
  70. package/dist/isv/client.js.map +1 -0
  71. package/dist/isv/index.d.ts +52 -0
  72. package/dist/isv/index.d.ts.map +1 -0
  73. package/dist/isv/index.js +53 -0
  74. package/dist/isv/index.js.map +1 -0
  75. package/dist/isv/legacy-basic-client.d.ts +122 -0
  76. package/dist/isv/legacy-basic-client.d.ts.map +1 -0
  77. package/dist/isv/legacy-basic-client.js +281 -0
  78. package/dist/isv/legacy-basic-client.js.map +1 -0
  79. package/dist/isv/payments.d.ts +199 -0
  80. package/dist/isv/payments.d.ts.map +1 -0
  81. package/dist/isv/payments.js +385 -0
  82. package/dist/isv/payments.js.map +1 -0
  83. package/dist/isv/sources.d.ts +80 -0
  84. package/dist/isv/sources.d.ts.map +1 -0
  85. package/dist/isv/sources.js +112 -0
  86. package/dist/isv/sources.js.map +1 -0
  87. package/dist/isv/webhooks-api.d.ts +48 -0
  88. package/dist/isv/webhooks-api.d.ts.map +1 -0
  89. package/dist/isv/webhooks-api.js +66 -0
  90. package/dist/isv/webhooks-api.js.map +1 -0
  91. package/dist/legacy/client.d.ts +199 -0
  92. package/dist/legacy/client.d.ts.map +1 -0
  93. package/dist/legacy/client.js +351 -0
  94. package/dist/legacy/client.js.map +1 -0
  95. package/dist/legacy/index.d.ts +15 -0
  96. package/dist/legacy/index.d.ts.map +1 -0
  97. package/dist/legacy/index.js +14 -0
  98. package/dist/legacy/index.js.map +1 -0
  99. package/dist/observability/context.d.ts +30 -0
  100. package/dist/observability/context.d.ts.map +1 -0
  101. package/dist/observability/context.js +40 -0
  102. package/dist/observability/context.js.map +1 -0
  103. package/dist/observability/index.d.ts +15 -0
  104. package/dist/observability/index.d.ts.map +1 -0
  105. package/dist/observability/index.js +11 -0
  106. package/dist/observability/index.js.map +1 -0
  107. package/dist/observability/logger.d.ts +81 -0
  108. package/dist/observability/logger.d.ts.map +1 -0
  109. package/dist/observability/logger.js +127 -0
  110. package/dist/observability/logger.js.map +1 -0
  111. package/dist/observability/metrics.d.ts +37 -0
  112. package/dist/observability/metrics.d.ts.map +1 -0
  113. package/dist/observability/metrics.js +40 -0
  114. package/dist/observability/metrics.js.map +1 -0
  115. package/dist/observability/redact.d.ts +21 -0
  116. package/dist/observability/redact.d.ts.map +1 -0
  117. package/dist/observability/redact.js +72 -0
  118. package/dist/observability/redact.js.map +1 -0
  119. package/dist/observability/tracer.d.ts +25 -0
  120. package/dist/observability/tracer.d.ts.map +1 -0
  121. package/dist/observability/tracer.js +18 -0
  122. package/dist/observability/tracer.js.map +1 -0
  123. package/dist/payments/client.d.ts +247 -0
  124. package/dist/payments/client.d.ts.map +1 -0
  125. package/dist/payments/client.js +488 -0
  126. package/dist/payments/client.js.map +1 -0
  127. package/dist/payments/index.d.ts +14 -0
  128. package/dist/payments/index.d.ts.map +1 -0
  129. package/dist/payments/index.js +13 -0
  130. package/dist/payments/index.js.map +1 -0
  131. package/dist/refunds/fast-refund-client.d.ts +128 -0
  132. package/dist/refunds/fast-refund-client.d.ts.map +1 -0
  133. package/dist/refunds/fast-refund-client.js +138 -0
  134. package/dist/refunds/fast-refund-client.js.map +1 -0
  135. package/dist/refunds/index.d.ts +19 -0
  136. package/dist/refunds/index.d.ts.map +1 -0
  137. package/dist/refunds/index.js +17 -0
  138. package/dist/refunds/index.js.map +1 -0
  139. package/dist/refunds/strategy.d.ts +78 -0
  140. package/dist/refunds/strategy.d.ts.map +1 -0
  141. package/dist/refunds/strategy.js +75 -0
  142. package/dist/refunds/strategy.js.map +1 -0
  143. package/dist/types/auth.d.ts +80 -0
  144. package/dist/types/auth.d.ts.map +1 -0
  145. package/dist/types/auth.js +12 -0
  146. package/dist/types/auth.js.map +1 -0
  147. package/dist/types/card-types.d.ts +48 -0
  148. package/dist/types/card-types.d.ts.map +1 -0
  149. package/dist/types/card-types.js +62 -0
  150. package/dist/types/card-types.js.map +1 -0
  151. package/dist/types/common.d.ts +160 -0
  152. package/dist/types/common.d.ts.map +1 -0
  153. package/dist/types/common.js +70 -0
  154. package/dist/types/common.js.map +1 -0
  155. package/dist/types/index.d.ts +21 -0
  156. package/dist/types/index.d.ts.map +1 -0
  157. package/dist/types/index.js +21 -0
  158. package/dist/types/index.js.map +1 -0
  159. package/dist/types/isv-accounts.d.ts +109 -0
  160. package/dist/types/isv-accounts.d.ts.map +1 -0
  161. package/dist/types/isv-accounts.js +22 -0
  162. package/dist/types/isv-accounts.js.map +1 -0
  163. package/dist/types/isv-payments.d.ts +262 -0
  164. package/dist/types/isv-payments.d.ts.map +1 -0
  165. package/dist/types/isv-payments.js +19 -0
  166. package/dist/types/isv-payments.js.map +1 -0
  167. package/dist/types/status.d.ts +125 -0
  168. package/dist/types/status.d.ts.map +1 -0
  169. package/dist/types/status.js +19 -0
  170. package/dist/types/status.js.map +1 -0
  171. package/dist/types/webhook-events.d.ts +447 -0
  172. package/dist/types/webhook-events.d.ts.map +1 -0
  173. package/dist/types/webhook-events.js +76 -0
  174. package/dist/types/webhook-events.js.map +1 -0
  175. package/dist/webhooks/challenge-response.d.ts +28 -0
  176. package/dist/webhooks/challenge-response.d.ts.map +1 -0
  177. package/dist/webhooks/challenge-response.js +35 -0
  178. package/dist/webhooks/challenge-response.js.map +1 -0
  179. package/dist/webhooks/event-types.d.ts +44 -0
  180. package/dist/webhooks/event-types.d.ts.map +1 -0
  181. package/dist/webhooks/event-types.js +50 -0
  182. package/dist/webhooks/event-types.js.map +1 -0
  183. package/dist/webhooks/extract-client-ip.d.ts +40 -0
  184. package/dist/webhooks/extract-client-ip.d.ts.map +1 -0
  185. package/dist/webhooks/extract-client-ip.js +72 -0
  186. package/dist/webhooks/extract-client-ip.js.map +1 -0
  187. package/dist/webhooks/hmac-verify.d.ts +38 -0
  188. package/dist/webhooks/hmac-verify.d.ts.map +1 -0
  189. package/dist/webhooks/hmac-verify.js +92 -0
  190. package/dist/webhooks/hmac-verify.js.map +1 -0
  191. package/dist/webhooks/index.d.ts +19 -0
  192. package/dist/webhooks/index.d.ts.map +1 -0
  193. package/dist/webhooks/index.js +19 -0
  194. package/dist/webhooks/index.js.map +1 -0
  195. package/dist/webhooks/ip-allowlist.d.ts +59 -0
  196. package/dist/webhooks/ip-allowlist.d.ts.map +1 -0
  197. package/dist/webhooks/ip-allowlist.js +147 -0
  198. package/dist/webhooks/ip-allowlist.js.map +1 -0
  199. package/dist/webhooks/status-lattice.d.ts +72 -0
  200. package/dist/webhooks/status-lattice.d.ts.map +1 -0
  201. package/dist/webhooks/status-lattice.js +208 -0
  202. package/dist/webhooks/status-lattice.js.map +1 -0
  203. package/package.json +85 -0
@@ -0,0 +1,465 @@
1
+ /**
2
+ * IsvHttpClient — shared HTTP wrapper for all ISV API calls.
3
+ *
4
+ * Responsibilities:
5
+ * - Resolve base URL from VivaEnvironment
6
+ * - Inject Authorization header from AuthStrategy.getBearerToken()
7
+ * - Bigint-safe JSON serialization (request body) and deserialization (response)
8
+ * - Per-request timeout via AbortController
9
+ * - Retry policy: idempotent requests retry 429 + 5xx up to 3 times with
10
+ * exponential backoff [500, 1500, 4500]ms ±20% jitter
11
+ * - Non-idempotent POST: only retry on connection-level errors (never on ack)
12
+ * - 401 handling: force-refresh token once, retry same request once
13
+ * - Error mapping to typed VivaError subclasses
14
+ *
15
+ * @see references/viva-docs/md/isv-credentials.txt:107 (auth credential types)
16
+ * @see references/viva-docs/md/isv-partner-program.txt:104 (ISV API overview)
17
+ */
18
+ import { fetch as undiciFetch } from 'undici';
19
+ import { ENVIRONMENT_URLS } from '../types/index.js';
20
+ import { getApiDispatcher } from '../auth/http.js';
21
+ import { VivaApiError, VivaValidationError as _VivaValidationError, VivaRateLimitError, } from '../errors/index.js';
22
+ import { VivaAuthError } from '../errors/index.js';
23
+ import { NoopMetricsHook } from '../observability/index.js';
24
+ // ---------------------------------------------------------------------------
25
+ // Bigint-safe JSON utilities
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Bigint-safe JSON.stringify.
29
+ *
30
+ * - bigint values <= Number.MAX_SAFE_INTEGER → serialized as JSON number
31
+ * - bigint values > Number.MAX_SAFE_INTEGER → serialized as JSON string
32
+ * (emits a console.warn — the OrderCode case).
33
+ *
34
+ * Wire format: Viva's `Amount` is integer minor units (fits safe int for
35
+ * realistic payment amounts). `OrderCode` is int64 and can exceed
36
+ * Number.MAX_SAFE_INTEGER (e.g. 1234567890123456789).
37
+ *
38
+ * @see references/viva-docs/md/isv-partner-program.txt:104
39
+ */
40
+ function bigintSafeStringify(value) {
41
+ return JSON.stringify(value, (_key, val) => {
42
+ if (typeof val === 'bigint') {
43
+ if (val >= -BigInt(Number.MAX_SAFE_INTEGER) && val <= BigInt(Number.MAX_SAFE_INTEGER)) {
44
+ return Number(val);
45
+ }
46
+ // TODO(impl): OrderCode > MAX_SAFE_INTEGER encoded as string — confirm
47
+ // Viva accepts JSON string for OrderCode in request bodies. At present
48
+ // only DELETE /checkout/v2/orders/{orderCode} uses OrderCode in the URL,
49
+ // not in the body, so this path is informational only.
50
+ // @see references/viva-docs/md/isv-partner-program.txt:104
51
+ console.warn(`[viva-payments-core] bigint value ${val} exceeds Number.MAX_SAFE_INTEGER; encoding as JSON string`);
52
+ return val.toString();
53
+ }
54
+ return val;
55
+ });
56
+ }
57
+ /**
58
+ * Bigint-safe JSON.parse for Viva API responses.
59
+ *
60
+ * Converts the `OrderCode` field to BigInt on parse to preserve precision.
61
+ * Other numeric fields are left as JavaScript numbers (they fit safely).
62
+ *
63
+ * @see references/viva-docs/md/webhooks-for-payments.txt:495 (OrderCode is long/int64)
64
+ * @see references/viva-docs/md/account-api.txt:1584 (OrderCode type: long)
65
+ */
66
+ function bigintSafeParse(text) {
67
+ return JSON.parse(text, (key, val) => {
68
+ if (key === 'OrderCode' || key === 'orderCode') {
69
+ // val at this point is a JS number — may have lost precision if > 2^53.
70
+ // We parse the raw number from the original text using a regex replace
71
+ // to preserve precision. The reviver approach is sufficient for most
72
+ // cases but for truly out-of-range values we rely on the raw string.
73
+ // Safe: JSON numbers for OrderCode are int64; regex below is conservative.
74
+ if (typeof val === 'number') {
75
+ return BigInt(val);
76
+ }
77
+ if (typeof val === 'string') {
78
+ return BigInt(val);
79
+ }
80
+ }
81
+ return val;
82
+ });
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Constants
86
+ // ---------------------------------------------------------------------------
87
+ const DEFAULT_BACKOFFS_MS = [500, 1500, 4500];
88
+ const DEFAULT_JITTER_RATIO = 0.2;
89
+ const DEFAULT_TIMEOUT_MS = 30_000;
90
+ const MAX_RETRIES = 3;
91
+ /** Connection-level error codes that indicate the request was never acked. */
92
+ const CONNECTION_ERROR_CODES = new Set([
93
+ 'ECONNRESET',
94
+ 'ENOTFOUND',
95
+ 'ETIMEDOUT',
96
+ 'ECONNREFUSED',
97
+ 'ECONNABORTED',
98
+ 'UND_ERR_CONNECT_TIMEOUT',
99
+ 'UND_ERR_HEADERS_TIMEOUT',
100
+ 'UND_ERR_BODY_TIMEOUT',
101
+ ]);
102
+ // ---------------------------------------------------------------------------
103
+ // IsvHttpClient
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * Shared HTTP client for all ISV API endpoints.
107
+ *
108
+ * Constructed once per platform context (auth strategy + environment) and
109
+ * shared across IsvPayments, IsvAccounts, IsvWebhooks.
110
+ *
111
+ * @see references/viva-docs/md/isv-credentials.txt:107
112
+ * @see references/viva-docs/md/isv-partner-program.txt:104
113
+ */
114
+ export class IsvHttpClient {
115
+ apiBaseUrl;
116
+ authStrategy;
117
+ dispatcher;
118
+ fetchImpl;
119
+ now;
120
+ backoffsMs;
121
+ jitterRatio;
122
+ defaultTimeoutMs;
123
+ metrics;
124
+ /**
125
+ * Last observed `x-viva-correlationid` header value.
126
+ * Updated after every successful HTTP response. Used by `requestWithMeta`.
127
+ * Probe-verified 2026-04-25: Viva includes this on every response.
128
+ */
129
+ _vivaLastCorrelationId = undefined;
130
+ /**
131
+ * Last observed `x-viva-eventid` header value.
132
+ * Updated after every successful HTTP response. Used by `requestWithMeta`.
133
+ */
134
+ _vivaLastEventId = undefined;
135
+ constructor(config) {
136
+ this.apiBaseUrl = ENVIRONMENT_URLS[config.environment].apiBaseUrl;
137
+ this.authStrategy = config.authStrategy;
138
+ this.now = config.now ?? (() => Date.now());
139
+ this.backoffsMs = config.retryBackoffsMs ?? DEFAULT_BACKOFFS_MS;
140
+ this.jitterRatio = config.jitterRatio ?? DEFAULT_JITTER_RATIO;
141
+ this.defaultTimeoutMs = config.defaultTimeoutMs ?? DEFAULT_TIMEOUT_MS;
142
+ this.metrics = config.metrics ?? new NoopMetricsHook();
143
+ if (config.dispatcher) {
144
+ this.dispatcher = config.dispatcher;
145
+ // When a dispatcher is injected (tests), use undici's fetch with that dispatcher.
146
+ this.fetchImpl = config.fetchImpl ?? undiciFetch;
147
+ }
148
+ else {
149
+ this.dispatcher = getApiDispatcher(config.environment);
150
+ this.fetchImpl = config.fetchImpl ?? undiciFetch;
151
+ }
152
+ }
153
+ /**
154
+ * Execute an outbound request to the Viva ISV API.
155
+ *
156
+ * Auth flow per plan Auth Flow line 317:
157
+ * 1. Get bearer token from authStrategy.
158
+ * 2. Execute request.
159
+ * 3. On 401: force-refresh token once, retry once.
160
+ * 4. Second 401 → VivaAuthError.
161
+ *
162
+ * Retry policy per plan Auth Flow line 319:
163
+ * - Idempotent: retry 429 + 5xx up to MAX_RETRIES with backoff + jitter.
164
+ * - Non-idempotent: retry only on connection-level errors.
165
+ *
166
+ * @see references/viva-docs/md/isv-credentials.txt:107 (auth strategy)
167
+ * @see references/viva-docs/md/isv-partner-program.txt:104 (retry policy)
168
+ */
169
+ async request(opts) {
170
+ // Auth-refresh-then-retry is handled outside the idempotent retry loop.
171
+ // We do one auth-refresh cycle independently.
172
+ const endpoint = opts.endpoint ?? `${opts.method} ${opts.path}`;
173
+ return this.metrics.timeAsync('viva_api_request_duration_seconds', () => this._withAuthRefresh(opts), { endpoint });
174
+ }
175
+ /**
176
+ * Like `request<T>` but also returns Viva tracing headers.
177
+ *
178
+ * Returns `{ data: T, vivaCorrelationId, vivaEventId }` for observability.
179
+ * Use this when the caller needs the `x-viva-correlationid` / `x-viva-eventid`
180
+ * values (e.g. to log them or attach them to structured traces).
181
+ *
182
+ * Probe-verified 2026-04-25: both headers are present on every Viva response.
183
+ *
184
+ * @see references/viva-docs/md/isv-partner-program.txt:104
185
+ */
186
+ async requestWithMeta(opts) {
187
+ const endpoint = opts.endpoint ?? `${opts.method} ${opts.path}`;
188
+ const data = await this.metrics.timeAsync('viva_api_request_duration_seconds', () => this._withAuthRefresh(opts), { endpoint });
189
+ return {
190
+ data,
191
+ vivaCorrelationId: this._vivaLastCorrelationId,
192
+ vivaEventId: this._vivaLastEventId,
193
+ };
194
+ }
195
+ // --------------------------------------------------------------------------
196
+ // Private helpers
197
+ // --------------------------------------------------------------------------
198
+ /**
199
+ * Executes the request with a single auth-refresh-then-retry cycle.
200
+ *
201
+ * On first 401: forceRefresh token, retry the request once.
202
+ * On second 401: throw VivaAuthError.
203
+ *
204
+ * @see references/viva-docs/md/isv-credentials.txt:107
205
+ */
206
+ async _withAuthRefresh(opts) {
207
+ const token = await this.authStrategy.getBearerToken();
208
+ try {
209
+ return await this._executeWithRetry(opts, token);
210
+ }
211
+ catch (err) {
212
+ if (err instanceof VivaAuthError && err.httpStatus === 401) {
213
+ // Force-refresh and retry once.
214
+ const freshToken = await this.authStrategy.getBearerToken({ forceRefresh: true });
215
+ return await this._executeWithRetry(opts, freshToken);
216
+ }
217
+ throw err;
218
+ }
219
+ }
220
+ /**
221
+ * Executes the request with the idempotent retry loop.
222
+ * Does NOT handle auth-refresh — that is the caller's responsibility.
223
+ *
224
+ * Viva tracing headers are extracted on every response:
225
+ * - `x-viva-correlationid` (e.g. "26-115-EDAA55BC") — probe-verified 2026-04-25.
226
+ * - `x-viva-eventid` (e.g. "0") — probe-verified 2026-04-25.
227
+ * On errors these are attached to the thrown VivaError. On success they are
228
+ * available via the `_vivaLastCorrelationId` / `_vivaLastEventId` fields for
229
+ * callers that need them (use `request<T>` for the raw value; use
230
+ * `requestWithMeta<T>` for explicit access to the tracing pair).
231
+ *
232
+ * @see references/viva-docs/md/isv-partner-program.txt:104 (Auth Flow line 319)
233
+ */
234
+ async _executeWithRetry(opts, token) {
235
+ let attempt = 0;
236
+ // eslint-disable-next-line no-constant-condition
237
+ while (true) {
238
+ const { response, text } = await this._attempt(opts, token);
239
+ // Extract Viva tracing headers — present on every response (probe-verified 2026-04-25).
240
+ const vivaCorrelationId = response.headers.get('x-viva-correlationid') ?? undefined;
241
+ const vivaEventId = response.headers.get('x-viva-eventid') ?? undefined;
242
+ // Store last seen values for requestWithMeta.
243
+ this._vivaLastCorrelationId = vivaCorrelationId;
244
+ this._vivaLastEventId = vivaEventId;
245
+ // --- happy path ---
246
+ if (response.status >= 200 && response.status < 300) {
247
+ if (!text || response.status === 204) {
248
+ return undefined;
249
+ }
250
+ return bigintSafeParse(text);
251
+ }
252
+ // --- 401: surface immediately (auth-refresh handled in _withAuthRefresh) ---
253
+ if (response.status === 401) {
254
+ const requestId = response.headers.get('Cf-Ray') ?? response.headers.get('CorrelationId') ?? undefined;
255
+ throw new VivaAuthError({
256
+ message: `Viva API authentication failed (HTTP 401)`,
257
+ httpStatus: 401,
258
+ requestId,
259
+ vivaCorrelationId,
260
+ vivaEventId,
261
+ });
262
+ }
263
+ // --- 429: rate limit ---
264
+ if (response.status === 429) {
265
+ if (opts.idempotent && attempt < MAX_RETRIES) {
266
+ const retryAfterMs = this._retryAfterMs(response) ?? this._backoffMs(attempt);
267
+ await this._sleep(retryAfterMs);
268
+ attempt++;
269
+ continue;
270
+ }
271
+ const requestId = response.headers.get('Cf-Ray') ?? response.headers.get('CorrelationId') ?? undefined;
272
+ const retryAfterMs = this._retryAfterMs(response);
273
+ throw new VivaRateLimitError({
274
+ message: `Viva API rate limited (HTTP 429)`,
275
+ httpStatus: 429,
276
+ requestId,
277
+ vivaCorrelationId,
278
+ vivaEventId,
279
+ ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
280
+ });
281
+ }
282
+ // --- 5xx ---
283
+ if (response.status >= 500) {
284
+ if (opts.idempotent && attempt < MAX_RETRIES) {
285
+ const backoffMs = this._backoffMs(attempt);
286
+ await this._sleep(backoffMs);
287
+ attempt++;
288
+ continue;
289
+ }
290
+ const requestId = response.headers.get('Cf-Ray') ?? response.headers.get('CorrelationId') ?? undefined;
291
+ const { vivaCode, vivaMessage } = this._parseErrorBody(text);
292
+ throw new VivaApiError({
293
+ message: vivaMessage ?? `Viva API error (HTTP ${response.status})`,
294
+ httpStatus: response.status,
295
+ vivaCode,
296
+ requestId,
297
+ vivaCorrelationId,
298
+ vivaEventId,
299
+ });
300
+ }
301
+ // --- other 4xx ---
302
+ {
303
+ const requestId = response.headers.get('Cf-Ray') ?? response.headers.get('CorrelationId') ?? undefined;
304
+ const { vivaCode, vivaMessage } = this._parseErrorBody(text);
305
+ throw new VivaApiError({
306
+ message: vivaMessage ?? `Viva API error (HTTP ${response.status})`,
307
+ httpStatus: response.status,
308
+ vivaCode,
309
+ requestId,
310
+ vivaCorrelationId,
311
+ vivaEventId,
312
+ });
313
+ }
314
+ }
315
+ }
316
+ /**
317
+ * Makes a single HTTP attempt. On connection-level errors:
318
+ * - If idempotent: bubble up (outer loop handles retry).
319
+ * - If NOT idempotent: retry once on connection-level errors per plan
320
+ * Auth Flow line 319 (request never acked).
321
+ */
322
+ async _attempt(opts, token) {
323
+ const url = this._buildUrl(opts.path, opts.query);
324
+ const timeoutMs = opts.timeoutMs ?? this.defaultTimeoutMs;
325
+ const controller = new AbortController();
326
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
327
+ const headers = {
328
+ Authorization: `Bearer ${token}`,
329
+ 'Content-Type': 'application/json',
330
+ Accept: 'application/json',
331
+ };
332
+ if (opts.idempotencyKey) {
333
+ // TODO(impl): Viva's exact idempotency header name is unconfirmed.
334
+ // Using `Idempotency-Key` (RFC 8929 / widely adopted convention).
335
+ // Update if Viva docs specify a different header name.
336
+ // @see references/viva-docs/md/isv-partner-program.txt:104
337
+ headers['Idempotency-Key'] = opts.idempotencyKey;
338
+ }
339
+ const fetchOptions = {
340
+ method: opts.method,
341
+ headers,
342
+ signal: controller.signal,
343
+ };
344
+ if (opts.body !== undefined) {
345
+ fetchOptions.body = bigintSafeStringify(opts.body);
346
+ }
347
+ if (this.dispatcher) {
348
+ fetchOptions['dispatcher'] = this.dispatcher;
349
+ }
350
+ let maxConnectionRetries = opts.idempotent ? 0 : 1;
351
+ let connAttempt = 0;
352
+ // eslint-disable-next-line no-constant-condition
353
+ while (true) {
354
+ try {
355
+ const response = await this.fetchImpl(url, fetchOptions);
356
+ clearTimeout(timeoutId);
357
+ const text = await response.text();
358
+ return { response, text };
359
+ }
360
+ catch (err) {
361
+ clearTimeout(timeoutId);
362
+ const isConnectionError = this._isConnectionError(err);
363
+ const isAbort = err instanceof Error && err.name === 'AbortError';
364
+ // Aborted due to our timeout (not network) → not a connection error.
365
+ if (isAbort && !this._isBeforeAck(err)) {
366
+ throw new VivaApiError({
367
+ message: `Viva API request timed out after ${timeoutMs}ms`,
368
+ cause: err,
369
+ });
370
+ }
371
+ if ((isConnectionError || isAbort) && !opts.idempotent && connAttempt < maxConnectionRetries) {
372
+ // Non-idempotent: one retry on connection-level errors (request not acked).
373
+ connAttempt++;
374
+ continue;
375
+ }
376
+ throw new VivaApiError({
377
+ message: isAbort
378
+ ? `Viva API request timed out`
379
+ : `Viva API network error: ${err instanceof Error ? err.message : String(err)}`,
380
+ cause: err,
381
+ });
382
+ }
383
+ }
384
+ }
385
+ _buildUrl(path, query) {
386
+ const base = `${this.apiBaseUrl}${path}`;
387
+ if (!query)
388
+ return base;
389
+ const params = new URLSearchParams();
390
+ for (const [k, v] of Object.entries(query)) {
391
+ if (v !== undefined) {
392
+ params.set(k, String(v));
393
+ }
394
+ }
395
+ const qs = params.toString();
396
+ return qs ? `${base}?${qs}` : base;
397
+ }
398
+ _backoffMs(attempt) {
399
+ const base = this.backoffsMs[attempt] ?? this.backoffsMs[this.backoffsMs.length - 1] ?? 500;
400
+ const jitter = base * this.jitterRatio * (Math.random() * 2 - 1);
401
+ return Math.max(0, Math.round(base + jitter));
402
+ }
403
+ _retryAfterMs(response) {
404
+ const header = response.headers.get('Retry-After');
405
+ if (!header)
406
+ return undefined;
407
+ const seconds = parseFloat(header);
408
+ if (!isNaN(seconds))
409
+ return Math.max(0, Math.round(seconds * 1000));
410
+ // HTTP-date format — try to parse it.
411
+ const date = new Date(header).getTime();
412
+ if (!isNaN(date))
413
+ return Math.max(0, date - this.now());
414
+ return undefined;
415
+ }
416
+ _parseErrorBody(text) {
417
+ if (!text)
418
+ return {};
419
+ try {
420
+ const parsed = JSON.parse(text);
421
+ // Viva error response shape observed: { ErrorCode, Message } or similar
422
+ // TODO(impl): confirm exact Viva error body field names (ErrorCode vs error_code, Message vs message)
423
+ // @see references/viva-docs/md/isv-partner-program.txt:104
424
+ const vivaCode = typeof parsed['ErrorCode'] === 'number'
425
+ ? String(parsed['ErrorCode'])
426
+ : typeof parsed['errorCode'] === 'number'
427
+ ? String(parsed['errorCode'])
428
+ : typeof parsed['error'] === 'string'
429
+ ? parsed['error']
430
+ : undefined;
431
+ const vivaMessage = typeof parsed['Message'] === 'string'
432
+ ? parsed['Message']
433
+ : typeof parsed['message'] === 'string'
434
+ ? parsed['message']
435
+ : undefined;
436
+ return { vivaCode, vivaMessage };
437
+ }
438
+ catch {
439
+ return {};
440
+ }
441
+ }
442
+ _isConnectionError(err) {
443
+ if (!(err instanceof Error))
444
+ return false;
445
+ const code = err.code;
446
+ if (code && CONNECTION_ERROR_CODES.has(code))
447
+ return true;
448
+ // undici-specific
449
+ if (err.message.includes('ECONNRESET') || err.message.includes('ENOTFOUND'))
450
+ return true;
451
+ return false;
452
+ }
453
+ /**
454
+ * Heuristic: was the abort triggered before any byte was received?
455
+ * Since AbortError doesn't carry this info directly, we treat all AbortErrors
456
+ * from our own timeout as "possibly not acked" — safe for non-idempotent retry.
457
+ */
458
+ _isBeforeAck(_err) {
459
+ return true;
460
+ }
461
+ _sleep(ms) {
462
+ return new Promise((resolve) => setTimeout(resolve, ms));
463
+ }
464
+ }
465
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/isv/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * viva-payments-core/isv — barrel export.
3
+ *
4
+ * Subpath: `viva-payments-core/isv`
5
+ *
6
+ * Exports the ISV-specific API client classes (Accounts, Webhooks) and the
7
+ * shared HTTP client. Also re-exports `Payments` and `BasicAuthClient` under
8
+ * their previous names (`IsvPayments`, `LegacyBasicClient`) as deprecated
9
+ * aliases for one-minor back-compat — these will be removed in 0.3.0.
10
+ *
11
+ * @see references/viva-docs/md/isv-partner-program.txt:104
12
+ * @see references/viva-docs/md/payment-isv-api.txt:1
13
+ */
14
+ export { IsvHttpClient } from './client.js';
15
+ export type { IsvHttpClientConfig } from './client.js';
16
+ export { IsvAccounts } from './accounts.js';
17
+ export { IsvWebhooks } from './webhooks-api.js';
18
+ export { IsvSources } from './sources.js';
19
+ export type { CreateEcommerceSourceInput, CreatePhysicalSourceInput, SourceResponse, } from './sources.js';
20
+ import { Payments } from '../payments/index.js';
21
+ import type { IsvHttpClient } from './client.js';
22
+ import { BasicAuthClient } from '../legacy/index.js';
23
+ import type { BasicAuthClientConfig, LegacyApiResult, MerchantBasicAuthClientConfig } from '../legacy/index.js';
24
+ /**
25
+ * @deprecated Use `Payments` from `@sakeetech/viva-payments-core/payments`
26
+ * with `mode: 'isv'` explicitly set. Will be removed in 0.3.0.
27
+ *
28
+ * Back-compat wrapper that preserves the pre-slice-2 positional constructor
29
+ * signature and pins `mode: 'isv'` on the underlying {@link Payments} class.
30
+ * Existing call sites such as `new IsvPayments(client, undefined, legacyClient)`
31
+ * continue to compile and behave as before.
32
+ */
33
+ export declare class IsvPayments extends Payments {
34
+ constructor(client: IsvHttpClient, secondaryClient?: IsvHttpClient, legacyClient?: BasicAuthClient);
35
+ }
36
+ /**
37
+ * @deprecated Renamed to `BasicAuthClient` — import from
38
+ * `@sakeetech/viva-payments-core/legacy`. Will be removed in 0.3.0.
39
+ *
40
+ * Back-compat wrapper that always pins `authVariant: 'merchant'` on the
41
+ * underlying {@link BasicAuthClient}. Pre-slice-4 adapter call sites that
42
+ * construct `LegacyBasicClient` with `{ environment, merchantId, apiKey }`
43
+ * continue to compile and behave identically.
44
+ */
45
+ export declare class LegacyBasicClient extends BasicAuthClient {
46
+ constructor(opts: Omit<MerchantBasicAuthClientConfig, 'authVariant'>);
47
+ }
48
+ /** @deprecated Renamed to `BasicAuthClientConfig` — import from `@sakeetech/viva-payments-core/legacy`. Will be removed in 0.3.0. */
49
+ export type LegacyBasicClientConfig = BasicAuthClientConfig;
50
+ /** @deprecated Import from `@sakeetech/viva-payments-core/legacy`. Will be removed in 0.3.0. */
51
+ export type { LegacyApiResult };
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/isv/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EACV,qBAAqB,EACrB,eAAe,EACf,6BAA6B,EAC9B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,QAAQ;gBAErC,MAAM,EAAE,aAAa,EACrB,eAAe,CAAC,EAAE,aAAa,EAC/B,YAAY,CAAC,EAAE,eAAe;CASjC;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,IAAI,EAAE,IAAI,CAAC,6BAA6B,EAAE,aAAa,CAAC;CAGrE;AAED,qIAAqI;AACrI,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE5D,gGAAgG;AAChG,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * viva-payments-core/isv — barrel export.
3
+ *
4
+ * Subpath: `viva-payments-core/isv`
5
+ *
6
+ * Exports the ISV-specific API client classes (Accounts, Webhooks) and the
7
+ * shared HTTP client. Also re-exports `Payments` and `BasicAuthClient` under
8
+ * their previous names (`IsvPayments`, `LegacyBasicClient`) as deprecated
9
+ * aliases for one-minor back-compat — these will be removed in 0.3.0.
10
+ *
11
+ * @see references/viva-docs/md/isv-partner-program.txt:104
12
+ * @see references/viva-docs/md/payment-isv-api.txt:1
13
+ */
14
+ export { IsvHttpClient } from './client.js';
15
+ export { IsvAccounts } from './accounts.js';
16
+ export { IsvWebhooks } from './webhooks-api.js';
17
+ export { IsvSources } from './sources.js';
18
+ import { Payments } from '../payments/index.js';
19
+ import { BasicAuthClient } from '../legacy/index.js';
20
+ /**
21
+ * @deprecated Use `Payments` from `@sakeetech/viva-payments-core/payments`
22
+ * with `mode: 'isv'` explicitly set. Will be removed in 0.3.0.
23
+ *
24
+ * Back-compat wrapper that preserves the pre-slice-2 positional constructor
25
+ * signature and pins `mode: 'isv'` on the underlying {@link Payments} class.
26
+ * Existing call sites such as `new IsvPayments(client, undefined, legacyClient)`
27
+ * continue to compile and behave as before.
28
+ */
29
+ export class IsvPayments extends Payments {
30
+ constructor(client, secondaryClient, legacyClient) {
31
+ super({
32
+ mode: 'isv',
33
+ client,
34
+ ...(secondaryClient !== undefined ? { secondaryClient } : {}),
35
+ ...(legacyClient !== undefined ? { legacyClient } : {}),
36
+ });
37
+ }
38
+ }
39
+ /**
40
+ * @deprecated Renamed to `BasicAuthClient` — import from
41
+ * `@sakeetech/viva-payments-core/legacy`. Will be removed in 0.3.0.
42
+ *
43
+ * Back-compat wrapper that always pins `authVariant: 'merchant'` on the
44
+ * underlying {@link BasicAuthClient}. Pre-slice-4 adapter call sites that
45
+ * construct `LegacyBasicClient` with `{ environment, merchantId, apiKey }`
46
+ * continue to compile and behave identically.
47
+ */
48
+ export class LegacyBasicClient extends BasicAuthClient {
49
+ constructor(opts) {
50
+ super({ authVariant: 'merchant', ...opts });
51
+ }
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/isv/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,YACE,MAAqB,EACrB,eAA+B,EAC/B,YAA8B;QAE9B,KAAK,CAAC;YACJ,IAAI,EAAE,KAAK;YACX,MAAM;YACN,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,IAAwD;QAClE,KAAK,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF"}