@metamask-previews/kyc-controller 0.0.0-preview-64bce4b11 → 0.0.0-preview-1cf7cc7b3

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/CHANGELOG.md CHANGED
@@ -45,6 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
45
45
 
46
46
  ### Fixed
47
47
 
48
+ - Stop routing `KycService` write endpoints through the query cache. Every `POST` (`createSession`, `checkKycRequired`, `createVendorCustomer`, `submitVendorDisclaimers`, `submitSessionDisclaimers`, `createUkycSession`, `setAuthorizations`, `createJourney`) now issues its request directly instead of via `fetchQuery`. Previously these were modelled as queries, so two overlapping calls sharing a `queryKey` were deduplicated into a single request — a second `createVendorCustomer` while the first was in flight never reached the API — and their responses were retained in the cache and published on the messenger as `cacheUpdated` payloads, which for these endpoints include session tokens and applicant access tokens. Writes are also no longer retried by the service policy, so a failed non-idempotent request cannot create duplicate records server-side. ([#10007](https://github.com/MetaMask/core/pull/10007))
48
49
  - Stop incorrectly prefixing the session client public key onto wrapped `encryptionDataKey` and `ukycCapabilityToken` values from `wrapEncryptionKey`. `data` is now ciphertext+tag only; the server already has the client public key from session creation. ([#10036](https://github.com/MetaMask/core/pull/10036))
49
50
  - Clear leftover MoonPay `sessionToken`, `accessToken`, and Check/Auth frame credentials when `initialize` or `createVendorCustomer` switches to another vendor, so `buildCheckFrameUrl` cannot return a MoonPay URL for a consents-path session. ([#9908](https://github.com/MetaMask/core/pull/9908))
50
51
  - Rewind the consents path when SumSub fails before completion (thrown step or SDK close without `Completed`), instead of refreshing user status and forcing `phase` to `done`. A terminal UKYC rejection after the SDK completed still finishes as `done` so the decision can be reflected in user status. ([#9908](https://github.com/MetaMask/core/pull/9908))
@@ -148,13 +148,21 @@ const SessionDisclaimersResponseStruct = (0, superstruct_1.type)({
148
148
  * `fetch` when provided), and the auth bearer token and geolocation come from
149
149
  * other controllers via the messenger.
150
150
  *
151
- * It extends {@link BaseDataService}, so every request is routed through
152
- * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit
153
- * breaker) and its result is exposed via the service's `QueryClient`. Read-only
154
- * endpoints (`fetchVendorDisclaimers`, `fetchIdosEnclaveJwks`, `fetchIdosRelayJwks`) are cached
155
- * with a `staleTime`; vendor-disclaimer, session-scoped disclaimer,
156
- * session-creating, and status-polling endpoints opt out of caching
151
+ * It extends {@link BaseDataService}, so read-only endpoints are routed through
152
+ * `fetchQuery`: they are wrapped in the shared service policy (retries, circuit
153
+ * breaker) and their results are exposed via the service's `QueryClient`.
154
+ * `fetchDisclaimers` and `fetchJwks` are cached with a `staleTime`;
155
+ * session-scoped disclaimer and status-polling reads opt out of caching
157
156
  * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.
157
+ *
158
+ * Write endpoints (every `POST`) deliberately bypass `fetchQuery`. The query
159
+ * cache is built for idempotent reads: it deduplicates concurrent requests
160
+ * sharing a `queryKey`, retains responses for replay, and publishes them on the
161
+ * messenger via `cacheUpdated`. None of that is safe for calls that create
162
+ * sessions, customers, or consents — two overlapping `createVendorCustomer`
163
+ * calls would collapse into a single `POST`, and session tokens would be
164
+ * broadcast as cache payloads. Writes therefore call `#requestJson` directly,
165
+ * which also means they are not retried by the service policy.
158
166
  */
159
167
  class KycService extends base_data_service_1.BaseDataService {
160
168
  /**
@@ -257,20 +265,9 @@ class KycService extends base_data_service_1.BaseDataService {
257
265
  */
258
266
  async createSession(params) {
259
267
  const url = new URL('/vendors/moonpay/sessions', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
260
- const data = await this.fetchQuery({
261
- queryKey: [
262
- `${this.name}:createSession`,
263
- params.email,
264
- params.termsAcceptedAt,
265
- params.disclaimerIds,
266
- ],
267
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
268
- method: 'POST',
269
- body: JSON.stringify(params),
270
- }),
271
- // A session-creating mutation must never serve a stale/cached result.
272
- staleTime: 0,
273
- gcTime: 0,
268
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
269
+ method: 'POST',
270
+ body: JSON.stringify(params),
274
271
  });
275
272
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, CreateSessionResponseStruct, 'sessions');
276
273
  }
@@ -301,21 +298,9 @@ class KycService extends base_data_service_1.BaseDataService {
301
298
  throw new Error('checkKycRequired: country is required for vendor "moonpay".');
302
299
  }
303
300
  }
304
- const data = await this.fetchQuery({
305
- queryKey: [
306
- `${this.name}:checkKycRequired`,
307
- vendor,
308
- params.accessToken ?? null,
309
- params.country ?? null,
310
- capabilities,
311
- ],
312
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
313
- method: 'POST',
314
- body: JSON.stringify(body),
315
- }),
316
- // The requirement can change server-side, so always re-check.
317
- staleTime: 0,
318
- gcTime: 0,
301
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
302
+ method: 'POST',
303
+ body: JSON.stringify(body),
319
304
  });
320
305
  const { required } = __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, KycRequiredResponseStruct, 'kyc-required');
321
306
  return { kycRequired: required };
@@ -333,19 +318,9 @@ class KycService extends base_data_service_1.BaseDataService {
333
318
  */
334
319
  async createVendorCustomer(params) {
335
320
  const url = new URL(`/vendors/${params.vendor}/customers`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
336
- const data = await this.fetchQuery({
337
- queryKey: [
338
- `${this.name}:createVendorCustomer`,
339
- params.vendor,
340
- params.email,
341
- ],
342
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
343
- method: 'POST',
344
- body: JSON.stringify({ email: params.email }),
345
- }),
346
- // Customer creation/resume must never serve a stale/cached result.
347
- staleTime: 0,
348
- gcTime: 0,
321
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
322
+ method: 'POST',
323
+ body: JSON.stringify({ email: params.email }),
349
324
  });
350
325
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, VendorCustomerResponseStruct, 'vendor customers');
351
326
  }
@@ -363,18 +338,9 @@ class KycService extends base_data_service_1.BaseDataService {
363
338
  */
364
339
  async submitVendorDisclaimers(params) {
365
340
  const url = new URL(`/vendors/${encodeURIComponent(params.vendor)}/disclaimers`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
366
- const data = await this.fetchQuery({
367
- queryKey: [
368
- `${this.name}:submitVendorDisclaimers`,
369
- params.vendor,
370
- params.disclaimerIds,
371
- ],
372
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
373
- method: 'POST',
374
- body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),
375
- }),
376
- staleTime: 0,
377
- gcTime: 0,
341
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
342
+ method: 'POST',
343
+ body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),
378
344
  });
379
345
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, VendorSigningsResponseStruct, 'vendor disclaimers');
380
346
  }
