vesant-sdk 1.7.0 → 1.7.1-dev.ec505dc

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 (75) hide show
  1. package/dist/{client-DtH2RLuy.d.ts → client-BY4Quazn.d.ts} +2 -2
  2. package/dist/{client-DF7hlMEz.d.ts → client-C-u9lE8N.d.ts} +34 -46
  3. package/dist/{client-B0qhE2kr.d.mts → client-CX1jcLNZ.d.mts} +2 -2
  4. package/dist/{client-DrjgZoH_.d.mts → client-Yxat9wAO.d.mts} +34 -46
  5. package/dist/{client-BolQlL5e.d.mts → client-q9fN8Hhf.d.mts} +103 -1
  6. package/dist/{client-BolQlL5e.d.ts → client-q9fN8Hhf.d.ts} +103 -1
  7. package/dist/compliance/index.d.mts +3 -3
  8. package/dist/compliance/index.d.ts +3 -3
  9. package/dist/compliance/index.js +143 -98
  10. package/dist/compliance/index.js.map +1 -1
  11. package/dist/compliance/index.mjs +143 -98
  12. package/dist/compliance/index.mjs.map +1 -1
  13. package/dist/decisions/index.d.mts +1 -1
  14. package/dist/decisions/index.d.ts +1 -1
  15. package/dist/decisions/index.js +69 -8
  16. package/dist/decisions/index.js.map +1 -1
  17. package/dist/decisions/index.mjs +69 -8
  18. package/dist/decisions/index.mjs.map +1 -1
  19. package/dist/geolocation/index.d.mts +68 -7
  20. package/dist/geolocation/index.d.ts +68 -7
  21. package/dist/geolocation/index.js +148 -98
  22. package/dist/geolocation/index.js.map +1 -1
  23. package/dist/geolocation/index.mjs +145 -99
  24. package/dist/geolocation/index.mjs.map +1 -1
  25. package/dist/index-C3zUKydT.d.mts +264 -0
  26. package/dist/index-DSDgS09k.d.ts +264 -0
  27. package/dist/index.d.mts +26 -9
  28. package/dist/index.d.ts +26 -9
  29. package/dist/index.js +316 -127
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +308 -128
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/kyc/core.d.mts +1 -1
  34. package/dist/kyc/core.d.ts +1 -1
  35. package/dist/kyc/core.js +75 -14
  36. package/dist/kyc/core.js.map +1 -1
  37. package/dist/kyc/core.mjs +75 -14
  38. package/dist/kyc/core.mjs.map +1 -1
  39. package/dist/kyc/index.d.mts +4 -4
  40. package/dist/kyc/index.d.ts +4 -4
  41. package/dist/kyc/index.js +75 -14
  42. package/dist/kyc/index.js.map +1 -1
  43. package/dist/kyc/index.mjs +75 -14
  44. package/dist/kyc/index.mjs.map +1 -1
  45. package/dist/react.d.mts +7 -3
  46. package/dist/react.d.ts +7 -3
  47. package/dist/react.js +70 -33
  48. package/dist/react.js.map +1 -1
  49. package/dist/react.mjs +70 -33
  50. package/dist/react.mjs.map +1 -1
  51. package/dist/risk-profile/index.d.mts +1 -1
  52. package/dist/risk-profile/index.d.ts +1 -1
  53. package/dist/risk-profile/index.js +69 -8
  54. package/dist/risk-profile/index.js.map +1 -1
  55. package/dist/risk-profile/index.mjs +69 -8
  56. package/dist/risk-profile/index.mjs.map +1 -1
  57. package/dist/scores/index.d.mts +1 -1
  58. package/dist/scores/index.d.ts +1 -1
  59. package/dist/scores/index.js +69 -8
  60. package/dist/scores/index.js.map +1 -1
  61. package/dist/scores/index.mjs +69 -8
  62. package/dist/scores/index.mjs.map +1 -1
  63. package/dist/tax/index.d.mts +2 -2
  64. package/dist/tax/index.d.ts +2 -2
  65. package/dist/tax/index.js +74 -10
  66. package/dist/tax/index.js.map +1 -1
  67. package/dist/tax/index.mjs +74 -10
  68. package/dist/tax/index.mjs.map +1 -1
  69. package/dist/webhooks/index.d.mts +2 -189
  70. package/dist/webhooks/index.d.ts +2 -189
  71. package/dist/webhooks/index.js +85 -21
  72. package/dist/webhooks/index.js.map +1 -1
  73. package/dist/webhooks/index.mjs +85 -22
  74. package/dist/webhooks/index.mjs.map +1 -1
  75. package/package.json +4 -1
@@ -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) {
@@ -214,7 +227,7 @@ function createConsoleLogger() {
214
227
  }
215
228
 
216
229
  // src/core/version.ts
217
- var SDK_VERSION = "1.7.0";
230
+ var SDK_VERSION = "1.7.1";
218
231
 
219
232
  // src/shared/browser-utils.ts
220
233
  function generateUUID() {
@@ -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 || 3,
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
- if (this.config.apiKey) {
298
- headers["Authorization"] = `Bearer ${this.config.apiKey}`;
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
- if (["POST", "PUT", "PATCH"].includes(method)) {
305
- headers["Idempotency-Key"] = requestOptions?.idempotencyKey || generateUUID();
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
- const response = await fetch(url, {
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, requestOptions);
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)
@@ -630,12 +691,12 @@ var KycClient = class extends BaseClient {
630
691
  * console.log(`KYC ID: ${result.kyc_id}`);
631
692
  * ```
632
693
  */
633
- async requestKycSubmitLink(request) {
694
+ async requestKycSubmitLink(request, requestOptions) {
634
695
  return this.requestWithRetry("/api/v1/kyc/request", {
635
696
  method: "POST",
636
697
  body: JSON.stringify(request),
637
698
  headers: this.getUserHeaders()
638
- });
699
+ }, void 0, void 0, requestOptions);
639
700
  }
640
701
  /**
641
702
  * Create a Event-Based Face Verification session.
@@ -668,12 +729,12 @@ var KycClient = class extends BaseClient {
668
729
  *
669
730
  * @param request - Token from `createEventBasedFaceVerificationSession`, plus the base64 selfie.
670
731
  */
671
- async submitEventBasedFaceVerificationSession(request) {
732
+ async submitEventBasedFaceVerificationSession(request, requestOptions) {
672
733
  return this.request("/api/v1/kyc/face/submit", {
673
734
  method: "POST",
674
735
  body: JSON.stringify(request),
675
736
  headers: this.getUserHeaders()
676
- });
737
+ }, void 0, requestOptions);
677
738
  }
678
739
  /**
679
740
  * Look up the current state of a Event-Based Face Verification session by its
@@ -789,12 +850,12 @@ var KycClient = class extends BaseClient {
789
850
  * console.log(`Verification submitted: ${result.reference}`);
790
851
  * ```
791
852
  */
792
- async submitVerification(request) {
853
+ async submitVerification(request, requestOptions) {
793
854
  return this.requestWithRetry("/api/v1/kyc/submit", {
794
855
  method: "POST",
795
856
  body: JSON.stringify(request),
796
857
  headers: this.getUserHeaders()
797
- });
858
+ }, void 0, void 0, requestOptions);
798
859
  }
799
860
  /**
800
861
  * Get a KYC request by ID