@trymellon/js 2.2.1 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular.cjs +1 -1
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.d.cts +7 -6
- package/dist/angular.d.ts +7 -6
- package/dist/angular.js +1 -1
- package/dist/angular.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +166 -16
- package/dist/index.d.ts +166 -16
- package/dist/index.global.js +2 -2
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +10 -2
- package/dist/react.d.ts +10 -2
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/{trymellon-P7BPxIry.d.cts → trymellon-CO_2wLZz.d.cts} +164 -16
- package/dist/{trymellon-P7BPxIry.d.ts → trymellon-CO_2wLZz.d.ts} +164 -16
- package/dist/ui/index.d.ts +39 -4
- package/dist/ui/index.js +5 -5
- package/dist/ui/index.js.map +1 -1
- package/dist/vue.cjs +1 -1
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.cts +10 -2
- package/dist/vue.d.ts +10 -2
- package/dist/vue.js +1 -1
- package/dist/vue.js.map +1 -1
- package/package.json +23 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/result.ts","../src/errors.ts","../src/core/validators/helpers.ts","../src/core/validators/register-auth.ts","../src/core/validators/session.ts","../src/core/validators/email.ts","../src/core/validators/onboarding.ts","../src/core/validators/cross-device.ts","../src/core/validators/recovery.ts","../src/core/api.ts","../src/core/fetch-client.ts","../src/utils/base64url.ts","../src/core/webauthn-utils.ts","../src/utils/support.ts","../src/utils/validation.ts","../src/core/ceremony.ts","../src/core/webauthn.ts","../src/core/polling-utils.ts","../src/core/onboarding-manager.ts","../src/core/cross-device-manager.ts","../src/core/events.ts","../src/core/constants.ts","../src/core/adapters/telemetry-sender.ts","../src/core/ports/telemetry.ts","../src/core/services/auth-service.ts","../src/core/recover.ts","../src/core/services/recovery-service.ts","../src/core/trymellon.ts","../src/core/adapters/console-logger.ts"],"names":["ok","value","err","error","TryMellonError","_TryMellonError","code","message","details","DEFAULT_MESSAGES","createError","isTryMellonError","createNotSupportedError","createUserCancelledError","createNetworkError","cause","createTimeoutError","createInvalidArgumentError","field","reason","createCredentialError","operation","createEncodingError","type","validateUrl","url","fieldName","urlObj","validateRange","min","max","validateBase64Url","s","DOM_EXCEPTION_ERROR_MAP","mapBackendErrorCodeToTryMellon","backendCode","normalized","mapWebAuthnError","name","errorCode","isObject","isString","isNumber","isBoolean","isArray","validationError","required","obj","key","validateChallengeRP","rp","data","validateChallengeUser","user","validatePubKeyCredParams","params","item","validateUserEntity","userId","externalUserId","email","metadata","validateRegisterStartResponse","session_id","challenge","rpResult","userResult","challengeStr","pubKeyCredParamsResult","timeout","excludeCredentials","c","authenticatorSelection","validateAuthStartResponse","ch","rpId","allowCredentials","userVerification","validateRegisterFinishResponse","credential_id","status","session_token","redirect_url","validateAuthFinishResponse","authenticated","signals","validateSessionValidateResponse","valid","user_id","external_user_id","tenant_id","app_id","validateEmailVerifyResponse","raw","ONBOARDING_STATUSES","REGISTER_PASSKEY_STATUSES","validateOnboardingStartResponse","onboarding_url","expires_in","validateOnboardingStatusResponse","validateOnboardingRegisterResponse","parsedChallenge","chResult","validateOnboardingChallenge","pubKeyCredParams","validateOnboardingRegisterPasskeyResponse","validateOnboardingCompleteResponse","validateCrossDeviceVerifyResponse","isCreationOptionsShape","opts","o","isRequestOptionsShape","validateCrossDeviceInitResponse","payload","qr_url","expires_at","polling_token","result","validateCrossDeviceStatusResponse","validateCrossDeviceContextResponse","rawType","options","MAX_CONTEXT_LENGTH","approval_context","optionalContextString","application_name","extra","maxLength","validateRecoveryVerifyResponse","recovery_session_id","validateRecoveryCompleteResponse","userObj","ApiClient","httpClient","baseUrl","defaultHeaders","path","body","validate","headers","request","sessionToken","sessionId","trimmed","pollingToken","otp","recoverySessionId","credential","isEnvelopeSuccess","isEnvelopeError","parseHttpErrorBody","errorData","statusText","errObj","rawCode","RETRY_DELAY_CAP_MS","generateRequestId","getRetryDelayMs","attempt","baseMs","delay","shouldRetryOnStatus","method","FetchHttpClient","timeoutMs","maxRetries","retryDelayMs","logger","config","requestId","lastError","controller","timeoutId","response","errResult","resolve","base64UrlEncode","buf","bytes","binary","b","base64UrlDecode","base64","padding","padded","base64UrlDecodeToArrayBuffer","buffer","isValidCredentialResponse","serializeCredentialForRegister","clientDataJSON","attestationObject","serializeCredentialForAuth","authenticatorData","signature","userHandle","isWebAuthnSupported","isPlatformAuthenticatorAvailable","getClientStatus","isPasskeySupported","platformAuthenticatorAvailable","validateCredentialStructure","invokeCeremony","context","eventEmitter","start","createOptions","invoke","finish","startResult","optionsResult","e","finishResult","tryMellonError","createRegistrationOptions","serverChallengePayload","authenticatorType","challengeBuffer","userIdBuffer","publicKey","cred","createAuthenticationOptions","mediation","registerPasskey","apiClient","extId","ceremonyOptions","authenticatePasskey","hasUserId","waitWithAbort","intervalMs","signal","onAbort","cleanup","POLL_INTERVAL_MS","MAX_POLL_ATTEMPTS","OnboardingManager","statusResult","registerInfoResult","registerInfo","creationOptionsResult","serializedCredential","registerPasskeyResult","CrossDeviceManager","redirectUrl","contextResult","requestOptionsResult","EventEmitter","event","handler","handlersSet","DEFAULT_API_BASE_URL","DEFAULT_TELEMETRY_ENDPOINT","SANDBOX_SESSION_TOKEN","createDefaultTelemetrySender","endpoint","buildTelemetryPayload","latencyMs","AuthService","sandbox","sandboxToken","telemetrySender","externalId","recoverAccount","userPayload","RecoveryService","TryMellon","_TryMellon","appId","publishableKey","apiBaseUrl","originHeader","ConsoleLogger","meta"],"mappings":"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","file":"index.js","sourcesContent":["export type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };\n\nexport const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });\nexport const err = <E>(error: E): Result<never, E> => ({ ok: false, error });\n\nexport function map<T, E, U>(result: Result<T, E>, mapper: (value: T) => U): Result<U, E> {\n if (result.ok) {\n return ok(mapper(result.value));\n }\n return result;\n}\n\nexport function mapErr<T, E, F>(result: Result<T, E>, mapper: (error: E) => F): Result<T, F> {\n if (!result.ok) {\n return err(mapper(result.error));\n }\n return result;\n}\n\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n","export type TryMellonErrorCode =\n | 'NOT_SUPPORTED'\n | 'USER_CANCELLED'\n | 'PASSKEY_NOT_FOUND'\n | 'SESSION_EXPIRED'\n | 'NETWORK_FAILURE'\n | 'INVALID_ARGUMENT'\n | 'TIMEOUT'\n | 'ABORTED'\n | 'ABORT_ERROR'\n | 'CHALLENGE_MISMATCH'\n | 'UNKNOWN_ERROR';\n\nexport class TryMellonError extends Error {\n readonly code: TryMellonErrorCode;\n readonly details?: unknown;\n readonly isTryMellonError = true;\n\n constructor(code: TryMellonErrorCode, message: string, details?: unknown) {\n super(message);\n this.name = 'TryMellonError';\n this.code = code;\n this.details = details;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TryMellonError);\n }\n }\n}\n\nconst DEFAULT_MESSAGES: Record<TryMellonErrorCode, string> = {\n NOT_SUPPORTED: 'WebAuthn is not supported in this environment',\n USER_CANCELLED: 'User cancelled the operation',\n PASSKEY_NOT_FOUND: 'Passkey not found',\n SESSION_EXPIRED: 'Session has expired',\n NETWORK_FAILURE: 'Network request failed',\n INVALID_ARGUMENT: 'Invalid argument provided',\n TIMEOUT: 'Operation timed out',\n ABORTED: 'Operation was aborted',\n ABORT_ERROR: 'Operation aborted by user or timeout',\n CHALLENGE_MISMATCH: 'This link was already used or expired. Please try again from your computer.',\n UNKNOWN_ERROR: 'An unknown error occurred',\n};\n\nexport function createError(\n code: TryMellonErrorCode,\n message?: string,\n details?: unknown\n): TryMellonError {\n return new TryMellonError(code, message ?? DEFAULT_MESSAGES[code], details);\n}\n\nexport function isTryMellonError(error: unknown): error is TryMellonError {\n return (\n error instanceof TryMellonError ||\n (typeof error === 'object' &&\n error !== null &&\n 'isTryMellonError' in error &&\n (error as TryMellonError).isTryMellonError === true)\n );\n}\n\nexport function createNotSupportedError(): TryMellonError {\n return createError('NOT_SUPPORTED');\n}\n\nexport function createUserCancelledError(): TryMellonError {\n return createError('USER_CANCELLED');\n}\n\nexport function createNetworkError(cause?: Error): TryMellonError {\n return createError('NETWORK_FAILURE', undefined, {\n cause: cause?.message,\n originalError: cause,\n });\n}\n\nexport function createTimeoutError(): TryMellonError {\n return createError('TIMEOUT');\n}\n\nexport function createInvalidArgumentError(field: string, reason: string): TryMellonError {\n return createError('INVALID_ARGUMENT', `Invalid argument: ${field} - ${reason}`, {\n field,\n reason,\n });\n}\n\nexport function createCredentialError(operation: 'create' | 'get'): TryMellonError {\n return createError('UNKNOWN_ERROR', `Failed to ${operation} credential`, { operation });\n}\n\nexport function createEncodingError(type: 'encode' | 'decode'): TryMellonError {\n return createError(\n 'NOT_SUPPORTED',\n `No base64 ${type === 'encode' ? 'encoding' : 'decoding'} available`,\n { type }\n );\n}\n\nexport function validateNonEmptyString(value: unknown, fieldName: string): asserts value is string {\n if (!value || typeof value !== 'string' || value.trim() === '') {\n throw createInvalidArgumentError(fieldName, 'must be a non-empty string');\n }\n}\n\nexport function validateUrl(url: string, fieldName: string): void {\n try {\n const urlObj = new URL(url);\n if (urlObj.protocol !== 'https:' && urlObj.protocol !== 'http:') {\n throw createInvalidArgumentError(fieldName, 'must use http or https protocol');\n }\n } catch (error) {\n if (isTryMellonError(error)) {\n throw error;\n }\n throw createInvalidArgumentError(fieldName, 'must be a valid URL');\n }\n}\n\nexport function validateRange(value: number, fieldName: string, min: number, max: number): void {\n if (!Number.isFinite(value)) {\n throw createInvalidArgumentError(fieldName, 'must be a finite number');\n }\n if (value < min || value > max) {\n throw createInvalidArgumentError(fieldName, `must be between ${min} and ${max}`);\n }\n}\n\nexport function validateBase64Url(s: string, fieldName: string): void {\n if (typeof s !== 'string' || s.length === 0) {\n throw createInvalidArgumentError(fieldName, 'must be a non-empty string');\n }\n if (!/^[A-Za-z0-9_-]+$/.test(s)) {\n throw createInvalidArgumentError(fieldName, 'must be a valid base64url string');\n }\n}\n\nconst DOM_EXCEPTION_ERROR_MAP: Record<string, TryMellonErrorCode> = {\n NotAllowedError: 'USER_CANCELLED',\n AbortError: 'ABORTED',\n NotSupportedError: 'NOT_SUPPORTED',\n SecurityError: 'NOT_SUPPORTED',\n InvalidStateError: 'UNKNOWN_ERROR',\n UnknownError: 'UNKNOWN_ERROR',\n};\n\n/**\n * Maps backend API error codes (fintech envelope) to TryMellonErrorCode.\n * Pure, testable. Unknown codes map to UNKNOWN_ERROR.\n * Defensive: non-string input returns UNKNOWN_ERROR (no throw).\n */\nexport function mapBackendErrorCodeToTryMellon(backendCode: string): TryMellonErrorCode {\n if (typeof backendCode !== 'string') return 'UNKNOWN_ERROR';\n const normalized = backendCode.toLowerCase().trim();\n const map: Record<string, TryMellonErrorCode> = {\n challenge_mismatch: 'CHALLENGE_MISMATCH',\n session_expired: 'SESSION_EXPIRED',\n unauthorized: 'SESSION_EXPIRED',\n validation_error: 'INVALID_ARGUMENT',\n invalid_argument: 'INVALID_ARGUMENT',\n user_not_found: 'SESSION_EXPIRED',\n passkey_not_found: 'PASSKEY_NOT_FOUND',\n };\n return map[normalized] ?? 'UNKNOWN_ERROR';\n}\n\nexport function mapWebAuthnError(error: unknown): TryMellonError {\n if (error instanceof DOMException) {\n const name = error.name;\n const message = error.message || 'WebAuthn operation failed';\n const errorCode = DOM_EXCEPTION_ERROR_MAP[name] ?? 'UNKNOWN_ERROR';\n return createError(errorCode, message, { originalError: error });\n }\n\n if (error instanceof Error) {\n return createError('UNKNOWN_ERROR', error.message, { originalError: error });\n }\n\n return createError('UNKNOWN_ERROR', 'An unknown error occurred', {\n originalError: error,\n });\n}\n","import { err, ok, type Result } from '../../utils/result';\nimport { createError, type TryMellonError } from '../../errors';\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\nexport function validationError(\n message: string,\n details?: { field?: string; expected?: string; originalData?: unknown }\n): Result<never, TryMellonError> {\n return err(\n createError('UNKNOWN_ERROR', message, {\n ...details,\n originalData: details?.originalData,\n })\n );\n}\n\nexport function required(obj: Record<string, unknown>, key: string): unknown {\n return obj[key];\n}\n\nexport function optionalString(obj: Record<string, unknown>, key: string): string | undefined {\n const v = obj[key];\n return v === undefined ? undefined : typeof v === 'string' ? v : undefined;\n}\n\n// DRY Helpers for common TryMellon objects\n\nexport function validateChallengeRP(rp: unknown, data: unknown): Result<true, TryMellonError> {\n if (!isObject(rp) || !isString(rp.name) || !isString(rp.id)) {\n return validationError('Invalid API response: challenge.rp must have name and id strings', {\n originalData: data,\n });\n }\n return ok(true);\n}\n\nexport function validateChallengeUser(user: unknown, data: unknown): Result<true, TryMellonError> {\n if (\n !isObject(user) ||\n !isString(user.id) ||\n !isString(user.name) ||\n !isString(user.displayName)\n ) {\n return validationError(\n 'Invalid API response: challenge.user must have id, name, displayName strings',\n { originalData: data }\n );\n }\n return ok(true);\n}\n\nexport function validatePubKeyCredParams(\n params: unknown,\n data: unknown\n): Result<true, TryMellonError> {\n if (!isArray(params)) {\n return validationError('Invalid API response: challenge.pubKeyCredParams must be array', {\n originalData: data,\n });\n }\n for (const item of params) {\n if (!isObject(item) || item.type !== 'public-key' || !isNumber(item.alg)) {\n return validationError(\n 'Invalid API response: pubKeyCredParams items must have type and alg',\n { originalData: data }\n );\n }\n }\n return ok(true);\n}\n\nexport function validateUserEntity(\n user: unknown,\n data: unknown\n): Result<\n { user_id: string; external_user_id: string; email?: string; metadata?: Record<string, unknown> },\n TryMellonError\n> {\n if (!isObject(user)) {\n return validationError('Invalid API response: user must be object', {\n field: 'user',\n originalData: data,\n });\n }\n\n const userId = required(user, 'user_id');\n const externalUserId = required(user, 'external_user_id');\n if (!isString(userId) || !isString(externalUserId)) {\n return validationError(\n 'Invalid API response: user must have user_id and external_user_id strings',\n { originalData: data }\n );\n }\n\n const email = user.email;\n const metadata = user.metadata;\n if (email !== undefined && !isString(email)) {\n return validationError('Invalid API response: user.email must be string', {\n originalData: data,\n });\n }\n if (metadata !== undefined && (typeof metadata !== 'object' || metadata === null)) {\n return validationError('Invalid API response: user.metadata must be object', {\n originalData: data,\n });\n }\n\n return ok({\n user_id: userId,\n external_user_id: externalUserId,\n ...(email !== undefined && { email }),\n ...(metadata !== undefined && { metadata: metadata as Record<string, unknown> }),\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type {\n RegisterStartResponse,\n AuthStartResponse,\n RegisterFinishResponse,\n AuthFinishResponse,\n} from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport {\n isObject,\n isString,\n isNumber,\n isBoolean,\n isArray,\n validationError,\n required,\n validateChallengeRP,\n validateChallengeUser,\n validatePubKeyCredParams,\n validateUserEntity,\n} from './helpers';\n\nexport function validateRegisterStartResponse(\n data: unknown\n): Result<RegisterStartResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n\n const challenge = required(data, 'challenge');\n if (!isObject(challenge)) {\n return validationError('Invalid API response: challenge must be object', {\n field: 'challenge',\n originalData: data,\n });\n }\n\n const rpResult = validateChallengeRP(required(challenge, 'rp'), data);\n if (!rpResult.ok) return rpResult;\n\n const userResult = validateChallengeUser(required(challenge, 'user'), data);\n if (!userResult.ok) return userResult;\n\n const challengeStr = required(challenge, 'challenge');\n if (!isString(challengeStr)) {\n return validationError('Invalid API response: challenge.challenge must be string', {\n originalData: data,\n });\n }\n\n const pubKeyCredParamsResult = validatePubKeyCredParams(\n required(challenge, 'pubKeyCredParams'),\n data\n );\n if (!pubKeyCredParamsResult.ok) return pubKeyCredParamsResult;\n\n const timeout = challenge.timeout;\n if (timeout !== undefined && !isNumber(timeout)) {\n return validationError('Invalid API response: challenge.timeout must be number', {\n originalData: data,\n });\n }\n\n const excludeCredentials = challenge.excludeCredentials;\n if (excludeCredentials !== undefined) {\n if (!isArray(excludeCredentials)) {\n return validationError('Invalid API response: excludeCredentials must be array', {\n originalData: data,\n });\n }\n for (const c of excludeCredentials) {\n if (\n !isObject(c) ||\n (c as Record<string, unknown>).type !== 'public-key' ||\n !isString((c as Record<string, unknown>).id)\n ) {\n return validationError(\n 'Invalid API response: excludeCredentials items must have id and type',\n {\n originalData: data,\n }\n );\n }\n }\n }\n\n const authenticatorSelection = challenge.authenticatorSelection;\n if (authenticatorSelection !== undefined && !isObject(authenticatorSelection)) {\n return validationError('Invalid API response: authenticatorSelection must be object', {\n originalData: data,\n });\n }\n\n return ok({\n session_id,\n challenge: {\n rp: challenge.rp as RegisterStartResponse['challenge']['rp'],\n user: challenge.user as RegisterStartResponse['challenge']['user'],\n challenge: challengeStr,\n pubKeyCredParams:\n challenge.pubKeyCredParams as RegisterStartResponse['challenge']['pubKeyCredParams'],\n ...(timeout !== undefined && { timeout }),\n ...(excludeCredentials !== undefined && {\n excludeCredentials:\n excludeCredentials as RegisterStartResponse['challenge']['excludeCredentials'],\n }),\n ...(authenticatorSelection !== undefined && {\n authenticatorSelection:\n authenticatorSelection as RegisterStartResponse['challenge']['authenticatorSelection'],\n }),\n },\n });\n}\n\nexport function validateAuthStartResponse(\n data: unknown\n): Result<AuthStartResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n\n const challenge = required(data, 'challenge');\n if (!isObject(challenge)) {\n return validationError('Invalid API response: challenge must be object', {\n field: 'challenge',\n originalData: data,\n });\n }\n\n const ch = required(challenge, 'challenge');\n const rpId = required(challenge, 'rpId');\n const allowCredentials = challenge.allowCredentials;\n if (!isString(ch)) {\n return validationError('Invalid API response: challenge.challenge must be string', {\n originalData: data,\n });\n }\n if (!isString(rpId)) {\n return validationError('Invalid API response: challenge.rpId must be string', {\n originalData: data,\n });\n }\n if (allowCredentials !== undefined && !isArray(allowCredentials)) {\n return validationError('Invalid API response: allowCredentials must be array', {\n originalData: data,\n });\n }\n if (allowCredentials) {\n for (const c of allowCredentials) {\n if (\n !isObject(c) ||\n (c as Record<string, unknown>).type !== 'public-key' ||\n !isString((c as Record<string, unknown>).id)\n ) {\n return validationError(\n 'Invalid API response: allowCredentials items must have id and type',\n {\n originalData: data,\n }\n );\n }\n }\n }\n\n const timeout = challenge.timeout;\n if (timeout !== undefined && !isNumber(timeout)) {\n return validationError('Invalid API response: challenge.timeout must be number', {\n originalData: data,\n });\n }\n\n const userVerification = challenge.userVerification;\n if (\n userVerification !== undefined &&\n !['required', 'preferred', 'discouraged'].includes(String(userVerification))\n ) {\n return validationError(\n 'Invalid API response: userVerification must be required|preferred|discouraged',\n {\n originalData: data,\n }\n );\n }\n\n return ok({\n session_id,\n challenge: {\n challenge: ch,\n rpId,\n allowCredentials:\n (allowCredentials as AuthStartResponse['challenge']['allowCredentials']) ?? [],\n ...(timeout !== undefined && { timeout }),\n ...(userVerification !== undefined && {\n userVerification: userVerification as AuthStartResponse['challenge']['userVerification'],\n }),\n },\n });\n}\n\nexport function validateRegisterFinishResponse(\n data: unknown\n): Result<RegisterFinishResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const credential_id = required(data, 'credential_id');\n const status = required(data, 'status');\n const session_token = required(data, 'session_token');\n const user = required(data, 'user');\n\n if (!isString(credential_id)) {\n return validationError('Invalid API response: credential_id must be string', {\n field: 'credential_id',\n originalData: data,\n });\n }\n if (!isString(status)) {\n return validationError('Invalid API response: status must be string', {\n field: 'status',\n originalData: data,\n });\n }\n if (!isString(session_token)) {\n return validationError('Invalid API response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n const userResult = validateUserEntity(user, data);\n if (!userResult.ok) return validationError(userResult.error.message, { originalData: data });\n\n const redirect_url = data.redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n originalData: data,\n });\n }\n\n return ok({\n credential_id,\n status,\n session_token,\n user: userResult.value,\n ...(redirect_url !== undefined && { redirect_url }),\n });\n}\n\nexport function validateAuthFinishResponse(\n data: unknown\n): Result<AuthFinishResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const authenticated = required(data, 'authenticated');\n const session_token = required(data, 'session_token');\n const user = required(data, 'user');\n const signals = required(data, 'signals');\n\n if (!isBoolean(authenticated)) {\n return validationError('Invalid API response: authenticated must be boolean', {\n field: 'authenticated',\n originalData: data,\n });\n }\n if (!isString(session_token)) {\n return validationError('Invalid API response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n const userResult = validateUserEntity(user, data);\n if (!userResult.ok) return validationError(userResult.error.message, { originalData: data });\n\n if (signals !== undefined && !isObject(signals)) {\n return validationError('Invalid API response: signals must be object', {\n originalData: data,\n });\n }\n\n const redirect_url = data.redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n originalData: data,\n });\n }\n\n return ok({\n authenticated,\n session_token,\n user: userResult.value,\n signals: signals as AuthFinishResponse['signals'],\n ...(redirect_url !== undefined && { redirect_url }),\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { SessionValidateResponse } from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, isBoolean, required, validationError } from './helpers';\n\nexport function validateSessionValidateResponse(\n data: unknown\n): Result<SessionValidateResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const valid = required(data, 'valid');\n const user_id = required(data, 'user_id');\n const external_user_id = required(data, 'external_user_id');\n const tenant_id = required(data, 'tenant_id');\n const app_id = required(data, 'app_id');\n\n if (!isBoolean(valid)) {\n return validationError('Invalid API response: valid must be boolean', {\n field: 'valid',\n originalData: data,\n });\n }\n if (!isString(user_id)) {\n return validationError('Invalid API response: user_id must be string', {\n field: 'user_id',\n originalData: data,\n });\n }\n if (!isString(external_user_id)) {\n return validationError('Invalid API response: external_user_id must be string', {\n field: 'external_user_id',\n originalData: data,\n });\n }\n if (!isString(tenant_id)) {\n return validationError('Invalid API response: tenant_id must be string', {\n field: 'tenant_id',\n originalData: data,\n });\n }\n if (!isString(app_id)) {\n return validationError('Invalid API response: app_id must be string', {\n field: 'app_id',\n originalData: data,\n });\n }\n\n return ok({\n valid,\n user_id,\n external_user_id,\n tenant_id,\n app_id,\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, validationError } from './helpers';\n\nexport function validateEmailVerifyResponse(\n data: unknown\n): Result<{ sessionToken: string; redirectUrl?: string }, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const raw =\n (data as Record<string, unknown>).session_token ??\n (data as Record<string, unknown>).sessionToken;\n if (!isString(raw)) {\n return validationError('Invalid API response: session_token/sessionToken must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n\n const redirect_url = (data as Record<string, unknown>).redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n originalData: data,\n });\n }\n\n return ok({\n sessionToken: raw,\n ...(redirect_url !== undefined && { redirectUrl: redirect_url }),\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type {\n OnboardingStartResponse,\n OnboardingStatusResponse,\n OnboardingRegisterResponse,\n OnboardingRegisterPasskeyResponse,\n OnboardingCompleteResponse,\n RegisterStartResponse,\n} from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, isNumber, isArray, required, validationError } from './helpers';\n\nconst ONBOARDING_STATUSES = ['pending_passkey', 'pending_data', 'completed'] as const;\nconst REGISTER_PASSKEY_STATUSES = ['pending_data', 'completed'] as const;\n\nexport function validateOnboardingStartResponse(\n data: unknown\n): Result<OnboardingStartResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const onboarding_url = required(data, 'onboarding_url');\n const expires_in = required(data, 'expires_in');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n if (!isString(onboarding_url)) {\n return validationError('Invalid API response: onboarding_url must be string', {\n field: 'onboarding_url',\n originalData: data,\n });\n }\n if (!isNumber(expires_in)) {\n return validationError('Invalid API response: expires_in must be number', {\n field: 'expires_in',\n originalData: data,\n });\n }\n\n return ok({ session_id, onboarding_url, expires_in });\n}\n\nexport function validateOnboardingStatusResponse(\n data: unknown\n): Result<OnboardingStatusResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const status = required(data, 'status');\n const onboarding_url = required(data, 'onboarding_url');\n const expires_in = required(data, 'expires_in');\n\n if (\n !isString(status) ||\n !ONBOARDING_STATUSES.includes(status as (typeof ONBOARDING_STATUSES)[number])\n ) {\n return validationError(\n 'Invalid API response: status must be pending_passkey|pending_data|completed',\n {\n field: 'status',\n originalData: data,\n }\n );\n }\n if (!isString(onboarding_url)) {\n return validationError('Invalid API response: onboarding_url must be string', {\n originalData: data,\n });\n }\n if (!isNumber(expires_in)) {\n return validationError('Invalid API response: expires_in must be number', {\n originalData: data,\n });\n }\n\n return ok({\n status: status as OnboardingStatusResponse['status'],\n onboarding_url,\n expires_in,\n });\n}\n\n/** Response may include optional challenge for same-device passkey registration */\nexport type OnboardingRegisterResponseWithChallenge = OnboardingRegisterResponse & {\n challenge?: RegisterStartResponse['challenge'];\n};\n\nexport function validateOnboardingRegisterResponse(\n data: unknown\n): Result<OnboardingRegisterResponseWithChallenge, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const status = required(data, 'status');\n const onboarding_url = required(data, 'onboarding_url');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n if (status !== 'pending_passkey') {\n return validationError('Invalid API response: status must be pending_passkey', {\n field: 'status',\n originalData: data,\n });\n }\n if (!isString(onboarding_url)) {\n return validationError('Invalid API response: onboarding_url must be string', {\n originalData: data,\n });\n }\n\n const challenge = data.challenge;\n let parsedChallenge: RegisterStartResponse['challenge'] | undefined;\n if (challenge !== undefined) {\n const chResult = validateOnboardingChallenge(challenge);\n if (!chResult.ok) return chResult;\n parsedChallenge = chResult.value;\n }\n\n return ok({\n session_id,\n status: 'pending_passkey',\n onboarding_url,\n ...(parsedChallenge !== undefined && { challenge: parsedChallenge }),\n });\n}\n\nfunction validateOnboardingChallenge(\n data: unknown\n): Result<RegisterStartResponse['challenge'], TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: challenge must be object', {\n originalData: data,\n });\n }\n\n const rp = required(data, 'rp');\n const user = required(data, 'user');\n const challengeStr = required(data, 'challenge');\n const pubKeyCredParams = required(data, 'pubKeyCredParams');\n\n if (\n !isObject(rp) ||\n !isString((rp as Record<string, unknown>).name) ||\n !isString((rp as Record<string, unknown>).id)\n ) {\n return validationError('Invalid API response: challenge.rp must have name and id', {\n originalData: data,\n });\n }\n if (\n !isObject(user) ||\n !isString((user as Record<string, unknown>).id) ||\n !isString((user as Record<string, unknown>).name) ||\n !isString((user as Record<string, unknown>).displayName)\n ) {\n return validationError('Invalid API response: challenge.user must have id, name, displayName', {\n originalData: data,\n });\n }\n if (!isString(challengeStr)) {\n return validationError('Invalid API response: challenge.challenge must be string', {\n originalData: data,\n });\n }\n if (!isArray(pubKeyCredParams)) {\n return validationError('Invalid API response: challenge.pubKeyCredParams must be array', {\n originalData: data,\n });\n }\n for (const item of pubKeyCredParams) {\n if (\n !isObject(item) ||\n (item as Record<string, unknown>).type !== 'public-key' ||\n !isNumber((item as Record<string, unknown>).alg)\n ) {\n return validationError(\n 'Invalid API response: pubKeyCredParams items must have type and alg',\n {\n originalData: data,\n }\n );\n }\n }\n\n return ok({\n rp: rp as RegisterStartResponse['challenge']['rp'],\n user: user as RegisterStartResponse['challenge']['user'],\n challenge: challengeStr,\n pubKeyCredParams: pubKeyCredParams as RegisterStartResponse['challenge']['pubKeyCredParams'],\n });\n}\n\nexport function validateOnboardingRegisterPasskeyResponse(\n data: unknown\n): Result<OnboardingRegisterPasskeyResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const status = required(data, 'status');\n const user_id = required(data, 'user_id');\n const tenant_id = required(data, 'tenant_id');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n originalData: data,\n });\n }\n if (\n !isString(status) ||\n !REGISTER_PASSKEY_STATUSES.includes(status as (typeof REGISTER_PASSKEY_STATUSES)[number])\n ) {\n return validationError('Invalid API response: status must be pending_data|completed', {\n originalData: data,\n });\n }\n if (!isString(user_id)) {\n return validationError('Invalid API response: user_id must be string', {\n originalData: data,\n });\n }\n if (!isString(tenant_id)) {\n return validationError('Invalid API response: tenant_id must be string', {\n originalData: data,\n });\n }\n\n return ok({\n session_id,\n status: status as OnboardingRegisterPasskeyResponse['status'],\n user_id,\n tenant_id,\n });\n}\n\nexport function validateOnboardingCompleteResponse(\n data: unknown\n): Result<OnboardingCompleteResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const status = required(data, 'status');\n const user_id = required(data, 'user_id');\n const tenant_id = required(data, 'tenant_id');\n const session_token = required(data, 'session_token');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n originalData: data,\n });\n }\n if (status !== 'completed') {\n return validationError('Invalid API response: status must be completed', {\n originalData: data,\n });\n }\n if (!isString(user_id) || !isString(tenant_id) || !isString(session_token)) {\n return validationError(\n 'Invalid API response: user_id, tenant_id, session_token must be strings',\n { originalData: data }\n );\n }\n\n return ok({\n session_id,\n status: 'completed',\n user_id,\n tenant_id,\n session_token,\n });\n}\n","import { ok } from '../../utils/result';\nimport type { Result } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, validationError } from './helpers';\nimport type {\n CrossDeviceInitResult,\n CrossDeviceStatusResult,\n CrossDeviceContextResult,\n} from '../../types';\n\n/**\n * Validates the response for cross-device verify and verify-registration endpoints.\n * Backend returns 204 No Content; body may be undefined, null, or empty object.\n * Accepts only those; rejects any other shape to detect unexpected API responses.\n */\nexport function validateCrossDeviceVerifyResponse(data: unknown): Result<void, TryMellonError> {\n if (data === undefined || data === null) {\n return ok(undefined);\n }\n if (isObject(data) && Object.keys(data).length === 0) {\n return ok(undefined);\n }\n return validationError('Invalid API response: expected empty body (204)', {\n originalData: data,\n });\n}\n\nfunction isCreationOptionsShape(opts: unknown): opts is Record<string, unknown> {\n if (!opts || typeof opts !== 'object') return false;\n const o = opts as Record<string, unknown>;\n return (\n typeof o.challenge === 'string' &&\n o.rp != null &&\n typeof o.rp === 'object' &&\n o.user != null &&\n typeof o.user === 'object' &&\n Array.isArray((o as { pubKeyCredParams?: unknown }).pubKeyCredParams)\n );\n}\n\nfunction isRequestOptionsShape(opts: unknown): opts is Record<string, unknown> {\n if (!opts || typeof opts !== 'object') return false;\n const o = opts as Record<string, unknown>;\n return typeof o.challenge === 'string' && typeof o.rpId === 'string';\n}\n\n/**\n * Accepts either the unwrapped payload { session_id, qr_url, expires_at } or the fintech\n * envelope { ok: true, resultado: { session_id, qr_url, expires_at } } so the flow works\n * regardless of whether the fetch-client unwraps before calling this validator.\n */\nexport function validateCrossDeviceInitResponse(\n data: unknown\n): Result<CrossDeviceInitResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const payload =\n 'resultado' in data && isObject((data as { resultado: unknown }).resultado)\n ? (data as { resultado: Record<string, unknown> }).resultado\n : data;\n\n const session_id = payload.session_id;\n const qr_url = payload.qr_url;\n const expires_at = payload.expires_at;\n const polling_token = payload.polling_token;\n\n if (\n !isString(session_id) ||\n !isString(qr_url) ||\n !isString(expires_at) ||\n !isString(polling_token)\n ) {\n return validationError('Invalid API response: missing required fields', { originalData: data });\n }\n\n const result: CrossDeviceInitResult = {\n session_id,\n qr_url,\n expires_at,\n polling_token,\n };\n if (payload.external_user_id !== undefined && isString(payload.external_user_id)) {\n result.external_user_id = payload.external_user_id;\n }\n return ok(result);\n}\n\n/**\n * Accepts either the unwrapped payload { status, user_id?, session_token?, redirect_url? } or the\n * fintech envelope { ok: true, resultado: { ... } } so the flow works regardless of unwrapping.\n */\nexport function validateCrossDeviceStatusResponse(\n data: unknown\n): Result<CrossDeviceStatusResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const payload =\n 'resultado' in data && isObject((data as { resultado: unknown }).resultado)\n ? (data as { resultado: Record<string, unknown> }).resultado\n : data;\n\n const status = payload.status;\n if (!isString(status) || !['pending', 'authenticated', 'completed'].includes(status)) {\n return validationError('Invalid API response: invalid status', { originalData: data });\n }\n\n const user_id = payload.user_id;\n const session_token = payload.session_token;\n const redirect_url = payload.redirect_url;\n\n if (user_id !== undefined && !isString(user_id)) {\n return validationError('Invalid API response: user_id must be a string when present', {\n originalData: data,\n });\n }\n if (session_token !== undefined && !isString(session_token)) {\n return validationError('Invalid API response: session_token must be a string when present', {\n originalData: data,\n });\n }\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be a string when present', {\n originalData: data,\n });\n }\n\n return ok({\n status: status as CrossDeviceStatusResult['status'],\n user_id: user_id as string | undefined,\n session_token: session_token as string | undefined,\n redirect_url: redirect_url as string | undefined,\n });\n}\n\nexport function validateCrossDeviceContextResponse(\n data: unknown\n): Result<CrossDeviceContextResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const rawType = data.type;\n const type =\n rawType === 'registration' ? 'registration' : rawType === 'auth' ? 'auth' : ('auth' as const);\n\n const options = data.options;\n if (!isObject(options)) {\n return validationError('Invalid API response: options are required', { originalData: data });\n }\n\n const MAX_CONTEXT_LENGTH = 200;\n const approval_context = optionalContextString(data.approval_context, MAX_CONTEXT_LENGTH);\n const application_name = optionalContextString(data.application_name, MAX_CONTEXT_LENGTH);\n if (approval_context === false || application_name === false) {\n return validationError(\n 'Invalid API response: approval_context/application_name must be string max 200 chars',\n {\n originalData: data,\n }\n );\n }\n\n const extra: { approval_context?: string; application_name?: string } = {};\n if (typeof approval_context === 'string') extra.approval_context = approval_context;\n if (typeof application_name === 'string') extra.application_name = application_name;\n\n if (type === 'registration') {\n if (!isCreationOptionsShape(options)) {\n return validationError(\n 'Invalid API response: registration options must have challenge, rp, user, pubKeyCredParams',\n { originalData: data }\n );\n }\n return ok({\n type: 'registration',\n options,\n ...extra,\n } as CrossDeviceContextResult);\n }\n\n if (!isRequestOptionsShape(options)) {\n return validationError('Invalid API response: auth options must have challenge and rpId', {\n originalData: data,\n });\n }\n return ok({ type: 'auth', options, ...extra } as CrossDeviceContextResult);\n}\n\n/** Returns string if valid (optional, max len), undefined if missing, false if invalid. */\nfunction optionalContextString(value: unknown, maxLength: number): string | undefined | false {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'string') return false;\n if (value.length > maxLength) return false;\n return value;\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { RecoveryVerifyResponse, RecoveryCompleteResponse } from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, required, validationError } from './helpers';\n\nexport function validateRecoveryVerifyResponse(\n data: unknown\n): Result<RecoveryVerifyResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const challenge = required(data, 'challenge');\n const recovery_session_id = required(data, 'recovery_session_id');\n\n if (!isObject(challenge)) {\n return validationError('Invalid API response: challenge must be object', {\n field: 'challenge',\n originalData: data,\n });\n }\n\n if (!isString(recovery_session_id)) {\n return validationError('Invalid API response: recovery_session_id must be string', {\n field: 'recovery_session_id',\n originalData: data,\n });\n }\n\n return ok({\n challenge: challenge as Record<string, unknown>,\n recovery_session_id,\n });\n}\n\nexport function validateRecoveryCompleteResponse(\n data: unknown\n): Result<RecoveryCompleteResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const status = required(data, 'status');\n const session_token = required(data, 'session_token');\n const user = required(data, 'user');\n const credential_id = required(data, 'credential_id');\n\n if (!isString(status)) {\n return validationError('Invalid API response: status must be string', {\n field: 'status',\n originalData: data,\n });\n }\n\n if (!isString(session_token)) {\n return validationError('Invalid API response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n\n if (!isString(credential_id)) {\n return validationError('Invalid API response: credential_id must be string', {\n field: 'credential_id',\n originalData: data,\n });\n }\n\n if (!isObject(user)) {\n return validationError('Invalid API response: user must be object', {\n field: 'user',\n originalData: data,\n });\n }\n\n const user_id = required(user, 'user_id');\n if (!isString(user_id)) {\n return validationError('Invalid API response: user.user_id must be string', {\n field: 'user.user_id',\n originalData: data,\n });\n }\n\n const dataObj = data as Record<string, unknown>;\n const redirect_url = dataObj.redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n field: 'redirect_url',\n originalData: data,\n });\n }\n\n const userObj = user as Record<string, unknown>;\n return ok({\n status,\n session_token,\n credential_id,\n user: {\n user_id,\n external_user_id: isString(userObj.external_user_id) ? userObj.external_user_id : undefined,\n email: isString(userObj.email) ? userObj.email : undefined,\n metadata: isObject(userObj.metadata)\n ? (userObj.metadata as Record<string, unknown>)\n : undefined,\n },\n ...(redirect_url !== undefined && { redirect_url }),\n });\n}\n","import type { HttpClient } from './http-client';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport type { TryMellonError } from '../errors';\nimport {\n validateRegisterStartResponse,\n validateAuthStartResponse,\n validateRegisterFinishResponse,\n validateAuthFinishResponse,\n validateSessionValidateResponse,\n validateEmailVerifyResponse,\n validateOnboardingStartResponse,\n validateOnboardingStatusResponse,\n validateOnboardingRegisterResponse,\n validateOnboardingRegisterPasskeyResponse,\n validateOnboardingCompleteResponse,\n validateCrossDeviceInitResponse,\n validateCrossDeviceStatusResponse,\n validateCrossDeviceContextResponse,\n validateCrossDeviceVerifyResponse,\n validateRecoveryVerifyResponse,\n validateRecoveryCompleteResponse,\n} from './validators';\nimport type {\n RegisterStartRequest,\n RegisterStartResponse,\n AuthStartRequest,\n AuthStartResponse,\n RegisterFinishRequest,\n RegisterFinishResponse,\n AuthFinishRequest,\n AuthFinishResponse,\n SessionValidateResponse,\n OnboardingStartRequest,\n OnboardingStartResponse,\n OnboardingStatusResponse,\n OnboardingRegisterPasskeyRequest,\n OnboardingRegisterPasskeyResponse,\n OnboardingCompleteRequest,\n OnboardingCompleteResponse,\n CrossDeviceInitResult,\n CrossDeviceStatusResult,\n CrossDeviceContextResult,\n CrossDeviceVerifyRequest,\n CrossDeviceVerifyRegistrationRequest,\n RecoveryVerifyResponse,\n RecoveryCompleteResponse,\n} from '../types';\nimport type { OnboardingRegisterResponseWithChallenge } from './validators';\n\nexport class ApiClient {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly baseUrl: string,\n private readonly defaultHeaders: Record<string, string> = {}\n ) {}\n\n private mergeHeaders(extra?: Record<string, string>): Record<string, string> {\n return { ...this.defaultHeaders, ...extra };\n }\n\n private async post<Req, Res>(\n path: string,\n body: Req,\n validate: (data: unknown) => Result<Res, TryMellonError>\n ): Promise<Result<Res, TryMellonError>> {\n const url = `${this.baseUrl}${path}`;\n const result = await this.httpClient.post<unknown>(url, body, this.mergeHeaders());\n\n if (!result.ok) {\n return err(result.error);\n }\n\n return validate(result.value);\n }\n\n private async get<Res>(\n path: string,\n validate: (data: unknown) => Result<Res, TryMellonError>,\n headers?: Record<string, string>\n ): Promise<Result<Res, TryMellonError>> {\n const url = `${this.baseUrl}${path}`;\n const result = await this.httpClient.get<unknown>(url, this.mergeHeaders(headers));\n\n if (!result.ok) {\n return err(result.error);\n }\n\n return validate(result.value);\n }\n\n async startRegister(\n request: RegisterStartRequest\n ): Promise<Result<RegisterStartResponse, TryMellonError>> {\n return this.post('/v1/passkeys/register/start', request, validateRegisterStartResponse);\n }\n\n async startAuth(request: AuthStartRequest): Promise<Result<AuthStartResponse, TryMellonError>> {\n return this.post('/v1/passkeys/auth/start', request, validateAuthStartResponse);\n }\n\n async finishRegister(\n request: RegisterFinishRequest\n ): Promise<Result<RegisterFinishResponse, TryMellonError>> {\n return this.post('/v1/passkeys/register/finish', request, validateRegisterFinishResponse);\n }\n\n async finishAuthentication(\n request: AuthFinishRequest\n ): Promise<Result<AuthFinishResponse, TryMellonError>> {\n return this.post('/v1/passkeys/auth/finish', request, validateAuthFinishResponse);\n }\n\n async validateSession(\n sessionToken: string\n ): Promise<Result<SessionValidateResponse, TryMellonError>> {\n return this.get('/v1/sessions/validate', validateSessionValidateResponse, {\n Authorization: `Bearer ${sessionToken}`,\n });\n }\n\n async startEmailFallback(options: {\n userId: string;\n email: string;\n }): Promise<Result<void, TryMellonError>> {\n const url = `${this.baseUrl}/v1/fallback/email/start`;\n const result = await this.httpClient.post<unknown>(\n url,\n { userId: options.userId, email: options.email },\n this.mergeHeaders()\n );\n if (!result.ok) return err(result.error);\n return ok(undefined);\n }\n\n async verifyEmailCode(options: {\n userId: string;\n code: string;\n successUrl?: string;\n }): Promise<Result<{ sessionToken: string; redirectUrl?: string }, TryMellonError>> {\n const body: Record<string, unknown> = { userId: options.userId, code: options.code };\n if (options.successUrl) body.success_url = options.successUrl;\n return this.post('/v1/fallback/email/verify', body, validateEmailVerifyResponse);\n }\n\n async startOnboarding(\n request: OnboardingStartRequest\n ): Promise<Result<OnboardingStartResponse, TryMellonError>> {\n return this.post('/v1/onboarding/start', request, validateOnboardingStartResponse);\n }\n\n async getOnboardingStatus(\n sessionId: string\n ): Promise<Result<OnboardingStatusResponse, TryMellonError>> {\n return this.get(`/v1/onboarding/${sessionId}/status`, validateOnboardingStatusResponse);\n }\n\n async getOnboardingRegister(\n sessionId: string\n ): Promise<Result<OnboardingRegisterResponseWithChallenge, TryMellonError>> {\n return this.get(`/v1/onboarding/${sessionId}/register`, validateOnboardingRegisterResponse);\n }\n\n async registerOnboardingPasskey(\n sessionId: string,\n request: OnboardingRegisterPasskeyRequest\n ): Promise<Result<OnboardingRegisterPasskeyResponse, TryMellonError>> {\n return this.post(\n `/v1/onboarding/${sessionId}/register-passkey`,\n request,\n validateOnboardingRegisterPasskeyResponse\n );\n }\n\n async completeOnboarding(\n sessionId: string,\n request: OnboardingCompleteRequest\n ): Promise<Result<OnboardingCompleteResponse, TryMellonError>> {\n return this.post(\n `/v1/onboarding/${sessionId}/complete`,\n request,\n validateOnboardingCompleteResponse\n );\n }\n\n async initCrossDeviceAuth(): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n return this.post('/v1/auth/cross-device/init', {}, validateCrossDeviceInitResponse);\n }\n\n async initCrossDeviceRegistration(options?: {\n externalUserId?: string;\n }): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n const trimmed =\n typeof options?.externalUserId === 'string' ? options.externalUserId.trim() : '';\n const body = trimmed.length > 0 ? { external_user_id: trimmed } : {};\n return this.post(\n '/v1/auth/cross-device/init-registration',\n body,\n validateCrossDeviceInitResponse\n );\n }\n\n async getCrossDeviceStatus(\n sessionId: string,\n pollingToken?: string | null\n ): Promise<Result<CrossDeviceStatusResult, TryMellonError>> {\n const headers: Record<string, string> = {};\n if (typeof pollingToken === 'string' && pollingToken.length > 0) {\n headers['X-Polling-Token'] = pollingToken;\n }\n return this.get(\n `/v1/auth/cross-device/status/${sessionId}`,\n validateCrossDeviceStatusResponse,\n Object.keys(headers).length > 0 ? headers : undefined\n );\n }\n\n /**\n * Fetches WebAuthn options for the cross-device session.\n * Contract: response is CrossDeviceContextResult (auth | registration).\n * Use result.value.type to branch: 'auth' → credentials.get + verify;\n * 'registration' → credentials.create + verify-registration.\n */\n async getCrossDeviceContext(\n sessionId: string\n ): Promise<Result<CrossDeviceContextResult, TryMellonError>> {\n return this.get(\n `/v1/auth/cross-device/context/${sessionId}`,\n validateCrossDeviceContextResponse\n );\n }\n\n async verifyCrossDeviceAuth(\n request: CrossDeviceVerifyRequest\n ): Promise<Result<void, TryMellonError>> {\n return this.post('/v1/auth/cross-device/verify', request, validateCrossDeviceVerifyResponse);\n }\n\n async verifyCrossDeviceRegistration(\n request: CrossDeviceVerifyRegistrationRequest\n ): Promise<Result<void, TryMellonError>> {\n return this.post(\n '/v1/auth/cross-device/verify-registration',\n request,\n validateCrossDeviceVerifyResponse\n );\n }\n\n async verifyAccountRecoveryOtp(\n externalUserId: string,\n otp: string\n ): Promise<Result<RecoveryVerifyResponse, TryMellonError>> {\n return this.post(\n '/v1/users/recovery/verify',\n { external_id: externalUserId, otp },\n validateRecoveryVerifyResponse\n );\n }\n\n async completeAccountRecovery(\n recoverySessionId: string,\n credential: Record<string, unknown>\n ): Promise<Result<RecoveryCompleteResponse, TryMellonError>> {\n return this.post(\n '/v1/users/recovery/complete',\n { recovery_session_id: recoverySessionId, credential },\n validateRecoveryCompleteResponse\n );\n }\n}\n","import type { HttpClient } from './http-client';\nimport type { Logger } from './ports/logger';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport {\n createError,\n mapBackendErrorCodeToTryMellon,\n type TryMellonError,\n type TryMellonErrorCode,\n} from '../errors';\n\n/** Fintech success envelope: { ok: true, resultado: T } */\nfunction isEnvelopeSuccess(data: unknown): data is { ok: true; resultado: unknown } {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as Record<string, unknown>).ok === true &&\n 'resultado' in (data as Record<string, unknown>)\n );\n}\n\n/** Fintech error envelope: { ok: false, error: { code, message } } */\nfunction isEnvelopeError(\n data: unknown\n): data is { ok: false; error: { code: string; message: string; details?: unknown } } {\n if (typeof data !== 'object' || data === null) return false;\n const o = data as Record<string, unknown>;\n if (o.ok !== false || !o.error || typeof o.error !== 'object') return false;\n const err = o.error as Record<string, unknown>;\n return typeof err.code === 'string' && typeof err.message === 'string';\n}\n\n/**\n * Pure function: parses HTTP error body (fintech envelope or fallbacks) into message and code.\n * Concentrates all error-body parsing in one place for testability and single responsibility.\n */\nexport function parseHttpErrorBody(\n errorData: unknown,\n statusText: string\n): { message: string; code: TryMellonErrorCode } {\n if (isEnvelopeError(errorData)) {\n return {\n message: errorData.error.message,\n code: mapBackendErrorCodeToTryMellon(errorData.error.code),\n };\n }\n const body = errorData as\n | { message?: string; error?: string | { code?: string; message?: string } }\n | undefined;\n const errObj = body?.error;\n if (\n typeof errObj === 'object' &&\n errObj !== null &&\n 'code' in errObj &&\n typeof (errObj as { code: string }).code === 'string'\n ) {\n return {\n message: (errObj as { message?: string }).message ?? body?.message ?? statusText,\n code: mapBackendErrorCodeToTryMellon((errObj as { code: string }).code),\n };\n }\n const message = body?.message ?? statusText;\n const rawCode = body?.error;\n const code =\n typeof rawCode === 'string'\n ? mapBackendErrorCodeToTryMellon(rawCode)\n : rawCode === undefined\n ? 'NETWORK_FAILURE'\n : mapBackendErrorCodeToTryMellon(String(rawCode));\n return { message, code };\n}\n\nconst RETRY_DELAY_CAP_MS = 30_000;\n\n/**\n * Generates a unique request ID. Uses globalThis.crypto.randomUUID only (Elite: no Node crypto).\n * @throws Error when Web Crypto API is not available (Edge/browser must provide it).\n */\nfunction generateRequestId(): string {\n if (\n typeof globalThis.crypto !== 'undefined' &&\n typeof globalThis.crypto.randomUUID === 'function'\n ) {\n return globalThis.crypto.randomUUID();\n }\n throw new Error('Web Crypto API is required but not available.');\n}\n\n/**\n * Exponential backoff delay for a given attempt (0-based).\n * Cap at RETRY_DELAY_CAP_MS.\n */\nexport function getRetryDelayMs(attempt: number, baseMs: number): number {\n const delay = baseMs * Math.pow(2, attempt);\n return Math.min(delay, RETRY_DELAY_CAP_MS);\n}\n\nfunction shouldRetryOnStatus(method: string, status: number): boolean {\n if (method !== 'GET') return false;\n return status >= 500 || status === 429;\n}\n\nexport class FetchHttpClient implements HttpClient {\n constructor(\n private readonly timeoutMs: number,\n private readonly maxRetries: number = 0,\n private readonly retryDelayMs: number = 1000,\n private readonly logger?: Logger\n ) {}\n\n async get<T>(url: string, headers?: Record<string, string>): Promise<Result<T, TryMellonError>> {\n return this.request<T>(url, { method: 'GET', headers });\n }\n\n async post<T>(\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<Result<T, TryMellonError>> {\n return this.request<T>(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...headers },\n });\n }\n\n private async request<T>(url: string, config: RequestInit): Promise<Result<T, TryMellonError>> {\n const method = (config.method ?? 'GET').toUpperCase();\n const requestId = generateRequestId();\n const headers = new Headers(config.headers as HeadersInit);\n headers.set('X-Request-Id', requestId);\n\n if (this.logger) {\n this.logger.debug('request', { requestId, url, method });\n }\n\n let lastError: TryMellonError | Error | unknown;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const response = await fetch(url, {\n ...config,\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n let errorData: unknown;\n try {\n errorData = await response.json();\n } catch {\n // Ignore JSON parse error\n }\n\n const { message, code } = parseHttpErrorBody(errorData, response.statusText);\n const errResult = createError(code, message, {\n requestId,\n status: response.status,\n statusText: response.statusText,\n data: errorData,\n });\n\n if (shouldRetryOnStatus(method, response.status) && attempt < this.maxRetries) {\n lastError = errResult;\n clearTimeout(timeoutId);\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelayMs(attempt, this.retryDelayMs))\n );\n continue;\n }\n\n return err(errResult);\n }\n\n if (response.status === 204) {\n return ok(undefined as T);\n }\n const contentLength = response.headers.get('content-length');\n if (contentLength === '0') {\n return ok(undefined as T);\n }\n const raw = (await response.json()) as unknown;\n if (isEnvelopeSuccess(raw)) {\n return ok((raw as { ok: true; resultado: T }).resultado);\n }\n const o = raw as Record<string, unknown>;\n if (typeof raw === 'object' && raw !== null && o.ok === true && !('resultado' in o)) {\n return ok(undefined as T);\n }\n if (isEnvelopeError(raw)) {\n const { message, code } = parseHttpErrorBody(raw, response.statusText);\n return err(\n createError(code, message, {\n requestId,\n status: response.status,\n statusText: response.statusText,\n data: raw,\n })\n );\n }\n return ok(raw as T);\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error) {\n lastError = error;\n const isGet = method === 'GET';\n if (isGet && attempt < this.maxRetries) {\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelayMs(attempt, this.retryDelayMs))\n );\n } else {\n break;\n }\n }\n }\n\n if (lastError instanceof Error && lastError.name === 'AbortError') {\n return err(createError('TIMEOUT', 'Request timed out', { requestId }));\n }\n\n return err(\n createError(\n 'NETWORK_FAILURE',\n lastError instanceof Error ? lastError.message : 'Request failed',\n { requestId, cause: lastError }\n )\n );\n }\n}\n","import { createEncodingError } from '../errors';\n\n/**\n * Encodes an ArrayBuffer to base64url using globalThis.btoa (Edge/browser-safe; no Node Buffer).\n * @throws TryMellonError when btoa is unavailable\n */\nexport function base64UrlEncode(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n const binary = Array.from(bytes, (b) => String.fromCharCode(b)).join('');\n\n if (typeof globalThis.btoa === 'undefined') {\n throw createEncodingError('encode');\n }\n const base64 = globalThis.btoa(binary);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Decodes a base64url string to Uint8Array using globalThis.atob (Edge/browser-safe; no Node Buffer).\n * @throws TryMellonError when atob is unavailable\n */\nexport function base64UrlDecode(s: string): Uint8Array {\n if (typeof globalThis.atob === 'undefined') {\n throw createEncodingError('decode');\n }\n\n const base64 = s.replace(/-/g, '+').replace(/_/g, '/');\n const padding = base64.length % 4;\n const padded = padding === 0 ? base64 : base64 + '='.repeat(4 - padding);\n const binary = globalThis.atob(padded);\n\n return Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\n/** Decodes base64url to ArrayBuffer (delegates to base64UrlDecode). */\nexport function base64UrlDecodeToArrayBuffer(s: string): ArrayBuffer {\n const bytes = base64UrlDecode(s);\n const buffer = new ArrayBuffer(bytes.length);\n new Uint8Array(buffer).set(bytes);\n return buffer;\n}\n","import { createError } from '../errors';\nimport { base64UrlEncode } from '../utils/base64url';\nimport type { RegisterFinishRequest, AuthFinishRequest } from '../types';\n\ntype SerializedCredentialForRegister = RegisterFinishRequest['credential'];\ntype SerializedCredentialForAuth = AuthFinishRequest['credential'];\n\n/**\n * Type guard to verify whether a credential response is valid.\n */\nfunction isValidCredentialResponse(\n response: unknown\n): response is AuthenticatorAssertionResponse | AuthenticatorAttestationResponse {\n return (\n response !== null &&\n typeof response === 'object' &&\n 'clientDataJSON' in response &&\n response.clientDataJSON instanceof ArrayBuffer\n );\n}\n\n/**\n * Serializes a credential for registration (finish).\n * Includes attestationObject required for registration verification.\n *\n * @param credential - WebAuthn credential from navigator.credentials.create()\n * @returns Serialized credential in Base64URL format\n * @throws {TryMellonError} If the credential does not have the expected structure for registration\n */\nexport function serializeCredentialForRegister(\n credential: PublicKeyCredential\n): SerializedCredentialForRegister {\n if (!credential.response) {\n throw createError('UNKNOWN_ERROR', 'Credential response is missing', { credential });\n }\n\n const response = credential.response;\n\n if (!isValidCredentialResponse(response)) {\n throw createError('UNKNOWN_ERROR', 'Invalid credential response structure', { response });\n }\n\n if (!('attestationObject' in response)) {\n throw createError(\n 'UNKNOWN_ERROR',\n 'Invalid credential response structure for register: attestationObject is missing',\n { response }\n );\n }\n\n const clientDataJSON = response.clientDataJSON;\n const attestationObject = (response as AuthenticatorAttestationResponse).attestationObject;\n\n return {\n id: credential.id,\n rawId: base64UrlEncode(credential.rawId),\n response: {\n clientDataJSON: base64UrlEncode(clientDataJSON),\n attestationObject: base64UrlEncode(attestationObject),\n },\n type: 'public-key',\n };\n}\n\n/**\n * Serializes a credential for authentication (finish).\n * Includes authenticatorData, signature, and optionally userHandle.\n *\n * @param credential - WebAuthn credential from navigator.credentials.get()\n * @returns Serialized credential in Base64URL format\n * @throws {TryMellonError} If the credential does not have the expected structure for authentication\n */\nexport function serializeCredentialForAuth(\n credential: PublicKeyCredential\n): SerializedCredentialForAuth {\n if (!credential.response) {\n throw createError('UNKNOWN_ERROR', 'Credential response is missing', { credential });\n }\n\n const response = credential.response;\n\n if (!isValidCredentialResponse(response)) {\n throw createError('UNKNOWN_ERROR', 'Invalid credential response structure', { response });\n }\n\n if (!('authenticatorData' in response) || !('signature' in response)) {\n throw createError(\n 'UNKNOWN_ERROR',\n 'Invalid credential response structure for auth: authenticatorData or signature is missing',\n { response }\n );\n }\n\n const clientDataJSON = response.clientDataJSON;\n const authenticatorData = (response as AuthenticatorAssertionResponse).authenticatorData;\n const signature = (response as AuthenticatorAssertionResponse).signature;\n const userHandle = (response as AuthenticatorAssertionResponse).userHandle;\n\n return {\n id: credential.id,\n rawId: base64UrlEncode(credential.rawId),\n response: {\n authenticatorData: base64UrlEncode(authenticatorData),\n clientDataJSON: base64UrlEncode(clientDataJSON),\n signature: base64UrlEncode(signature),\n ...(userHandle && { userHandle: base64UrlEncode(userHandle) }),\n },\n type: 'public-key',\n };\n}\n","import type { ClientStatus } from '../types';\n\nexport function isWebAuthnSupported(): boolean {\n try {\n if (typeof navigator === 'undefined' || !navigator.credentials) {\n return false;\n }\n\n if (typeof PublicKeyCredential === 'undefined') {\n return false;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isPlatformAuthenticatorAvailable(): Promise<boolean> {\n try {\n if (!isWebAuthnSupported()) {\n return false;\n }\n\n if (typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function') {\n return false;\n }\n\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n } catch {\n return false;\n }\n}\n\nexport async function getClientStatus(): Promise<ClientStatus> {\n const isPasskeySupported = isWebAuthnSupported();\n const platformAuthenticatorAvailable = await isPlatformAuthenticatorAvailable();\n\n return {\n isPasskeySupported,\n platformAuthenticatorAvailable,\n recommendedFlow: isPasskeySupported ? 'passkey' : 'fallback',\n };\n}\n","import { createCredentialError } from '../errors';\n\nexport function validateCredentialStructure(\n credential: unknown,\n operation: 'create' | 'get' = 'create'\n): asserts credential is PublicKeyCredential {\n if (\n !credential ||\n typeof credential !== 'object' ||\n !('id' in credential) ||\n !('rawId' in credential) ||\n !('response' in credential)\n ) {\n throw createCredentialError(operation);\n }\n}\n","import type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport { isWebAuthnSupported } from '../utils/support';\nimport type { EventEmitter } from './events';\nimport type { TryMellonError } from '../errors';\nimport { mapWebAuthnError, createNotSupportedError, createInvalidArgumentError } from '../errors';\nimport { validateCredentialStructure } from '../utils/validation';\n\nexport type CeremonyOperation = 'register' | 'authenticate';\n\nexport interface InvokeCeremonyContext<\n TStartResult,\n TFinishResult,\n TCeremonyOptions extends CredentialCreationOptions | CredentialRequestOptions,\n> {\n operation: CeremonyOperation;\n eventEmitter: EventEmitter;\n start: () => Promise<Result<TStartResult, TryMellonError>>;\n createOptions: (startResult: TStartResult) => Result<TCeremonyOptions, TryMellonError>;\n invoke: (options: TCeremonyOptions) => Promise<Credential | null>;\n finish: (\n startResult: TStartResult,\n credential: PublicKeyCredential\n ) => Promise<Result<TFinishResult, TryMellonError>>;\n}\n\n/**\n * Orchestrates a generic WebAuthn flow (Ceremony) to remove duplicated code in the SDK.\n * Encapsulates start call, options creation, browser credentials API invocation,\n * base structure validation, and finish call.\n */\nexport async function invokeCeremony<\n TStartResult,\n TFinishResult,\n TCeremonyOptions extends CredentialCreationOptions | CredentialRequestOptions,\n>(\n context: InvokeCeremonyContext<TStartResult, TFinishResult, TCeremonyOptions>\n): Promise<Result<TFinishResult, TryMellonError>> {\n const { operation, eventEmitter, start, createOptions, invoke, finish } = context;\n\n try {\n eventEmitter.emit('start', { type: 'start', operation });\n\n if (!isWebAuthnSupported()) {\n const error = createNotSupportedError();\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n // 1. Obtener challenge del servidor\n const startResult = await start();\n if (!startResult.ok) {\n eventEmitter.emit('error', { type: 'error', error: startResult.error });\n return err(startResult.error);\n }\n\n // 2. Create options\n const optionsResult = createOptions(startResult.value);\n if (!optionsResult.ok) {\n eventEmitter.emit('error', { type: 'error', error: optionsResult.error });\n return err(optionsResult.error);\n }\n\n // 3. Invoke browser\n const credential = (await invoke(optionsResult.value)) as PublicKeyCredential;\n if (!credential) {\n const error = createInvalidArgumentError(\n 'credential',\n `${operation === 'register' ? 'creation' : 'retrieval'} failed`\n );\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n try {\n validateCredentialStructure(credential);\n } catch (e) {\n const error = mapWebAuthnError(e);\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n // 4. Completar en servidor (success lo emite el caller con token/user; 03-eventos-seguridad)\n const finishResult = await finish(startResult.value, credential);\n if (!finishResult.ok) {\n eventEmitter.emit('error', { type: 'error', error: finishResult.error });\n return err(finishResult.error);\n }\n\n return ok(finishResult.value);\n } catch (error) {\n const tryMellonError = mapWebAuthnError(error);\n eventEmitter.emit('error', { type: 'error', error: tryMellonError });\n return err(tryMellonError);\n }\n}\n","import { createInvalidArgumentError, validateBase64Url, mapWebAuthnError } from '../errors';\nimport { base64UrlDecodeToArrayBuffer } from '../utils/base64url';\nimport type { ApiClient } from './api';\nimport type { EventEmitter } from './events';\nimport type {\n RegisterOptions,\n RegisterResult,\n AuthenticateOptions,\n AuthenticateResult,\n RegisterStartResponse,\n AuthStartResponse,\n} from '../types';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport type { TryMellonError } from '../errors';\nimport { serializeCredentialForAuth, serializeCredentialForRegister } from './webauthn-utils';\nimport { invokeCeremony } from './ceremony';\n\n/**\n * Creates credential creation options for WebAuthn.\n * Converts server response to WebAuthn API format.\n * WebAuthn protocol: challenge and rp.id are taken from the server only; do not override.\n * Exported for use by OnboardingManager (same-device) and CrossDeviceManager (QR registration).\n *\n * @param serverChallengePayload - Value of the `.challenge` property from RegisterStartResponse\n * (the nested object with challenge, user, rp, pubKeyCredParams, etc.). Not the full API response.\n */\nexport function createRegistrationOptions(\n serverChallengePayload: RegisterStartResponse['challenge'],\n authenticatorType?: 'platform' | 'cross-platform'\n): Result<CredentialCreationOptions, TryMellonError> {\n try {\n validateBase64Url(serverChallengePayload.challenge, 'challenge');\n validateBase64Url(serverChallengePayload.user.id, 'user.id');\n\n const challengeBuffer = base64UrlDecodeToArrayBuffer(serverChallengePayload.challenge);\n const userIdBuffer = base64UrlDecodeToArrayBuffer(serverChallengePayload.user.id);\n\n // Construir authenticatorSelection: priorizar servidor, permitir override de authenticatorType\n let authenticatorSelection: AuthenticatorSelectionCriteria = {\n userVerification: 'preferred',\n };\n\n if (serverChallengePayload.authenticatorSelection) {\n // Usar valores del servidor como base\n authenticatorSelection = {\n ...serverChallengePayload.authenticatorSelection,\n };\n }\n\n // Si el usuario especifica authenticatorType, sobrescribir authenticatorAttachment\n if (authenticatorType) {\n authenticatorSelection = {\n ...authenticatorSelection,\n authenticatorAttachment: authenticatorType,\n };\n }\n\n const publicKey: PublicKeyCredentialCreationOptions = {\n rp: {\n id: serverChallengePayload.rp.id,\n name: serverChallengePayload.rp.name,\n },\n user: {\n id: userIdBuffer,\n name: serverChallengePayload.user.name,\n displayName: serverChallengePayload.user.displayName,\n },\n challenge: challengeBuffer,\n pubKeyCredParams: serverChallengePayload.pubKeyCredParams,\n ...(serverChallengePayload.timeout !== undefined && {\n timeout: serverChallengePayload.timeout,\n }),\n attestation: 'none',\n authenticatorSelection,\n ...(serverChallengePayload.excludeCredentials && {\n excludeCredentials: serverChallengePayload.excludeCredentials.map((cred) => ({\n id: base64UrlDecodeToArrayBuffer(cred.id),\n type: cred.type,\n ...(cred.transports && {\n transports: cred.transports as AuthenticatorTransport[],\n }),\n })),\n }),\n };\n\n return ok({ publicKey });\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n}\n\n/**\n * Creates authentication options for WebAuthn.\n * Converts server response to WebAuthn API format.\n * WebAuthn protocol: challenge and rpId are taken from the server only; do not override.\n */\nexport function createAuthenticationOptions(\n challenge: AuthStartResponse['challenge'],\n mediation?: AuthenticateOptions['mediation']\n): Result<CredentialRequestOptions, TryMellonError> {\n try {\n validateBase64Url(challenge.challenge, 'challenge');\n const challengeBuffer = base64UrlDecodeToArrayBuffer(challenge.challenge);\n\n return ok({\n publicKey: {\n challenge: challengeBuffer,\n rpId: challenge.rpId,\n ...(challenge.timeout !== undefined && { timeout: challenge.timeout }),\n userVerification: challenge.userVerification ?? 'preferred',\n ...(challenge.allowCredentials && {\n allowCredentials: challenge.allowCredentials.map((cred) => ({\n id: base64UrlDecodeToArrayBuffer(cred.id),\n type: cred.type,\n ...(cred.transports && {\n transports: cred.transports as AuthenticatorTransport[],\n }),\n })),\n }),\n },\n ...(mediation !== undefined && { mediation }),\n });\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n}\n\n/**\n * Registers a new passkey for a user.\n * Handles the full WebAuthn registration flow.\n */\nexport async function registerPasskey(\n options: RegisterOptions,\n apiClient: ApiClient,\n eventEmitter: EventEmitter\n): Promise<Result<RegisterResult, TryMellonError>> {\n const extId = options.externalUserId ?? options.external_user_id;\n if (!extId || typeof extId !== 'string' || extId.trim() === '') {\n const error = createInvalidArgumentError('externalUserId', 'must be a non-empty string');\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n const result = await invokeCeremony<\n RegisterStartResponse,\n RegisterResult,\n CredentialCreationOptions\n >({\n operation: 'register',\n eventEmitter,\n start: () => apiClient.startRegister({ external_user_id: extId }),\n createOptions: (startResult) =>\n createRegistrationOptions(startResult.challenge, options.authenticatorType),\n invoke: async (ceremonyOptions) => {\n const opts = { ...ceremonyOptions, ...(options.signal && { signal: options.signal }) };\n return navigator.credentials.create(opts);\n },\n finish: async (startResult, credential) => {\n const finishResult = await apiClient.finishRegister({\n session_id: startResult.session_id,\n credential: serializeCredentialForRegister(credential),\n ...(options.successUrl && { success_url: options.successUrl }),\n });\n\n if (!finishResult.ok) return err(finishResult.error);\n\n return ok({\n success: true,\n credentialId: finishResult.value.credential_id,\n credential_id: finishResult.value.credential_id,\n status: finishResult.value.status,\n sessionToken: finishResult.value.session_token,\n user: {\n userId: finishResult.value.user.user_id,\n externalUserId: finishResult.value.user.external_user_id,\n email: finishResult.value.user.email,\n metadata: finishResult.value.user.metadata,\n },\n ...(finishResult.value.redirect_url && { redirectUrl: finishResult.value.redirect_url }),\n });\n },\n });\n\n if (result.ok) {\n eventEmitter.emit('success', {\n type: 'success',\n operation: 'register',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result;\n}\n\n/**\n * Authenticates a user with their passkey.\n * Handles the full WebAuthn authentication flow.\n */\nexport async function authenticatePasskey(\n options: AuthenticateOptions,\n apiClient: ApiClient,\n eventEmitter: EventEmitter\n): Promise<Result<AuthenticateResult, TryMellonError>> {\n const extId = options.externalUserId ?? options.external_user_id;\n const hasUserId = extId !== undefined && typeof extId === 'string' && extId.trim() !== '';\n\n const result = await invokeCeremony<\n AuthStartResponse,\n AuthenticateResult,\n CredentialRequestOptions\n >({\n operation: 'authenticate',\n eventEmitter,\n start: () =>\n apiClient.startAuth(hasUserId ? { external_user_id: (extId as string).trim() } : {}),\n createOptions: (startResult) =>\n createAuthenticationOptions(startResult.challenge, options.mediation),\n invoke: async (ceremonyOptions) => {\n const opts = { ...ceremonyOptions, ...(options.signal && { signal: options.signal }) };\n return navigator.credentials.get(opts);\n },\n finish: async (startResult, credential) => {\n const finishResult = await apiClient.finishAuthentication({\n session_id: startResult.session_id,\n credential: serializeCredentialForAuth(credential),\n ...(options.successUrl && { success_url: options.successUrl }),\n });\n\n if (!finishResult.ok) return err(finishResult.error);\n\n return ok({\n authenticated: finishResult.value.authenticated,\n sessionToken: finishResult.value.session_token,\n user: {\n userId: finishResult.value.user.user_id,\n externalUserId: finishResult.value.user.external_user_id,\n email: finishResult.value.user.email,\n metadata: finishResult.value.user.metadata,\n },\n signals: finishResult.value.signals,\n ...(finishResult.value.redirect_url && { redirectUrl: finishResult.value.redirect_url }),\n });\n },\n });\n\n if (result.ok) {\n eventEmitter.emit('success', {\n type: 'success',\n operation: 'authenticate',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result;\n}\n","export async function waitWithAbort(\n intervalMs: number,\n signal?: AbortSignal\n): Promise<'aborted' | 'completed'> {\n // Fast path when no signal is provided: simple sleep.\n if (!signal) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n return 'completed';\n }\n\n if (signal.aborted) {\n return 'aborted';\n }\n\n return new Promise<'aborted' | 'completed'>((resolve) => {\n const onAbort = () => {\n cleanup();\n resolve('aborted');\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n signal.removeEventListener('abort', onAbort);\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve('completed');\n }, intervalMs);\n\n signal.addEventListener('abort', onAbort);\n });\n}\n","import type { ApiClient } from './api';\nimport type { Result } from '../utils/result';\nimport { err } from '../utils/result';\nimport { createError, mapWebAuthnError } from '../errors';\nimport type { TryMellonError } from '../errors';\nimport type { OnboardingStartOptions, OnboardingCompleteResult } from '../types';\nimport { createRegistrationOptions } from './webauthn';\nimport { serializeCredentialForRegister } from './webauthn-utils';\nimport { validateCredentialStructure } from '../utils/validation';\nimport type { OnboardingRegisterResponseWithChallenge } from './validators';\nimport { waitWithAbort } from './polling-utils';\n\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_POLL_ATTEMPTS = 60; // ~2 minutes\n\nexport class OnboardingManager {\n constructor(private readonly apiClient: ApiClient) {}\n\n /**\n * Executes the full onboarding flow in a single call.\n * 1. Starts onboarding\n * 2. Polls for 'pending_passkey' or 'completed' status\n * 3. If pending_passkey: when API returns challenge, registers passkey (WebAuthn) then completes onboarding\n * 4. If pending_passkey but API does not return challenge: returns NOT_SUPPORTED with onboarding_url for user to complete elsewhere\n */\n async startFlow(\n options: OnboardingStartOptions & { company_name?: string },\n signal?: AbortSignal\n ): Promise<Result<OnboardingCompleteResult, TryMellonError>> {\n const startResult = await this.apiClient.startOnboarding({ user_role: options.user_role });\n if (!startResult.ok) return err(startResult.error);\n\n const { session_id } = startResult.value;\n\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (signal?.aborted) {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n const waitResult = await waitWithAbort(POLL_INTERVAL_MS, signal);\n if (waitResult === 'aborted') {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n const statusResult = await this.apiClient.getOnboardingStatus(session_id);\n if (!statusResult.ok) return err(statusResult.error);\n\n const status = statusResult.value.status;\n const onboarding_url = statusResult.value.onboarding_url;\n\n if (status === 'pending_passkey') {\n const registerInfoResult = await this.apiClient.getOnboardingRegister(session_id);\n if (!registerInfoResult.ok) return err(registerInfoResult.error);\n\n const registerInfo = registerInfoResult.value as OnboardingRegisterResponseWithChallenge;\n\n if (!registerInfo.challenge) {\n return err(\n createError(\n 'NOT_SUPPORTED',\n 'Onboarding requires user action - complete passkey registration at the provided onboarding_url',\n { onboarding_url }\n )\n );\n }\n\n const creationOptionsResult = createRegistrationOptions(registerInfo.challenge);\n if (!creationOptionsResult.ok) return err(creationOptionsResult.error);\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.create(creationOptionsResult.value);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'create');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n let serializedCredential;\n try {\n serializedCredential = serializeCredentialForRegister(credential as PublicKeyCredential);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n const registerPasskeyResult = await this.apiClient.registerOnboardingPasskey(session_id, {\n credential: serializedCredential,\n challenge: registerInfo.challenge.challenge,\n });\n if (!registerPasskeyResult.ok) return err(registerPasskeyResult.error);\n\n const completeResult = await this.apiClient.completeOnboarding(session_id, {\n company_name: options.company_name,\n });\n return completeResult;\n }\n\n if (status === 'completed') {\n const completeResult = await this.apiClient.completeOnboarding(session_id, {\n company_name: options.company_name,\n });\n return completeResult;\n }\n }\n\n return err(createError('TIMEOUT', 'Onboarding timed out'));\n }\n}\n","import type { ApiClient } from './api';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport { createError, mapWebAuthnError } from '../errors';\nimport type { TryMellonError } from '../errors';\nimport type {\n CrossDeviceInitResult,\n CrossDeviceContextAuth,\n CrossDeviceContextRegistration,\n} from '../types';\nimport { createAuthenticationOptions, createRegistrationOptions } from './webauthn';\nimport { serializeCredentialForAuth, serializeCredentialForRegister } from './webauthn-utils';\nimport { validateCredentialStructure } from '../utils/validation';\nimport { waitWithAbort } from './polling-utils';\n\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_POLL_ATTEMPTS = 60; // ~2 minutes\n\nexport class CrossDeviceManager {\n constructor(private readonly apiClient: ApiClient) {}\n\n /**\n * Initializes a cross-device authentication session.\n * Typically called by the desktop side to get a QR code URL.\n */\n async init(): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n return this.apiClient.initCrossDeviceAuth();\n }\n\n /**\n * Initializes a cross-device registration session (create account via QR).\n * Typically called by the desktop side to get a QR code URL for new users.\n * Pass externalUserId for known users; omit for anonymous registration.\n */\n async initRegistration(options?: {\n externalUserId?: string;\n }): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n return this.apiClient.initCrossDeviceRegistration(options);\n }\n\n /**\n * High-level helper to poll for session status until it is completed.\n * Typically called by the desktop side after showing the QR code.\n * Pass pollingToken from init() result so the backend can verify the poller is the initiator.\n */\n async waitForSession(\n sessionId: string,\n signal?: AbortSignal,\n pollingToken?: string | null\n ): Promise<\n Result<{ session_token: string; user_id: string; redirectUrl?: string }, TryMellonError>\n > {\n if (signal?.aborted) {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n const statusResult = await this.apiClient.getCrossDeviceStatus(sessionId, pollingToken);\n if (!statusResult.ok) return err(statusResult.error);\n\n if (statusResult.value.status === 'completed') {\n if (!statusResult.value.session_token || !statusResult.value.user_id) {\n return err(createError('UNKNOWN_ERROR', 'Missing data in completed session'));\n }\n const redirectUrl =\n statusResult.value.redirect_url != null && statusResult.value.redirect_url !== ''\n ? statusResult.value.redirect_url\n : undefined;\n return ok({\n session_token: statusResult.value.session_token,\n user_id: statusResult.value.user_id,\n ...(redirectUrl !== undefined && { redirectUrl }),\n });\n }\n\n const waitResult = await waitWithAbort(POLL_INTERVAL_MS, signal);\n if (waitResult === 'aborted') {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n }\n\n return err(createError('TIMEOUT', 'Cross-device authentication timed out'));\n }\n\n /**\n * Approves a cross-device session.\n * Typically called by the mobile side after scanning a QR code.\n * Branches by context type: registration → credentials.create + verify-registration;\n * auth → credentials.get + verify.\n */\n async approve(sessionId: string): Promise<Result<void, TryMellonError>> {\n const contextResult = await this.apiClient.getCrossDeviceContext(sessionId);\n if (!contextResult.ok) return err(contextResult.error);\n\n const context = contextResult.value;\n\n if (context.type === 'registration') {\n return this.executeRegistrationApproval(sessionId, context);\n }\n return this.executeAuthApproval(sessionId, context);\n }\n\n /**\n * Executes the registration branch: create credential and verify-registration.\n */\n private async executeRegistrationApproval(\n sessionId: string,\n context: CrossDeviceContextRegistration\n ): Promise<Result<void, TryMellonError>> {\n const creationOptionsResult = createRegistrationOptions(context.options);\n if (!creationOptionsResult.ok) return err(creationOptionsResult.error);\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.create(creationOptionsResult.value);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'create');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n let serializedCredential;\n try {\n serializedCredential = serializeCredentialForRegister(credential as PublicKeyCredential);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n return this.apiClient.verifyCrossDeviceRegistration({\n session_id: sessionId,\n credential: serializedCredential,\n });\n }\n\n /**\n * Executes the auth branch: get credential and verify.\n */\n private async executeAuthApproval(\n sessionId: string,\n context: CrossDeviceContextAuth\n ): Promise<Result<void, TryMellonError>> {\n const requestOptionsResult = createAuthenticationOptions(context.options);\n if (!requestOptionsResult.ok) return err(requestOptionsResult.error);\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.get(requestOptionsResult.value);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'get');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n let serializedCredential;\n try {\n serializedCredential = serializeCredentialForAuth(credential as PublicKeyCredential);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n return this.apiClient.verifyCrossDeviceAuth({\n session_id: sessionId,\n credential: serializedCredential,\n });\n }\n}\n","import type { EventHandler, EventPayload, TryMellonEvent } from '../types';\n\nexport class EventEmitter {\n private handlers: Map<TryMellonEvent, Set<EventHandler>>;\n\n constructor() {\n this.handlers = new Map();\n }\n\n on(event: TryMellonEvent, handler: EventHandler): () => void {\n let handlersSet = this.handlers.get(event);\n if (!handlersSet) {\n handlersSet = new Set();\n this.handlers.set(event, handlersSet);\n }\n\n handlersSet.add(handler);\n\n return () => {\n this.off(event, handler);\n };\n }\n\n off(event: TryMellonEvent, handler: EventHandler): void {\n const handlersSet = this.handlers.get(event);\n if (!handlersSet) {\n return;\n }\n handlersSet.delete(handler);\n if (handlersSet.size === 0) {\n this.handlers.delete(event);\n }\n }\n\n emit(event: TryMellonEvent, payload: EventPayload): void {\n const handlersSet = this.handlers.get(event);\n if (handlersSet) {\n for (const handler of handlersSet) {\n try {\n handler(payload);\n } catch {\n // Silently ignore handler errors to prevent one handler from breaking others\n // Handler errors are the responsibility of the handler implementation\n }\n }\n }\n }\n\n removeAllListeners(): void {\n this.handlers.clear();\n }\n}\n","export const COSE_ALGORITHM_ES256 = -7;\nexport const COSE_ALGORITHM_RS256 = -257;\n\nexport const DEFAULT_API_BASE_URL = 'https://api.trymellonauth.com';\nexport const DEFAULT_TELEMETRY_ENDPOINT = 'https://api.trymellonauth.com/v1/telemetry';\nexport const DEFAULT_TIMEOUT_MS = 30000;\nexport const DEFAULT_MAX_RETRIES = 3;\nexport const DEFAULT_RETRY_DELAY_MS = 1000;\n\nexport const MIN_TIMEOUT_MS = 1000;\nexport const MAX_TIMEOUT_MS = 300000;\nexport const MIN_MAX_RETRIES = 0;\nexport const MAX_MAX_RETRIES = 10;\nexport const MIN_RETRY_DELAY_MS = 100;\nexport const MAX_RETRY_DELAY_MS = 10000;\n\n/**\n * Fixed session token returned by register() and authenticate() when sandbox mode is enabled.\n * Backends MUST NOT accept this token in production; only in development for testing the integration flow.\n */\nexport const SANDBOX_SESSION_TOKEN = 'trymellon_sandbox_session_token_v1';\n","import type { TelemetrySender, TelemetryPayload } from '../ports/telemetry';\n\n/**\n * Default telemetry sender: sends payload via sendBeacon (or fetch) to the given endpoint.\n * No retries; fire-and-forget.\n */\nexport function createDefaultTelemetrySender(endpoint: string): TelemetrySender {\n return {\n async send(payload: TelemetryPayload): Promise<void> {\n const body = JSON.stringify(payload);\n if (typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\n navigator.sendBeacon(endpoint, body);\n return;\n }\n if (typeof fetch !== 'undefined') {\n await fetch(endpoint, {\n method: 'POST',\n body,\n headers: { 'Content-Type': 'application/json' },\n keepalive: true,\n });\n }\n },\n };\n}\n","export type TelemetryEvent = 'register' | 'authenticate';\n\nexport type TelemetryPayload = {\n event: TelemetryEvent;\n latencyMs: number;\n ok: true;\n};\n\nexport interface TelemetrySender {\n send(payload: TelemetryPayload): Promise<void>;\n}\n\n/**\n * Builds the minimal telemetry payload (no PII).\n */\nexport function buildTelemetryPayload(event: TelemetryEvent, latencyMs: number): TelemetryPayload {\n return { event, latencyMs, ok: true };\n}\n","import type { ApiClient } from '../api';\nimport type { EventEmitter } from '../events';\nimport type {\n AuthenticateOptions,\n AuthenticateResult,\n RegisterOptions,\n RegisterResult,\n} from '../../types';\nimport type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { buildTelemetryPayload, type TelemetrySender } from '../ports/telemetry';\nimport { registerPasskey, authenticatePasskey } from '../webauthn';\n\ntype AuthOperation = 'register' | 'authenticate';\n\ntype AuthOptions = RegisterOptions | AuthenticateOptions;\n\nexport class AuthService {\n constructor(\n private readonly apiClient: ApiClient,\n private readonly eventEmitter: EventEmitter,\n private readonly sandbox: boolean,\n private readonly sandboxToken: string,\n private readonly telemetrySender?: TelemetrySender\n ) {}\n\n private async sandboxAuthResult(\n operation: AuthOperation,\n options: AuthOptions\n ): Promise<Result<RegisterResult | AuthenticateResult, TryMellonError>> {\n const externalUserId =\n 'externalUserId' in options\n ? (options.externalUserId ?? options.external_user_id ?? 'sandbox')\n : (options.external_user_id ?? options.externalUserId ?? 'sandbox');\n const externalId = typeof externalUserId === 'string' ? externalUserId : 'sandbox';\n\n if (operation === 'register') {\n return Promise.resolve(\n ok({\n success: true,\n credentialId: '',\n status: 'sandbox',\n sessionToken: this.sandboxToken,\n user: { userId: 'sandbox-user', externalUserId: externalId },\n })\n );\n }\n\n return Promise.resolve(\n ok({\n authenticated: true,\n sessionToken: this.sandboxToken,\n user: { userId: 'sandbox-user', externalUserId: externalId },\n })\n );\n }\n\n async register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>> {\n if (this.sandbox) {\n const result = await this.sandboxAuthResult('register', options);\n if (result.ok) {\n this.eventEmitter.emit('success', {\n type: 'success',\n operation: 'register',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result as Result<RegisterResult, TryMellonError>;\n }\n\n const start = Date.now();\n const result = await registerPasskey(options, this.apiClient, this.eventEmitter);\n if (result.ok && this.telemetrySender) {\n this.telemetrySender\n .send(buildTelemetryPayload('register', Date.now() - start))\n .catch(() => {});\n }\n return result;\n }\n\n async authenticate(\n options: AuthenticateOptions\n ): Promise<Result<AuthenticateResult, TryMellonError>> {\n if (this.sandbox) {\n const result = await this.sandboxAuthResult('authenticate', options);\n if (result.ok) {\n this.eventEmitter.emit('success', {\n type: 'success',\n operation: 'authenticate',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result as Result<AuthenticateResult, TryMellonError>;\n }\n\n const start = Date.now();\n const result = await authenticatePasskey(options, this.apiClient, this.eventEmitter);\n if (result.ok && this.telemetrySender) {\n this.telemetrySender\n .send(buildTelemetryPayload('authenticate', Date.now() - start))\n .catch(() => {});\n }\n return result;\n }\n}\n","import type { ApiClient } from './api';\nimport type { EventEmitter } from './events';\nimport type {\n RecoverAccountOptions,\n RecoverAccountResult,\n RecoveryVerifyResponse,\n RegisterStartResponse,\n} from '../types';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport type { TryMellonError } from '../errors';\nimport { createInvalidArgumentError } from '../errors';\nimport { serializeCredentialForRegister } from './webauthn-utils';\nimport { createRegistrationOptions } from './webauthn';\nimport { invokeCeremony } from './ceremony';\n\n/**\n * Recovers an account using an email OTP and creates a new passkey credential.\n * Manages the complete orchestrated WebAuthn registration flow for recovery.\n */\nexport async function recoverAccount(\n options: RecoverAccountOptions,\n apiClient: ApiClient,\n eventEmitter: EventEmitter\n): Promise<Result<RecoverAccountResult, TryMellonError>> {\n const extId = options.externalUserId ?? options.external_user_id;\n if (!extId || typeof extId !== 'string' || extId.trim() === '') {\n const error = createInvalidArgumentError('externalUserId', 'must be a non-empty string');\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n if (!options.otp || typeof options.otp !== 'string' || options.otp.trim().length !== 6) {\n const error = createInvalidArgumentError('otp', 'must be a 6-digit string');\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n const result = await invokeCeremony<\n RecoveryVerifyResponse,\n RecoverAccountResult,\n CredentialCreationOptions\n >({\n operation: 'register',\n eventEmitter,\n start: () => apiClient.verifyAccountRecoveryOtp(extId, options.otp),\n createOptions: (startResult) =>\n createRegistrationOptions(startResult.challenge as RegisterStartResponse['challenge']),\n invoke: async (ceremonyOptions) => navigator.credentials.create(ceremonyOptions),\n finish: async (startResult, credential) => {\n const finishResult = await apiClient.completeAccountRecovery(\n startResult.recovery_session_id,\n serializeCredentialForRegister(credential)\n );\n\n if (!finishResult.ok) return err(finishResult.error);\n\n const {\n credential_id,\n status,\n session_token,\n user: userPayload,\n redirect_url,\n } = finishResult.value;\n return ok({\n success: true,\n credentialId: credential_id,\n status,\n sessionToken: session_token,\n user: {\n userId: userPayload.user_id,\n externalUserId: userPayload.external_user_id,\n email: userPayload.email,\n metadata: userPayload.metadata,\n },\n ...(redirect_url !== undefined && { redirectUrl: redirect_url }),\n });\n },\n });\n\n if (result.ok) {\n eventEmitter.emit('success', {\n type: 'success',\n operation: 'register',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result;\n}\n","import type { ApiClient } from '../api';\nimport type { EventEmitter } from '../events';\nimport type { RecoverAccountOptions, RecoverAccountResult } from '../../types';\nimport type { Result } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { recoverAccount } from '../recover';\n\nexport class RecoveryService {\n constructor(\n private readonly apiClient: ApiClient,\n private readonly eventEmitter: EventEmitter\n ) {}\n\n recover(options: RecoverAccountOptions): Promise<Result<RecoverAccountResult, TryMellonError>> {\n return recoverAccount(options, this.apiClient, this.eventEmitter);\n }\n}\n","import { ApiClient } from './api';\nimport { FetchHttpClient } from './fetch-client';\nimport { OnboardingManager } from './onboarding-manager';\nimport { CrossDeviceManager } from './cross-device-manager';\nimport { EventEmitter } from './events';\nimport { isWebAuthnSupported, getClientStatus } from '../utils/support';\nimport { validateUrl, validateRange, createInvalidArgumentError } from '../errors';\nimport {\n DEFAULT_API_BASE_URL,\n DEFAULT_TIMEOUT_MS,\n DEFAULT_MAX_RETRIES,\n DEFAULT_RETRY_DELAY_MS,\n DEFAULT_TELEMETRY_ENDPOINT,\n MIN_TIMEOUT_MS,\n MAX_TIMEOUT_MS,\n MIN_MAX_RETRIES,\n MAX_MAX_RETRIES,\n MIN_RETRY_DELAY_MS,\n MAX_RETRY_DELAY_MS,\n SANDBOX_SESSION_TOKEN,\n} from './constants';\nimport { createDefaultTelemetrySender } from './adapters/telemetry-sender';\nimport type { TelemetrySender } from './ports/telemetry';\nimport type {\n TryMellonConfig,\n RegisterOptions,\n RegisterResult,\n AuthenticateOptions,\n AuthenticateResult,\n ClientStatus,\n TryMellonEvent,\n EventHandler,\n EmailFallbackStartOptions,\n EmailFallbackVerifyOptions,\n EmailFallbackVerifyResult,\n SessionValidateResponse,\n RecoverAccountOptions,\n} from '../types';\nimport { ok, err, type Result } from '../utils/result';\nimport { type TryMellonError, isTryMellonError } from '../errors';\nimport { AuthService } from './services/auth-service';\nimport { RecoveryService } from './services/recovery-service';\n\ndeclare const __VERSION__: string;\n\nexport class TryMellon {\n private readonly sandbox: boolean;\n private readonly sandboxToken: string;\n private apiClient: ApiClient;\n private eventEmitter: EventEmitter;\n private telemetrySender: TelemetrySender | undefined;\n private crossDeviceManager: CrossDeviceManager;\n private authService: AuthService;\n private recoveryService: RecoveryService;\n public onboarding: OnboardingManager;\n\n /**\n * Creates a new TryMellon instance.\n * Validates config and returns a Result.\n * @param config SDK configuration\n */\n static create(config: TryMellonConfig): Result<TryMellon, TryMellonError> {\n try {\n const appId = config.appId;\n const publishableKey = config.publishableKey;\n\n if (!appId || typeof appId !== 'string' || appId.trim() === '') {\n return err(createInvalidArgumentError('appId', 'must be a non-empty string'));\n }\n if (!publishableKey || typeof publishableKey !== 'string' || publishableKey.trim() === '') {\n return err(createInvalidArgumentError('publishableKey', 'must be a non-empty string'));\n }\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n validateUrl(apiBaseUrl, 'apiBaseUrl');\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n validateRange(timeoutMs, 'timeoutMs', MIN_TIMEOUT_MS, MAX_TIMEOUT_MS);\n\n if (config.maxRetries !== undefined) {\n validateRange(config.maxRetries, 'maxRetries', MIN_MAX_RETRIES, MAX_MAX_RETRIES);\n }\n\n if (config.retryDelayMs !== undefined) {\n validateRange(config.retryDelayMs, 'retryDelayMs', MIN_RETRY_DELAY_MS, MAX_RETRY_DELAY_MS);\n }\n\n // Safe to instantiate now\n return ok(new TryMellon(config));\n } catch (e) {\n if (isTryMellonError(e)) {\n return err(e);\n }\n return err(createInvalidArgumentError('config', (e as Error).message));\n }\n }\n\n /**\n * @deprecated Use `TryMellon.create(config)` instead to handle validation errors safely.\n * This constructor will throw errors if configuration is invalid.\n */\n constructor(config: TryMellonConfig) {\n this.sandbox = config.sandbox === true;\n this.sandboxToken =\n this.sandbox && config.sandboxToken != null && config.sandboxToken !== ''\n ? config.sandboxToken\n : SANDBOX_SESSION_TOKEN;\n\n const appId = config.appId;\n const publishableKey = config.publishableKey;\n\n // Legacy validation for direct constructor usage (still throws to maintain behavior for legacy code,\n // but create() handles this safely before calling constructor)\n if (!appId || typeof appId !== 'string' || appId.trim() === '') {\n throw createInvalidArgumentError('appId', 'must be a non-empty string');\n }\n if (!publishableKey || typeof publishableKey !== 'string' || publishableKey.trim() === '') {\n throw createInvalidArgumentError('publishableKey', 'must be a non-empty string');\n }\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n // validateUrl throws, which is expected for the constructor. create() catches it.\n validateUrl(apiBaseUrl, 'apiBaseUrl');\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n validateRange(timeoutMs, 'timeoutMs', MIN_TIMEOUT_MS, MAX_TIMEOUT_MS);\n\n if (config.maxRetries !== undefined) {\n validateRange(config.maxRetries, 'maxRetries', MIN_MAX_RETRIES, MAX_MAX_RETRIES);\n }\n\n if (config.retryDelayMs !== undefined) {\n validateRange(config.retryDelayMs, 'retryDelayMs', MIN_RETRY_DELAY_MS, MAX_RETRY_DELAY_MS);\n }\n\n const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n const retryDelayMs = config.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n const httpClient = new FetchHttpClient(timeoutMs, maxRetries, retryDelayMs, config.logger);\n\n const originHeader =\n config.origin ??\n (typeof window !== 'undefined' && window?.location?.origin\n ? window.location.origin\n : undefined);\n\n const defaultHeaders: Record<string, string> = {\n 'X-App-Id': appId.trim(),\n Authorization: `Bearer ${publishableKey.trim()}`,\n ...(originHeader && { Origin: originHeader }),\n };\n\n this.apiClient = new ApiClient(httpClient, apiBaseUrl, defaultHeaders);\n this.eventEmitter = new EventEmitter();\n\n if (config.enableTelemetry) {\n this.telemetrySender =\n config.telemetrySender ??\n createDefaultTelemetrySender(config.telemetryEndpoint ?? DEFAULT_TELEMETRY_ENDPOINT);\n }\n\n this.authService = new AuthService(\n this.apiClient,\n this.eventEmitter,\n this.sandbox,\n this.sandboxToken,\n this.telemetrySender\n );\n this.recoveryService = new RecoveryService(this.apiClient, this.eventEmitter);\n this.onboarding = new OnboardingManager(this.apiClient);\n this.crossDeviceManager = new CrossDeviceManager(this.apiClient);\n }\n\n static isSupported(): boolean {\n return isWebAuthnSupported();\n }\n\n async register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>> {\n return this.authService.register(options);\n }\n\n async authenticate(\n options: AuthenticateOptions\n ): Promise<Result<AuthenticateResult, TryMellonError>> {\n return this.authService.authenticate(options);\n }\n\n async validateSession(\n sessionToken: string\n ): Promise<Result<SessionValidateResponse, TryMellonError>> {\n if (this.sandbox && sessionToken === this.sandboxToken) {\n return Promise.resolve(\n ok({\n valid: true,\n user_id: 'sandbox-user',\n external_user_id: 'sandbox',\n tenant_id: 'sandbox-tenant',\n app_id: 'sandbox-app',\n })\n );\n }\n return this.apiClient.validateSession(sessionToken);\n }\n\n async getStatus(): Promise<ClientStatus> {\n return getClientStatus();\n }\n\n on(event: TryMellonEvent, handler: EventHandler): () => void {\n return this.eventEmitter.on(event, handler);\n }\n\n version(): string {\n return typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0';\n }\n\n fallback = {\n email: {\n start: async (options: EmailFallbackStartOptions): Promise<Result<void, TryMellonError>> => {\n return this.apiClient.startEmailFallback(options);\n },\n verify: async (\n options: EmailFallbackVerifyOptions\n ): Promise<Result<EmailFallbackVerifyResult, TryMellonError>> => {\n const result = await this.apiClient.verifyEmailCode({\n userId: options.userId,\n code: options.code,\n ...(options.successUrl && { successUrl: options.successUrl }),\n });\n if (!result.ok) return result;\n return ok({\n sessionToken: result.value.sessionToken,\n ...(result.value.redirectUrl && { redirectUrl: result.value.redirectUrl }),\n });\n },\n },\n };\n\n auth = {\n crossDevice: {\n init: () => this.crossDeviceManager.init(),\n initRegistration: (options?: { externalUserId?: string }) =>\n this.crossDeviceManager.initRegistration(options ?? {}),\n waitForSession: (sessionId: string, signal?: AbortSignal, pollingToken?: string | null) =>\n this.crossDeviceManager.waitForSession(sessionId, signal, pollingToken),\n getContext: (sessionId: string) => this.apiClient.getCrossDeviceContext(sessionId),\n approve: (sessionId: string) => this.crossDeviceManager.approve(sessionId),\n },\n recoverAccount: (options: RecoverAccountOptions) => this.recoveryService.recover(options),\n };\n}\n","/* eslint-disable no-console -- This adapter implements Logger by forwarding to console. */\nimport type { Logger } from '../ports/logger';\n\nexport class ConsoleLogger implements Logger {\n debug(message: string, meta?: Record<string, unknown>): void {\n if (meta && Object.keys(meta).length > 0) {\n console.debug(`[TryMellon] ${message}`, meta);\n } else {\n console.debug(`[TryMellon] ${message}`);\n }\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (meta && Object.keys(meta).length > 0) {\n console.info(`[TryMellon] ${message}`, meta);\n } else {\n console.info(`[TryMellon] ${message}`);\n }\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (meta && Object.keys(meta).length > 0) {\n console.warn(`[TryMellon] ${message}`, meta);\n } else {\n console.warn(`[TryMellon] ${message}`);\n }\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n if (meta && Object.keys(meta).length > 0) {\n console.error(`[TryMellon] ${message}`, meta);\n } else {\n console.error(`[TryMellon] ${message}`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/constants.ts","../src/utils/result.ts","../src/errors.ts","../src/core/validators/helpers.ts","../src/core/validators/register-auth.ts","../src/core/validators/session.ts","../src/core/validators/email.ts","../src/core/validators/onboarding.ts","../src/core/validators/cross-device.ts","../src/core/validators/recovery.ts","../src/core/validators/enrollment.ts","../src/core/validators/bridge.ts","../src/core/api.ts","../src/core/fetch-client.ts","../src/utils/base64url.ts","../src/core/webauthn-utils.ts","../src/utils/validation.ts","../src/utils/support.ts","../src/core/ceremony.ts","../src/core/webauthn.ts","../src/core/polling-utils.ts","../src/core/onboarding-manager.ts","../src/core/context-hash.ts","../src/core/enrollment-manager.ts","../src/core/cross-device-manager.ts","../src/core/bridge-manager.ts","../src/core/events.ts","../src/core/adapters/telemetry-sender.ts","../src/core/ports/telemetry.ts","../src/core/services/auth-service.ts","../src/core/recover.ts","../src/core/services/recovery-service.ts","../src/core/trymellon.ts","../src/core/adapters/console-logger.ts"],"names":["DEFAULT_API_BASE_URL","DEFAULT_TELEMETRY_ENDPOINT","SANDBOX_SESSION_TOKEN","BRIDGE_PATH_ENROLLMENT","BRIDGE_PATH_AUTH","ok","value","err","error","TryMellonError","_TryMellonError","code","message","details","DEFAULT_MESSAGES","createError","isTryMellonError","createNotSupportedError","createUserCancelledError","createNetworkError","cause","createTimeoutError","createInvalidArgumentError","field","reason","createCredentialError","operation","createEncodingError","type","validateUrl","url","fieldName","urlObj","validateRange","min","max","validateBase64Url","s","DOM_EXCEPTION_ERROR_MAP","mapBackendErrorCodeToTryMellon","backendCode","normalized","mapWebAuthnError","name","errorCode","isObject","isString","isNumber","isBoolean","isArray","validationError","required","obj","key","validateChallengeRP","rp","data","validateChallengeUser","user","validatePubKeyCredParams","params","item","validateRegisterStartShape","session_id","challenge","rpResult","userResult","challengeStr","pubKeyCredParamsResult","timeout","excludeCredentials","c","authenticatorSelection","validateUserEntity","userId","externalUserId","email","metadata","validateRegisterStartResponse","shape","validateAuthStartResponse","ch","rpId","allowCredentials","userVerification","validateRegisterFinishResponse","credential_id","status","session_token","redirect_url","validateAuthFinishResponse","authenticated","signals","validateSessionValidateResponse","valid","user_id","external_user_id","tenant_id","app_id","validateEmailVerifyResponse","raw","ONBOARDING_STATUSES","REGISTER_PASSKEY_STATUSES","validateOnboardingStartResponse","onboarding_url","expires_in","validateOnboardingStatusResponse","validateOnboardingRegisterResponse","parsedChallenge","chResult","validateOnboardingChallenge","pubKeyCredParams","validateOnboardingRegisterPasskeyResponse","validateOnboardingCompleteResponse","validateCrossDeviceVerifyResponse","isCreationOptionsShape","opts","o","isRequestOptionsShape","validateCrossDeviceInitResponse","payload","qr_url","expires_at","polling_token","result","validateCrossDeviceStatusResponse","validateCrossDeviceContextResponse","rawType","options","MAX_CONTEXT_LENGTH","approval_context","optionalContextString","application_name","extra","maxLength","validateRecoveryVerifyResponse","recovery_session_id","validateRecoveryCompleteResponse","userObj","validateEnrollmentStartResponse","validateEnrollmentUser","validateEnrollmentFinishResponse","BRIDGE_STATUS_VALUES","validateBridgeContextResponse","typeVal","validateBridgeVerifyResponse","registration_options","authentication_options","validateBridgeCompleteEnrollmentResponse","entity_id","validateBridgeCompleteAuthResponse","validateBridgeStatusResponse","ts","ApiClient","httpClient","baseUrl","defaultHeaders","path","body","validate","extraHeaders","headers","request","sessionToken","sessionId","trimmed","pollingToken","otp","recoverySessionId","credential","ticketId","contextHash","kind","pin","isEnvelopeSuccess","isEnvelopeError","parseHttpErrorBody","errorData","statusText","errObj","rawCode","generateRequestId","getRetryDelayMs","attempt","baseMs","delay","shouldRetryOnStatus","method","FetchHttpClient","timeoutMs","maxRetries","retryDelayMs","logger","config","requestId","lastError","controller","timeoutId","response","errResult","resolve","base64UrlEncode","buf","bytes","binary","b","base64UrlDecode","base64","padding","padded","base64UrlDecodeToArrayBuffer","isValidCredentialResponse","serializeCredentialForRegister","clientDataJSON","attestationObject","serializeCredentialForAuth","authenticatorData","signature","userHandle","validateCredentialStructure","isWebAuthnSupported","isPlatformAuthenticatorAvailable","getClientStatus","isPasskeySupported","platformAuthenticatorAvailable","invokeCeremony","context","eventEmitter","start","createOptions","invoke","finish","startResult","optionsResult","e","finishResult","tryMellonError","createRegistrationOptions","serverChallengePayload","authenticatorType","challengeBuffer","userIdBuffer","publicKey","cred","createAndSerializeCredentialForRegister","signal","creationOptionsResult","creationOptions","createAuthenticationOptions","mediation","registerPasskey","apiClient","extId","ceremonyOptions","authenticatePasskey","hasUserId","waitWithAbort","intervalMs","onAbort","cleanup","POLL_INTERVAL_MS","MAX_POLL_ATTEMPTS","OnboardingManager","statusResult","registerInfoResult","registerInfo","serializedCredential","registerPasskeyResult","CONTEXT_HASH_KEY","CONTEXT_HASH_HEX_REGEX","isValidContextHash","generateContextHash","createInMemoryStorage","_","v","inMemoryStorageFallback","getOrCreateInStorage","storage","existing","hash","getOrCreateContextHash","effectiveStorage","EnrollmentManager","credentialResult","CrossDeviceManager","redirectUrl","contextResult","requestOptionsResult","BRIDGE_TERMINAL_STATUSES","BRIDGE_POLL_INTERVAL_MS","BRIDGE_WAIT_DEFAULT_TIMEOUT_MS","isTerminalBridgeStatus","validateBridgeSessionId","toBridgeEnrollmentResult","apiResult","toBridgeAuthResult","resolvePinAndVerify","BridgeManager","sid","useSse","pollUntilTerminal","startAt","r","resolved","onDone","es","event","parsed","challengeResult","challengeResponse","expectedKind","registrationOptions","serialized","completeResult","authOptions","requestOptions","authCredential","serializedAuth","completeAuthResult","EventEmitter","handler","handlersSet","createDefaultTelemetrySender","endpoint","buildTelemetryPayload","latencyMs","AuthService","sandbox","sandboxToken","telemetrySender","externalId","recoverAccount","userPayload","RecoveryService","TryMellon","_TryMellon","appId","publishableKey","apiBaseUrl","originHeader","log","fn","meta","ConsoleLogger"],"mappings":"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","file":"index.js","sourcesContent":["export const COSE_ALGORITHM_ES256 = -7;\nexport const COSE_ALGORITHM_RS256 = -257;\n\nexport const DEFAULT_API_BASE_URL = 'https://api.trymellonauth.com';\nexport const DEFAULT_TELEMETRY_ENDPOINT = 'https://api.trymellonauth.com/v1/telemetry';\nexport const DEFAULT_TIMEOUT_MS = 30000;\nexport const DEFAULT_MAX_RETRIES = 3;\nexport const DEFAULT_RETRY_DELAY_MS = 1000;\n\nexport const MIN_TIMEOUT_MS = 1000;\nexport const MAX_TIMEOUT_MS = 300000;\nexport const MIN_MAX_RETRIES = 0;\nexport const MAX_MAX_RETRIES = 10;\nexport const MIN_RETRY_DELAY_MS = 100;\nexport const MAX_RETRY_DELAY_MS = 10000;\n\n/** Cap for exponential backoff delay (single request retry loop). */\nexport const RETRY_DELAY_CAP_MS = 30_000;\n\n/**\n * Fixed session token returned by register() and authenticate() when sandbox mode is enabled.\n * Backends MUST NOT accept this token in production; only in development for testing the integration flow.\n */\nexport const SANDBOX_SESSION_TOKEN = 'trymellon_sandbox_session_token_v1';\n\n/** API path prefix for enrollment-bridge (KP-BRIDGE-04). Single source of truth. */\nexport const BRIDGE_PATH_ENROLLMENT = '/v1/enrollment-bridge';\n\n/** API path prefix for auth-bridge (KP-BRIDGE-04). Single source of truth. */\nexport const BRIDGE_PATH_AUTH = '/v1/auth-bridge';\n","export type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };\n\nexport const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });\nexport const err = <E>(error: E): Result<never, E> => ({ ok: false, error });\n\nexport function map<T, E, U>(result: Result<T, E>, mapper: (value: T) => U): Result<U, E> {\n if (result.ok) {\n return ok(mapper(result.value));\n }\n return result;\n}\n\nexport function mapErr<T, E, F>(result: Result<T, E>, mapper: (error: E) => F): Result<T, F> {\n if (!result.ok) {\n return err(mapper(result.error));\n }\n return result;\n}\n\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n","export type TryMellonErrorCode =\n | 'NOT_SUPPORTED'\n | 'USER_CANCELLED'\n | 'PASSKEY_NOT_FOUND'\n | 'SESSION_EXPIRED'\n | 'NETWORK_FAILURE'\n | 'INVALID_ARGUMENT'\n | 'TIMEOUT'\n | 'ABORTED'\n | 'ABORT_ERROR'\n | 'CHALLENGE_MISMATCH'\n | 'TICKET_NOT_FOUND'\n | 'TICKET_EXPIRED'\n | 'TICKET_ALREADY_USED'\n | 'PIN_MISMATCH'\n | 'PIN_LOCKED'\n | 'BRIDGE_SESSION_EXPIRED'\n | 'UNKNOWN_ERROR';\n\nexport class TryMellonError extends Error {\n readonly code: TryMellonErrorCode;\n readonly details?: unknown;\n readonly isTryMellonError = true;\n\n constructor(code: TryMellonErrorCode, message: string, details?: unknown) {\n super(message);\n this.name = 'TryMellonError';\n this.code = code;\n this.details = details;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TryMellonError);\n }\n }\n}\n\nconst DEFAULT_MESSAGES: Record<TryMellonErrorCode, string> = {\n NOT_SUPPORTED: 'WebAuthn is not supported in this environment',\n USER_CANCELLED: 'User cancelled the operation',\n PASSKEY_NOT_FOUND: 'Passkey not found',\n SESSION_EXPIRED: 'Session has expired',\n NETWORK_FAILURE: 'Network request failed',\n INVALID_ARGUMENT: 'Invalid argument provided',\n TIMEOUT: 'Operation timed out',\n ABORTED: 'Operation was aborted',\n ABORT_ERROR: 'Operation aborted by user or timeout',\n CHALLENGE_MISMATCH: 'This link was already used or expired. Please try again from your computer.',\n TICKET_NOT_FOUND: 'Enrollment ticket not found or invalid',\n TICKET_EXPIRED: 'Enrollment ticket has expired',\n TICKET_ALREADY_USED: 'Enrollment ticket was already used',\n PIN_MISMATCH: 'PIN does not match',\n PIN_LOCKED: 'PIN is locked due to too many failed attempts',\n BRIDGE_SESSION_EXPIRED: 'Bridge session has expired',\n UNKNOWN_ERROR: 'An unknown error occurred',\n};\n\nexport function createError(\n code: TryMellonErrorCode,\n message?: string,\n details?: unknown\n): TryMellonError {\n return new TryMellonError(code, message ?? DEFAULT_MESSAGES[code], details);\n}\n\nexport function isTryMellonError(error: unknown): error is TryMellonError {\n return (\n error instanceof TryMellonError ||\n (typeof error === 'object' &&\n error !== null &&\n 'isTryMellonError' in error &&\n (error as TryMellonError).isTryMellonError === true)\n );\n}\n\nexport function createNotSupportedError(): TryMellonError {\n return createError('NOT_SUPPORTED');\n}\n\nexport function createUserCancelledError(): TryMellonError {\n return createError('USER_CANCELLED');\n}\n\nexport function createTicketNotFoundError(): TryMellonError {\n return createError('TICKET_NOT_FOUND');\n}\n\nexport function createTicketExpiredError(): TryMellonError {\n return createError('TICKET_EXPIRED');\n}\n\nexport function createNetworkError(cause?: Error): TryMellonError {\n return createError('NETWORK_FAILURE', undefined, {\n cause: cause?.message,\n originalError: cause,\n });\n}\n\nexport function createTimeoutError(): TryMellonError {\n return createError('TIMEOUT');\n}\n\nexport function createInvalidArgumentError(field: string, reason: string): TryMellonError {\n return createError('INVALID_ARGUMENT', `Invalid argument: ${field} - ${reason}`, {\n field,\n reason,\n });\n}\n\nexport function createCredentialError(operation: 'create' | 'get'): TryMellonError {\n return createError('UNKNOWN_ERROR', `Failed to ${operation} credential`, { operation });\n}\n\nexport function createEncodingError(type: 'encode' | 'decode'): TryMellonError {\n return createError(\n 'NOT_SUPPORTED',\n `No base64 ${type === 'encode' ? 'encoding' : 'decoding'} available`,\n { type }\n );\n}\n\nexport function validateNonEmptyString(value: unknown, fieldName: string): asserts value is string {\n if (!value || typeof value !== 'string' || value.trim() === '') {\n throw createInvalidArgumentError(fieldName, 'must be a non-empty string');\n }\n}\n\nexport function validateUrl(url: string, fieldName: string): void {\n try {\n const urlObj = new URL(url);\n if (urlObj.protocol !== 'https:' && urlObj.protocol !== 'http:') {\n throw createInvalidArgumentError(fieldName, 'must use http or https protocol');\n }\n } catch (error) {\n if (isTryMellonError(error)) {\n throw error;\n }\n throw createInvalidArgumentError(fieldName, 'must be a valid URL');\n }\n}\n\nexport function validateRange(value: number, fieldName: string, min: number, max: number): void {\n if (!Number.isFinite(value)) {\n throw createInvalidArgumentError(fieldName, 'must be a finite number');\n }\n if (value < min || value > max) {\n throw createInvalidArgumentError(fieldName, `must be between ${min} and ${max}`);\n }\n}\n\nexport function validateBase64Url(s: string, fieldName: string): void {\n if (typeof s !== 'string' || s.length === 0) {\n throw createInvalidArgumentError(fieldName, 'must be a non-empty string');\n }\n if (!/^[A-Za-z0-9_-]+$/.test(s)) {\n throw createInvalidArgumentError(fieldName, 'must be a valid base64url string');\n }\n}\n\nconst DOM_EXCEPTION_ERROR_MAP: Record<string, TryMellonErrorCode> = {\n NotAllowedError: 'USER_CANCELLED',\n AbortError: 'ABORTED',\n NotSupportedError: 'NOT_SUPPORTED',\n SecurityError: 'NOT_SUPPORTED',\n InvalidStateError: 'UNKNOWN_ERROR',\n UnknownError: 'UNKNOWN_ERROR',\n};\n\n/**\n * Maps backend API error codes (fintech envelope) to TryMellonErrorCode.\n * Pure, testable. Unknown codes map to UNKNOWN_ERROR.\n * Defensive: non-string input returns UNKNOWN_ERROR (no throw).\n * Backend may send UPPERCASE (e.g. NOT_FOUND, EXPIRED) or snake_case (ticket_not_found); both normalized.\n */\nexport function mapBackendErrorCodeToTryMellon(backendCode: string): TryMellonErrorCode {\n if (typeof backendCode !== 'string') return 'UNKNOWN_ERROR';\n const normalized = backendCode.toLowerCase().trim();\n const map: Record<string, TryMellonErrorCode> = {\n challenge_mismatch: 'CHALLENGE_MISMATCH',\n session_expired: 'SESSION_EXPIRED',\n unauthorized: 'SESSION_EXPIRED',\n validation_error: 'INVALID_ARGUMENT',\n invalid_argument: 'INVALID_ARGUMENT',\n user_not_found: 'SESSION_EXPIRED',\n passkey_not_found: 'PASSKEY_NOT_FOUND',\n ticket_not_found: 'TICKET_NOT_FOUND',\n ticket_expired: 'TICKET_EXPIRED',\n ticket_already_consumed: 'TICKET_ALREADY_USED',\n // Backend enrollment domain codes (UPPERCASE → normalized)\n not_found: 'TICKET_NOT_FOUND',\n expired: 'TICKET_EXPIRED',\n already_consumed: 'TICKET_ALREADY_USED',\n context_mismatch: 'CHALLENGE_MISMATCH',\n challenge_not_found: 'CHALLENGE_MISMATCH',\n invalid_ticket_id: 'INVALID_ARGUMENT',\n invalid_context_hash: 'INVALID_ARGUMENT',\n invalid_ticket_status: 'INVALID_ARGUMENT',\n invalid_config: 'INVALID_ARGUMENT',\n enrollment_not_enabled: 'INVALID_ARGUMENT',\n // Bridge (KP-BRIDGE)\n pin_mismatch: 'PIN_MISMATCH',\n pin_locked: 'PIN_LOCKED',\n bridge_not_enabled: 'UNKNOWN_ERROR',\n bridge_session_expired: 'BRIDGE_SESSION_EXPIRED',\n session_not_found: 'BRIDGE_SESSION_EXPIRED',\n };\n return map[normalized] ?? 'UNKNOWN_ERROR';\n}\n\nexport function mapWebAuthnError(error: unknown): TryMellonError {\n if (error instanceof DOMException) {\n const name = error.name;\n const message = error.message || 'WebAuthn operation failed';\n const errorCode = DOM_EXCEPTION_ERROR_MAP[name] ?? 'UNKNOWN_ERROR';\n return createError(errorCode, message, { originalError: error });\n }\n\n if (error instanceof Error) {\n return createError('UNKNOWN_ERROR', error.message, { originalError: error });\n }\n\n return createError('UNKNOWN_ERROR', 'An unknown error occurred', {\n originalError: error,\n });\n}\n","import { err, ok, type Result } from '../../utils/result';\nimport { createError, type TryMellonError } from '../../errors';\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\nexport function validationError(\n message: string,\n details?: { field?: string; expected?: string; originalData?: unknown }\n): Result<never, TryMellonError> {\n return err(\n createError('UNKNOWN_ERROR', message, {\n ...details,\n originalData: details?.originalData,\n })\n );\n}\n\nexport function required(obj: Record<string, unknown>, key: string): unknown {\n return obj[key];\n}\n\nexport function optionalString(obj: Record<string, unknown>, key: string): string | undefined {\n const v = obj[key];\n return v === undefined ? undefined : typeof v === 'string' ? v : undefined;\n}\n\n// DRY Helpers for common TryMellon objects\n\nexport function validateChallengeRP(rp: unknown, data: unknown): Result<true, TryMellonError> {\n if (!isObject(rp) || !isString(rp.name) || !isString(rp.id)) {\n return validationError('Invalid API response: challenge.rp must have name and id strings', {\n originalData: data,\n });\n }\n return ok(true);\n}\n\nexport function validateChallengeUser(user: unknown, data: unknown): Result<true, TryMellonError> {\n if (\n !isObject(user) ||\n !isString(user.id) ||\n !isString(user.name) ||\n !isString(user.displayName)\n ) {\n return validationError(\n 'Invalid API response: challenge.user must have id, name, displayName strings',\n { originalData: data }\n );\n }\n return ok(true);\n}\n\nexport function validatePubKeyCredParams(\n params: unknown,\n data: unknown\n): Result<true, TryMellonError> {\n if (!isArray(params)) {\n return validationError('Invalid API response: challenge.pubKeyCredParams must be array', {\n originalData: data,\n });\n }\n for (const item of params) {\n if (!isObject(item) || item.type !== 'public-key' || !isNumber(item.alg)) {\n return validationError(\n 'Invalid API response: pubKeyCredParams items must have type and alg',\n { originalData: data }\n );\n }\n }\n return ok(true);\n}\n\n/**\n * Parsed shape of a \"register start\" challenge (shared by register and enrollment validators).\n * Single source of truth for the validation sequence; avoids duplicating challenge validation.\n */\nexport interface ParsedRegisterChallengeShape {\n rp: { name: string; id: string };\n user: { id: string; name: string; displayName: string };\n challenge: string;\n pubKeyCredParams: Array<{ type: string; alg: number }>;\n timeout?: number;\n excludeCredentials?: Array<{ type: string; id: string }>;\n authenticatorSelection?: Record<string, unknown>;\n}\n\n/**\n * Pure, stateless validation of \"start response with register challenge\".\n * Used by validateRegisterStartResponse and validateEnrollmentStartResponse (DRY).\n */\nexport function validateRegisterStartShape(\n data: unknown\n): Result<{ session_id: string; challenge: ParsedRegisterChallengeShape }, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n\n const challenge = required(data, 'challenge');\n if (!isObject(challenge)) {\n return validationError('Invalid API response: challenge must be object', {\n field: 'challenge',\n originalData: data,\n });\n }\n\n const rpResult = validateChallengeRP(required(challenge, 'rp'), data);\n if (!rpResult.ok) return rpResult;\n\n const userResult = validateChallengeUser(required(challenge, 'user'), data);\n if (!userResult.ok) return userResult;\n\n const challengeStr = required(challenge, 'challenge');\n if (!isString(challengeStr)) {\n return validationError('Invalid API response: challenge.challenge must be string', {\n originalData: data,\n });\n }\n\n const pubKeyCredParamsResult = validatePubKeyCredParams(\n required(challenge, 'pubKeyCredParams'),\n data\n );\n if (!pubKeyCredParamsResult.ok) return pubKeyCredParamsResult;\n\n const timeout = challenge.timeout;\n if (timeout !== undefined && !isNumber(timeout)) {\n return validationError('Invalid API response: challenge.timeout must be number', {\n originalData: data,\n });\n }\n\n const excludeCredentials = challenge.excludeCredentials;\n if (excludeCredentials !== undefined) {\n if (!isArray(excludeCredentials)) {\n return validationError('Invalid API response: excludeCredentials must be array', {\n originalData: data,\n });\n }\n for (const c of excludeCredentials) {\n if (\n !isObject(c) ||\n (c as Record<string, unknown>).type !== 'public-key' ||\n !isString((c as Record<string, unknown>).id)\n ) {\n return validationError(\n 'Invalid API response: excludeCredentials items must have id and type',\n { originalData: data }\n );\n }\n }\n }\n\n const authenticatorSelection = challenge.authenticatorSelection;\n if (authenticatorSelection !== undefined && !isObject(authenticatorSelection)) {\n return validationError('Invalid API response: authenticatorSelection must be object', {\n originalData: data,\n });\n }\n\n return ok({\n session_id,\n challenge: {\n rp: challenge.rp as ParsedRegisterChallengeShape['rp'],\n user: challenge.user as ParsedRegisterChallengeShape['user'],\n challenge: challengeStr,\n pubKeyCredParams:\n challenge.pubKeyCredParams as ParsedRegisterChallengeShape['pubKeyCredParams'],\n ...(timeout !== undefined && { timeout }),\n ...(excludeCredentials !== undefined && {\n excludeCredentials:\n excludeCredentials as ParsedRegisterChallengeShape['excludeCredentials'],\n }),\n ...(authenticatorSelection !== undefined && {\n authenticatorSelection,\n }),\n },\n });\n}\n\nexport function validateUserEntity(\n user: unknown,\n data: unknown\n): Result<\n { user_id: string; external_user_id: string; email?: string; metadata?: Record<string, unknown> },\n TryMellonError\n> {\n if (!isObject(user)) {\n return validationError('Invalid API response: user must be object', {\n field: 'user',\n originalData: data,\n });\n }\n\n const userId = required(user, 'user_id');\n const externalUserId = required(user, 'external_user_id');\n if (!isString(userId) || !isString(externalUserId)) {\n return validationError(\n 'Invalid API response: user must have user_id and external_user_id strings',\n { originalData: data }\n );\n }\n\n const email = user.email;\n const metadata = user.metadata;\n if (email !== undefined && !isString(email)) {\n return validationError('Invalid API response: user.email must be string', {\n originalData: data,\n });\n }\n if (metadata !== undefined && (typeof metadata !== 'object' || metadata === null)) {\n return validationError('Invalid API response: user.metadata must be object', {\n originalData: data,\n });\n }\n\n return ok({\n user_id: userId,\n external_user_id: externalUserId,\n ...(email !== undefined && { email }),\n ...(metadata !== undefined && { metadata: metadata as Record<string, unknown> }),\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok, err } from '../../utils/result';\nimport type {\n RegisterStartResponse,\n AuthStartResponse,\n RegisterFinishResponse,\n AuthFinishResponse,\n} from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport {\n isObject,\n isString,\n isNumber,\n isBoolean,\n isArray,\n validationError,\n required,\n validateRegisterStartShape,\n validateUserEntity,\n} from './helpers';\n\nexport function validateRegisterStartResponse(\n data: unknown\n): Result<RegisterStartResponse, TryMellonError> {\n const shape = validateRegisterStartShape(data);\n if (!shape.ok) return shape;\n return ok({\n session_id: shape.value.session_id,\n challenge: shape.value.challenge as RegisterStartResponse['challenge'],\n });\n}\n\nexport function validateAuthStartResponse(\n data: unknown\n): Result<AuthStartResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n\n const challenge = required(data, 'challenge');\n if (!isObject(challenge)) {\n return validationError('Invalid API response: challenge must be object', {\n field: 'challenge',\n originalData: data,\n });\n }\n\n const ch = required(challenge, 'challenge');\n const rpId = required(challenge, 'rpId');\n const allowCredentials = challenge.allowCredentials;\n if (!isString(ch)) {\n return validationError('Invalid API response: challenge.challenge must be string', {\n originalData: data,\n });\n }\n if (!isString(rpId)) {\n return validationError('Invalid API response: challenge.rpId must be string', {\n originalData: data,\n });\n }\n if (allowCredentials !== undefined && !isArray(allowCredentials)) {\n return validationError('Invalid API response: allowCredentials must be array', {\n originalData: data,\n });\n }\n if (allowCredentials) {\n for (const c of allowCredentials) {\n if (\n !isObject(c) ||\n (c as Record<string, unknown>).type !== 'public-key' ||\n !isString((c as Record<string, unknown>).id)\n ) {\n return validationError(\n 'Invalid API response: allowCredentials items must have id and type',\n {\n originalData: data,\n }\n );\n }\n }\n }\n\n const timeout = challenge.timeout;\n if (timeout !== undefined && !isNumber(timeout)) {\n return validationError('Invalid API response: challenge.timeout must be number', {\n originalData: data,\n });\n }\n\n const userVerification = challenge.userVerification;\n if (\n userVerification !== undefined &&\n !['required', 'preferred', 'discouraged'].includes(String(userVerification))\n ) {\n return validationError(\n 'Invalid API response: userVerification must be required|preferred|discouraged',\n {\n originalData: data,\n }\n );\n }\n\n return ok({\n session_id,\n challenge: {\n challenge: ch,\n rpId,\n allowCredentials:\n (allowCredentials as AuthStartResponse['challenge']['allowCredentials']) ?? [],\n ...(timeout !== undefined && { timeout }),\n ...(userVerification !== undefined && {\n userVerification: userVerification as AuthStartResponse['challenge']['userVerification'],\n }),\n },\n });\n}\n\nexport function validateRegisterFinishResponse(\n data: unknown\n): Result<RegisterFinishResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const credential_id = required(data, 'credential_id');\n const status = required(data, 'status');\n const session_token = required(data, 'session_token');\n const user = required(data, 'user');\n\n if (!isString(credential_id)) {\n return validationError('Invalid API response: credential_id must be string', {\n field: 'credential_id',\n originalData: data,\n });\n }\n if (!isString(status)) {\n return validationError('Invalid API response: status must be string', {\n field: 'status',\n originalData: data,\n });\n }\n if (!isString(session_token)) {\n return validationError('Invalid API response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n const userResult = validateUserEntity(user, data);\n if (!userResult.ok) return err(userResult.error);\n\n const redirect_url = data.redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n originalData: data,\n });\n }\n\n return ok({\n credential_id,\n status,\n session_token,\n user: userResult.value,\n ...(redirect_url !== undefined && { redirect_url }),\n });\n}\n\nexport function validateAuthFinishResponse(\n data: unknown\n): Result<AuthFinishResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const authenticated = required(data, 'authenticated');\n const session_token = required(data, 'session_token');\n const user = required(data, 'user');\n const signals = required(data, 'signals');\n\n if (!isBoolean(authenticated)) {\n return validationError('Invalid API response: authenticated must be boolean', {\n field: 'authenticated',\n originalData: data,\n });\n }\n if (!isString(session_token)) {\n return validationError('Invalid API response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n const userResult = validateUserEntity(user, data);\n if (!userResult.ok) return err(userResult.error);\n\n if (signals !== undefined && !isObject(signals)) {\n return validationError('Invalid API response: signals must be object', {\n originalData: data,\n });\n }\n\n const redirect_url = data.redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n originalData: data,\n });\n }\n\n return ok({\n authenticated,\n session_token,\n user: userResult.value,\n signals: signals as AuthFinishResponse['signals'],\n ...(redirect_url !== undefined && { redirect_url }),\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { SessionValidateResponse } from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, isBoolean, required, validationError } from './helpers';\n\nexport function validateSessionValidateResponse(\n data: unknown\n): Result<SessionValidateResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const valid = required(data, 'valid');\n const user_id = required(data, 'user_id');\n const external_user_id = required(data, 'external_user_id');\n const tenant_id = required(data, 'tenant_id');\n const app_id = required(data, 'app_id');\n\n if (!isBoolean(valid)) {\n return validationError('Invalid API response: valid must be boolean', {\n field: 'valid',\n originalData: data,\n });\n }\n if (!isString(user_id)) {\n return validationError('Invalid API response: user_id must be string', {\n field: 'user_id',\n originalData: data,\n });\n }\n if (!isString(external_user_id)) {\n return validationError('Invalid API response: external_user_id must be string', {\n field: 'external_user_id',\n originalData: data,\n });\n }\n if (!isString(tenant_id)) {\n return validationError('Invalid API response: tenant_id must be string', {\n field: 'tenant_id',\n originalData: data,\n });\n }\n if (!isString(app_id)) {\n return validationError('Invalid API response: app_id must be string', {\n field: 'app_id',\n originalData: data,\n });\n }\n\n return ok({\n valid,\n userId: user_id,\n externalUserId: external_user_id,\n tenantId: tenant_id,\n appId: app_id,\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, validationError } from './helpers';\n\nexport function validateEmailVerifyResponse(\n data: unknown\n): Result<{ sessionToken: string; redirectUrl?: string }, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const raw =\n (data as Record<string, unknown>).session_token ??\n (data as Record<string, unknown>).sessionToken;\n if (!isString(raw)) {\n return validationError('Invalid API response: session_token/sessionToken must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n\n const redirect_url = (data as Record<string, unknown>).redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n originalData: data,\n });\n }\n\n return ok({\n sessionToken: raw,\n ...(redirect_url !== undefined && { redirectUrl: redirect_url }),\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type {\n OnboardingStartResponse,\n OnboardingStatusResponse,\n OnboardingRegisterResponse,\n OnboardingRegisterPasskeyResponse,\n OnboardingCompleteResponse,\n RegisterStartResponse,\n} from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, isNumber, isArray, required, validationError } from './helpers';\n\nconst ONBOARDING_STATUSES = ['pending_passkey', 'pending_data', 'completed'] as const;\nconst REGISTER_PASSKEY_STATUSES = ['pending_data', 'completed'] as const;\n\nexport function validateOnboardingStartResponse(\n data: unknown\n): Result<OnboardingStartResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const onboarding_url = required(data, 'onboarding_url');\n const expires_in = required(data, 'expires_in');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n if (!isString(onboarding_url)) {\n return validationError('Invalid API response: onboarding_url must be string', {\n field: 'onboarding_url',\n originalData: data,\n });\n }\n if (!isNumber(expires_in)) {\n return validationError('Invalid API response: expires_in must be number', {\n field: 'expires_in',\n originalData: data,\n });\n }\n\n return ok({ session_id, onboarding_url, expires_in });\n}\n\nexport function validateOnboardingStatusResponse(\n data: unknown\n): Result<OnboardingStatusResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const status = required(data, 'status');\n const onboarding_url = required(data, 'onboarding_url');\n const expires_in = required(data, 'expires_in');\n\n if (\n !isString(status) ||\n !ONBOARDING_STATUSES.includes(status as (typeof ONBOARDING_STATUSES)[number])\n ) {\n return validationError(\n 'Invalid API response: status must be pending_passkey|pending_data|completed',\n {\n field: 'status',\n originalData: data,\n }\n );\n }\n if (!isString(onboarding_url)) {\n return validationError('Invalid API response: onboarding_url must be string', {\n originalData: data,\n });\n }\n if (!isNumber(expires_in)) {\n return validationError('Invalid API response: expires_in must be number', {\n originalData: data,\n });\n }\n\n return ok({\n status: status as OnboardingStatusResponse['status'],\n onboarding_url,\n expires_in,\n });\n}\n\n/** Response may include optional challenge for same-device passkey registration */\nexport type OnboardingRegisterResponseWithChallenge = OnboardingRegisterResponse & {\n challenge?: RegisterStartResponse['challenge'];\n};\n\nexport function validateOnboardingRegisterResponse(\n data: unknown\n): Result<OnboardingRegisterResponseWithChallenge, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const status = required(data, 'status');\n const onboarding_url = required(data, 'onboarding_url');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n field: 'session_id',\n originalData: data,\n });\n }\n if (status !== 'pending_passkey') {\n return validationError('Invalid API response: status must be pending_passkey', {\n field: 'status',\n originalData: data,\n });\n }\n if (!isString(onboarding_url)) {\n return validationError('Invalid API response: onboarding_url must be string', {\n originalData: data,\n });\n }\n\n const challenge = data.challenge;\n let parsedChallenge: RegisterStartResponse['challenge'] | undefined;\n if (challenge !== undefined) {\n const chResult = validateOnboardingChallenge(challenge);\n if (!chResult.ok) return chResult;\n parsedChallenge = chResult.value;\n }\n\n return ok({\n session_id,\n status: 'pending_passkey',\n onboarding_url,\n ...(parsedChallenge !== undefined && { challenge: parsedChallenge }),\n });\n}\n\nfunction validateOnboardingChallenge(\n data: unknown\n): Result<RegisterStartResponse['challenge'], TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: challenge must be object', {\n originalData: data,\n });\n }\n\n const rp = required(data, 'rp');\n const user = required(data, 'user');\n const challengeStr = required(data, 'challenge');\n const pubKeyCredParams = required(data, 'pubKeyCredParams');\n\n if (\n !isObject(rp) ||\n !isString((rp as Record<string, unknown>).name) ||\n !isString((rp as Record<string, unknown>).id)\n ) {\n return validationError('Invalid API response: challenge.rp must have name and id', {\n originalData: data,\n });\n }\n if (\n !isObject(user) ||\n !isString((user as Record<string, unknown>).id) ||\n !isString((user as Record<string, unknown>).name) ||\n !isString((user as Record<string, unknown>).displayName)\n ) {\n return validationError('Invalid API response: challenge.user must have id, name, displayName', {\n originalData: data,\n });\n }\n if (!isString(challengeStr)) {\n return validationError('Invalid API response: challenge.challenge must be string', {\n originalData: data,\n });\n }\n if (!isArray(pubKeyCredParams)) {\n return validationError('Invalid API response: challenge.pubKeyCredParams must be array', {\n originalData: data,\n });\n }\n for (const item of pubKeyCredParams) {\n if (\n !isObject(item) ||\n (item as Record<string, unknown>).type !== 'public-key' ||\n !isNumber((item as Record<string, unknown>).alg)\n ) {\n return validationError(\n 'Invalid API response: pubKeyCredParams items must have type and alg',\n {\n originalData: data,\n }\n );\n }\n }\n\n return ok({\n rp: rp as RegisterStartResponse['challenge']['rp'],\n user: user as RegisterStartResponse['challenge']['user'],\n challenge: challengeStr,\n pubKeyCredParams: pubKeyCredParams as RegisterStartResponse['challenge']['pubKeyCredParams'],\n });\n}\n\nexport function validateOnboardingRegisterPasskeyResponse(\n data: unknown\n): Result<OnboardingRegisterPasskeyResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const status = required(data, 'status');\n const user_id = required(data, 'user_id');\n const tenant_id = required(data, 'tenant_id');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n originalData: data,\n });\n }\n if (\n !isString(status) ||\n !REGISTER_PASSKEY_STATUSES.includes(status as (typeof REGISTER_PASSKEY_STATUSES)[number])\n ) {\n return validationError('Invalid API response: status must be pending_data|completed', {\n originalData: data,\n });\n }\n if (!isString(user_id)) {\n return validationError('Invalid API response: user_id must be string', {\n originalData: data,\n });\n }\n if (!isString(tenant_id)) {\n return validationError('Invalid API response: tenant_id must be string', {\n originalData: data,\n });\n }\n\n return ok({\n session_id,\n status: status as OnboardingRegisterPasskeyResponse['status'],\n user_id,\n tenant_id,\n });\n}\n\nexport function validateOnboardingCompleteResponse(\n data: unknown\n): Result<OnboardingCompleteResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const session_id = required(data, 'session_id');\n const status = required(data, 'status');\n const user_id = required(data, 'user_id');\n const tenant_id = required(data, 'tenant_id');\n const session_token = required(data, 'session_token');\n\n if (!isString(session_id)) {\n return validationError('Invalid API response: session_id must be string', {\n originalData: data,\n });\n }\n if (status !== 'completed') {\n return validationError('Invalid API response: status must be completed', {\n originalData: data,\n });\n }\n if (!isString(user_id) || !isString(tenant_id) || !isString(session_token)) {\n return validationError(\n 'Invalid API response: user_id, tenant_id, session_token must be strings',\n { originalData: data }\n );\n }\n\n return ok({\n session_id,\n status: 'completed',\n user_id,\n tenant_id,\n session_token,\n });\n}\n","import { ok } from '../../utils/result';\nimport type { Result } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, validationError } from './helpers';\nimport type {\n CrossDeviceInitResult,\n CrossDeviceStatusResult,\n CrossDeviceContextResult,\n} from '../../types';\n\n/**\n * Validates the response for cross-device verify and verify-registration endpoints.\n * Backend returns 204 No Content; body may be undefined, null, or empty object.\n * Accepts only those; rejects any other shape to detect unexpected API responses.\n */\nexport function validateCrossDeviceVerifyResponse(data: unknown): Result<void, TryMellonError> {\n if (data === undefined || data === null) {\n return ok(undefined);\n }\n if (isObject(data) && Object.keys(data).length === 0) {\n return ok(undefined);\n }\n return validationError('Invalid API response: expected empty body (204)', {\n originalData: data,\n });\n}\n\nfunction isCreationOptionsShape(opts: unknown): opts is Record<string, unknown> {\n if (!opts || typeof opts !== 'object') return false;\n const o = opts as Record<string, unknown>;\n return (\n typeof o.challenge === 'string' &&\n o.rp != null &&\n typeof o.rp === 'object' &&\n o.user != null &&\n typeof o.user === 'object' &&\n Array.isArray((o as { pubKeyCredParams?: unknown }).pubKeyCredParams)\n );\n}\n\nfunction isRequestOptionsShape(opts: unknown): opts is Record<string, unknown> {\n if (!opts || typeof opts !== 'object') return false;\n const o = opts as Record<string, unknown>;\n return typeof o.challenge === 'string' && typeof o.rpId === 'string';\n}\n\n/**\n * Accepts either the unwrapped payload { session_id, qr_url, expires_at } or the fintech\n * envelope { ok: true, resultado: { session_id, qr_url, expires_at } } so the flow works\n * regardless of whether the fetch-client unwraps before calling this validator.\n */\nexport function validateCrossDeviceInitResponse(\n data: unknown\n): Result<CrossDeviceInitResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const payload =\n 'resultado' in data && isObject((data as { resultado: unknown }).resultado)\n ? (data as { resultado: Record<string, unknown> }).resultado\n : data;\n\n const session_id = payload.session_id;\n const qr_url = payload.qr_url;\n const expires_at = payload.expires_at;\n const polling_token = payload.polling_token;\n\n if (\n !isString(session_id) ||\n !isString(qr_url) ||\n !isString(expires_at) ||\n !isString(polling_token)\n ) {\n return validationError('Invalid API response: missing required fields', { originalData: data });\n }\n\n const result: CrossDeviceInitResult = {\n session_id,\n qr_url,\n expires_at,\n polling_token,\n };\n if (payload.external_user_id !== undefined && isString(payload.external_user_id)) {\n result.external_user_id = payload.external_user_id;\n }\n return ok(result);\n}\n\n/**\n * Accepts either the unwrapped payload { status, user_id?, session_token?, redirect_url? } or the\n * fintech envelope { ok: true, resultado: { ... } } so the flow works regardless of unwrapping.\n */\nexport function validateCrossDeviceStatusResponse(\n data: unknown\n): Result<CrossDeviceStatusResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const payload =\n 'resultado' in data && isObject((data as { resultado: unknown }).resultado)\n ? (data as { resultado: Record<string, unknown> }).resultado\n : data;\n\n const status = payload.status;\n if (!isString(status) || !['pending', 'authenticated', 'completed'].includes(status)) {\n return validationError('Invalid API response: invalid status', { originalData: data });\n }\n\n const user_id = payload.user_id;\n const session_token = payload.session_token;\n const redirect_url = payload.redirect_url;\n\n if (user_id !== undefined && !isString(user_id)) {\n return validationError('Invalid API response: user_id must be a string when present', {\n originalData: data,\n });\n }\n if (session_token !== undefined && !isString(session_token)) {\n return validationError('Invalid API response: session_token must be a string when present', {\n originalData: data,\n });\n }\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be a string when present', {\n originalData: data,\n });\n }\n\n return ok({\n status: status as CrossDeviceStatusResult['status'],\n user_id: user_id as string | undefined,\n session_token: session_token as string | undefined,\n redirect_url: redirect_url as string | undefined,\n });\n}\n\nexport function validateCrossDeviceContextResponse(\n data: unknown\n): Result<CrossDeviceContextResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const rawType = data.type;\n const type =\n rawType === 'registration' ? 'registration' : rawType === 'auth' ? 'auth' : ('auth' as const);\n\n const options = data.options;\n if (!isObject(options)) {\n return validationError('Invalid API response: options are required', { originalData: data });\n }\n\n const MAX_CONTEXT_LENGTH = 200;\n const approval_context = optionalContextString(data.approval_context, MAX_CONTEXT_LENGTH);\n const application_name = optionalContextString(data.application_name, MAX_CONTEXT_LENGTH);\n if (approval_context === false || application_name === false) {\n return validationError(\n 'Invalid API response: approval_context/application_name must be string max 200 chars',\n {\n originalData: data,\n }\n );\n }\n\n const extra: { approval_context?: string; application_name?: string } = {};\n if (typeof approval_context === 'string') extra.approval_context = approval_context;\n if (typeof application_name === 'string') extra.application_name = application_name;\n\n if (type === 'registration') {\n if (!isCreationOptionsShape(options)) {\n return validationError(\n 'Invalid API response: registration options must have challenge, rp, user, pubKeyCredParams',\n { originalData: data }\n );\n }\n return ok({\n type: 'registration',\n options,\n ...extra,\n } as CrossDeviceContextResult);\n }\n\n if (!isRequestOptionsShape(options)) {\n return validationError('Invalid API response: auth options must have challenge and rpId', {\n originalData: data,\n });\n }\n return ok({ type: 'auth', options, ...extra } as CrossDeviceContextResult);\n}\n\n/** Returns string if valid (optional, max len), undefined if missing, false if invalid. */\nfunction optionalContextString(value: unknown, maxLength: number): string | undefined | false {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'string') return false;\n if (value.length > maxLength) return false;\n return value;\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { RecoveryVerifyResponse, RecoveryCompleteResponse } from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport { isObject, isString, required, validationError } from './helpers';\n\nexport function validateRecoveryVerifyResponse(\n data: unknown\n): Result<RecoveryVerifyResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const challenge = required(data, 'challenge');\n const recovery_session_id = required(data, 'recovery_session_id');\n\n if (!isObject(challenge)) {\n return validationError('Invalid API response: challenge must be object', {\n field: 'challenge',\n originalData: data,\n });\n }\n\n if (!isString(recovery_session_id)) {\n return validationError('Invalid API response: recovery_session_id must be string', {\n field: 'recovery_session_id',\n originalData: data,\n });\n }\n\n return ok({\n challenge: challenge as Record<string, unknown>,\n recovery_session_id,\n });\n}\n\nexport function validateRecoveryCompleteResponse(\n data: unknown\n): Result<RecoveryCompleteResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const status = required(data, 'status');\n const session_token = required(data, 'session_token');\n const user = required(data, 'user');\n const credential_id = required(data, 'credential_id');\n\n if (!isString(status)) {\n return validationError('Invalid API response: status must be string', {\n field: 'status',\n originalData: data,\n });\n }\n\n if (!isString(session_token)) {\n return validationError('Invalid API response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n\n if (!isString(credential_id)) {\n return validationError('Invalid API response: credential_id must be string', {\n field: 'credential_id',\n originalData: data,\n });\n }\n\n if (!isObject(user)) {\n return validationError('Invalid API response: user must be object', {\n field: 'user',\n originalData: data,\n });\n }\n\n const user_id = required(user, 'user_id');\n if (!isString(user_id)) {\n return validationError('Invalid API response: user.user_id must be string', {\n field: 'user.user_id',\n originalData: data,\n });\n }\n\n const dataObj = data as Record<string, unknown>;\n const redirect_url = dataObj.redirect_url;\n if (redirect_url !== undefined && !isString(redirect_url)) {\n return validationError('Invalid API response: redirect_url must be string', {\n field: 'redirect_url',\n originalData: data,\n });\n }\n\n const userObj = user as Record<string, unknown>;\n return ok({\n status,\n session_token,\n credential_id,\n user: {\n user_id,\n external_user_id: isString(userObj.external_user_id) ? userObj.external_user_id : undefined,\n email: isString(userObj.email) ? userObj.email : undefined,\n metadata: isObject(userObj.metadata)\n ? (userObj.metadata as Record<string, unknown>)\n : undefined,\n },\n ...(redirect_url !== undefined && { redirect_url }),\n });\n}\n","import type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { EnrollmentStartResponse, EnrollmentFinishResponse } from '../../types';\nimport type { TryMellonError } from '../../errors';\nimport {\n isObject,\n isString,\n required,\n validationError,\n validateRegisterStartShape,\n} from './helpers';\n\nexport function validateEnrollmentStartResponse(\n data: unknown\n): Result<EnrollmentStartResponse, TryMellonError> {\n const shape = validateRegisterStartShape(data);\n if (!shape.ok) return shape;\n return ok({\n session_id: shape.value.session_id,\n challenge: shape.value.challenge as EnrollmentStartResponse['challenge'],\n });\n}\n\nfunction validateEnrollmentUser(\n user: unknown,\n data: unknown\n): Result<EnrollmentFinishResponse['user'], TryMellonError> {\n if (!isObject(user)) {\n return validationError('Invalid API response: user must be object', {\n field: 'user',\n originalData: data,\n });\n }\n const user_id = required(user, 'user_id');\n if (!isString(user_id)) {\n return validationError('Invalid API response: user.user_id must be string', {\n originalData: data,\n });\n }\n const external_user_id = user.external_user_id;\n if (external_user_id !== undefined && !isString(external_user_id)) {\n return validationError('Invalid API response: user.external_user_id must be string', {\n originalData: data,\n });\n }\n const email = user.email;\n if (email !== undefined && !isString(email)) {\n return validationError('Invalid API response: user.email must be string', {\n originalData: data,\n });\n }\n const metadata = user.metadata;\n if (metadata !== undefined && (typeof metadata !== 'object' || metadata === null)) {\n return validationError('Invalid API response: user.metadata must be object', {\n originalData: data,\n });\n }\n return ok({\n user_id,\n ...(external_user_id !== undefined && { external_user_id }),\n ...(email !== undefined && { email }),\n ...(metadata !== undefined && { metadata: metadata as Record<string, unknown> }),\n });\n}\n\nexport function validateEnrollmentFinishResponse(\n data: unknown\n): Result<EnrollmentFinishResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid API response: expected object', { originalData: data });\n }\n\n const credential_id = required(data, 'credential_id');\n const status = required(data, 'status');\n const session_token = required(data, 'session_token');\n const user = required(data, 'user');\n\n if (!isString(credential_id)) {\n return validationError('Invalid API response: credential_id must be string', {\n field: 'credential_id',\n originalData: data,\n });\n }\n if (!isString(status)) {\n return validationError('Invalid API response: status must be string', {\n field: 'status',\n originalData: data,\n });\n }\n if (!isString(session_token)) {\n return validationError('Invalid API response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n const userResult = validateEnrollmentUser(user, data);\n if (!userResult.ok) return userResult;\n\n return ok({\n credential_id,\n status,\n session_token,\n user: userResult.value,\n });\n}\n","import { ok } from '../../utils/result';\nimport type { Result } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport type {\n BridgeContextResponse,\n BridgeChallengeResponse,\n BridgeCompleteEnrollmentResult,\n BridgeCompleteAuthResult,\n BridgeStatusSnapshot,\n} from '../../types';\nimport { isObject, isString, required, validationError } from './helpers';\n\nconst BRIDGE_STATUS_VALUES = ['pending', 'pin_verified', 'pin_locked', 'completed'] as const;\n\n// ---------------------------------------------------------------------------\n// Validators (backend: bridge.schemas.ts)\n// ---------------------------------------------------------------------------\n\nexport function validateBridgeContextResponse(\n data: unknown\n): Result<BridgeContextResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid bridge context response: expected object', {\n originalData: data,\n });\n }\n\n const typeVal = required(data, 'type');\n if (typeVal !== 'auth' && typeVal !== 'registration') {\n return validationError(\n 'Invalid bridge context response: type must be \"auth\" or \"registration\"',\n { field: 'type', expected: 'auth | registration', originalData: data }\n );\n }\n\n const options = required(data, 'options');\n if (!isObject(options)) {\n return validationError('Invalid bridge context response: options must be object', {\n field: 'options',\n originalData: data,\n });\n }\n\n const application_name = data.application_name;\n if (application_name !== undefined && !isString(application_name)) {\n return validationError('Invalid bridge context response: application_name must be string', {\n field: 'application_name',\n originalData: data,\n });\n }\n\n return ok({\n type: typeVal,\n options,\n ...(application_name !== undefined && { application_name }),\n });\n}\n\nexport function validateBridgeVerifyResponse(\n data: unknown\n): Result<BridgeChallengeResponse, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid bridge verify response: expected object', {\n originalData: data,\n });\n }\n\n const session_id = required(data, 'session_id');\n if (!isString(session_id) || session_id.trim() === '') {\n return validationError(\n 'Invalid bridge verify response: session_id must be non-empty string (UUID expected)',\n { field: 'session_id', originalData: data }\n );\n }\n\n const challenge = data.challenge;\n if (challenge !== undefined && !isString(challenge)) {\n return validationError(\n 'Invalid bridge verify response: challenge must be string when present',\n {\n field: 'challenge',\n originalData: data,\n }\n );\n }\n\n const registration_options = data.registration_options;\n if (registration_options !== undefined && !isObject(registration_options)) {\n return validationError(\n 'Invalid bridge verify response: registration_options must be object when present',\n { field: 'registration_options', originalData: data }\n );\n }\n\n const authentication_options = data.authentication_options;\n if (authentication_options !== undefined && !isObject(authentication_options)) {\n return validationError(\n 'Invalid bridge verify response: authentication_options must be object when present',\n { field: 'authentication_options', originalData: data }\n );\n }\n\n return ok({\n session_id,\n ...(challenge !== undefined && { challenge }),\n ...(registration_options !== undefined && { registration_options }),\n ...(authentication_options !== undefined && { authentication_options }),\n });\n}\n\nexport function validateBridgeCompleteEnrollmentResponse(\n data: unknown\n): Result<BridgeCompleteEnrollmentResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid bridge complete enrollment response: expected object', {\n originalData: data,\n });\n }\n\n const credential_id = required(data, 'credential_id');\n const entity_id = required(data, 'entity_id');\n const user_id = required(data, 'user_id');\n const session_token = required(data, 'session_token');\n\n if (!isString(credential_id)) {\n return validationError(\n 'Invalid bridge complete enrollment response: credential_id must be string',\n { field: 'credential_id', originalData: data }\n );\n }\n if (!isString(entity_id)) {\n return validationError(\n 'Invalid bridge complete enrollment response: entity_id must be string',\n { field: 'entity_id', originalData: data }\n );\n }\n if (!isString(user_id)) {\n return validationError('Invalid bridge complete enrollment response: user_id must be string', {\n field: 'user_id',\n originalData: data,\n });\n }\n if (!isString(session_token)) {\n return validationError(\n 'Invalid bridge complete enrollment response: session_token must be string',\n { field: 'session_token', originalData: data }\n );\n }\n\n return ok({ credential_id, entity_id, user_id, session_token });\n}\n\nexport function validateBridgeCompleteAuthResponse(\n data: unknown\n): Result<BridgeCompleteAuthResult, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid bridge complete auth response: expected object', {\n originalData: data,\n });\n }\n\n const session_token = required(data, 'session_token');\n if (!isString(session_token)) {\n return validationError('Invalid bridge complete auth response: session_token must be string', {\n field: 'session_token',\n originalData: data,\n });\n }\n\n return ok({ session_token });\n}\n\nexport function validateBridgeStatusResponse(\n data: unknown\n): Result<BridgeStatusSnapshot, TryMellonError> {\n if (!isObject(data)) {\n return validationError('Invalid bridge status response: expected object', {\n originalData: data,\n });\n }\n\n const status = required(data, 'status');\n if (\n typeof status !== 'string' ||\n !BRIDGE_STATUS_VALUES.includes(status as BridgeStatusSnapshot['status'])\n ) {\n return validationError(\n 'Invalid bridge status response: status must be one of pending, pin_verified, pin_locked, completed',\n { field: 'status', originalData: data }\n );\n }\n\n const ts = data.ts;\n if (ts !== undefined && !isString(ts)) {\n return validationError('Invalid bridge status response: ts must be string when present', {\n field: 'ts',\n originalData: data,\n });\n }\n\n return ok({\n status: status as BridgeStatusSnapshot['status'],\n ...(ts !== undefined && { ts }),\n });\n}\n","import type { HttpClient } from './http-client';\nimport { BRIDGE_PATH_ENROLLMENT, BRIDGE_PATH_AUTH } from './constants';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport type { TryMellonError } from '../errors';\nimport {\n validateRegisterStartResponse,\n validateAuthStartResponse,\n validateRegisterFinishResponse,\n validateAuthFinishResponse,\n validateSessionValidateResponse,\n validateEmailVerifyResponse,\n validateOnboardingStartResponse,\n validateOnboardingStatusResponse,\n validateOnboardingRegisterResponse,\n validateOnboardingRegisterPasskeyResponse,\n validateOnboardingCompleteResponse,\n validateCrossDeviceInitResponse,\n validateCrossDeviceStatusResponse,\n validateCrossDeviceContextResponse,\n validateCrossDeviceVerifyResponse,\n validateRecoveryVerifyResponse,\n validateRecoveryCompleteResponse,\n validateEnrollmentStartResponse,\n validateEnrollmentFinishResponse,\n validateBridgeContextResponse,\n validateBridgeVerifyResponse,\n validateBridgeCompleteEnrollmentResponse,\n validateBridgeCompleteAuthResponse,\n validateBridgeStatusResponse,\n} from './validators';\nimport type {\n RegisterStartRequest,\n RegisterStartResponse,\n AuthStartRequest,\n AuthStartResponse,\n RegisterFinishRequest,\n RegisterFinishResponse,\n AuthFinishRequest,\n AuthFinishResponse,\n SessionValidateResponse,\n OnboardingStartRequest,\n OnboardingStartResponse,\n OnboardingStatusResponse,\n OnboardingRegisterPasskeyRequest,\n OnboardingRegisterPasskeyResponse,\n OnboardingCompleteRequest,\n OnboardingCompleteResponse,\n CrossDeviceInitResult,\n CrossDeviceStatusResult,\n CrossDeviceContextResult,\n CrossDeviceVerifyRequest,\n CrossDeviceVerifyRegistrationRequest,\n RecoveryVerifyResponse,\n RecoveryCompleteResponse,\n EnrollmentStartResponse,\n EnrollmentFinishResponse,\n BridgeContextResponse,\n BridgeChallengeResponse,\n BridgeCompleteEnrollmentResult,\n BridgeCompleteAuthResult,\n BridgeStatusSnapshot,\n} from '../types';\nimport type { OnboardingRegisterResponseWithChallenge } from './validators';\n\n/** Bridge kind: enrollment-bridge (registration flow) or auth-bridge (auth flow). */\nexport type BridgeKind = 'enrollment' | 'auth';\n\nexport class ApiClient {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly baseUrl: string,\n private readonly defaultHeaders: Record<string, string> = {}\n ) {}\n\n private mergeHeaders(extra?: Record<string, string>): Record<string, string> {\n return { ...this.defaultHeaders, ...extra };\n }\n\n private async post<Req, Res>(\n path: string,\n body: Req,\n validate: (data: unknown) => Result<Res, TryMellonError>,\n extraHeaders?: Record<string, string>\n ): Promise<Result<Res, TryMellonError>> {\n const url = `${this.baseUrl}${path}`;\n const result = await this.httpClient.post<unknown>(url, body, this.mergeHeaders(extraHeaders));\n\n if (!result.ok) {\n return err(result.error);\n }\n\n return validate(result.value);\n }\n\n private async get<Res>(\n path: string,\n validate: (data: unknown) => Result<Res, TryMellonError>,\n headers?: Record<string, string>\n ): Promise<Result<Res, TryMellonError>> {\n const url = `${this.baseUrl}${path}`;\n const result = await this.httpClient.get<unknown>(url, this.mergeHeaders(headers));\n\n if (!result.ok) {\n return err(result.error);\n }\n\n return validate(result.value);\n }\n\n async startRegister(\n request: RegisterStartRequest\n ): Promise<Result<RegisterStartResponse, TryMellonError>> {\n return this.post('/v1/passkeys/register/start', request, validateRegisterStartResponse);\n }\n\n async startAuth(request: AuthStartRequest): Promise<Result<AuthStartResponse, TryMellonError>> {\n return this.post('/v1/passkeys/auth/start', request, validateAuthStartResponse);\n }\n\n async finishRegister(\n request: RegisterFinishRequest\n ): Promise<Result<RegisterFinishResponse, TryMellonError>> {\n return this.post('/v1/passkeys/register/finish', request, validateRegisterFinishResponse);\n }\n\n async finishAuthentication(\n request: AuthFinishRequest\n ): Promise<Result<AuthFinishResponse, TryMellonError>> {\n return this.post('/v1/passkeys/auth/finish', request, validateAuthFinishResponse);\n }\n\n async validateSession(\n sessionToken: string\n ): Promise<Result<SessionValidateResponse, TryMellonError>> {\n return this.get('/v1/sessions/validate', validateSessionValidateResponse, {\n Authorization: `Bearer ${sessionToken}`,\n });\n }\n\n async startEmailFallback(options: {\n userId: string;\n email: string;\n }): Promise<Result<void, TryMellonError>> {\n const url = `${this.baseUrl}/v1/fallback/email/start`;\n const result = await this.httpClient.post<unknown>(\n url,\n { userId: options.userId, email: options.email },\n this.mergeHeaders()\n );\n if (!result.ok) return err(result.error);\n return ok(undefined);\n }\n\n async verifyEmailCode(options: {\n userId: string;\n code: string;\n successUrl?: string;\n }): Promise<Result<{ sessionToken: string; redirectUrl?: string }, TryMellonError>> {\n const body: Record<string, unknown> = { userId: options.userId, code: options.code };\n if (options.successUrl) body.success_url = options.successUrl;\n return this.post('/v1/fallback/email/verify', body, validateEmailVerifyResponse);\n }\n\n async startOnboarding(\n request: OnboardingStartRequest\n ): Promise<Result<OnboardingStartResponse, TryMellonError>> {\n return this.post('/v1/onboarding/start', request, validateOnboardingStartResponse);\n }\n\n async getOnboardingStatus(\n sessionId: string\n ): Promise<Result<OnboardingStatusResponse, TryMellonError>> {\n return this.get(`/v1/onboarding/${sessionId}/status`, validateOnboardingStatusResponse);\n }\n\n async getOnboardingRegister(\n sessionId: string\n ): Promise<Result<OnboardingRegisterResponseWithChallenge, TryMellonError>> {\n return this.get(`/v1/onboarding/${sessionId}/register`, validateOnboardingRegisterResponse);\n }\n\n async registerOnboardingPasskey(\n sessionId: string,\n request: OnboardingRegisterPasskeyRequest\n ): Promise<Result<OnboardingRegisterPasskeyResponse, TryMellonError>> {\n return this.post(\n `/v1/onboarding/${sessionId}/register-passkey`,\n request,\n validateOnboardingRegisterPasskeyResponse\n );\n }\n\n async completeOnboarding(\n sessionId: string,\n request: OnboardingCompleteRequest\n ): Promise<Result<OnboardingCompleteResponse, TryMellonError>> {\n return this.post(\n `/v1/onboarding/${sessionId}/complete`,\n request,\n validateOnboardingCompleteResponse\n );\n }\n\n async initCrossDeviceAuth(): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n return this.post('/v1/auth/cross-device/init', {}, validateCrossDeviceInitResponse);\n }\n\n async initCrossDeviceRegistration(options?: {\n externalUserId?: string;\n }): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n const trimmed =\n typeof options?.externalUserId === 'string' ? options.externalUserId.trim() : '';\n const body = trimmed.length > 0 ? { external_user_id: trimmed } : {};\n return this.post(\n '/v1/auth/cross-device/init-registration',\n body,\n validateCrossDeviceInitResponse\n );\n }\n\n async getCrossDeviceStatus(\n sessionId: string,\n pollingToken?: string | null\n ): Promise<Result<CrossDeviceStatusResult, TryMellonError>> {\n const headers: Record<string, string> = {};\n if (typeof pollingToken === 'string' && pollingToken.length > 0) {\n headers['X-Polling-Token'] = pollingToken;\n }\n return this.get(\n `/v1/auth/cross-device/status/${sessionId}`,\n validateCrossDeviceStatusResponse,\n Object.keys(headers).length > 0 ? headers : undefined\n );\n }\n\n /**\n * Fetches WebAuthn options for the cross-device session.\n * Contract: response is CrossDeviceContextResult (auth | registration).\n * Use result.value.type to branch: 'auth' → credentials.get + verify;\n * 'registration' → credentials.create + verify-registration.\n */\n async getCrossDeviceContext(\n sessionId: string\n ): Promise<Result<CrossDeviceContextResult, TryMellonError>> {\n return this.get(\n `/v1/auth/cross-device/context/${sessionId}`,\n validateCrossDeviceContextResponse\n );\n }\n\n async verifyCrossDeviceAuth(\n request: CrossDeviceVerifyRequest\n ): Promise<Result<void, TryMellonError>> {\n return this.post('/v1/auth/cross-device/verify', request, validateCrossDeviceVerifyResponse);\n }\n\n async verifyCrossDeviceRegistration(\n request: CrossDeviceVerifyRegistrationRequest\n ): Promise<Result<void, TryMellonError>> {\n return this.post(\n '/v1/auth/cross-device/verify-registration',\n request,\n validateCrossDeviceVerifyResponse\n );\n }\n\n async verifyAccountRecoveryOtp(\n externalUserId: string,\n otp: string\n ): Promise<Result<RecoveryVerifyResponse, TryMellonError>> {\n return this.post(\n '/v1/users/recovery/verify',\n { external_id: externalUserId, otp },\n validateRecoveryVerifyResponse\n );\n }\n\n async completeAccountRecovery(\n recoverySessionId: string,\n credential: Record<string, unknown>\n ): Promise<Result<RecoveryCompleteResponse, TryMellonError>> {\n return this.post(\n '/v1/users/recovery/complete',\n { recovery_session_id: recoverySessionId, credential },\n validateRecoveryCompleteResponse\n );\n }\n\n async startEnrollment(\n ticketId: string,\n contextHash: string,\n headers?: Record<string, string>\n ): Promise<Result<EnrollmentStartResponse, TryMellonError>> {\n return this.post(\n '/v1/enrollment/register/options',\n { ticket_id: ticketId, context_hash: contextHash },\n validateEnrollmentStartResponse,\n headers\n );\n }\n\n async finishEnrollment(\n ticketId: string,\n body: { credential: unknown; context_hash: string },\n headers?: Record<string, string>\n ): Promise<Result<EnrollmentFinishResponse, TryMellonError>> {\n return this.post(\n '/v1/enrollment/register',\n { ...body, ticket_id: ticketId },\n validateEnrollmentFinishResponse,\n headers\n );\n }\n\n // -------------------------------------------------------------------------\n // Bridge (KP-BRIDGE-04): enrollment-bridge and auth-bridge\n // -------------------------------------------------------------------------\n\n private bridgePrefix(kind: BridgeKind): string {\n return kind === 'enrollment' ? BRIDGE_PATH_ENROLLMENT : BRIDGE_PATH_AUTH;\n }\n\n async getBridgeContext(\n sessionId: string,\n kind: BridgeKind,\n headers?: Record<string, string>\n ): Promise<Result<BridgeContextResponse, TryMellonError>> {\n return this.get(\n `${this.bridgePrefix(kind)}/context/${sessionId}`,\n validateBridgeContextResponse,\n headers\n );\n }\n\n async verifyBridgePin(\n sessionId: string,\n pin: string,\n kind: BridgeKind,\n headers?: Record<string, string>\n ): Promise<Result<BridgeChallengeResponse, TryMellonError>> {\n return this.post(\n `${this.bridgePrefix(kind)}/verify/${sessionId}`,\n { pin },\n validateBridgeVerifyResponse,\n headers\n );\n }\n\n async completeBridgeEnrollment(\n body: {\n session_id: string;\n ticket_id: string;\n entity_id: string;\n context_hash: string;\n registration_response: {\n id: string;\n rawId: string;\n response: { clientDataJSON: string; attestationObject: string };\n type: string;\n };\n },\n headers?: Record<string, string>\n ): Promise<Result<BridgeCompleteEnrollmentResult, TryMellonError>> {\n return this.post(\n `${this.bridgePrefix('enrollment')}/complete`,\n body,\n validateBridgeCompleteEnrollmentResponse,\n headers\n );\n }\n\n async completeBridgeAuth(\n body: {\n session_id: string;\n credential: {\n id: string;\n rawId: string;\n response: {\n authenticatorData: string;\n clientDataJSON: string;\n signature: string;\n userHandle?: string;\n };\n type: string;\n };\n },\n headers?: Record<string, string>\n ): Promise<Result<BridgeCompleteAuthResult, TryMellonError>> {\n return this.post(\n `${this.bridgePrefix('auth')}/complete`,\n body,\n validateBridgeCompleteAuthResponse,\n headers\n );\n }\n\n /**\n * Full URL for GET bridge status (polling or EventSource). Same path as getBridgeStatus.\n * Used by BridgeManager for SSE when EventSource is available (browser only; Node has no EventSource).\n */\n getBridgeStatusUrl(sessionId: string, kind: BridgeKind): string {\n return `${this.baseUrl}${this.bridgePrefix(kind)}/status/${sessionId}`;\n }\n\n async getBridgeStatus(\n sessionId: string,\n kind: BridgeKind,\n headers?: Record<string, string>\n ): Promise<Result<BridgeStatusSnapshot, TryMellonError>> {\n return this.get(\n `${this.bridgePrefix(kind)}/status/${sessionId}`,\n validateBridgeStatusResponse,\n headers\n );\n }\n}\n","import type { HttpClient } from './http-client';\nimport type { Logger } from './ports/logger';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport {\n createError,\n mapBackendErrorCodeToTryMellon,\n type TryMellonError,\n type TryMellonErrorCode,\n} from '../errors';\nimport { RETRY_DELAY_CAP_MS } from './constants';\n\n/** Fintech success envelope: { ok: true, resultado: T } */\nfunction isEnvelopeSuccess(data: unknown): data is { ok: true; resultado: unknown } {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as Record<string, unknown>).ok === true &&\n 'resultado' in (data as Record<string, unknown>)\n );\n}\n\n/** Fintech error envelope: { ok: false, error: { code, message } } */\nfunction isEnvelopeError(\n data: unknown\n): data is { ok: false; error: { code: string; message: string; details?: unknown } } {\n if (typeof data !== 'object' || data === null) return false;\n const o = data as Record<string, unknown>;\n if (o.ok !== false || !o.error || typeof o.error !== 'object') return false;\n const err = o.error as Record<string, unknown>;\n return typeof err.code === 'string' && typeof err.message === 'string';\n}\n\n/**\n * Pure function: parses HTTP error body (fintech envelope or fallbacks) into message and code.\n * Concentrates all error-body parsing in one place for testability and single responsibility.\n */\nexport function parseHttpErrorBody(\n errorData: unknown,\n statusText: string\n): { message: string; code: TryMellonErrorCode } {\n if (isEnvelopeError(errorData)) {\n return {\n message: errorData.error.message,\n code: mapBackendErrorCodeToTryMellon(errorData.error.code),\n };\n }\n const body = errorData as\n | { message?: string; error?: string | { code?: string; message?: string } }\n | undefined;\n const errObj = body?.error;\n if (\n typeof errObj === 'object' &&\n errObj !== null &&\n 'code' in errObj &&\n typeof (errObj as { code: string }).code === 'string'\n ) {\n return {\n message: (errObj as { message?: string }).message ?? body?.message ?? statusText,\n code: mapBackendErrorCodeToTryMellon((errObj as { code: string }).code),\n };\n }\n const message = body?.message ?? statusText;\n const rawCode = body?.error;\n const code =\n typeof rawCode === 'string'\n ? mapBackendErrorCodeToTryMellon(rawCode)\n : rawCode === undefined\n ? 'NETWORK_FAILURE'\n : mapBackendErrorCodeToTryMellon(String(rawCode));\n return { message, code };\n}\n\n/**\n * Generates a unique request ID. Uses globalThis.crypto.randomUUID only (Elite: no Node crypto).\n * @throws Error when Web Crypto API is not available (Edge/browser must provide it).\n */\nfunction generateRequestId(): string {\n if (\n typeof globalThis.crypto !== 'undefined' &&\n typeof globalThis.crypto.randomUUID === 'function'\n ) {\n return globalThis.crypto.randomUUID();\n }\n throw new Error('Web Crypto API is required but not available.');\n}\n\n/**\n * Exponential backoff delay for a given attempt (0-based).\n * Cap at RETRY_DELAY_CAP_MS.\n */\nexport function getRetryDelayMs(attempt: number, baseMs: number): number {\n const delay = baseMs * Math.pow(2, attempt);\n return Math.min(delay, RETRY_DELAY_CAP_MS);\n}\n\nfunction shouldRetryOnStatus(method: string, status: number): boolean {\n if (method !== 'GET') return false;\n return status >= 500 || status === 429;\n}\n\nexport class FetchHttpClient implements HttpClient {\n constructor(\n private readonly timeoutMs: number,\n private readonly maxRetries: number = 0,\n private readonly retryDelayMs: number = 1000,\n private readonly logger?: Logger\n ) {}\n\n async get<T>(url: string, headers?: Record<string, string>): Promise<Result<T, TryMellonError>> {\n return this.request<T>(url, { method: 'GET', headers });\n }\n\n async post<T>(\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<Result<T, TryMellonError>> {\n return this.request<T>(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...headers },\n });\n }\n\n private async request<T>(url: string, config: RequestInit): Promise<Result<T, TryMellonError>> {\n const method = (config.method ?? 'GET').toUpperCase();\n const requestId = generateRequestId();\n const headers = new Headers(config.headers as HeadersInit);\n headers.set('X-Request-Id', requestId);\n\n if (this.logger) {\n this.logger.debug('request', { requestId, url, method });\n }\n\n let lastError: TryMellonError | Error | unknown;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const response = await fetch(url, {\n ...config,\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n let errorData: unknown;\n try {\n errorData = await response.json();\n } catch {\n // Ignore JSON parse error\n }\n\n const { message, code } = parseHttpErrorBody(errorData, response.statusText);\n const errResult = createError(code, message, {\n requestId,\n status: response.status,\n statusText: response.statusText,\n data: errorData,\n });\n\n if (shouldRetryOnStatus(method, response.status) && attempt < this.maxRetries) {\n lastError = errResult;\n clearTimeout(timeoutId);\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelayMs(attempt, this.retryDelayMs))\n );\n continue;\n }\n\n return err(errResult);\n }\n\n if (response.status === 204) {\n return ok(undefined as T);\n }\n const contentLength = response.headers.get('content-length');\n if (contentLength === '0') {\n return ok(undefined as T);\n }\n const raw = (await response.json()) as unknown;\n if (isEnvelopeSuccess(raw)) {\n return ok((raw as { ok: true; resultado: T }).resultado);\n }\n const o = raw as Record<string, unknown>;\n if (typeof raw === 'object' && raw !== null && o.ok === true && !('resultado' in o)) {\n return ok(undefined as T);\n }\n if (isEnvelopeError(raw)) {\n const { message, code } = parseHttpErrorBody(raw, response.statusText);\n return err(\n createError(code, message, {\n requestId,\n status: response.status,\n statusText: response.statusText,\n data: raw,\n })\n );\n }\n return ok(raw as T);\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error) {\n lastError = error;\n const isGet = method === 'GET';\n if (isGet && attempt < this.maxRetries) {\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelayMs(attempt, this.retryDelayMs))\n );\n } else {\n break;\n }\n }\n }\n\n if (lastError instanceof Error && lastError.name === 'AbortError') {\n return err(createError('TIMEOUT', 'Request timed out', { requestId }));\n }\n\n return err(\n createError(\n 'NETWORK_FAILURE',\n lastError instanceof Error ? lastError.message : 'Request failed',\n { requestId, cause: lastError }\n )\n );\n }\n}\n","import { createEncodingError } from '../errors';\n\n/**\n * Encodes an ArrayBuffer to base64url using globalThis.btoa (Edge/browser-safe; no Node Buffer).\n * @throws TryMellonError when btoa is unavailable\n */\nexport function base64UrlEncode(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n const binary = Array.from(bytes, (b) => String.fromCharCode(b)).join('');\n\n if (typeof globalThis.btoa === 'undefined') {\n throw createEncodingError('encode');\n }\n const base64 = globalThis.btoa(binary);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Decodes a base64url string to Uint8Array using globalThis.atob (Edge/browser-safe; no Node Buffer).\n * @throws TryMellonError when atob is unavailable\n */\nexport function base64UrlDecode(s: string): Uint8Array {\n if (typeof globalThis.atob === 'undefined') {\n throw createEncodingError('decode');\n }\n\n const base64 = s.replace(/-/g, '+').replace(/_/g, '/');\n const padding = base64.length % 4;\n const padded = padding === 0 ? base64 : base64 + '='.repeat(4 - padding);\n const binary = globalThis.atob(padded);\n\n return Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\n/** Decodes base64url to ArrayBuffer (delegates to base64UrlDecode). */\nexport function base64UrlDecodeToArrayBuffer(s: string): ArrayBuffer {\n const bytes = base64UrlDecode(s);\n return bytes.buffer as ArrayBuffer;\n}\n","import { createError } from '../errors';\nimport { base64UrlEncode } from '../utils/base64url';\nimport type { RegisterFinishRequest, AuthFinishRequest } from '../types';\n\ntype SerializedCredentialForRegister = RegisterFinishRequest['credential'];\ntype SerializedCredentialForAuth = AuthFinishRequest['credential'];\n\n/**\n * Type guard to verify whether a credential response is valid.\n */\nfunction isValidCredentialResponse(\n response: unknown\n): response is AuthenticatorAssertionResponse | AuthenticatorAttestationResponse {\n return (\n response !== null &&\n typeof response === 'object' &&\n 'clientDataJSON' in response &&\n response.clientDataJSON instanceof ArrayBuffer\n );\n}\n\n/**\n * Serializes a credential for registration (finish).\n * Includes attestationObject required for registration verification.\n *\n * @param credential - WebAuthn credential from navigator.credentials.create()\n * @returns Serialized credential in Base64URL format\n * @throws {TryMellonError} If the credential does not have the expected structure for registration\n */\nexport function serializeCredentialForRegister(\n credential: PublicKeyCredential\n): SerializedCredentialForRegister {\n if (!credential.response) {\n throw createError('UNKNOWN_ERROR', 'Credential response is missing', { credential });\n }\n\n const response = credential.response;\n\n if (!isValidCredentialResponse(response)) {\n throw createError('UNKNOWN_ERROR', 'Invalid credential response structure', { response });\n }\n\n if (!('attestationObject' in response)) {\n throw createError(\n 'UNKNOWN_ERROR',\n 'Invalid credential response structure for register: attestationObject is missing',\n { response }\n );\n }\n\n const clientDataJSON = response.clientDataJSON;\n const attestationObject = (response as AuthenticatorAttestationResponse).attestationObject;\n\n return {\n id: credential.id,\n rawId: base64UrlEncode(credential.rawId),\n response: {\n clientDataJSON: base64UrlEncode(clientDataJSON),\n attestationObject: base64UrlEncode(attestationObject),\n },\n type: 'public-key',\n };\n}\n\n/**\n * Serializes a credential for authentication (finish).\n * Includes authenticatorData, signature, and optionally userHandle.\n *\n * @param credential - WebAuthn credential from navigator.credentials.get()\n * @returns Serialized credential in Base64URL format\n * @throws {TryMellonError} If the credential does not have the expected structure for authentication\n */\nexport function serializeCredentialForAuth(\n credential: PublicKeyCredential\n): SerializedCredentialForAuth {\n if (!credential.response) {\n throw createError('UNKNOWN_ERROR', 'Credential response is missing', { credential });\n }\n\n const response = credential.response;\n\n if (!isValidCredentialResponse(response)) {\n throw createError('UNKNOWN_ERROR', 'Invalid credential response structure', { response });\n }\n\n if (!('authenticatorData' in response) || !('signature' in response)) {\n throw createError(\n 'UNKNOWN_ERROR',\n 'Invalid credential response structure for auth: authenticatorData or signature is missing',\n { response }\n );\n }\n\n const clientDataJSON = response.clientDataJSON;\n const authenticatorData = (response as AuthenticatorAssertionResponse).authenticatorData;\n const signature = (response as AuthenticatorAssertionResponse).signature;\n const userHandle = (response as AuthenticatorAssertionResponse).userHandle;\n\n return {\n id: credential.id,\n rawId: base64UrlEncode(credential.rawId),\n response: {\n authenticatorData: base64UrlEncode(authenticatorData),\n clientDataJSON: base64UrlEncode(clientDataJSON),\n signature: base64UrlEncode(signature),\n ...(userHandle && { userHandle: base64UrlEncode(userHandle) }),\n },\n type: 'public-key',\n };\n}\n","import { createCredentialError } from '../errors';\n\nexport function validateCredentialStructure(\n credential: unknown,\n operation: 'create' | 'get' = 'create'\n): asserts credential is PublicKeyCredential {\n if (\n !credential ||\n typeof credential !== 'object' ||\n !('id' in credential) ||\n !('rawId' in credential) ||\n !('response' in credential)\n ) {\n throw createCredentialError(operation);\n }\n}\n","import type { ClientStatus } from '../types';\n\nexport function isWebAuthnSupported(): boolean {\n try {\n if (typeof navigator === 'undefined' || !navigator.credentials) {\n return false;\n }\n\n if (typeof PublicKeyCredential === 'undefined') {\n return false;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isPlatformAuthenticatorAvailable(): Promise<boolean> {\n try {\n if (!isWebAuthnSupported()) {\n return false;\n }\n\n if (typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function') {\n return false;\n }\n\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n } catch {\n return false;\n }\n}\n\nexport async function getClientStatus(): Promise<ClientStatus> {\n const isPasskeySupported = isWebAuthnSupported();\n const platformAuthenticatorAvailable = await isPlatformAuthenticatorAvailable();\n\n return {\n isPasskeySupported,\n platformAuthenticatorAvailable,\n recommendedFlow: isPasskeySupported ? 'passkey' : 'fallback',\n };\n}\n","import type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport { isWebAuthnSupported } from '../utils/support';\nimport type { EventEmitter } from './events';\nimport type { TryMellonError } from '../errors';\nimport { mapWebAuthnError, createNotSupportedError, createInvalidArgumentError } from '../errors';\nimport { validateCredentialStructure } from '../utils/validation';\n\nexport type CeremonyOperation = 'register' | 'authenticate';\n\nexport interface InvokeCeremonyContext<\n TStartResult,\n TFinishResult,\n TCeremonyOptions extends CredentialCreationOptions | CredentialRequestOptions,\n> {\n operation: CeremonyOperation;\n eventEmitter: EventEmitter;\n start: () => Promise<Result<TStartResult, TryMellonError>>;\n createOptions: (startResult: TStartResult) => Result<TCeremonyOptions, TryMellonError>;\n invoke: (options: TCeremonyOptions) => Promise<Credential | null>;\n finish: (\n startResult: TStartResult,\n credential: PublicKeyCredential\n ) => Promise<Result<TFinishResult, TryMellonError>>;\n}\n\n/**\n * Orchestrates a generic WebAuthn flow (Ceremony) to remove duplicated code in the SDK.\n * Encapsulates start call, options creation, browser credentials API invocation,\n * base structure validation, and finish call.\n */\nexport async function invokeCeremony<\n TStartResult,\n TFinishResult,\n TCeremonyOptions extends CredentialCreationOptions | CredentialRequestOptions,\n>(\n context: InvokeCeremonyContext<TStartResult, TFinishResult, TCeremonyOptions>\n): Promise<Result<TFinishResult, TryMellonError>> {\n const { operation, eventEmitter, start, createOptions, invoke, finish } = context;\n\n try {\n eventEmitter.emit('start', { type: 'start', operation });\n\n if (!isWebAuthnSupported()) {\n const error = createNotSupportedError();\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n // 1. Obtener challenge del servidor\n const startResult = await start();\n if (!startResult.ok) {\n eventEmitter.emit('error', { type: 'error', error: startResult.error });\n return err(startResult.error);\n }\n\n // 2. Create options\n const optionsResult = createOptions(startResult.value);\n if (!optionsResult.ok) {\n eventEmitter.emit('error', { type: 'error', error: optionsResult.error });\n return err(optionsResult.error);\n }\n\n // 3. Invoke browser\n const credential = (await invoke(optionsResult.value)) as PublicKeyCredential;\n if (!credential) {\n const error = createInvalidArgumentError(\n 'credential',\n `${operation === 'register' ? 'creation' : 'retrieval'} failed`\n );\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n try {\n validateCredentialStructure(credential);\n } catch (e) {\n const error = mapWebAuthnError(e);\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n // 4. Completar en servidor (success lo emite el caller con token/user; 03-eventos-seguridad)\n const finishResult = await finish(startResult.value, credential);\n if (!finishResult.ok) {\n eventEmitter.emit('error', { type: 'error', error: finishResult.error });\n return err(finishResult.error);\n }\n\n return ok(finishResult.value);\n } catch (error) {\n const tryMellonError = mapWebAuthnError(error);\n eventEmitter.emit('error', { type: 'error', error: tryMellonError });\n return err(tryMellonError);\n }\n}\n","import { createInvalidArgumentError, validateBase64Url, mapWebAuthnError } from '../errors';\nimport { base64UrlDecodeToArrayBuffer } from '../utils/base64url';\nimport type { ApiClient } from './api';\nimport type { EventEmitter } from './events';\nimport type {\n RegisterOptions,\n RegisterResult,\n AuthenticateOptions,\n AuthenticateResult,\n RegisterStartResponse,\n AuthStartResponse,\n RegisterFinishRequest,\n} from '../types';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport type { TryMellonError } from '../errors';\nimport { serializeCredentialForAuth, serializeCredentialForRegister } from './webauthn-utils';\nimport { validateCredentialStructure } from '../utils/validation';\nimport { invokeCeremony } from './ceremony';\n\n/**\n * Creates credential creation options for WebAuthn.\n * Converts server response to WebAuthn API format.\n * WebAuthn protocol: challenge and rp.id are taken from the server only; do not override.\n * Exported for use by OnboardingManager (same-device) and CrossDeviceManager (QR registration).\n *\n * @param serverChallengePayload - Value of the `.challenge` property from RegisterStartResponse\n * (the nested object with challenge, user, rp, pubKeyCredParams, etc.). Not the full API response.\n */\nexport function createRegistrationOptions(\n serverChallengePayload: RegisterStartResponse['challenge'],\n authenticatorType?: 'platform' | 'cross-platform'\n): Result<CredentialCreationOptions, TryMellonError> {\n try {\n validateBase64Url(serverChallengePayload.challenge, 'challenge');\n validateBase64Url(serverChallengePayload.user.id, 'user.id');\n\n const challengeBuffer = base64UrlDecodeToArrayBuffer(serverChallengePayload.challenge);\n const userIdBuffer = base64UrlDecodeToArrayBuffer(serverChallengePayload.user.id);\n\n // Construir authenticatorSelection: priorizar servidor, permitir override de authenticatorType\n let authenticatorSelection: AuthenticatorSelectionCriteria = {\n userVerification: 'preferred',\n };\n\n if (serverChallengePayload.authenticatorSelection) {\n // Usar valores del servidor como base\n authenticatorSelection = {\n ...serverChallengePayload.authenticatorSelection,\n };\n }\n\n // Si el usuario especifica authenticatorType, sobrescribir authenticatorAttachment\n if (authenticatorType) {\n authenticatorSelection = {\n ...authenticatorSelection,\n authenticatorAttachment: authenticatorType,\n };\n }\n\n const publicKey: PublicKeyCredentialCreationOptions = {\n rp: {\n id: serverChallengePayload.rp.id,\n name: serverChallengePayload.rp.name,\n },\n user: {\n id: userIdBuffer,\n name: serverChallengePayload.user.name,\n displayName: serverChallengePayload.user.displayName,\n },\n challenge: challengeBuffer,\n pubKeyCredParams: serverChallengePayload.pubKeyCredParams,\n ...(serverChallengePayload.timeout !== undefined && {\n timeout: serverChallengePayload.timeout,\n }),\n attestation: 'none',\n authenticatorSelection,\n ...(serverChallengePayload.excludeCredentials && {\n excludeCredentials: serverChallengePayload.excludeCredentials.map((cred) => ({\n id: base64UrlDecodeToArrayBuffer(cred.id),\n type: cred.type,\n ...(cred.transports && {\n transports: cred.transports as AuthenticatorTransport[],\n }),\n })),\n }),\n };\n\n return ok({ publicKey });\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n}\n\n/**\n * Stateless orchestration: create credential (WebAuthn) → validate structure → serialize for register.\n * Centralizes try/catch and mapWebAuthnError; used by EnrollmentManager and other register flows.\n */\nexport async function createAndSerializeCredentialForRegister(\n serverChallengePayload: RegisterStartResponse['challenge'],\n signal?: AbortSignal\n): Promise<Result<RegisterFinishRequest['credential'], TryMellonError>> {\n const creationOptionsResult = createRegistrationOptions(serverChallengePayload);\n if (!creationOptionsResult.ok) return err(creationOptionsResult.error);\n\n const creationOptions: CredentialCreationOptions = {\n ...creationOptionsResult.value,\n ...(signal !== undefined && { signal }),\n };\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.create(creationOptions);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'create');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n return ok(serializeCredentialForRegister(credential as PublicKeyCredential));\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n}\n\n/**\n * Creates authentication options for WebAuthn.\n * Converts server response to WebAuthn API format.\n * WebAuthn protocol: challenge and rpId are taken from the server only; do not override.\n */\nexport function createAuthenticationOptions(\n challenge: AuthStartResponse['challenge'],\n mediation?: AuthenticateOptions['mediation']\n): Result<CredentialRequestOptions, TryMellonError> {\n try {\n validateBase64Url(challenge.challenge, 'challenge');\n const challengeBuffer = base64UrlDecodeToArrayBuffer(challenge.challenge);\n\n return ok({\n publicKey: {\n challenge: challengeBuffer,\n rpId: challenge.rpId,\n ...(challenge.timeout !== undefined && { timeout: challenge.timeout }),\n userVerification: challenge.userVerification ?? 'preferred',\n ...(challenge.allowCredentials && {\n allowCredentials: challenge.allowCredentials.map((cred) => ({\n id: base64UrlDecodeToArrayBuffer(cred.id),\n type: cred.type,\n ...(cred.transports && {\n transports: cred.transports as AuthenticatorTransport[],\n }),\n })),\n }),\n },\n ...(mediation !== undefined && { mediation }),\n });\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n}\n\n/**\n * Registers a new passkey for a user.\n * Handles the full WebAuthn registration flow.\n */\nexport async function registerPasskey(\n options: RegisterOptions,\n apiClient: ApiClient,\n eventEmitter: EventEmitter\n): Promise<Result<RegisterResult, TryMellonError>> {\n const extId = options.externalUserId ?? options.external_user_id;\n if (!extId || typeof extId !== 'string' || extId.trim() === '') {\n const error = createInvalidArgumentError('externalUserId', 'must be a non-empty string');\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n const result = await invokeCeremony<\n RegisterStartResponse,\n RegisterResult,\n CredentialCreationOptions\n >({\n operation: 'register',\n eventEmitter,\n start: () => apiClient.startRegister({ external_user_id: extId }),\n createOptions: (startResult) =>\n createRegistrationOptions(startResult.challenge, options.authenticatorType),\n invoke: async (ceremonyOptions) => {\n const opts = { ...ceremonyOptions, ...(options.signal && { signal: options.signal }) };\n return navigator.credentials.create(opts);\n },\n finish: async (startResult, credential) => {\n const finishResult = await apiClient.finishRegister({\n session_id: startResult.session_id,\n credential: serializeCredentialForRegister(credential),\n ...(options.successUrl && { success_url: options.successUrl }),\n });\n\n if (!finishResult.ok) return err(finishResult.error);\n\n return ok({\n success: true,\n credentialId: finishResult.value.credential_id,\n credential_id: finishResult.value.credential_id,\n status: finishResult.value.status,\n sessionToken: finishResult.value.session_token,\n user: {\n userId: finishResult.value.user.user_id,\n externalUserId: finishResult.value.user.external_user_id,\n email: finishResult.value.user.email,\n metadata: finishResult.value.user.metadata,\n },\n ...(finishResult.value.redirect_url && { redirectUrl: finishResult.value.redirect_url }),\n });\n },\n });\n\n if (result.ok) {\n eventEmitter.emit('success', {\n type: 'success',\n operation: 'register',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result;\n}\n\n/**\n * Authenticates a user with their passkey.\n * Handles the full WebAuthn authentication flow.\n */\nexport async function authenticatePasskey(\n options: AuthenticateOptions,\n apiClient: ApiClient,\n eventEmitter: EventEmitter\n): Promise<Result<AuthenticateResult, TryMellonError>> {\n const extId = options.externalUserId ?? options.external_user_id;\n const hasUserId = extId !== undefined && typeof extId === 'string' && extId.trim() !== '';\n\n const result = await invokeCeremony<\n AuthStartResponse,\n AuthenticateResult,\n CredentialRequestOptions\n >({\n operation: 'authenticate',\n eventEmitter,\n start: () =>\n apiClient.startAuth(hasUserId ? { external_user_id: (extId as string).trim() } : {}),\n createOptions: (startResult) =>\n createAuthenticationOptions(startResult.challenge, options.mediation),\n invoke: async (ceremonyOptions) => {\n const opts = { ...ceremonyOptions, ...(options.signal && { signal: options.signal }) };\n return navigator.credentials.get(opts);\n },\n finish: async (startResult, credential) => {\n const finishResult = await apiClient.finishAuthentication({\n session_id: startResult.session_id,\n credential: serializeCredentialForAuth(credential),\n ...(options.successUrl && { success_url: options.successUrl }),\n });\n\n if (!finishResult.ok) return err(finishResult.error);\n\n return ok({\n authenticated: finishResult.value.authenticated,\n sessionToken: finishResult.value.session_token,\n user: {\n userId: finishResult.value.user.user_id,\n externalUserId: finishResult.value.user.external_user_id,\n email: finishResult.value.user.email,\n metadata: finishResult.value.user.metadata,\n },\n signals: finishResult.value.signals,\n ...(finishResult.value.redirect_url && { redirectUrl: finishResult.value.redirect_url }),\n });\n },\n });\n\n if (result.ok) {\n eventEmitter.emit('success', {\n type: 'success',\n operation: 'authenticate',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result;\n}\n","export async function waitWithAbort(\n intervalMs: number,\n signal?: AbortSignal\n): Promise<'aborted' | 'completed'> {\n // Fast path when no signal is provided: simple sleep.\n if (!signal) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n return 'completed';\n }\n\n if (signal.aborted) {\n return 'aborted';\n }\n\n return new Promise<'aborted' | 'completed'>((resolve) => {\n const onAbort = () => {\n cleanup();\n resolve('aborted');\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n signal.removeEventListener('abort', onAbort);\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve('completed');\n }, intervalMs);\n\n signal.addEventListener('abort', onAbort);\n });\n}\n","import type { ApiClient } from './api';\nimport type { Result } from '../utils/result';\nimport { err } from '../utils/result';\nimport { createError, mapWebAuthnError } from '../errors';\nimport type { TryMellonError } from '../errors';\nimport type { OnboardingStartOptions, OnboardingCompleteResult } from '../types';\nimport { createRegistrationOptions } from './webauthn';\nimport { serializeCredentialForRegister } from './webauthn-utils';\nimport { validateCredentialStructure } from '../utils/validation';\nimport type { OnboardingRegisterResponseWithChallenge } from './validators';\nimport { waitWithAbort } from './polling-utils';\n\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_POLL_ATTEMPTS = 60; // ~2 minutes\n\nexport class OnboardingManager {\n constructor(private readonly apiClient: ApiClient) {}\n\n /**\n * Executes the full onboarding flow in a single call.\n * 1. Starts onboarding\n * 2. Polls for 'pending_passkey' or 'completed' status\n * 3. If pending_passkey: when API returns challenge, registers passkey (WebAuthn) then completes onboarding\n * 4. If pending_passkey but API does not return challenge: returns NOT_SUPPORTED with onboarding_url for user to complete elsewhere\n */\n async startFlow(\n options: OnboardingStartOptions & { company_name?: string },\n signal?: AbortSignal\n ): Promise<Result<OnboardingCompleteResult, TryMellonError>> {\n const startResult = await this.apiClient.startOnboarding({ user_role: options.user_role });\n if (!startResult.ok) return err(startResult.error);\n\n const { session_id } = startResult.value;\n\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (signal?.aborted) {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n const waitResult = await waitWithAbort(POLL_INTERVAL_MS, signal);\n if (waitResult === 'aborted') {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n const statusResult = await this.apiClient.getOnboardingStatus(session_id);\n if (!statusResult.ok) return err(statusResult.error);\n\n const status = statusResult.value.status;\n const onboarding_url = statusResult.value.onboarding_url;\n\n if (status === 'pending_passkey') {\n const registerInfoResult = await this.apiClient.getOnboardingRegister(session_id);\n if (!registerInfoResult.ok) return err(registerInfoResult.error);\n\n const registerInfo = registerInfoResult.value as OnboardingRegisterResponseWithChallenge;\n\n if (!registerInfo.challenge) {\n return err(\n createError(\n 'NOT_SUPPORTED',\n 'Onboarding requires user action - complete passkey registration at the provided onboarding_url',\n { onboarding_url }\n )\n );\n }\n\n const creationOptionsResult = createRegistrationOptions(registerInfo.challenge);\n if (!creationOptionsResult.ok) return err(creationOptionsResult.error);\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.create(creationOptionsResult.value);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'create');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n let serializedCredential;\n try {\n serializedCredential = serializeCredentialForRegister(credential as PublicKeyCredential);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n const registerPasskeyResult = await this.apiClient.registerOnboardingPasskey(session_id, {\n credential: serializedCredential,\n challenge: registerInfo.challenge.challenge,\n });\n if (!registerPasskeyResult.ok) return err(registerPasskeyResult.error);\n\n const completeResult = await this.apiClient.completeOnboarding(session_id, {\n company_name: options.company_name,\n });\n return completeResult;\n }\n\n if (status === 'completed') {\n const completeResult = await this.apiClient.completeOnboarding(session_id, {\n company_name: options.company_name,\n });\n return completeResult;\n }\n }\n\n return err(createError('TIMEOUT', 'Onboarding timed out'));\n }\n}\n","import type { ContextHash } from '../types';\n\nconst CONTEXT_HASH_KEY = 'trymellon_context_hash';\nconst HEX_BYTES = 32;\nconst CONTEXT_HASH_HEX_REGEX = /^[a-f0-9]{64}$/;\n\n/**\n * Single source of truth for \"valid 64-char hex context hash\".\n * Used when reading from storage and when generating.\n */\nexport function isValidContextHash(value: unknown): value is ContextHash {\n return typeof value === 'string' && CONTEXT_HASH_HEX_REGEX.test(value);\n}\n\n/**\n * Generates a 64-character hex string (32 bytes CSPRNG). No I/O.\n */\nexport function generateContextHash(): string {\n const bytes = new Uint8Array(HEX_BYTES);\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n throw new Error('crypto.getRandomValues is not available');\n }\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hex as ContextHash;\n}\n\nexport interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\n/**\n * In-memory StorageLike for fallback when sessionStorage is unavailable (e.g. private browsing).\n * State is encapsulated in the returned object; no module-level mutable variable.\n */\nexport function createInMemoryStorage(): StorageLike {\n let value: string | null = null;\n return {\n getItem() {\n return value;\n },\n setItem(_, v: string) {\n value = v;\n },\n };\n}\n\nconst inMemoryStorageFallback = createInMemoryStorage();\n\n/**\n * Pure: get existing valid hash from storage or create, persist, and return. Single place for the logic.\n */\nfunction getOrCreateInStorage(storage: StorageLike): string {\n const existing = storage.getItem(CONTEXT_HASH_KEY);\n if (existing && isValidContextHash(existing)) return existing;\n const hash = generateContextHash();\n storage.setItem(CONTEXT_HASH_KEY, hash);\n return hash;\n}\n\n/**\n * Returns existing context hash from storage or creates one, persists it, and returns it.\n * If storage is omitted or throws (e.g. private browsing), uses in-memory fallback (Strategy).\n */\nexport function getOrCreateContextHash(storage?: StorageLike): string {\n const effectiveStorage = storage ?? inMemoryStorageFallback;\n try {\n return getOrCreateInStorage(effectiveStorage);\n } catch {\n return getOrCreateInStorage(inMemoryStorageFallback);\n }\n}\n","import type { ApiClient } from './api';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport { createError } from '../errors';\nimport type { TryMellonError } from '../errors';\nimport type { EnrollOptions, EnrollmentResult } from '../types';\nimport type { StorageLike } from './context-hash';\nimport { getOrCreateContextHash } from './context-hash';\nimport { createAndSerializeCredentialForRegister } from './webauthn';\n\nexport class EnrollmentManager {\n constructor(\n private readonly apiClient: ApiClient,\n private readonly storage?: StorageLike\n ) {}\n\n async enroll(options: EnrollOptions): Promise<Result<EnrollmentResult, TryMellonError>> {\n if (options.signal?.aborted) {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n const effectiveStorage =\n this.storage ?? (typeof sessionStorage !== 'undefined' ? sessionStorage : undefined);\n const contextHash = getOrCreateContextHash(effectiveStorage);\n\n const startResult = await this.apiClient.startEnrollment(options.ticketId, contextHash);\n if (!startResult.ok) return err(startResult.error);\n\n const credentialResult = await createAndSerializeCredentialForRegister(\n startResult.value.challenge,\n options.signal\n );\n if (!credentialResult.ok) return err(credentialResult.error);\n\n const finishResult = await this.apiClient.finishEnrollment(options.ticketId, {\n credential: credentialResult.value,\n context_hash: contextHash,\n });\n if (!finishResult.ok) return err(finishResult.error);\n\n return ok({\n sessionToken: finishResult.value.session_token,\n });\n }\n}\n","import type { ApiClient } from './api';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport { createError, mapWebAuthnError } from '../errors';\nimport type { TryMellonError } from '../errors';\nimport type {\n CrossDeviceInitResult,\n CrossDeviceContextAuth,\n CrossDeviceContextRegistration,\n} from '../types';\nimport { createAuthenticationOptions, createRegistrationOptions } from './webauthn';\nimport { serializeCredentialForAuth, serializeCredentialForRegister } from './webauthn-utils';\nimport { validateCredentialStructure } from '../utils/validation';\nimport { waitWithAbort } from './polling-utils';\n\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_POLL_ATTEMPTS = 60; // ~2 minutes\n\nexport class CrossDeviceManager {\n constructor(private readonly apiClient: ApiClient) {}\n\n /**\n * Initializes a cross-device authentication session.\n * Typically called by the desktop side to get a QR code URL.\n */\n async init(): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n return this.apiClient.initCrossDeviceAuth();\n }\n\n /**\n * Initializes a cross-device registration session (create account via QR).\n * Typically called by the desktop side to get a QR code URL for new users.\n * Pass externalUserId for known users; omit for anonymous registration.\n */\n async initRegistration(options?: {\n externalUserId?: string;\n }): Promise<Result<CrossDeviceInitResult, TryMellonError>> {\n return this.apiClient.initCrossDeviceRegistration(options);\n }\n\n /**\n * High-level helper to poll for session status until it is completed.\n * Typically called by the desktop side after showing the QR code.\n * Pass pollingToken from init() result so the backend can verify the poller is the initiator.\n */\n async waitForSession(\n sessionId: string,\n signal?: AbortSignal,\n pollingToken?: string | null\n ): Promise<\n Result<{ session_token: string; user_id: string; redirectUrl?: string }, TryMellonError>\n > {\n if (signal?.aborted) {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n const statusResult = await this.apiClient.getCrossDeviceStatus(sessionId, pollingToken);\n if (!statusResult.ok) return err(statusResult.error);\n\n if (statusResult.value.status === 'completed') {\n if (!statusResult.value.session_token || !statusResult.value.user_id) {\n return err(createError('UNKNOWN_ERROR', 'Missing data in completed session'));\n }\n const redirectUrl =\n statusResult.value.redirect_url != null && statusResult.value.redirect_url !== ''\n ? statusResult.value.redirect_url\n : undefined;\n return ok({\n session_token: statusResult.value.session_token,\n user_id: statusResult.value.user_id,\n ...(redirectUrl !== undefined && { redirectUrl }),\n });\n }\n\n const waitResult = await waitWithAbort(POLL_INTERVAL_MS, signal);\n if (waitResult === 'aborted') {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n }\n\n return err(createError('TIMEOUT', 'Cross-device authentication timed out'));\n }\n\n /**\n * Approves a cross-device session.\n * Typically called by the mobile side after scanning a QR code.\n * Branches by context type: registration → credentials.create + verify-registration;\n * auth → credentials.get + verify.\n */\n async approve(sessionId: string): Promise<Result<void, TryMellonError>> {\n const contextResult = await this.apiClient.getCrossDeviceContext(sessionId);\n if (!contextResult.ok) return err(contextResult.error);\n\n const context = contextResult.value;\n\n if (context.type === 'registration') {\n return this.executeRegistrationApproval(sessionId, context);\n }\n return this.executeAuthApproval(sessionId, context);\n }\n\n /**\n * Executes the registration branch: create credential and verify-registration.\n */\n private async executeRegistrationApproval(\n sessionId: string,\n context: CrossDeviceContextRegistration\n ): Promise<Result<void, TryMellonError>> {\n const creationOptionsResult = createRegistrationOptions(context.options);\n if (!creationOptionsResult.ok) return err(creationOptionsResult.error);\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.create(creationOptionsResult.value);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'create');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n let serializedCredential;\n try {\n serializedCredential = serializeCredentialForRegister(credential as PublicKeyCredential);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n return this.apiClient.verifyCrossDeviceRegistration({\n session_id: sessionId,\n credential: serializedCredential,\n });\n }\n\n /**\n * Executes the auth branch: get credential and verify.\n */\n private async executeAuthApproval(\n sessionId: string,\n context: CrossDeviceContextAuth\n ): Promise<Result<void, TryMellonError>> {\n const requestOptionsResult = createAuthenticationOptions(context.options);\n if (!requestOptionsResult.ok) return err(requestOptionsResult.error);\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.get(requestOptionsResult.value);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'get');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n let serializedCredential;\n try {\n serializedCredential = serializeCredentialForAuth(credential as PublicKeyCredential);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n return this.apiClient.verifyCrossDeviceAuth({\n session_id: sessionId,\n credential: serializedCredential,\n });\n }\n}\n","import type { ApiClient, BridgeKind } from './api';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport { createError, createInvalidArgumentError, mapWebAuthnError } from '../errors';\nimport type { TryMellonError } from '../errors';\nimport type {\n BridgeContextResponse,\n BridgeChallengeResponse,\n BridgeResult,\n BridgeEnrollmentResult,\n BridgeAuthResult,\n BridgeCompleteOptions,\n BridgeStatusSnapshot,\n} from '../types';\nimport type {\n BridgeCompleteEnrollmentResult,\n BridgeCompleteAuthResult,\n RegisterStartResponse,\n AuthStartResponse,\n} from '../types';\nimport type { StorageLike } from './context-hash';\nimport { getOrCreateContextHash } from './context-hash';\nimport { createRegistrationOptions, createAuthenticationOptions } from './webauthn';\nimport { serializeCredentialForRegister, serializeCredentialForAuth } from './webauthn-utils';\nimport { validateCredentialStructure } from '../utils/validation';\n\n// ---------------------------------------------------------------------------\n// Pure helpers (stateless, testable)\n// ---------------------------------------------------------------------------\n\nconst BRIDGE_TERMINAL_STATUSES: ReadonlySet<BridgeStatusSnapshot['status']> = new Set([\n 'pin_verified',\n 'pin_locked',\n 'completed',\n]);\n\nconst BRIDGE_POLL_INTERVAL_MS = 1500;\nconst BRIDGE_WAIT_DEFAULT_TIMEOUT_MS = 300_000;\n\nfunction isTerminalBridgeStatus(status: BridgeStatusSnapshot['status']): boolean {\n return BRIDGE_TERMINAL_STATUSES.has(status);\n}\n\n/** Validates sessionId for bridge calls. Single place for guard. */\nexport function validateBridgeSessionId(sessionId: unknown): Result<string, TryMellonError> {\n if (sessionId == null || typeof sessionId !== 'string' || sessionId.trim() === '') {\n return err(createInvalidArgumentError('sessionId', 'must be a non-empty string'));\n }\n return ok(sessionId.trim());\n}\n\n/** Maps API complete-enrollment response to public result. Pure. */\nexport function toBridgeEnrollmentResult(\n apiResult: BridgeCompleteEnrollmentResult\n): BridgeEnrollmentResult {\n return {\n sessionToken: apiResult.session_token,\n credentialId: apiResult.credential_id,\n userId: apiResult.user_id,\n entityId: apiResult.entity_id,\n };\n}\n\n/** Maps API complete-auth response to public result. Pure. */\nexport function toBridgeAuthResult(apiResult: BridgeCompleteAuthResult): BridgeAuthResult {\n return { sessionToken: apiResult.session_token };\n}\n\n/** Resolves PIN from options and calls verifyBridgePin. Single async step for PIN flow. */\nasync function resolvePinAndVerify(\n apiClient: ApiClient,\n sessionId: string,\n kind: BridgeKind,\n options: BridgeCompleteOptions\n): Promise<Result<BridgeChallengeResponse, TryMellonError>> {\n const presencePin =\n options.presencePin != null && options.presencePin !== '' ? options.presencePin : null;\n const pin =\n presencePin ??\n (typeof options.onPinRequired === 'function' ? await options.onPinRequired() : null);\n if (pin == null || pin === '') {\n return err(\n createError(\n 'INVALID_ARGUMENT',\n 'Bridge requires PIN: provide presencePin or onPinRequired in options'\n )\n );\n }\n return apiClient.verifyBridgePin(sessionId, pin, kind);\n}\n\nexport class BridgeManager {\n constructor(\n private readonly apiClient: ApiClient,\n private readonly storage?: StorageLike\n ) {}\n\n /**\n * Waits until bridge status is terminal (pin_verified | pin_locked | completed).\n * In browser: uses SSE (EventSource) when useSse !== false and EventSource is available; falls back to polling on SSE error or when EventSource is undefined.\n * In Node.js EventSource is not defined (no built-in); only polling is used. No extra dependency is added.\n * Polling: GET status at BRIDGE_POLL_INTERVAL_MS until terminal or timeout.\n * @see BRIDGE_WAIT_DEFAULT_TIMEOUT_MS — default 5 min; pass options.timeoutMs to override.\n */\n async waitForResult(\n sessionId: string,\n options?: { useSse?: boolean; kind?: BridgeKind; timeoutMs?: number }\n ): Promise<Result<BridgeStatusSnapshot, TryMellonError>> {\n const sid = validateBridgeSessionId(sessionId);\n if (!sid.ok) return err(sid.error);\n\n const kind: BridgeKind = options?.kind ?? 'enrollment';\n const useSse = options?.useSse !== false;\n const timeoutMs = options?.timeoutMs ?? BRIDGE_WAIT_DEFAULT_TIMEOUT_MS;\n\n const pollUntilTerminal = async (\n startAt: number\n ): Promise<Result<BridgeStatusSnapshot, TryMellonError>> => {\n for (;;) {\n const statusResult = await this.apiClient.getBridgeStatus(sid.value, kind);\n if (!statusResult.ok) return err(statusResult.error);\n if (isTerminalBridgeStatus(statusResult.value.status)) return ok(statusResult.value);\n if (Date.now() - startAt >= timeoutMs) {\n return err(createError('TIMEOUT', 'Bridge status wait timed out'));\n }\n await new Promise((r) => setTimeout(r, BRIDGE_POLL_INTERVAL_MS));\n }\n };\n\n if (useSse && typeof EventSource !== 'undefined') {\n return new Promise((resolve) => {\n const url = this.apiClient.getBridgeStatusUrl(sid.value, kind);\n let resolved = false;\n\n const onDone = (result: Result<BridgeStatusSnapshot, TryMellonError>) => {\n if (resolved) return;\n resolved = true;\n try {\n es.close();\n } catch {\n /* ignore */\n }\n resolve(result);\n };\n\n let es: EventSource;\n try {\n es = new EventSource(url);\n } catch {\n pollUntilTerminal(Date.now()).then(onDone);\n return;\n }\n\n es.onmessage = (event: MessageEvent) => {\n try {\n const raw = typeof event.data === 'string' ? event.data : String(event.data);\n const parsed = JSON.parse(raw) as unknown;\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n 'status' in parsed &&\n typeof (parsed as Record<string, unknown>).status === 'string'\n ) {\n const status = (parsed as Record<string, unknown>)\n .status as BridgeStatusSnapshot['status'];\n if (isTerminalBridgeStatus(status)) {\n const ts = (parsed as Record<string, unknown>).ts;\n onDone(\n ok({\n status,\n ...(typeof ts === 'string' && { ts }),\n })\n );\n }\n }\n } catch {\n /* ignore malformed event */\n }\n };\n\n es.onerror = () => {\n if (resolved) return;\n try {\n es.close();\n } catch {\n /* ignore */\n }\n pollUntilTerminal(Date.now()).then(onDone);\n };\n });\n }\n\n return pollUntilTerminal(Date.now());\n }\n\n /**\n * Fetches bridge context (type + WebAuthn options). Use kind from the init flow (enrollment-bridge vs auth-bridge).\n */\n async getContext(\n sessionId: string,\n kind: BridgeKind\n ): Promise<Result<BridgeContextResponse, TryMellonError>> {\n const sid = validateBridgeSessionId(sessionId);\n if (!sid.ok) return err(sid.error);\n return this.apiClient.getBridgeContext(sid.value, kind);\n }\n\n /**\n * Verifies presence PIN. Returns challenge and registration/authentication options for the next step.\n */\n async verifyPin(\n sessionId: string,\n pin: string,\n kind: BridgeKind\n ): Promise<Result<BridgeChallengeResponse, TryMellonError>> {\n const sid = validateBridgeSessionId(sessionId);\n if (!sid.ok) return err(sid.error);\n if (pin == null || typeof pin !== 'string' || pin === '') {\n return err(createInvalidArgumentError('pin', 'must be a non-empty string'));\n }\n return this.apiClient.verifyBridgePin(sid.value, pin, kind);\n }\n\n /**\n * Runs the full bridge flow: getContext → (PIN if needed) → verifyPin → WebAuthn ceremony → complete.\n * For enrollment: options.ticketId and options.entityId are required.\n */\n async complete(\n sessionId: string,\n options?: BridgeCompleteOptions\n ): Promise<Result<BridgeResult, TryMellonError>> {\n const sid = validateBridgeSessionId(sessionId);\n if (!sid.ok) return err(sid.error);\n\n const kind: BridgeKind = options?.kind ?? 'enrollment';\n const contextResult = await this.apiClient.getBridgeContext(sid.value, kind);\n if (!contextResult.ok) return err(contextResult.error);\n\n const context = contextResult.value;\n\n const challengeResult = await resolvePinAndVerify(\n this.apiClient,\n sid.value,\n kind,\n options ?? { kind }\n );\n if (!challengeResult.ok) return err(challengeResult.error);\n const challengeResponse = challengeResult.value;\n\n if (options?.signal?.aborted) {\n return err(createError('ABORT_ERROR', 'Operation aborted by user or timeout'));\n }\n\n const expectedKind: BridgeKind = context.type === 'registration' ? 'enrollment' : 'auth';\n if (kind !== expectedKind) {\n return err(\n createError(\n 'INVALID_ARGUMENT',\n `Bridge context type \"${context.type}\" does not match kind \"${kind}\"`\n )\n );\n }\n\n if (context.type === 'registration') {\n if (!options?.ticketId?.trim() || !options?.entityId?.trim()) {\n return err(\n createInvalidArgumentError('ticketId/entityId', 'required for enrollment bridge complete')\n );\n }\n\n const registrationOptions = challengeResponse.registration_options;\n if (!registrationOptions || typeof registrationOptions !== 'object') {\n return err(\n createError('UNKNOWN_ERROR', 'Bridge verify response missing registration_options')\n );\n }\n\n const creationOptionsResult = createRegistrationOptions(\n registrationOptions as RegisterStartResponse['challenge']\n );\n if (!creationOptionsResult.ok) return err(creationOptionsResult.error);\n\n const creationOptions: CredentialCreationOptions = {\n ...creationOptionsResult.value,\n ...(options.signal !== undefined && { signal: options.signal }),\n };\n\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.create(creationOptions);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(credential, 'create');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n const serialized = serializeCredentialForRegister(credential as PublicKeyCredential);\n\n const effectiveStorage =\n this.storage ?? (typeof sessionStorage !== 'undefined' ? sessionStorage : undefined);\n const contextHash = getOrCreateContextHash(effectiveStorage);\n\n const completeResult = await this.apiClient.completeBridgeEnrollment({\n session_id: sid.value,\n ticket_id: options.ticketId,\n entity_id: options.entityId,\n context_hash: contextHash,\n registration_response: {\n id: serialized.id,\n rawId: serialized.rawId,\n response: serialized.response,\n type: serialized.type,\n },\n });\n\n if (!completeResult.ok) return err(completeResult.error);\n return ok(toBridgeEnrollmentResult(completeResult.value));\n }\n\n const authOptions = challengeResponse.authentication_options;\n if (!authOptions || typeof authOptions !== 'object') {\n return err(\n createError('UNKNOWN_ERROR', 'Bridge verify response missing authentication_options')\n );\n }\n\n const requestOptionsResult = createAuthenticationOptions(\n authOptions as AuthStartResponse['challenge']\n );\n if (!requestOptionsResult.ok) return err(requestOptionsResult.error);\n\n const requestOptions: CredentialRequestOptions = {\n ...requestOptionsResult.value,\n ...(options?.signal !== undefined && { signal: options.signal }),\n };\n\n let authCredential: Credential | null;\n try {\n authCredential = await navigator.credentials.get(requestOptions);\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n try {\n validateCredentialStructure(authCredential, 'get');\n } catch (e) {\n return err(mapWebAuthnError(e));\n }\n\n const serializedAuth = serializeCredentialForAuth(authCredential as PublicKeyCredential);\n\n const completeAuthResult = await this.apiClient.completeBridgeAuth({\n session_id: sid.value,\n credential: {\n id: serializedAuth.id,\n rawId: serializedAuth.rawId,\n response: serializedAuth.response,\n type: serializedAuth.type,\n },\n });\n\n if (!completeAuthResult.ok) return err(completeAuthResult.error);\n return ok(toBridgeAuthResult(completeAuthResult.value));\n }\n}\n","import type { EventHandler, EventPayload, TryMellonEvent } from '../types';\n\nexport class EventEmitter {\n private handlers: Map<TryMellonEvent, Set<EventHandler>>;\n\n constructor() {\n this.handlers = new Map();\n }\n\n on(event: TryMellonEvent, handler: EventHandler): () => void {\n let handlersSet = this.handlers.get(event);\n if (!handlersSet) {\n handlersSet = new Set();\n this.handlers.set(event, handlersSet);\n }\n\n handlersSet.add(handler);\n\n return () => {\n this.off(event, handler);\n };\n }\n\n off(event: TryMellonEvent, handler: EventHandler): void {\n const handlersSet = this.handlers.get(event);\n if (!handlersSet) {\n return;\n }\n handlersSet.delete(handler);\n if (handlersSet.size === 0) {\n this.handlers.delete(event);\n }\n }\n\n emit(event: TryMellonEvent, payload: EventPayload): void {\n const handlersSet = this.handlers.get(event);\n if (handlersSet) {\n for (const handler of handlersSet) {\n try {\n handler(payload);\n } catch (e) {\n console.warn('[TryMellon] Event handler threw:', e);\n }\n }\n }\n }\n\n removeAllListeners(): void {\n this.handlers.clear();\n }\n}\n","import type { TelemetrySender, TelemetryPayload } from '../ports/telemetry';\n\n/**\n * Default telemetry sender: sends payload via sendBeacon (or fetch) to the given endpoint.\n * No retries; fire-and-forget.\n */\nexport function createDefaultTelemetrySender(endpoint: string): TelemetrySender {\n return {\n async send(payload: TelemetryPayload): Promise<void> {\n const body = JSON.stringify(payload);\n if (typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') {\n navigator.sendBeacon(endpoint, body);\n return;\n }\n if (typeof fetch !== 'undefined') {\n await fetch(endpoint, {\n method: 'POST',\n body,\n headers: { 'Content-Type': 'application/json' },\n keepalive: true,\n });\n }\n },\n };\n}\n","export type TelemetryEvent = 'register' | 'authenticate';\n\nexport type TelemetryPayload = {\n event: TelemetryEvent;\n latencyMs: number;\n ok: true;\n};\n\nexport interface TelemetrySender {\n send(payload: TelemetryPayload): Promise<void>;\n}\n\n/**\n * Builds the minimal telemetry payload (no PII).\n */\nexport function buildTelemetryPayload(event: TelemetryEvent, latencyMs: number): TelemetryPayload {\n return { event, latencyMs, ok: true };\n}\n","import type { ApiClient } from '../api';\nimport type { EventEmitter } from '../events';\nimport type {\n AuthenticateOptions,\n AuthenticateResult,\n RegisterOptions,\n RegisterResult,\n} from '../../types';\nimport type { Result } from '../../utils/result';\nimport { ok } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { buildTelemetryPayload, type TelemetrySender } from '../ports/telemetry';\nimport { registerPasskey, authenticatePasskey } from '../webauthn';\n\ntype AuthOperation = 'register' | 'authenticate';\n\ntype AuthOptions = RegisterOptions | AuthenticateOptions;\n\nexport class AuthService {\n constructor(\n private readonly apiClient: ApiClient,\n private readonly eventEmitter: EventEmitter,\n private readonly sandbox: boolean,\n private readonly sandboxToken: string,\n private readonly telemetrySender?: TelemetrySender\n ) {}\n\n private async sandboxAuthResult(\n operation: AuthOperation,\n options: AuthOptions\n ): Promise<Result<RegisterResult | AuthenticateResult, TryMellonError>> {\n const externalUserId =\n 'externalUserId' in options\n ? (options.externalUserId ?? options.external_user_id ?? 'sandbox')\n : (options.external_user_id ?? options.externalUserId ?? 'sandbox');\n const externalId = typeof externalUserId === 'string' ? externalUserId : 'sandbox';\n\n if (operation === 'register') {\n return Promise.resolve(\n ok({\n success: true,\n credentialId: '',\n status: 'sandbox',\n sessionToken: this.sandboxToken,\n user: { userId: 'sandbox-user', externalUserId: externalId },\n })\n );\n }\n\n return Promise.resolve(\n ok({\n authenticated: true,\n sessionToken: this.sandboxToken,\n user: { userId: 'sandbox-user', externalUserId: externalId },\n })\n );\n }\n\n async register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>> {\n if (this.sandbox) {\n const result = await this.sandboxAuthResult('register', options);\n if (result.ok) {\n this.eventEmitter.emit('success', {\n type: 'success',\n operation: 'register',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result as Result<RegisterResult, TryMellonError>;\n }\n\n const start = Date.now();\n const result = await registerPasskey(options, this.apiClient, this.eventEmitter);\n if (result.ok && this.telemetrySender) {\n this.telemetrySender\n .send(buildTelemetryPayload('register', Date.now() - start))\n .catch((e) => console.warn('[TryMellon] Telemetry send failed', e));\n }\n return result;\n }\n\n async authenticate(\n options: AuthenticateOptions\n ): Promise<Result<AuthenticateResult, TryMellonError>> {\n if (this.sandbox) {\n const result = await this.sandboxAuthResult('authenticate', options);\n if (result.ok) {\n this.eventEmitter.emit('success', {\n type: 'success',\n operation: 'authenticate',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result as Result<AuthenticateResult, TryMellonError>;\n }\n\n const start = Date.now();\n const result = await authenticatePasskey(options, this.apiClient, this.eventEmitter);\n if (result.ok && this.telemetrySender) {\n this.telemetrySender\n .send(buildTelemetryPayload('authenticate', Date.now() - start))\n .catch((e) => console.warn('[TryMellon] Telemetry send failed', e));\n }\n return result;\n }\n}\n","import type { ApiClient } from './api';\nimport type { EventEmitter } from './events';\nimport type { RecoverAccountOptions, RecoverAccountResult, RecoveryVerifyResponse } from '../types';\nimport type { Result } from '../utils/result';\nimport { ok, err } from '../utils/result';\nimport type { TryMellonError } from '../errors';\nimport { createInvalidArgumentError } from '../errors';\nimport { serializeCredentialForRegister } from './webauthn-utils';\nimport { createRegistrationOptions } from './webauthn';\nimport { invokeCeremony } from './ceremony';\n\n/**\n * Recovers an account using an email OTP and creates a new passkey credential.\n * Manages the complete orchestrated WebAuthn registration flow for recovery.\n */\nexport async function recoverAccount(\n options: RecoverAccountOptions,\n apiClient: ApiClient,\n eventEmitter: EventEmitter\n): Promise<Result<RecoverAccountResult, TryMellonError>> {\n const extId = options.externalUserId ?? options.external_user_id;\n if (!extId || typeof extId !== 'string' || extId.trim() === '') {\n const error = createInvalidArgumentError('externalUserId', 'must be a non-empty string');\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n if (!options.otp || typeof options.otp !== 'string' || options.otp.trim().length !== 6) {\n const error = createInvalidArgumentError('otp', 'must be a 6-digit string');\n eventEmitter.emit('error', { type: 'error', error });\n return err(error);\n }\n\n const result = await invokeCeremony<\n RecoveryVerifyResponse,\n RecoverAccountResult,\n CredentialCreationOptions\n >({\n operation: 'register',\n eventEmitter,\n start: () => apiClient.verifyAccountRecoveryOtp(extId, options.otp),\n createOptions: (startResult) => {\n const c = startResult.challenge;\n if (\n !c ||\n typeof c !== 'object' ||\n !('rp' in c) ||\n !('user' in c) ||\n !('challenge' in c) ||\n !('pubKeyCredParams' in c)\n ) {\n return err(createInvalidArgumentError('challenge', 'invalid recovery challenge structure'));\n }\n return createRegistrationOptions(c as Parameters<typeof createRegistrationOptions>[0]);\n },\n invoke: async (ceremonyOptions) => navigator.credentials.create(ceremonyOptions),\n finish: async (startResult, credential) => {\n const finishResult = await apiClient.completeAccountRecovery(\n startResult.recovery_session_id,\n serializeCredentialForRegister(credential)\n );\n\n if (!finishResult.ok) return err(finishResult.error);\n\n const {\n credential_id,\n status,\n session_token,\n user: userPayload,\n redirect_url,\n } = finishResult.value;\n return ok({\n success: true,\n credentialId: credential_id,\n status,\n sessionToken: session_token,\n user: {\n userId: userPayload.user_id,\n externalUserId: userPayload.external_user_id,\n email: userPayload.email,\n metadata: userPayload.metadata,\n },\n ...(redirect_url !== undefined && { redirectUrl: redirect_url }),\n });\n },\n });\n\n if (result.ok) {\n eventEmitter.emit('success', {\n type: 'success',\n operation: 'register',\n token: result.value.sessionToken,\n user: result.value.user,\n });\n }\n return result;\n}\n","import type { ApiClient } from '../api';\nimport type { EventEmitter } from '../events';\nimport type { RecoverAccountOptions, RecoverAccountResult } from '../../types';\nimport type { Result } from '../../utils/result';\nimport type { TryMellonError } from '../../errors';\nimport { recoverAccount } from '../recover';\n\nexport class RecoveryService {\n constructor(\n private readonly apiClient: ApiClient,\n private readonly eventEmitter: EventEmitter\n ) {}\n\n recover(options: RecoverAccountOptions): Promise<Result<RecoverAccountResult, TryMellonError>> {\n return recoverAccount(options, this.apiClient, this.eventEmitter);\n }\n}\n","import { ApiClient } from './api';\nimport { FetchHttpClient } from './fetch-client';\nimport { OnboardingManager } from './onboarding-manager';\nimport { EnrollmentManager } from './enrollment-manager';\nimport { CrossDeviceManager } from './cross-device-manager';\nimport { BridgeManager } from './bridge-manager';\nimport { getOrCreateContextHash } from './context-hash';\nimport { EventEmitter } from './events';\nimport { isWebAuthnSupported, getClientStatus } from '../utils/support';\nimport { validateUrl, validateRange, createInvalidArgumentError } from '../errors';\nimport {\n DEFAULT_API_BASE_URL,\n DEFAULT_TIMEOUT_MS,\n DEFAULT_MAX_RETRIES,\n DEFAULT_RETRY_DELAY_MS,\n DEFAULT_TELEMETRY_ENDPOINT,\n MIN_TIMEOUT_MS,\n MAX_TIMEOUT_MS,\n MIN_MAX_RETRIES,\n MAX_MAX_RETRIES,\n MIN_RETRY_DELAY_MS,\n MAX_RETRY_DELAY_MS,\n SANDBOX_SESSION_TOKEN,\n} from './constants';\nimport { createDefaultTelemetrySender } from './adapters/telemetry-sender';\nimport type { TelemetrySender } from './ports/telemetry';\nimport type {\n TryMellonConfig,\n RegisterOptions,\n RegisterResult,\n AuthenticateOptions,\n AuthenticateResult,\n ClientStatus,\n TryMellonEvent,\n EventHandler,\n EmailFallbackStartOptions,\n EmailFallbackVerifyOptions,\n EmailFallbackVerifyResult,\n SessionValidateResponse,\n RecoverAccountOptions,\n EnrollOptions,\n EnrollmentResult,\n BridgeContextResponse,\n BridgeChallengeResponse,\n BridgeResult,\n BridgeCompleteOptions,\n BridgeStatusSnapshot,\n} from '../types';\nimport { ok, err, type Result } from '../utils/result';\nimport { type TryMellonError, isTryMellonError } from '../errors';\nimport { AuthService } from './services/auth-service';\nimport { RecoveryService } from './services/recovery-service';\n\ndeclare const __VERSION__: string;\n\nexport class TryMellon {\n private readonly sandbox: boolean;\n private readonly sandboxToken: string;\n private apiClient: ApiClient;\n private eventEmitter: EventEmitter;\n private telemetrySender: TelemetrySender | undefined;\n private crossDeviceManager: CrossDeviceManager;\n private authService: AuthService;\n private recoveryService: RecoveryService;\n public onboarding: OnboardingManager;\n private readonly enrollmentManager: EnrollmentManager;\n private readonly bridgeManager: BridgeManager;\n private readonly contextHashStorage: TryMellonConfig['contextHashStorage'];\n\n private static validateConfig(config: TryMellonConfig): void {\n const { appId, publishableKey } = config;\n\n if (!appId || typeof appId !== 'string' || appId.trim() === '') {\n throw createInvalidArgumentError('appId', 'must be a non-empty string');\n }\n if (!publishableKey || typeof publishableKey !== 'string' || publishableKey.trim() === '') {\n throw createInvalidArgumentError('publishableKey', 'must be a non-empty string');\n }\n\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n validateUrl(apiBaseUrl, 'apiBaseUrl');\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n validateRange(timeoutMs, 'timeoutMs', MIN_TIMEOUT_MS, MAX_TIMEOUT_MS);\n\n if (config.maxRetries !== undefined) {\n validateRange(config.maxRetries, 'maxRetries', MIN_MAX_RETRIES, MAX_MAX_RETRIES);\n }\n\n if (config.retryDelayMs !== undefined) {\n validateRange(config.retryDelayMs, 'retryDelayMs', MIN_RETRY_DELAY_MS, MAX_RETRY_DELAY_MS);\n }\n }\n\n static create(config: TryMellonConfig): Result<TryMellon, TryMellonError> {\n try {\n TryMellon.validateConfig(config);\n return ok(new TryMellon(config));\n } catch (e) {\n if (isTryMellonError(e)) {\n return err(e);\n }\n return err(createInvalidArgumentError('config', (e as Error).message));\n }\n }\n\n /**\n * @deprecated Use `TryMellon.create(config)` instead to handle validation errors safely.\n * This constructor will throw errors if configuration is invalid.\n */\n constructor(config: TryMellonConfig) {\n this.sandbox = config.sandbox === true;\n this.sandboxToken =\n this.sandbox && config.sandboxToken != null && config.sandboxToken !== ''\n ? config.sandboxToken\n : SANDBOX_SESSION_TOKEN;\n\n TryMellon.validateConfig(config);\n\n const appId = config.appId as string;\n const publishableKey = config.publishableKey as string;\n const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n const retryDelayMs = config.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n const httpClient = new FetchHttpClient(timeoutMs, maxRetries, retryDelayMs, config.logger);\n\n const originHeader =\n config.origin ??\n (typeof window !== 'undefined' && window?.location?.origin\n ? window.location.origin\n : undefined);\n\n const defaultHeaders: Record<string, string> = {\n 'X-App-Id': appId.trim(),\n Authorization: `Bearer ${publishableKey.trim()}`,\n ...(originHeader && { Origin: originHeader }),\n };\n\n this.apiClient = new ApiClient(httpClient, apiBaseUrl, defaultHeaders);\n this.eventEmitter = new EventEmitter();\n\n if (config.enableTelemetry) {\n this.telemetrySender =\n config.telemetrySender ??\n createDefaultTelemetrySender(config.telemetryEndpoint ?? DEFAULT_TELEMETRY_ENDPOINT);\n }\n\n this.authService = new AuthService(\n this.apiClient,\n this.eventEmitter,\n this.sandbox,\n this.sandboxToken,\n this.telemetrySender\n );\n this.recoveryService = new RecoveryService(this.apiClient, this.eventEmitter);\n this.contextHashStorage = config.contextHashStorage;\n this.onboarding = new OnboardingManager(this.apiClient);\n this.enrollmentManager = new EnrollmentManager(this.apiClient, this.contextHashStorage);\n this.crossDeviceManager = new CrossDeviceManager(this.apiClient);\n this.bridgeManager = new BridgeManager(this.apiClient, this.contextHashStorage);\n }\n\n /**\n * Bridge (KP-BRIDGE-04): complete enrollment or auth from a second device (e.g. mobile scanning desktop QR).\n * Use kind 'enrollment' for enrollment-bridge sessions, 'auth' for auth-bridge sessions.\n */\n get bridge(): {\n getContext(\n sessionId: string,\n kind: 'enrollment' | 'auth'\n ): Promise<import('../utils/result').Result<BridgeContextResponse, TryMellonError>>;\n verifyPin(\n sessionId: string,\n pin: string,\n kind: 'enrollment' | 'auth'\n ): Promise<import('../utils/result').Result<BridgeChallengeResponse, TryMellonError>>;\n complete(\n sessionId: string,\n options?: BridgeCompleteOptions\n ): Promise<import('../utils/result').Result<BridgeResult, TryMellonError>>;\n waitForResult(\n sessionId: string,\n options?: { useSse?: boolean; kind?: 'enrollment' | 'auth'; timeoutMs?: number }\n ): Promise<import('../utils/result').Result<BridgeStatusSnapshot, TryMellonError>>;\n } {\n return {\n getContext: (sessionId, kind) => this.bridgeManager.getContext(sessionId, kind),\n verifyPin: (sessionId, pin, kind) => this.bridgeManager.verifyPin(sessionId, pin, kind),\n complete: (sessionId, options) => this.bridgeManager.complete(sessionId, options),\n waitForResult: (sessionId, options) => this.bridgeManager.waitForResult(sessionId, options),\n };\n }\n\n static isSupported(): boolean {\n return isWebAuthnSupported();\n }\n\n async register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>> {\n return this.authService.register(options);\n }\n\n async authenticate(\n options: AuthenticateOptions\n ): Promise<Result<AuthenticateResult, TryMellonError>> {\n return this.authService.authenticate(options);\n }\n\n async enroll(options: EnrollOptions): Promise<Result<EnrollmentResult, TryMellonError>> {\n this.eventEmitter.emit('start', { type: 'start', operation: 'enroll' });\n const result = await this.enrollmentManager.enroll(options);\n if (result.ok) {\n this.eventEmitter.emit('success', {\n type: 'success',\n operation: 'enroll',\n token: result.value.sessionToken,\n });\n } else {\n this.eventEmitter.emit('error', {\n type: 'error',\n operation: 'enroll',\n error: result.error,\n });\n }\n return result;\n }\n\n getContextHash(): string {\n const storage =\n this.contextHashStorage ??\n (typeof sessionStorage !== 'undefined' ? sessionStorage : undefined);\n return getOrCreateContextHash(storage);\n }\n\n async validateSession(\n sessionToken: string\n ): Promise<Result<SessionValidateResponse, TryMellonError>> {\n if (this.sandbox && sessionToken === this.sandboxToken) {\n return Promise.resolve(\n ok({\n valid: true,\n userId: 'sandbox-user',\n externalUserId: 'sandbox',\n tenantId: 'sandbox-tenant',\n appId: 'sandbox-app',\n })\n );\n }\n return this.apiClient.validateSession(sessionToken);\n }\n\n async getStatus(): Promise<ClientStatus> {\n return getClientStatus();\n }\n\n on(event: TryMellonEvent, handler: EventHandler): () => void {\n return this.eventEmitter.on(event, handler);\n }\n\n version(): string {\n return typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0';\n }\n\n fallback = {\n email: {\n start: async (options: EmailFallbackStartOptions): Promise<Result<void, TryMellonError>> => {\n return this.apiClient.startEmailFallback(options);\n },\n verify: async (\n options: EmailFallbackVerifyOptions\n ): Promise<Result<EmailFallbackVerifyResult, TryMellonError>> => {\n const result = await this.apiClient.verifyEmailCode({\n userId: options.userId,\n code: options.code,\n ...(options.successUrl && { successUrl: options.successUrl }),\n });\n if (!result.ok) return result;\n return ok({\n sessionToken: result.value.sessionToken,\n ...(result.value.redirectUrl && { redirectUrl: result.value.redirectUrl }),\n });\n },\n },\n };\n\n auth = {\n crossDevice: {\n init: () => this.crossDeviceManager.init(),\n initRegistration: (options?: { externalUserId?: string }) =>\n this.crossDeviceManager.initRegistration(options ?? {}),\n waitForSession: (sessionId: string, signal?: AbortSignal, pollingToken?: string | null) =>\n this.crossDeviceManager.waitForSession(sessionId, signal, pollingToken),\n getContext: (sessionId: string) => this.apiClient.getCrossDeviceContext(sessionId),\n approve: (sessionId: string) => this.crossDeviceManager.approve(sessionId),\n },\n recoverAccount: (options: RecoverAccountOptions) => this.recoveryService.recover(options),\n };\n}\n","/* eslint-disable no-console -- This adapter implements Logger by forwarding to console. */\nimport type { Logger } from '../ports/logger';\n\ntype ConsoleFn = (message: string, ...args: unknown[]) => void;\n\nfunction log(fn: ConsoleFn, message: string, meta?: Record<string, unknown>): void {\n if (meta && Object.keys(meta).length > 0) {\n fn(`[TryMellon] ${message}`, meta);\n } else {\n fn(`[TryMellon] ${message}`);\n }\n}\n\nexport class ConsoleLogger implements Logger {\n debug(message: string, meta?: Record<string, unknown>): void {\n log(console.debug, message, meta);\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n log(console.info, message, meta);\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n log(console.warn, message, meta);\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n log(console.error, message, meta);\n }\n}\n"]}
|