@@ -436,24 +402,13 @@ class KycService extends base_data_service_1.BaseDataService {
436
402
  */
437
403
  async submitSessionDisclaimers(params) {
438
404
  const url = new URL(`/sessions/${encodeURIComponent(params.sessionId)}/disclaimers`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
439
- const data = await this.fetchQuery({
440
- queryKey: [
441
- `${this.name}:submitSessionDisclaimers`,
442
- params.sessionId,
443
- params.idOS,
444
- params.kycProvider,
445
- params.credentialReusabilityConsentGiven,
446
- ],
447
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
448
- method: 'POST',
449
- body: JSON.stringify({
450
- idOS: params.idOS,
451
- kycProvider: params.kycProvider,
452
- credentialReusabilityConsentGiven: params.credentialReusabilityConsentGiven,
453
- }),
405
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
406
+ method: 'POST',
407
+ body: JSON.stringify({
408
+ idOS: params.idOS,
409
+ kycProvider: params.kycProvider,
410
+ credentialReusabilityConsentGiven: params.credentialReusabilityConsentGiven,
454
411
  }),
455
- staleTime: 0,
456
- gcTime: 0,
457
412
  });
458
413
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, SessionDisclaimersResponseStruct, 'session disclaimers');
459
414
  }
@@ -515,22 +470,16 @@ class KycService extends base_data_service_1.BaseDataService {
515
470
  */
516
471
  async createUkycSession(params) {
517
472
  const url = new URL('/sessions', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
518
- const data = await this.fetchQuery({
519
- queryKey: [`${this.name}:createUkycSession`, params.jwtToken],
520
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
521
- method: 'POST',
522
- body: JSON.stringify({
523
- vendorId: params.vendor ?? 'moonpay',
524
- vendorUserId: 'mockedId',
525
- jwtToken: params.jwtToken,
526
- sessionClientPublicKey: params.sessionClientPublicKey,
527
- residenceCountry: params.residenceCountry,
528
- vendorMetadata: params.vendorMetadata ?? {},
529
- }),
473
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
474
+ method: 'POST',
475
+ body: JSON.stringify({
476
+ vendorId: params.vendor ?? 'moonpay',
477
+ vendorUserId: 'mockedId',
478
+ jwtToken: params.jwtToken,
479
+ sessionClientPublicKey: params.sessionClientPublicKey,
480
+ residenceCountry: params.residenceCountry,
481
+ vendorMetadata: params.vendorMetadata ?? {},
530
482
  }),
531
- // A session-creating mutation must never serve a stale/cached result.
532
- staleTime: 0,
533
- gcTime: 0,
534
483
  });
535
484
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, UkycSessionResponseStruct, 'UKYC sessions');
536
485
  }
@@ -545,17 +494,12 @@ class KycService extends base_data_service_1.BaseDataService {
545
494
  */
546
495
  async setAuthorizations(params) {
547
496
  const url = new URL(`/sessions/${encodeURIComponent(params.sessionId)}/authorizations`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
548
- const data = await this.fetchQuery({
549
- queryKey: [`${this.name}:setAuthorizations`, params.sessionId],
550
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
551
- method: 'POST',
552
- body: JSON.stringify({
553
- wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,
554
- wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,
555
- }),
497
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
498
+ method: 'POST',
499
+ body: JSON.stringify({
500
+ wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,
501
+ wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,
556
502
  }),
557
- staleTime: 0,
558
- gcTime: 0,
559
503
  });
560
504
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, SessionStatusResponseStruct, 'authorizations');
561
505
  }
@@ -568,13 +512,7 @@ class KycService extends base_data_service_1.BaseDataService {
568
512
  */
569
513
  async createJourney(sessionId) {
570
514
  const url = new URL(`/sessions/${encodeURIComponent(sessionId)}/journey`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
571
- const data = await this.fetchQuery({
572
- queryKey: [`${this.name}:createJourney`, sessionId],
573
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, { method: 'POST' }),
574
- // Journeys are (re)created on demand; do not reuse a cached token.
575
- staleTime: 0,
576
- gcTime: 0,
577
- });
515
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, { method: 'POST' });
578
516
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, ApplicantAccessTokenResponseStruct, 'journey');
579
517
  }
580
518
  /**
@@ -637,8 +575,9 @@ async function _KycService_fetchWellKnownJwks(baseUrl, queryName, responseLabel,
637
575
  /**
638
576
  * Performs a single JSON request.
639
577
  *
640
- * This is meant to be used as the `queryFn` for {@link fetchQuery}, which
641
- * wraps it in the shared service policy (retries, circuit breaker). Requests
578
+ * Read endpoints pass this as the `queryFn` to {@link fetchQuery}, which
579
+ * wraps it in the shared service policy (retries, circuit breaker). Write
580
+ * endpoints call it directly, so they are executed exactly once. Requests
642
581
  * are authenticated with the wallet bearer token by default; pass
643
582
  * `{ authenticated: false }` for calls to services that do not expect it
644
583
  * (e.g. the idOS enclave or idOS relay JWKS endpoints).
@@ -1 +1 @@
1
- {"version":3,"file":"KycService.cjs","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport { HttpError } from '@metamask/controller-utils';\nimport type { GeolocationControllerGetGeolocationAction } from '@metamask/geolocation-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationControllerGetBearerTokenAction } from '@metamask/profile-sync-controller/auth';\nimport type { Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n enums,\n optional,\n string,\n StructError,\n type,\n} from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport { Duration, inMilliseconds } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { alpha2ToAlpha3 } from './countryCodes.js';\nimport type { KycServiceMethodActions } from './KycService-method-action-types.js';\nimport type {\n KycConsentRecord,\n KycDisclaimer,\n KycDisclaimersCatalog,\n KycSessionDisclaimers,\n KycSessionStatus,\n KycUserStatusResponse,\n KycVendor,\n KycVendorSigning,\n} from './types.js';\nimport { UKYC_JWKS_PATH } from './ukyc/constants.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link KycService}, used to namespace the service's actions.\n */\nexport const serviceName = 'KycService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getGeoCountry',\n 'fetchVendorDisclaimers',\n 'createSession',\n 'checkKycRequired',\n 'createVendorCustomer',\n 'submitVendorDisclaimers',\n 'fetchDisclaimersCatalog',\n 'fetchSessionDisclaimers',\n 'submitSessionDisclaimers',\n 'fetchKycStatus',\n 'fetchIdosEnclaveJwks',\n 'fetchIdosRelayJwks',\n 'createUkycSession',\n 'setAuthorizations',\n 'createJourney',\n 'getSessionStatus',\n] as const;\n\n/**\n * Invalidates cached queries serviced by {@link KycService}.\n */\nexport type KycServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceActions =\n | KycServiceMethodActions\n | KycServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link KycService} calls.\n */\ntype AllowedActions =\n | AuthenticationControllerGetBearerTokenAction\n | GeolocationControllerGetGeolocationAction;\n\n/**\n * Published when {@link KycService}'s cache is updated.\n */\nexport type KycServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a single key within {@link KycService}'s cache is updated.\n */\nexport type KycServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceEvents =\n | KycServiceCacheUpdatedEvent\n | KycServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link KycService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link KycService}.\n */\nexport type KycServiceMessenger = Messenger<\n typeof serviceName,\n KycServiceActions | AllowedActions,\n KycServiceEvents | AllowedEvents\n>;\n\n/**\n * Options for constructing a {@link KycService}.\n */\nexport type KycServiceOptions = {\n messenger: KycServiceMessenger;\n /**\n * A function used to make HTTP requests. Defaults to the runtime's native\n * `fetch`, so consumers do not need to inject one on platforms where `fetch`\n * is available globally (browser, React Native, Node 18+).\n */\n fetch?: typeof fetch;\n /**\n * Mandatory value that sets the base url to KYC api\n */\n baseUrl: string;\n /**\n * Base URL of the idOS enclave, from which the JWKS used to\n * verify the `encryptionDataKey` schema's `jwtChain` is fetched.\n */\n idosEnclaveBaseUrl?: string;\n /**\n * Base URL of the idOS relay, from which the JWKS used to verify the\n * `ukycCapabilityToken` schema's `jwtChain` is fetched.\n */\n idosRelayBaseUrl?: string;\n /**\n * Shared configuration applied to all queries exposed by the service (e.g. a\n * default `staleTime`/`gcTime`). Each data service gets its own\n * `QueryClient`.\n */\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n};\n\n// === API RESPONSE SCHEMAS ===\n\nconst DisclaimerStruct = type({\n id: string(),\n display_name: string(),\n url: string(),\n});\nconst DisclaimersResponseStruct = array(DisclaimerStruct);\n\nconst VendorSigningStruct = type({\n id: string(),\n customer_id: string(),\n content_id: optional(string()),\n});\nconst VendorSigningsResponseStruct = array(VendorSigningStruct);\n\nconst CreateSessionResponseStruct = type({ sessionToken: string() });\n\n// The live KYC API returns the flag under `required`; the service normalizes\n// this to `kycRequired` for consumers (see `checkKycRequired`).\nconst KycRequiredResponseStruct = type({ required: boolean() });\n\n// The session server's public key, in JWK-like form, returned inside an\n// encryption schema from `POST /sessions`. `x` is the base64url public key\n// used to wrap a secret for that schema.\nconst ServerPublicKeyStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: optional(string()),\n alg: optional(string()),\n use: optional(string()),\n});\n\nconst EncryptionSchemaStruct = type({\n serverPublicKey: ServerPublicKeyStruct,\n jwtChain: string(),\n});\nexport type EncryptionSchema = Infer<typeof EncryptionSchemaStruct>;\n\n// A single Ed25519 (OKP) JWK. `type` (not `object`) keeps optional/extra JWK\n// fields (`use`, `alg`) from failing validation.\nconst JwkStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: string(),\n});\nconst JwksResponseStruct = type({ keys: array(JwkStruct) });\nexport type JwksResponse = Infer<typeof JwksResponseStruct>;\n\nconst UkycSessionResponseStruct = type({\n sessionId: string(),\n // Per-secret wrapping material so the client can seal the\n // `data_encryption_key` and the `ukyc_capability_token` independently.\n encryptionDataKey: EncryptionSchemaStruct,\n ukycCapabilityToken: EncryptionSchemaStruct,\n});\nexport type UkycSessionResponse = Infer<typeof UkycSessionResponseStruct>;\n\nconst ApplicantAccessTokenResponseStruct = type({\n status: string(),\n applicantAccessToken: string(),\n});\nexport type ApplicantAccessTokenResponse = Infer<\n typeof ApplicantAccessTokenResponseStruct\n>;\n\nconst SessionStatusResponseStruct = type({\n finalStatus: string(),\n statusMessage: optional(string()),\n externalUserId: string(),\n kycStatus: string(),\n vendor: string(),\n vendorStatus: string(),\n});\n\n// Vendor customer subset — `type` (not `object`) keeps extra vendor fields from\n// failing validation while still requiring the fields the controller needs.\nconst VendorCustomerResponseStruct = type({\n id: string(),\n email: string(),\n status: string(),\n});\nexport type VendorCustomerResponse = Infer<typeof VendorCustomerResponseStruct>;\n\nconst KYC_USER_STATUSES = [\n 'not-started',\n 'pending',\n 'need-more-information',\n 'terminal-failure',\n 'completed',\n] as const;\n\nconst KycUserStatusResponseStruct = type({\n status: enums([...KYC_USER_STATUSES]),\n sumsubSessionId: optional(string()),\n errorCode: optional(string()),\n});\n\nconst ConsentDocumentStruct = type({\n key: string(),\n version: string(),\n title: string(),\n url: string(),\n consented: boolean(),\n});\n\nconst DisclaimersCatalogFields = {\n idOS: array(ConsentDocumentStruct),\n kycProvider: array(ConsentDocumentStruct),\n} as const;\n\n/** Global catalog from `GET /disclaimers` (no credential-reuse flag). */\nconst GlobalDisclaimersResponseStruct = type(DisclaimersCatalogFields);\n\n/** Session catalog from `GET`/`POST /sessions/{id}/disclaimers`. */\nconst SessionDisclaimersResponseStruct = type({\n ...DisclaimersCatalogFields,\n credentialReusabilityConsentGiven: boolean(),\n});\n\n// === PARAM TYPES ===\n\nexport type CreateSessionParams = {\n email: string;\n termsAcceptedAt: string;\n disclaimerIds: string[];\n};\n\nexport type CheckKycRequiredParams = {\n /**\n * Identity vendor to check. Defaults to `moonpay` for the existing\n * Check/Auth path.\n */\n vendor?: KycVendor;\n /**\n * MoonPay access token. Required when `vendor` is `moonpay` (or omitted).\n */\n accessToken?: string;\n /**\n * ISO 3166-1 alpha-3 country code. Required when `vendor` is `moonpay`.\n */\n country?: string;\n capabilities?: { product: string }[];\n};\n\nexport type CreateVendorCustomerParams = {\n vendor: KycVendor;\n email: string;\n};\n\nexport type SubmitVendorDisclaimersParams = {\n /** Identity vendor whose T&Cs were accepted (currently `iron`). */\n vendor: KycVendor;\n /** Disclaimer ids from {@link KycService.fetchVendorDisclaimers}. */\n disclaimerIds: string[];\n};\n\nexport type FetchDisclaimersCatalogParams = {\n /** ISO 3166-1 alpha-3 country code for `GET /disclaimers?country=`. */\n country: string;\n};\n\nexport type FetchSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n};\n\nexport type SubmitSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n /** Consents to the idOS legal documents (`key`/`version` from the catalog). */\n idOS: KycConsentRecord[];\n /**\n * Consents to the KYC provider (SumSub) legal documents (`key`/`version`\n * from the catalog).\n */\n kycProvider: KycConsentRecord[];\n /** Consent to reuse the user's existing idOS credentials. */\n credentialReusabilityConsentGiven: boolean;\n};\n\nexport type CreateUkycSessionParams = {\n jwtToken: string;\n /**\n * The client's per-session X25519 public key (unpadded base64url). Generated\n * with the matching private key used later to wrap authorizations, so the\n * session server can open those boxes.\n */\n sessionClientPublicKey: string;\n /**\n * Country of residence in ISO 3166-1 alpha-3 format (e.g. `USA`, `GBR`).\n */\n residenceCountry: string;\n /**\n * Identity vendor for the UKYC session. Defaults to `moonpay` for the\n * existing Check/Auth flow. Pass a non-MoonPay vendor (e.g. `iron`) for\n * the consents path (no MoonPay metadata required).\n */\n vendor?: KycVendor;\n /**\n * Vendor-specific metadata. Required for MoonPay (`moonPayAccessToken` /\n * `moonPayUserId`); optional / omitted for other vendors.\n */\n vendorMetadata?: Record<string, unknown>;\n};\n\n/**\n * Encrypted capability authorization payload (base64url nonce + ciphertext)\n * accepted by `POST /sessions/:sessionId/authorizations`. Produced by\n * `wrapEncryptionKey` for both the `data_encryption_key` and the\n * `ukyc_capability_token`.\n */\nexport type CapabilityAuthorization = {\n nonce: string;\n data: string;\n};\n\nexport type SetAuthorizationsParams = {\n sessionId: string;\n wrappedEncryptionDataKey: CapabilityAuthorization;\n wrappedUkycCapabilityToken: CapabilityAuthorization;\n};\n\nexport type GetSessionStatusParams = {\n sessionId: string;\n};\n\n// === SERVICE DEFINITION ===\n\n/**\n * `KycService` communicates with the Universal KYC (UKYC) backend to drive the\n * identity + document-verification flow. It is stateless and platform-agnostic:\n * HTTP is performed through the runtime's native `fetch` (or an injected\n * `fetch` when provided), and the auth bearer token and geolocation come from\n * other controllers via the messenger.\n *\n * It extends {@link BaseDataService}, so every request is routed through\n * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit\n * breaker) and its result is exposed via the service's `QueryClient`. Read-only\n * endpoints (`fetchVendorDisclaimers`, `fetchIdosEnclaveJwks`, `fetchIdosRelayJwks`) are cached\n * with a `staleTime`; vendor-disclaimer, session-scoped disclaimer,\n * session-creating, and status-polling endpoints opt out of caching\n * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.\n */\nexport class KycService extends BaseDataService<\n typeof serviceName,\n KycServiceMessenger\n> {\n readonly #fetch: typeof fetch;\n\n readonly #baseUrl: string;\n\n readonly #idosEnclaveBaseUrl: string;\n\n readonly #idosRelayBaseUrl: string;\n\n /**\n * Constructs a new KycService.\n *\n * @param options - The constructor options.\n * @param options.messenger - The messenger suited for this service.\n * @param options.fetch - A function used to make HTTP requests. Defaults to\n * the runtime's native `fetch`.\n * @param options.baseUrl - Base URL of the KYC API\n * @param options.idosEnclaveBaseUrl - Base URL of the idOS enclave, from\n * which the JWKS used to verify the `encryptionDataKey` schema's `jwtChain`\n * is fetched.\n * @param options.idosRelayBaseUrl - Base URL of the idOS relay, from which\n * the JWKS used to verify the `ukycCapabilityToken` schema's `jwtChain` is\n * fetched.\n * @param options.queryClientConfig - Shared configuration for all queries\n * exposed by the service.\n * @param options.policyOptions - Options for the request service policy.\n */\n constructor({\n messenger,\n fetch: fetchFunction,\n baseUrl,\n idosEnclaveBaseUrl,\n idosRelayBaseUrl,\n queryClientConfig = {},\n policyOptions = {},\n }: KycServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions,\n });\n // Fall back to the runtime's native `fetch`, bound to `globalThis` so it\n // can be invoked as a method of this instance without an illegal-invocation\n // error on platforms that check the receiver.\n if (fetchFunction) {\n this.#fetch = fetchFunction;\n } else if (typeof globalThis.fetch === 'function') {\n this.#fetch = globalThis.fetch.bind(globalThis);\n } else {\n throw new Error(\n 'KycService: fetch is not available globally and was not provided in options. Please inject a fetch implementation.',\n );\n }\n if (!baseUrl) {\n throw new Error('KycService: baseUrl is required');\n }\n this.#baseUrl = baseUrl;\n this.#idosEnclaveBaseUrl = idosEnclaveBaseUrl ?? '';\n this.#idosRelayBaseUrl = idosRelayBaseUrl ?? '';\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\n async getGeoCountry(): Promise<string> {\n const location = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n // Guard nullish/empty geolocation with the documented domain error rather\n // than letting `assert(location, string())` surface a superstruct\n // assertion error (which would change how the failure reads in\n // `disclaimersError`).\n const alpha2 =\n typeof location === 'string' ? location.split('-')[0].toUpperCase() : '';\n if (!alpha2 || alpha2 === 'UNKNOWN') {\n throw new Error(\n `Unable to determine country from geolocation (got \"${String(\n location,\n )}\").`,\n );\n }\n const alpha3 = alpha2ToAlpha3(alpha2);\n if (!alpha3) {\n throw new Error(\n `Unable to map country code \"${alpha2}\" to an ISO 3166-1 alpha-3 code.`,\n );\n }\n return alpha3;\n }\n\n /**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor. Defaults to `moonpay`.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\n async fetchVendorDisclaimers({\n vendor = 'moonpay',\n country,\n }: {\n vendor?: KycVendor;\n country: string;\n }): Promise<KycDisclaimer[]> {\n const url = new URL(`/vendors/${vendor}/disclaimers`, this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchVendorDisclaimers`, vendor, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: inMilliseconds(5, Duration.Minute),\n });\n return this.#validateResponse(\n data,\n DisclaimersResponseStruct,\n 'disclaimers',\n ) as KycDisclaimer[];\n }\n\n /**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\n async createSession(\n params: CreateSessionParams,\n ): Promise<Infer<typeof CreateSessionResponseStruct>> {\n const url = new URL('/vendors/moonpay/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createSession`,\n params.email,\n params.termsAcceptedAt,\n params.disclaimerIds,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(params),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n CreateSessionResponseStruct,\n 'sessions',\n );\n }\n\n /**\n * Checks whether KYC is required for the given vendor, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\n async checkKycRequired(\n params: CheckKycRequiredParams,\n ): Promise<{ kycRequired: boolean }> {\n const vendor = params.vendor ?? 'moonpay';\n const url = new URL(`/vendors/${vendor}/kyc-required`, this.#baseUrl);\n const capabilities = params.capabilities ?? [{ product: 'ramps' }];\n const body =\n vendor === 'moonpay'\n ? {\n accessToken: params.accessToken,\n country: params.country,\n capabilities,\n }\n : {};\n\n // MoonPay requires accessToken and country; validate before making the request.\n if (vendor === 'moonpay') {\n if (!params.accessToken) {\n throw new Error(\n 'checkKycRequired: accessToken is required for vendor \"moonpay\".',\n );\n }\n if (!params.country) {\n throw new Error(\n 'checkKycRequired: country is required for vendor \"moonpay\".',\n );\n }\n }\n\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:checkKycRequired`,\n vendor,\n params.accessToken ?? null,\n params.country ?? null,\n capabilities,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n // The requirement can change server-side, so always re-check.\n staleTime: 0,\n gcTime: 0,\n });\n const { required } = this.#validateResponse(\n data,\n KycRequiredResponseStruct,\n 'kyc-required',\n );\n return { kycRequired: required };\n }\n\n /**\n * Creates (or resumes) an empty-shell customer for the authenticated\n * canonical user on the given identity vendor. Must run before showing\n * vendor T&C so the customer exists and resume logic can key off vendor\n * status.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron` for Money/VBA).\n * @param params.email - Email associated with the customer.\n * @returns The vendor customer record (subset validated for controller use).\n */\n async createVendorCustomer(\n params: CreateVendorCustomerParams,\n ): Promise<VendorCustomerResponse> {\n const url = new URL(`/vendors/${params.vendor}/customers`, this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createVendorCustomer`,\n params.vendor,\n params.email,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ email: params.email }),\n }),\n // Customer creation/resume must never serve a stale/cached result.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n VendorCustomerResponseStruct,\n 'vendor customers',\n );\n }\n\n /**\n * Records vendor T&C acceptance (`POST /vendors/{vendor}/disclaimers`).\n * For Iron this creates content signings from the disclaimer ids the\n * customer accepted. Session-scoped idOS / KYC-provider consents are\n * recorded separately via {@link submitSessionDisclaimers}. Retries re-POST\n * the same ids, matching the legacy `POST /consents` signing step.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron`).\n * @param params.disclaimerIds - Accepted vendor T&C ids.\n * @returns The vendor signing records.\n */\n async submitVendorDisclaimers(\n params: SubmitVendorDisclaimersParams,\n ): Promise<KycVendorSigning[]> {\n const url = new URL(\n `/vendors/${encodeURIComponent(params.vendor)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:submitVendorDisclaimers`,\n params.vendor,\n params.disclaimerIds,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),\n }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n VendorSigningsResponseStruct,\n 'vendor disclaimers',\n );\n }\n\n /**\n * Fetches the global idOS + KYC-provider disclaimer catalog\n * (`GET /disclaimers?country=`). Does not include\n * `credentialReusabilityConsentGiven` — that is session-scoped via\n * {@link fetchSessionDisclaimers}. Vendor T&Cs continue to come from\n * {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The catalog documents.\n */\n async fetchDisclaimersCatalog({\n country,\n }: FetchDisclaimersCatalogParams): Promise<KycDisclaimersCatalog> {\n if (country.length !== 3) {\n throw new Error(\n `KycService.fetchDisclaimersCatalog: country must be an ISO 3166-1 alpha-3 code (received \"${country}\").`,\n );\n }\n\n const url = new URL('/disclaimers', this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchDisclaimersCatalog`, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n GlobalDisclaimersResponseStruct,\n 'disclaimers',\n );\n }\n\n /**\n * Fetches the session-scoped idOS + KYC-provider disclaimer catalog\n * (`GET /sessions/{sessionId}/disclaimers`), including per-session\n * `consented` flags and `credentialReusabilityConsentGiven`. For the\n * pre-session global catalog use {@link fetchDisclaimersCatalog}. Vendor\n * T&Cs continue to come from {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The catalog, including which documents are already consented.\n */\n async fetchSessionDisclaimers({\n sessionId,\n }: FetchSessionDisclaimersParams): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchSessionDisclaimers`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Consent state can change after a POST, so always re-fetch.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Records idOS + KYC-provider consents for a UKYC session\n * (`POST /sessions/{sessionId}/disclaimers`). `key`/`version` pairs must\n * match the current catalog from {@link fetchSessionDisclaimers}. A 409\n * means those document versions were already recorded for the session.\n *\n * @param params - The consent parameters.\n * @returns The updated catalog after recording.\n */\n async submitSessionDisclaimers(\n params: SubmitSessionDisclaimersParams,\n ): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:submitSessionDisclaimers`,\n params.sessionId,\n params.idOS,\n params.kycProvider,\n params.credentialReusabilityConsentGiven,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n idOS: params.idOS,\n kycProvider: params.kycProvider,\n credentialReusabilityConsentGiven:\n params.credentialReusabilityConsentGiven,\n }),\n }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Fetches the user-keyed simplified KYC status used by Money toast / banner\n * surfaces (`GET /kyc/status`).\n *\n * @returns The simplified status payload.\n */\n async fetchKycStatus(): Promise<KycUserStatusResponse> {\n const url = new URL('/kyc/status', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchKycStatus`],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for toast flips, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n KycUserStatusResponseStruct,\n 'kyc status',\n );\n }\n\n /**\n * Fetches a well-known JWKS from `baseUrl`, caching the result for an hour.\n *\n * @param baseUrl - Host base URL that serves `/.well-known/jwks.json`.\n * @param queryName - Cache query-key segment.\n * @param responseLabel - Label used in malformed-response errors.\n * @param missingConfigMessage - Error thrown when `baseUrl` is empty.\n * @returns The JWKS keys.\n */\n async #fetchWellKnownJwks(\n baseUrl: string,\n queryName: string,\n responseLabel: string,\n missingConfigMessage: string,\n ): Promise<JwksResponse> {\n if (!baseUrl) {\n throw new Error(missingConfigMessage);\n }\n const url = new URL(UKYC_JWKS_PATH, baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:${queryName}`, baseUrl],\n queryFn: async () =>\n this.#requestJson(url, { method: 'GET' }, { authenticated: false }),\n staleTime: inMilliseconds(1, Duration.Hour),\n });\n return this.#validateResponse(data, JwksResponseStruct, responseLabel);\n }\n\n /**\n * Fetches the idOS enclave JWKS used to verify the\n * `encryptionDataKey` schema's `jwtChain` from\n * {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS enclave\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosEnclaveJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosEnclaveBaseUrl,\n 'fetchIdosEnclaveJwks',\n 'idOS enclave JWKS',\n 'KycService: idosEnclaveBaseUrl is not configured; cannot fetch JWKS to verify the encryptionDataKey schema.',\n );\n }\n\n /**\n * Fetches the idOS relay JWKS used to verify the `ukycCapabilityToken`\n * schema's `jwtChain` from {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS relay\n * host, distinct from both the UKYC base URL and the idOS enclave.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosRelayJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosRelayBaseUrl,\n 'fetchIdosRelayJwks',\n 'idOS relay JWKS',\n 'KycService: idosRelayBaseUrl is not configured; cannot fetch JWKS to verify the ukycCapabilityToken schema.',\n );\n }\n\n /**\n * Creates a UKYC session for the SumSub document-verification sub-flow.\n *\n * The client registers its per-session X25519 public key so the server can\n * later open boxes sealed with the matching private key, and supplies the\n * customer's ISO 3166-1 alpha-3 country of residence. The response\n * carries per-secret encryption schemas (`encryptionDataKey` and\n * `ukycCapabilityToken`) so the client can wrap the `data_encryption_key` and\n * the read-only `ukyc_capability_token` and submit them via\n * {@link KycService.setAuthorizations}.\n *\n * @param params - The session parameters.\n * @returns The UKYC session id and encryption schemas.\n */\n async createUkycSession(\n params: CreateUkycSessionParams,\n ): Promise<UkycSessionResponse> {\n const url = new URL('/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:createUkycSession`, params.jwtToken],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n vendorId: params.vendor ?? 'moonpay',\n vendorUserId: 'mockedId',\n jwtToken: params.jwtToken,\n sessionClientPublicKey: params.sessionClientPublicKey,\n residenceCountry: params.residenceCountry,\n vendorMetadata: params.vendorMetadata ?? {},\n }),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n UkycSessionResponseStruct,\n 'UKYC sessions',\n );\n }\n\n /**\n * Submits the wrapped `data_encryption_key` and wrapped\n * `ukyc_capability_token` for a UKYC session. Both secrets are sealed with\n * `wrapEncryptionKey` against the encryption schemas returned by\n * {@link KycService.createUkycSession}.\n *\n * @param params - The wrapped authorizations.\n * @returns The session status after the authorizations are applied.\n */\n async setAuthorizations(\n params: SetAuthorizationsParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/authorizations`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:setAuthorizations`, params.sessionId],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,\n wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,\n }),\n }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'authorizations',\n );\n }\n\n /**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\n async createJourney(\n sessionId: string,\n ): Promise<ApplicantAccessTokenResponse> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/journey`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:createJourney`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'POST' }),\n // Journeys are (re)created on demand; do not reuse a cached token.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n ApplicantAccessTokenResponseStruct,\n 'journey',\n );\n }\n\n /**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\n async getSessionStatus(\n params: GetSessionStatusParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/status`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getSessionStatus`, params.sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for a terminal decision, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'session status',\n );\n }\n\n /**\n * Validates a parsed API response against a superstruct schema, throwing a\n * descriptive error when the response does not match.\n *\n * Unlike a bare `Struct.is` check, this surfaces exactly which field was\n * missing or had the wrong type, which is essential for diagnosing shape\n * mismatches between the client and the live API.\n *\n * @param data - The parsed response body.\n * @param struct - The superstruct schema the body is expected to satisfy.\n * @param apiName - A human-readable name of the API, used in the error message.\n * @returns The validated, typed response.\n * @throws If `data` does not match `struct`.\n */\n #validateResponse<Type, Schema>(\n data: unknown,\n struct: Struct<Type, Schema>,\n apiName: string,\n ): Type {\n try {\n assert(data, struct);\n return data;\n } catch (error) {\n const detail =\n error instanceof StructError\n ? `${error.message} (received: ${JSON.stringify(data)})`\n : // `assert` only ever throws `StructError` for the plain structs used\n // here, so this is a defensive fallback that is not exercised.\n /* istanbul ignore next */\n String(error);\n throw new Error(\n `Malformed response received from ${apiName} API: ${detail}`,\n );\n }\n }\n\n /**\n * Performs a single JSON request.\n *\n * This is meant to be used as the `queryFn` for {@link fetchQuery}, which\n * wraps it in the shared service policy (retries, circuit breaker). Requests\n * are authenticated with the wallet bearer token by default; pass\n * `{ authenticated: false }` for calls to services that do not expect it\n * (e.g. the idOS enclave or idOS relay JWKS endpoints).\n *\n * @param url - The request URL.\n * @param init - The request init (method, body).\n * @param options - Request options.\n * @param options.authenticated - Whether to attach the bearer token. Defaults\n * to `true`.\n * @returns The parsed JSON response.\n */\n async #requestJson(\n url: URL,\n init: RequestInit,\n options: { authenticated?: boolean } = {},\n ): Promise<Json> {\n const { authenticated = true } = options;\n\n const headers: Record<string, string> = {};\n\n // Only advertise a JSON body when one is actually sent; bodyless requests\n // (e.g. `createJourney`) must not carry a `Content-Type`.\n if (init.body !== undefined && init.body !== null) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (authenticated) {\n const bearerToken = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n throw new Error(\n 'Unable to obtain an authentication bearer token — is the wallet signed in?',\n );\n }\n assert(bearerToken, string());\n headers.Authorization = `Bearer ${bearerToken}`;\n }\n\n const response = await this.#fetch(url.toString(), {\n ...init,\n headers,\n });\n if (!response.ok) {\n let detail = '';\n try {\n const errorBody: unknown = await response.json();\n if (errorBody && typeof errorBody === 'object') {\n const record = errorBody as Record<string, unknown>;\n if (typeof record.message === 'string') {\n detail = record.message;\n } else if (typeof record.error === 'string') {\n detail = record.error;\n }\n }\n } catch {\n // Ignore body parse failures; status alone is still useful.\n }\n throw new HttpError(\n response.status,\n `Fetching '${url.toString()}' failed with status '${response.status}'${\n detail ? `: ${detail}` : ''\n }`,\n );\n }\n\n // DELETE (and similar) endpoints return 204 No Content.\n if (response.status === 204) {\n return null;\n }\n\n return (await response.json()) as Json;\n }\n}\n"]}
1
+ {"version":3,"file":"KycService.cjs","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport { HttpError } from '@metamask/controller-utils';\nimport type { GeolocationControllerGetGeolocationAction } from '@metamask/geolocation-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationControllerGetBearerTokenAction } from '@metamask/profile-sync-controller/auth';\nimport type { Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n enums,\n optional,\n string,\n StructError,\n type,\n} from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport { Duration, inMilliseconds } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { alpha2ToAlpha3 } from './countryCodes.js';\nimport type { KycServiceMethodActions } from './KycService-method-action-types.js';\nimport type {\n KycConsentRecord,\n KycDisclaimer,\n KycDisclaimersCatalog,\n KycSessionDisclaimers,\n KycSessionStatus,\n KycUserStatusResponse,\n KycVendor,\n KycVendorSigning,\n} from './types.js';\nimport { UKYC_JWKS_PATH } from './ukyc/constants.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link KycService}, used to namespace the service's actions.\n */\nexport const serviceName = 'KycService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getGeoCountry',\n 'fetchVendorDisclaimers',\n 'createSession',\n 'checkKycRequired',\n 'createVendorCustomer',\n 'submitVendorDisclaimers',\n 'fetchDisclaimersCatalog',\n 'fetchSessionDisclaimers',\n 'submitSessionDisclaimers',\n 'fetchKycStatus',\n 'fetchIdosEnclaveJwks',\n 'fetchIdosRelayJwks',\n 'createUkycSession',\n 'setAuthorizations',\n 'createJourney',\n 'getSessionStatus',\n] as const;\n\n/**\n * Invalidates cached queries serviced by {@link KycService}.\n */\nexport type KycServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceActions =\n | KycServiceMethodActions\n | KycServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link KycService} calls.\n */\ntype AllowedActions =\n | AuthenticationControllerGetBearerTokenAction\n | GeolocationControllerGetGeolocationAction;\n\n/**\n * Published when {@link KycService}'s cache is updated.\n */\nexport type KycServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a single key within {@link KycService}'s cache is updated.\n */\nexport type KycServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceEvents =\n | KycServiceCacheUpdatedEvent\n | KycServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link KycService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link KycService}.\n */\nexport type KycServiceMessenger = Messenger<\n typeof serviceName,\n KycServiceActions | AllowedActions,\n KycServiceEvents | AllowedEvents\n>;\n\n/**\n * Options for constructing a {@link KycService}.\n */\nexport type KycServiceOptions = {\n messenger: KycServiceMessenger;\n /**\n * A function used to make HTTP requests. Defaults to the runtime's native\n * `fetch`, so consumers do not need to inject one on platforms where `fetch`\n * is available globally (browser, React Native, Node 18+).\n */\n fetch?: typeof fetch;\n /**\n * Mandatory value that sets the base url to KYC api\n */\n baseUrl: string;\n /**\n * Base URL of the idOS enclave, from which the JWKS used to\n * verify the `encryptionDataKey` schema's `jwtChain` is fetched.\n */\n idosEnclaveBaseUrl?: string;\n /**\n * Base URL of the idOS relay, from which the JWKS used to verify the\n * `ukycCapabilityToken` schema's `jwtChain` is fetched.\n */\n idosRelayBaseUrl?: string;\n /**\n * Shared configuration applied to all queries exposed by the service (e.g. a\n * default `staleTime`/`gcTime`). Each data service gets its own\n * `QueryClient`.\n */\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n};\n\n// === API RESPONSE SCHEMAS ===\n\nconst DisclaimerStruct = type({\n id: string(),\n display_name: string(),\n url: string(),\n});\nconst DisclaimersResponseStruct = array(DisclaimerStruct);\n\nconst VendorSigningStruct = type({\n id: string(),\n customer_id: string(),\n content_id: optional(string()),\n});\nconst VendorSigningsResponseStruct = array(VendorSigningStruct);\n\nconst CreateSessionResponseStruct = type({ sessionToken: string() });\n\n// The live KYC API returns the flag under `required`; the service normalizes\n// this to `kycRequired` for consumers (see `checkKycRequired`).\nconst KycRequiredResponseStruct = type({ required: boolean() });\n\n// The session server's public key, in JWK-like form, returned inside an\n// encryption schema from `POST /sessions`. `x` is the base64url public key\n// used to wrap a secret for that schema.\nconst ServerPublicKeyStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: optional(string()),\n alg: optional(string()),\n use: optional(string()),\n});\n\nconst EncryptionSchemaStruct = type({\n serverPublicKey: ServerPublicKeyStruct,\n jwtChain: string(),\n});\nexport type EncryptionSchema = Infer<typeof EncryptionSchemaStruct>;\n\n// A single Ed25519 (OKP) JWK. `type` (not `object`) keeps optional/extra JWK\n// fields (`use`, `alg`) from failing validation.\nconst JwkStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: string(),\n});\nconst JwksResponseStruct = type({ keys: array(JwkStruct) });\nexport type JwksResponse = Infer<typeof JwksResponseStruct>;\n\nconst UkycSessionResponseStruct = type({\n sessionId: string(),\n // Per-secret wrapping material so the client can seal the\n // `data_encryption_key` and the `ukyc_capability_token` independently.\n encryptionDataKey: EncryptionSchemaStruct,\n ukycCapabilityToken: EncryptionSchemaStruct,\n});\nexport type UkycSessionResponse = Infer<typeof UkycSessionResponseStruct>;\n\nconst ApplicantAccessTokenResponseStruct = type({\n status: string(),\n applicantAccessToken: string(),\n});\nexport type ApplicantAccessTokenResponse = Infer<\n typeof ApplicantAccessTokenResponseStruct\n>;\n\nconst SessionStatusResponseStruct = type({\n finalStatus: string(),\n statusMessage: optional(string()),\n externalUserId: string(),\n kycStatus: string(),\n vendor: string(),\n vendorStatus: string(),\n});\n\n// Vendor customer subset — `type` (not `object`) keeps extra vendor fields from\n// failing validation while still requiring the fields the controller needs.\nconst VendorCustomerResponseStruct = type({\n id: string(),\n email: string(),\n status: string(),\n});\nexport type VendorCustomerResponse = Infer<typeof VendorCustomerResponseStruct>;\n\nconst KYC_USER_STATUSES = [\n 'not-started',\n 'pending',\n 'need-more-information',\n 'terminal-failure',\n 'completed',\n] as const;\n\nconst KycUserStatusResponseStruct = type({\n status: enums([...KYC_USER_STATUSES]),\n sumsubSessionId: optional(string()),\n errorCode: optional(string()),\n});\n\nconst ConsentDocumentStruct = type({\n key: string(),\n version: string(),\n title: string(),\n url: string(),\n consented: boolean(),\n});\n\nconst DisclaimersCatalogFields = {\n idOS: array(ConsentDocumentStruct),\n kycProvider: array(ConsentDocumentStruct),\n} as const;\n\n/** Global catalog from `GET /disclaimers` (no credential-reuse flag). */\nconst GlobalDisclaimersResponseStruct = type(DisclaimersCatalogFields);\n\n/** Session catalog from `GET`/`POST /sessions/{id}/disclaimers`. */\nconst SessionDisclaimersResponseStruct = type({\n ...DisclaimersCatalogFields,\n credentialReusabilityConsentGiven: boolean(),\n});\n\n// === PARAM TYPES ===\n\nexport type CreateSessionParams = {\n email: string;\n termsAcceptedAt: string;\n disclaimerIds: string[];\n};\n\nexport type CheckKycRequiredParams = {\n /**\n * Identity vendor to check. Defaults to `moonpay` for the existing\n * Check/Auth path.\n */\n vendor?: KycVendor;\n /**\n * MoonPay access token. Required when `vendor` is `moonpay` (or omitted).\n */\n accessToken?: string;\n /**\n * ISO 3166-1 alpha-3 country code. Required when `vendor` is `moonpay`.\n */\n country?: string;\n capabilities?: { product: string }[];\n};\n\nexport type CreateVendorCustomerParams = {\n vendor: KycVendor;\n email: string;\n};\n\nexport type SubmitVendorDisclaimersParams = {\n /** Identity vendor whose T&Cs were accepted (currently `iron`). */\n vendor: KycVendor;\n /** Disclaimer ids from {@link KycService.fetchVendorDisclaimers}. */\n disclaimerIds: string[];\n};\n\nexport type FetchDisclaimersCatalogParams = {\n /** ISO 3166-1 alpha-3 country code for `GET /disclaimers?country=`. */\n country: string;\n};\n\nexport type FetchSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n};\n\nexport type SubmitSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n /** Consents to the idOS legal documents (`key`/`version` from the catalog). */\n idOS: KycConsentRecord[];\n /**\n * Consents to the KYC provider (SumSub) legal documents (`key`/`version`\n * from the catalog).\n */\n kycProvider: KycConsentRecord[];\n /** Consent to reuse the user's existing idOS credentials. */\n credentialReusabilityConsentGiven: boolean;\n};\n\nexport type CreateUkycSessionParams = {\n jwtToken: string;\n /**\n * The client's per-session X25519 public key (unpadded base64url). Generated\n * with the matching private key used later to wrap authorizations, so the\n * session server can open those boxes.\n */\n sessionClientPublicKey: string;\n /**\n * Country of residence in ISO 3166-1 alpha-3 format (e.g. `USA`, `GBR`).\n */\n residenceCountry: string;\n /**\n * Identity vendor for the UKYC session. Defaults to `moonpay` for the\n * existing Check/Auth flow. Pass a non-MoonPay vendor (e.g. `iron`) for\n * the consents path (no MoonPay metadata required).\n */\n vendor?: KycVendor;\n /**\n * Vendor-specific metadata. Required for MoonPay (`moonPayAccessToken` /\n * `moonPayUserId`); optional / omitted for other vendors.\n */\n vendorMetadata?: Record<string, unknown>;\n};\n\n/**\n * Encrypted capability authorization payload (base64url nonce + ciphertext)\n * accepted by `POST /sessions/:sessionId/authorizations`. Produced by\n * `wrapEncryptionKey` for both the `data_encryption_key` and the\n * `ukyc_capability_token`.\n */\nexport type CapabilityAuthorization = {\n nonce: string;\n data: string;\n};\n\nexport type SetAuthorizationsParams = {\n sessionId: string;\n wrappedEncryptionDataKey: CapabilityAuthorization;\n wrappedUkycCapabilityToken: CapabilityAuthorization;\n};\n\nexport type GetSessionStatusParams = {\n sessionId: string;\n};\n\n// === SERVICE DEFINITION ===\n\n/**\n * `KycService` communicates with the Universal KYC (UKYC) backend to drive the\n * identity + document-verification flow. It is stateless and platform-agnostic:\n * HTTP is performed through the runtime's native `fetch` (or an injected\n * `fetch` when provided), and the auth bearer token and geolocation come from\n * other controllers via the messenger.\n *\n * It extends {@link BaseDataService}, so read-only endpoints are routed through\n * `fetchQuery`: they are wrapped in the shared service policy (retries, circuit\n * breaker) and their results are exposed via the service's `QueryClient`.\n * `fetchDisclaimers` and `fetchJwks` are cached with a `staleTime`;\n * session-scoped disclaimer and status-polling reads opt out of caching\n * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.\n *\n * Write endpoints (every `POST`) deliberately bypass `fetchQuery`. The query\n * cache is built for idempotent reads: it deduplicates concurrent requests\n * sharing a `queryKey`, retains responses for replay, and publishes them on the\n * messenger via `cacheUpdated`. None of that is safe for calls that create\n * sessions, customers, or consents — two overlapping `createVendorCustomer`\n * calls would collapse into a single `POST`, and session tokens would be\n * broadcast as cache payloads. Writes therefore call `#requestJson` directly,\n * which also means they are not retried by the service policy.\n */\nexport class KycService extends BaseDataService<\n typeof serviceName,\n KycServiceMessenger\n> {\n readonly #fetch: typeof fetch;\n\n readonly #baseUrl: string;\n\n readonly #idosEnclaveBaseUrl: string;\n\n readonly #idosRelayBaseUrl: string;\n\n /**\n * Constructs a new KycService.\n *\n * @param options - The constructor options.\n * @param options.messenger - The messenger suited for this service.\n * @param options.fetch - A function used to make HTTP requests. Defaults to\n * the runtime's native `fetch`.\n * @param options.baseUrl - Base URL of the KYC API\n * @param options.idosEnclaveBaseUrl - Base URL of the idOS enclave, from\n * which the JWKS used to verify the `encryptionDataKey` schema's `jwtChain`\n * is fetched.\n * @param options.idosRelayBaseUrl - Base URL of the idOS relay, from which\n * the JWKS used to verify the `ukycCapabilityToken` schema's `jwtChain` is\n * fetched.\n * @param options.queryClientConfig - Shared configuration for all queries\n * exposed by the service.\n * @param options.policyOptions - Options for the request service policy.\n */\n constructor({\n messenger,\n fetch: fetchFunction,\n baseUrl,\n idosEnclaveBaseUrl,\n idosRelayBaseUrl,\n queryClientConfig = {},\n policyOptions = {},\n }: KycServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions,\n });\n // Fall back to the runtime's native `fetch`, bound to `globalThis` so it\n // can be invoked as a method of this instance without an illegal-invocation\n // error on platforms that check the receiver.\n if (fetchFunction) {\n this.#fetch = fetchFunction;\n } else if (typeof globalThis.fetch === 'function') {\n this.#fetch = globalThis.fetch.bind(globalThis);\n } else {\n throw new Error(\n 'KycService: fetch is not available globally and was not provided in options. Please inject a fetch implementation.',\n );\n }\n if (!baseUrl) {\n throw new Error('KycService: baseUrl is required');\n }\n this.#baseUrl = baseUrl;\n this.#idosEnclaveBaseUrl = idosEnclaveBaseUrl ?? '';\n this.#idosRelayBaseUrl = idosRelayBaseUrl ?? '';\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\n async getGeoCountry(): Promise<string> {\n const location = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n // Guard nullish/empty geolocation with the documented domain error rather\n // than letting `assert(location, string())` surface a superstruct\n // assertion error (which would change how the failure reads in\n // `disclaimersError`).\n const alpha2 =\n typeof location === 'string' ? location.split('-')[0].toUpperCase() : '';\n if (!alpha2 || alpha2 === 'UNKNOWN') {\n throw new Error(\n `Unable to determine country from geolocation (got \"${String(\n location,\n )}\").`,\n );\n }\n const alpha3 = alpha2ToAlpha3(alpha2);\n if (!alpha3) {\n throw new Error(\n `Unable to map country code \"${alpha2}\" to an ISO 3166-1 alpha-3 code.`,\n );\n }\n return alpha3;\n }\n\n /**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor. Defaults to `moonpay`.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\n async fetchVendorDisclaimers({\n vendor = 'moonpay',\n country,\n }: {\n vendor?: KycVendor;\n country: string;\n }): Promise<KycDisclaimer[]> {\n const url = new URL(`/vendors/${vendor}/disclaimers`, this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchVendorDisclaimers`, vendor, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: inMilliseconds(5, Duration.Minute),\n });\n return this.#validateResponse(\n data,\n DisclaimersResponseStruct,\n 'disclaimers',\n ) as KycDisclaimer[];\n }\n\n /**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\n async createSession(\n params: CreateSessionParams,\n ): Promise<Infer<typeof CreateSessionResponseStruct>> {\n const url = new URL('/vendors/moonpay/sessions', this.#baseUrl);\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return this.#validateResponse(\n data,\n CreateSessionResponseStruct,\n 'sessions',\n );\n }\n\n /**\n * Checks whether KYC is required for the given vendor, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\n async checkKycRequired(\n params: CheckKycRequiredParams,\n ): Promise<{ kycRequired: boolean }> {\n const vendor = params.vendor ?? 'moonpay';\n const url = new URL(`/vendors/${vendor}/kyc-required`, this.#baseUrl);\n const capabilities = params.capabilities ?? [{ product: 'ramps' }];\n const body =\n vendor === 'moonpay'\n ? {\n accessToken: params.accessToken,\n country: params.country,\n capabilities,\n }\n : {};\n\n // MoonPay requires accessToken and country; validate before making the request.\n if (vendor === 'moonpay') {\n if (!params.accessToken) {\n throw new Error(\n 'checkKycRequired: accessToken is required for vendor \"moonpay\".',\n );\n }\n if (!params.country) {\n throw new Error(\n 'checkKycRequired: country is required for vendor \"moonpay\".',\n );\n }\n }\n\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const { required } = this.#validateResponse(\n data,\n KycRequiredResponseStruct,\n 'kyc-required',\n );\n return { kycRequired: required };\n }\n\n /**\n * Creates (or resumes) an empty-shell customer for the authenticated\n * canonical user on the given identity vendor. Must run before showing\n * vendor T&C so the customer exists and resume logic can key off vendor\n * status.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron` for Money/VBA).\n * @param params.email - Email associated with the customer.\n * @returns The vendor customer record (subset validated for controller use).\n */\n async createVendorCustomer(\n params: CreateVendorCustomerParams,\n ): Promise<VendorCustomerResponse> {\n const url = new URL(`/vendors/${params.vendor}/customers`, this.#baseUrl);\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ email: params.email }),\n });\n return this.#validateResponse(\n data,\n VendorCustomerResponseStruct,\n 'vendor customers',\n );\n }\n\n /**\n * Records vendor T&C acceptance (`POST /vendors/{vendor}/disclaimers`).\n * For Iron this creates content signings from the disclaimer ids the\n * customer accepted. Session-scoped idOS / KYC-provider consents are\n * recorded separately via {@link submitSessionDisclaimers}. Retries re-POST\n * the same ids, matching the legacy `POST /consents` signing step.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron`).\n * @param params.disclaimerIds - Accepted vendor T&C ids.\n * @returns The vendor signing records.\n */\n async submitVendorDisclaimers(\n params: SubmitVendorDisclaimersParams,\n ): Promise<KycVendorSigning[]> {\n const url = new URL(\n `/vendors/${encodeURIComponent(params.vendor)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),\n });\n return this.#validateResponse(\n data,\n VendorSigningsResponseStruct,\n 'vendor disclaimers',\n );\n }\n\n /**\n * Fetches the global idOS + KYC-provider disclaimer catalog\n * (`GET /disclaimers?country=`). Does not include\n * `credentialReusabilityConsentGiven` — that is session-scoped via\n * {@link fetchSessionDisclaimers}. Vendor T&Cs continue to come from\n * {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The catalog documents.\n */\n async fetchDisclaimersCatalog({\n country,\n }: FetchDisclaimersCatalogParams): Promise<KycDisclaimersCatalog> {\n if (country.length !== 3) {\n throw new Error(\n `KycService.fetchDisclaimersCatalog: country must be an ISO 3166-1 alpha-3 code (received \"${country}\").`,\n );\n }\n\n const url = new URL('/disclaimers', this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchDisclaimersCatalog`, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n GlobalDisclaimersResponseStruct,\n 'disclaimers',\n );\n }\n\n /**\n * Fetches the session-scoped idOS + KYC-provider disclaimer catalog\n * (`GET /sessions/{sessionId}/disclaimers`), including per-session\n * `consented` flags and `credentialReusabilityConsentGiven`. For the\n * pre-session global catalog use {@link fetchDisclaimersCatalog}. Vendor\n * T&Cs continue to come from {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The catalog, including which documents are already consented.\n */\n async fetchSessionDisclaimers({\n sessionId,\n }: FetchSessionDisclaimersParams): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchSessionDisclaimers`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Consent state can change after a POST, so always re-fetch.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Records idOS + KYC-provider consents for a UKYC session\n * (`POST /sessions/{sessionId}/disclaimers`). `key`/`version` pairs must\n * match the current catalog from {@link fetchSessionDisclaimers}. A 409\n * means those document versions were already recorded for the session.\n *\n * @param params - The consent parameters.\n * @returns The updated catalog after recording.\n */\n async submitSessionDisclaimers(\n params: SubmitSessionDisclaimersParams,\n ): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n idOS: params.idOS,\n kycProvider: params.kycProvider,\n credentialReusabilityConsentGiven:\n params.credentialReusabilityConsentGiven,\n }),\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Fetches the user-keyed simplified KYC status used by Money toast / banner\n * surfaces (`GET /kyc/status`).\n *\n * @returns The simplified status payload.\n */\n async fetchKycStatus(): Promise<KycUserStatusResponse> {\n const url = new URL('/kyc/status', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchKycStatus`],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for toast flips, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n KycUserStatusResponseStruct,\n 'kyc status',\n );\n }\n\n /**\n * Fetches a well-known JWKS from `baseUrl`, caching the result for an hour.\n *\n * @param baseUrl - Host base URL that serves `/.well-known/jwks.json`.\n * @param queryName - Cache query-key segment.\n * @param responseLabel - Label used in malformed-response errors.\n * @param missingConfigMessage - Error thrown when `baseUrl` is empty.\n * @returns The JWKS keys.\n */\n async #fetchWellKnownJwks(\n baseUrl: string,\n queryName: string,\n responseLabel: string,\n missingConfigMessage: string,\n ): Promise<JwksResponse> {\n if (!baseUrl) {\n throw new Error(missingConfigMessage);\n }\n const url = new URL(UKYC_JWKS_PATH, baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:${queryName}`, baseUrl],\n queryFn: async () =>\n this.#requestJson(url, { method: 'GET' }, { authenticated: false }),\n staleTime: inMilliseconds(1, Duration.Hour),\n });\n return this.#validateResponse(data, JwksResponseStruct, responseLabel);\n }\n\n /**\n * Fetches the idOS enclave JWKS used to verify the\n * `encryptionDataKey` schema's `jwtChain` from\n * {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS enclave\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosEnclaveJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosEnclaveBaseUrl,\n 'fetchIdosEnclaveJwks',\n 'idOS enclave JWKS',\n 'KycService: idosEnclaveBaseUrl is not configured; cannot fetch JWKS to verify the encryptionDataKey schema.',\n );\n }\n\n /**\n * Fetches the idOS relay JWKS used to verify the `ukycCapabilityToken`\n * schema's `jwtChain` from {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS relay\n * host, distinct from both the UKYC base URL and the idOS enclave.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosRelayJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosRelayBaseUrl,\n 'fetchIdosRelayJwks',\n 'idOS relay JWKS',\n 'KycService: idosRelayBaseUrl is not configured; cannot fetch JWKS to verify the ukycCapabilityToken schema.',\n );\n }\n\n /**\n * Creates a UKYC session for the SumSub document-verification sub-flow.\n *\n * The client registers its per-session X25519 public key so the server can\n * later open boxes sealed with the matching private key, and supplies the\n * customer's ISO 3166-1 alpha-3 country of residence. The response\n * carries per-secret encryption schemas (`encryptionDataKey` and\n * `ukycCapabilityToken`) so the client can wrap the `data_encryption_key` and\n * the read-only `ukyc_capability_token` and submit them via\n * {@link KycService.setAuthorizations}.\n *\n * @param params - The session parameters.\n * @returns The UKYC session id and encryption schemas.\n */\n async createUkycSession(\n params: CreateUkycSessionParams,\n ): Promise<UkycSessionResponse> {\n const url = new URL('/sessions', this.#baseUrl);\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n vendorId: params.vendor ?? 'moonpay',\n vendorUserId: 'mockedId',\n jwtToken: params.jwtToken,\n sessionClientPublicKey: params.sessionClientPublicKey,\n residenceCountry: params.residenceCountry,\n vendorMetadata: params.vendorMetadata ?? {},\n }),\n });\n return this.#validateResponse(\n data,\n UkycSessionResponseStruct,\n 'UKYC sessions',\n );\n }\n\n /**\n * Submits the wrapped `data_encryption_key` and wrapped\n * `ukyc_capability_token` for a UKYC session. Both secrets are sealed with\n * `wrapEncryptionKey` against the encryption schemas returned by\n * {@link KycService.createUkycSession}.\n *\n * @param params - The wrapped authorizations.\n * @returns The session status after the authorizations are applied.\n */\n async setAuthorizations(\n params: SetAuthorizationsParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/authorizations`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,\n wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,\n }),\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'authorizations',\n );\n }\n\n /**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\n async createJourney(\n sessionId: string,\n ): Promise<ApplicantAccessTokenResponse> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/journey`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, { method: 'POST' });\n return this.#validateResponse(\n data,\n ApplicantAccessTokenResponseStruct,\n 'journey',\n );\n }\n\n /**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\n async getSessionStatus(\n params: GetSessionStatusParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/status`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getSessionStatus`, params.sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for a terminal decision, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'session status',\n );\n }\n\n /**\n * Validates a parsed API response against a superstruct schema, throwing a\n * descriptive error when the response does not match.\n *\n * Unlike a bare `Struct.is` check, this surfaces exactly which field was\n * missing or had the wrong type, which is essential for diagnosing shape\n * mismatches between the client and the live API.\n *\n * @param data - The parsed response body.\n * @param struct - The superstruct schema the body is expected to satisfy.\n * @param apiName - A human-readable name of the API, used in the error message.\n * @returns The validated, typed response.\n * @throws If `data` does not match `struct`.\n */\n #validateResponse<Type, Schema>(\n data: unknown,\n struct: Struct<Type, Schema>,\n apiName: string,\n ): Type {\n try {\n assert(data, struct);\n return data;\n } catch (error) {\n const detail =\n error instanceof StructError\n ? `${error.message} (received: ${JSON.stringify(data)})`\n : // `assert` only ever throws `StructError` for the plain structs used\n // here, so this is a defensive fallback that is not exercised.\n /* istanbul ignore next */\n String(error);\n throw new Error(\n `Malformed response received from ${apiName} API: ${detail}`,\n );\n }\n }\n\n /**\n * Performs a single JSON request.\n *\n * Read endpoints pass this as the `queryFn` to {@link fetchQuery}, which\n * wraps it in the shared service policy (retries, circuit breaker). Write\n * endpoints call it directly, so they are executed exactly once. Requests\n * are authenticated with the wallet bearer token by default; pass\n * `{ authenticated: false }` for calls to services that do not expect it\n * (e.g. the idOS enclave or idOS relay JWKS endpoints).\n *\n * @param url - The request URL.\n * @param init - The request init (method, body).\n * @param options - Request options.\n * @param options.authenticated - Whether to attach the bearer token. Defaults\n * to `true`.\n * @returns The parsed JSON response.\n */\n async #requestJson(\n url: URL,\n init: RequestInit,\n options: { authenticated?: boolean } = {},\n ): Promise<Json> {\n const { authenticated = true } = options;\n\n const headers: Record<string, string> = {};\n\n // Only advertise a JSON body when one is actually sent; bodyless requests\n // (e.g. `createJourney`) must not carry a `Content-Type`.\n if (init.body !== undefined && init.body !== null) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (authenticated) {\n const bearerToken = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n throw new Error(\n 'Unable to obtain an authentication bearer token — is the wallet signed in?',\n );\n }\n assert(bearerToken, string());\n headers.Authorization = `Bearer ${bearerToken}`;\n }\n\n const response = await this.#fetch(url.toString(), {\n ...init,\n headers,\n });\n if (!response.ok) {\n let detail = '';\n try {\n const errorBody: unknown = await response.json();\n if (errorBody && typeof errorBody === 'object') {\n const record = errorBody as Record<string, unknown>;\n if (typeof record.message === 'string') {\n detail = record.message;\n } else if (typeof record.error === 'string') {\n detail = record.error;\n }\n }\n } catch {\n // Ignore body parse failures; status alone is still useful.\n }\n throw new HttpError(\n response.status,\n `Fetching '${url.toString()}' failed with status '${response.status}'${\n detail ? `: ${detail}` : ''\n }`,\n );\n }\n\n // DELETE (and similar) endpoints return 204 No Content.\n if (response.status === 204) {\n return null;\n }\n\n return (await response.json()) as Json;\n }\n}\n"]}
@@ -343,13 +343,21 @@ export type GetSessionStatusParams = {
343
343
  * `fetch` when provided), and the auth bearer token and geolocation come from
