vesant-sdk 1.7.0-dev.f9faca4 → 1.7.0-dev.fe84882
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/{client-DoMSYMMR.d.ts → client-0NOPDnT0.d.ts} +29 -26
- package/dist/{client-DMIRx7Tu.d.mts → client-CvWNRwwg.d.mts} +29 -26
- package/dist/{client-ZNdnpWe7.d.mts → client-Dps40EtF.d.mts} +2 -2
- package/dist/{client-C3DCmGe9.d.ts → client-SMxqod4j.d.ts} +2 -2
- package/dist/{client-BolQlL5e.d.mts → client-q9fN8Hhf.d.mts} +103 -1
- package/dist/{client-BolQlL5e.d.ts → client-q9fN8Hhf.d.ts} +103 -1
- package/dist/compliance/index.d.mts +3 -3
- package/dist/compliance/index.d.ts +3 -3
- package/dist/compliance/index.js +133 -22
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/index.mjs +133 -22
- package/dist/compliance/index.mjs.map +1 -1
- package/dist/decisions/index.d.mts +1 -1
- package/dist/decisions/index.d.ts +1 -1
- package/dist/decisions/index.js +68 -7
- package/dist/decisions/index.js.map +1 -1
- package/dist/decisions/index.mjs +68 -7
- package/dist/decisions/index.mjs.map +1 -1
- package/dist/geolocation/index.d.mts +59 -4
- package/dist/geolocation/index.d.ts +59 -4
- package/dist/geolocation/index.js +136 -19
- package/dist/geolocation/index.js.map +1 -1
- package/dist/geolocation/index.mjs +134 -20
- package/dist/geolocation/index.mjs.map +1 -1
- package/dist/index-C3zUKydT.d.mts +264 -0
- package/dist/index-DSDgS09k.d.ts +264 -0
- package/dist/index.d.mts +26 -9
- package/dist/index.d.ts +26 -9
- package/dist/index.js +325 -58
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +318 -59
- package/dist/index.mjs.map +1 -1
- package/dist/kyc/core.d.mts +2 -2
- package/dist/kyc/core.d.ts +2 -2
- package/dist/kyc/core.js +94 -19
- package/dist/kyc/core.js.map +1 -1
- package/dist/kyc/core.mjs +94 -19
- package/dist/kyc/core.mjs.map +1 -1
- package/dist/kyc/index.d.mts +110 -13
- package/dist/kyc/index.d.ts +110 -13
- package/dist/kyc/index.js +94 -19
- package/dist/kyc/index.js.map +1 -1
- package/dist/kyc/index.mjs +94 -19
- package/dist/kyc/index.mjs.map +1 -1
- package/dist/react.d.mts +9 -3
- package/dist/react.d.ts +9 -3
- package/dist/react.js +180 -77
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +180 -77
- package/dist/react.mjs.map +1 -1
- package/dist/risk-profile/index.d.mts +1 -1
- package/dist/risk-profile/index.d.ts +1 -1
- package/dist/risk-profile/index.js +68 -7
- package/dist/risk-profile/index.js.map +1 -1
- package/dist/risk-profile/index.mjs +68 -7
- package/dist/risk-profile/index.mjs.map +1 -1
- package/dist/scores/index.d.mts +1 -1
- package/dist/scores/index.d.ts +1 -1
- package/dist/scores/index.js +68 -7
- package/dist/scores/index.js.map +1 -1
- package/dist/scores/index.mjs +68 -7
- package/dist/scores/index.mjs.map +1 -1
- package/dist/tax/index.d.mts +2 -2
- package/dist/tax/index.d.ts +2 -2
- package/dist/tax/index.js +74 -10
- package/dist/tax/index.js.map +1 -1
- package/dist/tax/index.mjs +74 -10
- package/dist/tax/index.mjs.map +1 -1
- package/dist/webhooks/index.d.mts +2 -189
- package/dist/webhooks/index.d.ts +2 -189
- package/dist/webhooks/index.js +85 -21
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/index.mjs +85 -22
- package/dist/webhooks/index.mjs.map +1 -1
- package/package.json +4 -1
package/dist/kyc/index.mjs
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
// src/core/auth.ts
|
|
2
|
+
var StaticApiKeyProvider = class {
|
|
3
|
+
constructor(apiKey) {
|
|
4
|
+
this.apiKey = apiKey;
|
|
5
|
+
}
|
|
6
|
+
async getCredential() {
|
|
7
|
+
return this.apiKey ? { scheme: "Bearer", token: this.apiKey } : null;
|
|
8
|
+
}
|
|
9
|
+
canRefresh() {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
1
14
|
// src/core/errors.ts
|
|
2
15
|
var VesantError = class _VesantError extends Error {
|
|
3
16
|
constructor(message, code, statusCode, details) {
|
|
@@ -239,6 +252,12 @@ var BaseClient = class {
|
|
|
239
252
|
if (!config.tenantId?.trim()) {
|
|
240
253
|
throw new ValidationError("tenantId is required and must be a non-empty string", ["tenantId"]);
|
|
241
254
|
}
|
|
255
|
+
if (typeof fetch === "undefined") {
|
|
256
|
+
throw new VesantError(
|
|
257
|
+
"The Vesant SDK requires a global fetch (Node.js >= 18). Upgrade Node or provide a fetch polyfill.",
|
|
258
|
+
"RUNTIME_UNSUPPORTED"
|
|
259
|
+
);
|
|
260
|
+
}
|
|
242
261
|
this.interceptors = config.interceptors || [];
|
|
243
262
|
this.logger = config.logger || createConsoleLogger();
|
|
244
263
|
let environment = config.environment;
|
|
@@ -257,11 +276,12 @@ var BaseClient = class {
|
|
|
257
276
|
environment,
|
|
258
277
|
headers: config.headers || {},
|
|
259
278
|
timeout: config.timeout || 1e4,
|
|
260
|
-
retries: config.retries
|
|
279
|
+
retries: config.retries ?? 3,
|
|
261
280
|
debug: config.debug || false,
|
|
262
281
|
interceptors: this.interceptors,
|
|
263
282
|
logger: this.logger
|
|
264
283
|
};
|
|
284
|
+
this.authProvider = config.authProvider ?? (apiKey ? new StaticApiKeyProvider(apiKey) : void 0);
|
|
265
285
|
if (config.circuitBreaker) {
|
|
266
286
|
this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);
|
|
267
287
|
}
|
|
@@ -269,6 +289,19 @@ var BaseClient = class {
|
|
|
269
289
|
this.rateLimitTracker = new RateLimitTracker();
|
|
270
290
|
}
|
|
271
291
|
}
|
|
292
|
+
/**
|
|
293
|
+
* Resolve the Idempotency-Key for a request. Mutating methods (POST/PUT/PATCH)
|
|
294
|
+
* get the caller-supplied key or a freshly minted UUID; non-mutating methods get
|
|
295
|
+
* none. requestWithRetry resolves this once and injects it so every retry reuses
|
|
296
|
+
* one key (letting the server dedup replays); a direct request() resolves per call.
|
|
297
|
+
*/
|
|
298
|
+
resolveIdempotencyKey(method, requestOptions) {
|
|
299
|
+
const isMutating = ["POST", "PUT", "PATCH"].includes((method || "GET").toUpperCase());
|
|
300
|
+
if (!isMutating) {
|
|
301
|
+
return void 0;
|
|
302
|
+
}
|
|
303
|
+
return requestOptions?.idempotencyKey ?? generateUUID();
|
|
304
|
+
}
|
|
272
305
|
/**
|
|
273
306
|
* Make an HTTP request with timeout and error handling
|
|
274
307
|
*/
|
|
@@ -294,15 +327,20 @@ var BaseClient = class {
|
|
|
294
327
|
...this.config.headers,
|
|
295
328
|
...options.headers || {}
|
|
296
329
|
};
|
|
297
|
-
|
|
298
|
-
|
|
330
|
+
const credential = await this.authProvider?.getCredential({
|
|
331
|
+
tenantId: this.config.tenantId,
|
|
332
|
+
requestId
|
|
333
|
+
});
|
|
334
|
+
if (credential) {
|
|
335
|
+
headers["Authorization"] = `${credential.scheme ?? "Bearer"} ${credential.token}`;
|
|
299
336
|
}
|
|
300
337
|
if (this.config.environment === "sandbox") {
|
|
301
338
|
headers["X-Sandbox"] = "true";
|
|
302
339
|
}
|
|
303
340
|
const method = (options.method || "GET").toUpperCase();
|
|
304
|
-
|
|
305
|
-
|
|
341
|
+
const idempotencyKey = this.resolveIdempotencyKey(method, requestOptions);
|
|
342
|
+
if (idempotencyKey) {
|
|
343
|
+
headers["Idempotency-Key"] = idempotencyKey;
|
|
306
344
|
}
|
|
307
345
|
const controller = new AbortController();
|
|
308
346
|
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
@@ -323,10 +361,28 @@ var BaseClient = class {
|
|
|
323
361
|
if (this.config.debug) {
|
|
324
362
|
this.logger.debug(`${finalOptions.method || "GET"} ${endpoint}`);
|
|
325
363
|
}
|
|
326
|
-
|
|
364
|
+
let response = await fetch(url, {
|
|
327
365
|
...finalOptions,
|
|
328
366
|
signal: controller.signal
|
|
329
367
|
});
|
|
368
|
+
if (response.status === 401 && this.authProvider?.canRefresh?.()) {
|
|
369
|
+
const refreshed = await this.authProvider.getCredential({
|
|
370
|
+
tenantId: this.config.tenantId,
|
|
371
|
+
requestId,
|
|
372
|
+
forceRefresh: true
|
|
373
|
+
});
|
|
374
|
+
if (refreshed) {
|
|
375
|
+
this.config.onCredentialRotated?.({ reason: "unauthorized" });
|
|
376
|
+
finalOptions = {
|
|
377
|
+
...finalOptions,
|
|
378
|
+
headers: {
|
|
379
|
+
...finalOptions.headers,
|
|
380
|
+
Authorization: `${refreshed.scheme ?? "Bearer"} ${refreshed.token}`
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
response = await fetch(url, { ...finalOptions, signal: controller.signal });
|
|
384
|
+
}
|
|
385
|
+
}
|
|
330
386
|
clearTimeout(timeoutId);
|
|
331
387
|
if (this.rateLimitTracker) {
|
|
332
388
|
this.rateLimitTracker.updateFromHeaders(response.headers);
|
|
@@ -415,9 +471,11 @@ var BaseClient = class {
|
|
|
415
471
|
*/
|
|
416
472
|
async requestWithRetry(endpoint, options = {}, serviceURL, retries = this.config.retries, requestOptions) {
|
|
417
473
|
let lastError;
|
|
474
|
+
const idempotencyKey = this.resolveIdempotencyKey(options.method || "GET", requestOptions);
|
|
475
|
+
const attemptOptions = idempotencyKey ? { ...requestOptions, idempotencyKey } : requestOptions;
|
|
418
476
|
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
419
477
|
try {
|
|
420
|
-
return await this.request(endpoint, options, serviceURL,
|
|
478
|
+
return await this.request(endpoint, options, serviceURL, attemptOptions);
|
|
421
479
|
} catch (error) {
|
|
422
480
|
lastError = error instanceof Error ? error : new Error("Unknown error");
|
|
423
481
|
if (requestOptions?.signal?.aborted) {
|
|
@@ -514,6 +572,9 @@ var BaseClient = class {
|
|
|
514
572
|
if (config.interceptors) {
|
|
515
573
|
this.interceptors = config.interceptors;
|
|
516
574
|
}
|
|
575
|
+
if (config.authProvider !== void 0 || config.apiKey !== void 0) {
|
|
576
|
+
this.authProvider = this.config.authProvider ?? (this.config.apiKey ? new StaticApiKeyProvider(this.config.apiKey) : void 0);
|
|
577
|
+
}
|
|
517
578
|
}
|
|
518
579
|
/**
|
|
519
580
|
* Get current configuration (readonly)
|
|
@@ -601,7 +662,13 @@ var KycClient = class extends BaseClient {
|
|
|
601
662
|
*
|
|
602
663
|
* Generates a link that the user can visit to submit their KYC documents.
|
|
603
664
|
*
|
|
604
|
-
*
|
|
665
|
+
* Optionally pass the customer's registered identity data as
|
|
666
|
+
* `customer_data` (same shape as the geolocation `customer_data` block).
|
|
667
|
+
* It seeds the customer's risk profile so document verification can
|
|
668
|
+
* cross-check the submitted document against trusted reference data;
|
|
669
|
+
* fields never overwrite data already on the profile.
|
|
670
|
+
*
|
|
671
|
+
* @param request - Request containing the user ID, optional redirect URL, optional callback URL (receives POST requests), and optional customer identity data
|
|
605
672
|
* @returns Response containing the redirect link and KYC ID
|
|
606
673
|
*
|
|
607
674
|
* @example
|
|
@@ -609,19 +676,27 @@ var KycClient = class extends BaseClient {
|
|
|
609
676
|
* const result = await client.requestKycSubmitLink({
|
|
610
677
|
* user_id: "user_123",
|
|
611
678
|
* redirect_url: "https://merchant.com/kyc-complete", // optional
|
|
612
|
-
* callback_url: "https://merchant.com/api/kyc-webhook" // optional - receives POST requests on status change
|
|
679
|
+
* callback_url: "https://merchant.com/api/kyc-webhook", // optional - receives POST requests on status change
|
|
680
|
+
* customer_data: { // optional - seeds the risk profile for document cross-checks
|
|
681
|
+
* full_name: "John Doe",
|
|
682
|
+
* date_of_birth: "1999-06-02", // ISO 8601
|
|
683
|
+
* email: "john@example.com",
|
|
684
|
+
* phone: "+94771234567",
|
|
685
|
+
* address: "12 Main St, Colombo", // used for address verification
|
|
686
|
+
* country: "LK"
|
|
687
|
+
* }
|
|
613
688
|
* });
|
|
614
689
|
*
|
|
615
690
|
* console.log(`Redirect user to: ${result.link}`);
|
|
616
691
|
* console.log(`KYC ID: ${result.kyc_id}`);
|
|
617
692
|
* ```
|
|
618
693
|
*/
|
|
619
|
-
async requestKycSubmitLink(request) {
|
|
694
|
+
async requestKycSubmitLink(request, requestOptions) {
|
|
620
695
|
return this.requestWithRetry("/api/v1/kyc/request", {
|
|
621
696
|
method: "POST",
|
|
622
697
|
body: JSON.stringify(request),
|
|
623
698
|
headers: this.getUserHeaders()
|
|
624
|
-
});
|
|
699
|
+
}, void 0, void 0, requestOptions);
|
|
625
700
|
}
|
|
626
701
|
/**
|
|
627
702
|
* Create a Event-Based Face Verification session.
|
|
@@ -654,12 +729,12 @@ var KycClient = class extends BaseClient {
|
|
|
654
729
|
*
|
|
655
730
|
* @param request - Token from `createEventBasedFaceVerificationSession`, plus the base64 selfie.
|
|
656
731
|
*/
|
|
657
|
-
async submitEventBasedFaceVerificationSession(request) {
|
|
732
|
+
async submitEventBasedFaceVerificationSession(request, requestOptions) {
|
|
658
733
|
return this.request("/api/v1/kyc/face/submit", {
|
|
659
734
|
method: "POST",
|
|
660
735
|
body: JSON.stringify(request),
|
|
661
736
|
headers: this.getUserHeaders()
|
|
662
|
-
});
|
|
737
|
+
}, void 0, requestOptions);
|
|
663
738
|
}
|
|
664
739
|
/**
|
|
665
740
|
* Look up the current state of a Event-Based Face Verification session by its
|
|
@@ -758,7 +833,7 @@ var KycClient = class extends BaseClient {
|
|
|
758
833
|
* @example
|
|
759
834
|
* ```typescript
|
|
760
835
|
* const result = await client.submitVerification({
|
|
761
|
-
* reference: "
|
|
836
|
+
* reference: "4d2aff34-ab86-422d-992e-50b1234a5b67",
|
|
762
837
|
* email: "customer@example.com",
|
|
763
838
|
* country: "US",
|
|
764
839
|
* document: {
|
|
@@ -775,12 +850,12 @@ var KycClient = class extends BaseClient {
|
|
|
775
850
|
* console.log(`Verification submitted: ${result.reference}`);
|
|
776
851
|
* ```
|
|
777
852
|
*/
|
|
778
|
-
async submitVerification(request) {
|
|
853
|
+
async submitVerification(request, requestOptions) {
|
|
779
854
|
return this.requestWithRetry("/api/v1/kyc/submit", {
|
|
780
855
|
method: "POST",
|
|
781
856
|
body: JSON.stringify(request),
|
|
782
857
|
headers: this.getUserHeaders()
|
|
783
|
-
});
|
|
858
|
+
}, void 0, void 0, requestOptions);
|
|
784
859
|
}
|
|
785
860
|
/**
|
|
786
861
|
* Get a KYC request by ID
|
|
@@ -790,7 +865,7 @@ var KycClient = class extends BaseClient {
|
|
|
790
865
|
*
|
|
791
866
|
* @example
|
|
792
867
|
* ```typescript
|
|
793
|
-
* const kyc = await client.getKycRequest("
|
|
868
|
+
* const kyc = await client.getKycRequest("550e8400-e29b-41d4-a716-446655440000");
|
|
794
869
|
* console.log(`Status: ${kyc.status}, ID Verified: ${kyc.id_verified}`);
|
|
795
870
|
* ```
|
|
796
871
|
*/
|
|
@@ -865,7 +940,7 @@ var KycClient = class extends BaseClient {
|
|
|
865
940
|
* @example
|
|
866
941
|
* ```typescript
|
|
867
942
|
* await client.requestAdditionalDocuments({
|
|
868
|
-
* id: "
|
|
943
|
+
* id: "550e8400-e29b-41d4-a716-446655440000",
|
|
869
944
|
* document_types: ["address", "document_two"],
|
|
870
945
|
* message: "Please provide proof of address and secondary ID"
|
|
871
946
|
* });
|
|
@@ -886,7 +961,7 @@ var KycClient = class extends BaseClient {
|
|
|
886
961
|
*
|
|
887
962
|
* @example
|
|
888
963
|
* ```typescript
|
|
889
|
-
* const proofs = await client.getProofDownloadURLs("
|
|
964
|
+
* const proofs = await client.getProofDownloadURLs("550e8400-e29b-41d4-a716-446655440000");
|
|
890
965
|
* proofs.forEach(proof => {
|
|
891
966
|
* console.log(`${proof.type}: ${proof.url} (expires: ${proof.expires_at})`);
|
|
892
967
|
* });
|