vesant-sdk 1.4.2 → 1.4.4
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/compliance/index.js +18 -24
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/index.mjs +18 -24
- package/dist/compliance/index.mjs.map +1 -1
- package/dist/decisions/index.js +1 -1
- package/dist/decisions/index.js.map +1 -1
- package/dist/decisions/index.mjs +1 -1
- package/dist/decisions/index.mjs.map +1 -1
- package/dist/geolocation/index.js +1 -1
- package/dist/geolocation/index.js.map +1 -1
- package/dist/geolocation/index.mjs +1 -1
- package/dist/geolocation/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +18 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -24
- package/dist/index.mjs.map +1 -1
- package/dist/kyc/core.js +1 -1
- package/dist/kyc/core.js.map +1 -1
- package/dist/kyc/core.mjs +1 -1
- package/dist/kyc/core.mjs.map +1 -1
- package/dist/kyc/index.js +1 -1
- package/dist/kyc/index.js.map +1 -1
- package/dist/kyc/index.mjs +1 -1
- package/dist/kyc/index.mjs.map +1 -1
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +1 -1
- package/dist/react.mjs.map +1 -1
- package/dist/risk-profile/index.d.mts +0 -4
- package/dist/risk-profile/index.d.ts +0 -4
- package/dist/risk-profile/index.js +13 -22
- package/dist/risk-profile/index.js.map +1 -1
- package/dist/risk-profile/index.mjs +13 -22
- package/dist/risk-profile/index.mjs.map +1 -1
- package/dist/scores/index.js +1 -1
- package/dist/scores/index.js.map +1 -1
- package/dist/scores/index.mjs +1 -1
- package/dist/scores/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/errors.ts","../../src/core/circuit-breaker.ts","../../src/core/rate-limiter.ts","../../src/core/logger.ts","../../src/core/version.ts","../../src/shared/browser-utils.ts","../../src/core/client.ts","../../src/geolocation/ciphertext.ts","../../src/geolocation/client.ts","../../src/risk-profile/client.ts","../../src/compliance/types.ts","../../src/compliance/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Error hierarchy for CGS SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class CGSError extends Error {\n public requestId?: string;\n\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'CGSError';\n Object.setPrototypeOf(this, CGSError.prototype);\n }\n}\n\nexport class NetworkError extends CGSError {\n constructor(message: string, public originalError?: unknown) {\n super(message, 'NETWORK_ERROR', undefined, { originalError });\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\nexport class ValidationError extends CGSError {\n constructor(message: string, fields?: string[]) {\n super(message, 'VALIDATION_ERROR', 400, { fields });\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class ServiceUnavailableError extends CGSError {\n constructor(message: string) {\n super(`${message} is unavailable`, 'SERVICE_UNAVAILABLE', 503, { service: message });\n this.name = 'ServiceUnavailableError';\n Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n }\n}\n\nexport class ComplianceBlockedError extends CGSError {\n constructor(reasons: string[]) {\n super('Access blocked due to compliance rules', 'COMPLIANCE_BLOCKED', 403, { reasons });\n this.name = 'ComplianceBlockedError';\n Object.setPrototypeOf(this, ComplianceBlockedError.prototype);\n }\n}\n\nexport class AuthenticationError extends CGSError {\n constructor(message: string = 'Authentication failed') {\n super(message, 'AUTHENTICATION_ERROR', 401);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\nexport class RateLimitError extends CGSError {\n constructor(public retryAfter?: number) {\n super('Rate limit exceeded', 'RATE_LIMIT_EXCEEDED', 429, { retryAfter });\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\nexport class TimeoutError extends CGSError {\n constructor(public timeout: number) {\n super(`Request timeout after ${timeout}ms`, 'TIMEOUT', 408, { timeout });\n this.name = 'TimeoutError';\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\nexport class ComplianceError extends CGSError {\n constructor(\n message: string,\n public originalError?: unknown,\n code: string = 'COMPLIANCE_ERROR'\n ) {\n super(message, code, undefined, { originalError });\n this.name = 'ComplianceError';\n Object.setPrototypeOf(this, ComplianceError.prototype);\n }\n}\n\nexport class CircuitBreakerOpenError extends CGSError {\n constructor() {\n super('Circuit breaker is open — requests are temporarily blocked', 'CIRCUIT_BREAKER_OPEN', 503);\n this.name = 'CircuitBreakerOpenError';\n Object.setPrototypeOf(this, CircuitBreakerOpenError.prototype);\n }\n}\n","/**\n * Circuit breaker pattern for resilient HTTP requests.\n *\n * States: closed (normal) -> open (failing) -> half-open (testing) -> closed\n */\n\nexport type CircuitBreakerState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n /** Number of consecutive failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms to wait before transitioning from open to half-open (default: 30000) */\n resetTimeout?: number;\n /** Number of successes in half-open state before closing (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreakerStatus {\n state: CircuitBreakerState;\n failures: number;\n successes: number;\n lastFailureTime: number | null;\n nextRetryTime: number | null;\n}\n\nexport class CircuitBreaker {\n private state: CircuitBreakerState = 'closed';\n private failures = 0;\n private successes = 0;\n private lastFailureTime: number | null = null;\n\n private readonly failureThreshold: number;\n private readonly resetTimeout: number;\n private readonly successThreshold: number;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.failureThreshold = config.failureThreshold ?? 5;\n this.resetTimeout = config.resetTimeout ?? 30000;\n this.successThreshold = config.successThreshold ?? 1;\n }\n\n /**\n * Check if a request can proceed through the circuit breaker.\n */\n canExecute(): boolean {\n if (this.state === 'closed') {\n return true;\n }\n\n if (this.state === 'open') {\n const now = Date.now();\n if (this.lastFailureTime && now - this.lastFailureTime >= this.resetTimeout) {\n this.state = 'half-open';\n this.successes = 0;\n return true;\n }\n return false;\n }\n\n // half-open: allow requests through for testing\n return true;\n }\n\n /**\n * Record a successful request.\n */\n onSuccess(): void {\n if (this.state === 'half-open') {\n this.successes++;\n if (this.successes >= this.successThreshold) {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n } else if (this.state === 'closed') {\n this.failures = 0;\n }\n }\n\n /**\n * Record a failed request.\n */\n onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.state === 'half-open') {\n this.state = 'open';\n this.successes = 0;\n } else if (this.state === 'closed' && this.failures >= this.failureThreshold) {\n this.state = 'open';\n }\n }\n\n /**\n * Get current circuit breaker status.\n */\n getStatus(): CircuitBreakerStatus {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n nextRetryTime:\n this.state === 'open' && this.lastFailureTime\n ? this.lastFailureTime + this.resetTimeout\n : null,\n };\n }\n\n /**\n * Reset the circuit breaker to its initial closed state.\n */\n reset(): void {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n}\n","/**\n * Rate limit tracking from API response headers.\n *\n * Tracks X-RateLimit-* headers to enable pre-flight checks\n * before making requests.\n */\n\nexport interface RateLimitStatus {\n /** Maximum requests allowed in the window */\n limit: number | null;\n /** Remaining requests in the current window */\n remaining: number | null;\n /** Unix timestamp (seconds) when the rate limit resets */\n reset: number | null;\n /** Seconds until the rate limit resets */\n retryAfter: number | null;\n}\n\nexport class RateLimitTracker {\n private limit: number | null = null;\n private remaining: number | null = null;\n private reset: number | null = null;\n private retryAfter: number | null = null;\n\n /**\n * Extract rate limit information from response headers.\n */\n updateFromHeaders(headers: Headers): void {\n const limit = headers.get('x-ratelimit-limit');\n const remaining = headers.get('x-ratelimit-remaining');\n const reset = headers.get('x-ratelimit-reset');\n const retryAfter = headers.get('retry-after');\n\n if (limit !== null) this.limit = parseInt(limit, 10);\n if (remaining !== null) this.remaining = parseInt(remaining, 10);\n if (reset !== null) this.reset = parseInt(reset, 10);\n if (retryAfter !== null) this.retryAfter = parseInt(retryAfter, 10);\n }\n\n /**\n * Check if the rate limit has been exceeded based on tracked headers.\n */\n isLimitExceeded(): boolean {\n if (this.remaining !== null && this.remaining <= 0) {\n // Check if the reset time has passed\n if (this.reset !== null) {\n const now = Math.floor(Date.now() / 1000);\n if (now >= this.reset) {\n // Reset window has passed, allow requests\n this.remaining = null;\n this.reset = null;\n this.retryAfter = null;\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n /**\n * Get current rate limit status.\n */\n getStatus(): RateLimitStatus {\n return {\n limit: this.limit,\n remaining: this.remaining,\n reset: this.reset,\n retryAfter: this.retryAfter,\n };\n }\n}\n","import type { Logger } from './config';\n\nexport function createConsoleLogger(): Logger {\n return {\n debug(message: string, meta?: Record<string, unknown>) {\n console.log(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n info(message: string, meta?: Record<string, unknown>) {\n console.info(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n error(message: string, meta?: Record<string, unknown>) {\n console.error(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n };\n}\n\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '1.4.1';\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return generateUUID();\n }\n\n const storageKey = 'cgs_device_id';\n let deviceId = localStorage.getItem(storageKey);\n\n if (!deviceId) {\n deviceId = generateUUID();\n localStorage.setItem(storageKey, deviceId);\n }\n\n return deviceId;\n}\n\n/**\n * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n browser: string;\n browser_version: string;\n os: string;\n os_version: string;\n} {\n if (typeof navigator === 'undefined') {\n return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n }\n\n const ua = navigator.userAgent;\n let browser = 'unknown';\n let browserVersion = '';\n let os = 'unknown';\n let osVersion = '';\n\n // Detect browser\n if (ua.includes('Firefox/')) {\n browser = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Edg/')) {\n browser = 'Edge';\n browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Chrome/')) {\n browser = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n browser = 'Safari';\n browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n browser = 'Opera';\n browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n }\n\n // Detect OS\n if (ua.includes('Windows')) {\n os = 'Windows';\n if (ua.includes('Windows NT 10.0')) osVersion = '10';\n else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n } else if (ua.includes('Mac OS X')) {\n os = 'macOS';\n osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n } else if (ua.includes('Linux')) {\n os = 'Linux';\n } else if (ua.includes('Android')) {\n os = 'Android';\n osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n os = 'iOS';\n osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n }\n\n return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n","/**\n * Base HTTP client for all CGS SDK clients\n *\n * Provides common functionality:\n * - Request/response handling\n * - Error handling\n * - Retry logic with exponential backoff\n * - Timeout management\n * - Debug logging\n */\n\nimport type { BaseClientConfig, Logger, RequestInterceptor, RequestOptions } from './config';\nimport {\n CGSError,\n NetworkError,\n TimeoutError,\n AuthenticationError,\n RateLimitError,\n ServiceUnavailableError,\n ValidationError,\n CircuitBreakerOpenError,\n} from './errors';\nimport { CircuitBreaker, type CircuitBreakerStatus } from './circuit-breaker';\nimport { RateLimitTracker, type RateLimitStatus } from './rate-limiter';\nimport { createConsoleLogger } from './logger';\nimport { SDK_VERSION } from './version';\nimport { generateUUID } from '../shared/browser-utils';\n\nexport abstract class BaseClient {\n protected config: BaseClientConfig & { timeout: number; retries: number };\n protected logger: Logger;\n private interceptors: RequestInterceptor[];\n private circuitBreaker: CircuitBreaker | null = null;\n private rateLimitTracker: RateLimitTracker | null = null;\n\n constructor(config: BaseClientConfig) {\n if (!config.baseURL?.trim()) {\n throw new ValidationError('baseURL is required and must be a non-empty string', ['baseURL']);\n }\n if (!config.tenantId?.trim()) {\n throw new ValidationError('tenantId is required and must be a non-empty string', ['tenantId']);\n }\n\n this.interceptors = config.interceptors || [];\n this.logger = config.logger || createConsoleLogger();\n this.config = {\n ...config,\n apiKey: config.apiKey || '',\n headers: config.headers || {},\n timeout: config.timeout || 10000,\n retries: config.retries || 3,\n debug: config.debug || false,\n interceptors: this.interceptors,\n logger: this.logger,\n };\n\n if (config.circuitBreaker) {\n this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n }\n if (config.enableRateLimitTracking) {\n this.rateLimitTracker = new RateLimitTracker();\n }\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n protected async request<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n requestOptions?: RequestOptions\n ): Promise<T> {\n const requestId = generateUUID();\n\n // Circuit breaker check\n if (this.circuitBreaker && !this.circuitBreaker.canExecute()) {\n const error = new CircuitBreakerOpenError();\n error.requestId = requestId;\n throw error;\n }\n\n // Rate limit pre-check\n if (this.rateLimitTracker && this.rateLimitTracker.isLimitExceeded()) {\n const status = this.rateLimitTracker.getStatus();\n const error = new RateLimitError(status.retryAfter ?? undefined);\n error.requestId = requestId;\n throw error;\n }\n\n const url = `${serviceURL || this.config.baseURL}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Tenant-ID': this.config.tenantId,\n 'X-SDK-Version': `vesant-sdk-ts/${SDK_VERSION}`,\n 'X-Request-ID': requestId,\n ...this.config.headers,\n ...((options.headers as Record<string, string>) || {}),\n };\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Sandbox header\n if (this.config.environment === 'sandbox') {\n headers['X-Sandbox'] = 'true';\n }\n\n // Idempotency key for mutating methods\n const method = (options.method || 'GET').toUpperCase();\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n headers['Idempotency-Key'] = requestOptions?.idempotencyKey || generateUUID();\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n // Link consumer AbortSignal to internal controller\n if (requestOptions?.signal) {\n if (requestOptions.signal.aborted) {\n controller.abort();\n } else {\n requestOptions.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n }\n\n try {\n // Run onRequest interceptors\n let finalOptions: RequestInit = { ...options, headers };\n for (const interceptor of this.interceptors) {\n if (interceptor.onRequest) {\n finalOptions = await interceptor.onRequest(url, finalOptions);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug(`${finalOptions.method || 'GET'} ${url}`, {\n headers: finalOptions.headers as Record<string, unknown>,\n body: finalOptions.body as unknown,\n });\n }\n\n const response = await fetch(url, {\n ...finalOptions,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Track rate limit headers\n if (this.rateLimitTracker) {\n this.rateLimitTracker.updateFromHeaders(response.headers);\n }\n\n let data: Record<string, unknown> | undefined;\n try {\n data = await response.json();\n } catch {\n // Non-JSON response (HTML error pages, 204 No Content, etc.)\n if (!response.ok) {\n this.handleErrorResponse(response.status, {\n error: `HTTP ${response.status}`,\n message: response.statusText,\n }, requestId);\n }\n // OK response but no JSON body (e.g., 204)\n this.circuitBreaker?.onSuccess();\n return undefined as unknown as T;\n }\n\n if (!response.ok) {\n this.handleErrorResponse(response.status, data || {}, requestId);\n }\n\n // Record success for circuit breaker\n this.circuitBreaker?.onSuccess();\n\n // Run onResponse interceptors\n let result: unknown = data;\n for (const interceptor of this.interceptors) {\n if (interceptor.onResponse) {\n result = await interceptor.onResponse(url, result);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug('Response:', { data: result });\n }\n\n return result as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Record failure for circuit breaker (skip for client errors)\n if (\n error instanceof CGSError &&\n error.statusCode &&\n error.statusCode >= 500\n ) {\n this.circuitBreaker?.onFailure();\n } else if (error instanceof NetworkError || error instanceof TimeoutError) {\n this.circuitBreaker?.onFailure();\n }\n\n // Attach requestId to CGSError instances\n if (error instanceof CGSError && !error.requestId) {\n error.requestId = requestId;\n }\n\n // Run onError interceptors\n if (error instanceof Error) {\n for (const interceptor of this.interceptors) {\n if (interceptor.onError) {\n await interceptor.onError(url, error);\n }\n }\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n // Distinguish consumer abort from timeout\n if (requestOptions?.signal?.aborted) {\n const abortError = new CGSError('Request aborted', 'REQUEST_ABORTED');\n abortError.requestId = requestId;\n throw abortError;\n }\n this.circuitBreaker?.onFailure();\n const timeoutError = new TimeoutError(this.config.timeout);\n timeoutError.requestId = requestId;\n throw timeoutError;\n }\n if (error instanceof CGSError) {\n throw error;\n }\n }\n\n const networkError = new NetworkError('Network request failed', error);\n networkError.requestId = requestId;\n this.circuitBreaker?.onFailure();\n throw networkError;\n }\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n protected async requestWithRetry<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n retries: number = this.config.retries,\n requestOptions?: RequestOptions\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await this.request<T>(endpoint, options, serviceURL, requestOptions);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error');\n\n // Don't retry on consumer abort\n if (requestOptions?.signal?.aborted) {\n throw lastError;\n }\n\n // Don't retry on client errors (4xx), except 429 (rate limit)\n if (\n lastError instanceof CGSError &&\n lastError.statusCode &&\n lastError.statusCode >= 400 &&\n lastError.statusCode < 500 &&\n lastError.statusCode !== 429\n ) {\n throw lastError;\n }\n\n // Don't retry on last attempt\n if (attempt === retries) {\n break;\n }\n\n // Use Retry-After for 429, otherwise exponential backoff with jitter\n let delay: number;\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n delay = lastError.retryAfter * 1000;\n } else {\n delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n if (this.config.debug) {\n this.logger.debug(`Retry attempt ${attempt + 1}/${retries} after ${delay.toFixed(0)}ms`);\n }\n }\n }\n\n throw new NetworkError(`Request failed after ${retries} retries`, lastError);\n }\n\n /**\n * Handle error responses from API\n */\n protected handleErrorResponse(status: number, data: Record<string, unknown>, requestId?: string): never {\n const message = (data.error as string) || (data.message as string) || `HTTP ${status}`;\n\n const createError = (): CGSError => {\n switch (status) {\n case 400:\n return new CGSError(message, 'BAD_REQUEST', 400, data);\n case 401:\n return new AuthenticationError(message);\n case 403:\n return new CGSError(message, 'FORBIDDEN', 403, data);\n case 404:\n return new CGSError(message, 'NOT_FOUND', 404, data);\n case 429: {\n const retryAfter = (data.retry_after as number | undefined) || (data.retryAfter as number | undefined);\n return new RateLimitError(retryAfter);\n }\n case 500:\n case 502:\n case 503:\n case 504:\n return new ServiceUnavailableError(message);\n default:\n return new CGSError(message, 'UNKNOWN_ERROR', status, data);\n }\n };\n\n const error = createError();\n if (requestId) {\n error.requestId = requestId;\n }\n throw error;\n }\n\n /**\n * Build query string from parameters\n */\n protected buildQueryString(params: Record<string, unknown>): string {\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((item) => query.append(key, String(item)));\n } else {\n query.append(key, String(value));\n }\n }\n });\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<BaseClientConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n headers: {\n ...this.config.headers,\n ...(config.headers || {}),\n },\n };\n if (config.logger) {\n this.logger = config.logger;\n }\n if (config.interceptors) {\n this.interceptors = config.interceptors;\n }\n }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<BaseClientConfig> {\n return { ...this.config };\n }\n\n /**\n * Get rate limit status from tracked response headers.\n */\n getRateLimitStatus(): RateLimitStatus | null {\n return this.rateLimitTracker?.getStatus() ?? null;\n }\n\n /**\n * Get circuit breaker status.\n */\n getCircuitBreakerStatus(): CircuitBreakerStatus | null {\n return this.circuitBreaker?.getStatus() ?? null;\n }\n\n /**\n * Health check endpoint\n */\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n return this.request('/api/v1/health');\n }\n}\n","/**\n * CipherText Generation Utility\n *\n * Collects device fingerprint and location data from the browser,\n * encrypts it into a cipherText that can be validated by the server.\n *\n * The cipherText is used for:\n * - Registration verification\n * - Login verification\n * - Transaction verification\n * - Periodic location checks\n */\n\nimport type {\n CipherTextPayload,\n CipherTextOptions,\n CipherTextResult,\n CipherTextReason,\n GeolocationConfigResponse,\n} from './types';\nimport { SDK_VERSION } from '../core/version';\nimport { getBrowserInfo, generateDeviceId as getOrCreateDeviceId } from '../shared/browser-utils';\n\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Compute HMAC-SHA256 of a message using the given key.\n * Uses Web Crypto API (browser/modern Node) with node:crypto fallback.\n */\nasync function computeHMAC(key: string, message: string): Promise<string> {\n // Try Web Crypto API first (works in browsers and Node 18+)\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const msgData = encoder.encode(message);\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signature = await globalThis.crypto.subtle.sign('HMAC', cryptoKey, msgData);\n const bytes = new Uint8Array(signature);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n // Fallback: Node.js crypto module\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createHmac } = await import('node:crypto');\n return createHmac('sha256', key).update(message).digest('hex');\n}\n\n/**\n * Get WebGL renderer information for fingerprinting\n */\nfunction getWebGLInfo(): { vendor: string; renderer: string } | null {\n if (typeof document === 'undefined') return null;\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n if (!gl) return null;\n\n const debugInfo = (gl as WebGLRenderingContext).getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return null;\n\n return {\n vendor: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '',\n renderer: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get network information if available\n */\nfunction getNetworkInfo(): CipherTextPayload['network'] | undefined {\n if (typeof navigator === 'undefined') return undefined;\n\n const connection = (navigator as any).connection ||\n (navigator as any).mozConnection ||\n (navigator as any).webkitConnection;\n\n if (!connection) return undefined;\n\n return {\n effective_type: connection.effectiveType,\n downlink: connection.downlink,\n rtt: connection.rtt,\n save_data: connection.saveData,\n };\n}\n\n/**\n * Request GPS location from the browser\n */\nasync function requestGPSLocation(\n timeout: number = 10000,\n highAccuracy: boolean = true\n): Promise<CipherTextPayload['location'] | null> {\n if (typeof navigator === 'undefined' || !navigator.geolocation) {\n return null;\n }\n\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const { latitude, longitude, accuracy } = position.coords;\n\n // Validate coordinates\n if (latitude < -90 || latitude > 90) {\n resolve(null);\n return;\n }\n if (longitude < -180 || longitude > 180) {\n resolve(null);\n return;\n }\n if (accuracy !== null && accuracy !== undefined && accuracy <= 0) {\n resolve(null);\n return;\n }\n\n resolve({\n latitude,\n longitude,\n accuracy,\n altitude: position.coords.altitude ?? undefined,\n altitude_accuracy: position.coords.altitudeAccuracy ?? undefined,\n heading: position.coords.heading ?? undefined,\n speed: position.coords.speed ?? undefined,\n timestamp: position.timestamp,\n });\n },\n () => {\n // Location denied or error - resolve with null (non-fatal)\n resolve(null);\n },\n {\n enableHighAccuracy: highAccuracy,\n timeout: timeout,\n maximumAge: 0,\n }\n );\n });\n}\n\n/**\n * Collect device fingerprint data\n */\nfunction collectDeviceData(includeWebGL: boolean): CipherTextPayload['device'] {\n const browserInfo = getBrowserInfo();\n const webglInfo = includeWebGL ? getWebGLInfo() : null;\n\n return {\n device_id: getOrCreateDeviceId(),\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n platform: typeof navigator !== 'undefined' ? navigator.platform : '',\n browser: browserInfo.browser,\n browser_version: browserInfo.browser_version,\n os: browserInfo.os,\n os_version: browserInfo.os_version,\n screen_resolution:\n typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n color_depth: typeof screen !== 'undefined' ? screen.colorDepth : undefined,\n hardware_concurrency:\n typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : undefined,\n device_memory: typeof navigator !== 'undefined' ? (navigator as any).deviceMemory : undefined,\n touch_support:\n typeof navigator !== 'undefined' ? navigator.maxTouchPoints > 0 : undefined,\n webgl_vendor: webglInfo?.vendor,\n webgl_renderer: webglInfo?.renderer,\n };\n}\n\n/**\n * Encode payload to base64\n */\nfunction encodePayload(payload: CipherTextPayload): string {\n const json = JSON.stringify(payload);\n\n if (typeof btoa !== 'undefined') {\n // Browser\n return btoa(unescape(encodeURIComponent(json)));\n } else if (typeof Buffer !== 'undefined') {\n // Node.js\n return Buffer.from(json, 'utf-8').toString('base64');\n }\n\n throw new Error('No base64 encoding method available');\n}\n\n/**\n * Generate a cipherText containing encrypted device and location data\n *\n * @param options - Options for cipherText generation\n * @returns CipherText result with the encrypted string\n *\n * @example\n * ```typescript\n * // Basic usage for login\n * const result = await generateCipherText({ reason: 'login' });\n * console.log(result.cipherText);\n *\n * // With GPS location for registration\n * const result = await generateCipherText({\n * reason: 'registration',\n * requestLocation: true,\n * locationTimeout: 15000\n * });\n *\n * if (result.locationCaptured) {\n * console.log('GPS location included');\n * }\n * ```\n */\nexport async function generateCipherText(\n options: CipherTextOptions,\n config?: GeolocationConfigResponse\n): Promise<CipherTextResult> {\n const warnings: string[] = [];\n\n // Auto-enable GPS if tenant config requires it for this event type\n let requestLocation = options.requestLocation ?? false;\n let gpsRequiredByConfig = false;\n if (config?.require_gps) {\n const reason = options.reason;\n if (\n (reason === 'login' && config.require_gps.login) ||\n (reason === 'registration' && config.require_gps.registration) ||\n (reason === 'transaction' && config.require_gps.transaction)\n ) {\n if (!requestLocation) {\n gpsRequiredByConfig = true;\n }\n requestLocation = true;\n }\n }\n\n // Collect device data\n const deviceData = collectDeviceData(options.includeWebGL !== false);\n\n // Optionally request GPS location\n let locationData: CipherTextPayload['location'] | undefined;\n if (requestLocation) {\n const location = await requestGPSLocation(\n options.locationTimeout || 10000,\n options.highAccuracy !== false\n );\n\n if (location) {\n locationData = location;\n } else if (gpsRequiredByConfig) {\n throw new Error(\n `GPS location is required for ${options.reason} by tenant configuration, but GPS was not available or permission was denied`\n );\n } else {\n warnings.push('GPS location not available or permission denied');\n }\n }\n\n // Collect network info\n let networkData: CipherTextPayload['network'] | undefined;\n if (options.includeNetworkInfo !== false) {\n networkData = getNetworkInfo();\n }\n\n // Build payload\n const now = new Date();\n const expiry = new Date(now.getTime() + CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000);\n\n const payload: CipherTextPayload = {\n device: deviceData,\n location: locationData,\n network: networkData,\n metadata: {\n collected_at: now.toISOString(),\n sdk_version: SDK_VERSION,\n collection_reason: options.reason,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n },\n };\n\n // Encode payload (no obfuscation - HTTPS provides transport security)\n const encoded = encodePayload(payload);\n\n // Create final cipherText with version and timestamp prefix\n const timestamp = now.getTime().toString(36); // Base36 timestamp\n\n let cipherText: string;\n const hmacKey = options.signingKey || options.apiKey;\n if (hmacKey) {\n // v02: HMAC-signed — format: 02.{timestamp}.{base64}.{hmac}\n const message = `02.${timestamp}.${encoded}`;\n const hmac = await computeHMAC(hmacKey, message);\n cipherText = `${message}.${hmac}`;\n } else {\n // v01: unsigned (backwards compat)\n cipherText = `01.${timestamp}.${encoded}`;\n }\n\n return {\n cipherText,\n locationCaptured: !!locationData,\n warnings: warnings.length > 0 ? warnings : undefined,\n generatedAt: now.toISOString(),\n expiresAt: expiry.toISOString(),\n };\n}\n\n/**\n * Decode a cipherText (for debugging/testing - not for production use)\n * In production, decryption happens on the server\n */\nexport function decodeCipherText(cipherText: string): CipherTextPayload | null {\n try {\n const parts = cipherText.split('.');\n // v01: 3 parts, v02: 4 parts (4th is HMAC — ignored when decoding)\n if (parts.length !== 3 && parts.length !== 4) return null;\n\n const [version, , encodedB64] = parts;\n if (version !== '01' && version !== '02') return null;\n\n // Decode matches encode: just base64 decode (no obfuscation)\n const json = decodeURIComponent(escape(atob(encodedB64)));\n\n return JSON.parse(json) as CipherTextPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a cipherText is expired\n */\nexport function isCipherTextExpired(cipherText: string): boolean {\n try {\n const parts = cipherText.split('.');\n if (parts.length !== 3 && parts.length !== 4) return true;\n\n const timestampB36 = parts[1];\n const timestamp = parseInt(timestampB36, 36);\n const now = Date.now();\n const expiryMs = CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000;\n\n return now - timestamp > expiryMs;\n } catch {\n return true;\n }\n}\n\n// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason, GeolocationConfigResponse };\n","/**\n * GeolocationClient - TypeScript SDK for CGS Geolocation & Compliance Service\n *\n * Provides type-safe methods to interact with the geolocation service API.\n * Extends BaseClient for consistent retry logic, timeout handling, and error management.\n */\n\nimport { BaseClient } from '../core/client';\nimport { ValidationError } from '../core/errors';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n GeolocationClientConfig,\n GeolocationConfigResponse,\n VerifyIPRequest,\n LocationVerification,\n ComplianceCheckResponse,\n PaginationParams,\n // Location Request Types\n LocationRequest,\n CreateLocationRequestRequest,\n LocationRequestResult,\n LocationRequestFilters,\n LocationRequestListResponse,\n ResendLocationRequestRequest,\n LocationShareInfo,\n LocationCaptureRequest,\n LocationCaptureResponse,\n // CipherText Types\n ValidateCipherTextRequest,\n ValidateCipherTextResponse,\n CipherTextReason,\n CipherTextCustomerData,\n CipherTextOptions,\n CipherTextResult,\n} from './types';\nimport { generateCipherText as generateCipherTextUtil } from './ciphertext';\n\n/**\n * GeolocationClient extends BaseClient for:\n * - Consistent retry logic with exponential backoff\n * - Unified error handling (CGSError, NetworkError, TimeoutError, etc.)\n * - Automatic timeout management\n * - Debug logging\n *\n * All geolocation verification calls use requestWithRetry() to handle\n * transient failures gracefully.\n */\nexport class GeolocationClient extends BaseClient {\n private cachedSigningKey?: string;\n\n constructor(config: GeolocationClientConfig) {\n // Convert GeolocationClientConfig to BaseClientConfig\n const baseConfig: BaseClientConfig = {\n baseURL: config.baseURL,\n tenantId: config.tenantId,\n apiKey: config.apiKey,\n headers: config.headers,\n timeout: config.timeout,\n retries: 3, // Default retry count for geolocation calls\n debug: config.debug,\n logger: config.logger,\n environment: config.environment,\n };\n super(baseConfig);\n }\n\n // ============================================================================\n // IP Verification & Compliance\n // ============================================================================\n\n /**\n * Verify an IP address and check compliance\n *\n * Uses requestWithRetry() for automatic retry on transient failures.\n *\n * @param request - Verification request with IP, user ID, event type, and optional device fingerprint\n * @returns Location verification result with risk assessment\n *\n * @example\n * ```typescript\n * const result = await client.verifyIP({\n * ip_address: \"8.8.8.8\",\n * user_id: \"user_123\",\n * event_type: \"login\",\n * device_fingerprint: {\n * device_id: \"device_abc\",\n * user_agent: navigator.userAgent,\n * platform: \"web\"\n * }\n * });\n *\n * if (result.is_blocked) {\n * console.log(\"Access blocked:\", result.risk_reasons);\n * }\n * ```\n */\n async verifyIP(request: VerifyIPRequest, requestOptions?: RequestOptions): Promise<LocationVerification> {\n if (!request.ip_address?.trim()) {\n throw new ValidationError('ip_address is required and must be a non-empty string', ['ip_address']);\n }\n\n // Use requestWithRetry for critical verification calls\n return this.requestWithRetry<LocationVerification>('/api/v1/geo/verify', {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, undefined, requestOptions);\n }\n\n /**\n * Check compliance for a specific country\n *\n * @param countryISO - ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\")\n * @returns Jurisdiction configuration and compliance status\n *\n * @example\n * ```typescript\n * const compliance = await client.checkCompliance(\"KP\"); // North Korea\n * if (!compliance.is_compliant) {\n * console.log(\"Country is not allowed:\", compliance.jurisdiction?.status);\n * }\n * ```\n */\n async checkCompliance(countryISO: string, requestOptions?: RequestOptions): Promise<ComplianceCheckResponse> {\n return this.requestWithRetry<ComplianceCheckResponse>(\n `/api/v1/geo/check-compliance`,\n {\n method: 'POST',\n body: JSON.stringify({ country_iso: countryISO }),\n }, undefined, undefined, requestOptions\n );\n }\n\n // ============================================================================\n // GPS Configuration\n // ============================================================================\n\n /**\n * Get the tenant's GPS requirement configuration\n *\n * Returns which event types require GPS location to be collected.\n * Use this to auto-enable GPS collection in generateCipherText when required.\n *\n * @returns GPS requirement config per event type\n *\n * @example\n * ```typescript\n * const config = await client.getGPSConfig();\n * if (config.require_gps.login) {\n * // GPS is required for login — auto-enable location\n * }\n * ```\n */\n async getGPSConfig(requestOptions?: RequestOptions): Promise<GeolocationConfigResponse> {\n const config = await this.requestWithRetry<GeolocationConfigResponse>('/api/v1/geo/config', undefined, undefined, undefined, requestOptions);\n if (config.signing_key) {\n this.cachedSigningKey = config.signing_key;\n }\n return config;\n }\n\n /**\n * Fetch the signing key from the dedicated authenticated endpoint.\n *\n * Falls back to getGPSConfig() for backward compatibility with older servers\n * that don't expose `/api/v1/geo/signing-key`.\n *\n * @returns The signing key string, or undefined if unavailable\n */\n async fetchSigningKey(requestOptions?: RequestOptions): Promise<string | undefined> {\n try {\n const response = await this.requestWithRetry<{ signing_key: string }>(\n '/api/v1/geo/signing-key', undefined, undefined, undefined, requestOptions,\n );\n if (response.signing_key) {\n this.cachedSigningKey = response.signing_key;\n return response.signing_key;\n }\n } catch {\n // Older servers may not have this endpoint — fall back to config\n }\n\n const config = await this.getGPSConfig(requestOptions);\n return config.signing_key;\n }\n\n // ============================================================================\n // CipherText Validation\n // ============================================================================\n\n /**\n * Validate a cipherText generated by the frontend SDK\n *\n * The cipherText contains encrypted device fingerprint and optional location data.\n * This method decrypts and validates the data, returning device info, location,\n * and risk assessment.\n *\n * @param cipherText - The encrypted cipherText string from generateCipherText()\n * @param userId - User ID associated with this verification\n * @param eventType - Reason for verification (login, registration, etc.)\n * @param expectedIP - Optional expected IP address for additional validation\n * @param customerData - Optional customer data for risk profile creation (used when user is blocked)\n * @returns Validation result with device info, location, and risk assessment\n *\n * @example\n * ```typescript\n * // Validate cipherText during registration with customer data\n * const result = await client.validateCipherText(\n * cipherText,\n * \"user_123\",\n * \"registration\",\n * clientIP,\n * {\n * full_name: \"John Doe\",\n * email: \"john@example.com\",\n * country: \"US\",\n * state: \"CA\"\n * }\n * );\n *\n * if (!result.valid) {\n * console.log(\"CipherText validation failed:\", result.errors);\n * return;\n * }\n *\n * if (result.risk.is_blocked) {\n * console.log(\"Access blocked:\", result.risk.block_reasons);\n * // A risk profile with full customer data has been created for the alert\n * }\n * ```\n */\n async validateCipherText(\n cipherText: string,\n userId: string,\n eventType: CipherTextReason,\n expectedIP?: string,\n customerData?: CipherTextCustomerData,\n requestOptions?: RequestOptions\n ): Promise<ValidateCipherTextResponse> {\n if (!cipherText?.trim()) {\n throw new ValidationError('cipherText is required and must be a non-empty string', ['cipherText']);\n }\n if (!userId?.trim()) {\n throw new ValidationError('userId is required and must be a non-empty string', ['userId']);\n }\n\n const request: ValidateCipherTextRequest = {\n cipher_text: cipherText,\n user_id: userId,\n event_type: eventType,\n expected_ip: expectedIP,\n customer_data: customerData,\n };\n\n return this.requestWithRetry<ValidateCipherTextResponse>(\n '/api/v1/geo/validate-ciphertext',\n {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, undefined, requestOptions\n );\n }\n\n /**\n * Validate cipherText and verify IP in a single call\n *\n * Combines cipherText validation with IP verification for complete\n * location and device verification in one request.\n *\n * @param cipherText - The encrypted cipherText string\n * @param ipAddress - Client IP address\n * @param userId - User ID\n * @param eventType - Event type (login, registration, etc.)\n * @returns Combined validation and verification result\n *\n * @example\n * ```typescript\n * const result = await client.validateAndVerify(\n * cipherText,\n * clientIP,\n * \"user_123\",\n * \"registration\"\n * );\n *\n * if (!result.ciphertext_valid) {\n * throw new Error(\"Device verification failed\");\n * }\n *\n * if (result.location.is_blocked) {\n * throw new Error(\"Location not allowed\");\n * }\n * ```\n */\n async validateAndVerify(\n cipherText: string,\n ipAddress: string,\n userId: string,\n eventType: CipherTextReason,\n requestOptions?: RequestOptions\n ): Promise<{\n ciphertext_valid: boolean;\n ciphertext_result: ValidateCipherTextResponse;\n location: LocationVerification;\n }> {\n // First validate cipherText to get device info\n const cipherTextResult = await this.validateCipherText(\n cipherText,\n userId,\n eventType,\n ipAddress,\n undefined,\n requestOptions\n );\n\n // Then verify IP with device fingerprint from cipherText\n const locationResult = await this.verifyIP({\n ip_address: ipAddress,\n user_id: userId,\n event_type: eventType,\n device_fingerprint: cipherTextResult.valid && cipherTextResult.device\n ? {\n device_id: cipherTextResult.device_uuid,\n user_agent: '',\n platform: cipherTextResult.device.platform,\n browser: cipherTextResult.device.browser,\n os: cipherTextResult.device.os,\n }\n : undefined,\n }, requestOptions);\n\n return {\n ciphertext_valid: cipherTextResult.valid,\n ciphertext_result: cipherTextResult,\n location: locationResult,\n };\n }\n\n // ============================================================================\n // Location Request (Live Location Tracking)\n // ============================================================================\n\n /**\n * Create a location request to get customer's live location\n *\n * @param request - Location request details\n * @returns Location request result with share link\n *\n * @example\n * ```typescript\n * const result = await client.createLocationRequest({\n * user_id: \"customer_123\",\n * channel: \"sms\",\n * phone: \"+1234567890\",\n * reason: \"Verification for high-value transaction\"\n * });\n *\n * console.log(`Share link sent: ${result.share_link}`);\n * console.log(`Expires at: ${result.token_expiry}`);\n * ```\n */\n async createLocationRequest(\n request: CreateLocationRequestRequest,\n requestOptions?: RequestOptions\n ): Promise<LocationRequestResult> {\n return this.request<LocationRequestResult>('/api/v1/location-requests', {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, requestOptions);\n }\n\n /**\n * Get a location request by ID\n *\n * @param requestId - Location request ID\n * @returns Location request details\n */\n async getLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<LocationRequest> {\n return this.request<LocationRequest>(`/api/v1/location-requests/${requestId}`, undefined, undefined, requestOptions);\n }\n\n /**\n * List location requests with filters and pagination\n *\n * @param filters - Optional filters\n * @param pagination - Optional pagination\n * @returns Paginated list of location requests\n *\n * @example\n * ```typescript\n * const requests = await client.listLocationRequests(\n * { status: \"completed\", user_id: \"customer_123\" },\n * { page: 1, limit: 20 }\n * );\n * ```\n */\n async listLocationRequests(\n filters?: LocationRequestFilters,\n pagination?: PaginationParams,\n requestOptions?: RequestOptions\n ): Promise<LocationRequestListResponse> {\n const params: Record<string, unknown> = {\n ...filters,\n ...pagination,\n };\n\n return this.request<LocationRequestListResponse>(\n `/api/v1/location-requests${this.buildQueryString(params)}`,\n undefined, undefined, requestOptions\n );\n }\n\n /**\n * Cancel a pending location request\n *\n * @param requestId - Location request ID\n */\n async cancelLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<void> {\n await this.request(`/api/v1/location-requests/${requestId}/cancel`, {\n method: 'POST',\n }, undefined, requestOptions);\n }\n\n /**\n * Resend notification for a location request\n *\n * @param requestId - Location request ID\n * @param contact - Email or phone to send to\n */\n async resendLocationRequest(\n requestId: string,\n contact: ResendLocationRequestRequest,\n requestOptions?: RequestOptions\n ): Promise<void> {\n await this.request(`/api/v1/location-requests/${requestId}/resend`, {\n method: 'POST',\n body: JSON.stringify(contact),\n }, undefined, requestOptions);\n }\n\n // ============================================================================\n // Location Share (Customer-facing - for SDK integration in customer apps)\n // ============================================================================\n\n /**\n * Get location share info (customer-facing)\n * This is called from the customer's device to get request details\n *\n * @param token - Secure token from share link\n * @returns Location share info\n */\n async getLocationShareInfo(token: string, requestOptions?: RequestOptions): Promise<LocationShareInfo> {\n return this.request<LocationShareInfo>(`/api/v1/location/share/${token}`, undefined, undefined, requestOptions);\n }\n\n /**\n * Submit location capture (customer-facing)\n * This is called from the customer's device to submit their location\n *\n * @param token - Secure token from share link\n * @param capture - Location capture data (GPS or WiFi)\n * @returns Capture response\n *\n * @example\n * ```typescript\n * // Using GPS (preferred)\n * const result = await client.captureLocation(token, {\n * latitude: 37.7749,\n * longitude: -122.4194,\n * accuracy: 10\n * });\n *\n * // Using WiFi positioning (fallback)\n * const result = await client.captureLocation(token, {\n * wifi_networks: [\n * { macAddress: \"00:11:22:33:44:55\", signalStrength: -50 },\n * { macAddress: \"AA:BB:CC:DD:EE:FF\", signalStrength: -70 }\n * ]\n * });\n * ```\n */\n async captureLocation(\n token: string,\n capture: LocationCaptureRequest,\n requestOptions?: RequestOptions\n ): Promise<LocationCaptureResponse> {\n return this.request<LocationCaptureResponse>(`/api/v1/location/share/${token}`, {\n method: 'POST',\n body: JSON.stringify(capture),\n }, undefined, requestOptions);\n }\n\n // ============================================================================\n // CipherText Generation\n // ============================================================================\n\n /**\n * Generate a signed cipherText containing device and location data.\n *\n * Automatically passes the client's API key for HMAC signing (v02 format).\n * If no API key is configured, falls back to unsigned v01 format.\n *\n * @param options - Options for cipherText generation\n * @param gpsConfig - Optional GPS config (from getGPSConfig)\n * @returns CipherText result with the signed string\n *\n * @example\n * ```typescript\n * const result = await client.generateCipherText({ reason: 'login' });\n * console.log(result.cipherText); // v02 signed cipherText\n * ```\n */\n async generateCipherText(\n options: Omit<CipherTextOptions, 'apiKey' | 'signingKey'>,\n gpsConfig?: GeolocationConfigResponse,\n ): Promise<CipherTextResult> {\n // Use cached signing key, or fetch from dedicated endpoint (with fallback)\n let signingKey = this.cachedSigningKey;\n let resolvedGpsConfig = gpsConfig;\n if (!signingKey) {\n signingKey = await this.fetchSigningKey();\n }\n // Fetch GPS config for auto-enable when caller didn't provide one\n if (!resolvedGpsConfig) {\n resolvedGpsConfig = await this.getGPSConfig();\n }\n return generateCipherTextUtil(\n { ...options, signingKey: signingKey || undefined },\n resolvedGpsConfig,\n );\n }\n\n // ============================================================================\n // Utility Methods (inherited from BaseClient: healthCheck, updateConfig, getConfig, buildQueryString)\n // ============================================================================\n}\n","/**\n * RiskProfileClient - Customer Risk Profile Management\n *\n * Provides methods to create, retrieve, and manage customer risk profiles\n * in the Vesant Compliance Platform.\n */\n\nimport { BaseClient } from '../core/client';\nimport { CGSError } from '../core/errors';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n CustomerProfile,\n CreateProfileRequest,\n UpdateProfileRequest,\n ProfileFilters,\n ProfileListResponse,\n} from './types';\n\nexport class RiskProfileClient extends BaseClient {\n constructor(config: BaseClientConfig) {\n super(config);\n }\n\n // ============================================================================\n // Profile Management\n // ============================================================================\n\n /**\n * Create a new customer risk profile\n *\n * @param request - Profile creation data\n * @returns Created customer profile\n *\n * @example\n * ```typescript\n * const profile = await client.createProfile({\n * customer_id: 'CUST-12345',\n * entity_type: 'individual',\n * customer_status: 'active',\n * full_name: 'John Doe',\n * email_address: 'john@example.com',\n * date_of_birth: '1990-01-15',\n * country_of_residence: 'US'\n * });\n * ```\n */\n async createProfile(request: CreateProfileRequest, requestOptions?: RequestOptions): Promise<CustomerProfile> {\n return this.request<CustomerProfile>('/api/v1/profiles', {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, requestOptions);\n }\n\n /**\n * Get customer profile by customer ID\n *\n * Note: This searches for the profile using the customer_id field.\n * Returns the first matching profile for the tenant.\n *\n * @param customerId - Customer ID to search for\n * @returns Customer profile\n *\n * @example\n * ```typescript\n * const profile = await client.getProfile('CUST-12345');\n * ```\n */\n async getProfile(customerId: string, requestOptions?: RequestOptions): Promise<CustomerProfile> {\n const response = await this.queryProfiles({\n search: customerId,\n page: 1,\n page_size: 10,\n }, requestOptions);\n\n // Find exact match by customer_id\n const profile = response.data.find(p => p.customer_id === customerId);\n if (!profile) {\n throw new CGSError(`Profile not found for customer ID: ${customerId}`, 'NOT_FOUND', 404);\n }\n\n return profile;\n }\n\n /**\n * Update customer profile\n *\n * @param profileId - Profile UUID\n * @param updates - Fields to update\n * @returns Updated customer profile\n *\n * @example\n * ```typescript\n * const updated = await client.updateProfile(profileId, {\n * location: 'New York, USA',\n * location_compliance: 'compliant',\n * last_recorded_activity: new Date().toISOString()\n * });\n * ```\n */\n async updateProfile(\n profileId: string,\n updates: UpdateProfileRequest,\n requestOptions?: RequestOptions\n ): Promise<CustomerProfile> {\n return this.request<CustomerProfile>(`/api/v1/profiles/${profileId}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }, undefined, requestOptions);\n }\n\n /**\n * Get or create profile (idempotent operation)\n *\n * Attempts to get existing profile by customer_id, creates if not found.\n *\n * @param customerId - Customer ID\n * @param createRequest - Profile data to use if creating new profile\n * @returns Existing or newly created profile\n *\n * @example\n * ```typescript\n * const profile = await client.getOrCreateProfile('CUST-123', {\n * customer_id: 'CUST-123',\n * entity_type: 'individual',\n * full_name: 'John Doe',\n * email_address: 'john@example.com'\n * });\n * ```\n */\n async getOrCreateProfile(\n customerId: string,\n createRequest: CreateProfileRequest,\n requestOptions?: RequestOptions\n ): Promise<CustomerProfile> {\n try {\n return await this.getProfile(customerId, requestOptions);\n } catch (error) {\n // Only treat NOT_FOUND as \"profile doesn't exist\" — re-throw other errors\n if (error instanceof CGSError && error.code === 'NOT_FOUND') {\n return await this.createProfile(createRequest, requestOptions);\n }\n throw error;\n }\n }\n\n /**\n * Query profiles with filters (internal helper for getProfile)\n */\n private async queryProfiles(filters: ProfileFilters = {}, requestOptions?: RequestOptions): Promise<ProfileListResponse> {\n const queryString = this.buildQueryString(filters as Record<string, unknown>);\n return this.request<ProfileListResponse>(\n `/api/v1/risk-dashboard/profiles${queryString}`,\n undefined, undefined, requestOptions\n );\n }\n}\n","/**\n * Compliance orchestration types\n *\n * Types for unified compliance verification flows that combine\n * geolocation verification with customer risk profiling.\n */\n\nimport type { LocationVerification, DeviceFingerprintRequest } from '../geolocation/types';\nimport type { CustomerProfile, EntityType } from '../risk-profile/types';\n\n// ============================================================================\n// Registration Verification Types\n// ============================================================================\n\nexport interface RegistrationVerificationRequest {\n // Identity\n customerId: string;\n fullName: string;\n emailAddress: string;\n phoneNumber?: string;\n dateOfBirth?: string;\n address?: string;\n entityType?: EntityType;\n\n // Geolocation\n ipAddress: string;\n deviceFingerprint?: DeviceFingerprintRequest;\n\n // Additional data\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegistrationVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n profile: CustomerProfile | null;\n requiresKYC: boolean;\n requiresEDD: boolean;\n blockReasons: string[];\n processingTime: number;\n}\n\n// ============================================================================\n// Login Verification Types\n// ============================================================================\n\nexport interface LoginVerificationRequest {\n customerId: string;\n ipAddress: string;\n deviceFingerprint?: DeviceFingerprintRequest;\n metadata?: Record<string, unknown>;\n}\n\nexport interface LoginVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n profile: CustomerProfile;\n requiresStepUp: boolean;\n blockReasons: string[];\n processingTime: number;\n}\n\n// ============================================================================\n// Transaction Verification Types\n// ============================================================================\n\nexport interface TransactionVerificationRequest {\n customerId: string;\n ipAddress: string;\n amount: number;\n currency: string;\n transactionType?: 'deposit' | 'withdrawal' | 'bet' | 'transfer' | 'payout';\n deviceFingerprint?: DeviceFingerprintRequest;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TransactionVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n profile: CustomerProfile;\n transactionRisk: TransactionRiskResult;\n requiresApproval: boolean;\n blockReasons: string[];\n processingTime: number;\n}\n\nexport interface TransactionRiskResult {\n score: number;\n level: 'low' | 'medium' | 'high' | 'critical';\n factors: string[];\n allowed: boolean;\n requiresManualReview: boolean;\n}\n\n// ============================================================================\n// Generic Event Verification Types\n// ============================================================================\n\nexport interface EventVerificationRequest {\n customerId: string;\n ipAddress: string;\n eventType: string;\n deviceFingerprint?: DeviceFingerprintRequest;\n metadata?: Record<string, unknown>;\n}\n\nexport interface EventVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n blockReasons: string[];\n processingTime: number;\n}\n\n// ============================================================================\n// Currency Exchange Rates (for transaction risk calculation)\n// ============================================================================\n\nexport interface CurrencyRates {\n [currency: string]: number; // Rate to USD\n}\n\nexport const DEFAULT_CURRENCY_RATES: CurrencyRates = {\n USD: 1.0,\n EUR: 1.1,\n GBP: 1.27,\n CAD: 0.74,\n AUD: 0.66,\n JPY: 0.0067,\n CHF: 1.13,\n CNY: 0.14,\n INR: 0.012,\n BRL: 0.20,\n MXN: 0.058,\n ZAR: 0.055,\n};\n\n// ============================================================================\n// Location Request Types (re-exported from geolocation for convenience)\n// ============================================================================\n\nexport type {\n LocationRequest,\n LocationRequestStatus,\n LocationRequestChannel,\n CreateLocationRequestRequest,\n LocationRequestResult,\n LocationRequestFilters,\n LocationRequestListResponse,\n ResendLocationRequestRequest,\n LocationShareInfo,\n LocationCaptureRequest,\n LocationCaptureResponse,\n} from '../geolocation/types';\n\n// ============================================================================\n// Compliance-specific Location Request Types\n// ============================================================================\n\nexport interface ComplianceLocationRequestInput {\n /** Customer user ID to request location from */\n customerId: string;\n /** Notification channel to use */\n channel: 'sms' | 'email' | 'push';\n /** Reason for requesting location (for compliance/audit) */\n reason: string;\n /** Customer email (required for email channel) */\n email?: string;\n /** Customer phone (required for SMS channel) */\n phone?: string;\n /** Custom expiry time in hours (default: 24) */\n expiryHours?: number;\n}\n\nexport interface ComplianceLocationRequestResult {\n /** The created location request */\n request: import('../geolocation/types').LocationRequest;\n /** Shareable link for the customer */\n shareLink: string;\n /** Token expiration time */\n tokenExpiry: string;\n /** Customer profile (if available) */\n profile?: import('../risk-profile/types').CustomerProfile;\n}\n","/**\n * ComplianceClient - Unified Compliance Orchestration\n *\n * Main integration point for casino platforms. Orchestrates geolocation\n * verification with customer risk profiling for complete compliance coverage.\n *\n * GeoComply-style approach: SDK is the primary data injection point.\n */\n\nimport { GeolocationClient } from '../geolocation/client';\nimport { RiskProfileClient } from '../risk-profile/client';\nimport type { CGSConfig, Logger, RequestOptions, RequiredCGSConfig, RequestInterceptor } from '../core/config';\nimport { ComplianceError, ValidationError } from '../core/errors';\nimport { createConsoleLogger } from '../core/logger';\nimport type { JurisdictionConfig, LocationVerification } from '../geolocation/types';\nimport type { CustomerProfile } from '../risk-profile/types';\nimport type {\n RegistrationVerificationRequest,\n RegistrationVerificationResponse,\n LoginVerificationRequest,\n LoginVerificationResponse,\n TransactionVerificationRequest,\n TransactionVerificationResponse,\n TransactionRiskResult,\n EventVerificationRequest,\n EventVerificationResponse,\n CurrencyRates,\n ComplianceLocationRequestInput,\n ComplianceLocationRequestResult,\n} from './types';\nimport { DEFAULT_CURRENCY_RATES } from './types';\nimport type {\n LocationRequest,\n LocationRequestFilters,\n LocationRequestListResponse,\n PaginationParams,\n} from '../geolocation/types';\n\nexport class ComplianceClient {\n private geoClient: GeolocationClient;\n private riskClient: RiskProfileClient;\n private config: RequiredCGSConfig;\n private logger: Logger;\n private currencyRates: CurrencyRates;\n private _currencyRatesCustomized: boolean = false;\n private _currencyRatesWarned: boolean = false;\n\n constructor(config: CGSConfig) {\n this.logger = config.logger || createConsoleLogger();\n const interceptors: RequestInterceptor[] = config.interceptors || [];\n this.config = {\n baseURL: config.baseURL,\n tenantId: config.tenantId,\n apiKey: config.apiKey || '',\n headers: config.headers || {},\n timeout: config.timeout || 10000,\n retries: config.retries || 3,\n debug: config.debug || false,\n autoCreateProfiles: config.autoCreateProfiles !== false, // default true\n syncMode: config.syncMode || 'sync',\n interceptors,\n logger: this.logger,\n };\n\n this.geoClient = new GeolocationClient({\n baseURL: this.config.baseURL,\n tenantId: this.config.tenantId,\n apiKey: this.config.apiKey,\n headers: this.config.headers,\n timeout: this.config.timeout,\n debug: this.config.debug,\n logger: this.logger,\n });\n\n this.riskClient = new RiskProfileClient({\n baseURL: this.config.baseURL,\n tenantId: this.config.tenantId,\n apiKey: this.config.apiKey,\n headers: this.config.headers,\n timeout: this.config.timeout,\n debug: this.config.debug,\n interceptors,\n logger: this.logger,\n });\n\n this.currencyRates = DEFAULT_CURRENCY_RATES;\n }\n\n // ============================================================================\n // Sub-Client Accessors\n // ============================================================================\n\n /** Get the underlying GeolocationClient for direct geolocation API access */\n getGeolocationClient(): GeolocationClient {\n return this.geoClient;\n }\n\n /** Get the underlying RiskProfileClient for direct risk profile API access */\n getRiskProfileClient(): RiskProfileClient {\n return this.riskClient;\n }\n\n // ============================================================================\n // Main Verification Methods\n // ============================================================================\n\n /**\n * Verify customer registration with automatic profile creation\n *\n * This is the primary integration point for new customer sign-ups.\n * Combines geolocation verification with customer risk profile creation.\n *\n * Important: Profile is only created if geolocation verification passes.\n * This prevents orphaned geolocation records when registration is blocked.\n *\n * @param request - Registration verification request\n * @returns Verification response with profile and compliance status\n *\n * @example\n * ```typescript\n * const result = await sdk.verifyAtRegistration({\n * customerId: 'CUST-12345',\n * fullName: 'John Doe',\n * emailAddress: 'john@example.com',\n * ipAddress: req.ip,\n * deviceFingerprint: getDeviceFingerprint()\n * });\n *\n * if (result.allowed) {\n * // Create account\n * console.log('Profile created:', result.profile);\n * if (result.requiresKYC) {\n * // Redirect to KYC flow\n * }\n * } else {\n * // Block registration\n * console.log('Blocked:', result.blockReasons);\n * }\n * ```\n */\n async verifyAtRegistration(\n request: RegistrationVerificationRequest,\n requestOptions?: RequestOptions\n ): Promise<RegistrationVerificationResponse> {\n const startTime = Date.now();\n\n // Validate required fields before making any API calls\n this.validateRegistrationRequest(request);\n\n let geoVerification: LocationVerification | null = null;\n\n try {\n // Step 1: Verify geolocation\n if (this.config.debug) {\n this.logger.debug('Starting registration verification', { customerId: request.customerId });\n }\n\n geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'registration',\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions);\n\n // Step 2: Check if registration should be blocked BEFORE creating profile\n // This prevents orphaned geo records and ensures atomic behavior\n const blockReasons = this.evaluateRegistrationBlock(geoVerification);\n\n if (blockReasons.length > 0) {\n if (this.config.debug) {\n this.logger.debug('Registration blocked at geo stage', { blockReasons });\n }\n\n // Return early without creating profile - prevents orphaned records\n return {\n allowed: false,\n geolocation: geoVerification,\n profile: null,\n requiresKYC: false,\n requiresEDD: false,\n blockReasons: blockReasons,\n processingTime: Date.now() - startTime,\n };\n }\n\n // Step 3: Create customer risk profile (only if geo passed)\n const profile = await this.riskClient.createProfile({\n customer_id: request.customerId,\n entity_type: request.entityType || 'individual',\n customer_status: 'active',\n full_name: request.fullName,\n email_address: request.emailAddress,\n primary_phone_number: request.phoneNumber,\n date_of_birth: request.dateOfBirth,\n residential_address: request.address,\n country_of_residence: geoVerification.location.country_iso,\n\n // Geolocation data\n location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n\n // Initial KYC status\n kyc_status: 'pending',\n }, requestOptions);\n\n // Step 4: Determine final status and requirements\n const requiresKYC = geoVerification.jurisdiction?.require_kyc || false;\n const requiresEDD = geoVerification.jurisdiction?.require_enhanced_verification || false;\n\n if (this.config.debug) {\n this.logger.debug('Registration verification complete', {\n allowed: true,\n riskScore: geoVerification.risk_score,\n profileId: profile.id,\n requiresKYC,\n requiresEDD,\n });\n }\n\n return {\n allowed: true,\n geolocation: geoVerification,\n profile: profile,\n requiresKYC: requiresKYC,\n requiresEDD: requiresEDD,\n blockReasons: [],\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.config.debug) {\n this.logger.error('Registration verification failed', { error });\n }\n\n // Provide detailed error context for debugging\n throw new ComplianceError(\n 'Registration verification failed',\n {\n stage: geoVerification ? 'profile_creation' : 'geo_verification',\n geoRecordId: geoVerification?.record_id,\n customerId: request.customerId,\n cause: error,\n },\n geoVerification ? 'PROFILE_CREATION_FAILED' : 'GEO_VERIFICATION_FAILED'\n );\n }\n }\n\n /**\n * Evaluate if registration should be blocked based on geolocation verification\n *\n * Checks:\n * 1. General compliance status (is_compliant)\n * 2. Explicit block flag (is_blocked)\n * 3. Jurisdiction-specific registration allowance (allow_registration)\n * 4. Risk level thresholds\n *\n * @param geoVerification - Geolocation verification result\n * @returns Array of block reasons (empty if allowed)\n */\n private evaluateRegistrationBlock(geoVerification: LocationVerification): string[] {\n const blockReasons: string[] = [];\n\n // Check if explicitly blocked\n if (geoVerification.is_blocked) {\n blockReasons.push(...geoVerification.risk_reasons);\n }\n\n // Check general compliance\n if (!geoVerification.is_compliant) {\n if (!blockReasons.includes('non_compliant_jurisdiction')) {\n blockReasons.push('non_compliant_jurisdiction');\n }\n }\n\n // CRITICAL: Check if registration is specifically allowed in this jurisdiction\n // Some jurisdictions may allow login but not new registrations\n const jurisdiction = geoVerification.jurisdiction;\n if (jurisdiction) {\n if (jurisdiction.allow_registration === false) {\n blockReasons.push('registration_not_allowed_in_jurisdiction');\n }\n\n // Check jurisdiction status for registration-specific blocks\n if (jurisdiction.status === 'blocked' || jurisdiction.status === 'sanctioned') {\n if (!blockReasons.includes('blocked_jurisdiction')) {\n blockReasons.push('blocked_jurisdiction');\n }\n }\n\n // Restricted jurisdictions need explicit registration permission\n if (jurisdiction.status === 'restricted' && jurisdiction.allow_registration === false) {\n if (!blockReasons.includes('restricted_jurisdiction_no_registration')) {\n blockReasons.push('restricted_jurisdiction_no_registration');\n }\n }\n }\n\n // Check geofence rule evaluation\n if (geoVerification.geofence_evaluation?.blocked) {\n blockReasons.push(...geoVerification.geofence_evaluation.reasons);\n }\n\n // Critical risk level should block registration\n if (geoVerification.risk_level === 'critical') {\n if (!blockReasons.includes('critical_risk_level')) {\n blockReasons.push('critical_risk_level');\n }\n }\n\n return [...new Set(blockReasons)]; // Deduplicate\n }\n\n /**\n * Validate registration request has all required fields\n *\n * @param request - Registration request to validate\n * @throws ValidationError if required fields are missing or invalid\n */\n private validateRegistrationRequest(request: RegistrationVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (!request.emailAddress?.trim()) {\n errors.push('emailAddress is required');\n } else if (!this.isValidEmail(request.emailAddress)) {\n errors.push('emailAddress format is invalid');\n }\n\n if (!request.fullName?.trim()) {\n errors.push('fullName is required');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid registration request: ${errors.join(', ')}`, errors);\n }\n }\n\n /**\n * Validate IP address format (IPv4 or IPv6)\n */\n private isValidIP(ip: string): boolean {\n // IPv4 pattern\n const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n // Simplified IPv6 pattern (covers most common cases)\n const ipv6Regex = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){0,6}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$/;\n\n return ipv4Regex.test(ip) || ipv6Regex.test(ip);\n }\n\n /**\n * Validate email address format\n */\n private isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n private validateLoginRequest(request: LoginVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid login request: ${errors.join(', ')}`, errors);\n }\n }\n\n private validateTransactionRequest(request: TransactionVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (request.amount <= 0) {\n errors.push('amount must be greater than 0');\n }\n\n if (!request.currency?.trim()) {\n errors.push('currency is required');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid transaction request: ${errors.join(', ')}`, errors);\n }\n }\n\n private validateEventRequest(request: EventVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (!request.eventType?.trim()) {\n errors.push('eventType is required');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid event request: ${errors.join(', ')}`, errors);\n }\n }\n\n /**\n * Verify customer login with profile activity update\n *\n * Verifies geolocation and updates customer profile with latest activity.\n *\n * @param request - Login verification request\n * @returns Verification response with compliance status\n *\n * @example\n * ```typescript\n * const result = await sdk.verifyAtLogin({\n * customerId: 'CUST-12345',\n * ipAddress: req.ip,\n * deviceFingerprint: getDeviceFingerprint()\n * });\n *\n * if (result.allowed) {\n * // Allow login\n * if (result.requiresStepUp) {\n * // Trigger MFA or additional verification\n * }\n * } else {\n * // Block login\n * console.log('Blocked:', result.blockReasons);\n * }\n * ```\n */\n async verifyAtLogin(\n request: LoginVerificationRequest,\n requestOptions?: RequestOptions\n ): Promise<LoginVerificationResponse> {\n const startTime = Date.now();\n\n this.validateLoginRequest(request);\n\n try {\n if (this.config.debug) {\n this.logger.debug('Starting login verification', { customerId: request.customerId });\n }\n\n // Step 1: Verify geolocation and fetch profile in parallel\n const [geoVerification, profileResult] = await Promise.all([\n this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'login',\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions),\n this.riskClient.getProfile(request.customerId, requestOptions).catch(() => null),\n ]);\n\n // Step 2: Get or create profile\n let profile: CustomerProfile;\n if (profileResult) {\n profile = profileResult;\n\n // Update last activity and location\n if (this.shouldUpdateProfile(profile, geoVerification.location.city)) {\n profile = await this.riskClient.updateProfile(profile.id, {\n last_recorded_activity: new Date().toISOString(),\n location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n }, requestOptions);\n }\n } else {\n // Profile doesn't exist - this shouldn't happen for login\n if (this.config.autoCreateProfiles && this.config.debug) {\n this.logger.warn('Profile not found for login, creating...');\n }\n profile = await this.createProfileFromGeo(request.customerId, geoVerification);\n }\n\n // Step 3: Determine if login allowed\n const isAllowed =\n geoVerification.is_compliant &&\n !geoVerification.is_blocked &&\n profile.customer_status !== 'suspended';\n\n const requiresStepUp =\n geoVerification.risk_level === 'high' || geoVerification.risk_level === 'critical';\n\n return {\n allowed: isAllowed,\n geolocation: geoVerification,\n profile: profile,\n requiresStepUp: requiresStepUp,\n blockReasons: this.getBlockReasons(geoVerification, profile),\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n throw new ComplianceError('Login verification failed', error);\n }\n }\n\n /**\n * Verify transaction with amount-based risk assessment\n *\n * Combines geolocation verification with transaction amount analysis\n * and customer risk profile for comprehensive transaction screening.\n *\n * @param request - Transaction verification request\n * @returns Verification response with transaction risk assessment\n *\n * @example\n * ```typescript\n * const result = await sdk.verifyAtTransaction({\n * customerId: 'CUST-12345',\n * ipAddress: req.ip,\n * amount: 5000,\n * currency: 'USD',\n * transactionType: 'withdrawal',\n * deviceFingerprint: getDeviceFingerprint()\n * });\n *\n * if (result.allowed) {\n * // Process transaction\n * } else if (result.requiresApproval) {\n * // Queue for manual review\n * } else {\n * // Block transaction\n * console.log('Blocked:', result.blockReasons);\n * }\n * ```\n */\n async verifyAtTransaction(\n request: TransactionVerificationRequest,\n requestOptions?: RequestOptions\n ): Promise<TransactionVerificationResponse> {\n const startTime = Date.now();\n\n this.validateTransactionRequest(request);\n\n try {\n if (this.config.debug) {\n this.logger.debug('Starting transaction verification', {\n customerId: request.customerId,\n amount: request.amount,\n currency: request.currency,\n });\n }\n\n // Step 1: Verify geolocation and fetch profile in parallel\n const [geoVerification, profile] = await Promise.all([\n this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'transaction',\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions),\n this.riskClient.getProfile(request.customerId, requestOptions),\n ]);\n\n // Step 2: Calculate transaction risk\n const transactionRisk = this.calculateTransactionRisk(\n request.amount,\n request.currency,\n geoVerification,\n profile\n );\n\n // Step 4: Check jurisdiction limits\n const jurisdictionAllowed = this.checkJurisdictionLimits(\n request.amount,\n request.currency,\n geoVerification.jurisdiction\n );\n\n // Step 5: Determine if transaction is allowed\n const isAllowed =\n geoVerification.is_compliant &&\n !geoVerification.is_blocked &&\n jurisdictionAllowed &&\n transactionRisk.allowed;\n\n return {\n allowed: isAllowed,\n geolocation: geoVerification,\n profile: profile,\n transactionRisk: transactionRisk,\n requiresApproval: transactionRisk.requiresManualReview,\n blockReasons: this.getTransactionBlockReasons(\n geoVerification,\n transactionRisk,\n jurisdictionAllowed\n ),\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n throw new ComplianceError('Transaction verification failed', error);\n }\n }\n\n /**\n * Generic event verification (for other touchpoints)\n *\n * @param request - Event verification request\n * @returns Verification response\n */\n async verifyEvent(request: EventVerificationRequest, requestOptions?: RequestOptions): Promise<EventVerificationResponse> {\n const startTime = Date.now();\n\n this.validateEventRequest(request);\n\n const geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: request.eventType,\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions);\n\n // Optionally update profile activity\n if (this.config.autoCreateProfiles) {\n try {\n const profile = await this.riskClient.getProfile(request.customerId, requestOptions);\n await this.riskClient.updateProfile(profile.id, {\n last_recorded_activity: new Date().toISOString(),\n }, requestOptions);\n } catch (error) {\n // Profile doesn't exist, ignore or create based on config\n if (this.config.debug) {\n this.logger.warn('Profile not found for event');\n }\n }\n }\n\n return {\n allowed: geoVerification.is_compliant && !geoVerification.is_blocked,\n geolocation: geoVerification,\n blockReasons: geoVerification.risk_reasons,\n processingTime: Date.now() - startTime,\n };\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n private shouldUpdateProfile(profile: CustomerProfile, newCity: string): boolean {\n // Update if location changed significantly\n return !profile.location || !profile.location.includes(newCity);\n }\n\n private async createProfileFromGeo(\n customerId: string,\n geoVerification: LocationVerification,\n customerData?: {\n fullName?: string;\n email?: string;\n phone?: string;\n dateOfBirth?: string;\n }\n ): Promise<CustomerProfile> {\n // Warn if creating profile without proper customer data\n if (!customerData?.email || !customerData?.fullName) {\n this.logger.warn(\n `Creating profile for ${customerId} with incomplete data. ` +\n 'Profiles should be created during registration with complete customer information.'\n );\n }\n\n return this.riskClient.createProfile({\n customer_id: customerId,\n entity_type: 'individual',\n customer_status: 'active',\n full_name: customerData?.fullName || undefined,\n email_address: customerData?.email || '',\n primary_phone_number: customerData?.phone || undefined,\n date_of_birth: customerData?.dateOfBirth || undefined,\n location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n country_of_residence: geoVerification.location.country_iso,\n kyc_status: 'pending',\n });\n }\n\n private calculateTransactionRisk(\n amount: number,\n currency: string,\n geoVerification: LocationVerification,\n profile: CustomerProfile\n ): TransactionRiskResult {\n if (!this._currencyRatesCustomized && !this._currencyRatesWarned) {\n this._currencyRatesWarned = true;\n this.logger.warn(\n 'Using default currency exchange rates. ' +\n 'Call updateCurrencyRates() or fetchCurrencyRates() for accurate transaction risk calculation.'\n );\n }\n\n let riskScore = 0;\n const factors: string[] = [];\n\n // Amount-based risk (normalized to USD)\n const normalizedAmount = this.normalizeToUSD(amount, currency);\n if (normalizedAmount > 10000) {\n riskScore += 30;\n factors.push('high_transaction_amount');\n } else if (normalizedAmount > 5000) {\n riskScore += 15;\n factors.push('elevated_transaction_amount');\n }\n\n // Geo risk\n riskScore += geoVerification.risk_score * 0.4;\n if (geoVerification.risk_level === 'high' || geoVerification.risk_level === 'critical') {\n factors.push('high_risk_location');\n }\n\n // Profile risk\n riskScore += profile.risk_score * 0.3;\n if (profile.risk_category === 'high' || profile.risk_category === 'critical') {\n factors.push('high_risk_customer');\n }\n\n // VPN/anonymizer during transaction\n if (geoVerification.location.is_vpn || geoVerification.location.is_proxy) {\n riskScore += 20;\n factors.push('anonymization_detected');\n }\n\n // Suspended account\n if (profile.customer_status === 'suspended') {\n riskScore += 50;\n factors.push('account_suspended');\n }\n\n return {\n score: Math.min(riskScore, 100),\n level: this.getRiskLevel(riskScore),\n factors: factors,\n allowed: riskScore < 70,\n requiresManualReview: riskScore >= 60 && riskScore < 70,\n };\n }\n\n private checkJurisdictionLimits(\n amount: number,\n currency: string,\n jurisdiction?: JurisdictionConfig\n ): boolean {\n if (!jurisdiction || !jurisdiction.max_transaction_amount) {\n return true;\n }\n\n const normalizedAmount = this.normalizeToUSD(amount, currency);\n return normalizedAmount <= jurisdiction.max_transaction_amount;\n }\n\n private normalizeToUSD(amount: number, currency: string): number {\n const rate = this.currencyRates[currency.toUpperCase()] || 1;\n return amount * rate;\n }\n\n private getRiskLevel(score: number): 'low' | 'medium' | 'high' | 'critical' {\n if (score >= 80) return 'critical';\n if (score >= 60) return 'high';\n if (score >= 40) return 'medium';\n return 'low';\n }\n\n private getBlockReasons(geoVerification: LocationVerification, profile: CustomerProfile): string[] {\n const reasons: string[] = [];\n\n if (geoVerification.is_blocked) {\n reasons.push(...geoVerification.risk_reasons);\n }\n\n if (profile.customer_status === 'suspended') {\n reasons.push('account_suspended');\n }\n\n if (profile.has_sanctions) {\n reasons.push('sanctions_match');\n }\n\n return reasons;\n }\n\n private getTransactionBlockReasons(\n geoVerification: LocationVerification,\n transactionRisk: TransactionRiskResult,\n jurisdictionAllowed: boolean\n ): string[] {\n const reasons: string[] = [];\n\n if (!geoVerification.is_compliant) {\n reasons.push('non_compliant_jurisdiction');\n }\n\n if (!jurisdictionAllowed) {\n reasons.push('exceeds_jurisdiction_limit');\n }\n\n if (!transactionRisk.allowed) {\n reasons.push(...transactionRisk.factors);\n }\n\n return reasons;\n }\n\n // ============================================================================\n // Location Request Methods\n // ============================================================================\n\n /**\n * Request live location from a customer\n *\n * Creates a location request and sends a notification to the customer\n * via the specified channel (SMS, email, or push). The customer receives\n * a link to share their location.\n *\n * @param input - Location request details\n * @returns Location request result with share link\n *\n * @example\n * ```typescript\n * // Request location via SMS for transaction verification\n * const result = await sdk.requestCustomerLocation({\n * customerId: 'CUST-12345',\n * channel: 'sms',\n * phone: '+1234567890',\n * reason: 'Verification required for high-value transaction'\n * });\n *\n * console.log('Share link sent:', result.shareLink);\n * console.log('Expires at:', result.tokenExpiry);\n *\n * // Request location via email\n * const emailResult = await sdk.requestCustomerLocation({\n * customerId: 'CUST-12345',\n * channel: 'email',\n * email: 'customer@example.com',\n * reason: 'Account verification',\n * expiryHours: 48\n * });\n * ```\n */\n async requestCustomerLocation(\n input: ComplianceLocationRequestInput,\n requestOptions?: RequestOptions\n ): Promise<ComplianceLocationRequestResult> {\n if (this.config.debug) {\n this.logger.debug('Creating location request for customer', { customerId: input.customerId });\n }\n\n // Validate input\n this.validateLocationRequestInput(input);\n\n // Get customer profile if available\n let profile: CustomerProfile | undefined;\n try {\n profile = await this.riskClient.getProfile(input.customerId, requestOptions);\n } catch (error) {\n if (this.config.debug) {\n this.logger.warn('Customer profile not found', { customerId: input.customerId });\n }\n }\n\n // Use profile data if contact info not provided\n const phone = input.phone || profile?.primary_phone_number;\n const email = input.email || profile?.email_address;\n\n // Create the location request\n const result = await this.geoClient.createLocationRequest({\n user_id: input.customerId,\n channel: input.channel,\n reason: input.reason,\n phone: phone,\n email: email,\n expiry_hours: input.expiryHours,\n }, requestOptions);\n\n if (this.config.debug) {\n this.logger.debug('Location request created', {\n requestId: result.request.id,\n channel: input.channel,\n expiresAt: result.token_expiry,\n });\n }\n\n return {\n request: result.request,\n shareLink: result.share_link,\n tokenExpiry: result.token_expiry,\n profile: profile,\n };\n }\n\n /**\n * Get a specific location request by ID\n *\n * @param requestId - Location request ID\n * @returns Location request details\n *\n * @example\n * ```typescript\n * const request = await sdk.getLocationRequest('req_abc123');\n * console.log('Status:', request.status);\n * if (request.latitude && request.longitude) {\n * console.log('Location captured:', request.latitude, request.longitude);\n * }\n * ```\n */\n async getLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<LocationRequest> {\n return this.geoClient.getLocationRequest(requestId, requestOptions);\n }\n\n /**\n * List location requests with filters and pagination\n *\n * @param filters - Optional filters\n * @param pagination - Optional pagination\n * @returns Paginated list of location requests\n *\n * @example\n * ```typescript\n * // Get pending requests for a customer\n * const pending = await sdk.listLocationRequests(\n * { status: 'pending', user_id: 'CUST-12345' },\n * { page: 1, limit: 20 }\n * );\n *\n * // Get all completed requests from last week\n * const completed = await sdk.listLocationRequests({\n * status: 'completed',\n * date_from: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString()\n * });\n * ```\n */\n async listLocationRequests(\n filters?: LocationRequestFilters,\n pagination?: PaginationParams,\n requestOptions?: RequestOptions\n ): Promise<LocationRequestListResponse> {\n return this.geoClient.listLocationRequests(filters, pagination, requestOptions);\n }\n\n /**\n * Cancel a pending location request\n *\n * @param requestId - Location request ID\n *\n * @example\n * ```typescript\n * await sdk.cancelLocationRequest('req_abc123');\n * ```\n */\n async cancelLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<void> {\n if (this.config.debug) {\n this.logger.debug('Cancelling location request', { requestId });\n }\n await this.geoClient.cancelLocationRequest(requestId, requestOptions);\n }\n\n /**\n * Resend notification for a location request\n *\n * @param requestId - Location request ID\n * @param contact - Contact details (email or phone)\n *\n * @example\n * ```typescript\n * // Resend to a different phone number\n * await sdk.resendLocationRequest('req_abc123', { phone: '+0987654321' });\n *\n * // Resend to email\n * await sdk.resendLocationRequest('req_abc123', { email: 'new@example.com' });\n * ```\n */\n async resendLocationRequest(\n requestId: string,\n contact: { email?: string; phone?: string },\n requestOptions?: RequestOptions\n ): Promise<void> {\n if (this.config.debug) {\n this.logger.debug('Resending location request', { requestId });\n }\n await this.geoClient.resendLocationRequest(requestId, contact, requestOptions);\n }\n\n /**\n * Validate location request input\n */\n private validateLocationRequestInput(input: ComplianceLocationRequestInput): void {\n const errors: string[] = [];\n\n if (!input.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!input.channel) {\n errors.push('channel is required');\n }\n\n if (!input.reason?.trim()) {\n errors.push('reason is required for compliance/audit purposes');\n }\n\n // Channel-specific validation\n if (input.channel === 'sms' && !input.phone) {\n errors.push('phone is required for SMS channel');\n }\n\n if (input.channel === 'email' && !input.email) {\n errors.push('email is required for email channel');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid location request: ${errors.join(', ')}`, errors);\n }\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Update currency exchange rates\n *\n * Use this to keep currency rates current for accurate transaction risk\n * calculation. Rates should be updated regularly (e.g., daily).\n *\n * @param rates - Currency to USD exchange rates\n *\n * @example\n * ```typescript\n * // Update specific rates\n * sdk.updateCurrencyRates({\n * EUR: 1.08,\n * GBP: 1.25,\n * BTC: 42000, // For crypto support\n * });\n *\n * // Or fetch from external service\n * const rates = await fetchExchangeRates();\n * sdk.updateCurrencyRates(rates);\n * ```\n */\n updateCurrencyRates(rates: CurrencyRates): void {\n this.currencyRates = { ...this.currencyRates, ...rates };\n this._currencyRatesCustomized = true;\n }\n\n /**\n * Get current currency rates\n *\n * @returns Current currency to USD exchange rates\n */\n getCurrencyRates(): Readonly<CurrencyRates> {\n return { ...this.currencyRates };\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/errors.ts","../../src/core/circuit-breaker.ts","../../src/core/rate-limiter.ts","../../src/core/logger.ts","../../src/core/version.ts","../../src/shared/browser-utils.ts","../../src/core/client.ts","../../src/geolocation/ciphertext.ts","../../src/geolocation/client.ts","../../src/risk-profile/client.ts","../../src/compliance/types.ts","../../src/compliance/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Error hierarchy for CGS SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class CGSError extends Error {\n public requestId?: string;\n\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'CGSError';\n Object.setPrototypeOf(this, CGSError.prototype);\n }\n}\n\nexport class NetworkError extends CGSError {\n constructor(message: string, public originalError?: unknown) {\n super(message, 'NETWORK_ERROR', undefined, { originalError });\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\nexport class ValidationError extends CGSError {\n constructor(message: string, fields?: string[]) {\n super(message, 'VALIDATION_ERROR', 400, { fields });\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class ServiceUnavailableError extends CGSError {\n constructor(message: string) {\n super(`${message} is unavailable`, 'SERVICE_UNAVAILABLE', 503, { service: message });\n this.name = 'ServiceUnavailableError';\n Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n }\n}\n\nexport class ComplianceBlockedError extends CGSError {\n constructor(reasons: string[]) {\n super('Access blocked due to compliance rules', 'COMPLIANCE_BLOCKED', 403, { reasons });\n this.name = 'ComplianceBlockedError';\n Object.setPrototypeOf(this, ComplianceBlockedError.prototype);\n }\n}\n\nexport class AuthenticationError extends CGSError {\n constructor(message: string = 'Authentication failed') {\n super(message, 'AUTHENTICATION_ERROR', 401);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\nexport class RateLimitError extends CGSError {\n constructor(public retryAfter?: number) {\n super('Rate limit exceeded', 'RATE_LIMIT_EXCEEDED', 429, { retryAfter });\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\nexport class TimeoutError extends CGSError {\n constructor(public timeout: number) {\n super(`Request timeout after ${timeout}ms`, 'TIMEOUT', 408, { timeout });\n this.name = 'TimeoutError';\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\nexport class ComplianceError extends CGSError {\n constructor(\n message: string,\n public originalError?: unknown,\n code: string = 'COMPLIANCE_ERROR'\n ) {\n super(message, code, undefined, { originalError });\n this.name = 'ComplianceError';\n Object.setPrototypeOf(this, ComplianceError.prototype);\n }\n}\n\nexport class CircuitBreakerOpenError extends CGSError {\n constructor() {\n super('Circuit breaker is open — requests are temporarily blocked', 'CIRCUIT_BREAKER_OPEN', 503);\n this.name = 'CircuitBreakerOpenError';\n Object.setPrototypeOf(this, CircuitBreakerOpenError.prototype);\n }\n}\n","/**\n * Circuit breaker pattern for resilient HTTP requests.\n *\n * States: closed (normal) -> open (failing) -> half-open (testing) -> closed\n */\n\nexport type CircuitBreakerState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n /** Number of consecutive failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms to wait before transitioning from open to half-open (default: 30000) */\n resetTimeout?: number;\n /** Number of successes in half-open state before closing (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreakerStatus {\n state: CircuitBreakerState;\n failures: number;\n successes: number;\n lastFailureTime: number | null;\n nextRetryTime: number | null;\n}\n\nexport class CircuitBreaker {\n private state: CircuitBreakerState = 'closed';\n private failures = 0;\n private successes = 0;\n private lastFailureTime: number | null = null;\n\n private readonly failureThreshold: number;\n private readonly resetTimeout: number;\n private readonly successThreshold: number;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.failureThreshold = config.failureThreshold ?? 5;\n this.resetTimeout = config.resetTimeout ?? 30000;\n this.successThreshold = config.successThreshold ?? 1;\n }\n\n /**\n * Check if a request can proceed through the circuit breaker.\n */\n canExecute(): boolean {\n if (this.state === 'closed') {\n return true;\n }\n\n if (this.state === 'open') {\n const now = Date.now();\n if (this.lastFailureTime && now - this.lastFailureTime >= this.resetTimeout) {\n this.state = 'half-open';\n this.successes = 0;\n return true;\n }\n return false;\n }\n\n // half-open: allow requests through for testing\n return true;\n }\n\n /**\n * Record a successful request.\n */\n onSuccess(): void {\n if (this.state === 'half-open') {\n this.successes++;\n if (this.successes >= this.successThreshold) {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n } else if (this.state === 'closed') {\n this.failures = 0;\n }\n }\n\n /**\n * Record a failed request.\n */\n onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.state === 'half-open') {\n this.state = 'open';\n this.successes = 0;\n } else if (this.state === 'closed' && this.failures >= this.failureThreshold) {\n this.state = 'open';\n }\n }\n\n /**\n * Get current circuit breaker status.\n */\n getStatus(): CircuitBreakerStatus {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n nextRetryTime:\n this.state === 'open' && this.lastFailureTime\n ? this.lastFailureTime + this.resetTimeout\n : null,\n };\n }\n\n /**\n * Reset the circuit breaker to its initial closed state.\n */\n reset(): void {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n}\n","/**\n * Rate limit tracking from API response headers.\n *\n * Tracks X-RateLimit-* headers to enable pre-flight checks\n * before making requests.\n */\n\nexport interface RateLimitStatus {\n /** Maximum requests allowed in the window */\n limit: number | null;\n /** Remaining requests in the current window */\n remaining: number | null;\n /** Unix timestamp (seconds) when the rate limit resets */\n reset: number | null;\n /** Seconds until the rate limit resets */\n retryAfter: number | null;\n}\n\nexport class RateLimitTracker {\n private limit: number | null = null;\n private remaining: number | null = null;\n private reset: number | null = null;\n private retryAfter: number | null = null;\n\n /**\n * Extract rate limit information from response headers.\n */\n updateFromHeaders(headers: Headers): void {\n const limit = headers.get('x-ratelimit-limit');\n const remaining = headers.get('x-ratelimit-remaining');\n const reset = headers.get('x-ratelimit-reset');\n const retryAfter = headers.get('retry-after');\n\n if (limit !== null) this.limit = parseInt(limit, 10);\n if (remaining !== null) this.remaining = parseInt(remaining, 10);\n if (reset !== null) this.reset = parseInt(reset, 10);\n if (retryAfter !== null) this.retryAfter = parseInt(retryAfter, 10);\n }\n\n /**\n * Check if the rate limit has been exceeded based on tracked headers.\n */\n isLimitExceeded(): boolean {\n if (this.remaining !== null && this.remaining <= 0) {\n // Check if the reset time has passed\n if (this.reset !== null) {\n const now = Math.floor(Date.now() / 1000);\n if (now >= this.reset) {\n // Reset window has passed, allow requests\n this.remaining = null;\n this.reset = null;\n this.retryAfter = null;\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n /**\n * Get current rate limit status.\n */\n getStatus(): RateLimitStatus {\n return {\n limit: this.limit,\n remaining: this.remaining,\n reset: this.reset,\n retryAfter: this.retryAfter,\n };\n }\n}\n","import type { Logger } from './config';\n\nexport function createConsoleLogger(): Logger {\n return {\n debug(message: string, meta?: Record<string, unknown>) {\n console.log(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n info(message: string, meta?: Record<string, unknown>) {\n console.info(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n error(message: string, meta?: Record<string, unknown>) {\n console.error(`[CGS SDK] ${message}`, meta !== undefined ? meta : '');\n },\n };\n}\n\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '1.4.4';\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return generateUUID();\n }\n\n const storageKey = 'cgs_device_id';\n let deviceId = localStorage.getItem(storageKey);\n\n if (!deviceId) {\n deviceId = generateUUID();\n localStorage.setItem(storageKey, deviceId);\n }\n\n return deviceId;\n}\n\n/**\n * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n browser: string;\n browser_version: string;\n os: string;\n os_version: string;\n} {\n if (typeof navigator === 'undefined') {\n return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n }\n\n const ua = navigator.userAgent;\n let browser = 'unknown';\n let browserVersion = '';\n let os = 'unknown';\n let osVersion = '';\n\n // Detect browser\n if (ua.includes('Firefox/')) {\n browser = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Edg/')) {\n browser = 'Edge';\n browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Chrome/')) {\n browser = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n browser = 'Safari';\n browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n browser = 'Opera';\n browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n }\n\n // Detect OS\n if (ua.includes('Windows')) {\n os = 'Windows';\n if (ua.includes('Windows NT 10.0')) osVersion = '10';\n else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n } else if (ua.includes('Mac OS X')) {\n os = 'macOS';\n osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n } else if (ua.includes('Linux')) {\n os = 'Linux';\n } else if (ua.includes('Android')) {\n os = 'Android';\n osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n os = 'iOS';\n osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n }\n\n return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n","/**\n * Base HTTP client for all CGS SDK clients\n *\n * Provides common functionality:\n * - Request/response handling\n * - Error handling\n * - Retry logic with exponential backoff\n * - Timeout management\n * - Debug logging\n */\n\nimport type { BaseClientConfig, Logger, RequestInterceptor, RequestOptions } from './config';\nimport {\n CGSError,\n NetworkError,\n TimeoutError,\n AuthenticationError,\n RateLimitError,\n ServiceUnavailableError,\n ValidationError,\n CircuitBreakerOpenError,\n} from './errors';\nimport { CircuitBreaker, type CircuitBreakerStatus } from './circuit-breaker';\nimport { RateLimitTracker, type RateLimitStatus } from './rate-limiter';\nimport { createConsoleLogger } from './logger';\nimport { SDK_VERSION } from './version';\nimport { generateUUID } from '../shared/browser-utils';\n\nexport abstract class BaseClient {\n protected config: BaseClientConfig & { timeout: number; retries: number };\n protected logger: Logger;\n private interceptors: RequestInterceptor[];\n private circuitBreaker: CircuitBreaker | null = null;\n private rateLimitTracker: RateLimitTracker | null = null;\n\n constructor(config: BaseClientConfig) {\n if (!config.baseURL?.trim()) {\n throw new ValidationError('baseURL is required and must be a non-empty string', ['baseURL']);\n }\n if (!config.tenantId?.trim()) {\n throw new ValidationError('tenantId is required and must be a non-empty string', ['tenantId']);\n }\n\n this.interceptors = config.interceptors || [];\n this.logger = config.logger || createConsoleLogger();\n this.config = {\n ...config,\n apiKey: config.apiKey || '',\n headers: config.headers || {},\n timeout: config.timeout || 10000,\n retries: config.retries || 3,\n debug: config.debug || false,\n interceptors: this.interceptors,\n logger: this.logger,\n };\n\n if (config.circuitBreaker) {\n this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n }\n if (config.enableRateLimitTracking) {\n this.rateLimitTracker = new RateLimitTracker();\n }\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n protected async request<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n requestOptions?: RequestOptions\n ): Promise<T> {\n const requestId = generateUUID();\n\n // Circuit breaker check\n if (this.circuitBreaker && !this.circuitBreaker.canExecute()) {\n const error = new CircuitBreakerOpenError();\n error.requestId = requestId;\n throw error;\n }\n\n // Rate limit pre-check\n if (this.rateLimitTracker && this.rateLimitTracker.isLimitExceeded()) {\n const status = this.rateLimitTracker.getStatus();\n const error = new RateLimitError(status.retryAfter ?? undefined);\n error.requestId = requestId;\n throw error;\n }\n\n const url = `${serviceURL || this.config.baseURL}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Tenant-ID': this.config.tenantId,\n 'X-SDK-Version': `vesant-sdk-ts/${SDK_VERSION}`,\n 'X-Request-ID': requestId,\n ...this.config.headers,\n ...((options.headers as Record<string, string>) || {}),\n };\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Sandbox header\n if (this.config.environment === 'sandbox') {\n headers['X-Sandbox'] = 'true';\n }\n\n // Idempotency key for mutating methods\n const method = (options.method || 'GET').toUpperCase();\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n headers['Idempotency-Key'] = requestOptions?.idempotencyKey || generateUUID();\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n // Link consumer AbortSignal to internal controller\n if (requestOptions?.signal) {\n if (requestOptions.signal.aborted) {\n controller.abort();\n } else {\n requestOptions.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n }\n\n try {\n // Run onRequest interceptors\n let finalOptions: RequestInit = { ...options, headers };\n for (const interceptor of this.interceptors) {\n if (interceptor.onRequest) {\n finalOptions = await interceptor.onRequest(url, finalOptions);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug(`${finalOptions.method || 'GET'} ${url}`, {\n headers: finalOptions.headers as Record<string, unknown>,\n body: finalOptions.body as unknown,\n });\n }\n\n const response = await fetch(url, {\n ...finalOptions,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Track rate limit headers\n if (this.rateLimitTracker) {\n this.rateLimitTracker.updateFromHeaders(response.headers);\n }\n\n let data: Record<string, unknown> | undefined;\n try {\n data = await response.json();\n } catch {\n // Non-JSON response (HTML error pages, 204 No Content, etc.)\n if (!response.ok) {\n this.handleErrorResponse(response.status, {\n error: `HTTP ${response.status}`,\n message: response.statusText,\n }, requestId);\n }\n // OK response but no JSON body (e.g., 204)\n this.circuitBreaker?.onSuccess();\n return undefined as unknown as T;\n }\n\n if (!response.ok) {\n this.handleErrorResponse(response.status, data || {}, requestId);\n }\n\n // Record success for circuit breaker\n this.circuitBreaker?.onSuccess();\n\n // Run onResponse interceptors\n let result: unknown = data;\n for (const interceptor of this.interceptors) {\n if (interceptor.onResponse) {\n result = await interceptor.onResponse(url, result);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug('Response:', { data: result });\n }\n\n return result as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Record failure for circuit breaker (skip for client errors)\n if (\n error instanceof CGSError &&\n error.statusCode &&\n error.statusCode >= 500\n ) {\n this.circuitBreaker?.onFailure();\n } else if (error instanceof NetworkError || error instanceof TimeoutError) {\n this.circuitBreaker?.onFailure();\n }\n\n // Attach requestId to CGSError instances\n if (error instanceof CGSError && !error.requestId) {\n error.requestId = requestId;\n }\n\n // Run onError interceptors\n if (error instanceof Error) {\n for (const interceptor of this.interceptors) {\n if (interceptor.onError) {\n await interceptor.onError(url, error);\n }\n }\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n // Distinguish consumer abort from timeout\n if (requestOptions?.signal?.aborted) {\n const abortError = new CGSError('Request aborted', 'REQUEST_ABORTED');\n abortError.requestId = requestId;\n throw abortError;\n }\n this.circuitBreaker?.onFailure();\n const timeoutError = new TimeoutError(this.config.timeout);\n timeoutError.requestId = requestId;\n throw timeoutError;\n }\n if (error instanceof CGSError) {\n throw error;\n }\n }\n\n const networkError = new NetworkError('Network request failed', error);\n networkError.requestId = requestId;\n this.circuitBreaker?.onFailure();\n throw networkError;\n }\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n protected async requestWithRetry<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n retries: number = this.config.retries,\n requestOptions?: RequestOptions\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await this.request<T>(endpoint, options, serviceURL, requestOptions);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error');\n\n // Don't retry on consumer abort\n if (requestOptions?.signal?.aborted) {\n throw lastError;\n }\n\n // Don't retry on client errors (4xx), except 429 (rate limit)\n if (\n lastError instanceof CGSError &&\n lastError.statusCode &&\n lastError.statusCode >= 400 &&\n lastError.statusCode < 500 &&\n lastError.statusCode !== 429\n ) {\n throw lastError;\n }\n\n // Don't retry on last attempt\n if (attempt === retries) {\n break;\n }\n\n // Use Retry-After for 429, otherwise exponential backoff with jitter\n let delay: number;\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n delay = lastError.retryAfter * 1000;\n } else {\n delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n if (this.config.debug) {\n this.logger.debug(`Retry attempt ${attempt + 1}/${retries} after ${delay.toFixed(0)}ms`);\n }\n }\n }\n\n throw new NetworkError(`Request failed after ${retries} retries`, lastError);\n }\n\n /**\n * Handle error responses from API\n */\n protected handleErrorResponse(status: number, data: Record<string, unknown>, requestId?: string): never {\n const message = (data.error as string) || (data.message as string) || `HTTP ${status}`;\n\n const createError = (): CGSError => {\n switch (status) {\n case 400:\n return new CGSError(message, 'BAD_REQUEST', 400, data);\n case 401:\n return new AuthenticationError(message);\n case 403:\n return new CGSError(message, 'FORBIDDEN', 403, data);\n case 404:\n return new CGSError(message, 'NOT_FOUND', 404, data);\n case 429: {\n const retryAfter = (data.retry_after as number | undefined) || (data.retryAfter as number | undefined);\n return new RateLimitError(retryAfter);\n }\n case 500:\n case 502:\n case 503:\n case 504:\n return new ServiceUnavailableError(message);\n default:\n return new CGSError(message, 'UNKNOWN_ERROR', status, data);\n }\n };\n\n const error = createError();\n if (requestId) {\n error.requestId = requestId;\n }\n throw error;\n }\n\n /**\n * Build query string from parameters\n */\n protected buildQueryString(params: Record<string, unknown>): string {\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((item) => query.append(key, String(item)));\n } else {\n query.append(key, String(value));\n }\n }\n });\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<BaseClientConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n headers: {\n ...this.config.headers,\n ...(config.headers || {}),\n },\n };\n if (config.logger) {\n this.logger = config.logger;\n }\n if (config.interceptors) {\n this.interceptors = config.interceptors;\n }\n }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<BaseClientConfig> {\n return { ...this.config };\n }\n\n /**\n * Get rate limit status from tracked response headers.\n */\n getRateLimitStatus(): RateLimitStatus | null {\n return this.rateLimitTracker?.getStatus() ?? null;\n }\n\n /**\n * Get circuit breaker status.\n */\n getCircuitBreakerStatus(): CircuitBreakerStatus | null {\n return this.circuitBreaker?.getStatus() ?? null;\n }\n\n /**\n * Health check endpoint\n */\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n return this.request('/api/v1/health');\n }\n}\n","/**\n * CipherText Generation Utility\n *\n * Collects device fingerprint and location data from the browser,\n * encrypts it into a cipherText that can be validated by the server.\n *\n * The cipherText is used for:\n * - Registration verification\n * - Login verification\n * - Transaction verification\n * - Periodic location checks\n */\n\nimport type {\n CipherTextPayload,\n CipherTextOptions,\n CipherTextResult,\n CipherTextReason,\n GeolocationConfigResponse,\n} from './types';\nimport { SDK_VERSION } from '../core/version';\nimport { getBrowserInfo, generateDeviceId as getOrCreateDeviceId } from '../shared/browser-utils';\n\nconst CIPHER_TEXT_EXPIRY_MINUTES = 5;\n\n/**\n * Compute HMAC-SHA256 of a message using the given key.\n * Uses Web Crypto API (browser/modern Node) with node:crypto fallback.\n */\nasync function computeHMAC(key: string, message: string): Promise<string> {\n // Try Web Crypto API first (works in browsers and Node 18+)\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const msgData = encoder.encode(message);\n\n const cryptoKey = await globalThis.crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signature = await globalThis.crypto.subtle.sign('HMAC', cryptoKey, msgData);\n const bytes = new Uint8Array(signature);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n // Fallback: Node.js crypto module\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createHmac } = await import('node:crypto');\n return createHmac('sha256', key).update(message).digest('hex');\n}\n\n/**\n * Get WebGL renderer information for fingerprinting\n */\nfunction getWebGLInfo(): { vendor: string; renderer: string } | null {\n if (typeof document === 'undefined') return null;\n\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n\n if (!gl) return null;\n\n const debugInfo = (gl as WebGLRenderingContext).getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return null;\n\n return {\n vendor: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '',\n renderer: (gl as WebGLRenderingContext).getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get network information if available\n */\nfunction getNetworkInfo(): CipherTextPayload['network'] | undefined {\n if (typeof navigator === 'undefined') return undefined;\n\n const connection = (navigator as any).connection ||\n (navigator as any).mozConnection ||\n (navigator as any).webkitConnection;\n\n if (!connection) return undefined;\n\n return {\n effective_type: connection.effectiveType,\n downlink: connection.downlink,\n rtt: connection.rtt,\n save_data: connection.saveData,\n };\n}\n\n/**\n * Request GPS location from the browser\n */\nasync function requestGPSLocation(\n timeout: number = 10000,\n highAccuracy: boolean = true\n): Promise<CipherTextPayload['location'] | null> {\n if (typeof navigator === 'undefined' || !navigator.geolocation) {\n return null;\n }\n\n return new Promise((resolve) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const { latitude, longitude, accuracy } = position.coords;\n\n // Validate coordinates\n if (latitude < -90 || latitude > 90) {\n resolve(null);\n return;\n }\n if (longitude < -180 || longitude > 180) {\n resolve(null);\n return;\n }\n if (accuracy !== null && accuracy !== undefined && accuracy <= 0) {\n resolve(null);\n return;\n }\n\n resolve({\n latitude,\n longitude,\n accuracy,\n altitude: position.coords.altitude ?? undefined,\n altitude_accuracy: position.coords.altitudeAccuracy ?? undefined,\n heading: position.coords.heading ?? undefined,\n speed: position.coords.speed ?? undefined,\n timestamp: position.timestamp,\n });\n },\n () => {\n // Location denied or error - resolve with null (non-fatal)\n resolve(null);\n },\n {\n enableHighAccuracy: highAccuracy,\n timeout: timeout,\n maximumAge: 0,\n }\n );\n });\n}\n\n/**\n * Collect device fingerprint data\n */\nfunction collectDeviceData(includeWebGL: boolean): CipherTextPayload['device'] {\n const browserInfo = getBrowserInfo();\n const webglInfo = includeWebGL ? getWebGLInfo() : null;\n\n return {\n device_id: getOrCreateDeviceId(),\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n platform: typeof navigator !== 'undefined' ? navigator.platform : '',\n browser: browserInfo.browser,\n browser_version: browserInfo.browser_version,\n os: browserInfo.os,\n os_version: browserInfo.os_version,\n screen_resolution:\n typeof screen !== 'undefined' ? `${screen.width}x${screen.height}` : undefined,\n language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n timezone: Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone,\n color_depth: typeof screen !== 'undefined' ? screen.colorDepth : undefined,\n hardware_concurrency:\n typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : undefined,\n device_memory: typeof navigator !== 'undefined' ? (navigator as any).deviceMemory : undefined,\n touch_support:\n typeof navigator !== 'undefined' ? navigator.maxTouchPoints > 0 : undefined,\n webgl_vendor: webglInfo?.vendor,\n webgl_renderer: webglInfo?.renderer,\n };\n}\n\n/**\n * Encode payload to base64\n */\nfunction encodePayload(payload: CipherTextPayload): string {\n const json = JSON.stringify(payload);\n\n if (typeof btoa !== 'undefined') {\n // Browser\n return btoa(unescape(encodeURIComponent(json)));\n } else if (typeof Buffer !== 'undefined') {\n // Node.js\n return Buffer.from(json, 'utf-8').toString('base64');\n }\n\n throw new Error('No base64 encoding method available');\n}\n\n/**\n * Generate a cipherText containing encrypted device and location data\n *\n * @param options - Options for cipherText generation\n * @returns CipherText result with the encrypted string\n *\n * @example\n * ```typescript\n * // Basic usage for login\n * const result = await generateCipherText({ reason: 'login' });\n * console.log(result.cipherText);\n *\n * // With GPS location for registration\n * const result = await generateCipherText({\n * reason: 'registration',\n * requestLocation: true,\n * locationTimeout: 15000\n * });\n *\n * if (result.locationCaptured) {\n * console.log('GPS location included');\n * }\n * ```\n */\nexport async function generateCipherText(\n options: CipherTextOptions,\n config?: GeolocationConfigResponse\n): Promise<CipherTextResult> {\n const warnings: string[] = [];\n\n // Auto-enable GPS if tenant config requires it for this event type\n let requestLocation = options.requestLocation ?? false;\n let gpsRequiredByConfig = false;\n if (config?.require_gps) {\n const reason = options.reason;\n if (\n (reason === 'login' && config.require_gps.login) ||\n (reason === 'registration' && config.require_gps.registration) ||\n (reason === 'transaction' && config.require_gps.transaction)\n ) {\n if (!requestLocation) {\n gpsRequiredByConfig = true;\n }\n requestLocation = true;\n }\n }\n\n // Collect device data\n const deviceData = collectDeviceData(options.includeWebGL !== false);\n\n // Optionally request GPS location\n let locationData: CipherTextPayload['location'] | undefined;\n if (requestLocation) {\n const location = await requestGPSLocation(\n options.locationTimeout || 10000,\n options.highAccuracy !== false\n );\n\n if (location) {\n locationData = location;\n } else if (gpsRequiredByConfig) {\n throw new Error(\n `GPS location is required for ${options.reason} by tenant configuration, but GPS was not available or permission was denied`\n );\n } else {\n warnings.push('GPS location not available or permission denied');\n }\n }\n\n // Collect network info\n let networkData: CipherTextPayload['network'] | undefined;\n if (options.includeNetworkInfo !== false) {\n networkData = getNetworkInfo();\n }\n\n // Build payload\n const now = new Date();\n const expiry = new Date(now.getTime() + CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000);\n\n const payload: CipherTextPayload = {\n device: deviceData,\n location: locationData,\n network: networkData,\n metadata: {\n collected_at: now.toISOString(),\n sdk_version: SDK_VERSION,\n collection_reason: options.reason,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer || undefined : undefined,\n },\n };\n\n // Encode payload (no obfuscation - HTTPS provides transport security)\n const encoded = encodePayload(payload);\n\n // Create final cipherText with version and timestamp prefix\n const timestamp = now.getTime().toString(36); // Base36 timestamp\n\n let cipherText: string;\n const hmacKey = options.signingKey || options.apiKey;\n if (hmacKey) {\n // v02: HMAC-signed — format: 02.{timestamp}.{base64}.{hmac}\n const message = `02.${timestamp}.${encoded}`;\n const hmac = await computeHMAC(hmacKey, message);\n cipherText = `${message}.${hmac}`;\n } else {\n // v01: unsigned (backwards compat)\n cipherText = `01.${timestamp}.${encoded}`;\n }\n\n return {\n cipherText,\n locationCaptured: !!locationData,\n warnings: warnings.length > 0 ? warnings : undefined,\n generatedAt: now.toISOString(),\n expiresAt: expiry.toISOString(),\n };\n}\n\n/**\n * Decode a cipherText (for debugging/testing - not for production use)\n * In production, decryption happens on the server\n */\nexport function decodeCipherText(cipherText: string): CipherTextPayload | null {\n try {\n const parts = cipherText.split('.');\n // v01: 3 parts, v02: 4 parts (4th is HMAC — ignored when decoding)\n if (parts.length !== 3 && parts.length !== 4) return null;\n\n const [version, , encodedB64] = parts;\n if (version !== '01' && version !== '02') return null;\n\n // Decode matches encode: just base64 decode (no obfuscation)\n const json = decodeURIComponent(escape(atob(encodedB64)));\n\n return JSON.parse(json) as CipherTextPayload;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a cipherText is expired\n */\nexport function isCipherTextExpired(cipherText: string): boolean {\n try {\n const parts = cipherText.split('.');\n if (parts.length !== 3 && parts.length !== 4) return true;\n\n const timestampB36 = parts[1];\n const timestamp = parseInt(timestampB36, 36);\n const now = Date.now();\n const expiryMs = CIPHER_TEXT_EXPIRY_MINUTES * 60 * 1000;\n\n return now - timestamp > expiryMs;\n } catch {\n return true;\n }\n}\n\n// Re-export types\nexport type { CipherTextPayload, CipherTextOptions, CipherTextResult, CipherTextReason, GeolocationConfigResponse };\n","/**\n * GeolocationClient - TypeScript SDK for CGS Geolocation & Compliance Service\n *\n * Provides type-safe methods to interact with the geolocation service API.\n * Extends BaseClient for consistent retry logic, timeout handling, and error management.\n */\n\nimport { BaseClient } from '../core/client';\nimport { ValidationError } from '../core/errors';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n GeolocationClientConfig,\n GeolocationConfigResponse,\n VerifyIPRequest,\n LocationVerification,\n ComplianceCheckResponse,\n PaginationParams,\n // Location Request Types\n LocationRequest,\n CreateLocationRequestRequest,\n LocationRequestResult,\n LocationRequestFilters,\n LocationRequestListResponse,\n ResendLocationRequestRequest,\n LocationShareInfo,\n LocationCaptureRequest,\n LocationCaptureResponse,\n // CipherText Types\n ValidateCipherTextRequest,\n ValidateCipherTextResponse,\n CipherTextReason,\n CipherTextCustomerData,\n CipherTextOptions,\n CipherTextResult,\n} from './types';\nimport { generateCipherText as generateCipherTextUtil } from './ciphertext';\n\n/**\n * GeolocationClient extends BaseClient for:\n * - Consistent retry logic with exponential backoff\n * - Unified error handling (CGSError, NetworkError, TimeoutError, etc.)\n * - Automatic timeout management\n * - Debug logging\n *\n * All geolocation verification calls use requestWithRetry() to handle\n * transient failures gracefully.\n */\nexport class GeolocationClient extends BaseClient {\n private cachedSigningKey?: string;\n\n constructor(config: GeolocationClientConfig) {\n // Convert GeolocationClientConfig to BaseClientConfig\n const baseConfig: BaseClientConfig = {\n baseURL: config.baseURL,\n tenantId: config.tenantId,\n apiKey: config.apiKey,\n headers: config.headers,\n timeout: config.timeout,\n retries: 3, // Default retry count for geolocation calls\n debug: config.debug,\n logger: config.logger,\n environment: config.environment,\n };\n super(baseConfig);\n }\n\n // ============================================================================\n // IP Verification & Compliance\n // ============================================================================\n\n /**\n * Verify an IP address and check compliance\n *\n * Uses requestWithRetry() for automatic retry on transient failures.\n *\n * @param request - Verification request with IP, user ID, event type, and optional device fingerprint\n * @returns Location verification result with risk assessment\n *\n * @example\n * ```typescript\n * const result = await client.verifyIP({\n * ip_address: \"8.8.8.8\",\n * user_id: \"user_123\",\n * event_type: \"login\",\n * device_fingerprint: {\n * device_id: \"device_abc\",\n * user_agent: navigator.userAgent,\n * platform: \"web\"\n * }\n * });\n *\n * if (result.is_blocked) {\n * console.log(\"Access blocked:\", result.risk_reasons);\n * }\n * ```\n */\n async verifyIP(request: VerifyIPRequest, requestOptions?: RequestOptions): Promise<LocationVerification> {\n if (!request.ip_address?.trim()) {\n throw new ValidationError('ip_address is required and must be a non-empty string', ['ip_address']);\n }\n\n // Use requestWithRetry for critical verification calls\n return this.requestWithRetry<LocationVerification>('/api/v1/geo/verify', {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, undefined, requestOptions);\n }\n\n /**\n * Check compliance for a specific country\n *\n * @param countryISO - ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\")\n * @returns Jurisdiction configuration and compliance status\n *\n * @example\n * ```typescript\n * const compliance = await client.checkCompliance(\"KP\"); // North Korea\n * if (!compliance.is_compliant) {\n * console.log(\"Country is not allowed:\", compliance.jurisdiction?.status);\n * }\n * ```\n */\n async checkCompliance(countryISO: string, requestOptions?: RequestOptions): Promise<ComplianceCheckResponse> {\n return this.requestWithRetry<ComplianceCheckResponse>(\n `/api/v1/geo/check-compliance`,\n {\n method: 'POST',\n body: JSON.stringify({ country_iso: countryISO }),\n }, undefined, undefined, requestOptions\n );\n }\n\n // ============================================================================\n // GPS Configuration\n // ============================================================================\n\n /**\n * Get the tenant's GPS requirement configuration\n *\n * Returns which event types require GPS location to be collected.\n * Use this to auto-enable GPS collection in generateCipherText when required.\n *\n * @returns GPS requirement config per event type\n *\n * @example\n * ```typescript\n * const config = await client.getGPSConfig();\n * if (config.require_gps.login) {\n * // GPS is required for login — auto-enable location\n * }\n * ```\n */\n async getGPSConfig(requestOptions?: RequestOptions): Promise<GeolocationConfigResponse> {\n const config = await this.requestWithRetry<GeolocationConfigResponse>('/api/v1/geo/config', undefined, undefined, undefined, requestOptions);\n if (config.signing_key) {\n this.cachedSigningKey = config.signing_key;\n }\n return config;\n }\n\n /**\n * Fetch the signing key from the dedicated authenticated endpoint.\n *\n * Falls back to getGPSConfig() for backward compatibility with older servers\n * that don't expose `/api/v1/geo/signing-key`.\n *\n * @returns The signing key string, or undefined if unavailable\n */\n async fetchSigningKey(requestOptions?: RequestOptions): Promise<string | undefined> {\n try {\n const response = await this.requestWithRetry<{ signing_key: string }>(\n '/api/v1/geo/signing-key', undefined, undefined, undefined, requestOptions,\n );\n if (response.signing_key) {\n this.cachedSigningKey = response.signing_key;\n return response.signing_key;\n }\n } catch {\n // Older servers may not have this endpoint — fall back to config\n }\n\n const config = await this.getGPSConfig(requestOptions);\n return config.signing_key;\n }\n\n // ============================================================================\n // CipherText Validation\n // ============================================================================\n\n /**\n * Validate a cipherText generated by the frontend SDK\n *\n * The cipherText contains encrypted device fingerprint and optional location data.\n * This method decrypts and validates the data, returning device info, location,\n * and risk assessment.\n *\n * @param cipherText - The encrypted cipherText string from generateCipherText()\n * @param userId - User ID associated with this verification\n * @param eventType - Reason for verification (login, registration, etc.)\n * @param expectedIP - Optional expected IP address for additional validation\n * @param customerData - Optional customer data for risk profile creation (used when user is blocked)\n * @returns Validation result with device info, location, and risk assessment\n *\n * @example\n * ```typescript\n * // Validate cipherText during registration with customer data\n * const result = await client.validateCipherText(\n * cipherText,\n * \"user_123\",\n * \"registration\",\n * clientIP,\n * {\n * full_name: \"John Doe\",\n * email: \"john@example.com\",\n * country: \"US\",\n * state: \"CA\"\n * }\n * );\n *\n * if (!result.valid) {\n * console.log(\"CipherText validation failed:\", result.errors);\n * return;\n * }\n *\n * if (result.risk.is_blocked) {\n * console.log(\"Access blocked:\", result.risk.block_reasons);\n * // A risk profile with full customer data has been created for the alert\n * }\n * ```\n */\n async validateCipherText(\n cipherText: string,\n userId: string,\n eventType: CipherTextReason,\n expectedIP?: string,\n customerData?: CipherTextCustomerData,\n requestOptions?: RequestOptions\n ): Promise<ValidateCipherTextResponse> {\n if (!cipherText?.trim()) {\n throw new ValidationError('cipherText is required and must be a non-empty string', ['cipherText']);\n }\n if (!userId?.trim()) {\n throw new ValidationError('userId is required and must be a non-empty string', ['userId']);\n }\n\n const request: ValidateCipherTextRequest = {\n cipher_text: cipherText,\n user_id: userId,\n event_type: eventType,\n expected_ip: expectedIP,\n customer_data: customerData,\n };\n\n return this.requestWithRetry<ValidateCipherTextResponse>(\n '/api/v1/geo/validate-ciphertext',\n {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, undefined, requestOptions\n );\n }\n\n /**\n * Validate cipherText and verify IP in a single call\n *\n * Combines cipherText validation with IP verification for complete\n * location and device verification in one request.\n *\n * @param cipherText - The encrypted cipherText string\n * @param ipAddress - Client IP address\n * @param userId - User ID\n * @param eventType - Event type (login, registration, etc.)\n * @returns Combined validation and verification result\n *\n * @example\n * ```typescript\n * const result = await client.validateAndVerify(\n * cipherText,\n * clientIP,\n * \"user_123\",\n * \"registration\"\n * );\n *\n * if (!result.ciphertext_valid) {\n * throw new Error(\"Device verification failed\");\n * }\n *\n * if (result.location.is_blocked) {\n * throw new Error(\"Location not allowed\");\n * }\n * ```\n */\n async validateAndVerify(\n cipherText: string,\n ipAddress: string,\n userId: string,\n eventType: CipherTextReason,\n requestOptions?: RequestOptions\n ): Promise<{\n ciphertext_valid: boolean;\n ciphertext_result: ValidateCipherTextResponse;\n location: LocationVerification;\n }> {\n // First validate cipherText to get device info\n const cipherTextResult = await this.validateCipherText(\n cipherText,\n userId,\n eventType,\n ipAddress,\n undefined,\n requestOptions\n );\n\n // Then verify IP with device fingerprint from cipherText\n const locationResult = await this.verifyIP({\n ip_address: ipAddress,\n user_id: userId,\n event_type: eventType,\n device_fingerprint: cipherTextResult.valid && cipherTextResult.device\n ? {\n device_id: cipherTextResult.device_uuid,\n user_agent: '',\n platform: cipherTextResult.device.platform,\n browser: cipherTextResult.device.browser,\n os: cipherTextResult.device.os,\n }\n : undefined,\n }, requestOptions);\n\n return {\n ciphertext_valid: cipherTextResult.valid,\n ciphertext_result: cipherTextResult,\n location: locationResult,\n };\n }\n\n // ============================================================================\n // Location Request (Live Location Tracking)\n // ============================================================================\n\n /**\n * Create a location request to get customer's live location\n *\n * @param request - Location request details\n * @returns Location request result with share link\n *\n * @example\n * ```typescript\n * const result = await client.createLocationRequest({\n * user_id: \"customer_123\",\n * channel: \"sms\",\n * phone: \"+1234567890\",\n * reason: \"Verification for high-value transaction\"\n * });\n *\n * console.log(`Share link sent: ${result.share_link}`);\n * console.log(`Expires at: ${result.token_expiry}`);\n * ```\n */\n async createLocationRequest(\n request: CreateLocationRequestRequest,\n requestOptions?: RequestOptions\n ): Promise<LocationRequestResult> {\n return this.request<LocationRequestResult>('/api/v1/location-requests', {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, requestOptions);\n }\n\n /**\n * Get a location request by ID\n *\n * @param requestId - Location request ID\n * @returns Location request details\n */\n async getLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<LocationRequest> {\n return this.request<LocationRequest>(`/api/v1/location-requests/${requestId}`, undefined, undefined, requestOptions);\n }\n\n /**\n * List location requests with filters and pagination\n *\n * @param filters - Optional filters\n * @param pagination - Optional pagination\n * @returns Paginated list of location requests\n *\n * @example\n * ```typescript\n * const requests = await client.listLocationRequests(\n * { status: \"completed\", user_id: \"customer_123\" },\n * { page: 1, limit: 20 }\n * );\n * ```\n */\n async listLocationRequests(\n filters?: LocationRequestFilters,\n pagination?: PaginationParams,\n requestOptions?: RequestOptions\n ): Promise<LocationRequestListResponse> {\n const params: Record<string, unknown> = {\n ...filters,\n ...pagination,\n };\n\n return this.request<LocationRequestListResponse>(\n `/api/v1/location-requests${this.buildQueryString(params)}`,\n undefined, undefined, requestOptions\n );\n }\n\n /**\n * Cancel a pending location request\n *\n * @param requestId - Location request ID\n */\n async cancelLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<void> {\n await this.request(`/api/v1/location-requests/${requestId}/cancel`, {\n method: 'POST',\n }, undefined, requestOptions);\n }\n\n /**\n * Resend notification for a location request\n *\n * @param requestId - Location request ID\n * @param contact - Email or phone to send to\n */\n async resendLocationRequest(\n requestId: string,\n contact: ResendLocationRequestRequest,\n requestOptions?: RequestOptions\n ): Promise<void> {\n await this.request(`/api/v1/location-requests/${requestId}/resend`, {\n method: 'POST',\n body: JSON.stringify(contact),\n }, undefined, requestOptions);\n }\n\n // ============================================================================\n // Location Share (Customer-facing - for SDK integration in customer apps)\n // ============================================================================\n\n /**\n * Get location share info (customer-facing)\n * This is called from the customer's device to get request details\n *\n * @param token - Secure token from share link\n * @returns Location share info\n */\n async getLocationShareInfo(token: string, requestOptions?: RequestOptions): Promise<LocationShareInfo> {\n return this.request<LocationShareInfo>(`/api/v1/location/share/${token}`, undefined, undefined, requestOptions);\n }\n\n /**\n * Submit location capture (customer-facing)\n * This is called from the customer's device to submit their location\n *\n * @param token - Secure token from share link\n * @param capture - Location capture data (GPS or WiFi)\n * @returns Capture response\n *\n * @example\n * ```typescript\n * // Using GPS (preferred)\n * const result = await client.captureLocation(token, {\n * latitude: 37.7749,\n * longitude: -122.4194,\n * accuracy: 10\n * });\n *\n * // Using WiFi positioning (fallback)\n * const result = await client.captureLocation(token, {\n * wifi_networks: [\n * { macAddress: \"00:11:22:33:44:55\", signalStrength: -50 },\n * { macAddress: \"AA:BB:CC:DD:EE:FF\", signalStrength: -70 }\n * ]\n * });\n * ```\n */\n async captureLocation(\n token: string,\n capture: LocationCaptureRequest,\n requestOptions?: RequestOptions\n ): Promise<LocationCaptureResponse> {\n return this.request<LocationCaptureResponse>(`/api/v1/location/share/${token}`, {\n method: 'POST',\n body: JSON.stringify(capture),\n }, undefined, requestOptions);\n }\n\n // ============================================================================\n // CipherText Generation\n // ============================================================================\n\n /**\n * Generate a signed cipherText containing device and location data.\n *\n * Automatically passes the client's API key for HMAC signing (v02 format).\n * If no API key is configured, falls back to unsigned v01 format.\n *\n * @param options - Options for cipherText generation\n * @param gpsConfig - Optional GPS config (from getGPSConfig)\n * @returns CipherText result with the signed string\n *\n * @example\n * ```typescript\n * const result = await client.generateCipherText({ reason: 'login' });\n * console.log(result.cipherText); // v02 signed cipherText\n * ```\n */\n async generateCipherText(\n options: Omit<CipherTextOptions, 'apiKey' | 'signingKey'>,\n gpsConfig?: GeolocationConfigResponse,\n ): Promise<CipherTextResult> {\n // Use cached signing key, or fetch from dedicated endpoint (with fallback)\n let signingKey = this.cachedSigningKey;\n let resolvedGpsConfig = gpsConfig;\n if (!signingKey) {\n signingKey = await this.fetchSigningKey();\n }\n // Fetch GPS config for auto-enable when caller didn't provide one\n if (!resolvedGpsConfig) {\n resolvedGpsConfig = await this.getGPSConfig();\n }\n return generateCipherTextUtil(\n { ...options, signingKey: signingKey || undefined },\n resolvedGpsConfig,\n );\n }\n\n // ============================================================================\n // Utility Methods (inherited from BaseClient: healthCheck, updateConfig, getConfig, buildQueryString)\n // ============================================================================\n}\n","/**\n * RiskProfileClient - Customer Risk Profile Management\n *\n * Provides methods to create, retrieve, and manage customer risk profiles\n * in the Vesant Compliance Platform.\n */\n\nimport { BaseClient } from '../core/client';\nimport { CGSError } from '../core/errors';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n CustomerProfile,\n CreateProfileRequest,\n UpdateProfileRequest,\n} from './types';\n\nexport class RiskProfileClient extends BaseClient {\n constructor(config: BaseClientConfig) {\n super(config);\n }\n\n // ============================================================================\n // Profile Management\n // ============================================================================\n\n /**\n * Create a new customer risk profile\n *\n * @param request - Profile creation data\n * @returns Created customer profile\n *\n * @example\n * ```typescript\n * const profile = await client.createProfile({\n * customer_id: 'CUST-12345',\n * entity_type: 'individual',\n * customer_status: 'active',\n * full_name: 'John Doe',\n * email_address: 'john@example.com',\n * date_of_birth: '1990-01-15',\n * country_of_residence: 'US'\n * });\n * ```\n */\n async createProfile(request: CreateProfileRequest, requestOptions?: RequestOptions): Promise<CustomerProfile> {\n return this.request<CustomerProfile>('/api/v1/profiles', {\n method: 'POST',\n body: JSON.stringify(request),\n }, undefined, requestOptions);\n }\n\n /**\n * Get customer profile by customer ID\n *\n * Note: This searches for the profile using the customer_id field.\n * Returns the first matching profile for the tenant.\n *\n * @param customerId - Customer ID to search for\n * @returns Customer profile\n *\n * @example\n * ```typescript\n * const profile = await client.getProfile('CUST-12345');\n * ```\n */\n async getProfile(customerId: string, requestOptions?: RequestOptions): Promise<CustomerProfile> {\n try {\n // Use the SDK-authenticated endpoint (API key auth)\n return await this.request<CustomerProfile>(\n `/api/v1/profiles?customer_id=${encodeURIComponent(customerId)}`,\n undefined, undefined, requestOptions\n );\n } catch (error) {\n // Normalize to NOT_FOUND for consistent error handling in getOrCreateProfile\n if (error instanceof CGSError && (error.statusCode === 404 || error.code === 'NOT_FOUND')) {\n throw new CGSError(`Profile not found for customer ID: ${customerId}`, 'NOT_FOUND', 404);\n }\n throw error;\n }\n }\n\n /**\n * Update customer profile\n *\n * @param profileId - Profile UUID\n * @param updates - Fields to update\n * @returns Updated customer profile\n *\n * @example\n * ```typescript\n * const updated = await client.updateProfile(profileId, {\n * location: 'New York, USA',\n * location_compliance: 'compliant',\n * last_recorded_activity: new Date().toISOString()\n * });\n * ```\n */\n async updateProfile(\n profileId: string,\n updates: UpdateProfileRequest,\n requestOptions?: RequestOptions\n ): Promise<CustomerProfile> {\n return this.request<CustomerProfile>(`/api/v1/profiles/${profileId}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }, undefined, requestOptions);\n }\n\n /**\n * Get or create profile (idempotent operation)\n *\n * Attempts to get existing profile by customer_id, creates if not found.\n *\n * @param customerId - Customer ID\n * @param createRequest - Profile data to use if creating new profile\n * @returns Existing or newly created profile\n *\n * @example\n * ```typescript\n * const profile = await client.getOrCreateProfile('CUST-123', {\n * customer_id: 'CUST-123',\n * entity_type: 'individual',\n * full_name: 'John Doe',\n * email_address: 'john@example.com'\n * });\n * ```\n */\n async getOrCreateProfile(\n customerId: string,\n createRequest: CreateProfileRequest,\n requestOptions?: RequestOptions\n ): Promise<CustomerProfile> {\n try {\n return await this.getProfile(customerId, requestOptions);\n } catch (error) {\n // Only treat NOT_FOUND as \"profile doesn't exist\" — re-throw other errors\n if (error instanceof CGSError && error.code === 'NOT_FOUND') {\n return await this.createProfile(createRequest, requestOptions);\n }\n throw error;\n }\n }\n\n}\n","/**\n * Compliance orchestration types\n *\n * Types for unified compliance verification flows that combine\n * geolocation verification with customer risk profiling.\n */\n\nimport type { LocationVerification, DeviceFingerprintRequest } from '../geolocation/types';\nimport type { CustomerProfile, EntityType } from '../risk-profile/types';\n\n// ============================================================================\n// Registration Verification Types\n// ============================================================================\n\nexport interface RegistrationVerificationRequest {\n // Identity\n customerId: string;\n fullName: string;\n emailAddress: string;\n phoneNumber?: string;\n dateOfBirth?: string;\n address?: string;\n entityType?: EntityType;\n\n // Geolocation\n ipAddress: string;\n deviceFingerprint?: DeviceFingerprintRequest;\n\n // Additional data\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegistrationVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n profile: CustomerProfile | null;\n requiresKYC: boolean;\n requiresEDD: boolean;\n blockReasons: string[];\n processingTime: number;\n}\n\n// ============================================================================\n// Login Verification Types\n// ============================================================================\n\nexport interface LoginVerificationRequest {\n customerId: string;\n ipAddress: string;\n deviceFingerprint?: DeviceFingerprintRequest;\n metadata?: Record<string, unknown>;\n}\n\nexport interface LoginVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n profile: CustomerProfile;\n requiresStepUp: boolean;\n blockReasons: string[];\n processingTime: number;\n}\n\n// ============================================================================\n// Transaction Verification Types\n// ============================================================================\n\nexport interface TransactionVerificationRequest {\n customerId: string;\n ipAddress: string;\n amount: number;\n currency: string;\n transactionType?: 'deposit' | 'withdrawal' | 'bet' | 'transfer' | 'payout';\n deviceFingerprint?: DeviceFingerprintRequest;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TransactionVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n profile: CustomerProfile;\n transactionRisk: TransactionRiskResult;\n requiresApproval: boolean;\n blockReasons: string[];\n processingTime: number;\n}\n\nexport interface TransactionRiskResult {\n score: number;\n level: 'low' | 'medium' | 'high' | 'critical';\n factors: string[];\n allowed: boolean;\n requiresManualReview: boolean;\n}\n\n// ============================================================================\n// Generic Event Verification Types\n// ============================================================================\n\nexport interface EventVerificationRequest {\n customerId: string;\n ipAddress: string;\n eventType: string;\n deviceFingerprint?: DeviceFingerprintRequest;\n metadata?: Record<string, unknown>;\n}\n\nexport interface EventVerificationResponse {\n allowed: boolean;\n geolocation: LocationVerification;\n blockReasons: string[];\n processingTime: number;\n}\n\n// ============================================================================\n// Currency Exchange Rates (for transaction risk calculation)\n// ============================================================================\n\nexport interface CurrencyRates {\n [currency: string]: number; // Rate to USD\n}\n\nexport const DEFAULT_CURRENCY_RATES: CurrencyRates = {\n USD: 1.0,\n EUR: 1.1,\n GBP: 1.27,\n CAD: 0.74,\n AUD: 0.66,\n JPY: 0.0067,\n CHF: 1.13,\n CNY: 0.14,\n INR: 0.012,\n BRL: 0.20,\n MXN: 0.058,\n ZAR: 0.055,\n};\n\n// ============================================================================\n// Location Request Types (re-exported from geolocation for convenience)\n// ============================================================================\n\nexport type {\n LocationRequest,\n LocationRequestStatus,\n LocationRequestChannel,\n CreateLocationRequestRequest,\n LocationRequestResult,\n LocationRequestFilters,\n LocationRequestListResponse,\n ResendLocationRequestRequest,\n LocationShareInfo,\n LocationCaptureRequest,\n LocationCaptureResponse,\n} from '../geolocation/types';\n\n// ============================================================================\n// Compliance-specific Location Request Types\n// ============================================================================\n\nexport interface ComplianceLocationRequestInput {\n /** Customer user ID to request location from */\n customerId: string;\n /** Notification channel to use */\n channel: 'sms' | 'email' | 'push';\n /** Reason for requesting location (for compliance/audit) */\n reason: string;\n /** Customer email (required for email channel) */\n email?: string;\n /** Customer phone (required for SMS channel) */\n phone?: string;\n /** Custom expiry time in hours (default: 24) */\n expiryHours?: number;\n}\n\nexport interface ComplianceLocationRequestResult {\n /** The created location request */\n request: import('../geolocation/types').LocationRequest;\n /** Shareable link for the customer */\n shareLink: string;\n /** Token expiration time */\n tokenExpiry: string;\n /** Customer profile (if available) */\n profile?: import('../risk-profile/types').CustomerProfile;\n}\n","/**\n * ComplianceClient - Unified Compliance Orchestration\n *\n * Main integration point for casino platforms. Orchestrates geolocation\n * verification with customer risk profiling for complete compliance coverage.\n *\n * GeoComply-style approach: SDK is the primary data injection point.\n */\n\nimport { GeolocationClient } from '../geolocation/client';\nimport { RiskProfileClient } from '../risk-profile/client';\nimport type { CGSConfig, Logger, RequestOptions, RequiredCGSConfig, RequestInterceptor } from '../core/config';\nimport { ComplianceError, ValidationError } from '../core/errors';\nimport { createConsoleLogger } from '../core/logger';\nimport type { JurisdictionConfig, LocationVerification } from '../geolocation/types';\nimport type { CustomerProfile } from '../risk-profile/types';\nimport type {\n RegistrationVerificationRequest,\n RegistrationVerificationResponse,\n LoginVerificationRequest,\n LoginVerificationResponse,\n TransactionVerificationRequest,\n TransactionVerificationResponse,\n TransactionRiskResult,\n EventVerificationRequest,\n EventVerificationResponse,\n CurrencyRates,\n ComplianceLocationRequestInput,\n ComplianceLocationRequestResult,\n} from './types';\nimport { DEFAULT_CURRENCY_RATES } from './types';\nimport type {\n LocationRequest,\n LocationRequestFilters,\n LocationRequestListResponse,\n PaginationParams,\n} from '../geolocation/types';\n\nexport class ComplianceClient {\n private geoClient: GeolocationClient;\n private riskClient: RiskProfileClient;\n private config: RequiredCGSConfig;\n private logger: Logger;\n private currencyRates: CurrencyRates;\n private _currencyRatesCustomized: boolean = false;\n private _currencyRatesWarned: boolean = false;\n\n constructor(config: CGSConfig) {\n this.logger = config.logger || createConsoleLogger();\n const interceptors: RequestInterceptor[] = config.interceptors || [];\n this.config = {\n baseURL: config.baseURL,\n tenantId: config.tenantId,\n apiKey: config.apiKey || '',\n headers: config.headers || {},\n timeout: config.timeout || 10000,\n retries: config.retries || 3,\n debug: config.debug || false,\n autoCreateProfiles: config.autoCreateProfiles !== false, // default true\n syncMode: config.syncMode || 'sync',\n environment: config.environment,\n interceptors,\n logger: this.logger,\n };\n\n this.geoClient = new GeolocationClient({\n baseURL: this.config.baseURL,\n tenantId: this.config.tenantId,\n apiKey: this.config.apiKey,\n headers: this.config.headers,\n timeout: this.config.timeout,\n debug: this.config.debug,\n logger: this.logger,\n environment: this.config.environment,\n });\n\n this.riskClient = new RiskProfileClient({\n baseURL: this.config.baseURL,\n tenantId: this.config.tenantId,\n apiKey: this.config.apiKey,\n headers: this.config.headers,\n timeout: this.config.timeout,\n debug: this.config.debug,\n interceptors,\n logger: this.logger,\n environment: this.config.environment,\n });\n\n this.currencyRates = DEFAULT_CURRENCY_RATES;\n }\n\n // ============================================================================\n // Sub-Client Accessors\n // ============================================================================\n\n /** Get the underlying GeolocationClient for direct geolocation API access */\n getGeolocationClient(): GeolocationClient {\n return this.geoClient;\n }\n\n /** Get the underlying RiskProfileClient for direct risk profile API access */\n getRiskProfileClient(): RiskProfileClient {\n return this.riskClient;\n }\n\n // ============================================================================\n // Main Verification Methods\n // ============================================================================\n\n /**\n * Verify customer registration with automatic profile creation\n *\n * This is the primary integration point for new customer sign-ups.\n * Combines geolocation verification with customer risk profile creation.\n *\n * Important: Profile is only created if geolocation verification passes.\n * This prevents orphaned geolocation records when registration is blocked.\n *\n * @param request - Registration verification request\n * @returns Verification response with profile and compliance status\n *\n * @example\n * ```typescript\n * const result = await sdk.verifyAtRegistration({\n * customerId: 'CUST-12345',\n * fullName: 'John Doe',\n * emailAddress: 'john@example.com',\n * ipAddress: req.ip,\n * deviceFingerprint: getDeviceFingerprint()\n * });\n *\n * if (result.allowed) {\n * // Create account\n * console.log('Profile created:', result.profile);\n * if (result.requiresKYC) {\n * // Redirect to KYC flow\n * }\n * } else {\n * // Block registration\n * console.log('Blocked:', result.blockReasons);\n * }\n * ```\n */\n async verifyAtRegistration(\n request: RegistrationVerificationRequest,\n requestOptions?: RequestOptions\n ): Promise<RegistrationVerificationResponse> {\n const startTime = Date.now();\n\n // Validate required fields before making any API calls\n this.validateRegistrationRequest(request);\n\n let geoVerification: LocationVerification | null = null;\n\n try {\n // Step 1: Verify geolocation\n if (this.config.debug) {\n this.logger.debug('Starting registration verification', { customerId: request.customerId });\n }\n\n geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'registration',\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions);\n\n // Step 2: Check if registration should be blocked BEFORE creating profile\n // This prevents orphaned geo records and ensures atomic behavior\n const blockReasons = this.evaluateRegistrationBlock(geoVerification);\n\n if (blockReasons.length > 0) {\n if (this.config.debug) {\n this.logger.debug('Registration blocked at geo stage', { blockReasons });\n }\n\n // Return early without creating profile - prevents orphaned records\n return {\n allowed: false,\n geolocation: geoVerification,\n profile: null,\n requiresKYC: false,\n requiresEDD: false,\n blockReasons: blockReasons,\n processingTime: Date.now() - startTime,\n };\n }\n\n // Step 3: Create customer risk profile (only if geo passed)\n const profile = await this.riskClient.createProfile({\n customer_id: request.customerId,\n entity_type: request.entityType || 'individual',\n customer_status: 'active',\n full_name: request.fullName,\n email_address: request.emailAddress,\n primary_phone_number: request.phoneNumber,\n date_of_birth: request.dateOfBirth,\n residential_address: request.address,\n country_of_residence: geoVerification.location.country_iso,\n\n // Geolocation data\n location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n\n // Initial KYC status\n kyc_status: 'pending',\n }, requestOptions);\n\n // Step 4: Determine final status and requirements\n const requiresKYC = geoVerification.jurisdiction?.require_kyc || false;\n const requiresEDD = geoVerification.jurisdiction?.require_enhanced_verification || false;\n\n if (this.config.debug) {\n this.logger.debug('Registration verification complete', {\n allowed: true,\n riskScore: geoVerification.risk_score,\n profileId: profile.id,\n requiresKYC,\n requiresEDD,\n });\n }\n\n return {\n allowed: true,\n geolocation: geoVerification,\n profile: profile,\n requiresKYC: requiresKYC,\n requiresEDD: requiresEDD,\n blockReasons: [],\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.config.debug) {\n this.logger.error('Registration verification failed', { error });\n }\n\n // Provide detailed error context for debugging\n throw new ComplianceError(\n 'Registration verification failed',\n {\n stage: geoVerification ? 'profile_creation' : 'geo_verification',\n geoRecordId: geoVerification?.record_id,\n customerId: request.customerId,\n cause: error,\n },\n geoVerification ? 'PROFILE_CREATION_FAILED' : 'GEO_VERIFICATION_FAILED'\n );\n }\n }\n\n /**\n * Evaluate if registration should be blocked based on geolocation verification\n *\n * Checks:\n * 1. General compliance status (is_compliant)\n * 2. Explicit block flag (is_blocked)\n * 3. Jurisdiction-specific registration allowance (allow_registration)\n * 4. Risk level thresholds\n *\n * @param geoVerification - Geolocation verification result\n * @returns Array of block reasons (empty if allowed)\n */\n private evaluateRegistrationBlock(geoVerification: LocationVerification): string[] {\n const blockReasons: string[] = [];\n\n // Check if explicitly blocked\n if (geoVerification.is_blocked) {\n blockReasons.push(...geoVerification.risk_reasons);\n }\n\n // Check general compliance\n if (!geoVerification.is_compliant) {\n if (!blockReasons.includes('non_compliant_jurisdiction')) {\n blockReasons.push('non_compliant_jurisdiction');\n }\n }\n\n // CRITICAL: Check if registration is specifically allowed in this jurisdiction\n // Some jurisdictions may allow login but not new registrations\n const jurisdiction = geoVerification.jurisdiction;\n if (jurisdiction) {\n if (jurisdiction.allow_registration === false) {\n blockReasons.push('registration_not_allowed_in_jurisdiction');\n }\n\n // Check jurisdiction status for registration-specific blocks\n if (jurisdiction.status === 'blocked' || jurisdiction.status === 'sanctioned') {\n if (!blockReasons.includes('blocked_jurisdiction')) {\n blockReasons.push('blocked_jurisdiction');\n }\n }\n\n // Restricted jurisdictions need explicit registration permission\n if (jurisdiction.status === 'restricted' && jurisdiction.allow_registration === false) {\n if (!blockReasons.includes('restricted_jurisdiction_no_registration')) {\n blockReasons.push('restricted_jurisdiction_no_registration');\n }\n }\n }\n\n // Check geofence rule evaluation\n if (geoVerification.geofence_evaluation?.blocked) {\n blockReasons.push(...geoVerification.geofence_evaluation.reasons);\n }\n\n // Critical risk level should block registration\n if (geoVerification.risk_level === 'critical') {\n if (!blockReasons.includes('critical_risk_level')) {\n blockReasons.push('critical_risk_level');\n }\n }\n\n return [...new Set(blockReasons)]; // Deduplicate\n }\n\n /**\n * Validate registration request has all required fields\n *\n * @param request - Registration request to validate\n * @throws ValidationError if required fields are missing or invalid\n */\n private validateRegistrationRequest(request: RegistrationVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (!request.emailAddress?.trim()) {\n errors.push('emailAddress is required');\n } else if (!this.isValidEmail(request.emailAddress)) {\n errors.push('emailAddress format is invalid');\n }\n\n if (!request.fullName?.trim()) {\n errors.push('fullName is required');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid registration request: ${errors.join(', ')}`, errors);\n }\n }\n\n /**\n * Validate IP address format (IPv4 or IPv6)\n */\n private isValidIP(ip: string): boolean {\n // IPv4 pattern\n const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n // Simplified IPv6 pattern (covers most common cases)\n const ipv6Regex = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){0,6}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$/;\n\n return ipv4Regex.test(ip) || ipv6Regex.test(ip);\n }\n\n /**\n * Validate email address format\n */\n private isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n private validateLoginRequest(request: LoginVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid login request: ${errors.join(', ')}`, errors);\n }\n }\n\n private validateTransactionRequest(request: TransactionVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (request.amount <= 0) {\n errors.push('amount must be greater than 0');\n }\n\n if (!request.currency?.trim()) {\n errors.push('currency is required');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid transaction request: ${errors.join(', ')}`, errors);\n }\n }\n\n private validateEventRequest(request: EventVerificationRequest): void {\n const errors: string[] = [];\n\n if (!request.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!request.ipAddress?.trim()) {\n errors.push('ipAddress is required');\n } else if (!this.isValidIP(request.ipAddress)) {\n errors.push('ipAddress format is invalid');\n }\n\n if (!request.eventType?.trim()) {\n errors.push('eventType is required');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid event request: ${errors.join(', ')}`, errors);\n }\n }\n\n /**\n * Verify customer login with profile activity update\n *\n * Verifies geolocation and updates customer profile with latest activity.\n *\n * @param request - Login verification request\n * @returns Verification response with compliance status\n *\n * @example\n * ```typescript\n * const result = await sdk.verifyAtLogin({\n * customerId: 'CUST-12345',\n * ipAddress: req.ip,\n * deviceFingerprint: getDeviceFingerprint()\n * });\n *\n * if (result.allowed) {\n * // Allow login\n * if (result.requiresStepUp) {\n * // Trigger MFA or additional verification\n * }\n * } else {\n * // Block login\n * console.log('Blocked:', result.blockReasons);\n * }\n * ```\n */\n async verifyAtLogin(\n request: LoginVerificationRequest,\n requestOptions?: RequestOptions\n ): Promise<LoginVerificationResponse> {\n const startTime = Date.now();\n\n this.validateLoginRequest(request);\n\n try {\n if (this.config.debug) {\n this.logger.debug('Starting login verification', { customerId: request.customerId });\n }\n\n // Step 1: Verify geolocation and fetch profile in parallel\n const [geoVerification, profileResult] = await Promise.all([\n this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'login',\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions),\n this.riskClient.getProfile(request.customerId, requestOptions).catch(() => null),\n ]);\n\n // Step 2: Get or create profile\n let profile: CustomerProfile;\n if (profileResult) {\n profile = profileResult;\n\n // Update last activity and location\n if (this.shouldUpdateProfile(profile, geoVerification.location.city)) {\n profile = await this.riskClient.updateProfile(profile.id, {\n last_recorded_activity: new Date().toISOString(),\n location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n }, requestOptions);\n }\n } else {\n // Profile doesn't exist - this shouldn't happen for login\n if (this.config.autoCreateProfiles && this.config.debug) {\n this.logger.warn('Profile not found for login, creating...');\n }\n profile = await this.createProfileFromGeo(request.customerId, geoVerification);\n }\n\n // Step 3: Determine if login allowed\n const isAllowed =\n geoVerification.is_compliant &&\n !geoVerification.is_blocked &&\n profile.customer_status !== 'suspended';\n\n const requiresStepUp =\n geoVerification.risk_level === 'high' || geoVerification.risk_level === 'critical';\n\n return {\n allowed: isAllowed,\n geolocation: geoVerification,\n profile: profile,\n requiresStepUp: requiresStepUp,\n blockReasons: this.getBlockReasons(geoVerification, profile),\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n throw new ComplianceError('Login verification failed', error);\n }\n }\n\n /**\n * Verify transaction with amount-based risk assessment\n *\n * Combines geolocation verification with transaction amount analysis\n * and customer risk profile for comprehensive transaction screening.\n *\n * @param request - Transaction verification request\n * @returns Verification response with transaction risk assessment\n *\n * @example\n * ```typescript\n * const result = await sdk.verifyAtTransaction({\n * customerId: 'CUST-12345',\n * ipAddress: req.ip,\n * amount: 5000,\n * currency: 'USD',\n * transactionType: 'withdrawal',\n * deviceFingerprint: getDeviceFingerprint()\n * });\n *\n * if (result.allowed) {\n * // Process transaction\n * } else if (result.requiresApproval) {\n * // Queue for manual review\n * } else {\n * // Block transaction\n * console.log('Blocked:', result.blockReasons);\n * }\n * ```\n */\n async verifyAtTransaction(\n request: TransactionVerificationRequest,\n requestOptions?: RequestOptions\n ): Promise<TransactionVerificationResponse> {\n const startTime = Date.now();\n\n this.validateTransactionRequest(request);\n\n try {\n if (this.config.debug) {\n this.logger.debug('Starting transaction verification', {\n customerId: request.customerId,\n amount: request.amount,\n currency: request.currency,\n });\n }\n\n // Step 1: Verify geolocation and fetch profile in parallel\n const [geoVerification, profile] = await Promise.all([\n this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'transaction',\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions),\n this.riskClient.getProfile(request.customerId, requestOptions),\n ]);\n\n // Step 2: Calculate transaction risk\n const transactionRisk = this.calculateTransactionRisk(\n request.amount,\n request.currency,\n geoVerification,\n profile\n );\n\n // Step 4: Check jurisdiction limits\n const jurisdictionAllowed = this.checkJurisdictionLimits(\n request.amount,\n request.currency,\n geoVerification.jurisdiction\n );\n\n // Step 5: Determine if transaction is allowed\n const isAllowed =\n geoVerification.is_compliant &&\n !geoVerification.is_blocked &&\n jurisdictionAllowed &&\n transactionRisk.allowed;\n\n return {\n allowed: isAllowed,\n geolocation: geoVerification,\n profile: profile,\n transactionRisk: transactionRisk,\n requiresApproval: transactionRisk.requiresManualReview,\n blockReasons: this.getTransactionBlockReasons(\n geoVerification,\n transactionRisk,\n jurisdictionAllowed\n ),\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n throw new ComplianceError('Transaction verification failed', error);\n }\n }\n\n /**\n * Generic event verification (for other touchpoints)\n *\n * @param request - Event verification request\n * @returns Verification response\n */\n async verifyEvent(request: EventVerificationRequest, requestOptions?: RequestOptions): Promise<EventVerificationResponse> {\n const startTime = Date.now();\n\n this.validateEventRequest(request);\n\n const geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: request.eventType,\n device_fingerprint: request.deviceFingerprint,\n }, requestOptions);\n\n // Optionally update profile activity\n if (this.config.autoCreateProfiles) {\n try {\n const profile = await this.riskClient.getProfile(request.customerId, requestOptions);\n await this.riskClient.updateProfile(profile.id, {\n last_recorded_activity: new Date().toISOString(),\n }, requestOptions);\n } catch (error) {\n // Profile doesn't exist, ignore or create based on config\n if (this.config.debug) {\n this.logger.warn('Profile not found for event');\n }\n }\n }\n\n return {\n allowed: geoVerification.is_compliant && !geoVerification.is_blocked,\n geolocation: geoVerification,\n blockReasons: geoVerification.risk_reasons,\n processingTime: Date.now() - startTime,\n };\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n private shouldUpdateProfile(profile: CustomerProfile, newCity: string): boolean {\n // Update if location changed significantly\n return !profile.location || !profile.location.includes(newCity);\n }\n\n private async createProfileFromGeo(\n customerId: string,\n geoVerification: LocationVerification,\n customerData?: {\n fullName?: string;\n email?: string;\n phone?: string;\n dateOfBirth?: string;\n }\n ): Promise<CustomerProfile> {\n // Warn if creating profile without proper customer data\n if (!customerData?.email || !customerData?.fullName) {\n this.logger.warn(\n `Creating profile for ${customerId} with incomplete data. ` +\n 'Profiles should be created during registration with complete customer information.'\n );\n }\n\n return this.riskClient.createProfile({\n customer_id: customerId,\n entity_type: 'individual',\n customer_status: 'active',\n full_name: customerData?.fullName || undefined,\n email_address: customerData?.email || '',\n primary_phone_number: customerData?.phone || undefined,\n date_of_birth: customerData?.dateOfBirth || undefined,\n location: `${geoVerification.location.city}, ${geoVerification.location.country}`,\n location_compliance: geoVerification.is_compliant ? 'compliant' : 'non-compliant',\n country_of_residence: geoVerification.location.country_iso,\n kyc_status: 'pending',\n });\n }\n\n private calculateTransactionRisk(\n amount: number,\n currency: string,\n geoVerification: LocationVerification,\n profile: CustomerProfile\n ): TransactionRiskResult {\n if (!this._currencyRatesCustomized && !this._currencyRatesWarned) {\n this._currencyRatesWarned = true;\n this.logger.warn(\n 'Using default currency exchange rates. ' +\n 'Call updateCurrencyRates() or fetchCurrencyRates() for accurate transaction risk calculation.'\n );\n }\n\n let riskScore = 0;\n const factors: string[] = [];\n\n // Amount-based risk (normalized to USD)\n const normalizedAmount = this.normalizeToUSD(amount, currency);\n if (normalizedAmount > 10000) {\n riskScore += 30;\n factors.push('high_transaction_amount');\n } else if (normalizedAmount > 5000) {\n riskScore += 15;\n factors.push('elevated_transaction_amount');\n }\n\n // Geo risk\n riskScore += geoVerification.risk_score * 0.4;\n if (geoVerification.risk_level === 'high' || geoVerification.risk_level === 'critical') {\n factors.push('high_risk_location');\n }\n\n // Profile risk\n riskScore += profile.risk_score * 0.3;\n if (profile.risk_category === 'high' || profile.risk_category === 'critical') {\n factors.push('high_risk_customer');\n }\n\n // VPN/anonymizer during transaction\n if (geoVerification.location.is_vpn || geoVerification.location.is_proxy) {\n riskScore += 20;\n factors.push('anonymization_detected');\n }\n\n // Suspended account\n if (profile.customer_status === 'suspended') {\n riskScore += 50;\n factors.push('account_suspended');\n }\n\n return {\n score: Math.min(riskScore, 100),\n level: this.getRiskLevel(riskScore),\n factors: factors,\n allowed: riskScore < 70,\n requiresManualReview: riskScore >= 60 && riskScore < 70,\n };\n }\n\n private checkJurisdictionLimits(\n amount: number,\n currency: string,\n jurisdiction?: JurisdictionConfig\n ): boolean {\n if (!jurisdiction || !jurisdiction.max_transaction_amount) {\n return true;\n }\n\n const normalizedAmount = this.normalizeToUSD(amount, currency);\n return normalizedAmount <= jurisdiction.max_transaction_amount;\n }\n\n private normalizeToUSD(amount: number, currency: string): number {\n const rate = this.currencyRates[currency.toUpperCase()] || 1;\n return amount * rate;\n }\n\n private getRiskLevel(score: number): 'low' | 'medium' | 'high' | 'critical' {\n if (score >= 80) return 'critical';\n if (score >= 60) return 'high';\n if (score >= 40) return 'medium';\n return 'low';\n }\n\n private getBlockReasons(geoVerification: LocationVerification, profile: CustomerProfile): string[] {\n const reasons: string[] = [];\n\n if (geoVerification.is_blocked) {\n reasons.push(...geoVerification.risk_reasons);\n }\n\n if (profile.customer_status === 'suspended') {\n reasons.push('account_suspended');\n }\n\n if (profile.has_sanctions) {\n reasons.push('sanctions_match');\n }\n\n return reasons;\n }\n\n private getTransactionBlockReasons(\n geoVerification: LocationVerification,\n transactionRisk: TransactionRiskResult,\n jurisdictionAllowed: boolean\n ): string[] {\n const reasons: string[] = [];\n\n if (!geoVerification.is_compliant) {\n reasons.push('non_compliant_jurisdiction');\n }\n\n if (!jurisdictionAllowed) {\n reasons.push('exceeds_jurisdiction_limit');\n }\n\n if (!transactionRisk.allowed) {\n reasons.push(...transactionRisk.factors);\n }\n\n return reasons;\n }\n\n // ============================================================================\n // Location Request Methods\n // ============================================================================\n\n /**\n * Request live location from a customer\n *\n * Creates a location request and sends a notification to the customer\n * via the specified channel (SMS, email, or push). The customer receives\n * a link to share their location.\n *\n * @param input - Location request details\n * @returns Location request result with share link\n *\n * @example\n * ```typescript\n * // Request location via SMS for transaction verification\n * const result = await sdk.requestCustomerLocation({\n * customerId: 'CUST-12345',\n * channel: 'sms',\n * phone: '+1234567890',\n * reason: 'Verification required for high-value transaction'\n * });\n *\n * console.log('Share link sent:', result.shareLink);\n * console.log('Expires at:', result.tokenExpiry);\n *\n * // Request location via email\n * const emailResult = await sdk.requestCustomerLocation({\n * customerId: 'CUST-12345',\n * channel: 'email',\n * email: 'customer@example.com',\n * reason: 'Account verification',\n * expiryHours: 48\n * });\n * ```\n */\n async requestCustomerLocation(\n input: ComplianceLocationRequestInput,\n requestOptions?: RequestOptions\n ): Promise<ComplianceLocationRequestResult> {\n if (this.config.debug) {\n this.logger.debug('Creating location request for customer', { customerId: input.customerId });\n }\n\n // Validate input\n this.validateLocationRequestInput(input);\n\n // Get customer profile if available\n let profile: CustomerProfile | undefined;\n try {\n profile = await this.riskClient.getProfile(input.customerId, requestOptions);\n } catch (error) {\n if (this.config.debug) {\n this.logger.warn('Customer profile not found', { customerId: input.customerId });\n }\n }\n\n // Use profile data if contact info not provided\n const phone = input.phone || profile?.primary_phone_number;\n const email = input.email || profile?.email_address;\n\n // Create the location request\n const result = await this.geoClient.createLocationRequest({\n user_id: input.customerId,\n channel: input.channel,\n reason: input.reason,\n phone: phone,\n email: email,\n expiry_hours: input.expiryHours,\n }, requestOptions);\n\n if (this.config.debug) {\n this.logger.debug('Location request created', {\n requestId: result.request.id,\n channel: input.channel,\n expiresAt: result.token_expiry,\n });\n }\n\n return {\n request: result.request,\n shareLink: result.share_link,\n tokenExpiry: result.token_expiry,\n profile: profile,\n };\n }\n\n /**\n * Get a specific location request by ID\n *\n * @param requestId - Location request ID\n * @returns Location request details\n *\n * @example\n * ```typescript\n * const request = await sdk.getLocationRequest('req_abc123');\n * console.log('Status:', request.status);\n * if (request.latitude && request.longitude) {\n * console.log('Location captured:', request.latitude, request.longitude);\n * }\n * ```\n */\n async getLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<LocationRequest> {\n return this.geoClient.getLocationRequest(requestId, requestOptions);\n }\n\n /**\n * List location requests with filters and pagination\n *\n * @param filters - Optional filters\n * @param pagination - Optional pagination\n * @returns Paginated list of location requests\n *\n * @example\n * ```typescript\n * // Get pending requests for a customer\n * const pending = await sdk.listLocationRequests(\n * { status: 'pending', user_id: 'CUST-12345' },\n * { page: 1, limit: 20 }\n * );\n *\n * // Get all completed requests from last week\n * const completed = await sdk.listLocationRequests({\n * status: 'completed',\n * date_from: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString()\n * });\n * ```\n */\n async listLocationRequests(\n filters?: LocationRequestFilters,\n pagination?: PaginationParams,\n requestOptions?: RequestOptions\n ): Promise<LocationRequestListResponse> {\n return this.geoClient.listLocationRequests(filters, pagination, requestOptions);\n }\n\n /**\n * Cancel a pending location request\n *\n * @param requestId - Location request ID\n *\n * @example\n * ```typescript\n * await sdk.cancelLocationRequest('req_abc123');\n * ```\n */\n async cancelLocationRequest(requestId: string, requestOptions?: RequestOptions): Promise<void> {\n if (this.config.debug) {\n this.logger.debug('Cancelling location request', { requestId });\n }\n await this.geoClient.cancelLocationRequest(requestId, requestOptions);\n }\n\n /**\n * Resend notification for a location request\n *\n * @param requestId - Location request ID\n * @param contact - Contact details (email or phone)\n *\n * @example\n * ```typescript\n * // Resend to a different phone number\n * await sdk.resendLocationRequest('req_abc123', { phone: '+0987654321' });\n *\n * // Resend to email\n * await sdk.resendLocationRequest('req_abc123', { email: 'new@example.com' });\n * ```\n */\n async resendLocationRequest(\n requestId: string,\n contact: { email?: string; phone?: string },\n requestOptions?: RequestOptions\n ): Promise<void> {\n if (this.config.debug) {\n this.logger.debug('Resending location request', { requestId });\n }\n await this.geoClient.resendLocationRequest(requestId, contact, requestOptions);\n }\n\n /**\n * Validate location request input\n */\n private validateLocationRequestInput(input: ComplianceLocationRequestInput): void {\n const errors: string[] = [];\n\n if (!input.customerId?.trim()) {\n errors.push('customerId is required');\n }\n\n if (!input.channel) {\n errors.push('channel is required');\n }\n\n if (!input.reason?.trim()) {\n errors.push('reason is required for compliance/audit purposes');\n }\n\n // Channel-specific validation\n if (input.channel === 'sms' && !input.phone) {\n errors.push('phone is required for SMS channel');\n }\n\n if (input.channel === 'email' && !input.email) {\n errors.push('email is required for email channel');\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid location request: ${errors.join(', ')}`, errors);\n }\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Update currency exchange rates\n *\n * Use this to keep currency rates current for accurate transaction risk\n * calculation. Rates should be updated regularly (e.g., daily).\n *\n * @param rates - Currency to USD exchange rates\n *\n * @example\n * ```typescript\n * // Update specific rates\n * sdk.updateCurrencyRates({\n * EUR: 1.08,\n * GBP: 1.25,\n * BTC: 42000, // For crypto support\n * });\n *\n * // Or fetch from external service\n * const rates = await fetchExchangeRates();\n * sdk.updateCurrencyRates(rates);\n * ```\n */\n updateCurrencyRates(rates: CurrencyRates): void {\n this.currencyRates = { ...this.currencyRates, ...rates };\n this._currencyRatesCustomized = true;\n }\n\n /**\n * Get current currency rates\n *\n * @returns Current currency to USD exchange rates\n */\n getCurrencyRates(): Readonly<CurrencyRates> {\n return { ...this.currencyRates };\n }\n\n}\n"]}
|