344
344
  * other controllers via the messenger.
345
345
  *
346
- * It extends {@link BaseDataService}, so every request is routed through
347
- * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit
348
- * breaker) and its result is exposed via the service's `QueryClient`. Read-only
349
- * endpoints (`fetchVendorDisclaimers`, `fetchIdosEnclaveJwks`, `fetchIdosRelayJwks`) are cached
350
- * with a `staleTime`; vendor-disclaimer, session-scoped disclaimer,
351
- * session-creating, and status-polling endpoints opt out of caching
346
+ * It extends {@link BaseDataService}, so read-only endpoints are routed through
347
+ * `fetchQuery`: they are wrapped in the shared service policy (retries, circuit
348
+ * breaker) and their results are exposed via the service's `QueryClient`.
349
+ * `fetchDisclaimers` and `fetchJwks` are cached with a `staleTime`;
350
+ * session-scoped disclaimer and status-polling reads opt out of caching
352
351
  * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.
352
+ *
353
+ * Write endpoints (every `POST`) deliberately bypass `fetchQuery`. The query
354
+ * cache is built for idempotent reads: it deduplicates concurrent requests
355
+ * sharing a `queryKey`, retains responses for replay, and publishes them on the
356
+ * messenger via `cacheUpdated`. None of that is safe for calls that create
357
+ * sessions, customers, or consents — two overlapping `createVendorCustomer`
358
+ * calls would collapse into a single `POST`, and session tokens would be
359
+ * broadcast as cache payloads. Writes therefore call `#requestJson` directly,
360
+ * which also means they are not retried by the service policy.
353
361
  */
