mavunta 1.0.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/LICENSE +21 -0
- package/README.md +155 -0
- package/dist/chunk-DNIDKPOQ.js +108 -0
- package/dist/chunk-DNIDKPOQ.js.map +1 -0
- package/dist/index-C_GLtIgI.d.cts +192 -0
- package/dist/index-C_GLtIgI.d.ts +192 -0
- package/dist/index.cjs +463 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +282 -0
- package/dist/index.d.ts +282 -0
- package/dist/index.js +347 -0
- package/dist/index.js.map +1 -0
- package/dist/webhooks/index.cjs +71 -0
- package/dist/webhooks/index.cjs.map +1 -0
- package/dist/webhooks/index.d.cts +1 -0
- package/dist/webhooks/index.d.ts +1 -0
- package/dist/webhooks/index.js +3 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +67 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var crypto = require('crypto');
|
|
6
|
+
|
|
7
|
+
// src/client.ts
|
|
8
|
+
|
|
9
|
+
// src/errors.ts
|
|
10
|
+
var MavuntaError = class extends Error {
|
|
11
|
+
type;
|
|
12
|
+
code;
|
|
13
|
+
param;
|
|
14
|
+
requestId;
|
|
15
|
+
statusCode;
|
|
16
|
+
docsUrl;
|
|
17
|
+
constructor(message, init = {}) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = this.constructor.name;
|
|
20
|
+
this.type = init.type ?? "api_error";
|
|
21
|
+
this.code = init.code ?? "unknown";
|
|
22
|
+
this.param = init.param ?? null;
|
|
23
|
+
this.requestId = init.requestId ?? null;
|
|
24
|
+
this.statusCode = init.statusCode ?? null;
|
|
25
|
+
this.docsUrl = init.docsUrl ?? null;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var MavuntaAPIError = class extends MavuntaError {
|
|
29
|
+
};
|
|
30
|
+
var MavuntaAuthenticationError = class extends MavuntaError {
|
|
31
|
+
};
|
|
32
|
+
var MavuntaPermissionError = class extends MavuntaError {
|
|
33
|
+
};
|
|
34
|
+
var MavuntaValidationError = class extends MavuntaError {
|
|
35
|
+
};
|
|
36
|
+
var MavuntaIdempotencyError = class extends MavuntaError {
|
|
37
|
+
};
|
|
38
|
+
var MavuntaConnectionError = class extends MavuntaError {
|
|
39
|
+
};
|
|
40
|
+
var MavuntaTimeoutError = class extends MavuntaError {
|
|
41
|
+
};
|
|
42
|
+
var MavuntaWebhookSignatureError = class extends MavuntaError {
|
|
43
|
+
};
|
|
44
|
+
var MavuntaRateLimitError = class extends MavuntaError {
|
|
45
|
+
retryAfterMs;
|
|
46
|
+
constructor(message, init = {}) {
|
|
47
|
+
super(message, init);
|
|
48
|
+
this.retryAfterMs = init.retryAfterMs ?? null;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
function errorFromResponse(status, body, retryAfterMs = null) {
|
|
52
|
+
const init = {
|
|
53
|
+
type: body?.type,
|
|
54
|
+
code: body?.code,
|
|
55
|
+
param: body?.param ?? null,
|
|
56
|
+
requestId: body?.request_id ?? null,
|
|
57
|
+
statusCode: status,
|
|
58
|
+
docsUrl: body?.docs_url ?? null
|
|
59
|
+
};
|
|
60
|
+
const message = body?.message ?? `Mavunta API error (HTTP ${status})`;
|
|
61
|
+
if (status === 401) return new MavuntaAuthenticationError(message, init);
|
|
62
|
+
if (status === 403) return new MavuntaPermissionError(message, init);
|
|
63
|
+
if (status === 429) return new MavuntaRateLimitError(message, { ...init, retryAfterMs });
|
|
64
|
+
if (status === 409 || body?.type === "idempotency_error")
|
|
65
|
+
return new MavuntaIdempotencyError(message, init);
|
|
66
|
+
if (status === 400 || status === 422 || body?.type === "validation_error")
|
|
67
|
+
return new MavuntaValidationError(message, init);
|
|
68
|
+
return new MavuntaAPIError(message, init);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/resources/auth.ts
|
|
72
|
+
var AuthResource = class {
|
|
73
|
+
constructor(client) {
|
|
74
|
+
this.client = client;
|
|
75
|
+
}
|
|
76
|
+
client;
|
|
77
|
+
/** Verify the current API key and return its merchant, scopes, and mode. */
|
|
78
|
+
verify() {
|
|
79
|
+
return this.client.request("GET", "/auth/verify");
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/resources/rates.ts
|
|
84
|
+
var RatesResource = class {
|
|
85
|
+
constructor(client) {
|
|
86
|
+
this.client = client;
|
|
87
|
+
}
|
|
88
|
+
client;
|
|
89
|
+
/** Current indicative FX and crypto rates used for quotes. */
|
|
90
|
+
retrieve() {
|
|
91
|
+
return this.client.request("GET", "/rates");
|
|
92
|
+
}
|
|
93
|
+
/** Alias for {@link retrieve}. */
|
|
94
|
+
list() {
|
|
95
|
+
return this.retrieve();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// src/resources/quotes.ts
|
|
100
|
+
var QuotesResource = class {
|
|
101
|
+
constructor(client) {
|
|
102
|
+
this.client = client;
|
|
103
|
+
}
|
|
104
|
+
client;
|
|
105
|
+
/** Create a short-lived quote locking a rate for a conversion. */
|
|
106
|
+
create(params) {
|
|
107
|
+
return this.client.request("POST", "/quotes", { body: params });
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// src/resources/payment-intents.ts
|
|
112
|
+
var PaymentIntentsResource = class {
|
|
113
|
+
constructor(client) {
|
|
114
|
+
this.client = client;
|
|
115
|
+
}
|
|
116
|
+
client;
|
|
117
|
+
/** Create a payment intent and get a `checkout_url` to send the customer to. */
|
|
118
|
+
create(params, options = {}) {
|
|
119
|
+
return this.client.request("POST", "/payment-intents", {
|
|
120
|
+
body: params,
|
|
121
|
+
idempotencyKey: options.idempotencyKey
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
retrieve(id) {
|
|
125
|
+
return this.client.request("GET", `/payment-intents/${encodeURIComponent(id)}`);
|
|
126
|
+
}
|
|
127
|
+
list(params = {}) {
|
|
128
|
+
return this.client.request("GET", "/payment-intents", { query: { ...params } });
|
|
129
|
+
}
|
|
130
|
+
/** Cancel an intent that has not been paid yet. */
|
|
131
|
+
cancel(id) {
|
|
132
|
+
return this.client.request("POST", `/payment-intents/${encodeURIComponent(id)}/cancel`);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// src/resources/payment-links.ts
|
|
137
|
+
var PaymentLinksResource = class {
|
|
138
|
+
constructor(client) {
|
|
139
|
+
this.client = client;
|
|
140
|
+
}
|
|
141
|
+
client;
|
|
142
|
+
/** Create a reusable payment link (with a hosted page + QR). */
|
|
143
|
+
create(params, options = {}) {
|
|
144
|
+
return this.client.request("POST", "/payment-links", {
|
|
145
|
+
body: params,
|
|
146
|
+
idempotencyKey: options.idempotencyKey
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
retrieve(id) {
|
|
150
|
+
return this.client.request("GET", `/payment-links/${encodeURIComponent(id)}`);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// src/resources/customers.ts
|
|
155
|
+
var CustomersResource = class {
|
|
156
|
+
constructor(client) {
|
|
157
|
+
this.client = client;
|
|
158
|
+
}
|
|
159
|
+
client;
|
|
160
|
+
create(params, options = {}) {
|
|
161
|
+
return this.client.request("POST", "/customers", {
|
|
162
|
+
body: params,
|
|
163
|
+
idempotencyKey: options.idempotencyKey
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
retrieve(id) {
|
|
167
|
+
return this.client.request("GET", `/customers/${encodeURIComponent(id)}`);
|
|
168
|
+
}
|
|
169
|
+
list(params = {}) {
|
|
170
|
+
return this.client.request("GET", "/customers", { query: { ...params } });
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// src/resources/refunds.ts
|
|
175
|
+
var RefundsResource = class {
|
|
176
|
+
constructor(client) {
|
|
177
|
+
this.client = client;
|
|
178
|
+
}
|
|
179
|
+
client;
|
|
180
|
+
/**
|
|
181
|
+
* Refund a paid payment in full. Partial refunds are not supported, and a
|
|
182
|
+
* payment can have at most one refund (a repeat after success rejects with
|
|
183
|
+
* `already_refunded`).
|
|
184
|
+
*/
|
|
185
|
+
create(params, options = {}) {
|
|
186
|
+
return this.client.request("POST", "/refunds", {
|
|
187
|
+
body: params,
|
|
188
|
+
idempotencyKey: options.idempotencyKey
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
retrieve(id) {
|
|
192
|
+
return this.client.request("GET", `/refunds/${encodeURIComponent(id)}`);
|
|
193
|
+
}
|
|
194
|
+
list(params = {}) {
|
|
195
|
+
return this.client.request("GET", "/refunds", { query: { ...params } });
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// src/resources/balances.ts
|
|
200
|
+
var BalancesResource = class {
|
|
201
|
+
constructor(client) {
|
|
202
|
+
this.client = client;
|
|
203
|
+
}
|
|
204
|
+
client;
|
|
205
|
+
/** Retrieve the merchant's available and pending balances by asset. */
|
|
206
|
+
retrieve() {
|
|
207
|
+
return this.client.request("GET", "/balances");
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// src/resources/settlements.ts
|
|
212
|
+
var SettlementsResource = class {
|
|
213
|
+
constructor(client) {
|
|
214
|
+
this.client = client;
|
|
215
|
+
}
|
|
216
|
+
client;
|
|
217
|
+
list(params = {}) {
|
|
218
|
+
return this.client.request("GET", "/settlements", { query: { ...params } });
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// src/resources/reports.ts
|
|
223
|
+
var ReportsResource = class {
|
|
224
|
+
constructor(client) {
|
|
225
|
+
this.client = client;
|
|
226
|
+
}
|
|
227
|
+
client;
|
|
228
|
+
/** Tabular payments report for reconciliation. */
|
|
229
|
+
payments(params = {}) {
|
|
230
|
+
return this.client.request("GET", "/reports/payments", { query: { ...params } });
|
|
231
|
+
}
|
|
232
|
+
/** Tabular settlements report for reconciliation. */
|
|
233
|
+
settlements(params = {}) {
|
|
234
|
+
return this.client.request("GET", "/reports/settlements", { query: { ...params } });
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// src/resources/webhook-endpoints.ts
|
|
239
|
+
var WebhookEndpointsResource = class {
|
|
240
|
+
constructor(client) {
|
|
241
|
+
this.client = client;
|
|
242
|
+
}
|
|
243
|
+
client;
|
|
244
|
+
create(params, options = {}) {
|
|
245
|
+
return this.client.request("POST", "/webhook_endpoints", {
|
|
246
|
+
body: params,
|
|
247
|
+
idempotencyKey: options.idempotencyKey
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
retrieve(id) {
|
|
251
|
+
return this.client.request("GET", `/webhook_endpoints/${encodeURIComponent(id)}`);
|
|
252
|
+
}
|
|
253
|
+
list(params = {}) {
|
|
254
|
+
return this.client.request("GET", "/webhook_endpoints", { query: { ...params } });
|
|
255
|
+
}
|
|
256
|
+
delete(id) {
|
|
257
|
+
return this.client.request("DELETE", `/webhook_endpoints/${encodeURIComponent(id)}`);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
// src/resources/webhook-events.ts
|
|
262
|
+
var WebhookEventsResource = class {
|
|
263
|
+
constructor(client) {
|
|
264
|
+
this.client = client;
|
|
265
|
+
}
|
|
266
|
+
client;
|
|
267
|
+
list(params = {}) {
|
|
268
|
+
return this.client.request("GET", "/webhook_events", { query: { ...params } });
|
|
269
|
+
}
|
|
270
|
+
retrieve(id) {
|
|
271
|
+
return this.client.request("GET", `/webhook_events/${encodeURIComponent(id)}`);
|
|
272
|
+
}
|
|
273
|
+
/** Re-deliver an event to all subscribed endpoints. */
|
|
274
|
+
resend(id) {
|
|
275
|
+
return this.client.request("POST", `/webhook_events/${encodeURIComponent(id)}/resend`);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
// src/resources/sandbox.ts
|
|
280
|
+
var SandboxResource = class {
|
|
281
|
+
constructor(client) {
|
|
282
|
+
this.client = client;
|
|
283
|
+
}
|
|
284
|
+
client;
|
|
285
|
+
/** Fire a simulated webhook event to your configured endpoints. */
|
|
286
|
+
triggerWebhook(params) {
|
|
287
|
+
return this.client.request("POST", "/sandbox/webhooks/trigger", { body: params });
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
function fail(message) {
|
|
291
|
+
throw new MavuntaWebhookSignatureError(message, { type: "webhook_signature_error", code: "invalid_signature" });
|
|
292
|
+
}
|
|
293
|
+
function verifyWebhook(params) {
|
|
294
|
+
const { signature, timestamp, secret } = params;
|
|
295
|
+
if (!signature) fail("Missing Mavunta-Signature header.");
|
|
296
|
+
if (!timestamp) fail("Missing Mavunta-Timestamp header.");
|
|
297
|
+
if (!secret) fail("Missing webhook signing secret.");
|
|
298
|
+
const raw = typeof params.payload === "string" ? params.payload : params.payload.toString("utf8");
|
|
299
|
+
const tolerance = params.toleranceSec ?? 300;
|
|
300
|
+
const ts = Number(timestamp);
|
|
301
|
+
if (!Number.isFinite(ts)) fail("Invalid Mavunta-Timestamp header.");
|
|
302
|
+
if (Math.abs(Date.now() / 1e3 - ts) > tolerance) fail("Timestamp outside the tolerance window.");
|
|
303
|
+
const expected = crypto.createHmac("sha256", secret).update(`${timestamp}.${raw}`).digest("hex");
|
|
304
|
+
let a;
|
|
305
|
+
let b;
|
|
306
|
+
try {
|
|
307
|
+
a = Buffer.from(expected, "hex");
|
|
308
|
+
b = Buffer.from(signature, "hex");
|
|
309
|
+
} catch {
|
|
310
|
+
fail("Malformed signature.");
|
|
311
|
+
}
|
|
312
|
+
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) fail("Signature mismatch.");
|
|
313
|
+
return JSON.parse(raw);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// src/webhooks/index.ts
|
|
317
|
+
var WebhooksResource = class {
|
|
318
|
+
/** Verify a webhook signature and return the parsed event, or throw. */
|
|
319
|
+
verify(params) {
|
|
320
|
+
return verifyWebhook(params);
|
|
321
|
+
}
|
|
322
|
+
/** Alias of {@link verify}, matching the wording in some platform docs. */
|
|
323
|
+
constructEvent(params) {
|
|
324
|
+
return verifyWebhook(params);
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
// src/client.ts
|
|
329
|
+
var DEFAULT_BASE_URL = "https://api.mavunta.com/v1";
|
|
330
|
+
var API_VERSION = "2026-06-01";
|
|
331
|
+
var SDK_VERSION = "1.0.0";
|
|
332
|
+
function sleep(ms) {
|
|
333
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
334
|
+
}
|
|
335
|
+
function parseRetryAfterMs(header) {
|
|
336
|
+
if (!header) return null;
|
|
337
|
+
const seconds = Number(header);
|
|
338
|
+
if (Number.isFinite(seconds)) return Math.max(0, seconds * 1e3);
|
|
339
|
+
const date = Date.parse(header);
|
|
340
|
+
return Number.isFinite(date) ? Math.max(0, date - Date.now()) : null;
|
|
341
|
+
}
|
|
342
|
+
var Mavunta = class {
|
|
343
|
+
auth;
|
|
344
|
+
rates;
|
|
345
|
+
quotes;
|
|
346
|
+
paymentIntents;
|
|
347
|
+
paymentLinks;
|
|
348
|
+
customers;
|
|
349
|
+
refunds;
|
|
350
|
+
balances;
|
|
351
|
+
settlements;
|
|
352
|
+
reports;
|
|
353
|
+
webhookEndpoints;
|
|
354
|
+
webhookEvents;
|
|
355
|
+
sandbox;
|
|
356
|
+
/** Webhook signature verification (no network call). */
|
|
357
|
+
webhooks;
|
|
358
|
+
secretKey;
|
|
359
|
+
baseUrl;
|
|
360
|
+
timeoutMs;
|
|
361
|
+
maxRetries;
|
|
362
|
+
constructor(options) {
|
|
363
|
+
if (!options || !options.secretKey) {
|
|
364
|
+
throw new Error("Mavunta: `secretKey` is required.");
|
|
365
|
+
}
|
|
366
|
+
if (/_pk_/.test(options.secretKey)) {
|
|
367
|
+
throw new Error(
|
|
368
|
+
"Mavunta: a public key (pk_) cannot be used here. The server SDK needs a secret (sk_) or restricted (rk_) key."
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
this.secretKey = options.secretKey;
|
|
372
|
+
this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
|
|
373
|
+
this.timeoutMs = options.timeoutMs ?? 3e4;
|
|
374
|
+
this.maxRetries = Math.max(0, options.maxRetries ?? 2);
|
|
375
|
+
this.auth = new AuthResource(this);
|
|
376
|
+
this.rates = new RatesResource(this);
|
|
377
|
+
this.quotes = new QuotesResource(this);
|
|
378
|
+
this.paymentIntents = new PaymentIntentsResource(this);
|
|
379
|
+
this.paymentLinks = new PaymentLinksResource(this);
|
|
380
|
+
this.customers = new CustomersResource(this);
|
|
381
|
+
this.refunds = new RefundsResource(this);
|
|
382
|
+
this.balances = new BalancesResource(this);
|
|
383
|
+
this.settlements = new SettlementsResource(this);
|
|
384
|
+
this.reports = new ReportsResource(this);
|
|
385
|
+
this.webhookEndpoints = new WebhookEndpointsResource(this);
|
|
386
|
+
this.webhookEvents = new WebhookEventsResource(this);
|
|
387
|
+
this.sandbox = new SandboxResource(this);
|
|
388
|
+
this.webhooks = new WebhooksResource();
|
|
389
|
+
}
|
|
390
|
+
/** @internal Used by resource classes; not part of the public surface. */
|
|
391
|
+
async request(method, path, opts = {}) {
|
|
392
|
+
const url = new URL(this.baseUrl + path);
|
|
393
|
+
if (opts.query) {
|
|
394
|
+
for (const [key, value] of Object.entries(opts.query)) {
|
|
395
|
+
if (value !== void 0) url.searchParams.set(key, String(value));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const headers = {
|
|
399
|
+
Authorization: `Bearer ${this.secretKey}`,
|
|
400
|
+
Accept: "application/json",
|
|
401
|
+
"Mavunta-Version": API_VERSION,
|
|
402
|
+
"User-Agent": `mavunta-sdk/${SDK_VERSION}`
|
|
403
|
+
};
|
|
404
|
+
if (opts.body !== void 0) headers["Content-Type"] = "application/json";
|
|
405
|
+
const idempotencyKey = opts.idempotencyKey ?? (method === "POST" ? `cwk_sdk_${crypto.randomUUID()}` : void 0);
|
|
406
|
+
if (idempotencyKey) headers["Idempotency-Key"] = idempotencyKey;
|
|
407
|
+
let lastError;
|
|
408
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
409
|
+
try {
|
|
410
|
+
const res = await fetch(url, {
|
|
411
|
+
method,
|
|
412
|
+
headers,
|
|
413
|
+
body: opts.body !== void 0 ? JSON.stringify(opts.body) : void 0,
|
|
414
|
+
signal: AbortSignal.timeout(this.timeoutMs)
|
|
415
|
+
});
|
|
416
|
+
const text = await res.text();
|
|
417
|
+
const json = text ? JSON.parse(text) : {};
|
|
418
|
+
if (res.ok) return json;
|
|
419
|
+
if ((res.status === 429 || res.status >= 500) && attempt < this.maxRetries) {
|
|
420
|
+
const retryAfter = parseRetryAfterMs(res.headers.get("retry-after"));
|
|
421
|
+
await sleep(retryAfter ?? 250 * 2 ** attempt);
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
const body = json.error ?? null;
|
|
425
|
+
throw errorFromResponse(res.status, body, parseRetryAfterMs(res.headers.get("retry-after")));
|
|
426
|
+
} catch (err) {
|
|
427
|
+
if (err instanceof Error && err.name.startsWith("Mavunta")) throw err;
|
|
428
|
+
lastError = err;
|
|
429
|
+
const isTimeout = err instanceof Error && err.name === "TimeoutError";
|
|
430
|
+
if (attempt < this.maxRetries) {
|
|
431
|
+
await sleep(250 * 2 ** attempt);
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
if (isTimeout) {
|
|
435
|
+
throw new MavuntaTimeoutError(`Mavunta: request timed out after ${this.timeoutMs}ms.`, {
|
|
436
|
+
code: "timeout"
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
throw new MavuntaConnectionError(
|
|
442
|
+
`Mavunta: request failed (${lastError instanceof Error ? lastError.message : String(lastError)}).`,
|
|
443
|
+
{ code: "connection_error" }
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
exports.Mavunta = Mavunta;
|
|
449
|
+
exports.MavuntaAPIError = MavuntaAPIError;
|
|
450
|
+
exports.MavuntaAuthenticationError = MavuntaAuthenticationError;
|
|
451
|
+
exports.MavuntaConnectionError = MavuntaConnectionError;
|
|
452
|
+
exports.MavuntaError = MavuntaError;
|
|
453
|
+
exports.MavuntaIdempotencyError = MavuntaIdempotencyError;
|
|
454
|
+
exports.MavuntaPermissionError = MavuntaPermissionError;
|
|
455
|
+
exports.MavuntaRateLimitError = MavuntaRateLimitError;
|
|
456
|
+
exports.MavuntaTimeoutError = MavuntaTimeoutError;
|
|
457
|
+
exports.MavuntaValidationError = MavuntaValidationError;
|
|
458
|
+
exports.MavuntaWebhookSignatureError = MavuntaWebhookSignatureError;
|
|
459
|
+
exports.WebhooksResource = WebhooksResource;
|
|
460
|
+
exports.default = Mavunta;
|
|
461
|
+
exports.verifyWebhook = verifyWebhook;
|
|
462
|
+
//# sourceMappingURL=index.cjs.map
|
|
463
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/resources/auth.ts","../src/resources/rates.ts","../src/resources/quotes.ts","../src/resources/payment-intents.ts","../src/resources/payment-links.ts","../src/resources/customers.ts","../src/resources/refunds.ts","../src/resources/balances.ts","../src/resources/settlements.ts","../src/resources/reports.ts","../src/resources/webhook-endpoints.ts","../src/resources/webhook-events.ts","../src/resources/sandbox.ts","../src/webhooks/verify.ts","../src/webhooks/index.ts","../src/client.ts"],"names":["createHmac","timingSafeEqual","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Error hierarchy for the Mavunta SDK.\r\n *\r\n * Every failure surfaces as a {@link MavuntaError} subclass so callers can\r\n * branch on the type and read `code` / `requestId` for support. The shape\r\n * mirrors the API's error envelope (spec §24):\r\n *\r\n * { error: { type, code, message, param, request_id, docs_url } }\r\n */\r\n\r\nexport interface MavuntaErrorBody {\r\n type?: string\r\n code?: string\r\n message?: string\r\n param?: string | null\r\n request_id?: string\r\n docs_url?: string\r\n}\r\n\r\nexport interface MavuntaErrorInit {\r\n type?: string\r\n code?: string\r\n param?: string | null\r\n requestId?: string | null\r\n statusCode?: number | null\r\n docsUrl?: string | null\r\n}\r\n\r\n/** Base class for everything thrown by the SDK. */\r\nexport class MavuntaError extends Error {\r\n readonly type: string\r\n readonly code: string\r\n readonly param: string | null\r\n readonly requestId: string | null\r\n readonly statusCode: number | null\r\n readonly docsUrl: string | null\r\n\r\n constructor(message: string, init: MavuntaErrorInit = {}) {\r\n super(message)\r\n this.name = this.constructor.name\r\n this.type = init.type ?? 'api_error'\r\n this.code = init.code ?? 'unknown'\r\n this.param = init.param ?? null\r\n this.requestId = init.requestId ?? null\r\n this.statusCode = init.statusCode ?? null\r\n this.docsUrl = init.docsUrl ?? null\r\n }\r\n}\r\n\r\n/** A non-2xx response that does not map to a more specific class. */\r\nexport class MavuntaAPIError extends MavuntaError {}\r\n/** 401: missing, invalid, or revoked API key. */\r\nexport class MavuntaAuthenticationError extends MavuntaError {}\r\n/** 403: the key is valid but lacks the scope for this action. */\r\nexport class MavuntaPermissionError extends MavuntaError {}\r\n/** 400 / 422: the request was malformed or failed validation. */\r\nexport class MavuntaValidationError extends MavuntaError {}\r\n/** 409 on a money-moving create with a reused idempotency key. */\r\nexport class MavuntaIdempotencyError extends MavuntaError {}\r\n/** A network failure before a response was received. */\r\nexport class MavuntaConnectionError extends MavuntaError {}\r\n/** The request exceeded the configured timeout. */\r\nexport class MavuntaTimeoutError extends MavuntaError {}\r\n/** Webhook signature verification failed. */\r\nexport class MavuntaWebhookSignatureError extends MavuntaError {}\r\n\r\n/** 429: too many requests. `retryAfterMs` is parsed from `retry-after`. */\r\nexport class MavuntaRateLimitError extends MavuntaError {\r\n readonly retryAfterMs: number | null\r\n constructor(message: string, init: MavuntaErrorInit & { retryAfterMs?: number | null } = {}) {\r\n super(message, init)\r\n this.retryAfterMs = init.retryAfterMs ?? null\r\n }\r\n}\r\n\r\n/**\r\n * Build the right error subclass from an HTTP status + the parsed body. Used by\r\n * the client for every non-2xx response.\r\n */\r\nexport function errorFromResponse(\r\n status: number,\r\n body: MavuntaErrorBody | null,\r\n retryAfterMs: number | null = null,\r\n): MavuntaError {\r\n const init: MavuntaErrorInit = {\r\n type: body?.type,\r\n code: body?.code,\r\n param: body?.param ?? null,\r\n requestId: body?.request_id ?? null,\r\n statusCode: status,\r\n docsUrl: body?.docs_url ?? null,\r\n }\r\n const message = body?.message ?? `Mavunta API error (HTTP ${status})`\r\n\r\n if (status === 401) return new MavuntaAuthenticationError(message, init)\r\n if (status === 403) return new MavuntaPermissionError(message, init)\r\n if (status === 429) return new MavuntaRateLimitError(message, { ...init, retryAfterMs })\r\n if (status === 409 || body?.type === 'idempotency_error')\r\n return new MavuntaIdempotencyError(message, init)\r\n if (status === 400 || status === 422 || body?.type === 'validation_error')\r\n return new MavuntaValidationError(message, init)\r\n return new MavuntaAPIError(message, init)\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { AuthVerifyResult } from '../types.js'\r\n\r\nexport class AuthResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Verify the current API key and return its merchant, scopes, and mode. */\r\n verify(): Promise<AuthVerifyResult> {\r\n return this.client.request('GET', '/auth/verify')\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\n\r\nexport class RatesResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Current indicative FX and crypto rates used for quotes. */\r\n retrieve(): Promise<Record<string, unknown>> {\r\n return this.client.request('GET', '/rates')\r\n }\r\n\r\n /** Alias for {@link retrieve}. */\r\n list(): Promise<Record<string, unknown>> {\r\n return this.retrieve()\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\n\r\nexport interface CreateQuoteParams {\r\n source_currency: string\r\n target_asset: string\r\n amount: string\r\n side?: 'customer_pays' | 'merchant_receives'\r\n}\r\n\r\nexport class QuotesResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Create a short-lived quote locking a rate for a conversion. */\r\n create(params: CreateQuoteParams): Promise<Record<string, unknown>> {\r\n return this.client.request('POST', '/quotes', { body: params })\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type {\r\n CreatePaymentIntentParams,\r\n ListResponse,\r\n PaymentIntent,\r\n RequestOptions,\r\n} from '../types.js'\r\n\r\nexport interface ListPaymentIntentsParams {\r\n limit?: number\r\n starting_after?: string\r\n status?: string\r\n}\r\n\r\nexport class PaymentIntentsResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Create a payment intent and get a `checkout_url` to send the customer to. */\r\n create(\r\n params: CreatePaymentIntentParams,\r\n options: RequestOptions = {},\r\n ): Promise<PaymentIntent> {\r\n return this.client.request('POST', '/payment-intents', {\r\n body: params,\r\n idempotencyKey: options.idempotencyKey,\r\n })\r\n }\r\n\r\n retrieve(id: string): Promise<PaymentIntent> {\r\n return this.client.request('GET', `/payment-intents/${encodeURIComponent(id)}`)\r\n }\r\n\r\n list(params: ListPaymentIntentsParams = {}): Promise<ListResponse<PaymentIntent>> {\r\n return this.client.request('GET', '/payment-intents', { query: { ...params } })\r\n }\r\n\r\n /** Cancel an intent that has not been paid yet. */\r\n cancel(id: string): Promise<PaymentIntent> {\r\n return this.client.request('POST', `/payment-intents/${encodeURIComponent(id)}/cancel`)\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { CreatePaymentLinkParams, PaymentLink, RequestOptions } from '../types.js'\r\n\r\nexport class PaymentLinksResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Create a reusable payment link (with a hosted page + QR). */\r\n create(params: CreatePaymentLinkParams, options: RequestOptions = {}): Promise<PaymentLink> {\r\n return this.client.request('POST', '/payment-links', {\r\n body: params,\r\n idempotencyKey: options.idempotencyKey,\r\n })\r\n }\r\n\r\n retrieve(id: string): Promise<PaymentLink> {\r\n return this.client.request('GET', `/payment-links/${encodeURIComponent(id)}`)\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { CreateCustomerParams, Customer, ListResponse, RequestOptions } from '../types.js'\r\n\r\nexport interface ListCustomersParams {\r\n limit?: number\r\n starting_after?: string\r\n email?: string\r\n}\r\n\r\nexport class CustomersResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n create(params: CreateCustomerParams, options: RequestOptions = {}): Promise<Customer> {\r\n return this.client.request('POST', '/customers', {\r\n body: params,\r\n idempotencyKey: options.idempotencyKey,\r\n })\r\n }\r\n\r\n retrieve(id: string): Promise<Customer> {\r\n return this.client.request('GET', `/customers/${encodeURIComponent(id)}`)\r\n }\r\n\r\n list(params: ListCustomersParams = {}): Promise<ListResponse<Customer>> {\r\n return this.client.request('GET', '/customers', { query: { ...params } })\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { ListResponse, Refund, RequestOptions } from '../types.js'\r\n\r\nexport interface CreateRefundParams {\r\n payment_intent: string\r\n reason?: string\r\n}\r\n\r\nexport class RefundsResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /**\r\n * Refund a paid payment in full. Partial refunds are not supported, and a\r\n * payment can have at most one refund (a repeat after success rejects with\r\n * `already_refunded`).\r\n */\r\n create(params: CreateRefundParams, options: RequestOptions = {}): Promise<Refund> {\r\n return this.client.request('POST', '/refunds', {\r\n body: params,\r\n idempotencyKey: options.idempotencyKey,\r\n })\r\n }\r\n\r\n retrieve(id: string): Promise<Refund> {\r\n return this.client.request('GET', `/refunds/${encodeURIComponent(id)}`)\r\n }\r\n\r\n list(params: { limit?: number; starting_after?: string } = {}): Promise<ListResponse<Refund>> {\r\n return this.client.request('GET', '/refunds', { query: { ...params } })\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { Balance } from '../types.js'\r\n\r\nexport class BalancesResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Retrieve the merchant's available and pending balances by asset. */\r\n retrieve(): Promise<Balance> {\r\n return this.client.request('GET', '/balances')\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { ListResponse, Settlement } from '../types.js'\r\n\r\nexport interface ListSettlementsParams {\r\n limit?: number\r\n starting_after?: string\r\n status?: string\r\n}\r\n\r\nexport class SettlementsResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n list(params: ListSettlementsParams = {}): Promise<ListResponse<Settlement>> {\r\n return this.client.request('GET', '/settlements', { query: { ...params } })\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\n\r\nexport interface ReportParams {\r\n /** ISO date or unix-seconds range bound, per the API docs. */\r\n from?: string\r\n to?: string\r\n limit?: number\r\n starting_after?: string\r\n}\r\n\r\nexport class ReportsResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Tabular payments report for reconciliation. */\r\n payments(params: ReportParams = {}): Promise<Record<string, unknown>> {\r\n return this.client.request('GET', '/reports/payments', { query: { ...params } })\r\n }\r\n\r\n /** Tabular settlements report for reconciliation. */\r\n settlements(params: ReportParams = {}): Promise<Record<string, unknown>> {\r\n return this.client.request('GET', '/reports/settlements', { query: { ...params } })\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type {\r\n CreateWebhookEndpointParams,\r\n ListResponse,\r\n RequestOptions,\r\n WebhookEndpoint,\r\n} from '../types.js'\r\n\r\nexport class WebhookEndpointsResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n create(\r\n params: CreateWebhookEndpointParams,\r\n options: RequestOptions = {},\r\n ): Promise<WebhookEndpoint> {\r\n return this.client.request('POST', '/webhook_endpoints', {\r\n body: params,\r\n idempotencyKey: options.idempotencyKey,\r\n })\r\n }\r\n\r\n retrieve(id: string): Promise<WebhookEndpoint> {\r\n return this.client.request('GET', `/webhook_endpoints/${encodeURIComponent(id)}`)\r\n }\r\n\r\n list(params: { limit?: number; starting_after?: string } = {}): Promise<\r\n ListResponse<WebhookEndpoint>\r\n > {\r\n return this.client.request('GET', '/webhook_endpoints', { query: { ...params } })\r\n }\r\n\r\n delete(id: string): Promise<{ id: string; object: string; deleted: boolean }> {\r\n return this.client.request('DELETE', `/webhook_endpoints/${encodeURIComponent(id)}`)\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { ListResponse, WebhookEvent } from '../types.js'\r\n\r\nexport interface ListWebhookEventsParams {\r\n limit?: number\r\n starting_after?: string\r\n type?: string\r\n}\r\n\r\nexport class WebhookEventsResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n list(params: ListWebhookEventsParams = {}): Promise<ListResponse<WebhookEvent>> {\r\n return this.client.request('GET', '/webhook_events', { query: { ...params } })\r\n }\r\n\r\n retrieve(id: string): Promise<WebhookEvent> {\r\n return this.client.request('GET', `/webhook_events/${encodeURIComponent(id)}`)\r\n }\r\n\r\n /** Re-deliver an event to all subscribed endpoints. */\r\n resend(id: string): Promise<WebhookEvent> {\r\n return this.client.request('POST', `/webhook_events/${encodeURIComponent(id)}/resend`)\r\n }\r\n}\r\n","import type { Mavunta } from '../client.js'\r\nimport type { WebhookEvent } from '../types.js'\r\n\r\nexport interface TriggerWebhookParams {\r\n /** The event type to simulate, e.g. `payment_intent.paid`. */\r\n type: string\r\n /** Optional override data merged into the simulated event. */\r\n data?: Record<string, unknown>\r\n}\r\n\r\n/**\r\n * Sandbox-only test helpers. These work with a `cwk_test_…` key; calling them\r\n * with a live key returns an error from the API.\r\n */\r\nexport class SandboxResource {\r\n constructor(private readonly client: Mavunta) {}\r\n\r\n /** Fire a simulated webhook event to your configured endpoints. */\r\n triggerWebhook(params: TriggerWebhookParams): Promise<WebhookEvent> {\r\n return this.client.request('POST', '/sandbox/webhooks/trigger', { body: params })\r\n }\r\n}\r\n","import { createHmac, timingSafeEqual } from 'node:crypto'\r\nimport { MavuntaWebhookSignatureError } from '../errors.js'\r\nimport type { WebhookEvent } from '../types.js'\r\n\r\nexport interface VerifyWebhookParams {\r\n /** The raw request body, exactly as received (string or Buffer). Never the\r\n * parsed JSON object: re-serializing changes the bytes and breaks the HMAC. */\r\n payload: string | Buffer\r\n /** The `Mavunta-Signature` header (hex HMAC-SHA256). */\r\n signature: string\r\n /** The `Mavunta-Timestamp` header (unix seconds). */\r\n timestamp: string\r\n /** The endpoint's signing secret (`whsec_…`). */\r\n secret: string\r\n /** Reject timestamps older/newer than this many seconds (default 300). */\r\n toleranceSec?: number\r\n}\r\n\r\nfunction fail(message: string): never {\r\n throw new MavuntaWebhookSignatureError(message, { type: 'webhook_signature_error', code: 'invalid_signature' })\r\n}\r\n\r\n/**\r\n * Verify a webhook signature and return the parsed event, or throw a\r\n * {@link MavuntaWebhookSignatureError}.\r\n *\r\n * The signature is HMAC-SHA256 (hex) over `\"<timestamp>.<rawBody>\"`, where\r\n * `timestamp` is the `Mavunta-Timestamp` header and the digest is the\r\n * `Mavunta-Signature` header. Always pass the raw body, not parsed JSON.\r\n */\r\nexport function verifyWebhook(params: VerifyWebhookParams): WebhookEvent {\r\n const { signature, timestamp, secret } = params\r\n if (!signature) fail('Missing Mavunta-Signature header.')\r\n if (!timestamp) fail('Missing Mavunta-Timestamp header.')\r\n if (!secret) fail('Missing webhook signing secret.')\r\n\r\n const raw = typeof params.payload === 'string' ? params.payload : params.payload.toString('utf8')\r\n const tolerance = params.toleranceSec ?? 300\r\n\r\n const ts = Number(timestamp)\r\n if (!Number.isFinite(ts)) fail('Invalid Mavunta-Timestamp header.')\r\n if (Math.abs(Date.now() / 1000 - ts) > tolerance) fail('Timestamp outside the tolerance window.')\r\n\r\n const expected = createHmac('sha256', secret).update(`${timestamp}.${raw}`).digest('hex')\r\n let a: Buffer\r\n let b: Buffer\r\n try {\r\n a = Buffer.from(expected, 'hex')\r\n b = Buffer.from(signature, 'hex')\r\n } catch {\r\n fail('Malformed signature.')\r\n }\r\n if (a.length !== b.length || !timingSafeEqual(a, b)) fail('Signature mismatch.')\r\n\r\n return JSON.parse(raw) as WebhookEvent\r\n}\r\n","import { verifyWebhook, type VerifyWebhookParams } from './verify.js'\nimport type { WebhookEvent } from '../types.js'\n\nexport { verifyWebhook } from './verify.js'\nexport type { VerifyWebhookParams } from './verify.js'\n\n/**\n * Webhook helpers, available both as `mavunta.webhooks` and standalone via the\n * `mavunta/webhooks` subpath (handy when you only need verification and\n * not a full client).\n */\nexport class WebhooksResource {\n /** Verify a webhook signature and return the parsed event, or throw. */\n verify(params: VerifyWebhookParams): WebhookEvent {\n return verifyWebhook(params)\n }\n /** Alias of {@link verify}, matching the wording in some platform docs. */\n constructEvent(params: VerifyWebhookParams): WebhookEvent {\n return verifyWebhook(params)\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport {\n MavuntaConnectionError,\n MavuntaTimeoutError,\n errorFromResponse,\n type MavuntaErrorBody,\n} from './errors.js'\nimport type { MavuntaOptions } from './types.js'\nimport { AuthResource } from './resources/auth.js'\nimport { RatesResource } from './resources/rates.js'\nimport { QuotesResource } from './resources/quotes.js'\nimport { PaymentIntentsResource } from './resources/payment-intents.js'\nimport { PaymentLinksResource } from './resources/payment-links.js'\nimport { CustomersResource } from './resources/customers.js'\nimport { RefundsResource } from './resources/refunds.js'\nimport { BalancesResource } from './resources/balances.js'\nimport { SettlementsResource } from './resources/settlements.js'\nimport { ReportsResource } from './resources/reports.js'\nimport { WebhookEndpointsResource } from './resources/webhook-endpoints.js'\nimport { WebhookEventsResource } from './resources/webhook-events.js'\nimport { SandboxResource } from './resources/sandbox.js'\nimport { WebhooksResource } from './webhooks/index.js'\n\nconst DEFAULT_BASE_URL = 'https://api.mavunta.com/v1'\nconst API_VERSION = '2026-06-01'\nconst SDK_VERSION = '1.0.0'\n\ntype HttpMethod = 'GET' | 'POST' | 'DELETE'\n\nexport interface InternalRequestOptions {\n body?: unknown\n query?: Record<string, string | number | boolean | undefined>\n idempotencyKey?: string\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction parseRetryAfterMs(header: string | null): number | null {\n if (!header) return null\n const seconds = Number(header)\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000)\n const date = Date.parse(header)\n return Number.isFinite(date) ? Math.max(0, date - Date.now()) : null\n}\n\n/**\n * The Mavunta API client. Server-side only: it authenticates with a secret or\n * restricted key and must never run in a browser.\n *\n * ```ts\n * import Mavunta from 'mavunta'\n * const mavunta = new Mavunta({ secretKey: process.env.MAVUNTA_SECRET_KEY! })\n * const intent = await mavunta.paymentIntents.create({\n * amount: '2500', currency: 'KES', settlement_currency: 'USDT',\n * payment_methods: ['mpesa', 'card'],\n * })\n * ```\n */\nexport class Mavunta {\n readonly auth: AuthResource\n readonly rates: RatesResource\n readonly quotes: QuotesResource\n readonly paymentIntents: PaymentIntentsResource\n readonly paymentLinks: PaymentLinksResource\n readonly customers: CustomersResource\n readonly refunds: RefundsResource\n readonly balances: BalancesResource\n readonly settlements: SettlementsResource\n readonly reports: ReportsResource\n readonly webhookEndpoints: WebhookEndpointsResource\n readonly webhookEvents: WebhookEventsResource\n readonly sandbox: SandboxResource\n /** Webhook signature verification (no network call). */\n readonly webhooks: WebhooksResource\n\n private readonly secretKey: string\n private readonly baseUrl: string\n private readonly timeoutMs: number\n private readonly maxRetries: number\n\n constructor(options: MavuntaOptions) {\n if (!options || !options.secretKey) {\n throw new Error('Mavunta: `secretKey` is required.')\n }\n if (/_pk_/.test(options.secretKey)) {\n throw new Error(\n 'Mavunta: a public key (pk_) cannot be used here. The server SDK needs a secret (sk_) or restricted (rk_) key.',\n )\n }\n this.secretKey = options.secretKey\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n this.timeoutMs = options.timeoutMs ?? 30_000\n this.maxRetries = Math.max(0, options.maxRetries ?? 2)\n\n this.auth = new AuthResource(this)\n this.rates = new RatesResource(this)\n this.quotes = new QuotesResource(this)\n this.paymentIntents = new PaymentIntentsResource(this)\n this.paymentLinks = new PaymentLinksResource(this)\n this.customers = new CustomersResource(this)\n this.refunds = new RefundsResource(this)\n this.balances = new BalancesResource(this)\n this.settlements = new SettlementsResource(this)\n this.reports = new ReportsResource(this)\n this.webhookEndpoints = new WebhookEndpointsResource(this)\n this.webhookEvents = new WebhookEventsResource(this)\n this.sandbox = new SandboxResource(this)\n this.webhooks = new WebhooksResource()\n }\n\n /** @internal Used by resource classes; not part of the public surface. */\n async request<T>(method: HttpMethod, path: string, opts: InternalRequestOptions = {}): Promise<T> {\n const url = new URL(this.baseUrl + path)\n if (opts.query) {\n for (const [key, value] of Object.entries(opts.query)) {\n if (value !== undefined) url.searchParams.set(key, String(value))\n }\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'Mavunta-Version': API_VERSION,\n 'User-Agent': `mavunta-sdk/${SDK_VERSION}`,\n }\n if (opts.body !== undefined) headers['Content-Type'] = 'application/json'\n\n // Money-moving POSTs are made retry-safe with an idempotency key (explicit\n // or auto-generated) so an automatic retry can never double-charge.\n const idempotencyKey =\n opts.idempotencyKey ?? (method === 'POST' ? `cwk_sdk_${randomUUID()}` : undefined)\n if (idempotencyKey) headers['Idempotency-Key'] = idempotencyKey\n\n let lastError: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const res = await fetch(url, {\n method,\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n const text = await res.text()\n const json = text ? (JSON.parse(text) as unknown) : {}\n if (res.ok) return json as T\n\n // Retry transient server / rate-limit errors. POSTs are safe here\n // because every POST carries an idempotency key.\n if ((res.status === 429 || res.status >= 500) && attempt < this.maxRetries) {\n const retryAfter = parseRetryAfterMs(res.headers.get('retry-after'))\n await sleep(retryAfter ?? 250 * 2 ** attempt)\n continue\n }\n\n const body = (json as { error?: MavuntaErrorBody }).error ?? null\n throw errorFromResponse(res.status, body, parseRetryAfterMs(res.headers.get('retry-after')))\n } catch (err) {\n // A built error envelope is final; rethrow it.\n if (err instanceof Error && err.name.startsWith('Mavunta')) throw err\n lastError = err\n const isTimeout = err instanceof Error && err.name === 'TimeoutError'\n if (attempt < this.maxRetries) {\n await sleep(250 * 2 ** attempt)\n continue\n }\n if (isTimeout) {\n throw new MavuntaTimeoutError(`Mavunta: request timed out after ${this.timeoutMs}ms.`, {\n code: 'timeout',\n })\n }\n }\n }\n throw new MavuntaConnectionError(\n `Mavunta: request failed (${lastError instanceof Error ? lastError.message : String(lastError)}).`,\n { code: 'connection_error' },\n )\n }\n}\n"]}
|