cgs-compliance-sdk 2.0.3 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-BIRcQF2C.d.ts +619 -0
- package/dist/client-CPBy8d1H.d.mts +619 -0
- package/dist/compliance/index.d.mts +231 -0
- package/dist/compliance/index.d.ts +231 -0
- package/dist/compliance/index.js +17 -19
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/index.mjs +17 -19
- package/dist/compliance/index.mjs.map +1 -1
- package/dist/geolocation/index.d.mts +122 -0
- package/dist/geolocation/index.d.ts +122 -0
- package/dist/geolocation/index.js +1 -0
- package/dist/geolocation/index.js.map +1 -1
- package/dist/geolocation/index.mjs +1 -0
- package/dist/geolocation/index.mjs.map +1 -1
- package/dist/index-BQPX1yNM.d.ts +524 -0
- package/dist/index-CzElZ3T6.d.mts +524 -0
- package/dist/index.d.mts +48 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +18 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -19
- package/dist/index.mjs.map +1 -1
- package/dist/risk-profile/index.d.mts +2 -0
- package/dist/risk-profile/index.d.ts +2 -0
- package/dist/risk-profile/index.js.map +1 -1
- package/dist/risk-profile/index.mjs.map +1 -1
- package/dist/types-mQdu71xf.d.mts +61 -0
- package/dist/types-mQdu71xf.d.ts +61 -0
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/geolocation/client.ts","../src/geolocation/hooks.ts","../src/risk-profile/client.ts","../src/compliance/client.ts","../src/compliance/types.ts"],"names":["useState","useCallback","error","useEffect","useRef","DEFAULT_CURRENCY_RATES"],"mappings":"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","file":"index.js","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 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(service: string) {\n super(`${service} is unavailable`, 'SERVICE_UNAVAILABLE', 503, { service });\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","/**\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, RequiredBaseClientConfig } from './config';\nimport {\n CGSError,\n NetworkError,\n TimeoutError,\n AuthenticationError,\n RateLimitError,\n ServiceUnavailableError,\n} from './errors';\n\nexport abstract class BaseClient {\n protected config: RequiredBaseClientConfig;\n\n constructor(config: BaseClientConfig) {\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 };\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 ): Promise<T> {\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 ...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 const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n if (this.config.debug) {\n console.log(`[CGS SDK] ${options.method || 'GET'} ${url}`, {\n headers,\n body: options.body,\n });\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const data = await response.json();\n\n if (!response.ok) {\n this.handleErrorResponse(response.status, data);\n }\n\n if (this.config.debug) {\n console.log(`[CGS SDK] Response:`, data);\n }\n\n return data as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(this.config.timeout);\n }\n if (error instanceof CGSError) {\n throw error;\n }\n }\n\n throw new NetworkError('Network request failed', error);\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 ): 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);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error');\n\n // Don't retry on client errors (4xx) or authentication errors\n if (\n lastError instanceof CGSError &&\n lastError.statusCode &&\n lastError.statusCode >= 400 &&\n lastError.statusCode < 500\n ) {\n throw lastError;\n }\n\n // Don't retry on last attempt\n if (attempt === retries) {\n break;\n }\n\n // Exponential backoff with jitter\n const delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n if (this.config.debug) {\n console.log(`[CGS SDK] 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: any): never {\n const message = data.error || data.message || `HTTP ${status}`;\n\n switch (status) {\n case 400:\n throw new CGSError(message, 'BAD_REQUEST', 400, data);\n case 401:\n throw new AuthenticationError(message);\n case 403:\n throw new CGSError(message, 'FORBIDDEN', 403, data);\n case 404:\n throw new CGSError(message, 'NOT_FOUND', 404, data);\n case 429:\n const retryAfter = data.retry_after || data.retryAfter;\n throw new RateLimitError(retryAfter);\n case 500:\n case 502:\n case 503:\n case 504:\n throw new ServiceUnavailableError(message);\n default:\n throw new CGSError(message, 'UNKNOWN_ERROR', status, data);\n }\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 }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<BaseClientConfig> {\n return { ...this.config };\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 * GeolocationClient - TypeScript SDK for CGS Geolocation & Compliance Service\n *\n * Provides type-safe methods to interact with the geolocation service API.\n */\n\nimport type {\n GeolocationClientConfig,\n VerifyIPRequest,\n LocationVerification,\n ComplianceCheckResponse,\n GeolocationAlert,\n AlertFilters,\n PaginationParams,\n AlertListResponse,\n DashboardMetrics,\n JurisdictionConfig,\n CreateJurisdictionRequest,\n UpdateJurisdictionRequest,\n GeofenceRule,\n CreateGeofenceRuleRequest,\n UpdateGeofenceRuleRequest,\n DeviceFingerprint,\n UpdateDeviceTrustRequest,\n GeolocationRecord,\n APIResponse,\n AlertStatus,\n} from './types';\n\nexport class GeolocationClient {\n private config: Required<GeolocationClientConfig>;\n\n constructor(config: GeolocationClientConfig) {\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 debug: config.debug || false,\n };\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.config.baseURL}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Tenant-ID': this.config.tenantId,\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 const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n if (this.config.debug) {\n console.log(`[GeolocationSDK] ${options.method || 'GET'} ${url}`, {\n headers,\n body: options.body,\n });\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.error || data.message || `HTTP ${response.status}`);\n }\n\n if (this.config.debug) {\n console.log(`[GeolocationSDK] Response:`, data);\n }\n\n return data as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.timeout}ms`);\n }\n throw error;\n }\n\n throw new Error('Unknown error occurred');\n }\n }\n\n private 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 query.append(key, String(value));\n }\n });\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n // ============================================================================\n // IP Verification & Compliance\n // ============================================================================\n\n /**\n * Verify an IP address and check compliance\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): Promise<LocationVerification> {\n return this.request<LocationVerification>('/api/v1/geo/verify', {\n method: 'POST',\n body: JSON.stringify(request),\n });\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): Promise<ComplianceCheckResponse> {\n return this.request<ComplianceCheckResponse>(\n `/api/v1/geo/compliance?country_iso=${countryISO}`\n );\n }\n\n /**\n * Get location history for a user\n *\n * @param userId - User ID to retrieve history for\n * @param limit - Maximum number of records to return (default: 100)\n * @returns Array of geolocation records\n */\n async getUserLocationHistory(\n userId: string,\n limit: number = 100\n ): Promise<GeolocationRecord[]> {\n return this.request<GeolocationRecord[]>(\n `/api/v1/geo/history?user_id=${userId}&limit=${limit}`\n );\n }\n\n // ============================================================================\n // Alert Management\n // ============================================================================\n\n /**\n * Get a specific alert by ID\n *\n * @param alertId - Alert ID\n * @returns Alert details\n */\n async getAlert(alertId: string): Promise<GeolocationAlert> {\n return this.request<GeolocationAlert>(`/api/v1/alerts/${alertId}`);\n }\n\n /**\n * List alerts with filters and pagination\n *\n * @param filters - Optional filters (status, severity, type, user, dates)\n * @param pagination - Optional pagination (page, page_size)\n * @returns Paginated list of alerts\n *\n * @example\n * ```typescript\n * const alerts = await client.listAlerts(\n * { status: \"active\", severity: \"critical\" },\n * { page: 1, page_size: 20 }\n * );\n * console.log(`Found ${alerts.total} critical alerts`);\n * ```\n */\n async listAlerts(\n filters?: AlertFilters,\n pagination?: PaginationParams\n ): Promise<AlertListResponse> {\n const params: Record<string, unknown> = {\n ...filters,\n ...pagination,\n };\n\n return this.request<AlertListResponse>(`/api/v1/alerts${this.buildQueryString(params)}`);\n }\n\n /**\n * Update alert status\n *\n * @param alertId - Alert ID\n * @param status - New status\n */\n async updateAlertStatus(alertId: string, status: AlertStatus): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/status`, {\n method: 'PUT',\n body: JSON.stringify({ status }),\n });\n }\n\n /**\n * Assign an alert to an analyst\n *\n * @param alertId - Alert ID\n * @param assignedTo - User ID to assign to\n */\n async assignAlert(alertId: string, assignedTo: string): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/assign`, {\n method: 'POST',\n body: JSON.stringify({ assigned_to: assignedTo }),\n });\n }\n\n /**\n * Resolve an alert\n *\n * @param alertId - Alert ID\n * @param resolution - Resolution type\n * @param notes - Optional notes\n */\n async resolveAlert(\n alertId: string,\n resolution: string,\n notes?: string\n ): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/resolve`, {\n method: 'POST',\n body: JSON.stringify({ resolution, notes }),\n });\n }\n\n /**\n * Dismiss an alert as false positive\n *\n * @param alertId - Alert ID\n * @param notes - Optional notes explaining why it's a false positive\n */\n async dismissAlert(alertId: string, notes?: string): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/dismiss`, {\n method: 'POST',\n body: JSON.stringify({ notes }),\n });\n }\n\n /**\n * Escalate an alert to higher severity or different assignee\n *\n * @param alertId - Alert ID\n * @param assignedTo - New assignee user ID\n * @param severity - New severity level\n * @param notes - Escalation notes\n */\n async escalateAlert(\n alertId: string,\n assignedTo: string,\n severity: string,\n notes: string\n ): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/escalate`, {\n method: 'POST',\n body: JSON.stringify({ assigned_to: assignedTo, severity, notes }),\n });\n }\n\n /**\n * Block an alert (mark as blocked)\n *\n * @param alertId - Alert ID\n * @param notes - Optional notes\n */\n async blockAlert(alertId: string, notes?: string): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/block`, {\n method: 'POST',\n body: JSON.stringify({ notes }),\n });\n }\n\n /**\n * Get dashboard metrics\n *\n * @param timeRangeHours - Time range in hours (default: 24)\n * @returns Dashboard metrics and statistics\n *\n * @example\n * ```typescript\n * const metrics = await client.getDashboardMetrics(168); // Last 7 days\n * console.log(`${metrics.critical_alerts} critical alerts in last week`);\n * ```\n */\n async getDashboardMetrics(timeRangeHours: number = 24): Promise<DashboardMetrics> {\n return this.request<DashboardMetrics>(\n `/api/v1/alerts/metrics?time_range_hours=${timeRangeHours}`\n );\n }\n\n // ============================================================================\n // Jurisdiction Configuration\n // ============================================================================\n\n /**\n * List all jurisdiction configurations\n *\n * @returns Array of jurisdiction configurations\n */\n async listJurisdictions(): Promise<JurisdictionConfig[]> {\n return this.request<JurisdictionConfig[]>('/api/v1/jurisdictions');\n }\n\n /**\n * Get a jurisdiction configuration by ID\n *\n * @param jurisdictionId - Jurisdiction ID\n * @returns Jurisdiction configuration\n */\n async getJurisdiction(jurisdictionId: string): Promise<JurisdictionConfig> {\n return this.request<JurisdictionConfig>(`/api/v1/jurisdictions/${jurisdictionId}`);\n }\n\n /**\n * Create a new jurisdiction configuration\n *\n * @param request - Jurisdiction configuration data\n * @returns Created jurisdiction\n *\n * @example\n * ```typescript\n * const jurisdiction = await client.createJurisdiction({\n * country_iso: \"US\",\n * country_name: \"United States\",\n * status: \"allowed\",\n * risk_level: \"low\",\n * allow_login: true,\n * allow_registration: true,\n * allow_transactions: true,\n * require_kyc: false,\n * require_enhanced_verification: false\n * });\n * ```\n */\n async createJurisdiction(request: CreateJurisdictionRequest): Promise<JurisdictionConfig> {\n return this.request<JurisdictionConfig>('/api/v1/jurisdictions', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update a jurisdiction configuration\n *\n * @param jurisdictionId - Jurisdiction ID\n * @param request - Updated fields\n * @returns Updated jurisdiction\n */\n async updateJurisdiction(\n jurisdictionId: string,\n request: UpdateJurisdictionRequest\n ): Promise<JurisdictionConfig> {\n return this.request<JurisdictionConfig>(`/api/v1/jurisdictions/${jurisdictionId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a jurisdiction configuration\n *\n * @param jurisdictionId - Jurisdiction ID\n */\n async deleteJurisdiction(jurisdictionId: string): Promise<void> {\n await this.request(`/api/v1/jurisdictions/${jurisdictionId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Geofence Rules\n // ============================================================================\n\n /**\n * List all geofence rules\n *\n * @returns Array of geofence rules\n */\n async listGeofenceRules(): Promise<GeofenceRule[]> {\n return this.request<GeofenceRule[]>('/api/v1/geofence-rules');\n }\n\n /**\n * Get a geofence rule by ID\n *\n * @param ruleId - Geofence rule ID\n * @returns Geofence rule\n */\n async getGeofenceRule(ruleId: string): Promise<GeofenceRule> {\n return this.request<GeofenceRule>(`/api/v1/geofence-rules/${ruleId}`);\n }\n\n /**\n * Create a new geofence rule\n *\n * @param request - Geofence rule data\n * @returns Created geofence rule\n *\n * @example\n * ```typescript\n * const rule = await client.createGeofenceRule({\n * name: \"Block High Risk Countries\",\n * rule_type: \"block_list\",\n * action: \"block\",\n * countries: [\"KP\", \"IR\", \"SY\"],\n * event_types: [\"login\", \"transaction\"],\n * priority: 100\n * });\n * ```\n */\n async createGeofenceRule(request: CreateGeofenceRuleRequest): Promise<GeofenceRule> {\n return this.request<GeofenceRule>('/api/v1/geofence-rules', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update a geofence rule\n *\n * @param ruleId - Geofence rule ID\n * @param request - Updated fields\n * @returns Updated geofence rule\n */\n async updateGeofenceRule(\n ruleId: string,\n request: UpdateGeofenceRuleRequest\n ): Promise<GeofenceRule> {\n return this.request<GeofenceRule>(`/api/v1/geofence-rules/${ruleId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a geofence rule\n *\n * @param ruleId - Geofence rule ID\n */\n async deleteGeofenceRule(ruleId: string): Promise<void> {\n await this.request(`/api/v1/geofence-rules/${ruleId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Device Fingerprinting\n // ============================================================================\n\n /**\n * Get all devices for a user\n *\n * @param userId - User ID\n * @returns Array of device fingerprints\n */\n async getUserDevices(userId: string): Promise<DeviceFingerprint[]> {\n return this.request<DeviceFingerprint[]>(`/api/v1/devices/user/?user_id=${userId}`);\n }\n\n /**\n * Get a specific device by device ID\n *\n * @param deviceId - Device ID\n * @returns Device fingerprint\n */\n async getDevice(deviceId: string): Promise<DeviceFingerprint> {\n return this.request<DeviceFingerprint>(`/api/v1/devices/?device_id=${deviceId}`);\n }\n\n /**\n * Update device trust status\n *\n * @param deviceId - Device ID\n * @param action - \"trust\" or \"untrust\"\n *\n * @example\n * ```typescript\n * // Mark a device as trusted\n * await client.updateDeviceTrust(\"device_abc\", \"trust\");\n *\n * // Mark a device as untrusted\n * await client.updateDeviceTrust(\"device_xyz\", \"untrust\");\n * ```\n */\n async updateDeviceTrust(\n deviceId: string,\n action: 'trust' | 'untrust'\n ): Promise<void> {\n await this.request(`/api/v1/devices/?device_id=${deviceId}&action=${action}`, {\n method: 'POST',\n });\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n /**\n * Check service health\n *\n * @returns Health status object\n */\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n return this.request('/api/v1/health');\n }\n\n /**\n * Update client configuration\n *\n * @param config - Partial configuration to update\n */\n updateConfig(config: Partial<GeolocationClientConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n headers: {\n ...this.config.headers,\n ...(config.headers || {}),\n },\n };\n }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<GeolocationClientConfig> {\n return { ...this.config };\n }\n}\n","/**\n * React Hooks for CGS Geolocation SDK\n *\n * Provides convenient React hooks for using the geolocation service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GeolocationClient } from './client';\nimport type {\n LocationVerification,\n VerifyIPRequest,\n ComplianceCheckResponse,\n GeolocationAlert,\n AlertFilters,\n PaginationParams,\n DashboardMetrics,\n UseGeolocationOptions,\n UseGeolocationResult,\n UseAlertsOptions,\n UseAlertsResult,\n AlertStatus,\n DeviceFingerprintRequest,\n} from './types';\n\n// ============================================================================\n// useGeolocation Hook\n// ============================================================================\n\n/**\n * React hook for IP verification and compliance checking\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Geolocation verification state and methods\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * const { verification, loading, error, verifyIP } = useGeolocation(client, {\n * autoVerify: true,\n * eventType: \"login\",\n * includeDeviceFingerprint: true\n * });\n *\n * useEffect(() => {\n * if (verification?.is_blocked) {\n * alert(\"Access blocked: \" + verification.risk_reasons.join(\", \"));\n * }\n * }, [verification]);\n *\n * return <div>Risk Level: {verification?.risk_level}</div>;\n * }\n * ```\n */\nexport function useGeolocation(\n client: GeolocationClient,\n options: UseGeolocationOptions = {}\n): UseGeolocationResult {\n const [verification, setVerification] = useState<LocationVerification | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const verifyIP = useCallback(\n async (request: VerifyIPRequest): Promise<LocationVerification> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyIP(request);\n setVerification(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Verification failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const checkCompliance = useCallback(\n async (countryISO: string): Promise<ComplianceCheckResponse> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.checkCompliance(countryISO);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Compliance check failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n if (verification) {\n await verifyIP({\n ip_address: verification.ip_address,\n user_id: '', // Will need to be provided\n event_type: options.eventType || 'api_access',\n });\n }\n }, [verification, verifyIP, options.eventType]);\n\n // Auto-verify on mount if enabled\n useEffect(() => {\n if (options.autoVerify) {\n // Try to get user's IP from a service or use placeholder\n const detectAndVerify = async () => {\n try {\n // In production, you'd use a service like ipify.org or get from server\n const ipResponse = await fetch('https://api.ipify.org?format=json');\n const { ip } = await ipResponse.json();\n\n let deviceFingerprint: DeviceFingerprintRequest | undefined;\n\n if (options.includeDeviceFingerprint && typeof window !== 'undefined') {\n deviceFingerprint = {\n device_id: localStorage.getItem('device_id') || generateDeviceId(),\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n };\n\n // Store device ID\n if (!localStorage.getItem('device_id')) {\n localStorage.setItem('device_id', deviceFingerprint.device_id);\n }\n }\n\n await verifyIP({\n ip_address: ip,\n user_id: '', // Should be provided by auth context\n event_type: options.eventType || 'page_view',\n device_fingerprint: deviceFingerprint,\n });\n } catch (err) {\n console.error('Auto-verification failed:', err);\n }\n };\n\n detectAndVerify();\n }\n }, [options.autoVerify, options.includeDeviceFingerprint, options.eventType, verifyIP]);\n\n return {\n verification,\n loading,\n error,\n verifyIP,\n checkCompliance,\n refresh,\n };\n}\n\n// ============================================================================\n// useAlerts Hook\n// ============================================================================\n\n/**\n * React hook for alert management\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Alert state and management methods\n *\n * @example\n * ```tsx\n * function AlertDashboard() {\n * const {\n * alerts,\n * total,\n * loading,\n * fetchAlerts,\n * updateStatus,\n * resolveAlert\n * } = useAlerts(client, {\n * autoFetch: true,\n * filters: { status: \"active\", severity: \"critical\" },\n * pollInterval: 30000 // Poll every 30 seconds\n * });\n *\n * return (\n * <div>\n * <h2>{total} Alerts</h2>\n * {alerts.map(alert => (\n * <AlertCard\n * key={alert.id}\n * alert={alert}\n * onResolve={() => resolveAlert(alert.id, \"resolved\", \"Fixed\")}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useAlerts(\n client: GeolocationClient,\n options: UseAlertsOptions = {}\n): UseAlertsResult {\n const [alerts, setAlerts] = useState<GeolocationAlert[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const pollIntervalRef = useRef<NodeJS.Timeout>();\n\n const fetchAlerts = useCallback(\n async (filters?: AlertFilters, pagination?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listAlerts(\n filters || options.filters,\n pagination || options.pagination\n );\n setAlerts(result.alerts);\n setTotal(result.total);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch alerts');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.filters, options.pagination]\n );\n\n const updateStatus = useCallback(\n async (alertId: string, status: AlertStatus) => {\n try {\n await client.updateAlertStatus(alertId, status);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId ? { ...alert, status } : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update status');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const assignAlert = useCallback(\n async (alertId: string, assignedTo: string) => {\n try {\n await client.assignAlert(alertId, assignedTo);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId ? { ...alert, assigned_to: assignedTo, status: 'under_review' } : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to assign alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const resolveAlert = useCallback(\n async (alertId: string, resolution: string, notes?: string) => {\n try {\n await client.resolveAlert(alertId, resolution, notes);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId\n ? { ...alert, status: 'resolved', resolution, notes }\n : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to resolve alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const dismissAlert = useCallback(\n async (alertId: string, notes?: string) => {\n try {\n await client.dismissAlert(alertId, notes);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId\n ? { ...alert, status: 'false_positive', resolution: 'false_positive', notes }\n : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to dismiss alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchAlerts();\n }, [fetchAlerts]);\n\n // Auto-fetch on mount if enabled\n useEffect(() => {\n if (options.autoFetch) {\n fetchAlerts();\n }\n }, [options.autoFetch, fetchAlerts]);\n\n // Set up polling if enabled\n useEffect(() => {\n if (options.pollInterval && options.pollInterval > 0) {\n pollIntervalRef.current = setInterval(() => {\n fetchAlerts();\n }, options.pollInterval);\n\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n }\n };\n }\n }, [options.pollInterval, fetchAlerts]);\n\n return {\n alerts,\n total,\n loading,\n error,\n fetchAlerts,\n updateStatus,\n assignAlert,\n resolveAlert,\n dismissAlert,\n refresh,\n };\n}\n\n// ============================================================================\n// useDashboardMetrics Hook\n// ============================================================================\n\n/**\n * React hook for dashboard metrics\n *\n * @param client - GeolocationClient instance\n * @param timeRangeHours - Time range in hours (default: 24)\n * @param autoFetch - Auto-fetch metrics on mount (default: true)\n * @returns Dashboard metrics state\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { metrics, loading, refresh } = useDashboardMetrics(client, 168); // Last 7 days\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * <h2>Dashboard</h2>\n * <MetricCard label=\"Total Alerts\" value={metrics.total_alerts} />\n * <MetricCard label=\"Critical\" value={metrics.critical_alerts} />\n * <MetricCard label=\"Active\" value={metrics.active_alerts} />\n * </div>\n * );\n * }\n * ```\n */\nexport function useDashboardMetrics(\n client: GeolocationClient,\n timeRangeHours: number = 24,\n autoFetch: boolean = true\n) {\n const [metrics, setMetrics] = useState<DashboardMetrics | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchMetrics = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getDashboardMetrics(timeRangeHours);\n setMetrics(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch metrics');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client, timeRangeHours]);\n\n useEffect(() => {\n if (autoFetch) {\n fetchMetrics();\n }\n }, [autoFetch, fetchMetrics]);\n\n return {\n metrics,\n loading,\n error,\n refresh: fetchMetrics,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a unique device ID\n */\nfunction generateDeviceId(): string {\n return `device_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n\n/**\n * Get browser information\n */\nexport function getBrowserInfo(): {\n browser?: string;\n browser_version?: string;\n os?: string;\n} {\n if (typeof window === 'undefined') return {};\n\n const userAgent = navigator.userAgent;\n let browser: string | undefined;\n let browserVersion: string | undefined;\n let os: string | undefined;\n\n // Detect browser\n if (userAgent.indexOf('Firefox') > -1) {\n browser = 'Firefox';\n browserVersion = userAgent.match(/Firefox\\/([0-9.]+)/)?.[1];\n } else if (userAgent.indexOf('Chrome') > -1) {\n browser = 'Chrome';\n browserVersion = userAgent.match(/Chrome\\/([0-9.]+)/)?.[1];\n } else if (userAgent.indexOf('Safari') > -1) {\n browser = 'Safari';\n browserVersion = userAgent.match(/Version\\/([0-9.]+)/)?.[1];\n } else if (userAgent.indexOf('Edge') > -1) {\n browser = 'Edge';\n browserVersion = userAgent.match(/Edge\\/([0-9.]+)/)?.[1];\n }\n\n // Detect OS\n if (userAgent.indexOf('Win') > -1) os = 'Windows';\n else if (userAgent.indexOf('Mac') > -1) os = 'macOS';\n else if (userAgent.indexOf('Linux') > -1) os = 'Linux';\n else if (userAgent.indexOf('Android') > -1) os = 'Android';\n else if (userAgent.indexOf('iOS') > -1) os = 'iOS';\n\n return {\n browser,\n browser_version: browserVersion,\n os,\n };\n}\n\n/**\n * Create a complete device fingerprint for the current browser\n */\nexport function createDeviceFingerprint(): DeviceFingerprintRequest {\n const browserInfo = getBrowserInfo();\n const deviceId = localStorage.getItem('device_id') || generateDeviceId();\n\n if (!localStorage.getItem('device_id')) {\n localStorage.setItem('device_id', deviceId);\n }\n\n return {\n device_id: deviceId,\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n ...browserInfo,\n };\n}\n","/**\n * RiskProfileClient - Customer Risk Profile Management\n *\n * Provides methods to create, retrieve, and manage customer risk profiles\n * in the CGS Compliance Platform.\n */\n\nimport { BaseClient } from '../core/client';\nimport type { BaseClientConfig } from '../core/config';\nimport type {\n CustomerProfile,\n CreateProfileRequest,\n UpdateProfileRequest,\n ProfileDetailsResponse,\n ProfileFilters,\n ProfileListResponse,\n RiskDashboardMetrics,\n RiskConfiguration,\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): Promise<CustomerProfile> {\n return this.request<CustomerProfile>('/api/v1/profiles', {\n method: 'POST',\n body: JSON.stringify(request),\n });\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 * console.log('Risk score:', profile.risk_score);\n * ```\n */\n async getProfile(customerId: string): Promise<CustomerProfile> {\n const response = await this.queryProfiles({\n search: customerId,\n page: 1,\n page_size: 1,\n });\n\n if (response.data.length === 0) {\n throw new Error(`Profile not found for customer ID: ${customerId}`);\n }\n\n return response.data[0];\n }\n\n /**\n * Get profile by UUID\n *\n * @param profileId - Profile UUID\n * @returns Customer profile\n */\n async getProfileById(profileId: string): Promise<CustomerProfile> {\n // Note: The dashboard endpoint provides detailed profile view\n const details = await this.getProfileDetails(profileId);\n return details.profile;\n }\n\n /**\n * Get detailed profile information including risk factors and history\n *\n * @param profileId - Profile UUID\n * @returns Detailed profile response with risk factors and history\n *\n * @example\n * ```typescript\n * const details = await client.getProfileDetails(profileId);\n * console.log('Risk factors:', details.risk_factors);\n * console.log('Risk history:', details.risk_history);\n * console.log('Alert counts:', {\n * watchlist: details.watchlist_alert_count,\n * fraud: details.fraud_alert_count,\n * geo: details.geolocation_alert_count\n * });\n * ```\n */\n async getProfileDetails(profileId: string): Promise<ProfileDetailsResponse> {\n return this.request<ProfileDetailsResponse>(\n `/api/v1/risk-dashboard/profiles/${profileId}`\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 ): Promise<CustomerProfile> {\n return this.request<CustomerProfile>(`/api/v1/profiles/${profileId}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Manually recalculate risk score for a profile\n *\n * Triggers immediate risk score recalculation based on current risk factors.\n *\n * @param profileId - Profile UUID\n * @param reason - Optional reason for recalculation\n *\n * @example\n * ```typescript\n * await client.recalculateRiskScore(profileId, 'Manual review completed');\n * ```\n */\n async recalculateRiskScore(profileId: string, reason?: string): Promise<void> {\n const body = reason ? JSON.stringify({ reason }) : undefined;\n await this.request(`/api/v1/profiles/recalculate/${profileId}`, {\n method: 'POST',\n body,\n });\n }\n\n // ============================================================================\n // Query & Search\n // ============================================================================\n\n /**\n * Query profiles with advanced filters\n *\n * @param filters - Filter criteria and pagination\n * @returns Paginated list of profiles\n *\n * @example\n * ```typescript\n * const results = await client.queryProfiles({\n * risk_category: ['high', 'critical'],\n * kyc_status: ['pending'],\n * is_pep: true,\n * page: 1,\n * page_size: 20,\n * sort_by: 'risk_score',\n * sort_order: 'desc'\n * });\n *\n * console.log(`Found ${results.total} high-risk profiles`);\n * results.data.forEach(profile => {\n * console.log(`${profile.full_name}: ${profile.risk_score}`);\n * });\n * ```\n */\n async queryProfiles(filters: ProfileFilters = {}): Promise<ProfileListResponse> {\n const queryString = this.buildQueryString(filters);\n return this.request<ProfileListResponse>(\n `/api/v1/risk-dashboard/profiles${queryString}`\n );\n }\n\n /**\n * Search profiles by text (searches name, email, customer_id, account_number)\n *\n * @param searchText - Text to search for\n * @param limit - Maximum results to return (default: 10)\n * @returns Array of matching profiles\n */\n async searchProfiles(searchText: string, limit: number = 10): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n search: searchText,\n page: 1,\n page_size: limit,\n });\n return response.data;\n }\n\n /**\n * Get all high-risk profiles (high + critical)\n *\n * @param limit - Maximum results to return (default: 50)\n * @returns Array of high-risk profiles\n */\n async getHighRiskProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n risk_category: ['high', 'critical'],\n page: 1,\n page_size: limit,\n sort_by: 'risk_score',\n sort_order: 'desc',\n });\n return response.data;\n }\n\n /**\n * Get profiles requiring PEP review\n *\n * @param limit - Maximum results to return (default: 50)\n * @returns Array of PEP profiles\n */\n async getPEPProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n is_pep: true,\n page: 1,\n page_size: limit,\n });\n return response.data;\n }\n\n /**\n * Get profiles with sanctions matches\n *\n * @param limit - Maximum results to return (default: 50)\n * @returns Array of sanctioned profiles\n */\n async getSanctionedProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n has_sanctions: true,\n page: 1,\n page_size: limit,\n });\n return response.data;\n }\n\n // ============================================================================\n // Dashboard & Metrics\n // ============================================================================\n\n /**\n * Get risk dashboard metrics and statistics\n *\n * @param startDate - Optional start date for metrics (ISO format)\n * @param endDate - Optional end date for metrics (ISO format)\n * @returns Dashboard metrics\n *\n * @example\n * ```typescript\n * const metrics = await client.getDashboardMetrics();\n * console.log('Total risky profiles:', metrics.total_risky_profiles);\n * console.log('Critical profiles:', metrics.total_critical_profiles);\n * console.log('Average risk score:', metrics.average_risk_score);\n *\n * metrics.risk_distribution.forEach(item => {\n * console.log(`${item.category}: ${item.count} (${item.percentage}%)`);\n * });\n * ```\n */\n async getDashboardMetrics(\n startDate?: string,\n endDate?: string\n ): Promise<RiskDashboardMetrics> {\n const params: Record<string, string> = {};\n if (startDate) params.start_date = startDate;\n if (endDate) params.end_date = endDate;\n\n const queryString = this.buildQueryString(params);\n return this.request<RiskDashboardMetrics>(\n `/api/v1/risk-dashboard/metrics${queryString}`\n );\n }\n\n // ============================================================================\n // Bulk Operations\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 ): Promise<CustomerProfile> {\n try {\n return await this.getProfile(customerId);\n } catch (error) {\n // Profile doesn't exist, create it\n return await this.createProfile(createRequest);\n }\n }\n\n /**\n * Batch get profiles by customer IDs\n *\n * @param customerIds - Array of customer IDs\n * @returns Array of profiles (may be less than input if some not found)\n */\n async batchGetProfiles(customerIds: string[]): Promise<CustomerProfile[]> {\n // Note: Current API doesn't have batch endpoint, so we query with search\n // In production, this should use a dedicated batch endpoint\n const profiles: CustomerProfile[] = [];\n\n for (const customerId of customerIds) {\n try {\n const profile = await this.getProfile(customerId);\n profiles.push(profile);\n } catch (error) {\n // Profile not found, skip\n if (this.config.debug) {\n console.warn(`[RiskProfileClient] Profile not found for: ${customerId}`);\n }\n }\n }\n\n return profiles;\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Get risk configuration for tenant\n *\n * Returns the risk scoring weights and thresholds configured for the tenant.\n *\n * @returns Risk configuration\n */\n async getRiskConfiguration(): Promise<RiskConfiguration> {\n return this.request<RiskConfiguration>('/api/v1/risk-config');\n }\n\n /**\n * Update risk configuration for tenant\n *\n * Updates risk scoring weights and/or thresholds.\n *\n * @param config - Configuration updates\n * @returns Updated risk configuration\n */\n async updateRiskConfiguration(\n config: Partial<RiskConfiguration>\n ): Promise<RiskConfiguration> {\n return this.request<RiskConfiguration>('/api/v1/risk-config', {\n method: 'PUT',\n body: JSON.stringify(config),\n });\n }\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, RequiredCGSConfig } from '../core/config';\nimport { ComplianceError } from '../core/errors';\nimport type { JurisdictionConfig } 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 DEFAULT_CURRENCY_RATES,\n CurrencyRates,\n} from './types';\n\nexport class ComplianceClient {\n private geoClient: GeolocationClient;\n private riskClient: RiskProfileClient;\n private config: RequiredCGSConfig;\n private currencyRates: CurrencyRates;\n\n constructor(config: CGSConfig) {\n this.config = {\n apiGatewayURL: config.apiGatewayURL,\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 };\n\n // All clients use the API Gateway URL\n // The gateway routes to the appropriate backend service\n this.geoClient = new GeolocationClient({\n baseURL: this.config.apiGatewayURL,\n tenantId: this.config.tenantId,\n apiKey: this.config.apiKey,\n headers: this.config.headers,\n timeout: this.config.timeout,\n retries: this.config.retries,\n debug: this.config.debug,\n });\n\n this.riskClient = new RiskProfileClient({\n baseURL: this.config.apiGatewayURL,\n tenantId: this.config.tenantId,\n apiKey: this.config.apiKey,\n headers: this.config.headers,\n timeout: this.config.timeout,\n retries: this.config.retries,\n debug: this.config.debug,\n });\n\n this.currencyRates = DEFAULT_CURRENCY_RATES;\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 * @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 ): Promise<RegistrationVerificationResponse> {\n const startTime = Date.now();\n\n try {\n // Step 1: Verify geolocation\n if (this.config.debug) {\n console.log('[ComplianceSDK] Starting registration verification for:', request.customerId);\n }\n\n const 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 });\n\n // Step 2: Create customer risk profile\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 });\n\n // Step 3: Determine if registration should be allowed\n const isAllowed = geoVerification.is_compliant && !geoVerification.is_blocked;\n const requiresKYC = geoVerification.jurisdiction?.require_kyc || false;\n const requiresEDD = geoVerification.jurisdiction?.require_enhanced_verification || false;\n\n if (this.config.debug) {\n console.log('[ComplianceSDK] Registration verification complete:', {\n allowed: isAllowed,\n riskScore: geoVerification.risk_score,\n profileId: profile.id,\n });\n }\n\n return {\n allowed: isAllowed,\n geolocation: geoVerification,\n profile: profile,\n requiresKYC: requiresKYC,\n requiresEDD: requiresEDD,\n blockReasons: !isAllowed ? geoVerification.risk_reasons : [],\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[ComplianceSDK] Registration verification failed:', error);\n }\n throw new ComplianceError('Registration verification failed', error);\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 ): Promise<LoginVerificationResponse> {\n const startTime = Date.now();\n\n try {\n if (this.config.debug) {\n console.log('[ComplianceSDK] Starting login verification for:', request.customerId);\n }\n\n // Step 1: Verify geolocation\n const geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'login',\n device_fingerprint: request.deviceFingerprint,\n });\n\n // Step 2: Get or create profile\n let profile: CustomerProfile;\n try {\n profile = await this.riskClient.getProfile(request.customerId);\n\n // Update last activity and location\n if (this.shouldUpdateProfile(profile, geoVerification.location.city)) {\n 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 });\n\n // Refresh profile\n profile = await this.riskClient.getProfile(request.customerId);\n }\n } catch (error) {\n // Profile doesn't exist - this shouldn't happen for login\n if (this.config.autoCreateProfiles && this.config.debug) {\n console.warn('[ComplianceSDK] 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 ): Promise<TransactionVerificationResponse> {\n const startTime = Date.now();\n\n try {\n if (this.config.debug) {\n console.log('[ComplianceSDK] Starting transaction verification:', {\n customerId: request.customerId,\n amount: request.amount,\n currency: request.currency,\n });\n }\n\n // Step 1: Verify geolocation\n const geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'transaction',\n device_fingerprint: request.deviceFingerprint,\n });\n\n // Step 2: Get profile\n const profile = await this.riskClient.getProfile(request.customerId);\n\n // Step 3: 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): Promise<EventVerificationResponse> {\n const startTime = Date.now();\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 });\n\n // Optionally update profile activity\n if (this.config.autoCreateProfiles) {\n try {\n const profile = await this.riskClient.getProfile(request.customerId);\n await this.riskClient.updateProfile(profile.id, {\n last_recorded_activity: new Date().toISOString(),\n });\n } catch (error) {\n // Profile doesn't exist, ignore or create based on config\n if (this.config.debug) {\n console.warn('[ComplianceSDK] 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: any\n ): Promise<CustomerProfile> {\n return this.riskClient.createProfile({\n customer_id: customerId,\n entity_type: 'individual',\n customer_status: 'active',\n email_address: `${customerId}@placeholder.local`, // Temporary email\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: any,\n profile: CustomerProfile\n ): TransactionRiskResult {\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: any, 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: any,\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 // Configuration\n // ============================================================================\n\n /**\n * Update currency exchange rates\n *\n * @param rates - Currency to USD exchange rates\n */\n updateCurrencyRates(rates: CurrencyRates): void {\n this.currencyRates = { ...this.currencyRates, ...rates };\n }\n\n /**\n * Get underlying geolocation client\n */\n getGeolocationClient(): GeolocationClient {\n return this.geoClient;\n }\n\n /**\n * Get underlying risk profile client\n */\n getRiskProfileClient(): RiskProfileClient {\n return this.riskClient;\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<CGSConfig>): void {\n this.config = { ...this.config, ...config };\n this.geoClient.updateConfig(config as any);\n this.riskClient.updateConfig(config as any);\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;\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/geolocation/client.ts","../src/geolocation/hooks.ts","../src/risk-profile/client.ts","../src/compliance/types.ts","../src/compliance/client.ts"],"names":["useState","useCallback","error","useEffect","useRef"],"mappings":"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","file":"index.js","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 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(service: string) {\n super(`${service} is unavailable`, 'SERVICE_UNAVAILABLE', 503, { service });\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","/**\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, RequiredBaseClientConfig } from './config';\nimport {\n CGSError,\n NetworkError,\n TimeoutError,\n AuthenticationError,\n RateLimitError,\n ServiceUnavailableError,\n} from './errors';\n\nexport abstract class BaseClient {\n protected config: RequiredBaseClientConfig;\n\n constructor(config: BaseClientConfig) {\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 };\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 ): Promise<T> {\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 ...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 const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n if (this.config.debug) {\n console.log(`[CGS SDK] ${options.method || 'GET'} ${url}`, {\n headers,\n body: options.body,\n });\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const data = await response.json();\n\n if (!response.ok) {\n this.handleErrorResponse(response.status, data);\n }\n\n if (this.config.debug) {\n console.log(`[CGS SDK] Response:`, data);\n }\n\n return data as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(this.config.timeout);\n }\n if (error instanceof CGSError) {\n throw error;\n }\n }\n\n throw new NetworkError('Network request failed', error);\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 ): 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);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error');\n\n // Don't retry on client errors (4xx) or authentication errors\n if (\n lastError instanceof CGSError &&\n lastError.statusCode &&\n lastError.statusCode >= 400 &&\n lastError.statusCode < 500\n ) {\n throw lastError;\n }\n\n // Don't retry on last attempt\n if (attempt === retries) {\n break;\n }\n\n // Exponential backoff with jitter\n const delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n if (this.config.debug) {\n console.log(`[CGS SDK] 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: any): never {\n const message = data.error || data.message || `HTTP ${status}`;\n\n switch (status) {\n case 400:\n throw new CGSError(message, 'BAD_REQUEST', 400, data);\n case 401:\n throw new AuthenticationError(message);\n case 403:\n throw new CGSError(message, 'FORBIDDEN', 403, data);\n case 404:\n throw new CGSError(message, 'NOT_FOUND', 404, data);\n case 429:\n const retryAfter = data.retry_after || data.retryAfter;\n throw new RateLimitError(retryAfter);\n case 500:\n case 502:\n case 503:\n case 504:\n throw new ServiceUnavailableError(message);\n default:\n throw new CGSError(message, 'UNKNOWN_ERROR', status, data);\n }\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 }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<BaseClientConfig> {\n return { ...this.config };\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 * GeolocationClient - TypeScript SDK for CGS Geolocation & Compliance Service\n *\n * Provides type-safe methods to interact with the geolocation service API.\n */\n\nimport type {\n GeolocationClientConfig,\n VerifyIPRequest,\n LocationVerification,\n ComplianceCheckResponse,\n GeolocationAlert,\n AlertFilters,\n PaginationParams,\n AlertListResponse,\n DashboardMetrics,\n JurisdictionConfig,\n CreateJurisdictionRequest,\n UpdateJurisdictionRequest,\n GeofenceRule,\n CreateGeofenceRuleRequest,\n UpdateGeofenceRuleRequest,\n DeviceFingerprint,\n GeolocationRecord,\n AlertStatus,\n} from './types';\n\nexport class GeolocationClient {\n private config: Required<GeolocationClientConfig>;\n\n constructor(config: GeolocationClientConfig) {\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 debug: config.debug || false,\n };\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.config.baseURL}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Tenant-ID': this.config.tenantId,\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 const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n if (this.config.debug) {\n console.log(`[GeolocationSDK] ${options.method || 'GET'} ${url}`, {\n headers,\n body: options.body,\n });\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.error || data.message || `HTTP ${response.status}`);\n }\n\n if (this.config.debug) {\n console.log(`[GeolocationSDK] Response:`, data);\n }\n\n return data as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.timeout}ms`);\n }\n throw error;\n }\n\n throw new Error('Unknown error occurred');\n }\n }\n\n private 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 query.append(key, String(value));\n }\n });\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n // ============================================================================\n // IP Verification & Compliance\n // ============================================================================\n\n /**\n * Verify an IP address and check compliance\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): Promise<LocationVerification> {\n return this.request<LocationVerification>('/api/v1/geo/verify', {\n method: 'POST',\n body: JSON.stringify(request),\n });\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): Promise<ComplianceCheckResponse> {\n return this.request<ComplianceCheckResponse>(\n `/api/v1/geo/compliance?country_iso=${countryISO}`\n );\n }\n\n /**\n * Get location history for a user\n *\n * @param userId - User ID to retrieve history for\n * @param limit - Maximum number of records to return (default: 100)\n * @returns Array of geolocation records\n */\n async getUserLocationHistory(\n userId: string,\n limit: number = 100\n ): Promise<GeolocationRecord[]> {\n return this.request<GeolocationRecord[]>(\n `/api/v1/geo/history?user_id=${userId}&limit=${limit}`\n );\n }\n\n // ============================================================================\n // Alert Management\n // ============================================================================\n\n /**\n * Get a specific alert by ID\n *\n * @param alertId - Alert ID\n * @returns Alert details\n */\n async getAlert(alertId: string): Promise<GeolocationAlert> {\n return this.request<GeolocationAlert>(`/api/v1/alerts/${alertId}`);\n }\n\n /**\n * List alerts with filters and pagination\n *\n * @param filters - Optional filters (status, severity, type, user, dates)\n * @param pagination - Optional pagination (page, page_size)\n * @returns Paginated list of alerts\n *\n * @example\n * ```typescript\n * const alerts = await client.listAlerts(\n * { status: \"active\", severity: \"critical\" },\n * { page: 1, page_size: 20 }\n * );\n * console.log(`Found ${alerts.total} critical alerts`);\n * ```\n */\n async listAlerts(\n filters?: AlertFilters,\n pagination?: PaginationParams\n ): Promise<AlertListResponse> {\n const params: Record<string, unknown> = {\n ...filters,\n ...pagination,\n };\n\n return this.request<AlertListResponse>(`/api/v1/alerts${this.buildQueryString(params)}`);\n }\n\n /**\n * Update alert status\n *\n * @param alertId - Alert ID\n * @param status - New status\n */\n async updateAlertStatus(alertId: string, status: AlertStatus): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/status`, {\n method: 'PUT',\n body: JSON.stringify({ status }),\n });\n }\n\n /**\n * Assign an alert to an analyst\n *\n * @param alertId - Alert ID\n * @param assignedTo - User ID to assign to\n */\n async assignAlert(alertId: string, assignedTo: string): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/assign`, {\n method: 'POST',\n body: JSON.stringify({ assigned_to: assignedTo }),\n });\n }\n\n /**\n * Resolve an alert\n *\n * @param alertId - Alert ID\n * @param resolution - Resolution type\n * @param notes - Optional notes\n */\n async resolveAlert(\n alertId: string,\n resolution: string,\n notes?: string\n ): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/resolve`, {\n method: 'POST',\n body: JSON.stringify({ resolution, notes }),\n });\n }\n\n /**\n * Dismiss an alert as false positive\n *\n * @param alertId - Alert ID\n * @param notes - Optional notes explaining why it's a false positive\n */\n async dismissAlert(alertId: string, notes?: string): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/dismiss`, {\n method: 'POST',\n body: JSON.stringify({ notes }),\n });\n }\n\n /**\n * Escalate an alert to higher severity or different assignee\n *\n * @param alertId - Alert ID\n * @param assignedTo - New assignee user ID\n * @param severity - New severity level\n * @param notes - Escalation notes\n */\n async escalateAlert(\n alertId: string,\n assignedTo: string,\n severity: string,\n notes: string\n ): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/escalate`, {\n method: 'POST',\n body: JSON.stringify({ assigned_to: assignedTo, severity, notes }),\n });\n }\n\n /**\n * Block an alert (mark as blocked)\n *\n * @param alertId - Alert ID\n * @param notes - Optional notes\n */\n async blockAlert(alertId: string, notes?: string): Promise<void> {\n await this.request(`/api/v1/alerts/${alertId}/block`, {\n method: 'POST',\n body: JSON.stringify({ notes }),\n });\n }\n\n /**\n * Get dashboard metrics\n *\n * @param timeRangeHours - Time range in hours (default: 24)\n * @returns Dashboard metrics and statistics\n *\n * @example\n * ```typescript\n * const metrics = await client.getDashboardMetrics(168); // Last 7 days\n * console.log(`${metrics.critical_alerts} critical alerts in last week`);\n * ```\n */\n async getDashboardMetrics(timeRangeHours: number = 24): Promise<DashboardMetrics> {\n return this.request<DashboardMetrics>(\n `/api/v1/alerts/metrics?time_range_hours=${timeRangeHours}`\n );\n }\n\n // ============================================================================\n // Jurisdiction Configuration\n // ============================================================================\n\n /**\n * List all jurisdiction configurations\n *\n * @returns Array of jurisdiction configurations\n */\n async listJurisdictions(): Promise<JurisdictionConfig[]> {\n return this.request<JurisdictionConfig[]>('/api/v1/jurisdictions');\n }\n\n /**\n * Get a jurisdiction configuration by ID\n *\n * @param jurisdictionId - Jurisdiction ID\n * @returns Jurisdiction configuration\n */\n async getJurisdiction(jurisdictionId: string): Promise<JurisdictionConfig> {\n return this.request<JurisdictionConfig>(`/api/v1/jurisdictions/${jurisdictionId}`);\n }\n\n /**\n * Create a new jurisdiction configuration\n *\n * @param request - Jurisdiction configuration data\n * @returns Created jurisdiction\n *\n * @example\n * ```typescript\n * const jurisdiction = await client.createJurisdiction({\n * country_iso: \"US\",\n * country_name: \"United States\",\n * status: \"allowed\",\n * risk_level: \"low\",\n * allow_login: true,\n * allow_registration: true,\n * allow_transactions: true,\n * require_kyc: false,\n * require_enhanced_verification: false\n * });\n * ```\n */\n async createJurisdiction(request: CreateJurisdictionRequest): Promise<JurisdictionConfig> {\n return this.request<JurisdictionConfig>('/api/v1/jurisdictions', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update a jurisdiction configuration\n *\n * @param jurisdictionId - Jurisdiction ID\n * @param request - Updated fields\n * @returns Updated jurisdiction\n */\n async updateJurisdiction(\n jurisdictionId: string,\n request: UpdateJurisdictionRequest\n ): Promise<JurisdictionConfig> {\n return this.request<JurisdictionConfig>(`/api/v1/jurisdictions/${jurisdictionId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a jurisdiction configuration\n *\n * @param jurisdictionId - Jurisdiction ID\n */\n async deleteJurisdiction(jurisdictionId: string): Promise<void> {\n await this.request(`/api/v1/jurisdictions/${jurisdictionId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Geofence Rules\n // ============================================================================\n\n /**\n * List all geofence rules\n *\n * @returns Array of geofence rules\n */\n async listGeofenceRules(): Promise<GeofenceRule[]> {\n return this.request<GeofenceRule[]>('/api/v1/geofence-rules');\n }\n\n /**\n * Get a geofence rule by ID\n *\n * @param ruleId - Geofence rule ID\n * @returns Geofence rule\n */\n async getGeofenceRule(ruleId: string): Promise<GeofenceRule> {\n return this.request<GeofenceRule>(`/api/v1/geofence-rules/${ruleId}`);\n }\n\n /**\n * Create a new geofence rule\n *\n * @param request - Geofence rule data\n * @returns Created geofence rule\n *\n * @example\n * ```typescript\n * const rule = await client.createGeofenceRule({\n * name: \"Block High Risk Countries\",\n * rule_type: \"block_list\",\n * action: \"block\",\n * countries: [\"KP\", \"IR\", \"SY\"],\n * event_types: [\"login\", \"transaction\"],\n * priority: 100\n * });\n * ```\n */\n async createGeofenceRule(request: CreateGeofenceRuleRequest): Promise<GeofenceRule> {\n return this.request<GeofenceRule>('/api/v1/geofence-rules', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update a geofence rule\n *\n * @param ruleId - Geofence rule ID\n * @param request - Updated fields\n * @returns Updated geofence rule\n */\n async updateGeofenceRule(\n ruleId: string,\n request: UpdateGeofenceRuleRequest\n ): Promise<GeofenceRule> {\n return this.request<GeofenceRule>(`/api/v1/geofence-rules/${ruleId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a geofence rule\n *\n * @param ruleId - Geofence rule ID\n */\n async deleteGeofenceRule(ruleId: string): Promise<void> {\n await this.request(`/api/v1/geofence-rules/${ruleId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Device Fingerprinting\n // ============================================================================\n\n /**\n * Get all devices for a user\n *\n * @param userId - User ID\n * @returns Array of device fingerprints\n */\n async getUserDevices(userId: string): Promise<DeviceFingerprint[]> {\n return this.request<DeviceFingerprint[]>(`/api/v1/devices/user/?user_id=${userId}`);\n }\n\n /**\n * Get a specific device by device ID\n *\n * @param deviceId - Device ID\n * @returns Device fingerprint\n */\n async getDevice(deviceId: string): Promise<DeviceFingerprint> {\n return this.request<DeviceFingerprint>(`/api/v1/devices/?device_id=${deviceId}`);\n }\n\n /**\n * Update device trust status\n *\n * @param deviceId - Device ID\n * @param action - \"trust\" or \"untrust\"\n *\n * @example\n * ```typescript\n * // Mark a device as trusted\n * await client.updateDeviceTrust(\"device_abc\", \"trust\");\n *\n * // Mark a device as untrusted\n * await client.updateDeviceTrust(\"device_xyz\", \"untrust\");\n * ```\n */\n async updateDeviceTrust(\n deviceId: string,\n action: 'trust' | 'untrust'\n ): Promise<void> {\n await this.request(`/api/v1/devices/?device_id=${deviceId}&action=${action}`, {\n method: 'POST',\n });\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n /**\n * Check service health\n *\n * @returns Health status object\n */\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n return this.request('/api/v1/health');\n }\n\n /**\n * Update client configuration\n *\n * @param config - Partial configuration to update\n */\n updateConfig(config: Partial<GeolocationClientConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n headers: {\n ...this.config.headers,\n ...(config.headers || {}),\n },\n };\n }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<GeolocationClientConfig> {\n return { ...this.config };\n }\n}\n","/**\n * React Hooks for CGS Geolocation SDK\n *\n * Provides convenient React hooks for using the geolocation service in Next.js applications.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GeolocationClient } from './client';\nimport type {\n LocationVerification,\n VerifyIPRequest,\n ComplianceCheckResponse,\n GeolocationAlert,\n AlertFilters,\n PaginationParams,\n DashboardMetrics,\n UseGeolocationOptions,\n UseGeolocationResult,\n UseAlertsOptions,\n UseAlertsResult,\n AlertStatus,\n DeviceFingerprintRequest,\n} from './types';\n\n// ============================================================================\n// useGeolocation Hook\n// ============================================================================\n\n/**\n * React hook for IP verification and compliance checking\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Geolocation verification state and methods\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * const { verification, loading, error, verifyIP } = useGeolocation(client, {\n * autoVerify: true,\n * eventType: \"login\",\n * includeDeviceFingerprint: true\n * });\n *\n * useEffect(() => {\n * if (verification?.is_blocked) {\n * alert(\"Access blocked: \" + verification.risk_reasons.join(\", \"));\n * }\n * }, [verification]);\n *\n * return <div>Risk Level: {verification?.risk_level}</div>;\n * }\n * ```\n */\nexport function useGeolocation(\n client: GeolocationClient,\n options: UseGeolocationOptions = {}\n): UseGeolocationResult {\n const [verification, setVerification] = useState<LocationVerification | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const verifyIP = useCallback(\n async (request: VerifyIPRequest): Promise<LocationVerification> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.verifyIP(request);\n setVerification(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Verification failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const checkCompliance = useCallback(\n async (countryISO: string): Promise<ComplianceCheckResponse> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.checkCompliance(countryISO);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Compliance check failed');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n if (verification) {\n await verifyIP({\n ip_address: verification.ip_address,\n user_id: '', // Will need to be provided\n event_type: options.eventType || 'api_access',\n });\n }\n }, [verification, verifyIP, options.eventType]);\n\n // Auto-verify on mount if enabled\n useEffect(() => {\n if (options.autoVerify) {\n // Try to get user's IP from a service or use placeholder\n const detectAndVerify = async () => {\n try {\n // In production, you'd use a service like ipify.org or get from server\n const ipResponse = await fetch('https://api.ipify.org?format=json');\n const { ip } = await ipResponse.json();\n\n let deviceFingerprint: DeviceFingerprintRequest | undefined;\n\n if (options.includeDeviceFingerprint && typeof window !== 'undefined') {\n deviceFingerprint = {\n device_id: localStorage.getItem('device_id') || generateDeviceId(),\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n };\n\n // Store device ID\n if (!localStorage.getItem('device_id')) {\n localStorage.setItem('device_id', deviceFingerprint.device_id);\n }\n }\n\n await verifyIP({\n ip_address: ip,\n user_id: '', // Should be provided by auth context\n event_type: options.eventType || 'page_view',\n device_fingerprint: deviceFingerprint,\n });\n } catch (err) {\n console.error('Auto-verification failed:', err);\n }\n };\n\n detectAndVerify();\n }\n }, [options.autoVerify, options.includeDeviceFingerprint, options.eventType, verifyIP]);\n\n return {\n verification,\n loading,\n error,\n verifyIP,\n checkCompliance,\n refresh,\n };\n}\n\n// ============================================================================\n// useAlerts Hook\n// ============================================================================\n\n/**\n * React hook for alert management\n *\n * @param client - GeolocationClient instance\n * @param options - Hook options\n * @returns Alert state and management methods\n *\n * @example\n * ```tsx\n * function AlertDashboard() {\n * const {\n * alerts,\n * total,\n * loading,\n * fetchAlerts,\n * updateStatus,\n * resolveAlert\n * } = useAlerts(client, {\n * autoFetch: true,\n * filters: { status: \"active\", severity: \"critical\" },\n * pollInterval: 30000 // Poll every 30 seconds\n * });\n *\n * return (\n * <div>\n * <h2>{total} Alerts</h2>\n * {alerts.map(alert => (\n * <AlertCard\n * key={alert.id}\n * alert={alert}\n * onResolve={() => resolveAlert(alert.id, \"resolved\", \"Fixed\")}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useAlerts(\n client: GeolocationClient,\n options: UseAlertsOptions = {}\n): UseAlertsResult {\n const [alerts, setAlerts] = useState<GeolocationAlert[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const pollIntervalRef = useRef<NodeJS.Timeout>();\n\n const fetchAlerts = useCallback(\n async (filters?: AlertFilters, pagination?: PaginationParams) => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.listAlerts(\n filters || options.filters,\n pagination || options.pagination\n );\n setAlerts(result.alerts);\n setTotal(result.total);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch alerts');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n [client, options.filters, options.pagination]\n );\n\n const updateStatus = useCallback(\n async (alertId: string, status: AlertStatus) => {\n try {\n await client.updateAlertStatus(alertId, status);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId ? { ...alert, status } : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update status');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const assignAlert = useCallback(\n async (alertId: string, assignedTo: string) => {\n try {\n await client.assignAlert(alertId, assignedTo);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId ? { ...alert, assigned_to: assignedTo, status: 'under_review' } : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to assign alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const resolveAlert = useCallback(\n async (alertId: string, resolution: string, notes?: string) => {\n try {\n await client.resolveAlert(alertId, resolution, notes);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId\n ? { ...alert, status: 'resolved', resolution, notes }\n : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to resolve alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const dismissAlert = useCallback(\n async (alertId: string, notes?: string) => {\n try {\n await client.dismissAlert(alertId, notes);\n // Update local state\n setAlerts((prev) =>\n prev.map((alert) =>\n alert.id === alertId\n ? { ...alert, status: 'false_positive', resolution: 'false_positive', notes }\n : alert\n )\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to dismiss alert');\n setError(error);\n throw error;\n }\n },\n [client]\n );\n\n const refresh = useCallback(async () => {\n await fetchAlerts();\n }, [fetchAlerts]);\n\n // Auto-fetch on mount if enabled\n useEffect(() => {\n if (options.autoFetch) {\n fetchAlerts();\n }\n }, [options.autoFetch, fetchAlerts]);\n\n // Set up polling if enabled\n useEffect(() => {\n if (options.pollInterval && options.pollInterval > 0) {\n pollIntervalRef.current = setInterval(() => {\n fetchAlerts();\n }, options.pollInterval);\n\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current);\n }\n };\n }\n return undefined;\n }, [options.pollInterval, fetchAlerts]);\n\n return {\n alerts,\n total,\n loading,\n error,\n fetchAlerts,\n updateStatus,\n assignAlert,\n resolveAlert,\n dismissAlert,\n refresh,\n };\n}\n\n// ============================================================================\n// useDashboardMetrics Hook\n// ============================================================================\n\n/**\n * React hook for dashboard metrics\n *\n * @param client - GeolocationClient instance\n * @param timeRangeHours - Time range in hours (default: 24)\n * @param autoFetch - Auto-fetch metrics on mount (default: true)\n * @returns Dashboard metrics state\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { metrics, loading, refresh } = useDashboardMetrics(client, 168); // Last 7 days\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * <h2>Dashboard</h2>\n * <MetricCard label=\"Total Alerts\" value={metrics.total_alerts} />\n * <MetricCard label=\"Critical\" value={metrics.critical_alerts} />\n * <MetricCard label=\"Active\" value={metrics.active_alerts} />\n * </div>\n * );\n * }\n * ```\n */\nexport function useDashboardMetrics(\n client: GeolocationClient,\n timeRangeHours: number = 24,\n autoFetch: boolean = true\n) {\n const [metrics, setMetrics] = useState<DashboardMetrics | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchMetrics = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.getDashboardMetrics(timeRangeHours);\n setMetrics(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to fetch metrics');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, [client, timeRangeHours]);\n\n useEffect(() => {\n if (autoFetch) {\n fetchMetrics();\n }\n }, [autoFetch, fetchMetrics]);\n\n return {\n metrics,\n loading,\n error,\n refresh: fetchMetrics,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a unique device ID\n */\nfunction generateDeviceId(): string {\n return `device_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n\n/**\n * Get browser information\n */\nexport function getBrowserInfo(): {\n browser?: string;\n browser_version?: string;\n os?: string;\n} {\n if (typeof window === 'undefined') return {};\n\n const userAgent = navigator.userAgent;\n let browser: string | undefined;\n let browserVersion: string | undefined;\n let os: string | undefined;\n\n // Detect browser\n if (userAgent.indexOf('Firefox') > -1) {\n browser = 'Firefox';\n browserVersion = userAgent.match(/Firefox\\/([0-9.]+)/)?.[1];\n } else if (userAgent.indexOf('Chrome') > -1) {\n browser = 'Chrome';\n browserVersion = userAgent.match(/Chrome\\/([0-9.]+)/)?.[1];\n } else if (userAgent.indexOf('Safari') > -1) {\n browser = 'Safari';\n browserVersion = userAgent.match(/Version\\/([0-9.]+)/)?.[1];\n } else if (userAgent.indexOf('Edge') > -1) {\n browser = 'Edge';\n browserVersion = userAgent.match(/Edge\\/([0-9.]+)/)?.[1];\n }\n\n // Detect OS\n if (userAgent.indexOf('Win') > -1) os = 'Windows';\n else if (userAgent.indexOf('Mac') > -1) os = 'macOS';\n else if (userAgent.indexOf('Linux') > -1) os = 'Linux';\n else if (userAgent.indexOf('Android') > -1) os = 'Android';\n else if (userAgent.indexOf('iOS') > -1) os = 'iOS';\n\n return {\n browser,\n browser_version: browserVersion,\n os,\n };\n}\n\n/**\n * Create a complete device fingerprint for the current browser\n */\nexport function createDeviceFingerprint(): DeviceFingerprintRequest {\n const browserInfo = getBrowserInfo();\n const deviceId = localStorage.getItem('device_id') || generateDeviceId();\n\n if (!localStorage.getItem('device_id')) {\n localStorage.setItem('device_id', deviceId);\n }\n\n return {\n device_id: deviceId,\n user_agent: navigator.userAgent,\n platform: navigator.platform,\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n ...browserInfo,\n };\n}\n","/**\n * RiskProfileClient - Customer Risk Profile Management\n *\n * Provides methods to create, retrieve, and manage customer risk profiles\n * in the CGS Compliance Platform.\n */\n\nimport { BaseClient } from '../core/client';\nimport type { BaseClientConfig } from '../core/config';\nimport type {\n CustomerProfile,\n CreateProfileRequest,\n UpdateProfileRequest,\n ProfileDetailsResponse,\n ProfileFilters,\n ProfileListResponse,\n RiskDashboardMetrics,\n RiskConfiguration,\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): Promise<CustomerProfile> {\n return this.request<CustomerProfile>('/api/v1/profiles', {\n method: 'POST',\n body: JSON.stringify(request),\n });\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 * console.log('Risk score:', profile.risk_score);\n * ```\n */\n async getProfile(customerId: string): Promise<CustomerProfile> {\n const response = await this.queryProfiles({\n search: customerId,\n page: 1,\n page_size: 1,\n });\n\n if (response.data.length === 0) {\n throw new Error(`Profile not found for customer ID: ${customerId}`);\n }\n\n return response.data[0];\n }\n\n /**\n * Get profile by UUID\n *\n * @param profileId - Profile UUID\n * @returns Customer profile\n */\n async getProfileById(profileId: string): Promise<CustomerProfile> {\n // Note: The dashboard endpoint provides detailed profile view\n const details = await this.getProfileDetails(profileId);\n return details.profile;\n }\n\n /**\n * Get detailed profile information including risk factors and history\n *\n * @param profileId - Profile UUID\n * @returns Detailed profile response with risk factors and history\n *\n * @example\n * ```typescript\n * const details = await client.getProfileDetails(profileId);\n * console.log('Risk factors:', details.risk_factors);\n * console.log('Risk history:', details.risk_history);\n * console.log('Alert counts:', {\n * watchlist: details.watchlist_alert_count,\n * fraud: details.fraud_alert_count,\n * geo: details.geolocation_alert_count\n * });\n * ```\n */\n async getProfileDetails(profileId: string): Promise<ProfileDetailsResponse> {\n return this.request<ProfileDetailsResponse>(\n `/api/v1/risk-dashboard/profiles/${profileId}`\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 ): Promise<CustomerProfile> {\n return this.request<CustomerProfile>(`/api/v1/profiles/${profileId}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n });\n }\n\n /**\n * Manually recalculate risk score for a profile\n *\n * Triggers immediate risk score recalculation based on current risk factors.\n *\n * @param profileId - Profile UUID\n * @param reason - Optional reason for recalculation\n *\n * @example\n * ```typescript\n * await client.recalculateRiskScore(profileId, 'Manual review completed');\n * ```\n */\n async recalculateRiskScore(profileId: string, reason?: string): Promise<void> {\n const body = reason ? JSON.stringify({ reason }) : undefined;\n await this.request(`/api/v1/profiles/recalculate/${profileId}`, {\n method: 'POST',\n body,\n });\n }\n\n // ============================================================================\n // Query & Search\n // ============================================================================\n\n /**\n * Query profiles with advanced filters\n *\n * @param filters - Filter criteria and pagination\n * @returns Paginated list of profiles\n *\n * @example\n * ```typescript\n * const results = await client.queryProfiles({\n * risk_category: ['high', 'critical'],\n * kyc_status: ['pending'],\n * is_pep: true,\n * page: 1,\n * page_size: 20,\n * sort_by: 'risk_score',\n * sort_order: 'desc'\n * });\n *\n * console.log(`Found ${results.total} high-risk profiles`);\n * results.data.forEach(profile => {\n * console.log(`${profile.full_name}: ${profile.risk_score}`);\n * });\n * ```\n */\n async queryProfiles(filters: ProfileFilters = {}): 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 );\n }\n\n /**\n * Search profiles by text (searches name, email, customer_id, account_number)\n *\n * @param searchText - Text to search for\n * @param limit - Maximum results to return (default: 10)\n * @returns Array of matching profiles\n */\n async searchProfiles(searchText: string, limit: number = 10): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n search: searchText,\n page: 1,\n page_size: limit,\n });\n return response.data;\n }\n\n /**\n * Get all high-risk profiles (high + critical)\n *\n * @param limit - Maximum results to return (default: 50)\n * @returns Array of high-risk profiles\n */\n async getHighRiskProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n risk_category: ['high', 'critical'],\n page: 1,\n page_size: limit,\n sort_by: 'risk_score',\n sort_order: 'desc',\n });\n return response.data;\n }\n\n /**\n * Get profiles requiring PEP review\n *\n * @param limit - Maximum results to return (default: 50)\n * @returns Array of PEP profiles\n */\n async getPEPProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n is_pep: true,\n page: 1,\n page_size: limit,\n });\n return response.data;\n }\n\n /**\n * Get profiles with sanctions matches\n *\n * @param limit - Maximum results to return (default: 50)\n * @returns Array of sanctioned profiles\n */\n async getSanctionedProfiles(limit: number = 50): Promise<CustomerProfile[]> {\n const response = await this.queryProfiles({\n has_sanctions: true,\n page: 1,\n page_size: limit,\n });\n return response.data;\n }\n\n // ============================================================================\n // Dashboard & Metrics\n // ============================================================================\n\n /**\n * Get risk dashboard metrics and statistics\n *\n * @param startDate - Optional start date for metrics (ISO format)\n * @param endDate - Optional end date for metrics (ISO format)\n * @returns Dashboard metrics\n *\n * @example\n * ```typescript\n * const metrics = await client.getDashboardMetrics();\n * console.log('Total risky profiles:', metrics.total_risky_profiles);\n * console.log('Critical profiles:', metrics.total_critical_profiles);\n * console.log('Average risk score:', metrics.average_risk_score);\n *\n * metrics.risk_distribution.forEach(item => {\n * console.log(`${item.category}: ${item.count} (${item.percentage}%)`);\n * });\n * ```\n */\n async getDashboardMetrics(\n startDate?: string,\n endDate?: string\n ): Promise<RiskDashboardMetrics> {\n const params: Record<string, string> = {};\n if (startDate) params.start_date = startDate;\n if (endDate) params.end_date = endDate;\n\n const queryString = this.buildQueryString(params);\n return this.request<RiskDashboardMetrics>(\n `/api/v1/risk-dashboard/metrics${queryString}`\n );\n }\n\n // ============================================================================\n // Bulk Operations\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 ): Promise<CustomerProfile> {\n try {\n return await this.getProfile(customerId);\n } catch (error) {\n // Profile doesn't exist, create it\n return await this.createProfile(createRequest);\n }\n }\n\n /**\n * Batch get profiles by customer IDs\n *\n * @param customerIds - Array of customer IDs\n * @returns Array of profiles (may be less than input if some not found)\n */\n async batchGetProfiles(customerIds: string[]): Promise<CustomerProfile[]> {\n // Note: Current API doesn't have batch endpoint, so we query with search\n // In production, this should use a dedicated batch endpoint\n const profiles: CustomerProfile[] = [];\n\n for (const customerId of customerIds) {\n try {\n const profile = await this.getProfile(customerId);\n profiles.push(profile);\n } catch (error) {\n // Profile not found, skip\n if (this.config.debug) {\n console.warn(`[RiskProfileClient] Profile not found for: ${customerId}`);\n }\n }\n }\n\n return profiles;\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Get risk configuration for tenant\n *\n * Returns the risk scoring weights and thresholds configured for the tenant.\n *\n * @returns Risk configuration\n */\n async getRiskConfiguration(): Promise<RiskConfiguration> {\n return this.request<RiskConfiguration>('/api/v1/risk-config');\n }\n\n /**\n * Update risk configuration for tenant\n *\n * Updates risk scoring weights and/or thresholds.\n *\n * @param config - Configuration updates\n * @returns Updated risk configuration\n */\n async updateRiskConfiguration(\n config: Partial<RiskConfiguration>\n ): Promise<RiskConfiguration> {\n return this.request<RiskConfiguration>('/api/v1/risk-config', {\n method: 'PUT',\n body: JSON.stringify(config),\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;\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 * 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, RequiredCGSConfig } from '../core/config';\nimport { ComplianceError } from '../core/errors';\nimport type { JurisdictionConfig } 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} from './types';\nimport { DEFAULT_CURRENCY_RATES } from './types';\n\nexport class ComplianceClient {\n private geoClient: GeolocationClient;\n private riskClient: RiskProfileClient;\n private config: RequiredCGSConfig;\n private currencyRates: CurrencyRates;\n\n constructor(config: CGSConfig) {\n this.config = {\n apiGatewayURL: config.apiGatewayURL,\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 };\n\n // All clients use the API Gateway URL\n // The gateway routes to the appropriate backend service\n this.geoClient = new GeolocationClient({\n baseURL: this.config.apiGatewayURL,\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 });\n\n this.riskClient = new RiskProfileClient({\n baseURL: this.config.apiGatewayURL,\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 });\n\n this.currencyRates = DEFAULT_CURRENCY_RATES;\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 * @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 ): Promise<RegistrationVerificationResponse> {\n const startTime = Date.now();\n\n try {\n // Step 1: Verify geolocation\n if (this.config.debug) {\n console.log('[ComplianceSDK] Starting registration verification for:', request.customerId);\n }\n\n const 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 });\n\n // Step 2: Create customer risk profile\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 });\n\n // Step 3: Determine if registration should be allowed\n const isAllowed = geoVerification.is_compliant && !geoVerification.is_blocked;\n const requiresKYC = geoVerification.jurisdiction?.require_kyc || false;\n const requiresEDD = geoVerification.jurisdiction?.require_enhanced_verification || false;\n\n if (this.config.debug) {\n console.log('[ComplianceSDK] Registration verification complete:', {\n allowed: isAllowed,\n riskScore: geoVerification.risk_score,\n profileId: profile.id,\n });\n }\n\n return {\n allowed: isAllowed,\n geolocation: geoVerification,\n profile: profile,\n requiresKYC: requiresKYC,\n requiresEDD: requiresEDD,\n blockReasons: !isAllowed ? geoVerification.risk_reasons : [],\n processingTime: Date.now() - startTime,\n };\n } catch (error) {\n if (this.config.debug) {\n console.error('[ComplianceSDK] Registration verification failed:', error);\n }\n throw new ComplianceError('Registration verification failed', error);\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 ): Promise<LoginVerificationResponse> {\n const startTime = Date.now();\n\n try {\n if (this.config.debug) {\n console.log('[ComplianceSDK] Starting login verification for:', request.customerId);\n }\n\n // Step 1: Verify geolocation\n const geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'login',\n device_fingerprint: request.deviceFingerprint,\n });\n\n // Step 2: Get or create profile\n let profile: CustomerProfile;\n try {\n profile = await this.riskClient.getProfile(request.customerId);\n\n // Update last activity and location\n if (this.shouldUpdateProfile(profile, geoVerification.location.city)) {\n 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 });\n\n // Refresh profile\n profile = await this.riskClient.getProfile(request.customerId);\n }\n } catch (error) {\n // Profile doesn't exist - this shouldn't happen for login\n if (this.config.autoCreateProfiles && this.config.debug) {\n console.warn('[ComplianceSDK] 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 ): Promise<TransactionVerificationResponse> {\n const startTime = Date.now();\n\n try {\n if (this.config.debug) {\n console.log('[ComplianceSDK] Starting transaction verification:', {\n customerId: request.customerId,\n amount: request.amount,\n currency: request.currency,\n });\n }\n\n // Step 1: Verify geolocation\n const geoVerification = await this.geoClient.verifyIP({\n ip_address: request.ipAddress,\n user_id: request.customerId,\n event_type: 'transaction',\n device_fingerprint: request.deviceFingerprint,\n });\n\n // Step 2: Get profile\n const profile = await this.riskClient.getProfile(request.customerId);\n\n // Step 3: 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): Promise<EventVerificationResponse> {\n const startTime = Date.now();\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 });\n\n // Optionally update profile activity\n if (this.config.autoCreateProfiles) {\n try {\n const profile = await this.riskClient.getProfile(request.customerId);\n await this.riskClient.updateProfile(profile.id, {\n last_recorded_activity: new Date().toISOString(),\n });\n } catch (error) {\n // Profile doesn't exist, ignore or create based on config\n if (this.config.debug) {\n console.warn('[ComplianceSDK] 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: any\n ): Promise<CustomerProfile> {\n return this.riskClient.createProfile({\n customer_id: customerId,\n entity_type: 'individual',\n customer_status: 'active',\n email_address: `${customerId}@placeholder.local`, // Temporary email\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: any,\n profile: CustomerProfile\n ): TransactionRiskResult {\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: any, 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: any,\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 // Configuration\n // ============================================================================\n\n /**\n * Update currency exchange rates\n *\n * @param rates - Currency to USD exchange rates\n */\n updateCurrencyRates(rates: CurrencyRates): void {\n this.currencyRates = { ...this.currencyRates, ...rates };\n }\n\n /**\n * Get underlying geolocation client\n */\n getGeolocationClient(): GeolocationClient {\n return this.geoClient;\n }\n\n /**\n * Get underlying risk profile client\n */\n getRiskProfileClient(): RiskProfileClient {\n return this.riskClient;\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<CGSConfig>): void {\n this.config = { ...this.config, ...config };\n this.geoClient.updateConfig(config as any);\n this.riskClient.updateConfig(config as any);\n }\n}\n"]}
|