354
362
  export declare class KycService extends BaseDataService<typeof serviceName, KycServiceMessenger> {
355
363
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"KycService.d.cts","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KycService.d.cts","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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"}
@@ -343,13 +343,21 @@ export type GetSessionStatusParams = {
343
343
  * `fetch` when provided), and the auth bearer token and geolocation come from
344
344
  * other controllers via the messenger.
345
345
  *
346
- * It extends {@link BaseDataService}, so every request is routed through
347
- * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit
348
- * breaker) and its result is exposed via the service's `QueryClient`. Read-only
349
- * endpoints (`fetchVendorDisclaimers`, `fetchIdosEnclaveJwks`, `fetchIdosRelayJwks`) are cached
350
- * with a `staleTime`; vendor-disclaimer, session-scoped disclaimer,
351
- * session-creating, and status-polling endpoints opt out of caching
346
+ * It extends {@link BaseDataService}, so read-only endpoints are routed through
347
+ * `fetchQuery`: they are wrapped in the shared service policy (retries, circuit
348
+ * breaker) and their results are exposed via the service's `QueryClient`.
349
+ * `fetchDisclaimers` and `fetchJwks` are cached with a `staleTime`;
350
+ * session-scoped disclaimer and status-polling reads opt out of caching
352
351
  * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.
