vesant-sdk 1.6.6 → 2.0.0-dev.40d1c39
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/README.md +14 -4
- package/dist/client-BJ87_Vv5.d.ts +430 -0
- package/dist/{client-ePzhQKp9.d.mts → client-BolQlL5e.d.mts} +1 -1
- package/dist/{client-ePzhQKp9.d.ts → client-BolQlL5e.d.ts} +1 -1
- package/dist/{client-BlCxjbY2.d.mts → client-Bvp-f05-.d.ts} +7 -7
- package/dist/{client-C_A7QLcB.d.ts → client-CIEa7xYG.d.mts} +7 -7
- package/dist/client-IAOGCBfm.d.mts +430 -0
- package/dist/compliance/index.d.mts +25 -429
- package/dist/compliance/index.d.ts +25 -429
- package/dist/compliance/index.js +137 -58
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/index.mjs +137 -59
- package/dist/compliance/index.mjs.map +1 -1
- package/dist/decisions/index.d.mts +2 -2
- package/dist/decisions/index.d.ts +2 -2
- package/dist/decisions/index.js +1 -1
- package/dist/decisions/index.js.map +1 -1
- package/dist/decisions/index.mjs +1 -1
- package/dist/decisions/index.mjs.map +1 -1
- package/dist/geolocation/index.d.mts +4 -4
- package/dist/geolocation/index.d.ts +4 -4
- package/dist/geolocation/index.js +6 -24
- package/dist/geolocation/index.js.map +1 -1
- package/dist/geolocation/index.mjs +6 -24
- package/dist/geolocation/index.mjs.map +1 -1
- package/dist/index.d.mts +14 -71
- package/dist/index.d.ts +14 -71
- package/dist/index.js +190 -237
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +189 -236
- package/dist/index.mjs.map +1 -1
- package/dist/kyc/core.d.mts +4 -4
- package/dist/kyc/core.d.ts +4 -4
- package/dist/kyc/core.js +24 -13
- package/dist/kyc/core.js.map +1 -1
- package/dist/kyc/core.mjs +24 -14
- package/dist/kyc/core.mjs.map +1 -1
- package/dist/kyc/index.d.mts +20 -27
- package/dist/kyc/index.d.ts +20 -27
- package/dist/kyc/index.js +24 -13
- package/dist/kyc/index.js.map +1 -1
- package/dist/kyc/index.mjs +24 -14
- package/dist/kyc/index.mjs.map +1 -1
- package/dist/react.d.mts +6 -6
- package/dist/react.d.ts +6 -6
- package/dist/react.js +18 -5
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +18 -5
- package/dist/react.mjs.map +1 -1
- package/dist/risk-profile/index.d.mts +4 -4
- package/dist/risk-profile/index.d.ts +4 -4
- package/dist/risk-profile/index.js +1 -1
- package/dist/risk-profile/index.js.map +1 -1
- package/dist/risk-profile/index.mjs +1 -1
- package/dist/risk-profile/index.mjs.map +1 -1
- package/dist/scores/index.d.mts +2 -2
- package/dist/scores/index.d.ts +2 -2
- package/dist/scores/index.js +1 -1
- package/dist/scores/index.js.map +1 -1
- package/dist/scores/index.mjs +1 -1
- package/dist/scores/index.mjs.map +1 -1
- package/dist/tax/index.d.mts +6 -41
- package/dist/tax/index.d.ts +6 -41
- package/dist/tax/index.js +1 -36
- package/dist/tax/index.js.map +1 -1
- package/dist/tax/index.mjs +1 -36
- package/dist/tax/index.mjs.map +1 -1
- package/dist/{types-X5Md_dD_.d.ts → types-2utj53GK.d.ts} +2 -2
- package/dist/{types-1RzYeSal.d.mts → types-C4Zx0d_u.d.mts} +2 -2
- package/dist/{types-B4Ezqo7V.d.mts → types-QUCWam16.d.mts} +7 -1
- package/dist/{types-B4Ezqo7V.d.ts → types-QUCWam16.d.ts} +7 -1
- package/dist/webhooks/index.d.mts +181 -2
- package/dist/webhooks/index.d.ts +181 -2
- package/dist/webhooks/index.js +49 -7
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/index.mjs +49 -7
- package/dist/webhooks/index.mjs.map +1 -1
- package/package.json +16 -13
- package/dist/fraud/index.d.mts +0 -80
- package/dist/fraud/index.d.ts +0 -80
- package/dist/fraud/index.js +0 -606
- package/dist/fraud/index.js.map +0 -1
- package/dist/fraud/index.mjs +0 -604
- package/dist/fraud/index.mjs.map +0 -1
- package/dist/index-B04H4xfJ.d.mts +0 -320
- package/dist/index-CItMPmLL.d.ts +0 -320
package/dist/tax/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/errors.ts","../../src/core/circuit-breaker.ts","../../src/core/rate-limiter.ts","../../src/core/logger.ts","../../src/core/version.ts","../../src/shared/browser-utils.ts","../../src/core/client.ts","../../src/tax/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Error hierarchy for Vesant SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class VesantError extends Error {\n public requestId?: string;\n\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'VesantError';\n Object.setPrototypeOf(this, VesantError.prototype);\n }\n}\n\n/** @deprecated Use VesantError instead */\nexport const CGSError = VesantError;\n/** @deprecated Use VesantError instead */\nexport type CGSError = VesantError;\n\nexport class NetworkError extends VesantError {\n constructor(message: string, public originalError?: unknown) {\n super(message, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\nexport class ValidationError extends VesantError {\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 VesantError {\n constructor(message: string = 'Service unavailable') {\n super(message, 'SERVICE_UNAVAILABLE', 503);\n this.name = 'ServiceUnavailableError';\n Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n }\n}\n\nexport class ComplianceBlockedError extends VesantError {\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 VesantError {\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 VesantError {\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 VesantError {\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 VesantError {\n constructor(\n message: string,\n public originalError?: unknown,\n code: string = 'COMPLIANCE_ERROR'\n ) {\n super(message, code);\n this.name = 'ComplianceError';\n Object.setPrototypeOf(this, ComplianceError.prototype);\n }\n}\n\nexport class CircuitBreakerOpenError extends VesantError {\n constructor() {\n super('Circuit breaker is open — requests are temporarily blocked', 'CIRCUIT_BREAKER_OPEN', 503);\n this.name = 'CircuitBreakerOpenError';\n Object.setPrototypeOf(this, CircuitBreakerOpenError.prototype);\n }\n}\n","/**\n * Circuit breaker pattern for resilient HTTP requests.\n *\n * States: closed (normal) -> open (failing) -> half-open (testing) -> closed\n */\n\nexport type CircuitBreakerState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n /** Number of consecutive failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms to wait before transitioning from open to half-open (default: 30000) */\n resetTimeout?: number;\n /** Number of successes in half-open state before closing (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreakerStatus {\n state: CircuitBreakerState;\n failures: number;\n successes: number;\n lastFailureTime: number | null;\n nextRetryTime: number | null;\n}\n\nexport class CircuitBreaker {\n private state: CircuitBreakerState = 'closed';\n private failures = 0;\n private successes = 0;\n private lastFailureTime: number | null = null;\n\n private readonly failureThreshold: number;\n private readonly resetTimeout: number;\n private readonly successThreshold: number;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.failureThreshold = config.failureThreshold ?? 5;\n this.resetTimeout = config.resetTimeout ?? 30000;\n this.successThreshold = config.successThreshold ?? 1;\n }\n\n /**\n * Check if a request can proceed through the circuit breaker.\n */\n canExecute(): boolean {\n if (this.state === 'closed') {\n return true;\n }\n\n if (this.state === 'open') {\n const now = Date.now();\n if (this.lastFailureTime && now - this.lastFailureTime >= this.resetTimeout) {\n this.state = 'half-open';\n this.successes = 0;\n return true;\n }\n return false;\n }\n\n // half-open: allow requests through for testing\n return true;\n }\n\n /**\n * Record a successful request.\n */\n onSuccess(): void {\n if (this.state === 'half-open') {\n this.successes++;\n if (this.successes >= this.successThreshold) {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n } else if (this.state === 'closed') {\n this.failures = 0;\n }\n }\n\n /**\n * Record a failed request.\n */\n onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.state === 'half-open') {\n this.state = 'open';\n this.successes = 0;\n } else if (this.state === 'closed' && this.failures >= this.failureThreshold) {\n this.state = 'open';\n }\n }\n\n /**\n * Get current circuit breaker status.\n */\n getStatus(): CircuitBreakerStatus {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n nextRetryTime:\n this.state === 'open' && this.lastFailureTime\n ? this.lastFailureTime + this.resetTimeout\n : null,\n };\n }\n\n /**\n * Reset the circuit breaker to its initial closed state.\n */\n reset(): void {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n}\n","/**\n * Rate limit tracking from API response headers.\n *\n * Tracks X-RateLimit-* headers to enable pre-flight checks\n * before making requests.\n */\n\nexport interface RateLimitStatus {\n /** Maximum requests allowed in the window */\n limit: number | null;\n /** Remaining requests in the current window */\n remaining: number | null;\n /** Unix timestamp (seconds) when the rate limit resets */\n reset: number | null;\n /** Seconds until the rate limit resets */\n retryAfter: number | null;\n}\n\nexport class RateLimitTracker {\n private limit: number | null = null;\n private remaining: number | null = null;\n private reset: number | null = null;\n private retryAfter: number | null = null;\n\n /**\n * Extract rate limit information from response headers.\n */\n updateFromHeaders(headers: Headers): void {\n const limit = headers.get('x-ratelimit-limit');\n const remaining = headers.get('x-ratelimit-remaining');\n const reset = headers.get('x-ratelimit-reset');\n const retryAfter = headers.get('retry-after');\n\n if (limit !== null) this.limit = parseInt(limit, 10);\n if (remaining !== null) this.remaining = parseInt(remaining, 10);\n if (reset !== null) this.reset = parseInt(reset, 10);\n if (retryAfter !== null) this.retryAfter = parseInt(retryAfter, 10);\n }\n\n /**\n * Check if the rate limit has been exceeded based on tracked headers.\n */\n isLimitExceeded(): boolean {\n if (this.remaining !== null && this.remaining <= 0) {\n // Check if the reset time has passed\n if (this.reset !== null) {\n const now = Math.floor(Date.now() / 1000);\n if (now >= this.reset) {\n // Reset window has passed, allow requests\n this.remaining = null;\n this.reset = null;\n this.retryAfter = null;\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n /**\n * Get current rate limit status.\n */\n getStatus(): RateLimitStatus {\n return {\n limit: this.limit,\n remaining: this.remaining,\n reset: this.reset,\n retryAfter: this.retryAfter,\n };\n }\n}\n","import type { Logger } from './config';\n\nexport function createConsoleLogger(): Logger {\n return {\n debug(message: string, meta?: Record<string, unknown>) {\n console.log(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n info(message: string, meta?: Record<string, unknown>) {\n console.info(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n error(message: string, meta?: Record<string, unknown>) {\n console.error(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n };\n}\n\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '1.6.6';\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return generateUUID();\n }\n\n const storageKey = 'vesant_device_id';\n let deviceId = localStorage.getItem(storageKey);\n\n if (!deviceId) {\n deviceId = generateUUID();\n localStorage.setItem(storageKey, deviceId);\n }\n\n return deviceId;\n}\n\n/**\n * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n browser: string;\n browser_version: string;\n os: string;\n os_version: string;\n} {\n if (typeof navigator === 'undefined') {\n return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n }\n\n const ua = navigator.userAgent;\n let browser = 'unknown';\n let browserVersion = '';\n let os = 'unknown';\n let osVersion = '';\n\n // Detect browser\n if (ua.includes('Firefox/')) {\n browser = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Edg/')) {\n browser = 'Edge';\n browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Chrome/')) {\n browser = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n browser = 'Safari';\n browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n browser = 'Opera';\n browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n }\n\n // Detect OS\n if (ua.includes('Windows')) {\n os = 'Windows';\n if (ua.includes('Windows NT 10.0')) osVersion = '10';\n else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n } else if (ua.includes('Mac OS X')) {\n os = 'macOS';\n osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n } else if (ua.includes('Linux')) {\n os = 'Linux';\n } else if (ua.includes('Android')) {\n os = 'Android';\n osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n os = 'iOS';\n osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n }\n\n return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n","/**\n * Base HTTP client for all Vesant SDK clients\n *\n * Provides common functionality:\n * - Request/response handling\n * - Error handling\n * - Retry logic with exponential backoff\n * - Timeout management\n * - Debug logging\n */\n\nimport type { BaseClientConfig, Logger, RequestInterceptor, RequestOptions } from './config';\nimport {\n VesantError,\n NetworkError,\n TimeoutError,\n AuthenticationError,\n RateLimitError,\n ServiceUnavailableError,\n ValidationError,\n CircuitBreakerOpenError,\n} from './errors';\nimport { CircuitBreaker, type CircuitBreakerStatus } from './circuit-breaker';\nimport { RateLimitTracker, type RateLimitStatus } from './rate-limiter';\nimport { createConsoleLogger } from './logger';\nimport { SDK_VERSION } from './version';\nimport { generateUUID } from '../shared/browser-utils';\n\nexport abstract class BaseClient {\n protected config: BaseClientConfig & { timeout: number; retries: number };\n protected logger: Logger;\n private interceptors: RequestInterceptor[];\n private circuitBreaker: CircuitBreaker | null = null;\n private rateLimitTracker: RateLimitTracker | null = null;\n\n constructor(config: BaseClientConfig) {\n if (!config.baseURL?.trim()) {\n throw new ValidationError('baseURL is required and must be a non-empty string', ['baseURL']);\n }\n if (!config.tenantId?.trim()) {\n throw new ValidationError('tenantId is required and must be a non-empty string', ['tenantId']);\n }\n\n this.interceptors = config.interceptors || [];\n this.logger = config.logger || createConsoleLogger();\n\n // Auto-detect environment from API key prefix\n let environment = config.environment;\n const apiKey = config.apiKey || '';\n if (apiKey.startsWith('pk_test_')) {\n if (environment === 'production') {\n this.logger.warn('Sandbox API key (pk_test_*) used with environment: \"production\" — overriding to \"sandbox\"');\n }\n environment = 'sandbox';\n } else if (apiKey.startsWith('pk_live_') && environment === 'sandbox') {\n this.logger.warn('Production API key (pk_live_*) used with environment: \"sandbox\" — sandbox isolation will still be applied for backward compatibility');\n }\n\n this.config = {\n ...config,\n apiKey,\n environment,\n headers: config.headers || {},\n timeout: config.timeout || 10000,\n retries: config.retries || 3,\n debug: config.debug || false,\n interceptors: this.interceptors,\n logger: this.logger,\n };\n\n if (config.circuitBreaker) {\n this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n }\n if (config.enableRateLimitTracking) {\n this.rateLimitTracker = new RateLimitTracker();\n }\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n protected async request<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n requestOptions?: RequestOptions\n ): Promise<T> {\n const requestId = generateUUID();\n\n // Circuit breaker check\n if (this.circuitBreaker && !this.circuitBreaker.canExecute()) {\n const error = new CircuitBreakerOpenError();\n error.requestId = requestId;\n throw error;\n }\n\n // Rate limit pre-check\n if (this.rateLimitTracker && this.rateLimitTracker.isLimitExceeded()) {\n const status = this.rateLimitTracker.getStatus();\n const error = new RateLimitError(status.retryAfter ?? undefined);\n error.requestId = requestId;\n throw error;\n }\n\n const url = `${serviceURL || this.config.baseURL}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Tenant-ID': this.config.tenantId,\n 'X-SDK-Version': `vesant-sdk-ts/${SDK_VERSION}`,\n 'X-Request-ID': requestId,\n ...this.config.headers,\n ...((options.headers as Record<string, string>) || {}),\n };\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Sandbox header\n if (this.config.environment === 'sandbox') {\n headers['X-Sandbox'] = 'true';\n }\n\n // Idempotency key for mutating methods\n const method = (options.method || 'GET').toUpperCase();\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n headers['Idempotency-Key'] = requestOptions?.idempotencyKey || generateUUID();\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n // Link consumer AbortSignal to internal controller\n if (requestOptions?.signal) {\n if (requestOptions.signal.aborted) {\n controller.abort();\n } else {\n requestOptions.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n }\n\n try {\n // Run onRequest interceptors\n let finalOptions: RequestInit = { ...options, headers };\n for (const interceptor of this.interceptors) {\n if (interceptor.onRequest) {\n finalOptions = await interceptor.onRequest(url, finalOptions);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug(`${finalOptions.method || 'GET'} ${endpoint}`);\n }\n\n const response = await fetch(url, {\n ...finalOptions,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Track rate limit headers\n if (this.rateLimitTracker) {\n this.rateLimitTracker.updateFromHeaders(response.headers);\n }\n\n // Binary download path\n if (requestOptions?.responseType === 'arraybuffer') {\n if (!response.ok) {\n let errData: Record<string, unknown> = {};\n try { errData = await response.json(); } catch { /* ignore */ }\n this.handleErrorResponse(response.status, errData, requestId);\n }\n this.circuitBreaker?.onSuccess();\n const buffer = await response.arrayBuffer();\n return buffer as unknown as T;\n }\n\n let data: Record<string, unknown> | undefined;\n try {\n data = await response.json();\n } catch {\n // Non-JSON response (HTML error pages, 204 No Content, etc.)\n if (!response.ok) {\n this.handleErrorResponse(response.status, {\n error: `HTTP ${response.status}`,\n message: response.statusText,\n }, requestId);\n }\n // OK response but no JSON body (e.g., 204)\n this.circuitBreaker?.onSuccess();\n return undefined as unknown as T;\n }\n\n if (!response.ok) {\n this.handleErrorResponse(response.status, data || {}, requestId);\n }\n\n // Record success for circuit breaker\n this.circuitBreaker?.onSuccess();\n\n // Run onResponse interceptors\n let result: unknown = data;\n for (const interceptor of this.interceptors) {\n if (interceptor.onResponse) {\n result = await interceptor.onResponse(url, result);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug(`Response: ${response.status}`);\n }\n\n return result as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Record failure for circuit breaker (skip for client errors)\n if (\n error instanceof VesantError &&\n error.statusCode &&\n error.statusCode >= 500\n ) {\n this.circuitBreaker?.onFailure();\n } else if (error instanceof NetworkError || error instanceof TimeoutError) {\n this.circuitBreaker?.onFailure();\n }\n\n // Attach requestId to VesantError instances\n if (error instanceof VesantError && !error.requestId) {\n error.requestId = requestId;\n }\n\n // Run onError interceptors\n if (error instanceof Error) {\n for (const interceptor of this.interceptors) {\n if (interceptor.onError) {\n await interceptor.onError(url, error);\n }\n }\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n // Distinguish consumer abort from timeout\n if (requestOptions?.signal?.aborted) {\n const abortError = new VesantError('Request aborted', 'REQUEST_ABORTED');\n abortError.requestId = requestId;\n throw abortError;\n }\n this.circuitBreaker?.onFailure();\n const timeoutError = new TimeoutError(this.config.timeout);\n timeoutError.requestId = requestId;\n throw timeoutError;\n }\n if (error instanceof VesantError) {\n throw error;\n }\n }\n\n const networkError = new NetworkError('Network request failed', error);\n networkError.requestId = requestId;\n this.circuitBreaker?.onFailure();\n throw networkError;\n }\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n protected async requestWithRetry<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n retries: number = this.config.retries,\n requestOptions?: RequestOptions\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await this.request<T>(endpoint, options, serviceURL, requestOptions);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error');\n\n // Don't retry on consumer abort\n if (requestOptions?.signal?.aborted) {\n throw lastError;\n }\n\n // Don't retry on client errors (4xx), except 429 (rate limit)\n if (\n lastError instanceof VesantError &&\n lastError.statusCode &&\n lastError.statusCode >= 400 &&\n lastError.statusCode < 500 &&\n lastError.statusCode !== 429\n ) {\n throw lastError;\n }\n\n // Don't retry on last attempt\n if (attempt === retries) {\n break;\n }\n\n // Use Retry-After for 429, otherwise exponential backoff with jitter\n let delay: number;\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n delay = lastError.retryAfter * 1000;\n } else {\n delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n if (this.config.debug) {\n this.logger.debug(`Retry attempt ${attempt + 1}/${retries} after ${delay.toFixed(0)}ms`);\n }\n }\n }\n\n throw new NetworkError(`Request failed after ${retries} retries`, lastError);\n }\n\n /**\n * Handle error responses from API\n */\n protected handleErrorResponse(status: number, data: Record<string, unknown>, requestId?: string): never {\n const message = (data.error as string) || (data.message as string) || `HTTP ${status}`;\n\n const createError = (): VesantError => {\n switch (status) {\n case 400:\n return new VesantError(message, 'BAD_REQUEST', 400);\n case 401:\n return new AuthenticationError(message);\n case 403:\n return new VesantError(message, 'FORBIDDEN', 403);\n case 404:\n return new VesantError(message, 'NOT_FOUND', 404);\n case 409:\n return new VesantError(message, 'DUPLICATE_PROFILE', 409);\n case 429: {\n const retryAfter = (data.retry_after as number | undefined) || (data.retryAfter as number | undefined);\n return new RateLimitError(retryAfter);\n }\n case 500:\n case 502:\n case 503:\n case 504:\n return new ServiceUnavailableError(message);\n default:\n return new VesantError(message, 'UNKNOWN_ERROR', status);\n }\n };\n\n const error = createError();\n if (requestId) {\n error.requestId = requestId;\n }\n throw error;\n }\n\n /**\n * Build query string from parameters\n */\n protected buildQueryString(params: Record<string, unknown>): string {\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((item) => query.append(key, String(item)));\n } else {\n query.append(key, String(value));\n }\n }\n });\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<BaseClientConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n headers: {\n ...this.config.headers,\n ...(config.headers || {}),\n },\n };\n if (config.logger) {\n this.logger = config.logger;\n }\n if (config.interceptors) {\n this.interceptors = config.interceptors;\n }\n }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<BaseClientConfig> {\n return { ...this.config };\n }\n\n /**\n * Get rate limit status from tracked response headers.\n */\n getRateLimitStatus(): RateLimitStatus | null {\n return this.rateLimitTracker?.getStatus() ?? null;\n }\n\n /**\n * Get circuit breaker status.\n */\n getCircuitBreakerStatus(): CircuitBreakerStatus | null {\n return this.circuitBreaker?.getStatus() ?? null;\n }\n\n /**\n * Health check endpoint\n */\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n return this.request('/api/v1/health');\n }\n}\n","import { BaseClient } from '../core/client';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n TaxClientConfig,\n CustomerTaxProfileRecord,\n CustomerTaxProfileDocuments,\n ReRequestTaxFormInput,\n EnableWithholdingInput,\n EnableWithholdingResponse,\n TINCheckResult,\n TaxRules,\n UpdateTaxRulesInput,\n UpdateReminderConfigInput,\n TaxRuleVersion,\n ComplianceStats,\n ComplianceStatsFilters,\n GlobalTaxRule,\n TreatyCountry,\n TreatyCountryListResponse,\n RunRemindersResponse,\n} from './types';\n\nexport class TaxClient extends BaseClient {\n constructor(config: TaxClientConfig) {\n const baseConfig: BaseClientConfig = {\n baseURL: config.baseURL,\n tenantId: config.tenantId,\n apiKey: config.apiKey,\n headers: config.headers,\n timeout: config.timeout,\n retries: 3,\n debug: config.debug,\n environment: config.environment,\n };\n super(baseConfig);\n }\n\n // ==========================================================================\n // P1 — Customer Tax Profile (core compliance flow)\n // ==========================================================================\n\n async getCustomerTaxProfileRecord(customerID: string): Promise<CustomerTaxProfileRecord> {\n return this.request<CustomerTaxProfileRecord>(\n `/api/v1/tax/customer-tax-profiles/${customerID}`\n );\n }\n\n async requestTaxForm(customerID: string): Promise<CustomerTaxProfileRecord> {\n return this.request<CustomerTaxProfileRecord>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/request-form`,\n { method: 'POST' }\n );\n }\n\n async checkTINStatus(customerID: string): Promise<TINCheckResult> {\n return this.requestWithRetry<TINCheckResult>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/check-tin`,\n { method: 'POST' }\n );\n }\n\n async reRequestTaxForm(\n customerID: string,\n input: ReRequestTaxFormInput\n ): Promise<CustomerTaxProfileRecord> {\n return this.request<CustomerTaxProfileRecord>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/re-request-form`,\n {\n method: 'POST',\n body: JSON.stringify(input),\n }\n );\n }\n\n async enableBackupWithholding(\n customerID: string,\n input: EnableWithholdingInput\n ): Promise<EnableWithholdingResponse> {\n return this.request<EnableWithholdingResponse>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/enable-withholding`,\n {\n method: 'POST',\n body: JSON.stringify(input),\n }\n );\n }\n\n async getCustomerDocuments(customerID: string): Promise<CustomerTaxProfileDocuments> {\n return this.request<CustomerTaxProfileDocuments>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/documents`\n );\n }\n\n async downloadTaxForm(\n customerID: string,\n requestOptions?: RequestOptions\n ): Promise<ArrayBuffer> {\n return this.request<ArrayBuffer>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/download-form`,\n { method: 'GET' },\n undefined,\n { ...requestOptions, responseType: 'arraybuffer' }\n );\n }\n\n async runReminders(): Promise<RunRemindersResponse> {\n return this.request<RunRemindersResponse>('/api/v1/tax/reminders/run', {\n method: 'POST',\n });\n }\n\n /**\n * Update only the reminder configuration (frequency + max count) without\n * touching any other tax rule settings. Fetches current rules first and\n * merges the reminder fields before sending the update.\n *\n * Requires the caller to be authenticated as a Tenant Super Admin.\n * Throws VesantError with status 403 if the role requirement is not met.\n */\n async updateReminderConfig(input: UpdateReminderConfigInput): Promise<TaxRuleVersion> {\n const current = await this.getTaxRules();\n return this.updateTaxRules({\n trigger_account_creation: current.trigger_account_creation,\n trigger_first_withdrawal: current.trigger_first_withdrawal,\n trigger_threshold: current.trigger_threshold,\n trigger_manual: current.trigger_manual,\n trigger_tin_invalid: current.trigger_tin_invalid,\n trigger_w8ben_expiry: current.trigger_w8ben_expiry,\n trigger_tin_expired: current.trigger_tin_expired,\n us_withholding_enabled: current.us_withholding_enabled,\n non_us_withholding_enabled: current.non_us_withholding_enabled,\n transaction_action: current.transaction_action,\n w8ben_expiry_warning_days: current.w8ben_expiry_warning_days,\n tin_verification_due_date: current.tin_verification_due_date,\n email_sending_method: current.email_sending_method,\n display_tin_links_on_platform: current.display_tin_links_on_platform,\n tax_treaty_support: current.tax_treaty_support,\n reminder_frequency_days: input.reminder_frequency_days,\n reminder_max_count: input.reminder_max_count,\n });\n }\n\n // ==========================================================================\n // P2 — Tenant Tax Rules\n // ==========================================================================\n\n async getTaxRules(): Promise<TaxRules> {\n const res = await this.request<{ rules: TaxRules }>('/api/v1/tax/rules');\n return res.rules;\n }\n\n async updateTaxRules(input: UpdateTaxRulesInput): Promise<TaxRuleVersion> {\n const res = await this.request<{ version: TaxRuleVersion }>('/api/v1/tax/rules', {\n method: 'PUT',\n body: JSON.stringify({ rules: input }),\n });\n return res.version;\n }\n\n async getComplianceStats(filters?: ComplianceStatsFilters): Promise<ComplianceStats> {\n const params: Record<string, unknown> = {};\n if (filters?.time_range) params.time_range = filters.time_range;\n if (filters?.from_date) params.from_date = filters.from_date;\n if (filters?.to_date) params.to_date = filters.to_date;\n return this.request<ComplianceStats>(\n `/api/v1/tax/tenant/w-form-tenant-stats${this.buildQueryString(params)}`\n );\n }\n\n // ==========================================================================\n // P3 — Global Tax Rule & Treaty Countries\n // ==========================================================================\n\n async getCurrentGlobalTaxRule(): Promise<GlobalTaxRule> {\n const res = await this.request<{ success: boolean; message: string; data: GlobalTaxRule }>(\n '/api/v1/tm/tenant/global-tax-rules/current'\n );\n return res.data;\n }\n\n async listTreatyCountries(): Promise<TreatyCountryListResponse> {\n return this.request<TreatyCountryListResponse>('/api/v1/tax/treaty-countries');\n }\n\n async getTreatyCountry(code: string): Promise<TreatyCountry> {\n const res = await this.request<{ treaty_country: TreatyCountry }>(\n `/api/v1/tax/treaty-countries/${encodeURIComponent(code)}`\n );\n return res.treaty_country;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/errors.ts","../../src/core/circuit-breaker.ts","../../src/core/rate-limiter.ts","../../src/core/logger.ts","../../src/core/version.ts","../../src/shared/browser-utils.ts","../../src/core/client.ts","../../src/tax/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Error hierarchy for Vesant SDK\n *\n * Provides structured error handling with specific error types\n * for different failure scenarios.\n */\n\nexport class VesantError extends Error {\n public requestId?: string;\n\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'VesantError';\n Object.setPrototypeOf(this, VesantError.prototype);\n }\n}\n\n/** @deprecated Use VesantError instead */\nexport const CGSError = VesantError;\n/** @deprecated Use VesantError instead */\nexport type CGSError = VesantError;\n\nexport class NetworkError extends VesantError {\n constructor(message: string, public originalError?: unknown) {\n super(message, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\nexport class ValidationError extends VesantError {\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 VesantError {\n constructor(message: string = 'Service unavailable') {\n super(message, 'SERVICE_UNAVAILABLE', 503);\n this.name = 'ServiceUnavailableError';\n Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n }\n}\n\nexport class ComplianceBlockedError extends VesantError {\n constructor(reasons: import('./types').BlockReason[]) {\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 VesantError {\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 VesantError {\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 VesantError {\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 VesantError {\n constructor(\n message: string,\n public originalError?: unknown,\n code: string = 'COMPLIANCE_ERROR'\n ) {\n super(message, code);\n this.name = 'ComplianceError';\n Object.setPrototypeOf(this, ComplianceError.prototype);\n }\n}\n\nexport class CircuitBreakerOpenError extends VesantError {\n constructor() {\n super('Circuit breaker is open — requests are temporarily blocked', 'CIRCUIT_BREAKER_OPEN', 503);\n this.name = 'CircuitBreakerOpenError';\n Object.setPrototypeOf(this, CircuitBreakerOpenError.prototype);\n }\n}\n","/**\n * Circuit breaker pattern for resilient HTTP requests.\n *\n * States: closed (normal) -> open (failing) -> half-open (testing) -> closed\n */\n\nexport type CircuitBreakerState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n /** Number of consecutive failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms to wait before transitioning from open to half-open (default: 30000) */\n resetTimeout?: number;\n /** Number of successes in half-open state before closing (default: 1) */\n successThreshold?: number;\n}\n\nexport interface CircuitBreakerStatus {\n state: CircuitBreakerState;\n failures: number;\n successes: number;\n lastFailureTime: number | null;\n nextRetryTime: number | null;\n}\n\nexport class CircuitBreaker {\n private state: CircuitBreakerState = 'closed';\n private failures = 0;\n private successes = 0;\n private lastFailureTime: number | null = null;\n\n private readonly failureThreshold: number;\n private readonly resetTimeout: number;\n private readonly successThreshold: number;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.failureThreshold = config.failureThreshold ?? 5;\n this.resetTimeout = config.resetTimeout ?? 30000;\n this.successThreshold = config.successThreshold ?? 1;\n }\n\n /**\n * Check if a request can proceed through the circuit breaker.\n */\n canExecute(): boolean {\n if (this.state === 'closed') {\n return true;\n }\n\n if (this.state === 'open') {\n const now = Date.now();\n if (this.lastFailureTime && now - this.lastFailureTime >= this.resetTimeout) {\n this.state = 'half-open';\n this.successes = 0;\n return true;\n }\n return false;\n }\n\n // half-open: allow requests through for testing\n return true;\n }\n\n /**\n * Record a successful request.\n */\n onSuccess(): void {\n if (this.state === 'half-open') {\n this.successes++;\n if (this.successes >= this.successThreshold) {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n } else if (this.state === 'closed') {\n this.failures = 0;\n }\n }\n\n /**\n * Record a failed request.\n */\n onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.state === 'half-open') {\n this.state = 'open';\n this.successes = 0;\n } else if (this.state === 'closed' && this.failures >= this.failureThreshold) {\n this.state = 'open';\n }\n }\n\n /**\n * Get current circuit breaker status.\n */\n getStatus(): CircuitBreakerStatus {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n lastFailureTime: this.lastFailureTime,\n nextRetryTime:\n this.state === 'open' && this.lastFailureTime\n ? this.lastFailureTime + this.resetTimeout\n : null,\n };\n }\n\n /**\n * Reset the circuit breaker to its initial closed state.\n */\n reset(): void {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = null;\n }\n}\n","/**\n * Rate limit tracking from API response headers.\n *\n * Tracks X-RateLimit-* headers to enable pre-flight checks\n * before making requests.\n */\n\nexport interface RateLimitStatus {\n /** Maximum requests allowed in the window */\n limit: number | null;\n /** Remaining requests in the current window */\n remaining: number | null;\n /** Unix timestamp (seconds) when the rate limit resets */\n reset: number | null;\n /** Seconds until the rate limit resets */\n retryAfter: number | null;\n}\n\nexport class RateLimitTracker {\n private limit: number | null = null;\n private remaining: number | null = null;\n private reset: number | null = null;\n private retryAfter: number | null = null;\n\n /**\n * Extract rate limit information from response headers.\n */\n updateFromHeaders(headers: Headers): void {\n const limit = headers.get('x-ratelimit-limit');\n const remaining = headers.get('x-ratelimit-remaining');\n const reset = headers.get('x-ratelimit-reset');\n const retryAfter = headers.get('retry-after');\n\n if (limit !== null) this.limit = parseInt(limit, 10);\n if (remaining !== null) this.remaining = parseInt(remaining, 10);\n if (reset !== null) this.reset = parseInt(reset, 10);\n if (retryAfter !== null) this.retryAfter = parseInt(retryAfter, 10);\n }\n\n /**\n * Check if the rate limit has been exceeded based on tracked headers.\n */\n isLimitExceeded(): boolean {\n if (this.remaining !== null && this.remaining <= 0) {\n // Check if the reset time has passed\n if (this.reset !== null) {\n const now = Math.floor(Date.now() / 1000);\n if (now >= this.reset) {\n // Reset window has passed, allow requests\n this.remaining = null;\n this.reset = null;\n this.retryAfter = null;\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n /**\n * Get current rate limit status.\n */\n getStatus(): RateLimitStatus {\n return {\n limit: this.limit,\n remaining: this.remaining,\n reset: this.reset,\n retryAfter: this.retryAfter,\n };\n }\n}\n","import type { Logger } from './config';\n\nexport function createConsoleLogger(): Logger {\n return {\n debug(message: string, meta?: Record<string, unknown>) {\n console.log(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n info(message: string, meta?: Record<string, unknown>) {\n console.info(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n warn(message: string, meta?: Record<string, unknown>) {\n console.warn(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n error(message: string, meta?: Record<string, unknown>) {\n console.error(`[Vesant SDK] ${message}`, meta !== undefined ? meta : '');\n },\n };\n}\n\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","/**\n * Single source of truth for the SDK version.\n */\nexport const SDK_VERSION = '2.0.0';\n","/**\n * Shared browser utility functions.\n *\n * Extracted from ciphertext.ts and hooks.ts to avoid duplication.\n * All functions include SSR guards for safe server-side rendering.\n */\n\n/**\n * Generate a UUID v4\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Generate a unique device ID that persists across sessions.\n * Falls back to a random UUID when localStorage is unavailable (SSR).\n */\nexport function generateDeviceId(): string {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return generateUUID();\n }\n\n const storageKey = 'vesant_device_id';\n let deviceId = localStorage.getItem(storageKey);\n\n if (!deviceId) {\n deviceId = generateUUID();\n localStorage.setItem(storageKey, deviceId);\n }\n\n return deviceId;\n}\n\n/**\n * Detect browser information from user agent.\n * Returns safe defaults when running server-side.\n */\nexport function getBrowserInfo(): {\n browser: string;\n browser_version: string;\n os: string;\n os_version: string;\n} {\n if (typeof navigator === 'undefined') {\n return { browser: 'unknown', browser_version: '', os: 'unknown', os_version: '' };\n }\n\n const ua = navigator.userAgent;\n let browser = 'unknown';\n let browserVersion = '';\n let os = 'unknown';\n let osVersion = '';\n\n // Detect browser\n if (ua.includes('Firefox/')) {\n browser = 'Firefox';\n browserVersion = ua.match(/Firefox\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Edg/')) {\n browser = 'Edge';\n browserVersion = ua.match(/Edg\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Chrome/')) {\n browser = 'Chrome';\n browserVersion = ua.match(/Chrome\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n browser = 'Safari';\n browserVersion = ua.match(/Version\\/([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('Opera') || ua.includes('OPR/')) {\n browser = 'Opera';\n browserVersion = ua.match(/(?:Opera|OPR)\\/([\\d.]+)/)?.[1] || '';\n }\n\n // Detect OS\n if (ua.includes('Windows')) {\n os = 'Windows';\n if (ua.includes('Windows NT 10.0')) osVersion = '10';\n else if (ua.includes('Windows NT 6.3')) osVersion = '8.1';\n else if (ua.includes('Windows NT 6.2')) osVersion = '8';\n else if (ua.includes('Windows NT 6.1')) osVersion = '7';\n } else if (ua.includes('Mac OS X')) {\n os = 'macOS';\n osVersion = ua.match(/Mac OS X ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n } else if (ua.includes('Linux')) {\n os = 'Linux';\n } else if (ua.includes('Android')) {\n os = 'Android';\n osVersion = ua.match(/Android ([\\d.]+)/)?.[1] || '';\n } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n os = 'iOS';\n osVersion = ua.match(/OS ([\\d_]+)/)?.[1]?.replace(/_/g, '.') || '';\n }\n\n return { browser, browser_version: browserVersion, os, os_version: osVersion };\n}\n","/**\n * Base HTTP client for all Vesant SDK clients\n *\n * Provides common functionality:\n * - Request/response handling\n * - Error handling\n * - Retry logic with exponential backoff\n * - Timeout management\n * - Debug logging\n */\n\nimport type { BaseClientConfig, Logger, RequestInterceptor, RequestOptions } from './config';\nimport {\n VesantError,\n NetworkError,\n TimeoutError,\n AuthenticationError,\n RateLimitError,\n ServiceUnavailableError,\n ValidationError,\n CircuitBreakerOpenError,\n} from './errors';\nimport { CircuitBreaker, type CircuitBreakerStatus } from './circuit-breaker';\nimport { RateLimitTracker, type RateLimitStatus } from './rate-limiter';\nimport { createConsoleLogger } from './logger';\nimport { SDK_VERSION } from './version';\nimport { generateUUID } from '../shared/browser-utils';\n\nexport abstract class BaseClient {\n protected config: BaseClientConfig & { timeout: number; retries: number };\n protected logger: Logger;\n private interceptors: RequestInterceptor[];\n private circuitBreaker: CircuitBreaker | null = null;\n private rateLimitTracker: RateLimitTracker | null = null;\n\n constructor(config: BaseClientConfig) {\n if (!config.baseURL?.trim()) {\n throw new ValidationError('baseURL is required and must be a non-empty string', ['baseURL']);\n }\n if (!config.tenantId?.trim()) {\n throw new ValidationError('tenantId is required and must be a non-empty string', ['tenantId']);\n }\n\n this.interceptors = config.interceptors || [];\n this.logger = config.logger || createConsoleLogger();\n\n // Auto-detect environment from API key prefix\n let environment = config.environment;\n const apiKey = config.apiKey || '';\n if (apiKey.startsWith('pk_test_')) {\n if (environment === 'production') {\n this.logger.warn('Sandbox API key (pk_test_*) used with environment: \"production\" — overriding to \"sandbox\"');\n }\n environment = 'sandbox';\n } else if (apiKey.startsWith('pk_live_') && environment === 'sandbox') {\n this.logger.warn('Production API key (pk_live_*) used with environment: \"sandbox\" — sandbox isolation will still be applied for backward compatibility');\n }\n\n this.config = {\n ...config,\n apiKey,\n environment,\n headers: config.headers || {},\n timeout: config.timeout || 10000,\n retries: config.retries || 3,\n debug: config.debug || false,\n interceptors: this.interceptors,\n logger: this.logger,\n };\n\n if (config.circuitBreaker) {\n this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n }\n if (config.enableRateLimitTracking) {\n this.rateLimitTracker = new RateLimitTracker();\n }\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n protected async request<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n requestOptions?: RequestOptions\n ): Promise<T> {\n const requestId = generateUUID();\n\n // Circuit breaker check\n if (this.circuitBreaker && !this.circuitBreaker.canExecute()) {\n const error = new CircuitBreakerOpenError();\n error.requestId = requestId;\n throw error;\n }\n\n // Rate limit pre-check\n if (this.rateLimitTracker && this.rateLimitTracker.isLimitExceeded()) {\n const status = this.rateLimitTracker.getStatus();\n const error = new RateLimitError(status.retryAfter ?? undefined);\n error.requestId = requestId;\n throw error;\n }\n\n const url = `${serviceURL || this.config.baseURL}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Tenant-ID': this.config.tenantId,\n 'X-SDK-Version': `vesant-sdk-ts/${SDK_VERSION}`,\n 'X-Request-ID': requestId,\n ...this.config.headers,\n ...((options.headers as Record<string, string>) || {}),\n };\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Sandbox header\n if (this.config.environment === 'sandbox') {\n headers['X-Sandbox'] = 'true';\n }\n\n // Idempotency key for mutating methods\n const method = (options.method || 'GET').toUpperCase();\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\n headers['Idempotency-Key'] = requestOptions?.idempotencyKey || generateUUID();\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n // Link consumer AbortSignal to internal controller\n if (requestOptions?.signal) {\n if (requestOptions.signal.aborted) {\n controller.abort();\n } else {\n requestOptions.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n }\n\n try {\n // Run onRequest interceptors\n let finalOptions: RequestInit = { ...options, headers };\n for (const interceptor of this.interceptors) {\n if (interceptor.onRequest) {\n finalOptions = await interceptor.onRequest(url, finalOptions);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug(`${finalOptions.method || 'GET'} ${endpoint}`);\n }\n\n const response = await fetch(url, {\n ...finalOptions,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Track rate limit headers\n if (this.rateLimitTracker) {\n this.rateLimitTracker.updateFromHeaders(response.headers);\n }\n\n // Binary download path\n if (requestOptions?.responseType === 'arraybuffer') {\n if (!response.ok) {\n let errData: Record<string, unknown> = {};\n try { errData = await response.json(); } catch { /* ignore */ }\n this.handleErrorResponse(response.status, errData, requestId);\n }\n this.circuitBreaker?.onSuccess();\n const buffer = await response.arrayBuffer();\n return buffer as unknown as T;\n }\n\n let data: Record<string, unknown> | undefined;\n try {\n data = await response.json();\n } catch {\n // Non-JSON response (HTML error pages, 204 No Content, etc.)\n if (!response.ok) {\n this.handleErrorResponse(response.status, {\n error: `HTTP ${response.status}`,\n message: response.statusText,\n }, requestId);\n }\n // OK response but no JSON body (e.g., 204)\n this.circuitBreaker?.onSuccess();\n return undefined as unknown as T;\n }\n\n if (!response.ok) {\n this.handleErrorResponse(response.status, data || {}, requestId);\n }\n\n // Record success for circuit breaker\n this.circuitBreaker?.onSuccess();\n\n // Run onResponse interceptors\n let result: unknown = data;\n for (const interceptor of this.interceptors) {\n if (interceptor.onResponse) {\n result = await interceptor.onResponse(url, result);\n }\n }\n\n if (this.config.debug) {\n this.logger.debug(`Response: ${response.status}`);\n }\n\n return result as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Record failure for circuit breaker (skip for client errors)\n if (\n error instanceof VesantError &&\n error.statusCode &&\n error.statusCode >= 500\n ) {\n this.circuitBreaker?.onFailure();\n } else if (error instanceof NetworkError || error instanceof TimeoutError) {\n this.circuitBreaker?.onFailure();\n }\n\n // Attach requestId to VesantError instances\n if (error instanceof VesantError && !error.requestId) {\n error.requestId = requestId;\n }\n\n // Run onError interceptors\n if (error instanceof Error) {\n for (const interceptor of this.interceptors) {\n if (interceptor.onError) {\n await interceptor.onError(url, error);\n }\n }\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n // Distinguish consumer abort from timeout\n if (requestOptions?.signal?.aborted) {\n const abortError = new VesantError('Request aborted', 'REQUEST_ABORTED');\n abortError.requestId = requestId;\n throw abortError;\n }\n this.circuitBreaker?.onFailure();\n const timeoutError = new TimeoutError(this.config.timeout);\n timeoutError.requestId = requestId;\n throw timeoutError;\n }\n if (error instanceof VesantError) {\n throw error;\n }\n }\n\n const networkError = new NetworkError('Network request failed', error);\n networkError.requestId = requestId;\n this.circuitBreaker?.onFailure();\n throw networkError;\n }\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n protected async requestWithRetry<T>(\n endpoint: string,\n options: RequestInit = {},\n serviceURL?: string,\n retries: number = this.config.retries,\n requestOptions?: RequestOptions\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await this.request<T>(endpoint, options, serviceURL, requestOptions);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error');\n\n // Don't retry on consumer abort\n if (requestOptions?.signal?.aborted) {\n throw lastError;\n }\n\n // Don't retry on client errors (4xx), except 429 (rate limit)\n if (\n lastError instanceof VesantError &&\n lastError.statusCode &&\n lastError.statusCode >= 400 &&\n lastError.statusCode < 500 &&\n lastError.statusCode !== 429\n ) {\n throw lastError;\n }\n\n // Don't retry on last attempt\n if (attempt === retries) {\n break;\n }\n\n // Use Retry-After for 429, otherwise exponential backoff with jitter\n let delay: number;\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n delay = lastError.retryAfter * 1000;\n } else {\n delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 1000, 10000);\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n if (this.config.debug) {\n this.logger.debug(`Retry attempt ${attempt + 1}/${retries} after ${delay.toFixed(0)}ms`);\n }\n }\n }\n\n throw new NetworkError(`Request failed after ${retries} retries`, lastError);\n }\n\n /**\n * Handle error responses from API\n */\n protected handleErrorResponse(status: number, data: Record<string, unknown>, requestId?: string): never {\n const message = (data.error as string) || (data.message as string) || `HTTP ${status}`;\n\n const createError = (): VesantError => {\n switch (status) {\n case 400:\n return new VesantError(message, 'BAD_REQUEST', 400);\n case 401:\n return new AuthenticationError(message);\n case 403:\n return new VesantError(message, 'FORBIDDEN', 403);\n case 404:\n return new VesantError(message, 'NOT_FOUND', 404);\n case 409:\n return new VesantError(message, 'DUPLICATE_PROFILE', 409);\n case 429: {\n const retryAfter = (data.retry_after as number | undefined) || (data.retryAfter as number | undefined);\n return new RateLimitError(retryAfter);\n }\n case 500:\n case 502:\n case 503:\n case 504:\n return new ServiceUnavailableError(message);\n default:\n return new VesantError(message, 'UNKNOWN_ERROR', status);\n }\n };\n\n const error = createError();\n if (requestId) {\n error.requestId = requestId;\n }\n throw error;\n }\n\n /**\n * Build query string from parameters\n */\n protected buildQueryString(params: Record<string, unknown>): string {\n const query = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((item) => query.append(key, String(item)));\n } else {\n query.append(key, String(value));\n }\n }\n });\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<BaseClientConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n headers: {\n ...this.config.headers,\n ...(config.headers || {}),\n },\n };\n if (config.logger) {\n this.logger = config.logger;\n }\n if (config.interceptors) {\n this.interceptors = config.interceptors;\n }\n }\n\n /**\n * Get current configuration (readonly)\n */\n getConfig(): Readonly<BaseClientConfig> {\n return { ...this.config };\n }\n\n /**\n * Get rate limit status from tracked response headers.\n */\n getRateLimitStatus(): RateLimitStatus | null {\n return this.rateLimitTracker?.getStatus() ?? null;\n }\n\n /**\n * Get circuit breaker status.\n */\n getCircuitBreakerStatus(): CircuitBreakerStatus | null {\n return this.circuitBreaker?.getStatus() ?? null;\n }\n\n /**\n * Health check endpoint\n */\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n return this.request('/api/v1/health');\n }\n}\n","import { BaseClient } from '../core/client';\nimport type { BaseClientConfig, RequestOptions } from '../core/config';\nimport type {\n TaxClientConfig,\n CustomerTaxProfileRecord,\n CustomerTaxProfileDocuments,\n ReRequestTaxFormInput,\n EnableWithholdingInput,\n EnableWithholdingResponse,\n TINCheckResult,\n TaxRules,\n UpdateTaxRulesInput,\n TaxRuleVersion,\n ComplianceStats,\n ComplianceStatsFilters,\n GlobalTaxRule,\n TreatyCountry,\n TreatyCountryListResponse,\n} from './types';\n\nexport class TaxClient extends BaseClient {\n constructor(config: TaxClientConfig) {\n const baseConfig: BaseClientConfig = {\n baseURL: config.baseURL,\n tenantId: config.tenantId,\n apiKey: config.apiKey,\n headers: config.headers,\n timeout: config.timeout,\n retries: 3,\n debug: config.debug,\n environment: config.environment,\n };\n super(baseConfig);\n }\n\n // ==========================================================================\n // P1 — Customer Tax Profile (core compliance flow)\n // ==========================================================================\n\n async getCustomerTaxProfileRecord(customerID: string): Promise<CustomerTaxProfileRecord> {\n return this.request<CustomerTaxProfileRecord>(\n `/api/v1/tax/customer-tax-profiles/${customerID}`\n );\n }\n\n async requestTaxForm(customerID: string): Promise<CustomerTaxProfileRecord> {\n return this.request<CustomerTaxProfileRecord>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/request-form`,\n { method: 'POST' }\n );\n }\n\n async checkTINStatus(customerID: string): Promise<TINCheckResult> {\n return this.requestWithRetry<TINCheckResult>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/check-tin`,\n { method: 'POST' }\n );\n }\n\n async reRequestTaxForm(\n customerID: string,\n input: ReRequestTaxFormInput\n ): Promise<CustomerTaxProfileRecord> {\n return this.request<CustomerTaxProfileRecord>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/re-request-form`,\n {\n method: 'POST',\n body: JSON.stringify(input),\n }\n );\n }\n\n async enableBackupWithholding(\n customerID: string,\n input: EnableWithholdingInput\n ): Promise<EnableWithholdingResponse> {\n return this.request<EnableWithholdingResponse>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/enable-withholding`,\n {\n method: 'POST',\n body: JSON.stringify(input),\n }\n );\n }\n\n async getCustomerDocuments(customerID: string): Promise<CustomerTaxProfileDocuments> {\n return this.request<CustomerTaxProfileDocuments>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/documents`\n );\n }\n\n async downloadTaxForm(\n customerID: string,\n requestOptions?: RequestOptions\n ): Promise<ArrayBuffer> {\n return this.request<ArrayBuffer>(\n `/api/v1/tax/customer-tax-profiles/${customerID}/download-form`,\n { method: 'GET' },\n undefined,\n { ...requestOptions, responseType: 'arraybuffer' }\n );\n }\n\n // ==========================================================================\n // P2 — Tenant Tax Rules\n // ==========================================================================\n\n async getTaxRules(): Promise<TaxRules> {\n const res = await this.request<{ rules: TaxRules }>('/api/v1/tax/rules');\n return res.rules;\n }\n\n async updateTaxRules(input: UpdateTaxRulesInput): Promise<TaxRuleVersion> {\n const res = await this.request<{ version: TaxRuleVersion }>('/api/v1/tax/rules', {\n method: 'PUT',\n body: JSON.stringify({ rules: input }),\n });\n return res.version;\n }\n\n async getComplianceStats(filters?: ComplianceStatsFilters): Promise<ComplianceStats> {\n const params: Record<string, unknown> = {};\n if (filters?.time_range) params.time_range = filters.time_range;\n if (filters?.from_date) params.from_date = filters.from_date;\n if (filters?.to_date) params.to_date = filters.to_date;\n return this.request<ComplianceStats>(\n `/api/v1/tax/tenant/w-form-tenant-stats${this.buildQueryString(params)}`\n );\n }\n\n // ==========================================================================\n // P3 — Global Tax Rule & Treaty Countries\n // ==========================================================================\n\n async getCurrentGlobalTaxRule(): Promise<GlobalTaxRule> {\n const res = await this.request<{ success: boolean; message: string; data: GlobalTaxRule }>(\n '/api/v1/tm/tenant/global-tax-rules/current'\n );\n return res.data;\n }\n\n async listTreatyCountries(): Promise<TreatyCountryListResponse> {\n return this.request<TreatyCountryListResponse>('/api/v1/tax/treaty-countries');\n }\n\n async getTreatyCountry(code: string): Promise<TreatyCountry> {\n const res = await this.request<{ treaty_country: TreatyCountry }>(\n `/api/v1/tax/treaty-countries/${encodeURIComponent(code)}`\n );\n return res.treaty_country;\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { E as EntityType, C as CustomerStatus, L as LocationCompliance, U as UUID, T as Timestamp, P as PaginationParams, a as PaginatedResponse } from './types-
|
|
1
|
+
import { E as EntityType, C as CustomerStatus, L as LocationCompliance, U as UUID, T as Timestamp, P as PaginationParams, a as PaginatedResponse } from './types-QUCWam16.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Type definitions for Vesant Risk Profile Service
|
|
@@ -210,4 +210,4 @@ interface RiskConfiguration {
|
|
|
210
210
|
updated_at: Timestamp;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
export type { CustomerProfile as C, EmploymentType as E, LegalForm as L,
|
|
213
|
+
export type { CustomerProfile as C, EmploymentType as E, LegalForm as L, ProfileFilters as P, RiskCategory as R, ScreeningStatus as S, UpdateProfileRequest as U, CreateProfileRequest as a, ProfileListResponse as b, ProfileDetailsResponse as c, RiskConfiguration as d, RiskDashboardMetrics as e, RiskFactor as f, RiskFactorType as g, RiskHistory as h };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { E as EntityType, C as CustomerStatus, L as LocationCompliance, U as UUID, T as Timestamp, P as PaginationParams, a as PaginatedResponse } from './types-
|
|
1
|
+
import { E as EntityType, C as CustomerStatus, L as LocationCompliance, U as UUID, T as Timestamp, P as PaginationParams, a as PaginatedResponse } from './types-QUCWam16.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Type definitions for Vesant Risk Profile Service
|
|
@@ -210,4 +210,4 @@ interface RiskConfiguration {
|
|
|
210
210
|
updated_at: Timestamp;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
export type { CustomerProfile as C, EmploymentType as E, LegalForm as L,
|
|
213
|
+
export type { CustomerProfile as C, EmploymentType as E, LegalForm as L, ProfileFilters as P, RiskCategory as R, ScreeningStatus as S, UpdateProfileRequest as U, CreateProfileRequest as a, ProfileListResponse as b, ProfileDetailsResponse as c, RiskConfiguration as d, RiskDashboardMetrics as e, RiskFactor as f, RiskFactorType as g, RiskHistory as h };
|
|
@@ -57,5 +57,11 @@ type LocationCompliance = 'compliant' | 'non-compliant' | 'unknown';
|
|
|
57
57
|
* Verification event types
|
|
58
58
|
*/
|
|
59
59
|
type VerificationEventType = 'registration' | 'login' | 'transaction' | 'withdrawal' | 'deposit' | 'api_access' | 'profile_update';
|
|
60
|
+
/** Structured block reason with machine-readable code and human-readable message */
|
|
61
|
+
interface BlockReason {
|
|
62
|
+
code: string;
|
|
63
|
+
message: string;
|
|
64
|
+
metadata?: Record<string, unknown>;
|
|
65
|
+
}
|
|
60
66
|
|
|
61
|
-
export type { APIResponse as A, CustomerStatus as C, EntityType as E, LocationCompliance as L, PaginationParams as P, RiskLevel as R, SuccessResponse as S, Timestamp as T, UUID as U, VerificationEventType as V, PaginatedResponse as a, ErrorResponse as b, Result as c };
|
|
67
|
+
export type { APIResponse as A, BlockReason as B, CustomerStatus as C, EntityType as E, LocationCompliance as L, PaginationParams as P, RiskLevel as R, SuccessResponse as S, Timestamp as T, UUID as U, VerificationEventType as V, PaginatedResponse as a, ErrorResponse as b, Result as c };
|
|
@@ -57,5 +57,11 @@ type LocationCompliance = 'compliant' | 'non-compliant' | 'unknown';
|
|
|
57
57
|
* Verification event types
|
|
58
58
|
*/
|
|
59
59
|
type VerificationEventType = 'registration' | 'login' | 'transaction' | 'withdrawal' | 'deposit' | 'api_access' | 'profile_update';
|
|
60
|
+
/** Structured block reason with machine-readable code and human-readable message */
|
|
61
|
+
interface BlockReason {
|
|
62
|
+
code: string;
|
|
63
|
+
message: string;
|
|
64
|
+
metadata?: Record<string, unknown>;
|
|
65
|
+
}
|
|
60
66
|
|
|
61
|
-
export type { APIResponse as A, CustomerStatus as C, EntityType as E, LocationCompliance as L, PaginationParams as P, RiskLevel as R, SuccessResponse as S, Timestamp as T, UUID as U, VerificationEventType as V, PaginatedResponse as a, ErrorResponse as b, Result as c };
|
|
67
|
+
export type { APIResponse as A, BlockReason as B, CustomerStatus as C, EntityType as E, LocationCompliance as L, PaginationParams as P, RiskLevel as R, SuccessResponse as S, Timestamp as T, UUID as U, VerificationEventType as V, PaginatedResponse as a, ErrorResponse as b, Result as c };
|
|
@@ -1,2 +1,181 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { U as UUID, T as Timestamp, R as RiskLevel } from '../types-QUCWam16.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Webhook signature verification utilities.
|
|
5
|
+
*
|
|
6
|
+
* Supports both Web Crypto API (browsers, Deno, Cloudflare Workers)
|
|
7
|
+
* and Node.js crypto module with automatic runtime detection.
|
|
8
|
+
* Uses constant-time comparison to prevent timing attacks.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Verify an HMAC-SHA256 webhook signature.
|
|
12
|
+
*
|
|
13
|
+
* @param payload - The raw request body string
|
|
14
|
+
* @param signature - The signature from the webhook header
|
|
15
|
+
* @param secret - The webhook signing secret
|
|
16
|
+
* @returns true if the signature is valid
|
|
17
|
+
*/
|
|
18
|
+
declare function verifyWebhookSignature(payload: string, signature: string, secret: string): Promise<boolean>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Webhook event types and payload definitions.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
type WebhookEventType = 'risk.score.changed' | 'risk.category.changed' | 'profile.created' | 'profile.updated' | 'geolocation.verified' | 'geolocation.blocked' | 'kyc.status.changed' | 'kyc.approved' | 'kyc.declined' | 'decision.recorded' | 'label.applied' | 'location_request.completed' | 'compliance.check.failed';
|
|
25
|
+
interface BaseWebhookEvent<T extends WebhookEventType = WebhookEventType, P = unknown> {
|
|
26
|
+
id: UUID;
|
|
27
|
+
type: T;
|
|
28
|
+
tenant_id: string;
|
|
29
|
+
environment: 'production' | 'sandbox';
|
|
30
|
+
customer_id: string;
|
|
31
|
+
payload: P;
|
|
32
|
+
timestamp: Timestamp;
|
|
33
|
+
}
|
|
34
|
+
interface RiskScoreChangedPayload {
|
|
35
|
+
previous_score: number;
|
|
36
|
+
new_score: number;
|
|
37
|
+
risk_level: RiskLevel;
|
|
38
|
+
factors: string[];
|
|
39
|
+
}
|
|
40
|
+
interface RiskCategoryChangedPayload {
|
|
41
|
+
previous_category: string;
|
|
42
|
+
new_category: string;
|
|
43
|
+
risk_level: RiskLevel;
|
|
44
|
+
}
|
|
45
|
+
interface ProfileCreatedPayload {
|
|
46
|
+
customer_id: string;
|
|
47
|
+
entity_type: string;
|
|
48
|
+
source: string;
|
|
49
|
+
}
|
|
50
|
+
interface ProfileUpdatedPayload {
|
|
51
|
+
customer_id: string;
|
|
52
|
+
updated_fields: string[];
|
|
53
|
+
}
|
|
54
|
+
interface GeolocationVerifiedPayload {
|
|
55
|
+
latitude: number;
|
|
56
|
+
longitude: number;
|
|
57
|
+
country: string;
|
|
58
|
+
region?: string;
|
|
59
|
+
is_compliant: boolean;
|
|
60
|
+
}
|
|
61
|
+
interface GeolocationBlockedPayload {
|
|
62
|
+
latitude: number;
|
|
63
|
+
longitude: number;
|
|
64
|
+
country: string;
|
|
65
|
+
region?: string;
|
|
66
|
+
reasons: string[];
|
|
67
|
+
}
|
|
68
|
+
interface KycStatusChangedPayload {
|
|
69
|
+
previous_status: string;
|
|
70
|
+
new_status: string;
|
|
71
|
+
provider?: string;
|
|
72
|
+
}
|
|
73
|
+
interface DecisionRecordedPayload {
|
|
74
|
+
decision_id: string;
|
|
75
|
+
decision_type: string;
|
|
76
|
+
category: string;
|
|
77
|
+
source: string;
|
|
78
|
+
risk_score?: number;
|
|
79
|
+
}
|
|
80
|
+
interface LabelAppliedPayload {
|
|
81
|
+
label_type: string;
|
|
82
|
+
reasons?: string[];
|
|
83
|
+
}
|
|
84
|
+
interface LocationRequestCompletedPayload {
|
|
85
|
+
request_id: string;
|
|
86
|
+
status: string;
|
|
87
|
+
latitude?: number;
|
|
88
|
+
longitude?: number;
|
|
89
|
+
}
|
|
90
|
+
interface ComplianceCheckFailedPayload {
|
|
91
|
+
check_type: string;
|
|
92
|
+
reasons: string[];
|
|
93
|
+
severity: string;
|
|
94
|
+
}
|
|
95
|
+
type WebhookEvent = BaseWebhookEvent<'risk.score.changed', RiskScoreChangedPayload> | BaseWebhookEvent<'risk.category.changed', RiskCategoryChangedPayload> | BaseWebhookEvent<'profile.created', ProfileCreatedPayload> | BaseWebhookEvent<'profile.updated', ProfileUpdatedPayload> | BaseWebhookEvent<'geolocation.verified', GeolocationVerifiedPayload> | BaseWebhookEvent<'geolocation.blocked', GeolocationBlockedPayload> | BaseWebhookEvent<'kyc.status.changed', KycStatusChangedPayload> | BaseWebhookEvent<'kyc.approved', KycStatusChangedPayload> | BaseWebhookEvent<'kyc.declined', KycStatusChangedPayload> | BaseWebhookEvent<'decision.recorded', DecisionRecordedPayload> | BaseWebhookEvent<'label.applied', LabelAppliedPayload> | BaseWebhookEvent<'location_request.completed', LocationRequestCompletedPayload> | BaseWebhookEvent<'compliance.check.failed', ComplianceCheckFailedPayload>;
|
|
96
|
+
interface WebhookHandlerConfig {
|
|
97
|
+
/** Webhook signing secret for signature verification */
|
|
98
|
+
secret: string;
|
|
99
|
+
/** Header name containing the signature (default: 'x-webhook-signature') */
|
|
100
|
+
signatureHeader?: string;
|
|
101
|
+
/** Maximum age of webhook event in ms (default: 300000 = 5 minutes) */
|
|
102
|
+
tolerance?: number;
|
|
103
|
+
/** Enable replay protection to reject duplicate event IDs (default: true) */
|
|
104
|
+
replayProtection?: boolean;
|
|
105
|
+
}
|
|
106
|
+
type WebhookEventHandler<T extends WebhookEventType = WebhookEventType> = (event: Extract<WebhookEvent, {
|
|
107
|
+
type: T;
|
|
108
|
+
}>) => void | Promise<void>;
|
|
109
|
+
type WebhookAnyHandler = (event: WebhookEvent) => void | Promise<void>;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Webhook event handler with signature verification and typed dispatch.
|
|
113
|
+
*/
|
|
114
|
+
|
|
115
|
+
declare class WebhookHandler {
|
|
116
|
+
private handlers;
|
|
117
|
+
private anyHandlers;
|
|
118
|
+
private readonly secret;
|
|
119
|
+
private readonly tolerance;
|
|
120
|
+
private readonly replayProtection;
|
|
121
|
+
private seenEventIds;
|
|
122
|
+
constructor(config: WebhookHandlerConfig);
|
|
123
|
+
/**
|
|
124
|
+
* Register a handler for a specific event type.
|
|
125
|
+
*/
|
|
126
|
+
on<T extends WebhookEventType>(eventType: T, handler: WebhookEventHandler<T>): this;
|
|
127
|
+
/**
|
|
128
|
+
* Register a catch-all handler for all event types.
|
|
129
|
+
*/
|
|
130
|
+
onAny(handler: WebhookAnyHandler): this;
|
|
131
|
+
/**
|
|
132
|
+
* Verify signature and parse the webhook body.
|
|
133
|
+
*/
|
|
134
|
+
verifyAndParse(body: string, signature: string): Promise<WebhookEvent>;
|
|
135
|
+
/**
|
|
136
|
+
* Verify signature, parse, and dispatch to registered handlers.
|
|
137
|
+
*/
|
|
138
|
+
handle(body: string, signature: string): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* Parse an event without signature verification (for testing).
|
|
141
|
+
*/
|
|
142
|
+
parseEvent(body: string): WebhookEvent;
|
|
143
|
+
private parseAndValidate;
|
|
144
|
+
private dispatch;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Framework middleware helpers for webhook handling.
|
|
149
|
+
*
|
|
150
|
+
* Provides pre-built integrations for Express/Connect and Next.js App Router.
|
|
151
|
+
*/
|
|
152
|
+
|
|
153
|
+
interface WebhookMiddlewareOptions extends WebhookHandlerConfig {
|
|
154
|
+
/** Event handlers to register */
|
|
155
|
+
handlers?: Partial<Record<WebhookEventType, WebhookEventHandler>>;
|
|
156
|
+
/** Catch-all handler */
|
|
157
|
+
onAny?: WebhookAnyHandler;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create an Express/Connect-compatible middleware for webhook handling.
|
|
161
|
+
*
|
|
162
|
+
* Expects the raw body to be available as `req.body` (string).
|
|
163
|
+
* Use `express.raw({ type: 'application/json' })` or similar middleware upstream.
|
|
164
|
+
*/
|
|
165
|
+
declare function createWebhookMiddleware(options: WebhookMiddlewareOptions): (req: {
|
|
166
|
+
body: string | Buffer;
|
|
167
|
+
headers: Record<string, string | string[] | undefined>;
|
|
168
|
+
}, res: {
|
|
169
|
+
status(code: number): {
|
|
170
|
+
json(body: unknown): void;
|
|
171
|
+
};
|
|
172
|
+
json?(body: unknown): void;
|
|
173
|
+
}, next?: (err?: unknown) => void) => Promise<void>;
|
|
174
|
+
/**
|
|
175
|
+
* Create a Next.js App Router-compatible webhook handler.
|
|
176
|
+
*
|
|
177
|
+
* Returns an async function `(request: Request) => Promise<Response>`.
|
|
178
|
+
*/
|
|
179
|
+
declare function createNextWebhookHandler(options: WebhookMiddlewareOptions): (request: Request) => Promise<Response>;
|
|
180
|
+
|
|
181
|
+
export { type BaseWebhookEvent, type ComplianceCheckFailedPayload, type DecisionRecordedPayload, type GeolocationBlockedPayload, type GeolocationVerifiedPayload, type KycStatusChangedPayload, type LabelAppliedPayload, type LocationRequestCompletedPayload, type ProfileCreatedPayload, type ProfileUpdatedPayload, type RiskCategoryChangedPayload, type RiskScoreChangedPayload, type WebhookAnyHandler, type WebhookEvent, type WebhookEventHandler, type WebhookEventType, WebhookHandler, type WebhookHandlerConfig, type WebhookMiddlewareOptions, createNextWebhookHandler, createWebhookMiddleware, verifyWebhookSignature };
|