352
+ *
353
+ * Write endpoints (every `POST`) deliberately bypass `fetchQuery`. The query
354
+ * cache is built for idempotent reads: it deduplicates concurrent requests
355
+ * sharing a `queryKey`, retains responses for replay, and publishes them on the
356
+ * messenger via `cacheUpdated`. None of that is safe for calls that create
357
+ * sessions, customers, or consents — two overlapping `createVendorCustomer`
358
+ * calls would collapse into a single `POST`, and session tokens would be
359
+ * broadcast as cache payloads. Writes therefore call `#requestJson` directly,
360
+ * which also means they are not retried by the service policy.
353
361
  */
354
362
  export declare class KycService extends BaseDataService<typeof serviceName, KycServiceMessenger> {
355
363
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"KycService.d.mts","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KycService.d.mts","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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"}
@@ -145,13 +145,21 @@ const SessionDisclaimersResponseStruct = type({
145
145
  * `fetch` when provided), and the auth bearer token and geolocation come from
146
146
  * other controllers via the messenger.
147
147
  *
148
- * It extends {@link BaseDataService}, so every request is routed through
149
- * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit
150
- * breaker) and its result is exposed via the service's `QueryClient`. Read-only
151
- * endpoints (`fetchVendorDisclaimers`, `fetchIdosEnclaveJwks`, `fetchIdosRelayJwks`) are cached
152
- * with a `staleTime`; vendor-disclaimer, session-scoped disclaimer,
153
- * session-creating, and status-polling endpoints opt out of caching
148
+ * It extends {@link BaseDataService}, so read-only endpoints are routed through
149
+ * `fetchQuery`: they are wrapped in the shared service policy (retries, circuit
150
+ * breaker) and their results are exposed via the service's `QueryClient`.
151
+ * `fetchDisclaimers` and `fetchJwks` are cached with a `staleTime`;
152
+ * session-scoped disclaimer and status-polling reads opt out of caching
154
153
  * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.
154
+ *
155
+ * Write endpoints (every `POST`) deliberately bypass `fetchQuery`. The query
156
+ * cache is built for idempotent reads: it deduplicates concurrent requests
157
+ * sharing a `queryKey`, retains responses for replay, and publishes them on the
158
+ * messenger via `cacheUpdated`. None of that is safe for calls that create
159
+ * sessions, customers, or consents — two overlapping `createVendorCustomer`
160
+ * calls would collapse into a single `POST`, and session tokens would be
161
+ * broadcast as cache payloads. Writes therefore call `#requestJson` directly,
162
+ * which also means they are not retried by the service policy.
155
163
  */
156
164
  export class KycService extends BaseDataService {
157
165
  /**
@@ -254,20 +262,9 @@ export class KycService extends BaseDataService {
254
262
  */
255
263
  async createSession(params) {
256
264
  const url = new URL('/vendors/moonpay/sessions', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
257
- const data = await this.fetchQuery({
258
- queryKey: [
259
- `${this.name}:createSession`,
260
- params.email,
261
- params.termsAcceptedAt,
262
- params.disclaimerIds,
263
- ],
264
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
265
- method: 'POST',
266
- body: JSON.stringify(params),
267
- }),
268
- // A session-creating mutation must never serve a stale/cached result.
269
- staleTime: 0,
270
- gcTime: 0,
265
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
266
+ method: 'POST',
267
+ body: JSON.stringify(params),
271
268
  });
272
269
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, CreateSessionResponseStruct, 'sessions');
273
270
  }
@@ -298,21 +295,9 @@ export class KycService extends BaseDataService {
298
295
  throw new Error('checkKycRequired: country is required for vendor "moonpay".');
299
296
  }
300
297
  }
301
- const data = await this.fetchQuery({
302
- queryKey: [
303
- `${this.name}:checkKycRequired`,
304
- vendor,
305
- params.accessToken ?? null,
306
- params.country ?? null,
307
- capabilities,
308
- ],
309
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
310
- method: 'POST',
311
- body: JSON.stringify(body),
312
- }),
313
- // The requirement can change server-side, so always re-check.
314
- staleTime: 0,
315
- gcTime: 0,
298
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
299
+ method: 'POST',
300
+ body: JSON.stringify(body),
316
301
  });
317
302
  const { required } = __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, KycRequiredResponseStruct, 'kyc-required');
318
303
  return { kycRequired: required };
@@ -330,19 +315,9 @@ export class KycService extends BaseDataService {
330
315
  */
331
316
  async createVendorCustomer(params) {
332
317
  const url = new URL(`/vendors/${params.vendor}/customers`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
333
- const data = await this.fetchQuery({
334
- queryKey: [
335
- `${this.name}:createVendorCustomer`,
336
- params.vendor,
337
- params.email,
338
- ],
339
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
340
- method: 'POST',
341
- body: JSON.stringify({ email: params.email }),
342
- }),
343
- // Customer creation/resume must never serve a stale/cached result.
344
- staleTime: 0,
345
- gcTime: 0,
318
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
319
+ method: 'POST',
320
+ body: JSON.stringify({ email: params.email }),
346
321
  });
347
322
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, VendorCustomerResponseStruct, 'vendor customers');
348
323
  }
@@ -360,18 +335,9 @@ export class KycService extends BaseDataService {
360
335
  */
361
336
  async submitVendorDisclaimers(params) {
362
337
  const url = new URL(`/vendors/${encodeURIComponent(params.vendor)}/disclaimers`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
363
- const data = await this.fetchQuery({
364
- queryKey: [
365
- `${this.name}:submitVendorDisclaimers`,
366
- params.vendor,
367
- params.disclaimerIds,
368
- ],
369
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
370
- method: 'POST',
371
- body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),
372
- }),
373
- staleTime: 0,
374
- gcTime: 0,
338
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
339
+ method: 'POST',
340
+ body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),
375
341
  });
376
342
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, VendorSigningsResponseStruct, 'vendor disclaimers');
377
343
  }
@@ -433,24 +399,13 @@ export class KycService extends BaseDataService {
433
399
  */
434
400
  async submitSessionDisclaimers(params) {
435
401
  const url = new URL(`/sessions/${encodeURIComponent(params.sessionId)}/disclaimers`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
436
- const data = await this.fetchQuery({
437
- queryKey: [
438
- `${this.name}:submitSessionDisclaimers`,
439
- params.sessionId,
440
- params.idOS,
441
- params.kycProvider,
442
- params.credentialReusabilityConsentGiven,
443
- ],
444
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
445
- method: 'POST',
446
- body: JSON.stringify({
447
- idOS: params.idOS,
448
- kycProvider: params.kycProvider,
449
- credentialReusabilityConsentGiven: params.credentialReusabilityConsentGiven,
450
- }),
402
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
403
+ method: 'POST',
404
+ body: JSON.stringify({
405
+ idOS: params.idOS,
406
+ kycProvider: params.kycProvider,
407
+ credentialReusabilityConsentGiven: params.credentialReusabilityConsentGiven,
451
408
  }),
452
- staleTime: 0,
453
- gcTime: 0,
454
409
  });
455
410
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, SessionDisclaimersResponseStruct, 'session disclaimers');
456
411
  }
@@ -512,22 +467,16 @@ export class KycService extends BaseDataService {
512
467
  */
513
468
  async createUkycSession(params) {
514
469
  const url = new URL('/sessions', __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
515
- const data = await this.fetchQuery({
516
- queryKey: [`${this.name}:createUkycSession`, params.jwtToken],
517
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
518
- method: 'POST',
519
- body: JSON.stringify({
520
- vendorId: params.vendor ?? 'moonpay',
521
- vendorUserId: 'mockedId',
522
- jwtToken: params.jwtToken,
523
- sessionClientPublicKey: params.sessionClientPublicKey,
524
- residenceCountry: params.residenceCountry,
525
- vendorMetadata: params.vendorMetadata ?? {},
526
- }),
470
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
471
+ method: 'POST',
472
+ body: JSON.stringify({
473
+ vendorId: params.vendor ?? 'moonpay',
474
+ vendorUserId: 'mockedId',
475
+ jwtToken: params.jwtToken,
476
+ sessionClientPublicKey: params.sessionClientPublicKey,
477
+ residenceCountry: params.residenceCountry,
478
+ vendorMetadata: params.vendorMetadata ?? {},
527
479
  }),
528
- // A session-creating mutation must never serve a stale/cached result.
529
- staleTime: 0,
530
- gcTime: 0,
531
480
  });
532
481
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, UkycSessionResponseStruct, 'UKYC sessions');
533
482
  }
@@ -542,17 +491,12 @@ export class KycService extends BaseDataService {
542
491
  */
543
492
  async setAuthorizations(params) {
544
493
  const url = new URL(`/sessions/${encodeURIComponent(params.sessionId)}/authorizations`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
545
- const data = await this.fetchQuery({
546
- queryKey: [`${this.name}:setAuthorizations`, params.sessionId],
547
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
548
- method: 'POST',
549
- body: JSON.stringify({
550
- wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,
551
- wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,
552
- }),
494
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, {
495
+ method: 'POST',
496
+ body: JSON.stringify({
497
+ wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,
498
+ wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,
553
499
  }),
554
- staleTime: 0,
555
- gcTime: 0,
556
500
  });
557
501
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, SessionStatusResponseStruct, 'authorizations');
558
502
  }
@@ -565,13 +509,7 @@ export class KycService extends BaseDataService {
565
509
  */
566
510
  async createJourney(sessionId) {
567
511
  const url = new URL(`/sessions/${encodeURIComponent(sessionId)}/journey`, __classPrivateFieldGet(this, _KycService_baseUrl, "f"));
568
- const data = await this.fetchQuery({
569
- queryKey: [`${this.name}:createJourney`, sessionId],
570
- queryFn: async () => __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, { method: 'POST' }),
571
- // Journeys are (re)created on demand; do not reuse a cached token.
572
- staleTime: 0,
573
- gcTime: 0,
574
- });
512
+ const data = await __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_requestJson).call(this, url, { method: 'POST' });
575
513
  return __classPrivateFieldGet(this, _KycService_instances, "m", _KycService_validateResponse).call(this, data, ApplicantAccessTokenResponseStruct, 'journey');
576
514
  }
577
515
  /**
@@ -633,8 +571,9 @@ async function _KycService_fetchWellKnownJwks(baseUrl, queryName, responseLabel,
633
571
  /**
634
572
  * Performs a single JSON request.
635
573
  *
636
- * This is meant to be used as the `queryFn` for {@link fetchQuery}, which
637
- * wraps it in the shared service policy (retries, circuit breaker). Requests
574
+ * Read endpoints pass this as the `queryFn` to {@link fetchQuery}, which
575
+ * wraps it in the shared service policy (retries, circuit breaker). Write
576
+ * endpoints call it directly, so they are executed exactly once. Requests
638
577
  * are authenticated with the wallet bearer token by default; pass
639
578
  * `{ authenticated: false }` for calls to services that do not expect it
640
579
  * (e.g. the idOS enclave or idOS relay JWKS endpoints).
@@ -1 +1 @@
1
- {"version":3,"file":"KycService.mjs","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport { HttpError } from '@metamask/controller-utils';\nimport type { GeolocationControllerGetGeolocationAction } from '@metamask/geolocation-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationControllerGetBearerTokenAction } from '@metamask/profile-sync-controller/auth';\nimport type { Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n enums,\n optional,\n string,\n StructError,\n type,\n} from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport { Duration, inMilliseconds } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { alpha2ToAlpha3 } from './countryCodes.js';\nimport type { KycServiceMethodActions } from './KycService-method-action-types.js';\nimport type {\n KycConsentRecord,\n KycDisclaimer,\n KycDisclaimersCatalog,\n KycSessionDisclaimers,\n KycSessionStatus,\n KycUserStatusResponse,\n KycVendor,\n KycVendorSigning,\n} from './types.js';\nimport { UKYC_JWKS_PATH } from './ukyc/constants.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link KycService}, used to namespace the service's actions.\n */\nexport const serviceName = 'KycService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getGeoCountry',\n 'fetchVendorDisclaimers',\n 'createSession',\n 'checkKycRequired',\n 'createVendorCustomer',\n 'submitVendorDisclaimers',\n 'fetchDisclaimersCatalog',\n 'fetchSessionDisclaimers',\n 'submitSessionDisclaimers',\n 'fetchKycStatus',\n 'fetchIdosEnclaveJwks',\n 'fetchIdosRelayJwks',\n 'createUkycSession',\n 'setAuthorizations',\n 'createJourney',\n 'getSessionStatus',\n] as const;\n\n/**\n * Invalidates cached queries serviced by {@link KycService}.\n */\nexport type KycServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceActions =\n | KycServiceMethodActions\n | KycServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link KycService} calls.\n */\ntype AllowedActions =\n | AuthenticationControllerGetBearerTokenAction\n | GeolocationControllerGetGeolocationAction;\n\n/**\n * Published when {@link KycService}'s cache is updated.\n */\nexport type KycServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a single key within {@link KycService}'s cache is updated.\n */\nexport type KycServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceEvents =\n | KycServiceCacheUpdatedEvent\n | KycServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link KycService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link KycService}.\n */\nexport type KycServiceMessenger = Messenger<\n typeof serviceName,\n KycServiceActions | AllowedActions,\n KycServiceEvents | AllowedEvents\n>;\n\n/**\n * Options for constructing a {@link KycService}.\n */\nexport type KycServiceOptions = {\n messenger: KycServiceMessenger;\n /**\n * A function used to make HTTP requests. Defaults to the runtime's native\n * `fetch`, so consumers do not need to inject one on platforms where `fetch`\n * is available globally (browser, React Native, Node 18+).\n */\n fetch?: typeof fetch;\n /**\n * Mandatory value that sets the base url to KYC api\n */\n baseUrl: string;\n /**\n * Base URL of the idOS enclave, from which the JWKS used to\n * verify the `encryptionDataKey` schema's `jwtChain` is fetched.\n */\n idosEnclaveBaseUrl?: string;\n /**\n * Base URL of the idOS relay, from which the JWKS used to verify the\n * `ukycCapabilityToken` schema's `jwtChain` is fetched.\n */\n idosRelayBaseUrl?: string;\n /**\n * Shared configuration applied to all queries exposed by the service (e.g. a\n * default `staleTime`/`gcTime`). Each data service gets its own\n * `QueryClient`.\n */\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n};\n\n// === API RESPONSE SCHEMAS ===\n\nconst DisclaimerStruct = type({\n id: string(),\n display_name: string(),\n url: string(),\n});\nconst DisclaimersResponseStruct = array(DisclaimerStruct);\n\nconst VendorSigningStruct = type({\n id: string(),\n customer_id: string(),\n content_id: optional(string()),\n});\nconst VendorSigningsResponseStruct = array(VendorSigningStruct);\n\nconst CreateSessionResponseStruct = type({ sessionToken: string() });\n\n// The live KYC API returns the flag under `required`; the service normalizes\n// this to `kycRequired` for consumers (see `checkKycRequired`).\nconst KycRequiredResponseStruct = type({ required: boolean() });\n\n// The session server's public key, in JWK-like form, returned inside an\n// encryption schema from `POST /sessions`. `x` is the base64url public key\n// used to wrap a secret for that schema.\nconst ServerPublicKeyStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: optional(string()),\n alg: optional(string()),\n use: optional(string()),\n});\n\nconst EncryptionSchemaStruct = type({\n serverPublicKey: ServerPublicKeyStruct,\n jwtChain: string(),\n});\nexport type EncryptionSchema = Infer<typeof EncryptionSchemaStruct>;\n\n// A single Ed25519 (OKP) JWK. `type` (not `object`) keeps optional/extra JWK\n// fields (`use`, `alg`) from failing validation.\nconst JwkStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: string(),\n});\nconst JwksResponseStruct = type({ keys: array(JwkStruct) });\nexport type JwksResponse = Infer<typeof JwksResponseStruct>;\n\nconst UkycSessionResponseStruct = type({\n sessionId: string(),\n // Per-secret wrapping material so the client can seal the\n // `data_encryption_key` and the `ukyc_capability_token` independently.\n encryptionDataKey: EncryptionSchemaStruct,\n ukycCapabilityToken: EncryptionSchemaStruct,\n});\nexport type UkycSessionResponse = Infer<typeof UkycSessionResponseStruct>;\n\nconst ApplicantAccessTokenResponseStruct = type({\n status: string(),\n applicantAccessToken: string(),\n});\nexport type ApplicantAccessTokenResponse = Infer<\n typeof ApplicantAccessTokenResponseStruct\n>;\n\nconst SessionStatusResponseStruct = type({\n finalStatus: string(),\n statusMessage: optional(string()),\n externalUserId: string(),\n kycStatus: string(),\n vendor: string(),\n vendorStatus: string(),\n});\n\n// Vendor customer subset — `type` (not `object`) keeps extra vendor fields from\n// failing validation while still requiring the fields the controller needs.\nconst VendorCustomerResponseStruct = type({\n id: string(),\n email: string(),\n status: string(),\n});\nexport type VendorCustomerResponse = Infer<typeof VendorCustomerResponseStruct>;\n\nconst KYC_USER_STATUSES = [\n 'not-started',\n 'pending',\n 'need-more-information',\n 'terminal-failure',\n 'completed',\n] as const;\n\nconst KycUserStatusResponseStruct = type({\n status: enums([...KYC_USER_STATUSES]),\n sumsubSessionId: optional(string()),\n errorCode: optional(string()),\n});\n\nconst ConsentDocumentStruct = type({\n key: string(),\n version: string(),\n title: string(),\n url: string(),\n consented: boolean(),\n});\n\nconst DisclaimersCatalogFields = {\n idOS: array(ConsentDocumentStruct),\n kycProvider: array(ConsentDocumentStruct),\n} as const;\n\n/** Global catalog from `GET /disclaimers` (no credential-reuse flag). */\nconst GlobalDisclaimersResponseStruct = type(DisclaimersCatalogFields);\n\n/** Session catalog from `GET`/`POST /sessions/{id}/disclaimers`. */\nconst SessionDisclaimersResponseStruct = type({\n ...DisclaimersCatalogFields,\n credentialReusabilityConsentGiven: boolean(),\n});\n\n// === PARAM TYPES ===\n\nexport type CreateSessionParams = {\n email: string;\n termsAcceptedAt: string;\n disclaimerIds: string[];\n};\n\nexport type CheckKycRequiredParams = {\n /**\n * Identity vendor to check. Defaults to `moonpay` for the existing\n * Check/Auth path.\n */\n vendor?: KycVendor;\n /**\n * MoonPay access token. Required when `vendor` is `moonpay` (or omitted).\n */\n accessToken?: string;\n /**\n * ISO 3166-1 alpha-3 country code. Required when `vendor` is `moonpay`.\n */\n country?: string;\n capabilities?: { product: string }[];\n};\n\nexport type CreateVendorCustomerParams = {\n vendor: KycVendor;\n email: string;\n};\n\nexport type SubmitVendorDisclaimersParams = {\n /** Identity vendor whose T&Cs were accepted (currently `iron`). */\n vendor: KycVendor;\n /** Disclaimer ids from {@link KycService.fetchVendorDisclaimers}. */\n disclaimerIds: string[];\n};\n\nexport type FetchDisclaimersCatalogParams = {\n /** ISO 3166-1 alpha-3 country code for `GET /disclaimers?country=`. */\n country: string;\n};\n\nexport type FetchSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n};\n\nexport type SubmitSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n /** Consents to the idOS legal documents (`key`/`version` from the catalog). */\n idOS: KycConsentRecord[];\n /**\n * Consents to the KYC provider (SumSub) legal documents (`key`/`version`\n * from the catalog).\n */\n kycProvider: KycConsentRecord[];\n /** Consent to reuse the user's existing idOS credentials. */\n credentialReusabilityConsentGiven: boolean;\n};\n\nexport type CreateUkycSessionParams = {\n jwtToken: string;\n /**\n * The client's per-session X25519 public key (unpadded base64url). Generated\n * with the matching private key used later to wrap authorizations, so the\n * session server can open those boxes.\n */\n sessionClientPublicKey: string;\n /**\n * Country of residence in ISO 3166-1 alpha-3 format (e.g. `USA`, `GBR`).\n */\n residenceCountry: string;\n /**\n * Identity vendor for the UKYC session. Defaults to `moonpay` for the\n * existing Check/Auth flow. Pass a non-MoonPay vendor (e.g. `iron`) for\n * the consents path (no MoonPay metadata required).\n */\n vendor?: KycVendor;\n /**\n * Vendor-specific metadata. Required for MoonPay (`moonPayAccessToken` /\n * `moonPayUserId`); optional / omitted for other vendors.\n */\n vendorMetadata?: Record<string, unknown>;\n};\n\n/**\n * Encrypted capability authorization payload (base64url nonce + ciphertext)\n * accepted by `POST /sessions/:sessionId/authorizations`. Produced by\n * `wrapEncryptionKey` for both the `data_encryption_key` and the\n * `ukyc_capability_token`.\n */\nexport type CapabilityAuthorization = {\n nonce: string;\n data: string;\n};\n\nexport type SetAuthorizationsParams = {\n sessionId: string;\n wrappedEncryptionDataKey: CapabilityAuthorization;\n wrappedUkycCapabilityToken: CapabilityAuthorization;\n};\n\nexport type GetSessionStatusParams = {\n sessionId: string;\n};\n\n// === SERVICE DEFINITION ===\n\n/**\n * `KycService` communicates with the Universal KYC (UKYC) backend to drive the\n * identity + document-verification flow. It is stateless and platform-agnostic:\n * HTTP is performed through the runtime's native `fetch` (or an injected\n * `fetch` when provided), and the auth bearer token and geolocation come from\n * other controllers via the messenger.\n *\n * It extends {@link BaseDataService}, so every request is routed through\n * `fetchQuery`: it is wrapped in the shared service policy (retries, circuit\n * breaker) and its result is exposed via the service's `QueryClient`. Read-only\n * endpoints (`fetchVendorDisclaimers`, `fetchIdosEnclaveJwks`, `fetchIdosRelayJwks`) are cached\n * with a `staleTime`; vendor-disclaimer, session-scoped disclaimer,\n * session-creating, and status-polling endpoints opt out of caching\n * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.\n */\nexport class KycService extends BaseDataService<\n typeof serviceName,\n KycServiceMessenger\n> {\n readonly #fetch: typeof fetch;\n\n readonly #baseUrl: string;\n\n readonly #idosEnclaveBaseUrl: string;\n\n readonly #idosRelayBaseUrl: string;\n\n /**\n * Constructs a new KycService.\n *\n * @param options - The constructor options.\n * @param options.messenger - The messenger suited for this service.\n * @param options.fetch - A function used to make HTTP requests. Defaults to\n * the runtime's native `fetch`.\n * @param options.baseUrl - Base URL of the KYC API\n * @param options.idosEnclaveBaseUrl - Base URL of the idOS enclave, from\n * which the JWKS used to verify the `encryptionDataKey` schema's `jwtChain`\n * is fetched.\n * @param options.idosRelayBaseUrl - Base URL of the idOS relay, from which\n * the JWKS used to verify the `ukycCapabilityToken` schema's `jwtChain` is\n * fetched.\n * @param options.queryClientConfig - Shared configuration for all queries\n * exposed by the service.\n * @param options.policyOptions - Options for the request service policy.\n */\n constructor({\n messenger,\n fetch: fetchFunction,\n baseUrl,\n idosEnclaveBaseUrl,\n idosRelayBaseUrl,\n queryClientConfig = {},\n policyOptions = {},\n }: KycServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions,\n });\n // Fall back to the runtime's native `fetch`, bound to `globalThis` so it\n // can be invoked as a method of this instance without an illegal-invocation\n // error on platforms that check the receiver.\n if (fetchFunction) {\n this.#fetch = fetchFunction;\n } else if (typeof globalThis.fetch === 'function') {\n this.#fetch = globalThis.fetch.bind(globalThis);\n } else {\n throw new Error(\n 'KycService: fetch is not available globally and was not provided in options. Please inject a fetch implementation.',\n );\n }\n if (!baseUrl) {\n throw new Error('KycService: baseUrl is required');\n }\n this.#baseUrl = baseUrl;\n this.#idosEnclaveBaseUrl = idosEnclaveBaseUrl ?? '';\n this.#idosRelayBaseUrl = idosRelayBaseUrl ?? '';\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\n async getGeoCountry(): Promise<string> {\n const location = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n // Guard nullish/empty geolocation with the documented domain error rather\n // than letting `assert(location, string())` surface a superstruct\n // assertion error (which would change how the failure reads in\n // `disclaimersError`).\n const alpha2 =\n typeof location === 'string' ? location.split('-')[0].toUpperCase() : '';\n if (!alpha2 || alpha2 === 'UNKNOWN') {\n throw new Error(\n `Unable to determine country from geolocation (got \"${String(\n location,\n )}\").`,\n );\n }\n const alpha3 = alpha2ToAlpha3(alpha2);\n if (!alpha3) {\n throw new Error(\n `Unable to map country code \"${alpha2}\" to an ISO 3166-1 alpha-3 code.`,\n );\n }\n return alpha3;\n }\n\n /**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor. Defaults to `moonpay`.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\n async fetchVendorDisclaimers({\n vendor = 'moonpay',\n country,\n }: {\n vendor?: KycVendor;\n country: string;\n }): Promise<KycDisclaimer[]> {\n const url = new URL(`/vendors/${vendor}/disclaimers`, this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchVendorDisclaimers`, vendor, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: inMilliseconds(5, Duration.Minute),\n });\n return this.#validateResponse(\n data,\n DisclaimersResponseStruct,\n 'disclaimers',\n ) as KycDisclaimer[];\n }\n\n /**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\n async createSession(\n params: CreateSessionParams,\n ): Promise<Infer<typeof CreateSessionResponseStruct>> {\n const url = new URL('/vendors/moonpay/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createSession`,\n params.email,\n params.termsAcceptedAt,\n params.disclaimerIds,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(params),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n CreateSessionResponseStruct,\n 'sessions',\n );\n }\n\n /**\n * Checks whether KYC is required for the given vendor, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\n async checkKycRequired(\n params: CheckKycRequiredParams,\n ): Promise<{ kycRequired: boolean }> {\n const vendor = params.vendor ?? 'moonpay';\n const url = new URL(`/vendors/${vendor}/kyc-required`, this.#baseUrl);\n const capabilities = params.capabilities ?? [{ product: 'ramps' }];\n const body =\n vendor === 'moonpay'\n ? {\n accessToken: params.accessToken,\n country: params.country,\n capabilities,\n }\n : {};\n\n // MoonPay requires accessToken and country; validate before making the request.\n if (vendor === 'moonpay') {\n if (!params.accessToken) {\n throw new Error(\n 'checkKycRequired: accessToken is required for vendor \"moonpay\".',\n );\n }\n if (!params.country) {\n throw new Error(\n 'checkKycRequired: country is required for vendor \"moonpay\".',\n );\n }\n }\n\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:checkKycRequired`,\n vendor,\n params.accessToken ?? null,\n params.country ?? null,\n capabilities,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n // The requirement can change server-side, so always re-check.\n staleTime: 0,\n gcTime: 0,\n });\n const { required } = this.#validateResponse(\n data,\n KycRequiredResponseStruct,\n 'kyc-required',\n );\n return { kycRequired: required };\n }\n\n /**\n * Creates (or resumes) an empty-shell customer for the authenticated\n * canonical user on the given identity vendor. Must run before showing\n * vendor T&C so the customer exists and resume logic can key off vendor\n * status.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron` for Money/VBA).\n * @param params.email - Email associated with the customer.\n * @returns The vendor customer record (subset validated for controller use).\n */\n async createVendorCustomer(\n params: CreateVendorCustomerParams,\n ): Promise<VendorCustomerResponse> {\n const url = new URL(`/vendors/${params.vendor}/customers`, this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:createVendorCustomer`,\n params.vendor,\n params.email,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ email: params.email }),\n }),\n // Customer creation/resume must never serve a stale/cached result.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n VendorCustomerResponseStruct,\n 'vendor customers',\n );\n }\n\n /**\n * Records vendor T&C acceptance (`POST /vendors/{vendor}/disclaimers`).\n * For Iron this creates content signings from the disclaimer ids the\n * customer accepted. Session-scoped idOS / KYC-provider consents are\n * recorded separately via {@link submitSessionDisclaimers}. Retries re-POST\n * the same ids, matching the legacy `POST /consents` signing step.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron`).\n * @param params.disclaimerIds - Accepted vendor T&C ids.\n * @returns The vendor signing records.\n */\n async submitVendorDisclaimers(\n params: SubmitVendorDisclaimersParams,\n ): Promise<KycVendorSigning[]> {\n const url = new URL(\n `/vendors/${encodeURIComponent(params.vendor)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:submitVendorDisclaimers`,\n params.vendor,\n params.disclaimerIds,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),\n }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n VendorSigningsResponseStruct,\n 'vendor disclaimers',\n );\n }\n\n /**\n * Fetches the global idOS + KYC-provider disclaimer catalog\n * (`GET /disclaimers?country=`). Does not include\n * `credentialReusabilityConsentGiven` — that is session-scoped via\n * {@link fetchSessionDisclaimers}. Vendor T&Cs continue to come from\n * {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The catalog documents.\n */\n async fetchDisclaimersCatalog({\n country,\n }: FetchDisclaimersCatalogParams): Promise<KycDisclaimersCatalog> {\n if (country.length !== 3) {\n throw new Error(\n `KycService.fetchDisclaimersCatalog: country must be an ISO 3166-1 alpha-3 code (received \"${country}\").`,\n );\n }\n\n const url = new URL('/disclaimers', this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchDisclaimersCatalog`, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n GlobalDisclaimersResponseStruct,\n 'disclaimers',\n );\n }\n\n /**\n * Fetches the session-scoped idOS + KYC-provider disclaimer catalog\n * (`GET /sessions/{sessionId}/disclaimers`), including per-session\n * `consented` flags and `credentialReusabilityConsentGiven`. For the\n * pre-session global catalog use {@link fetchDisclaimersCatalog}. Vendor\n * T&Cs continue to come from {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The catalog, including which documents are already consented.\n */\n async fetchSessionDisclaimers({\n sessionId,\n }: FetchSessionDisclaimersParams): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchSessionDisclaimers`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Consent state can change after a POST, so always re-fetch.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Records idOS + KYC-provider consents for a UKYC session\n * (`POST /sessions/{sessionId}/disclaimers`). `key`/`version` pairs must\n * match the current catalog from {@link fetchSessionDisclaimers}. A 409\n * means those document versions were already recorded for the session.\n *\n * @param params - The consent parameters.\n * @returns The updated catalog after recording.\n */\n async submitSessionDisclaimers(\n params: SubmitSessionDisclaimersParams,\n ): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [\n `${this.name}:submitSessionDisclaimers`,\n params.sessionId,\n params.idOS,\n params.kycProvider,\n params.credentialReusabilityConsentGiven,\n ],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n idOS: params.idOS,\n kycProvider: params.kycProvider,\n credentialReusabilityConsentGiven:\n params.credentialReusabilityConsentGiven,\n }),\n }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Fetches the user-keyed simplified KYC status used by Money toast / banner\n * surfaces (`GET /kyc/status`).\n *\n * @returns The simplified status payload.\n */\n async fetchKycStatus(): Promise<KycUserStatusResponse> {\n const url = new URL('/kyc/status', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchKycStatus`],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for toast flips, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n KycUserStatusResponseStruct,\n 'kyc status',\n );\n }\n\n /**\n * Fetches a well-known JWKS from `baseUrl`, caching the result for an hour.\n *\n * @param baseUrl - Host base URL that serves `/.well-known/jwks.json`.\n * @param queryName - Cache query-key segment.\n * @param responseLabel - Label used in malformed-response errors.\n * @param missingConfigMessage - Error thrown when `baseUrl` is empty.\n * @returns The JWKS keys.\n */\n async #fetchWellKnownJwks(\n baseUrl: string,\n queryName: string,\n responseLabel: string,\n missingConfigMessage: string,\n ): Promise<JwksResponse> {\n if (!baseUrl) {\n throw new Error(missingConfigMessage);\n }\n const url = new URL(UKYC_JWKS_PATH, baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:${queryName}`, baseUrl],\n queryFn: async () =>\n this.#requestJson(url, { method: 'GET' }, { authenticated: false }),\n staleTime: inMilliseconds(1, Duration.Hour),\n });\n return this.#validateResponse(data, JwksResponseStruct, responseLabel);\n }\n\n /**\n * Fetches the idOS enclave JWKS used to verify the\n * `encryptionDataKey` schema's `jwtChain` from\n * {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS enclave\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosEnclaveJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosEnclaveBaseUrl,\n 'fetchIdosEnclaveJwks',\n 'idOS enclave JWKS',\n 'KycService: idosEnclaveBaseUrl is not configured; cannot fetch JWKS to verify the encryptionDataKey schema.',\n );\n }\n\n /**\n * Fetches the idOS relay JWKS used to verify the `ukycCapabilityToken`\n * schema's `jwtChain` from {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS relay\n * host, distinct from both the UKYC base URL and the idOS enclave.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosRelayJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosRelayBaseUrl,\n 'fetchIdosRelayJwks',\n 'idOS relay JWKS',\n 'KycService: idosRelayBaseUrl is not configured; cannot fetch JWKS to verify the ukycCapabilityToken schema.',\n );\n }\n\n /**\n * Creates a UKYC session for the SumSub document-verification sub-flow.\n *\n * The client registers its per-session X25519 public key so the server can\n * later open boxes sealed with the matching private key, and supplies the\n * customer's ISO 3166-1 alpha-3 country of residence. The response\n * carries per-secret encryption schemas (`encryptionDataKey` and\n * `ukycCapabilityToken`) so the client can wrap the `data_encryption_key` and\n * the read-only `ukyc_capability_token` and submit them via\n * {@link KycService.setAuthorizations}.\n *\n * @param params - The session parameters.\n * @returns The UKYC session id and encryption schemas.\n */\n async createUkycSession(\n params: CreateUkycSessionParams,\n ): Promise<UkycSessionResponse> {\n const url = new URL('/sessions', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:createUkycSession`, params.jwtToken],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n vendorId: params.vendor ?? 'moonpay',\n vendorUserId: 'mockedId',\n jwtToken: params.jwtToken,\n sessionClientPublicKey: params.sessionClientPublicKey,\n residenceCountry: params.residenceCountry,\n vendorMetadata: params.vendorMetadata ?? {},\n }),\n }),\n // A session-creating mutation must never serve a stale/cached result.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n UkycSessionResponseStruct,\n 'UKYC sessions',\n );\n }\n\n /**\n * Submits the wrapped `data_encryption_key` and wrapped\n * `ukyc_capability_token` for a UKYC session. Both secrets are sealed with\n * `wrapEncryptionKey` against the encryption schemas returned by\n * {@link KycService.createUkycSession}.\n *\n * @param params - The wrapped authorizations.\n * @returns The session status after the authorizations are applied.\n */\n async setAuthorizations(\n params: SetAuthorizationsParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/authorizations`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:setAuthorizations`, params.sessionId],\n queryFn: async () =>\n this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,\n wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,\n }),\n }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'authorizations',\n );\n }\n\n /**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\n async createJourney(\n sessionId: string,\n ): Promise<ApplicantAccessTokenResponse> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/journey`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:createJourney`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'POST' }),\n // Journeys are (re)created on demand; do not reuse a cached token.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n ApplicantAccessTokenResponseStruct,\n 'journey',\n );\n }\n\n /**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\n async getSessionStatus(\n params: GetSessionStatusParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/status`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getSessionStatus`, params.sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for a terminal decision, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'session status',\n );\n }\n\n /**\n * Validates a parsed API response against a superstruct schema, throwing a\n * descriptive error when the response does not match.\n *\n * Unlike a bare `Struct.is` check, this surfaces exactly which field was\n * missing or had the wrong type, which is essential for diagnosing shape\n * mismatches between the client and the live API.\n *\n * @param data - The parsed response body.\n * @param struct - The superstruct schema the body is expected to satisfy.\n * @param apiName - A human-readable name of the API, used in the error message.\n * @returns The validated, typed response.\n * @throws If `data` does not match `struct`.\n */\n #validateResponse<Type, Schema>(\n data: unknown,\n struct: Struct<Type, Schema>,\n apiName: string,\n ): Type {\n try {\n assert(data, struct);\n return data;\n } catch (error) {\n const detail =\n error instanceof StructError\n ? `${error.message} (received: ${JSON.stringify(data)})`\n : // `assert` only ever throws `StructError` for the plain structs used\n // here, so this is a defensive fallback that is not exercised.\n /* istanbul ignore next */\n String(error);\n throw new Error(\n `Malformed response received from ${apiName} API: ${detail}`,\n );\n }\n }\n\n /**\n * Performs a single JSON request.\n *\n * This is meant to be used as the `queryFn` for {@link fetchQuery}, which\n * wraps it in the shared service policy (retries, circuit breaker). Requests\n * are authenticated with the wallet bearer token by default; pass\n * `{ authenticated: false }` for calls to services that do not expect it\n * (e.g. the idOS enclave or idOS relay JWKS endpoints).\n *\n * @param url - The request URL.\n * @param init - The request init (method, body).\n * @param options - Request options.\n * @param options.authenticated - Whether to attach the bearer token. Defaults\n * to `true`.\n * @returns The parsed JSON response.\n */\n async #requestJson(\n url: URL,\n init: RequestInit,\n options: { authenticated?: boolean } = {},\n ): Promise<Json> {\n const { authenticated = true } = options;\n\n const headers: Record<string, string> = {};\n\n // Only advertise a JSON body when one is actually sent; bodyless requests\n // (e.g. `createJourney`) must not carry a `Content-Type`.\n if (init.body !== undefined && init.body !== null) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (authenticated) {\n const bearerToken = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n throw new Error(\n 'Unable to obtain an authentication bearer token — is the wallet signed in?',\n );\n }\n assert(bearerToken, string());\n headers.Authorization = `Bearer ${bearerToken}`;\n }\n\n const response = await this.#fetch(url.toString(), {\n ...init,\n headers,\n });\n if (!response.ok) {\n let detail = '';\n try {\n const errorBody: unknown = await response.json();\n if (errorBody && typeof errorBody === 'object') {\n const record = errorBody as Record<string, unknown>;\n if (typeof record.message === 'string') {\n detail = record.message;\n } else if (typeof record.error === 'string') {\n detail = record.error;\n }\n }\n } catch {\n // Ignore body parse failures; status alone is still useful.\n }\n throw new HttpError(\n response.status,\n `Fetching '${url.toString()}' failed with status '${response.status}'${\n detail ? `: ${detail}` : ''\n }`,\n );\n }\n\n // DELETE (and similar) endpoints return 204 No Content.\n if (response.status === 204) {\n return null;\n }\n\n return (await response.json()) as Json;\n }\n}\n"]}
1
+ {"version":3,"file":"KycService.mjs","sourceRoot":"","sources":["../src/KycService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport { HttpError } from '@metamask/controller-utils';\nimport type { GeolocationControllerGetGeolocationAction } from '@metamask/geolocation-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationControllerGetBearerTokenAction } from '@metamask/profile-sync-controller/auth';\nimport type { Infer, Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n enums,\n optional,\n string,\n StructError,\n type,\n} from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport { Duration, inMilliseconds } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { alpha2ToAlpha3 } from './countryCodes.js';\nimport type { KycServiceMethodActions } from './KycService-method-action-types.js';\nimport type {\n KycConsentRecord,\n KycDisclaimer,\n KycDisclaimersCatalog,\n KycSessionDisclaimers,\n KycSessionStatus,\n KycUserStatusResponse,\n KycVendor,\n KycVendorSigning,\n} from './types.js';\nimport { UKYC_JWKS_PATH } from './ukyc/constants.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link KycService}, used to namespace the service's actions.\n */\nexport const serviceName = 'KycService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getGeoCountry',\n 'fetchVendorDisclaimers',\n 'createSession',\n 'checkKycRequired',\n 'createVendorCustomer',\n 'submitVendorDisclaimers',\n 'fetchDisclaimersCatalog',\n 'fetchSessionDisclaimers',\n 'submitSessionDisclaimers',\n 'fetchKycStatus',\n 'fetchIdosEnclaveJwks',\n 'fetchIdosRelayJwks',\n 'createUkycSession',\n 'setAuthorizations',\n 'createJourney',\n 'getSessionStatus',\n] as const;\n\n/**\n * Invalidates cached queries serviced by {@link KycService}.\n */\nexport type KycServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceActions =\n | KycServiceMethodActions\n | KycServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link KycService} calls.\n */\ntype AllowedActions =\n | AuthenticationControllerGetBearerTokenAction\n | GeolocationControllerGetGeolocationAction;\n\n/**\n * Published when {@link KycService}'s cache is updated.\n */\nexport type KycServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a single key within {@link KycService}'s cache is updated.\n */\nexport type KycServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link KycService} exposes to other consumers.\n */\nexport type KycServiceEvents =\n | KycServiceCacheUpdatedEvent\n | KycServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link KycService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link KycService}.\n */\nexport type KycServiceMessenger = Messenger<\n typeof serviceName,\n KycServiceActions | AllowedActions,\n KycServiceEvents | AllowedEvents\n>;\n\n/**\n * Options for constructing a {@link KycService}.\n */\nexport type KycServiceOptions = {\n messenger: KycServiceMessenger;\n /**\n * A function used to make HTTP requests. Defaults to the runtime's native\n * `fetch`, so consumers do not need to inject one on platforms where `fetch`\n * is available globally (browser, React Native, Node 18+).\n */\n fetch?: typeof fetch;\n /**\n * Mandatory value that sets the base url to KYC api\n */\n baseUrl: string;\n /**\n * Base URL of the idOS enclave, from which the JWKS used to\n * verify the `encryptionDataKey` schema's `jwtChain` is fetched.\n */\n idosEnclaveBaseUrl?: string;\n /**\n * Base URL of the idOS relay, from which the JWKS used to verify the\n * `ukycCapabilityToken` schema's `jwtChain` is fetched.\n */\n idosRelayBaseUrl?: string;\n /**\n * Shared configuration applied to all queries exposed by the service (e.g. a\n * default `staleTime`/`gcTime`). Each data service gets its own\n * `QueryClient`.\n */\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n};\n\n// === API RESPONSE SCHEMAS ===\n\nconst DisclaimerStruct = type({\n id: string(),\n display_name: string(),\n url: string(),\n});\nconst DisclaimersResponseStruct = array(DisclaimerStruct);\n\nconst VendorSigningStruct = type({\n id: string(),\n customer_id: string(),\n content_id: optional(string()),\n});\nconst VendorSigningsResponseStruct = array(VendorSigningStruct);\n\nconst CreateSessionResponseStruct = type({ sessionToken: string() });\n\n// The live KYC API returns the flag under `required`; the service normalizes\n// this to `kycRequired` for consumers (see `checkKycRequired`).\nconst KycRequiredResponseStruct = type({ required: boolean() });\n\n// The session server's public key, in JWK-like form, returned inside an\n// encryption schema from `POST /sessions`. `x` is the base64url public key\n// used to wrap a secret for that schema.\nconst ServerPublicKeyStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: optional(string()),\n alg: optional(string()),\n use: optional(string()),\n});\n\nconst EncryptionSchemaStruct = type({\n serverPublicKey: ServerPublicKeyStruct,\n jwtChain: string(),\n});\nexport type EncryptionSchema = Infer<typeof EncryptionSchemaStruct>;\n\n// A single Ed25519 (OKP) JWK. `type` (not `object`) keeps optional/extra JWK\n// fields (`use`, `alg`) from failing validation.\nconst JwkStruct = type({\n kty: string(),\n crv: string(),\n x: string(),\n kid: string(),\n});\nconst JwksResponseStruct = type({ keys: array(JwkStruct) });\nexport type JwksResponse = Infer<typeof JwksResponseStruct>;\n\nconst UkycSessionResponseStruct = type({\n sessionId: string(),\n // Per-secret wrapping material so the client can seal the\n // `data_encryption_key` and the `ukyc_capability_token` independently.\n encryptionDataKey: EncryptionSchemaStruct,\n ukycCapabilityToken: EncryptionSchemaStruct,\n});\nexport type UkycSessionResponse = Infer<typeof UkycSessionResponseStruct>;\n\nconst ApplicantAccessTokenResponseStruct = type({\n status: string(),\n applicantAccessToken: string(),\n});\nexport type ApplicantAccessTokenResponse = Infer<\n typeof ApplicantAccessTokenResponseStruct\n>;\n\nconst SessionStatusResponseStruct = type({\n finalStatus: string(),\n statusMessage: optional(string()),\n externalUserId: string(),\n kycStatus: string(),\n vendor: string(),\n vendorStatus: string(),\n});\n\n// Vendor customer subset — `type` (not `object`) keeps extra vendor fields from\n// failing validation while still requiring the fields the controller needs.\nconst VendorCustomerResponseStruct = type({\n id: string(),\n email: string(),\n status: string(),\n});\nexport type VendorCustomerResponse = Infer<typeof VendorCustomerResponseStruct>;\n\nconst KYC_USER_STATUSES = [\n 'not-started',\n 'pending',\n 'need-more-information',\n 'terminal-failure',\n 'completed',\n] as const;\n\nconst KycUserStatusResponseStruct = type({\n status: enums([...KYC_USER_STATUSES]),\n sumsubSessionId: optional(string()),\n errorCode: optional(string()),\n});\n\nconst ConsentDocumentStruct = type({\n key: string(),\n version: string(),\n title: string(),\n url: string(),\n consented: boolean(),\n});\n\nconst DisclaimersCatalogFields = {\n idOS: array(ConsentDocumentStruct),\n kycProvider: array(ConsentDocumentStruct),\n} as const;\n\n/** Global catalog from `GET /disclaimers` (no credential-reuse flag). */\nconst GlobalDisclaimersResponseStruct = type(DisclaimersCatalogFields);\n\n/** Session catalog from `GET`/`POST /sessions/{id}/disclaimers`. */\nconst SessionDisclaimersResponseStruct = type({\n ...DisclaimersCatalogFields,\n credentialReusabilityConsentGiven: boolean(),\n});\n\n// === PARAM TYPES ===\n\nexport type CreateSessionParams = {\n email: string;\n termsAcceptedAt: string;\n disclaimerIds: string[];\n};\n\nexport type CheckKycRequiredParams = {\n /**\n * Identity vendor to check. Defaults to `moonpay` for the existing\n * Check/Auth path.\n */\n vendor?: KycVendor;\n /**\n * MoonPay access token. Required when `vendor` is `moonpay` (or omitted).\n */\n accessToken?: string;\n /**\n * ISO 3166-1 alpha-3 country code. Required when `vendor` is `moonpay`.\n */\n country?: string;\n capabilities?: { product: string }[];\n};\n\nexport type CreateVendorCustomerParams = {\n vendor: KycVendor;\n email: string;\n};\n\nexport type SubmitVendorDisclaimersParams = {\n /** Identity vendor whose T&Cs were accepted (currently `iron`). */\n vendor: KycVendor;\n /** Disclaimer ids from {@link KycService.fetchVendorDisclaimers}. */\n disclaimerIds: string[];\n};\n\nexport type FetchDisclaimersCatalogParams = {\n /** ISO 3166-1 alpha-3 country code for `GET /disclaimers?country=`. */\n country: string;\n};\n\nexport type FetchSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n};\n\nexport type SubmitSessionDisclaimersParams = {\n /** UKYC session id from {@link KycService.createUkycSession}. */\n sessionId: string;\n /** Consents to the idOS legal documents (`key`/`version` from the catalog). */\n idOS: KycConsentRecord[];\n /**\n * Consents to the KYC provider (SumSub) legal documents (`key`/`version`\n * from the catalog).\n */\n kycProvider: KycConsentRecord[];\n /** Consent to reuse the user's existing idOS credentials. */\n credentialReusabilityConsentGiven: boolean;\n};\n\nexport type CreateUkycSessionParams = {\n jwtToken: string;\n /**\n * The client's per-session X25519 public key (unpadded base64url). Generated\n * with the matching private key used later to wrap authorizations, so the\n * session server can open those boxes.\n */\n sessionClientPublicKey: string;\n /**\n * Country of residence in ISO 3166-1 alpha-3 format (e.g. `USA`, `GBR`).\n */\n residenceCountry: string;\n /**\n * Identity vendor for the UKYC session. Defaults to `moonpay` for the\n * existing Check/Auth flow. Pass a non-MoonPay vendor (e.g. `iron`) for\n * the consents path (no MoonPay metadata required).\n */\n vendor?: KycVendor;\n /**\n * Vendor-specific metadata. Required for MoonPay (`moonPayAccessToken` /\n * `moonPayUserId`); optional / omitted for other vendors.\n */\n vendorMetadata?: Record<string, unknown>;\n};\n\n/**\n * Encrypted capability authorization payload (base64url nonce + ciphertext)\n * accepted by `POST /sessions/:sessionId/authorizations`. Produced by\n * `wrapEncryptionKey` for both the `data_encryption_key` and the\n * `ukyc_capability_token`.\n */\nexport type CapabilityAuthorization = {\n nonce: string;\n data: string;\n};\n\nexport type SetAuthorizationsParams = {\n sessionId: string;\n wrappedEncryptionDataKey: CapabilityAuthorization;\n wrappedUkycCapabilityToken: CapabilityAuthorization;\n};\n\nexport type GetSessionStatusParams = {\n sessionId: string;\n};\n\n// === SERVICE DEFINITION ===\n\n/**\n * `KycService` communicates with the Universal KYC (UKYC) backend to drive the\n * identity + document-verification flow. It is stateless and platform-agnostic:\n * HTTP is performed through the runtime's native `fetch` (or an injected\n * `fetch` when provided), and the auth bearer token and geolocation come from\n * other controllers via the messenger.\n *\n * It extends {@link BaseDataService}, so read-only endpoints are routed through\n * `fetchQuery`: they are wrapped in the shared service policy (retries, circuit\n * breaker) and their results are exposed via the service's `QueryClient`.\n * `fetchDisclaimers` and `fetchJwks` are cached with a `staleTime`;\n * session-scoped disclaimer and status-polling reads opt out of caching\n * (`staleTime`/`gcTime` of `0`) so they never serve a stale result.\n *\n * Write endpoints (every `POST`) deliberately bypass `fetchQuery`. The query\n * cache is built for idempotent reads: it deduplicates concurrent requests\n * sharing a `queryKey`, retains responses for replay, and publishes them on the\n * messenger via `cacheUpdated`. None of that is safe for calls that create\n * sessions, customers, or consents — two overlapping `createVendorCustomer`\n * calls would collapse into a single `POST`, and session tokens would be\n * broadcast as cache payloads. Writes therefore call `#requestJson` directly,\n * which also means they are not retried by the service policy.\n */\nexport class KycService extends BaseDataService<\n typeof serviceName,\n KycServiceMessenger\n> {\n readonly #fetch: typeof fetch;\n\n readonly #baseUrl: string;\n\n readonly #idosEnclaveBaseUrl: string;\n\n readonly #idosRelayBaseUrl: string;\n\n /**\n * Constructs a new KycService.\n *\n * @param options - The constructor options.\n * @param options.messenger - The messenger suited for this service.\n * @param options.fetch - A function used to make HTTP requests. Defaults to\n * the runtime's native `fetch`.\n * @param options.baseUrl - Base URL of the KYC API\n * @param options.idosEnclaveBaseUrl - Base URL of the idOS enclave, from\n * which the JWKS used to verify the `encryptionDataKey` schema's `jwtChain`\n * is fetched.\n * @param options.idosRelayBaseUrl - Base URL of the idOS relay, from which\n * the JWKS used to verify the `ukycCapabilityToken` schema's `jwtChain` is\n * fetched.\n * @param options.queryClientConfig - Shared configuration for all queries\n * exposed by the service.\n * @param options.policyOptions - Options for the request service policy.\n */\n constructor({\n messenger,\n fetch: fetchFunction,\n baseUrl,\n idosEnclaveBaseUrl,\n idosRelayBaseUrl,\n queryClientConfig = {},\n policyOptions = {},\n }: KycServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions,\n });\n // Fall back to the runtime's native `fetch`, bound to `globalThis` so it\n // can be invoked as a method of this instance without an illegal-invocation\n // error on platforms that check the receiver.\n if (fetchFunction) {\n this.#fetch = fetchFunction;\n } else if (typeof globalThis.fetch === 'function') {\n this.#fetch = globalThis.fetch.bind(globalThis);\n } else {\n throw new Error(\n 'KycService: fetch is not available globally and was not provided in options. Please inject a fetch implementation.',\n );\n }\n if (!baseUrl) {\n throw new Error('KycService: baseUrl is required');\n }\n this.#baseUrl = baseUrl;\n this.#idosEnclaveBaseUrl = idosEnclaveBaseUrl ?? '';\n this.#idosRelayBaseUrl = idosRelayBaseUrl ?? '';\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Resolves the customer's country from the geolocation source and converts it\n * to an ISO 3166-1 alpha-3 code.\n *\n * @returns The alpha-3 country code.\n * @throws If the country cannot be determined or mapped.\n */\n async getGeoCountry(): Promise<string> {\n const location = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n // Guard nullish/empty geolocation with the documented domain error rather\n // than letting `assert(location, string())` surface a superstruct\n // assertion error (which would change how the failure reads in\n // `disclaimersError`).\n const alpha2 =\n typeof location === 'string' ? location.split('-')[0].toUpperCase() : '';\n if (!alpha2 || alpha2 === 'UNKNOWN') {\n throw new Error(\n `Unable to determine country from geolocation (got \"${String(\n location,\n )}\").`,\n );\n }\n const alpha3 = alpha2ToAlpha3(alpha2);\n if (!alpha3) {\n throw new Error(\n `Unable to map country code \"${alpha2}\" to an ISO 3166-1 alpha-3 code.`,\n );\n }\n return alpha3;\n }\n\n /**\n * Fetches the disclaimers the customer must accept before a session is\n * created.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor. Defaults to `moonpay`.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The disclaimers.\n */\n async fetchVendorDisclaimers({\n vendor = 'moonpay',\n country,\n }: {\n vendor?: KycVendor;\n country: string;\n }): Promise<KycDisclaimer[]> {\n const url = new URL(`/vendors/${vendor}/disclaimers`, this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchVendorDisclaimers`, vendor, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: inMilliseconds(5, Duration.Minute),\n });\n return this.#validateResponse(\n data,\n DisclaimersResponseStruct,\n 'disclaimers',\n ) as KycDisclaimer[];\n }\n\n /**\n * Creates a vendor session via the UKYC backend.\n *\n * @param params - The session parameters.\n * @returns The created session token.\n */\n async createSession(\n params: CreateSessionParams,\n ): Promise<Infer<typeof CreateSessionResponseStruct>> {\n const url = new URL('/vendors/moonpay/sessions', this.#baseUrl);\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return this.#validateResponse(\n data,\n CreateSessionResponseStruct,\n 'sessions',\n );\n }\n\n /**\n * Checks whether KYC is required for the given vendor, country, and\n * capabilities.\n *\n * @param params - The check parameters.\n * @returns Whether KYC is required.\n */\n async checkKycRequired(\n params: CheckKycRequiredParams,\n ): Promise<{ kycRequired: boolean }> {\n const vendor = params.vendor ?? 'moonpay';\n const url = new URL(`/vendors/${vendor}/kyc-required`, this.#baseUrl);\n const capabilities = params.capabilities ?? [{ product: 'ramps' }];\n const body =\n vendor === 'moonpay'\n ? {\n accessToken: params.accessToken,\n country: params.country,\n capabilities,\n }\n : {};\n\n // MoonPay requires accessToken and country; validate before making the request.\n if (vendor === 'moonpay') {\n if (!params.accessToken) {\n throw new Error(\n 'checkKycRequired: accessToken is required for vendor \"moonpay\".',\n );\n }\n if (!params.country) {\n throw new Error(\n 'checkKycRequired: country is required for vendor \"moonpay\".',\n );\n }\n }\n\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const { required } = this.#validateResponse(\n data,\n KycRequiredResponseStruct,\n 'kyc-required',\n );\n return { kycRequired: required };\n }\n\n /**\n * Creates (or resumes) an empty-shell customer for the authenticated\n * canonical user on the given identity vendor. Must run before showing\n * vendor T&C so the customer exists and resume logic can key off vendor\n * status.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron` for Money/VBA).\n * @param params.email - Email associated with the customer.\n * @returns The vendor customer record (subset validated for controller use).\n */\n async createVendorCustomer(\n params: CreateVendorCustomerParams,\n ): Promise<VendorCustomerResponse> {\n const url = new URL(`/vendors/${params.vendor}/customers`, this.#baseUrl);\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ email: params.email }),\n });\n return this.#validateResponse(\n data,\n VendorCustomerResponseStruct,\n 'vendor customers',\n );\n }\n\n /**\n * Records vendor T&C acceptance (`POST /vendors/{vendor}/disclaimers`).\n * For Iron this creates content signings from the disclaimer ids the\n * customer accepted. Session-scoped idOS / KYC-provider consents are\n * recorded separately via {@link submitSessionDisclaimers}. Retries re-POST\n * the same ids, matching the legacy `POST /consents` signing step.\n *\n * @param params - The parameters.\n * @param params.vendor - Identity vendor (e.g. `iron`).\n * @param params.disclaimerIds - Accepted vendor T&C ids.\n * @returns The vendor signing records.\n */\n async submitVendorDisclaimers(\n params: SubmitVendorDisclaimersParams,\n ): Promise<KycVendorSigning[]> {\n const url = new URL(\n `/vendors/${encodeURIComponent(params.vendor)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({ disclaimerIds: params.disclaimerIds }),\n });\n return this.#validateResponse(\n data,\n VendorSigningsResponseStruct,\n 'vendor disclaimers',\n );\n }\n\n /**\n * Fetches the global idOS + KYC-provider disclaimer catalog\n * (`GET /disclaimers?country=`). Does not include\n * `credentialReusabilityConsentGiven` — that is session-scoped via\n * {@link fetchSessionDisclaimers}. Vendor T&Cs continue to come from\n * {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.country - ISO 3166-1 alpha-3 country code.\n * @returns The catalog documents.\n */\n async fetchDisclaimersCatalog({\n country,\n }: FetchDisclaimersCatalogParams): Promise<KycDisclaimersCatalog> {\n if (country.length !== 3) {\n throw new Error(\n `KycService.fetchDisclaimersCatalog: country must be an ISO 3166-1 alpha-3 code (received \"${country}\").`,\n );\n }\n\n const url = new URL('/disclaimers', this.#baseUrl);\n url.searchParams.set('country', country);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchDisclaimersCatalog`, country],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n GlobalDisclaimersResponseStruct,\n 'disclaimers',\n );\n }\n\n /**\n * Fetches the session-scoped idOS + KYC-provider disclaimer catalog\n * (`GET /sessions/{sessionId}/disclaimers`), including per-session\n * `consented` flags and `credentialReusabilityConsentGiven`. For the\n * pre-session global catalog use {@link fetchDisclaimersCatalog}. Vendor\n * T&Cs continue to come from {@link fetchVendorDisclaimers}.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The catalog, including which documents are already consented.\n */\n async fetchSessionDisclaimers({\n sessionId,\n }: FetchSessionDisclaimersParams): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchSessionDisclaimers`, sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Consent state can change after a POST, so always re-fetch.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Records idOS + KYC-provider consents for a UKYC session\n * (`POST /sessions/{sessionId}/disclaimers`). `key`/`version` pairs must\n * match the current catalog from {@link fetchSessionDisclaimers}. A 409\n * means those document versions were already recorded for the session.\n *\n * @param params - The consent parameters.\n * @returns The updated catalog after recording.\n */\n async submitSessionDisclaimers(\n params: SubmitSessionDisclaimersParams,\n ): Promise<KycSessionDisclaimers> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/disclaimers`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n idOS: params.idOS,\n kycProvider: params.kycProvider,\n credentialReusabilityConsentGiven:\n params.credentialReusabilityConsentGiven,\n }),\n });\n return this.#validateResponse(\n data,\n SessionDisclaimersResponseStruct,\n 'session disclaimers',\n );\n }\n\n /**\n * Fetches the user-keyed simplified KYC status used by Money toast / banner\n * surfaces (`GET /kyc/status`).\n *\n * @returns The simplified status payload.\n */\n async fetchKycStatus(): Promise<KycUserStatusResponse> {\n const url = new URL('/kyc/status', this.#baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:fetchKycStatus`],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for toast flips, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n KycUserStatusResponseStruct,\n 'kyc status',\n );\n }\n\n /**\n * Fetches a well-known JWKS from `baseUrl`, caching the result for an hour.\n *\n * @param baseUrl - Host base URL that serves `/.well-known/jwks.json`.\n * @param queryName - Cache query-key segment.\n * @param responseLabel - Label used in malformed-response errors.\n * @param missingConfigMessage - Error thrown when `baseUrl` is empty.\n * @returns The JWKS keys.\n */\n async #fetchWellKnownJwks(\n baseUrl: string,\n queryName: string,\n responseLabel: string,\n missingConfigMessage: string,\n ): Promise<JwksResponse> {\n if (!baseUrl) {\n throw new Error(missingConfigMessage);\n }\n const url = new URL(UKYC_JWKS_PATH, baseUrl);\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:${queryName}`, baseUrl],\n queryFn: async () =>\n this.#requestJson(url, { method: 'GET' }, { authenticated: false }),\n staleTime: inMilliseconds(1, Duration.Hour),\n });\n return this.#validateResponse(data, JwksResponseStruct, responseLabel);\n }\n\n /**\n * Fetches the idOS enclave JWKS used to verify the\n * `encryptionDataKey` schema's `jwtChain` from\n * {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS enclave\n * host, distinct from the UKYC base URL.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosEnclaveJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosEnclaveBaseUrl,\n 'fetchIdosEnclaveJwks',\n 'idOS enclave JWKS',\n 'KycService: idosEnclaveBaseUrl is not configured; cannot fetch JWKS to verify the encryptionDataKey schema.',\n );\n }\n\n /**\n * Fetches the idOS relay JWKS used to verify the `ukycCapabilityToken`\n * schema's `jwtChain` from {@link KycService.createUkycSession}.\n *\n * This is an unauthenticated request to a well-known path on the idOS relay\n * host, distinct from both the UKYC base URL and the idOS enclave.\n *\n * @returns The JWKS keys.\n */\n async fetchIdosRelayJwks(): Promise<JwksResponse> {\n return this.#fetchWellKnownJwks(\n this.#idosRelayBaseUrl,\n 'fetchIdosRelayJwks',\n 'idOS relay JWKS',\n 'KycService: idosRelayBaseUrl is not configured; cannot fetch JWKS to verify the ukycCapabilityToken schema.',\n );\n }\n\n /**\n * Creates a UKYC session for the SumSub document-verification sub-flow.\n *\n * The client registers its per-session X25519 public key so the server can\n * later open boxes sealed with the matching private key, and supplies the\n * customer's ISO 3166-1 alpha-3 country of residence. The response\n * carries per-secret encryption schemas (`encryptionDataKey` and\n * `ukycCapabilityToken`) so the client can wrap the `data_encryption_key` and\n * the read-only `ukyc_capability_token` and submit them via\n * {@link KycService.setAuthorizations}.\n *\n * @param params - The session parameters.\n * @returns The UKYC session id and encryption schemas.\n */\n async createUkycSession(\n params: CreateUkycSessionParams,\n ): Promise<UkycSessionResponse> {\n const url = new URL('/sessions', this.#baseUrl);\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n vendorId: params.vendor ?? 'moonpay',\n vendorUserId: 'mockedId',\n jwtToken: params.jwtToken,\n sessionClientPublicKey: params.sessionClientPublicKey,\n residenceCountry: params.residenceCountry,\n vendorMetadata: params.vendorMetadata ?? {},\n }),\n });\n return this.#validateResponse(\n data,\n UkycSessionResponseStruct,\n 'UKYC sessions',\n );\n }\n\n /**\n * Submits the wrapped `data_encryption_key` and wrapped\n * `ukyc_capability_token` for a UKYC session. Both secrets are sealed with\n * `wrapEncryptionKey` against the encryption schemas returned by\n * {@link KycService.createUkycSession}.\n *\n * @param params - The wrapped authorizations.\n * @returns The session status after the authorizations are applied.\n */\n async setAuthorizations(\n params: SetAuthorizationsParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/authorizations`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, {\n method: 'POST',\n body: JSON.stringify({\n wrappedEncryptionDataKey: params.wrappedEncryptionDataKey,\n wrappedUkycCapabilityToken: params.wrappedUkycCapabilityToken,\n }),\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'authorizations',\n );\n }\n\n /**\n * Creates (or refreshes) the SumSub verification journey for a UKYC session,\n * returning the applicant access token used to launch the SDK.\n *\n * @param sessionId - The UKYC session id from `createUkycSession`.\n * @returns The applicant access token and status.\n */\n async createJourney(\n sessionId: string,\n ): Promise<ApplicantAccessTokenResponse> {\n const url = new URL(\n `/sessions/${encodeURIComponent(sessionId)}/journey`,\n this.#baseUrl,\n );\n const data = await this.#requestJson(url, { method: 'POST' });\n return this.#validateResponse(\n data,\n ApplicantAccessTokenResponseStruct,\n 'journey',\n );\n }\n\n /**\n * Fetches the current status of a UKYC session. Polled after the SumSub SDK\n * completes to determine the final verification decision.\n *\n * @param params - The parameters.\n * @param params.sessionId - The UKYC session id.\n * @returns The session status.\n */\n async getSessionStatus(\n params: GetSessionStatusParams,\n ): Promise<KycSessionStatus> {\n const url = new URL(\n `/sessions/${encodeURIComponent(params.sessionId)}/status`,\n this.#baseUrl,\n );\n const data = await this.fetchQuery({\n queryKey: [`${this.name}:getSessionStatus`, params.sessionId],\n queryFn: async () => this.#requestJson(url, { method: 'GET' }),\n // Status is polled for a terminal decision, so it must always be fresh.\n staleTime: 0,\n gcTime: 0,\n });\n return this.#validateResponse(\n data,\n SessionStatusResponseStruct,\n 'session status',\n );\n }\n\n /**\n * Validates a parsed API response against a superstruct schema, throwing a\n * descriptive error when the response does not match.\n *\n * Unlike a bare `Struct.is` check, this surfaces exactly which field was\n * missing or had the wrong type, which is essential for diagnosing shape\n * mismatches between the client and the live API.\n *\n * @param data - The parsed response body.\n * @param struct - The superstruct schema the body is expected to satisfy.\n * @param apiName - A human-readable name of the API, used in the error message.\n * @returns The validated, typed response.\n * @throws If `data` does not match `struct`.\n */\n #validateResponse<Type, Schema>(\n data: unknown,\n struct: Struct<Type, Schema>,\n apiName: string,\n ): Type {\n try {\n assert(data, struct);\n return data;\n } catch (error) {\n const detail =\n error instanceof StructError\n ? `${error.message} (received: ${JSON.stringify(data)})`\n : // `assert` only ever throws `StructError` for the plain structs used\n // here, so this is a defensive fallback that is not exercised.\n /* istanbul ignore next */\n String(error);\n throw new Error(\n `Malformed response received from ${apiName} API: ${detail}`,\n );\n }\n }\n\n /**\n * Performs a single JSON request.\n *\n * Read endpoints pass this as the `queryFn` to {@link fetchQuery}, which\n * wraps it in the shared service policy (retries, circuit breaker). Write\n * endpoints call it directly, so they are executed exactly once. Requests\n * are authenticated with the wallet bearer token by default; pass\n * `{ authenticated: false }` for calls to services that do not expect it\n * (e.g. the idOS enclave or idOS relay JWKS endpoints).\n *\n * @param url - The request URL.\n * @param init - The request init (method, body).\n * @param options - Request options.\n * @param options.authenticated - Whether to attach the bearer token. Defaults\n * to `true`.\n * @returns The parsed JSON response.\n */\n async #requestJson(\n url: URL,\n init: RequestInit,\n options: { authenticated?: boolean } = {},\n ): Promise<Json> {\n const { authenticated = true } = options;\n\n const headers: Record<string, string> = {};\n\n // Only advertise a JSON body when one is actually sent; bodyless requests\n // (e.g. `createJourney`) must not carry a `Content-Type`.\n if (init.body !== undefined && init.body !== null) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (authenticated) {\n const bearerToken = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n if (!bearerToken) {\n throw new Error(\n 'Unable to obtain an authentication bearer token — is the wallet signed in?',\n );\n }\n assert(bearerToken, string());\n headers.Authorization = `Bearer ${bearerToken}`;\n }\n\n const response = await this.#fetch(url.toString(), {\n ...init,\n headers,\n });\n if (!response.ok) {\n let detail = '';\n try {\n const errorBody: unknown = await response.json();\n if (errorBody && typeof errorBody === 'object') {\n const record = errorBody as Record<string, unknown>;\n if (typeof record.message === 'string') {\n detail = record.message;\n } else if (typeof record.error === 'string') {\n detail = record.error;\n }\n }\n } catch {\n // Ignore body parse failures; status alone is still useful.\n }\n throw new HttpError(\n response.status,\n `Fetching '${url.toString()}' failed with status '${response.status}'${\n detail ? `: ${detail}` : ''\n }`,\n );\n }\n\n // DELETE (and similar) endpoints return 204 No Content.\n if (response.status === 204) {\n return null;\n }\n\n return (await response.json()) as Json;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/kyc-controller",
3
- "version": "0.0.0-preview-64bce4b11",
3
+ "version": "0.0.0-preview-1cf7cc7b3",
4
4
  "description": "Shared KYC / identity verification controller used across MetaMask clients",
5
5
  "keywords": [
6
6
  "Ethereum",