@flonkid/kyc 1.9.0 → 1.9.2
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 +2 -2
- package/dist/index.cjs +6 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +1 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/browser/utils.ts","../src/browser/iframe-manager.ts","../src/browser/diagnostics.ts","../src/browser/prewarm.ts","../src/browser/loader.ts","../src/browser/message-handler.ts","../src/browser/viewport.ts","../src/browser/index.ts","../src/browser/react.tsx"],"names":["useRef","useMemo","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["// ── SDK metadata & defaults ─────────────────────────────────────────────\n\nexport const SDK_VERSION = '1.9.0';\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\n\n/**\n * REST API version this SDK is built against (date-pinned, separate from the\n * package version). Sent as the `Flonk-Version` header so a future breaking API\n * change can be served the old shape to old SDKs and the new shape to new ones.\n * The API is additive-only within a version; a breaking change mints a new date.\n */\nexport const API_VERSION = '2026-06-01';\n\n// ── SDK ⇄ iframe wire contract ──────────────────────────────────────────\n//\n// The SDK and the widget iframe ship and deploy independently, so the wire\n// between them is versioned SEPARATELY from the npm package (SDK_VERSION).\n// PROTOCOL_VERSION changes ONLY on a contract change — and the contract is\n// ADDITIVE-ONLY: never rename or remove an event/param, only add optional ones.\n// That keeps any SDK build compatible with any iframe build (a newer side just\n// ignores fields the older side doesn't send). This file is the single source\n// of truth for that contract; see CONTRACT.md.\n\nexport const PROTOCOL_VERSION = 1;\n\n/** postMessage `type` values exchanged between the SDK and the iframe. */\nexport const WIDGET_EVENTS = {\n READY: 'KYC_WIDGET_READY',\n COMPLETE: 'KYC_COMPLETE',\n CANCEL: 'KYC_CANCEL',\n ERROR: 'KYC_ERROR',\n CONFIG: 'KYC_WIDGET_CONFIG',\n} as const;\n\n/** Canonical iframe URL param keys the SDK stamps onto the widget src. */\nexport const WIDGET_PARAMS = {\n PROTOCOL_VERSION: 'pv',\n SESSION_ID: 'sessionId',\n EMBED_TOKEN: 'embedToken',\n TOKEN: 'token',\n PUBLISHABLE_KEY: 'publishableKey',\n CLIENT_ID: 'clientId',\n CLIENT_METADATA: 'clientMetadata',\n DESIGN_TOKENS: 'designTokens',\n ALLOW_MANUAL_UPLOAD: 'allowManualUpload',\n LANG: 'lang',\n OVERLAY_COLOR: 'overlayColor',\n MODE: 'mode',\n} as const;\n","/**\r\n * Stable, machine-branchable error codes returned by the API in the `code`\r\n * field of an error body. Open union (`| (string & {})`) so new codes don't\r\n * break consumers — branch on the ones you handle, fall through on the rest.\r\n */\r\nexport type FlonkErrorCode =\r\n | 'authentication_error'\r\n | 'invalid_publishable_key'\r\n | 'session_not_found'\r\n | 'session_expired'\r\n | 'session_invalid_state'\r\n | 'rate_limited'\r\n | 'validation_error'\r\n | 'api_error'\r\n | (string & {});\r\n\r\nexport class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: FlonkErrorCode,\r\n public readonly statusCode?: number,\r\n ) {\r\n super(message);\r\n this.name = 'FlonkError';\r\n }\r\n}\r\n\r\nexport class FlonkAPIError extends FlonkError {\r\n constructor(\r\n message: string,\r\n statusCode: number,\r\n public readonly body?: unknown,\r\n /** The API's stable error code (from the response body), if it sent one. */\r\n code: FlonkErrorCode = 'api_error',\r\n ) {\r\n super(message, code, statusCode);\r\n this.name = 'FlonkAPIError';\r\n }\r\n}\r\n\r\nexport class FlonkAuthenticationError extends FlonkError {\r\n constructor(message = 'Invalid or missing secret key') {\r\n super(message, 'authentication_error', 401);\r\n this.name = 'FlonkAuthenticationError';\r\n }\r\n}\r\n\r\nexport class FlonkValidationError extends FlonkError {\r\n constructor(message: string) {\r\n super(message, 'validation_error', 400);\r\n this.name = 'FlonkValidationError';\r\n }\r\n}\r\n\r\nexport class FlonkWebhookSignatureError extends FlonkError {\r\n constructor(message = 'Invalid webhook signature') {\r\n super(message, 'webhook_signature_error');\r\n this.name = 'FlonkWebhookSignatureError';\r\n }\r\n}\r\n","// ── Types ──────────────────────────────────────────────\r\n\r\nexport interface DesignTokens {\r\n colors?: {\r\n primary?: { cannabis?: string };\r\n [key: string]: unknown;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface PublicSessionData {\r\n id: string;\r\n allowManualUpload?: boolean;\r\n clientMetadata?: Record<string, unknown>;\r\n qrCodeUrl?: string;\r\n testMode?: boolean;\r\n poaEnabled?: boolean;\r\n poaRequired?: boolean;\r\n mlAutoCaptureEnabled?: boolean;\r\n mlCropEnabled?: boolean;\r\n mlVerifyEnabled?: boolean;\r\n vaultReuseEnabled?: boolean;\r\n vaultReuseChallenge?: 'otp' | 'liveness';\r\n faceAutoCapture?: { enabled: boolean; rolloutPercent: number; arm: 'beta' | 'standard' };\r\n project?: { name?: string; slug?: string };\r\n [key: string]: unknown;\r\n}\r\n\r\n// ── DOM helpers ────────────────────────────────────────\r\n\r\nexport function getOrigin(url: string): string {\r\n try {\r\n return new URL(url).origin;\r\n } catch {\r\n // Never fall back to the host page's origin — that would make the\r\n // postMessage listeners trust messages from the embedding page itself.\r\n // 'null' can never match a real iframe origin, so the guard fails closed.\r\n return 'null';\r\n }\r\n}\r\n\r\nexport function isDesktop(): boolean {\r\n return (\r\n window.innerWidth >= 1024 &&\r\n !('ontouchstart' in window || navigator.maxTouchPoints > 0)\r\n );\r\n}\r\n\r\nexport function setStyles(el: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\r\n Object.assign(el.style, styles);\r\n}\r\n\r\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n styles?: Partial<CSSStyleDeclaration>,\r\n attrs?: Record<string, string>,\r\n): HTMLElementTagNameMap[K] {\r\n const el = document.createElement(tag);\r\n if (styles) setStyles(el, styles);\r\n if (attrs) {\r\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\r\n }\r\n return el;\r\n}\r\n\r\nexport function debounce<T extends (...args: unknown[]) => void>(fn: T, ms: number): T {\r\n let timer: ReturnType<typeof setTimeout>;\r\n return ((...args: unknown[]) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => fn(...args), ms);\r\n }) as unknown as T;\r\n}\r\n\r\n// ── Color helper ───────────────────────────────────────\r\n\r\nexport function generateSecondaryColor(hex: string): string {\r\n try {\r\n const h = hex.replace('#', '');\r\n const r = parseInt(h.substring(0, 2), 16);\r\n const g = parseInt(h.substring(2, 4), 16);\r\n const b = parseInt(h.substring(4, 6), 16);\r\n const f = 0.6;\r\n const toHex = (n: number) => {\r\n const s = n.toString(16);\r\n return s.length === 1 ? '0' + s : s;\r\n };\r\n return (\r\n '#' +\r\n toHex(Math.round(r + (255 - r) * f)) +\r\n toHex(Math.round(g + (255 - g) * f)) +\r\n toHex(Math.round(b + (255 - b) * f))\r\n );\r\n } catch {\r\n return '#93c5fd';\r\n }\r\n}\r\n\r\n// ── API helpers ────────────────────────────────────────\r\n\r\nconst DEFAULT_FETCH_TIMEOUT_MS = 20_000;\r\n\r\n/**\r\n * fetch() with an AbortController timeout. Browser fetch never times out on its\r\n * own, so a hung connection (captive portal, dead backend) would otherwise leave\r\n * the widget spinning forever. On timeout we throw a clear, surfaceable error.\r\n */\r\nasync function fetchWithTimeout(\r\n url: string,\r\n init: RequestInit = {},\r\n timeoutMs = DEFAULT_FETCH_TIMEOUT_MS,\r\n): Promise<Response> {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n return await fetch(url, { ...init, signal: controller.signal });\r\n } catch (err) {\r\n if ((err as Error)?.name === 'AbortError') {\r\n throw new Error(`Request timed out after ${timeoutMs}ms: ${url}`);\r\n }\r\n throw err;\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n}\r\n\r\ninterface WidgetTokenResult { token: string; mode: string; allowManualUpload: boolean }\r\n\r\n// In-flight dedup: a host app under React StrictMode (or any double-render)\r\n// can fire init() twice before the first token request resolves, doubling the\r\n// POST /public/widget-token. Share the in-flight promise per (pk, apiBase) so\r\n// concurrent/duplicate inits reuse one request. Short-lived: cleared as soon as\r\n// it settles (tokens are single-use / short-TTL — we don't cache the result).\r\nconst widgetTokenInflight = new Map<string, Promise<WidgetTokenResult>>();\r\n\r\nexport async function fetchWidgetToken(\r\n pk: string,\r\n apiBase: string,\r\n): Promise<WidgetTokenResult> {\r\n const key = `${apiBase}|${pk}`;\r\n const existing = widgetTokenInflight.get(key);\r\n if (existing) return existing;\r\n\r\n const promise = (async (): Promise<WidgetTokenResult> => {\r\n const res = await fetchWithTimeout(`${apiBase}/public/widget-token`, {\r\n headers: { 'x-kyc-pk': pk },\r\n credentials: 'include',\r\n });\r\n if (!res.ok) {\r\n let message = `Widget token request failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n })().finally(() => {\r\n widgetTokenInflight.delete(key);\r\n });\r\n\r\n widgetTokenInflight.set(key, promise);\r\n return promise;\r\n}\r\n\r\n// ── Design tokens (branding) cache ─────────────────────\r\n// Module-level so it survives across init() calls and can be warmed ahead of\r\n// time via preloadDesignTokens(). Keyed by the resolving identifier; TTL mirrors\r\n// the backend's Redis cache (no point holding stale branding longer than that).\r\n\r\nconst BRANDING_CACHE_TTL_MS = 5 * 60 * 1000;\r\n\r\ninterface BrandingCacheEntry {\r\n /** In-flight or resolved fetch; shared so concurrent callers dedupe. */\r\n promise: Promise<DesignTokens | null>;\r\n /** Epoch ms after which a *resolved* entry is considered stale. */\r\n expiresAt: number;\r\n}\r\n\r\nconst brandingCache = new Map<string, BrandingCacheEntry>();\r\n\r\nfunction brandingCacheKey(opts: { clientId?: string; pk?: string; sessionId?: string }): string | null {\r\n if (opts.pk) return `pk:${opts.pk}`;\r\n if (opts.sessionId) return `sid:${opts.sessionId}`;\r\n if (opts.clientId) return `cid:${opts.clientId}`;\r\n return null;\r\n}\r\n\r\nasync function requestDesignTokens(\r\n apiBase: string,\r\n opts: { clientId?: string; pk?: string; sessionId?: string },\r\n): Promise<DesignTokens | null> {\r\n const params: string[] = [];\r\n if (opts.sessionId) params.push(`sessionId=${encodeURIComponent(opts.sessionId)}`);\r\n else if (opts.clientId) params.push(`clientId=${encodeURIComponent(opts.clientId)}`);\r\n\r\n const url = `${apiBase}/public/design-tokens${params.length ? '?' + params.join('&') : ''}`;\r\n // Branding is non-critical: a timeout/failure resolves to null so the loader\r\n // falls back to the default color rather than blocking or throwing.\r\n const res = await fetchWithTimeout(\r\n url,\r\n { headers: opts.pk ? { 'x-kyc-pk': opts.pk } : {}, credentials: 'omit' },\r\n 8_000,\r\n );\r\n return res.ok ? res.json() : null;\r\n}\r\n\r\nexport async function fetchDesignTokens(\r\n apiBase: string,\r\n opts: { clientId?: string; pk?: string; sessionId?: string },\r\n): Promise<DesignTokens | null> {\r\n const key = brandingCacheKey(opts);\r\n if (!key) return null;\r\n\r\n const now = Date.now();\r\n const cached = brandingCache.get(key);\r\n if (cached && cached.expiresAt > now) {\r\n return cached.promise;\r\n }\r\n\r\n const promise = requestDesignTokens(apiBase, opts).catch(() => null);\r\n // Cache the in-flight promise immediately so a click during preload dedupes.\r\n brandingCache.set(key, { promise, expiresAt: now + BRANDING_CACHE_TTL_MS });\r\n\r\n // Don't cache a null result (transient failure / unknown key) — let the next\r\n // call retry instead of pinning the fallback color for the full TTL.\r\n promise.then((tokens) => {\r\n if (tokens == null) brandingCache.delete(key);\r\n });\r\n\r\n return promise;\r\n}\r\n\r\n/**\r\n * Warm the branding cache ahead of time so the widget paints the brand color on\r\n * first frame instead of waiting on a round-trip at click time. Safe to call\r\n * repeatedly (deduped) and early (e.g. on page mount). Resolves when branding is\r\n * loaded; never throws.\r\n */\r\nexport function preloadDesignTokens(\r\n apiBase: string,\r\n opts: { pk?: string; sessionId?: string; clientId?: string },\r\n): Promise<DesignTokens | null> {\r\n return fetchDesignTokens(apiBase, opts);\r\n}\r\n\r\n/**\r\n * Validate serverUrl: absolute URLs must use HTTPS (except localhost for dev).\r\n */\r\nfunction validateServerUrl(url: string): void {\r\n // Relative paths are always OK ('/api/kyc/session')\r\n if (url.startsWith('/')) return;\r\n\r\n try {\r\n const parsed = new URL(url);\r\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\r\n if (parsed.protocol !== 'https:' && !isLocalhost) {\r\n throw new Error(\r\n `serverUrl must use HTTPS in production. Got: ${parsed.protocol}//. ` +\r\n `Use HTTPS ('https://api.myapp.com/...') or a relative path ('/api/...')`,\r\n );\r\n }\r\n } catch (e) {\r\n if ((e as Error).message.includes('serverUrl must use HTTPS')) throw e;\r\n throw new Error(`Invalid serverUrl: ${url}`);\r\n }\r\n}\r\n\r\n// In-flight dedup for session creation. A double-rendering host (StrictMode)\r\n// would otherwise create TWO sessions on a single mount. Keyed by the full\r\n// request shape (url + metadata) so genuinely different create calls aren't\r\n// collapsed; cleared on settle so sequential, intentional creates still work.\r\nconst sessionCreateInflight = new Map<string, Promise<{ sessionId: string; embedToken: string }>>();\r\n\r\nexport async function fetchSessionFromServer(\r\n serverUrl: string,\r\n clientMetadata?: Record<string, unknown>,\r\n requestHeaders?: Record<string, string>,\r\n): Promise<{ sessionId: string; embedToken: string }> {\r\n validateServerUrl(serverUrl);\r\n\r\n const key = `${serverUrl}|${JSON.stringify(clientMetadata ?? null)}`;\r\n const existing = sessionCreateInflight.get(key);\r\n if (existing) return existing;\r\n\r\n const promise = (async () => {\r\n const res = await fetchWithTimeout(serverUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...requestHeaders },\r\n credentials: 'include',\r\n body: JSON.stringify({ clientMetadata }),\r\n });\r\n if (!res.ok) {\r\n let message = `Session request failed (${res.status})`;\r\n try {\r\n const body = await res.json();\r\n if (body.error) message = body.error;\r\n else if (body.message) message = body.message;\r\n } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n })().finally(() => {\r\n sessionCreateInflight.delete(key);\r\n });\r\n\r\n sessionCreateInflight.set(key, promise);\r\n return promise;\r\n}\r\n\r\nexport async function fetchPublicSession(\r\n apiBase: string,\r\n sessionId: string,\r\n embedToken: string,\r\n): Promise<PublicSessionData> {\r\n const res = await fetchWithTimeout(`${apiBase}/public/session/${sessionId}`, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${embedToken}`,\r\n },\r\n });\r\n if (!res.ok) {\r\n let message = `Failed to fetch session (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function exchangeSessionForToken(\r\n apiBase: string,\r\n sessionId: string,\r\n): Promise<{ embedToken: string; session: PublicSessionData }> {\r\n const res = await fetchWithTimeout(`${apiBase}/public/session/${sessionId}/token`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n if (!res.ok) {\r\n let message = `Token exchange failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n","import { createEl, isDesktop, setStyles } from './utils';\r\n\r\nexport function createIframe(src: string): HTMLIFrameElement {\r\n const d = isDesktop();\r\n const iframe = createEl(\r\n 'iframe',\r\n {\r\n border: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n zIndex: '9999',\r\n // Hidden until reveal so the loader overlay doesn't show the iframe's own\r\n // loading state through its translucent backdrop (double loader). Reveal\r\n // is gated on READY-OR-a-timeout (see index.ts), so a missing READY can't\r\n // leave it permanently hidden — that timeout is what removed the deadlock.\r\n opacity: '0',\r\n visibility: 'hidden',\r\n background: 'transparent',\r\n backgroundColor: 'transparent',\r\n borderRadius: d ? '0' : '',\r\n boxShadow: d ? 'none' : '',\r\n colorScheme: 'normal',\r\n },\r\n {\r\n src,\r\n allow: 'camera;microphone;clipboard-read;clipboard-write',\r\n sandbox: 'allow-scripts allow-forms allow-same-origin allow-popups',\r\n 'aria-label': 'KYC Verification',\r\n allowtransparency: 'true',\r\n },\r\n );\r\n\r\n try {\r\n iframe.style.setProperty('background', 'transparent', 'important');\r\n iframe.style.setProperty('background-color', 'transparent', 'important');\r\n iframe.style.setProperty('color-scheme', 'normal', 'important');\r\n } catch { /* noop */ }\r\n\r\n return iframe;\r\n}\r\n\r\n/**\r\n * Ensure the iframe/loader z-index is above all existing elements.\r\n */\r\nexport function adjustZIndex(loader: HTMLElement, iframe: HTMLIFrameElement): void {\r\n if (!isDesktop()) return;\r\n const all = Array.from(document.querySelectorAll('*'));\r\n const maxZ = Math.max(\r\n ...all.map((el) => parseInt(getComputedStyle(el).zIndex) || 0).filter((z) => z < 999999),\r\n );\r\n if (maxZ > 9998) {\r\n loader.style.zIndex = String(maxZ + 1);\r\n iframe.style.zIndex = String(maxZ + 2);\r\n }\r\n}\r\n\r\n/**\r\n * Fade the loader overlay out and reveal the iframe beneath it. The reveal is\r\n * gated on READY-OR-a-timeout at the call site, so a missing READY can never\r\n * leave the iframe hidden (that timeout is what removed the deadlock). Keeping\r\n * the iframe hidden until here avoids its own loading state showing through the\r\n * loader's translucent backdrop (double loader).\r\n */\r\nexport function transitionLoaderToIframe(\r\n loader: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n onDone: () => void,\r\n): void {\r\n const d = isDesktop();\r\n const dur = d ? 300 : 500;\r\n\r\n const card = loader.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transition: 'transform 300ms ease-out, opacity 300ms ease-out',\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n setStyles(loader, { transition: 'opacity 300ms ease-out', opacity: '0' });\r\n\r\n setTimeout(() => {\r\n onDone();\r\n setStyles(iframe, {\r\n transition: d\r\n ? 'opacity 300ms cubic-bezier(0.4,0,0.2,1),visibility 0ms'\r\n : 'opacity 400ms ease-out,visibility 0ms',\r\n opacity: '1',\r\n visibility: 'visible',\r\n });\r\n }, dur);\r\n}\r\n","import type { FlonkDiagnostic, FlonkDiagnosticCode, FlonkDiagnosticLevel } from '../shared/types';\n\n/**\n * Tiny observability sink. The SDK emits a structured diagnostic at every\n * degradation/branch point (loader fallback, blocked script, prewarm skipped,\n * ready-timeout reveal, …) so integrators — and we — can see WHY the SDK did\n * what it did, instead of guessing from a silent fallback.\n *\n * Module-level by necessity: several emit points (prewarm, the server-loader\n * script load) run outside any FlonkKYC instance (static / constructor). The\n * FlonkKYC constructor registers its `onDiagnostic` here; `window.__FLONK_DEBUG__`\n * additionally mirrors events to the console. Zero-cost when nothing is\n * registered and the debug flag is unset.\n */\n\ntype DiagnosticHandler = (event: FlonkDiagnostic) => void;\n\nconst handlers = new Set<DiagnosticHandler>();\n\n/** Register a diagnostic handler. Returns an unsubscribe. De-dupes by reference. */\nexport function addDiagnosticHandler(handler: DiagnosticHandler): () => void {\n handlers.add(handler);\n return () => {\n handlers.delete(handler);\n };\n}\n\nfunction debugEnabled(): boolean {\n try {\n return Boolean((globalThis as { __FLONK_DEBUG__?: unknown }).__FLONK_DEBUG__);\n } catch {\n return false;\n }\n}\n\n/** Emit a diagnostic to all handlers (+ console when __FLONK_DEBUG__ is set). */\nexport function emitDiagnostic(\n code: FlonkDiagnosticCode,\n level: FlonkDiagnosticLevel,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n const event: FlonkDiagnostic = { code, level, message, detail };\n\n if (debugEnabled()) {\n try {\n const fn = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n fn(`[flonk:${code}] ${message}`, detail ?? '');\n } catch {\n /* never let logging throw */\n }\n }\n\n for (const handler of handlers) {\n try {\n handler(event);\n } catch {\n /* a consumer handler must never break the SDK */\n }\n }\n}\n","/**\n * Self-prewarming for the KYC widget.\n *\n * Warms the connection and assets to our widget origin BEFORE the user clicks\n * \"Start\", so the loader (and ultimately the widget) appears with little or no\n * wait. All work is scheduled at idle / after the host page's `load`, so it\n * never competes with the host page's own critical resources.\n *\n * Levels (`prewarm`):\n * - 'connect' (default): preconnect + idle prefetch of the loader/branding\n * assets and the widget document. Cheap; warms DNS/TLS + caches.\n * - 'intent': warm when the user signals intent (hover / focus / the trigger\n * scrolls into view). Best for widgets on general pages — no cost for\n * visitors who never engage.\n * - 'eager': also pre-mount a hidden iframe at idle so the full widget bundle\n * loads in the background. Best for dedicated, high-click-through KYC pages.\n * - 'none': do nothing.\n *\n * Never throws; SSR-safe (no-ops when there's no document). Sessions are NEVER\n * pre-created here — only static assets are warmed.\n */\n\nimport { emitDiagnostic } from './diagnostics';\n\nexport type PrewarmLevel = 'connect' | 'intent' | 'eager' | 'none';\n\nexport interface PrewarmOptions {\n /** Widget origin to warm, e.g. https://widget.flonk.id (with or without path). */\n widgetUrl: string;\n /** API base, used to prefetch design tokens / loader config. */\n apiBase?: string;\n /** Publishable key, used to scope the branding/loader prefetch. */\n publishableKey?: string;\n /** Session id (alternative branding scope). */\n sessionId?: string;\n /** How aggressively to warm. Default 'connect'. */\n level?: PrewarmLevel;\n /** Element whose hover/focus/in-view triggers 'intent' warming. */\n trigger?: Element | null;\n /** Injectable idle scheduler (tests). Defaults to rIC / load / setTimeout. */\n scheduleIdle?: (fn: () => void) => void;\n /** Injectable document (tests). Defaults to the global document. */\n doc?: Document;\n}\n\nconst noop = () => {};\n\nfunction originOf(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return url.replace(/\\/+$/, '');\n }\n}\n\n/** Idempotently add a `<link rel>` hint to <head>; dedupes by rel+href. */\nfunction addLinkHint(\n doc: Document,\n rel: string,\n href: string,\n attrs?: Record<string, string>,\n): void {\n try {\n const existing = doc.querySelector(`link[rel=\"${rel}\"][href=\"${href}\"]`);\n if (existing) return;\n const link = doc.createElement('link');\n link.rel = rel;\n link.href = href;\n if (attrs) for (const k of Object.keys(attrs)) link.setAttribute(k, attrs[k]);\n (doc.head || doc.documentElement).appendChild(link);\n } catch {\n /* best-effort */\n }\n}\n\n/** Warm DNS/TLS to the widget origin. Cheap; safe to call eagerly and often. */\nexport function preconnect(widgetUrl: string, doc: Document = document): void {\n const origin = originOf(widgetUrl);\n addLinkHint(doc, 'preconnect', origin, { crossorigin: '' });\n addLinkHint(doc, 'dns-prefetch', origin);\n}\n\n/** Run `fn` when the browser is idle, never blocking the host page's load. */\nexport function defaultScheduleIdle(fn: () => void): void {\n if (typeof window === 'undefined') {\n fn();\n return;\n }\n const w = window as Window & {\n requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n };\n const run = () => {\n if (typeof w.requestIdleCallback === 'function') {\n w.requestIdleCallback(fn, { timeout: 2000 });\n } else {\n setTimeout(fn, 200);\n }\n };\n // Wait until the host page has finished its own load before warming.\n if (document.readyState === 'complete') run();\n else window.addEventListener('load', run, { once: true });\n}\n\n/**\n * Start prewarming. Returns a cleanup function (removes intent listeners).\n */\nexport function prewarm(options: PrewarmOptions): () => void {\n const level: PrewarmLevel = options.level ?? 'connect';\n const doc = options.doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (level === 'none' || !doc) {\n emitDiagnostic('PREWARM_SKIPPED', 'info', `Prewarm skipped (level=${level}${doc ? '' : ', no document'}).`);\n return noop;\n }\n\n const scheduleIdle = options.scheduleIdle ?? defaultScheduleIdle;\n const origin = originOf(options.widgetUrl);\n\n // preconnect is always worth it and effectively free — do it immediately so\n // DNS/TLS is warm by the time anything else (asset or iframe) is fetched.\n preconnect(options.widgetUrl, doc);\n\n const warmAssets = () => {\n if (options.apiBase) {\n const q = options.publishableKey\n ? `pk=${encodeURIComponent(options.publishableKey)}`\n : options.sessionId\n ? `sessionId=${encodeURIComponent(options.sessionId)}`\n : '';\n addLinkHint(doc, 'prefetch', `${options.apiBase}/v1/public/design-tokens${q ? `?${q}` : ''}`);\n }\n // Prefetch the widget document so its Next bundle/chunks are cached.\n addLinkHint(doc, 'prefetch', `${origin}/`, { as: 'document' });\n };\n\n if (level === 'intent') {\n return attachIntent(doc, options.trigger ?? null, () => {\n warmAssets();\n mountHiddenIframe(doc, origin);\n });\n }\n\n // 'connect' and 'eager' warm at idle. 'eager' also pre-mounts the iframe so\n // the whole bundle is loaded (not just prefetched) before the click.\n scheduleIdle(() => {\n warmAssets();\n if (level === 'eager') mountHiddenIframe(doc, origin);\n });\n return noop;\n}\n\n/** Attach one-shot intent listeners (hover/focus/in-view) to the trigger. */\nfunction attachIntent(doc: Document, trigger: Element | null, warm: () => void): () => void {\n let fired = false;\n const fire = () => {\n if (fired) return;\n fired = true;\n cleanup();\n warm();\n };\n\n const events: Array<[string, EventListener]> = [\n ['mouseenter', fire as EventListener],\n ['focusin', fire as EventListener],\n ['touchstart', fire as EventListener],\n ];\n let io: IntersectionObserver | null = null;\n\n const cleanup = () => {\n if (trigger) for (const [type, fn] of events) trigger.removeEventListener(type, fn);\n if (io) { io.disconnect(); io = null; }\n };\n\n if (trigger) {\n for (const [type, fn] of events) trigger.addEventListener(type, fn, { passive: true } as AddEventListenerOptions);\n const w = (doc.defaultView || (typeof window !== 'undefined' ? window : undefined)) as\n | (Window & typeof globalThis)\n | undefined;\n if (w && typeof w.IntersectionObserver === 'function') {\n const observer = new w.IntersectionObserver((entries: IntersectionObserverEntry[]) => {\n if (entries.some((e) => e.isIntersecting)) fire();\n });\n observer.observe(trigger);\n io = observer;\n }\n } else {\n // No trigger to observe — fall back to idle warming so 'intent' still warms.\n defaultScheduleIdle(fire);\n }\n\n return cleanup;\n}\n\n/** Pre-mount a hidden, inert iframe so the widget bundle loads in the background. */\nfunction mountHiddenIframe(doc: Document, origin: string): void {\n try {\n if (doc.querySelector('iframe[data-flonk-prewarm]')) return;\n const iframe = doc.createElement('iframe');\n iframe.src = `${origin}/?prewarm=1`;\n iframe.setAttribute('data-flonk-prewarm', '1');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n iframe.style.cssText =\n 'position:absolute;width:1px;height:1px;left:-9999px;top:-9999px;border:0;opacity:0;pointer-events:none';\n (doc.body || doc.documentElement).appendChild(iframe);\n } catch {\n /* best-effort */\n }\n}\n","import { createEl, setStyles, isDesktop, debounce } from './utils';\r\nimport { emitDiagnostic } from './diagnostics';\r\n\r\nconst LOADER_I18N: Record<string, { title: string; subtitle: string; errorTitle: string; close: string }> = {\r\n en: { title: 'Initializing...', subtitle: 'Loading KYC widget', errorTitle: 'Something went wrong', close: 'Close' },\r\n de: { title: 'Initialisierung...', subtitle: 'KYC-Widget wird geladen', errorTitle: 'Ein Fehler ist aufgetreten', close: 'Schließen' },\r\n uk: { title: 'Ініціалізація...', subtitle: 'Завантаження KYC-віджета', errorTitle: 'Щось пішло не так', close: 'Закрити' },\r\n};\r\n\r\nconst KEYFRAMES = `\r\n@keyframes kycspin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}\r\n@keyframes kycdash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}\r\n@keyframes kycprogress{0%{transform:translateX(-100%)}50%{transform:translateX(0%)}100%{transform:translateX(250%)}}\r\n`.trim();\r\n\r\nlet styleInjected = false;\r\n\r\nexport class Loader {\r\n private overlay: HTMLElement | null = null;\r\n private cleanup: (() => void) | null = null;\r\n private origBodyStyles: { overflow: string; position: string } | null = null;\r\n\r\n show(primaryColor: string, lang?: string): HTMLElement {\r\n const color = primaryColor || '#15BA68';\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const d = isDesktop();\r\n\r\n // Inject keyframes once\r\n if (!styleInjected) {\r\n const style = document.createElement('style');\r\n style.textContent = KEYFRAMES;\r\n document.head.appendChild(style);\r\n styleInjected = true;\r\n }\r\n\r\n // Overlay\r\n const overlay = createEl('div', {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n background: d ? 'rgba(0,0,0,0.05)' : 'transparent',\r\n backdropFilter: d ? 'blur(2px)' : 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '9998',\r\n transition: 'opacity 600ms ease-out,transform 400ms ease-out',\r\n opacity: '1',\r\n overflow: 'hidden',\r\n margin: '0',\r\n padding: '0',\r\n });\r\n\r\n // Card\r\n const card = createEl('div', {\r\n width: d ? 'min(400px, 35vw)' : 'min(360px, 85vw)',\r\n backgroundColor: '#FFF',\r\n borderRadius: d ? '32px' : '24px',\r\n boxShadow: d\r\n ? '0 20px 64px rgba(17,17,17,0.12),0 4px 16px rgba(17,17,17,0.08)'\r\n : '0 8px 32px rgba(17,17,17,0.08)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: d ? '48px 36px' : '36px 24px',\r\n gap: d ? '24px' : '20px',\r\n transition: 'transform 400ms ease-out,opacity 400ms ease-out',\r\n });\r\n\r\n // Spinner SVG\r\n const wrap = createEl('div', {\r\n width: '48px',\r\n height: '48px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '48');\r\n svg.setAttribute('height', '48');\r\n svg.setAttribute('viewBox', '0 0 48 48');\r\n svg.style.animation = 'kycspin 1.2s cubic-bezier(0.4,0,0.6,1) infinite';\r\n\r\n const bg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none', stroke: color + '33',\r\n })) bg.setAttribute(k, v);\r\n\r\n const fg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none',\r\n stroke: color, 'stroke-linecap': 'round', 'stroke-dasharray': '62.8', 'stroke-dashoffset': '15.7',\r\n })) fg.setAttribute(k, v);\r\n setStyles(fg as unknown as HTMLElement, { transformOrigin: 'center', animation: 'kycdash 1.5s ease-in-out infinite' });\r\n\r\n svg.append(bg, fg);\r\n wrap.appendChild(svg);\r\n\r\n // Text\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n const textBox = createEl('div', { textAlign: 'center' });\r\n const title = createEl('h3', { fontFamily: font, fontWeight: '600', fontSize: '18px', lineHeight: '1.3', color: '#1F2937', margin: '0 0 4px 0' });\r\n title.textContent = strings.title;\r\n const subtitle = createEl('p', { fontFamily: font, fontWeight: '400', fontSize: '13px', lineHeight: '1.4', color: 'rgba(31,41,55,0.7)', margin: '0' });\r\n subtitle.textContent = strings.subtitle;\r\n textBox.append(title, subtitle);\r\n\r\n // Progress bar\r\n const track = createEl('div', { width: '100%', maxWidth: '240px', height: '3px', backgroundColor: color + '1A', borderRadius: '2px', overflow: 'hidden' });\r\n const bar = createEl('div', { width: '40%', height: '100%', backgroundColor: color, borderRadius: '2px', transform: 'translateX(-100%)', animation: 'kycprogress 2000ms ease-in-out infinite' });\r\n track.appendChild(bar);\r\n\r\n card.append(wrap, textBox, track);\r\n overlay.appendChild(card);\r\n\r\n // Lock body scroll\r\n this.origBodyStyles = { overflow: document.body.style.overflow, position: document.body.style.position };\r\n setStyles(document.body, { overflow: 'hidden', position: 'fixed', width: '100%', height: '100%' });\r\n document.body.appendChild(overlay);\r\n\r\n // Resize handler\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n const onResize = debounce(() => {\r\n const w = window.innerWidth;\r\n const h = window.innerHeight;\r\n if (Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1) {\r\n setStyles(overlay, { width: w + 'px', height: h + 'px' });\r\n prevW = w;\r\n prevH = h;\r\n }\r\n }, d ? 50 : 150);\r\n window.addEventListener('resize', onResize);\r\n\r\n this.overlay = overlay;\r\n this.cleanup = () => {\r\n window.removeEventListener('resize', onResize);\r\n if (this.origBodyStyles) {\r\n setStyles(document.body, { ...this.origBodyStyles, width: '', height: '' });\r\n }\r\n };\r\n\r\n return overlay;\r\n }\r\n\r\n get element(): HTMLElement | null {\r\n return this.overlay;\r\n }\r\n\r\n updateColor(primaryColor: string): void {\r\n if (!this.overlay) return;\r\n const color = primaryColor || '#15BA68';\r\n const bgCircle = this.overlay.querySelector('circle:first-child') as SVGCircleElement | null;\r\n const fgCircle = this.overlay.querySelector('circle:last-child') as SVGCircleElement | null;\r\n const bar = this.overlay.querySelector<HTMLElement>('[style*=\"kycprogress\"]');\r\n if (bgCircle) bgCircle.setAttribute('stroke', color + '33');\r\n if (fgCircle) fgCircle.setAttribute('stroke', color);\r\n if (bar) bar.style.backgroundColor = color;\r\n const track = bar?.parentElement;\r\n if (track) track.style.backgroundColor = color + '1A';\r\n }\r\n\r\n showError(message: string, lang?: string): void {\r\n if (!this.overlay) return;\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const card = this.overlay.querySelector('div') as HTMLElement | null;\r\n if (!card) return;\r\n\r\n // Replace card content with error state\r\n card.innerHTML = '';\r\n\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n\r\n // Error icon (X circle)\r\n const iconWrap = createEl('div', {\r\n width: '48px', height: '48px', borderRadius: '50%',\r\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\r\n display: 'flex', alignItems: 'center', justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '24'); svg.setAttribute('height', '24');\r\n svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('fill', 'none');\r\n svg.setAttribute('stroke', '#ef4444'); svg.setAttribute('stroke-width', '2');\r\n svg.setAttribute('stroke-linecap', 'round');\r\n const line1 = document.createElementNS(NS, 'line');\r\n line1.setAttribute('x1', '18'); line1.setAttribute('y1', '6');\r\n line1.setAttribute('x2', '6'); line1.setAttribute('y2', '18');\r\n const line2 = document.createElementNS(NS, 'line');\r\n line2.setAttribute('x1', '6'); line2.setAttribute('y1', '6');\r\n line2.setAttribute('x2', '18'); line2.setAttribute('y2', '18');\r\n svg.append(line1, line2);\r\n iconWrap.appendChild(svg);\r\n\r\n // Title\r\n const title = createEl('h3', {\r\n fontFamily: font, fontWeight: '600', fontSize: '18px',\r\n lineHeight: '1.3', color: '#1F2937', margin: '0', textAlign: 'center',\r\n });\r\n title.textContent = strings.errorTitle;\r\n\r\n // Message\r\n const msg = createEl('p', {\r\n fontFamily: font, fontWeight: '400', fontSize: '13px',\r\n lineHeight: '1.5', color: 'rgba(31,41,55,0.7)', margin: '0',\r\n textAlign: 'center', wordBreak: 'break-word', maxWidth: '300px',\r\n });\r\n msg.textContent = message;\r\n\r\n // Close button\r\n const btn = createEl('button', {\r\n fontFamily: font, fontWeight: '600', fontSize: '14px',\r\n padding: '10px 32px', borderRadius: '12px', border: 'none',\r\n backgroundColor: '#1F2937', color: '#fff', cursor: 'pointer',\r\n transition: 'opacity 150ms',\r\n });\r\n btn.textContent = strings.close;\r\n btn.onmouseenter = () => { btn.style.opacity = '0.85'; };\r\n btn.onmouseleave = () => { btn.style.opacity = '1'; };\r\n btn.onclick = () => this.destroy();\r\n\r\n card.append(iconWrap, title, msg, btn);\r\n }\r\n\r\n fadeOut(): void {\r\n if (!this.overlay) return;\r\n const d = isDesktop();\r\n const card = this.overlay.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n this.overlay.style.opacity = '0';\r\n }\r\n\r\n destroy(): void {\r\n this.cleanup?.();\r\n if (this.overlay?.parentNode) this.overlay.remove();\r\n this.overlay = null;\r\n this.cleanup = null;\r\n }\r\n}\r\n\r\n// ── Server-hosted loader (single implementation, restyleable without a client\r\n// SDK bump). Loaded from /public/loader.js, exposed as window.FlonkWidgetLoader.\r\n\r\ntype ServerOverlay = HTMLElement & {\r\n updateColor?: (c: string) => void;\r\n showError?: (m: string, lang?: string) => void;\r\n fadeOut?: (onDone?: () => void) => void;\r\n};\r\n\r\ninterface ServerLoaderApi {\r\n show(opts: { primaryColor?: string; lang?: string; zIndex?: number }): ServerOverlay;\r\n version: string;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n FlonkWidgetLoader?: ServerLoaderApi;\r\n }\r\n}\r\n\r\nexport function isServerLoaderReady(): boolean {\r\n return typeof window !== 'undefined' && !!window.FlonkWidgetLoader?.show;\r\n}\r\n\r\nlet serverScriptRequested = false;\r\n/** Inject the server-hosted loader script (idempotent, async, best-effort). */\r\nexport function loadServerLoaderScript(apiBase: string, pk?: string, sessionId?: string): void {\r\n if (typeof document === 'undefined' || serverScriptRequested || isServerLoaderReady()) return;\r\n serverScriptRequested = true;\r\n try {\r\n const q = pk\r\n ? `?publishableKey=${encodeURIComponent(pk)}`\r\n : sessionId\r\n ? `?sessionId=${encodeURIComponent(sessionId)}`\r\n : '';\r\n const s = document.createElement('script');\r\n s.src = `${apiBase}/public/loader.js${q}`;\r\n s.async = true;\r\n s.onerror = () => {\r\n // Most often a CSP `script-src` block or CORP/network failure — name the\r\n // likely fix so a silent bundled-loader fallback is debuggable.\r\n serverScriptRequested = false;\r\n emitDiagnostic(\r\n 'LOADER_SCRIPT_BLOCKED',\r\n 'warn',\r\n `Failed to load the server loader (${s.src}). Likely a CSP script-src or CORP block — allow the API origin in script-src. Falling back to the bundled loader.`,\r\n { src: s.src },\r\n );\r\n };\r\n (document.head || document.documentElement).appendChild(s);\r\n } catch {\r\n /* fall back to the bundled Loader */\r\n }\r\n}\r\n\r\n/** Adapter implementing the bundled-Loader surface over window.FlonkWidgetLoader. */\r\nexport class ServerLoader {\r\n private overlay: ServerOverlay | null = null;\r\n\r\n show(primaryColor: string, lang?: string): HTMLElement {\r\n this.overlay = window.FlonkWidgetLoader!.show({ primaryColor, lang });\r\n return this.overlay;\r\n }\r\n get element(): HTMLElement | null {\r\n return this.overlay;\r\n }\r\n updateColor(primaryColor: string): void {\r\n this.overlay?.updateColor?.(primaryColor);\r\n }\r\n showError(message: string, lang?: string): void {\r\n this.overlay?.showError?.(message, lang);\r\n }\r\n fadeOut(): void {\r\n this.overlay?.fadeOut?.();\r\n }\r\n destroy(): void {\r\n try {\r\n this.overlay?.remove();\r\n } catch {\r\n /* noop */\r\n }\r\n this.overlay = null;\r\n }\r\n}\r\n\r\nexport type WidgetLoader = Loader | ServerLoader;\r\n\r\n/** Prefer the server-hosted loader when ready; else the bundled one. */\r\nexport function makeLoader(): WidgetLoader {\r\n if (isServerLoaderReady()) return new ServerLoader();\r\n emitDiagnostic(\r\n 'LOADER_FALLBACK_BUNDLED',\r\n 'info',\r\n 'Server loader not ready at show time — using the bundled loader.',\r\n );\r\n return new Loader();\r\n}\r\n","import { WIDGET_EVENTS, PROTOCOL_VERSION } from '../shared/constants';\r\nimport { emitDiagnostic } from './diagnostics';\r\nimport { getOrigin } from './utils';\r\n\r\n/**\r\n * The iframe echoes the protocol version it speaks on READY. A mismatch is\r\n * informational, never fatal — the contract is additive-only, so an older\r\n * iframe simply ignores newer optional fields. We surface it so a genuinely\r\n * incompatible (stale-cached) iframe is debuggable instead of silently odd.\r\n */\r\nfunction checkProtocol(data: { protocolVersion?: unknown }): void {\r\n const remote = data.protocolVersion;\r\n if (typeof remote === 'number' && remote !== PROTOCOL_VERSION) {\r\n emitDiagnostic(\r\n 'PROTOCOL_VERSION_MISMATCH',\r\n 'warn',\r\n `SDK speaks protocol ${PROTOCOL_VERSION}, iframe speaks ${remote}. Additive-compatible, but check for a stale-cached widget if behavior is off.`,\r\n { sdk: PROTOCOL_VERSION, iframe: remote },\r\n );\r\n }\r\n}\r\n\r\nexport interface MessageCallbacks {\r\n onSuccess?: (result: Record<string, unknown>) => void;\r\n onError?: (error: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n}\r\n\r\nexport class MessageHandler {\r\n private listener: ((e: MessageEvent) => void) | null = null;\r\n private readyListener: ((e: MessageEvent) => void) | null = null;\r\n private completionHandled = false;\r\n\r\n constructor(\r\n private readonly iframeSrc: string,\r\n private readonly iframe: HTMLIFrameElement,\r\n private readonly callbacks: MessageCallbacks,\r\n ) {}\r\n\r\n /**\r\n * Start listening for postMessage events from the widget iframe.\r\n */\r\n listen(): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.listener = (e: MessageEvent) => {\r\n if (e.origin !== origin) return;\r\n if (e.source !== this.iframe.contentWindow) return;\r\n const data = e.data || {};\r\n const type = data.type as string;\r\n\r\n // Completion is handled exactly once, regardless of which callbacks the\r\n // caller wired. Teardown is owned by openWidget (via afterCleanup) — this\r\n // handler must not remove the iframe itself, or it races/leaks the loader\r\n // and viewport listeners.\r\n if (type === WIDGET_EVENTS.COMPLETE) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onSuccess?.(data.result);\r\n } else if (type === WIDGET_EVENTS.CANCEL) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onCancel?.();\r\n } else if (type === WIDGET_EVENTS.ERROR) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onError?.(data.error || 'Unknown error');\r\n } else if (type === WIDGET_EVENTS.READY) {\r\n checkProtocol(data);\r\n this.callbacks.onReady?.();\r\n }\r\n };\r\n\r\n window.addEventListener('message', this.listener);\r\n }\r\n\r\n /**\r\n * Listen for the first READY event, then call the callback once.\r\n */\r\n onReadyOnce(callback: () => void): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.readyListener = (e: MessageEvent) => {\r\n if (\r\n e.origin !== origin ||\r\n e.source !== this.iframe.contentWindow ||\r\n e.data?.type !== WIDGET_EVENTS.READY\r\n ) {\r\n return;\r\n }\r\n window.removeEventListener('message', this.readyListener!);\r\n this.readyListener = null;\r\n callback();\r\n };\r\n\r\n window.addEventListener('message', this.readyListener);\r\n }\r\n\r\n destroy(): void {\r\n if (this.listener) {\r\n window.removeEventListener('message', this.listener);\r\n this.listener = null;\r\n }\r\n if (this.readyListener) {\r\n window.removeEventListener('message', this.readyListener);\r\n this.readyListener = null;\r\n }\r\n }\r\n}\r\n","import { setStyles, isDesktop, debounce } from './utils';\r\n\r\ninterface ViewportInfo {\r\n width: number;\r\n height: number;\r\n offsetTop: number;\r\n offsetLeft: number;\r\n}\r\n\r\nfunction getVV(): ViewportInfo {\r\n if (window.visualViewport) {\r\n return {\r\n width: window.visualViewport.width,\r\n height: window.visualViewport.height,\r\n offsetTop: window.visualViewport.offsetTop || 0,\r\n offsetLeft: window.visualViewport.offsetLeft || 0,\r\n };\r\n }\r\n return { width: window.innerWidth, height: window.innerHeight, offsetTop: 0, offsetLeft: 0 };\r\n}\r\n\r\nexport function ensureViewportMeta(): void {\r\n try {\r\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"viewport\"]');\r\n if (!meta) {\r\n const m = document.createElement('meta');\r\n m.setAttribute('name', 'viewport');\r\n m.setAttribute('content', 'width=device-width, initial-scale=1.0, viewport-fit=cover');\r\n document.head.appendChild(m);\r\n } else {\r\n const c = meta.getAttribute('content') || '';\r\n if (!c.includes('viewport-fit=cover')) {\r\n meta.setAttribute('content', c + ', viewport-fit=cover');\r\n }\r\n }\r\n } catch { /* noop */ }\r\n}\r\n\r\nexport function setupViewportSizing(\r\n overlay: HTMLElement | null,\r\n iframe: HTMLElement | null,\r\n): () => void {\r\n ensureViewportMeta();\r\n\r\n let baselineHeight = 0;\r\n let desktop = isDesktop();\r\n let rafId: number | null = null;\r\n\r\n const initBaseline = () => {\r\n const vv = getVV();\r\n baselineHeight = window.innerHeight || vv.height || document.documentElement.clientHeight || 0;\r\n desktop = isDesktop();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n const applySize = () => {\r\n try {\r\n const vv = getVV();\r\n const inner = window.innerHeight || vv.height;\r\n const kbThreshold = desktop ? 200 : 150;\r\n const isKeyboard = (inner - vv.height) > kbThreshold;\r\n const height = isKeyboard ? vv.height : (baselineHeight || inner);\r\n\r\n const dims = desktop\r\n ? { top: '0', left: '0', width: window.innerWidth + 'px', height: window.innerHeight + 'px' }\r\n : { top: vv.offsetTop + 'px', left: vv.offsetLeft + 'px', width: vv.width + 'px', height: height + 'px' };\r\n\r\n if (overlay) setStyles(overlay, dims);\r\n if (iframe) setStyles(iframe, dims);\r\n } catch { /* noop */ }\r\n };\r\n\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n let prevX = 0;\r\n let prevY = 0;\r\n\r\n const debouncedApply = debounce(() => {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n }, desktop ? 50 : 150);\r\n\r\n const handleResize = () => {\r\n const vv = getVV();\r\n const w = vv.width;\r\n const h = vv.height;\r\n const x = vv.offsetLeft;\r\n const y = vv.offsetTop;\r\n const changed = Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1\r\n || Math.abs(x - prevX) > 1 || Math.abs(y - prevY) > 1;\r\n if (!changed) return;\r\n\r\n if (Math.abs(h - prevH) > 1) initBaseline();\r\n prevW = w;\r\n prevH = h;\r\n prevX = x;\r\n prevY = y;\r\n\r\n if (desktop) {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n } else {\r\n debouncedApply();\r\n }\r\n };\r\n\r\n const handleOrientation = () => {\r\n initBaseline();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n initBaseline();\r\n applySize();\r\n\r\n window.addEventListener('resize', handleResize);\r\n window.addEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.addEventListener('resize', handleResize);\r\n window.visualViewport.addEventListener('scroll', handleResize);\r\n }\r\n\r\n return () => {\r\n try {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n window.removeEventListener('resize', handleResize);\r\n window.removeEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.removeEventListener('resize', handleResize);\r\n window.visualViewport.removeEventListener('scroll', handleResize);\r\n }\r\n } catch { /* noop */ }\r\n };\r\n}\r\n","import { SDK_VERSION, DEFAULT_WIDGET_URL, DEFAULT_API_BASE, PROTOCOL_VERSION, WIDGET_PARAMS } from '../shared/constants';\r\nimport { FlonkValidationError } from '../shared/errors';\r\nimport type {\r\n FlonkKYCOptions,\r\n WidgetInitConfig,\r\n WidgetPreviewConfig,\r\n WidgetEmbedConfig,\r\n WidgetInstance,\r\n EmbedInstance,\r\n PreviewColors,\r\n VerificationResult,\r\n} from '../shared/types';\r\nimport {\r\n generateSecondaryColor,\r\n fetchWidgetToken,\r\n fetchDesignTokens,\r\n preloadDesignTokens,\r\n fetchSessionFromServer,\r\n exchangeSessionForToken,\r\n type DesignTokens,\r\n} from './utils';\r\nimport { createIframe, adjustZIndex, transitionLoaderToIframe } from './iframe-manager';\r\nimport { prewarm as prewarmWidget, preconnect, type PrewarmLevel } from './prewarm';\r\nimport { makeLoader, loadServerLoaderScript, type WidgetLoader } from './loader';\r\nimport { addDiagnosticHandler, emitDiagnostic } from './diagnostics';\r\nimport { MessageHandler } from './message-handler';\r\nimport { setupViewportSizing } from './viewport';\r\n\r\n/** Brand color used until project design tokens resolve. */\r\nconst FALLBACK_PRIMARY = '#15BA68';\r\n\r\n/**\r\n * How long to wait for the branded color before showing the loader. Design\r\n * tokens are a lightweight Redis-cached read (~50-150ms typical); 800ms covers\r\n * slow cold starts, beyond which we paint the fallback to avoid a blank screen.\r\n */\r\nconst EARLY_COLOR_BUDGET_MS = 800;\r\n\r\nconst primaryFrom = (tokens: DesignTokens | null): string =>\r\n tokens?.colors?.primary?.cannabis || FALLBACK_PRIMARY;\r\n\r\n/**\r\n * Race the design-tokens fetch against the early-color budget, then show a\r\n * loader painted with whatever color resolved first (or the fallback). Shared\r\n * by every init flow so branding latency and behavior are uniform.\r\n */\r\nasync function showLoaderWithEarlyColor(\r\n tokensPromise: Promise<DesignTokens | null>,\r\n lang?: string,\r\n): Promise<{ loader: WidgetLoader; primaryColor: string }> {\r\n const earlyTokens = await Promise.race([\r\n tokensPromise,\r\n new Promise<null>((resolve) => setTimeout(() => resolve(null), EARLY_COLOR_BUDGET_MS)),\r\n ]);\r\n const primaryColor = primaryFrom(earlyTokens);\r\n // Prefer the server-hosted loader (loaded in the constructor); falls back to\r\n // the bundled Loader when it isn't ready (CSP, offline, not-yet-loaded).\r\n const loader = makeLoader();\r\n loader.show(primaryColor, lang);\r\n return { loader, primaryColor };\r\n}\r\n\r\nexport class FlonkKYC {\r\n static readonly version = SDK_VERSION;\r\n\r\n private readonly widgetUrl: string;\r\n private readonly apiBase: string;\r\n private disposeDiagnostics: (() => void) | null = null;\r\n\r\n constructor(options: FlonkKYCOptions = {}) {\r\n this.widgetUrl = (options.widgetUrl || DEFAULT_WIDGET_URL).replace(/\\/$/, '');\r\n this.apiBase = (options.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n // Observe SDK degradations. Registered before preconnect/loader so the very\r\n // first diagnostics (loader fallback/block) are captured. Call dispose() to\r\n // unregister if you construct many short-lived instances.\r\n if (options.onDiagnostic) this.disposeDiagnostics = addDiagnosticHandler(options.onDiagnostic);\r\n // Warm DNS/TLS to the widget origin the moment the SDK is instantiated —\r\n // effectively free, and shaves the connection setup off the first asset /\r\n // iframe fetch. Also start loading the server-hosted loader script so it's\r\n // ready by the time a loader is shown (it's restyleable without a client\r\n // bump; the bundled Loader is the fallback). SSR-safe.\r\n if (typeof document !== 'undefined') {\r\n try { preconnect(this.widgetUrl); } catch { /* best-effort */ }\r\n try { loadServerLoaderScript(this.apiBase); } catch { /* best-effort */ }\r\n }\r\n }\r\n\r\n /** Unregister this instance's `onDiagnostic` handler. */\r\n dispose(): void {\r\n this.disposeDiagnostics?.();\r\n this.disposeDiagnostics = null;\r\n }\r\n\r\n /**\r\n * Prewarm the widget ahead of the user's click — preconnect + idle prefetch\r\n * of branding/assets, and (with `level:'eager'`) a hidden background iframe so\r\n * the full bundle is loaded before the click. Call on page mount / route\r\n * enter. Returns a cleanup (removes `intent` listeners). Never pre-creates a\r\n * session. SSR-safe.\r\n *\r\n * @example\r\n * FlonkKYC.prewarm({ publishableKey: 'pk_live_…', level: 'eager' });\r\n * // or, warm only when the user shows intent:\r\n * FlonkKYC.prewarm({ publishableKey: 'pk_live_…', level: 'intent', trigger: btn });\r\n */\r\n static prewarm(opts: {\r\n publishableKey?: string;\r\n sessionId?: string;\r\n widgetUrl?: string;\r\n apiBase?: string;\r\n level?: PrewarmLevel;\r\n trigger?: Element | null;\r\n } = {}): () => void {\r\n if (typeof document === 'undefined') return () => {};\r\n return prewarmWidget({\r\n widgetUrl: (opts.widgetUrl || DEFAULT_WIDGET_URL).replace(/\\/$/, ''),\r\n apiBase: (opts.apiBase || DEFAULT_API_BASE).replace(/\\/$/, ''),\r\n publishableKey: opts.publishableKey,\r\n sessionId: opts.sessionId,\r\n level: opts.level,\r\n trigger: opts.trigger ?? null,\r\n });\r\n }\r\n\r\n /**\r\n * Warm the project's branding (colors) ahead of time so the widget paints the\r\n * brand color on the first frame, with no branding round-trip at click time.\r\n *\r\n * Call it early — on page mount, route enter, or hover of the \"verify\" button\r\n * — well before `init()`. The result is cached (module-level, 5-min TTL) and\r\n * every subsequent `init()`/`open()` for the same key reads from it. Safe to\r\n * call repeatedly; concurrent calls dedupe. Never throws.\r\n *\r\n * @example\r\n * // in a layout effect, long before the user clicks \"Verify\"\r\n * FlonkKYC.preloadBranding({ publishableKey: 'pk_live_...' });\r\n */\r\n static preloadBranding(opts: {\r\n publishableKey?: string;\r\n sessionId?: string;\r\n apiBase?: string;\r\n }): Promise<void> {\r\n const apiBase = (opts.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n return preloadDesignTokens(apiBase, {\r\n pk: opts.publishableKey,\r\n sessionId: opts.sessionId,\r\n }).then(() => undefined);\r\n }\r\n\r\n // ── Public API ───────────────────────────────────────\r\n\r\n /**\r\n * Open the KYC verification widget.\r\n *\r\n * Flows (pick one; add `publishableKey` to any for an instant branded loader):\r\n * 1. `{ serverUrl }` — SDK auto-creates the session via your backend (recommended).\r\n * 2. `{ sessionId, embedToken }` — you created the session; pass its credentials.\r\n * 3. `{ sessionId }` — **deprecated**: exchanges the sessionId for an embedToken\r\n * via an extra round-trip. Prefer flow 2 by returning `embedToken` from your\r\n * backend alongside `sessionId`.\r\n * 4. `{ publishableKey }` — client-only; SDK mints a short-lived widget token.\r\n */\r\n async init(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n if (!config) throw new FlonkValidationError('config is required');\r\n\r\n // Flow: serverUrl — SDK calls client's backend to auto-create session\r\n if (config.serverUrl) {\r\n return this.initWithServerUrl(config);\r\n }\r\n\r\n // Flow: sessionId + embedToken — direct server-to-server\r\n if (config.sessionId && config.embedToken) {\r\n return this.initWithEmbedToken(config);\r\n }\r\n\r\n // Flow: sessionId only — deprecated (extra round-trip to exchange for token)\r\n if (config.sessionId) {\r\n return this.initWithSession(config);\r\n }\r\n\r\n // Flow: publishableKey — client-side\r\n const pk = config.publishableKey;\r\n if (!pk || !/^pk_/.test(pk)) {\r\n throw new FlonkValidationError(\r\n 'Provide one of: serverUrl, sessionId + embedToken, or publishableKey (pk_*)',\r\n );\r\n }\r\n return this.initWithPublishableKey(config);\r\n }\r\n\r\n /**\r\n * Preview mode — no API calls, mock data.\r\n */\r\n preview(config: WidgetPreviewConfig = {}): WidgetInstance {\r\n const colors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n return this.openWidget({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(colors),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n lang: config.lang || 'de',\r\n overlayColor: config.overlayColor,\r\n }, {\r\n primaryColor: colors.primaryColor || '#3b82f6',\r\n lang: config.lang,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n });\r\n }\r\n\r\n /**\r\n * Embed inline preview in a container (for dashboards).\r\n */\r\n embed(config: WidgetEmbedConfig): EmbedInstance {\r\n if (!config?.container) throw new FlonkValidationError('container is required');\r\n\r\n const container =\r\n typeof config.container === 'string'\r\n ? document.querySelector<HTMLElement>(config.container)\r\n : config.container;\r\n if (!container) throw new FlonkValidationError('Container element not found');\r\n\r\n let colors: PreviewColors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n let device = config.device || 'mobile';\r\n let scale = config.scale ?? 1;\r\n const lang = config.lang || 'de';\r\n\r\n const buildSrc = (c: PreviewColors, d: string) => {\r\n const p = new URLSearchParams({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(c),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n device: d,\r\n lang,\r\n });\r\n return `${this.widgetUrl}/?${p.toString()}`;\r\n };\r\n\r\n const applyScale = () => {\r\n iframe.style.transform = scale !== 1 ? `scale(${scale})` : '';\r\n iframe.style.transformOrigin = scale !== 1 ? 'top left' : '';\r\n };\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.style.cssText = 'border:none;width:100%;height:100%;display:block';\r\n iframe.src = buildSrc(colors, device);\r\n iframe.title = 'KYC Widget Preview';\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms');\r\n applyScale();\r\n\r\n container.innerHTML = '';\r\n container.appendChild(iframe);\r\n\r\n return {\r\n iframe,\r\n setColors(newColors: Partial<PreviewColors>) {\r\n colors = { ...colors, ...newColors };\r\n if (newColors.primaryColor && !newColors.secondaryColor) {\r\n colors.secondaryColor = generateSecondaryColor(newColors.primaryColor);\r\n }\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n setDevice(d: 'mobile' | 'desktop') {\r\n device = d;\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n getColors: () => ({ ...colors }),\r\n destroy: () => iframe.remove(),\r\n };\r\n }\r\n\r\n // ── Private flows ────────────────────────────────────\r\n\r\n /**\r\n * Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.\r\n *\r\n * When `publishableKey` is provided, design tokens are fetched in parallel\r\n * with the session creation request. This shows the branded loader ~200-500ms\r\n * faster because we don't have to wait for the session to be created first.\r\n */\r\n private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey;\r\n\r\n // Kick off both requests immediately in parallel\r\n const designTokensPromise = pk\r\n ? fetchDesignTokens(this.apiBase, { pk })\r\n : Promise.resolve(null);\r\n const sessionPromise = fetchSessionFromServer(\r\n config.serverUrl!, config.clientMetadata, config.requestHeaders,\r\n );\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const [{ sessionId, embedToken }, designTokens] = await Promise.all([\r\n sessionPromise,\r\n designTokensPromise,\r\n ]);\r\n\r\n // If pk didn't resolve tokens (no pk case), fall back to sessionId\r\n const finalTokens = designTokens ?? await fetchDesignTokens(this.apiBase, { sessionId });\r\n const finalColor = primaryFrom(finalTokens);\r\n if (finalColor !== primaryColor) loader.updateColor(finalColor);\r\n\r\n // No fetchPublicSession — the widget fetches the authoritative session\r\n // policy itself (server is the single source of truth).\r\n return this.buildWidget(embedToken, sessionId, config, loader, finalTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to create session';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 2: sessionId + embedToken — fetch session data, open widget.\r\n */\r\n private async initWithEmbedToken(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey;\r\n\r\n // Kick off both requests in parallel. When a publishableKey is supplied we\r\n // resolve branding by pk (no session round-trip needed for the color), so\r\n // the loader can paint the brand color before session data arrives —\r\n // mirroring the initWithServerUrl fast path. Without a pk we fall back to\r\n // resolving tokens by sessionId.\r\n const designTokensPromise = pk\r\n ? fetchDesignTokens(this.apiBase, { pk })\r\n : fetchDesignTokens(this.apiBase, { sessionId: config.sessionId });\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const designTokens = await designTokensPromise;\r\n\r\n const finalColor = primaryFrom(designTokens);\r\n if (finalColor !== primaryColor) loader.updateColor(finalColor);\r\n\r\n // No fetchPublicSession — the widget fetches the authoritative session\r\n // policy itself (server is the single source of truth).\r\n return this.buildWidget(config.embedToken!, config.sessionId!, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 3: sessionId only — exchange for embedToken, then init.\r\n *\r\n * @deprecated Prefer flow 2 (`sessionId` + `embedToken`). Return the\r\n * `embedToken` from your backend together with the `sessionId` to skip this\r\n * extra token-exchange round-trip.\r\n */\r\n private async initWithSession(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokensPromise = fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const exchangePromise = exchangeSessionForToken(this.apiBase, config.sessionId!);\r\n\r\n const { loader } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const [{ embedToken, session }, designTokens] = await Promise.all([\r\n exchangePromise,\r\n designTokensPromise,\r\n ]);\r\n return this.buildWidget(embedToken, config.sessionId || session.id, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 4: publishableKey — fetch widget token, open widget.\r\n */\r\n private async initWithPublishableKey(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey!;\r\n const designTokensPromise = fetchDesignTokens(this.apiBase, { pk });\r\n const widgetTokenPromise = fetchWidgetToken(pk, this.apiBase);\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const data = await widgetTokenPromise;\r\n\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n publishableKey: pk,\r\n allowManualUpload: String(data.allowManualUpload !== false),\r\n };\r\n\r\n if (data.token) params.token = data.token;\r\n if (config.clientMetadata) {\r\n params.clientMetadata = JSON.stringify(config.clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor,\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n // ── Core widget builder ──────────────────────────────\r\n\r\n private buildWidget(\r\n token: string,\r\n sessionId: string,\r\n config: WidgetInitConfig,\r\n loader: WidgetLoader,\r\n designTokens: DesignTokens | null,\r\n ): WidgetInstance {\r\n\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n sessionId,\r\n token,\r\n };\r\n\r\n if (config.allowManualUpload !== undefined) {\r\n params.allowManualUpload = String(config.allowManualUpload !== false);\r\n }\r\n if (designTokens?.colors) {\r\n params.designTokens = JSON.stringify(designTokens);\r\n }\r\n if (config.embedToken) params.embedToken = config.embedToken;\r\n\r\n if (config.clientMetadata) {\r\n params.clientMetadata = JSON.stringify(config.clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor: primaryFrom(designTokens),\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n }\r\n\r\n /**\r\n * Core: create iframe, attach listeners, return WidgetInstance.\r\n */\r\n private openWidget(\r\n params: Record<string, string | undefined>,\r\n opts: {\r\n primaryColor: string;\r\n lang?: string;\r\n loader?: WidgetLoader;\r\n onSuccess?: (r: VerificationResult) => void;\r\n onError?: (e: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n mount?: HTMLElement;\r\n },\r\n ): WidgetInstance {\r\n // Build URL. Stamp the wire-contract version so the iframe knows which SDK\r\n // protocol it's talking to (it echoes its own back on READY).\r\n const filtered = Object.fromEntries(\r\n Object.entries(params).filter(([, v]) => v != null),\r\n ) as Record<string, string>;\r\n filtered[WIDGET_PARAMS.PROTOCOL_VERSION] = String(PROTOCOL_VERSION);\r\n const search = new URLSearchParams(filtered);\r\n const src = `${this.widgetUrl}/?${search.toString()}`;\r\n\r\n // Create iframe (always fresh today; warm-iframe reuse is a later phase).\r\n const iframe = createIframe(src);\r\n emitDiagnostic('IFRAME_FRESH', 'info', 'Built a fresh widget iframe');\r\n const mountTarget = opts.mount || document.body;\r\n\r\n // Loader z-index\r\n const loader = opts.loader ?? (() => {\r\n const l = makeLoader();\r\n l.show(opts.primaryColor, opts.lang);\r\n return l;\r\n })();\r\n\r\n if (loader.element) adjustZIndex(loader.element, iframe);\r\n mountTarget.appendChild(iframe);\r\n\r\n // Viewport sizing\r\n const cleanupViewport = setupViewportSizing(loader.element, iframe);\r\n\r\n // Shared cleanup — runs on both manual destroy() and auto-close from MessageHandler\r\n let cleaned = false;\r\n const cleanupAll = () => {\r\n if (cleaned) return;\r\n cleaned = true;\r\n try {\r\n handler.destroy();\r\n cleanupViewport();\r\n loader.destroy();\r\n if (iframe.parentNode) iframe.remove();\r\n } catch { /* noop */ }\r\n };\r\n\r\n // Always tear down on completion, even if the caller wired no callback —\r\n // otherwise an error/cancel with a missing handler would leave the widget\r\n // open forever. The user callback is invoked first when present.\r\n const afterCleanup = (delayMs: number) => setTimeout(cleanupAll, delayMs);\r\n\r\n // Message handler\r\n const handler = new MessageHandler(src, iframe, {\r\n onSuccess: (r) => { opts.onSuccess?.(r); afterCleanup(1000); },\r\n onError: (e) => { opts.onError?.(e); afterCleanup(500); },\r\n onCancel: () => { opts.onCancel?.(); afterCleanup(500); },\r\n onReady: opts.onReady,\r\n });\r\n handler.listen();\r\n\r\n // Fade the loader overlay out (revealing the already-visible iframe) on\r\n // READY — OR on a safety timeout, so a missing READY can never leave the\r\n // overlay covering the iframe forever. The iframe is never hidden, so the\r\n // worst case is a brief extra overlay, never a permanent \"stuck loader\".\r\n let revealed = false;\r\n const revealOnce = () => {\r\n if (revealed) return;\r\n revealed = true;\r\n clearTimeout(revealTimer);\r\n if (loader.element) transitionLoaderToIframe(loader.element, iframe, () => loader.destroy());\r\n };\r\n const revealTimer = setTimeout(() => {\r\n emitDiagnostic('READY_TIMEOUT_REVEAL', 'warn', 'Widget did not signal READY in time; revealing anyway');\r\n revealOnce();\r\n }, 4000);\r\n handler.onReadyOnce(revealOnce);\r\n\r\n return {\r\n iframe,\r\n destroy: cleanupAll,\r\n };\r\n }\r\n}\r\n","import { useEffect, useRef, useMemo } from 'react';\r\nimport { FlonkKYC } from './index';\r\nimport type { WidgetInitConfig, WidgetInstance, FlonkKYCOptions, VerificationResult, WidgetLanguage } from '../shared/types';\r\n\r\nexport interface FlonkKYCProps extends FlonkKYCOptions {\r\n publishableKey?: string;\r\n serverUrl?: string;\r\n sessionId?: string;\r\n embedToken?: string;\r\n clientMetadata?: Record<string, unknown>;\r\n lang?: WidgetLanguage;\r\n overlayColor?: string;\r\n allowManualUpload?: boolean;\r\n /**\r\n * Extra headers sent with the `serverUrl` POST request.\r\n * Use this to pass Authorization tokens (e.g. JWT) when your\r\n * backend requires authentication.\r\n *\r\n * @example { Authorization: 'Bearer <jwt>' }\r\n */\r\n requestHeaders?: Record<string, string>;\r\n onSuccess?: (result: VerificationResult) => void;\r\n onError?: (error: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n /** Auto-open on mount. Default: true */\r\n autoOpen?: boolean;\r\n}\r\n\r\nexport function FlonkKYCWidget({\r\n widgetUrl,\r\n apiBase,\r\n autoOpen = true,\r\n publishableKey,\r\n serverUrl,\r\n sessionId,\r\n embedToken,\r\n clientMetadata,\r\n lang,\r\n overlayColor,\r\n allowManualUpload,\r\n requestHeaders,\r\n onSuccess,\r\n onError,\r\n onCancel,\r\n onReady,\r\n}: FlonkKYCProps) {\r\n const mountRef = useRef<HTMLDivElement>(null);\r\n const widgetRef = useRef<WidgetInstance | null>(null);\r\n\r\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\r\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\r\n\r\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\r\n\r\n // Auto-warm branding on mount so the brand color is ready the moment the\r\n // widget opens — even when autoOpen is false and the user clicks later. No\r\n // extra setup required; the cached result is reused by init() below.\r\n useEffect(() => {\r\n if (!publishableKey && !sessionId) return;\r\n void FlonkKYC.preloadBranding({ publishableKey, sessionId, apiBase });\r\n }, [publishableKey, sessionId, apiBase]);\r\n\r\n // Track mount generation to ignore stale inits from StrictMode\r\n const generationRef = useRef(0);\r\n\r\n useEffect(() => {\r\n if (!autoOpen) return;\r\n\r\n const thisGeneration = ++generationRef.current;\r\n\r\n const config: WidgetInitConfig = {\r\n publishableKey,\r\n serverUrl,\r\n sessionId,\r\n embedToken,\r\n clientMetadata,\r\n lang,\r\n overlayColor,\r\n allowManualUpload,\r\n requestHeaders,\r\n mount: mountRef.current || undefined,\r\n onSuccess: (r) => callbacksRef.current.onSuccess?.(r),\r\n onError: (e) => callbacksRef.current.onError?.(e),\r\n onCancel: () => callbacksRef.current.onCancel?.(),\r\n onReady: () => callbacksRef.current.onReady?.(),\r\n };\r\n\r\n // Delay init to skip StrictMode's first mount-unmount cycle\r\n const timer = setTimeout(() => {\r\n if (generationRef.current !== thisGeneration) return;\r\n\r\n sdk.init(config)\r\n .then((instance) => {\r\n if (generationRef.current !== thisGeneration) {\r\n instance.destroy();\r\n } else {\r\n widgetRef.current = instance;\r\n }\r\n })\r\n .catch((err) => {\r\n if (generationRef.current === thisGeneration) {\r\n callbacksRef.current.onError?.((err as Error).message);\r\n }\r\n });\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(timer);\r\n widgetRef.current?.destroy();\r\n widgetRef.current = null;\r\n };\r\n // Re-init when any primitive config input changes. `clientMetadata` and\r\n // `requestHeaders` are intentionally omitted: as object props their\r\n // identity changes every render, which would re-init the widget on each\r\n // render. Memoize them on the caller side if they must trigger a re-init.\r\n }, [sdk, publishableKey, serverUrl, sessionId, embedToken, lang, overlayColor, allowManualUpload, autoOpen]);\r\n\r\n return <div ref={mountRef} />;\r\n}\r\n\r\nexport interface FlonkKYCBrandingPreloaderProps {\r\n publishableKey?: string;\r\n sessionId?: string;\r\n apiBase?: string;\r\n}\r\n\r\n/**\r\n * Invisible helper that warms the project's branding cache on mount, so the\r\n * widget paints the brand color on the first frame when the user later opens it.\r\n *\r\n * Mount it high in the tree (e.g. an authenticated layout) so branding is ready\r\n * long before the user reaches the verification screen. Renders nothing.\r\n *\r\n * @example\r\n * // app/(authed)/layout.tsx\r\n * <FlonkKYCBrandingPreloader publishableKey={process.env.NEXT_PUBLIC_FLONK_PK} />\r\n */\r\nexport function FlonkKYCBrandingPreloader({\r\n publishableKey,\r\n sessionId,\r\n apiBase,\r\n}: FlonkKYCBrandingPreloaderProps): null {\r\n useEffect(() => {\r\n void FlonkKYC.preloadBranding({ publishableKey, sessionId, apiBase });\r\n }, [publishableKey, sessionId, apiBase]);\r\n\r\n return null;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/browser/utils.ts","../src/browser/iframe-manager.ts","../src/browser/diagnostics.ts","../src/browser/prewarm.ts","../src/browser/loader.ts","../src/browser/message-handler.ts","../src/browser/viewport.ts","../src/browser/index.ts","../src/browser/react.tsx"],"names":["useRef","useMemo","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["// ── SDK metadata & defaults ─────────────────────────────────────────────\n\nexport const SDK_VERSION = '1.9.2';\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\n\n/**\n * REST API version this SDK is built against (date-pinned, separate from the\n * package version). Sent as the `Flonk-Version` header so a future breaking API\n * change can be served the old shape to old SDKs and the new shape to new ones.\n * The API is additive-only within a version; a breaking change mints a new date.\n */\nexport const API_VERSION = '2026-06-01';\n\n// ── SDK ⇄ iframe wire contract ──────────────────────────────────────────\n//\n// The SDK and the widget iframe ship and deploy independently, so the wire\n// between them is versioned SEPARATELY from the npm package (SDK_VERSION).\n// PROTOCOL_VERSION changes ONLY on a contract change — and the contract is\n// ADDITIVE-ONLY: never rename or remove an event/param, only add optional ones.\n// That keeps any SDK build compatible with any iframe build (a newer side just\n// ignores fields the older side doesn't send). This file is the single source\n// of truth for that contract; see CONTRACT.md.\n\nexport const PROTOCOL_VERSION = 1;\n\n/** postMessage `type` values exchanged between the SDK and the iframe. */\nexport const WIDGET_EVENTS = {\n READY: 'KYC_WIDGET_READY',\n COMPLETE: 'KYC_COMPLETE',\n CANCEL: 'KYC_CANCEL',\n ERROR: 'KYC_ERROR',\n CONFIG: 'KYC_WIDGET_CONFIG',\n} as const;\n\n/** Canonical iframe URL param keys the SDK stamps onto the widget src. */\nexport const WIDGET_PARAMS = {\n PROTOCOL_VERSION: 'pv',\n SESSION_ID: 'sessionId',\n EMBED_TOKEN: 'embedToken',\n TOKEN: 'token',\n PUBLISHABLE_KEY: 'publishableKey',\n CLIENT_ID: 'clientId',\n CLIENT_METADATA: 'clientMetadata',\n DESIGN_TOKENS: 'designTokens',\n ALLOW_MANUAL_UPLOAD: 'allowManualUpload',\n LANG: 'lang',\n OVERLAY_COLOR: 'overlayColor',\n MODE: 'mode',\n} as const;\n","/**\r\n * Stable, machine-branchable error codes returned by the API in the `code`\r\n * field of an error body. Open union (`| (string & {})`) so new codes don't\r\n * break consumers — branch on the ones you handle, fall through on the rest.\r\n */\r\nexport type FlonkErrorCode =\r\n | 'authentication_error'\r\n | 'invalid_publishable_key'\r\n | 'session_not_found'\r\n | 'session_expired'\r\n | 'session_invalid_state'\r\n | 'rate_limited'\r\n | 'validation_error'\r\n | 'api_error'\r\n | (string & {});\r\n\r\nexport class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: FlonkErrorCode,\r\n public readonly statusCode?: number,\r\n ) {\r\n super(message);\r\n this.name = 'FlonkError';\r\n }\r\n}\r\n\r\nexport class FlonkAPIError extends FlonkError {\r\n constructor(\r\n message: string,\r\n statusCode: number,\r\n public readonly body?: unknown,\r\n /** The API's stable error code (from the response body), if it sent one. */\r\n code: FlonkErrorCode = 'api_error',\r\n ) {\r\n super(message, code, statusCode);\r\n this.name = 'FlonkAPIError';\r\n }\r\n}\r\n\r\nexport class FlonkAuthenticationError extends FlonkError {\r\n constructor(message = 'Invalid or missing secret key') {\r\n super(message, 'authentication_error', 401);\r\n this.name = 'FlonkAuthenticationError';\r\n }\r\n}\r\n\r\nexport class FlonkValidationError extends FlonkError {\r\n constructor(message: string) {\r\n super(message, 'validation_error', 400);\r\n this.name = 'FlonkValidationError';\r\n }\r\n}\r\n\r\nexport class FlonkWebhookSignatureError extends FlonkError {\r\n constructor(message = 'Invalid webhook signature') {\r\n super(message, 'webhook_signature_error');\r\n this.name = 'FlonkWebhookSignatureError';\r\n }\r\n}\r\n","// ── Types ──────────────────────────────────────────────\r\n\r\nexport interface DesignTokens {\r\n colors?: {\r\n primary?: { cannabis?: string };\r\n [key: string]: unknown;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface PublicSessionData {\r\n id: string;\r\n allowManualUpload?: boolean;\r\n clientMetadata?: Record<string, unknown>;\r\n qrCodeUrl?: string;\r\n testMode?: boolean;\r\n poaEnabled?: boolean;\r\n poaRequired?: boolean;\r\n mlAutoCaptureEnabled?: boolean;\r\n mlCropEnabled?: boolean;\r\n mlVerifyEnabled?: boolean;\r\n vaultReuseEnabled?: boolean;\r\n vaultReuseChallenge?: 'otp' | 'liveness';\r\n faceAutoCapture?: { enabled: boolean; rolloutPercent: number; arm: 'beta' | 'standard' };\r\n project?: { name?: string; slug?: string };\r\n [key: string]: unknown;\r\n}\r\n\r\n// ── DOM helpers ────────────────────────────────────────\r\n\r\nexport function getOrigin(url: string): string {\r\n try {\r\n return new URL(url).origin;\r\n } catch {\r\n // Never fall back to the host page's origin — that would make the\r\n // postMessage listeners trust messages from the embedding page itself.\r\n // 'null' can never match a real iframe origin, so the guard fails closed.\r\n return 'null';\r\n }\r\n}\r\n\r\nexport function isDesktop(): boolean {\r\n return (\r\n window.innerWidth >= 1024 &&\r\n !('ontouchstart' in window || navigator.maxTouchPoints > 0)\r\n );\r\n}\r\n\r\nexport function setStyles(el: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\r\n Object.assign(el.style, styles);\r\n}\r\n\r\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n styles?: Partial<CSSStyleDeclaration>,\r\n attrs?: Record<string, string>,\r\n): HTMLElementTagNameMap[K] {\r\n const el = document.createElement(tag);\r\n if (styles) setStyles(el, styles);\r\n if (attrs) {\r\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\r\n }\r\n return el;\r\n}\r\n\r\nexport function debounce<T extends (...args: unknown[]) => void>(fn: T, ms: number): T {\r\n let timer: ReturnType<typeof setTimeout>;\r\n return ((...args: unknown[]) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => fn(...args), ms);\r\n }) as unknown as T;\r\n}\r\n\r\n// ── Color helper ───────────────────────────────────────\r\n\r\nexport function generateSecondaryColor(hex: string): string {\r\n try {\r\n const h = hex.replace('#', '');\r\n const r = parseInt(h.substring(0, 2), 16);\r\n const g = parseInt(h.substring(2, 4), 16);\r\n const b = parseInt(h.substring(4, 6), 16);\r\n const f = 0.6;\r\n const toHex = (n: number) => {\r\n const s = n.toString(16);\r\n return s.length === 1 ? '0' + s : s;\r\n };\r\n return (\r\n '#' +\r\n toHex(Math.round(r + (255 - r) * f)) +\r\n toHex(Math.round(g + (255 - g) * f)) +\r\n toHex(Math.round(b + (255 - b) * f))\r\n );\r\n } catch {\r\n return '#93c5fd';\r\n }\r\n}\r\n\r\n// ── API helpers ────────────────────────────────────────\r\n\r\nconst DEFAULT_FETCH_TIMEOUT_MS = 20_000;\r\n\r\n/**\r\n * fetch() with an AbortController timeout. Browser fetch never times out on its\r\n * own, so a hung connection (captive portal, dead backend) would otherwise leave\r\n * the widget spinning forever. On timeout we throw a clear, surfaceable error.\r\n */\r\nasync function fetchWithTimeout(\r\n url: string,\r\n init: RequestInit = {},\r\n timeoutMs = DEFAULT_FETCH_TIMEOUT_MS,\r\n): Promise<Response> {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n return await fetch(url, { ...init, signal: controller.signal });\r\n } catch (err) {\r\n if ((err as Error)?.name === 'AbortError') {\r\n throw new Error(`Request timed out after ${timeoutMs}ms: ${url}`);\r\n }\r\n throw err;\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n}\r\n\r\ninterface WidgetTokenResult { token: string; mode: string; allowManualUpload: boolean }\r\n\r\n// In-flight dedup: a host app under React StrictMode (or any double-render)\r\n// can fire init() twice before the first token request resolves, doubling the\r\n// POST /public/widget-token. Share the in-flight promise per (pk, apiBase) so\r\n// concurrent/duplicate inits reuse one request. Short-lived: cleared as soon as\r\n// it settles (tokens are single-use / short-TTL — we don't cache the result).\r\nconst widgetTokenInflight = new Map<string, Promise<WidgetTokenResult>>();\r\n\r\nexport async function fetchWidgetToken(\r\n pk: string,\r\n apiBase: string,\r\n): Promise<WidgetTokenResult> {\r\n const key = `${apiBase}|${pk}`;\r\n const existing = widgetTokenInflight.get(key);\r\n if (existing) return existing;\r\n\r\n const promise = (async (): Promise<WidgetTokenResult> => {\r\n const res = await fetchWithTimeout(`${apiBase}/public/widget-token`, {\r\n headers: { 'x-kyc-pk': pk },\r\n credentials: 'include',\r\n });\r\n if (!res.ok) {\r\n let message = `Widget token request failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n })().finally(() => {\r\n widgetTokenInflight.delete(key);\r\n });\r\n\r\n widgetTokenInflight.set(key, promise);\r\n return promise;\r\n}\r\n\r\n// ── Design tokens (branding) cache ─────────────────────\r\n// Module-level so it survives across init() calls and can be warmed ahead of\r\n// time via preloadDesignTokens(). Keyed by the resolving identifier; TTL mirrors\r\n// the backend's Redis cache (no point holding stale branding longer than that).\r\n\r\nconst BRANDING_CACHE_TTL_MS = 5 * 60 * 1000;\r\n\r\ninterface BrandingCacheEntry {\r\n /** In-flight or resolved fetch; shared so concurrent callers dedupe. */\r\n promise: Promise<DesignTokens | null>;\r\n /** Epoch ms after which a *resolved* entry is considered stale. */\r\n expiresAt: number;\r\n}\r\n\r\nconst brandingCache = new Map<string, BrandingCacheEntry>();\r\n\r\nfunction brandingCacheKey(opts: { clientId?: string; pk?: string; sessionId?: string }): string | null {\r\n if (opts.pk) return `pk:${opts.pk}`;\r\n if (opts.sessionId) return `sid:${opts.sessionId}`;\r\n if (opts.clientId) return `cid:${opts.clientId}`;\r\n return null;\r\n}\r\n\r\nasync function requestDesignTokens(\r\n apiBase: string,\r\n opts: { clientId?: string; pk?: string; sessionId?: string },\r\n): Promise<DesignTokens | null> {\r\n const params: string[] = [];\r\n if (opts.sessionId) params.push(`sessionId=${encodeURIComponent(opts.sessionId)}`);\r\n else if (opts.clientId) params.push(`clientId=${encodeURIComponent(opts.clientId)}`);\r\n\r\n const url = `${apiBase}/public/design-tokens${params.length ? '?' + params.join('&') : ''}`;\r\n // Branding is non-critical: a timeout/failure resolves to null so the loader\r\n // falls back to the default color rather than blocking or throwing.\r\n const res = await fetchWithTimeout(\r\n url,\r\n { headers: opts.pk ? { 'x-kyc-pk': opts.pk } : {}, credentials: 'omit' },\r\n 8_000,\r\n );\r\n return res.ok ? res.json() : null;\r\n}\r\n\r\nexport async function fetchDesignTokens(\r\n apiBase: string,\r\n opts: { clientId?: string; pk?: string; sessionId?: string },\r\n): Promise<DesignTokens | null> {\r\n const key = brandingCacheKey(opts);\r\n if (!key) return null;\r\n\r\n const now = Date.now();\r\n const cached = brandingCache.get(key);\r\n if (cached && cached.expiresAt > now) {\r\n return cached.promise;\r\n }\r\n\r\n const promise = requestDesignTokens(apiBase, opts).catch(() => null);\r\n // Cache the in-flight promise immediately so a click during preload dedupes.\r\n brandingCache.set(key, { promise, expiresAt: now + BRANDING_CACHE_TTL_MS });\r\n\r\n // Don't cache a null result (transient failure / unknown key) — let the next\r\n // call retry instead of pinning the fallback color for the full TTL.\r\n promise.then((tokens) => {\r\n if (tokens == null) brandingCache.delete(key);\r\n });\r\n\r\n return promise;\r\n}\r\n\r\n/**\r\n * Warm the branding cache ahead of time so the widget paints the brand color on\r\n * first frame instead of waiting on a round-trip at click time. Safe to call\r\n * repeatedly (deduped) and early (e.g. on page mount). Resolves when branding is\r\n * loaded; never throws.\r\n */\r\nexport function preloadDesignTokens(\r\n apiBase: string,\r\n opts: { pk?: string; sessionId?: string; clientId?: string },\r\n): Promise<DesignTokens | null> {\r\n return fetchDesignTokens(apiBase, opts);\r\n}\r\n\r\n/**\r\n * Validate serverUrl: absolute URLs must use HTTPS (except localhost for dev).\r\n */\r\nfunction validateServerUrl(url: string): void {\r\n // Relative paths are always OK ('/api/kyc/session')\r\n if (url.startsWith('/')) return;\r\n\r\n try {\r\n const parsed = new URL(url);\r\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\r\n if (parsed.protocol !== 'https:' && !isLocalhost) {\r\n throw new Error(\r\n `serverUrl must use HTTPS in production. Got: ${parsed.protocol}//. ` +\r\n `Use HTTPS ('https://api.myapp.com/...') or a relative path ('/api/...')`,\r\n );\r\n }\r\n } catch (e) {\r\n if ((e as Error).message.includes('serverUrl must use HTTPS')) throw e;\r\n throw new Error(`Invalid serverUrl: ${url}`);\r\n }\r\n}\r\n\r\n// In-flight dedup for session creation. A double-rendering host (StrictMode)\r\n// would otherwise create TWO sessions on a single mount. Keyed by the full\r\n// request shape (url + metadata) so genuinely different create calls aren't\r\n// collapsed; cleared on settle so sequential, intentional creates still work.\r\nconst sessionCreateInflight = new Map<string, Promise<{ sessionId: string; embedToken: string }>>();\r\n\r\nexport async function fetchSessionFromServer(\r\n serverUrl: string,\r\n clientMetadata?: Record<string, unknown>,\r\n requestHeaders?: Record<string, string>,\r\n): Promise<{ sessionId: string; embedToken: string; qrCodeUrl?: string }> {\r\n validateServerUrl(serverUrl);\r\n\r\n const key = `${serverUrl}|${JSON.stringify(clientMetadata ?? null)}`;\r\n const existing = sessionCreateInflight.get(key);\r\n if (existing) return existing;\r\n\r\n const promise = (async () => {\r\n const res = await fetchWithTimeout(serverUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...requestHeaders },\r\n credentials: 'include',\r\n body: JSON.stringify({ clientMetadata }),\r\n });\r\n if (!res.ok) {\r\n let message = `Session request failed (${res.status})`;\r\n try {\r\n const body = await res.json();\r\n if (body.error) message = body.error;\r\n else if (body.message) message = body.message;\r\n } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n })().finally(() => {\r\n sessionCreateInflight.delete(key);\r\n });\r\n\r\n sessionCreateInflight.set(key, promise);\r\n return promise;\r\n}\r\n\r\nexport async function fetchPublicSession(\r\n apiBase: string,\r\n sessionId: string,\r\n embedToken: string,\r\n): Promise<PublicSessionData> {\r\n const res = await fetchWithTimeout(`${apiBase}/public/session/${sessionId}`, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${embedToken}`,\r\n },\r\n });\r\n if (!res.ok) {\r\n let message = `Failed to fetch session (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function exchangeSessionForToken(\r\n apiBase: string,\r\n sessionId: string,\r\n): Promise<{ embedToken: string; session: PublicSessionData }> {\r\n const res = await fetchWithTimeout(`${apiBase}/public/session/${sessionId}/token`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n if (!res.ok) {\r\n let message = `Token exchange failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n","import { createEl, isDesktop, setStyles } from './utils';\r\n\r\nexport function createIframe(src: string): HTMLIFrameElement {\r\n const d = isDesktop();\r\n const iframe = createEl(\r\n 'iframe',\r\n {\r\n border: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n zIndex: '9999',\r\n // Hidden until reveal so the loader overlay doesn't show the iframe's own\r\n // loading state through its translucent backdrop (double loader). Reveal\r\n // is gated on READY-OR-a-timeout (see index.ts), so a missing READY can't\r\n // leave it permanently hidden — that timeout is what removed the deadlock.\r\n opacity: '0',\r\n visibility: 'hidden',\r\n background: 'transparent',\r\n backgroundColor: 'transparent',\r\n borderRadius: d ? '0' : '',\r\n boxShadow: d ? 'none' : '',\r\n colorScheme: 'normal',\r\n },\r\n {\r\n src,\r\n allow: 'camera;microphone;clipboard-read;clipboard-write',\r\n sandbox: 'allow-scripts allow-forms allow-same-origin allow-popups',\r\n 'aria-label': 'KYC Verification',\r\n allowtransparency: 'true',\r\n },\r\n );\r\n\r\n try {\r\n iframe.style.setProperty('background', 'transparent', 'important');\r\n iframe.style.setProperty('background-color', 'transparent', 'important');\r\n iframe.style.setProperty('color-scheme', 'normal', 'important');\r\n } catch { /* noop */ }\r\n\r\n return iframe;\r\n}\r\n\r\n/**\r\n * Ensure the iframe/loader z-index is above all existing elements.\r\n */\r\nexport function adjustZIndex(loader: HTMLElement, iframe: HTMLIFrameElement): void {\r\n if (!isDesktop()) return;\r\n const all = Array.from(document.querySelectorAll('*'));\r\n const maxZ = Math.max(\r\n ...all.map((el) => parseInt(getComputedStyle(el).zIndex) || 0).filter((z) => z < 999999),\r\n );\r\n if (maxZ > 9998) {\r\n loader.style.zIndex = String(maxZ + 1);\r\n iframe.style.zIndex = String(maxZ + 2);\r\n }\r\n}\r\n\r\n/**\r\n * Fade the loader overlay out and reveal the iframe beneath it. The reveal is\r\n * gated on READY-OR-a-timeout at the call site, so a missing READY can never\r\n * leave the iframe hidden (that timeout is what removed the deadlock). Keeping\r\n * the iframe hidden until here avoids its own loading state showing through the\r\n * loader's translucent backdrop (double loader).\r\n */\r\nexport function transitionLoaderToIframe(\r\n loader: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n onDone: () => void,\r\n): void {\r\n const d = isDesktop();\r\n const dur = d ? 300 : 500;\r\n\r\n const card = loader.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transition: 'transform 300ms ease-out, opacity 300ms ease-out',\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n setStyles(loader, { transition: 'opacity 300ms ease-out', opacity: '0' });\r\n\r\n setTimeout(() => {\r\n onDone();\r\n setStyles(iframe, {\r\n transition: d\r\n ? 'opacity 300ms cubic-bezier(0.4,0,0.2,1),visibility 0ms'\r\n : 'opacity 400ms ease-out,visibility 0ms',\r\n opacity: '1',\r\n visibility: 'visible',\r\n });\r\n }, dur);\r\n}\r\n","import type { FlonkDiagnostic, FlonkDiagnosticCode, FlonkDiagnosticLevel } from '../shared/types';\n\n/**\n * Tiny observability sink. The SDK emits a structured diagnostic at every\n * degradation/branch point (loader fallback, blocked script, prewarm skipped,\n * ready-timeout reveal, …) so integrators — and we — can see WHY the SDK did\n * what it did, instead of guessing from a silent fallback.\n *\n * Module-level by necessity: several emit points (prewarm, the server-loader\n * script load) run outside any FlonkKYC instance (static / constructor). The\n * FlonkKYC constructor registers its `onDiagnostic` here; `window.__FLONK_DEBUG__`\n * additionally mirrors events to the console. Zero-cost when nothing is\n * registered and the debug flag is unset.\n */\n\ntype DiagnosticHandler = (event: FlonkDiagnostic) => void;\n\nconst handlers = new Set<DiagnosticHandler>();\n\n/** Register a diagnostic handler. Returns an unsubscribe. De-dupes by reference. */\nexport function addDiagnosticHandler(handler: DiagnosticHandler): () => void {\n handlers.add(handler);\n return () => {\n handlers.delete(handler);\n };\n}\n\nfunction debugEnabled(): boolean {\n try {\n return Boolean((globalThis as { __FLONK_DEBUG__?: unknown }).__FLONK_DEBUG__);\n } catch {\n return false;\n }\n}\n\n/** Emit a diagnostic to all handlers (+ console when __FLONK_DEBUG__ is set). */\nexport function emitDiagnostic(\n code: FlonkDiagnosticCode,\n level: FlonkDiagnosticLevel,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n const event: FlonkDiagnostic = { code, level, message, detail };\n\n if (debugEnabled()) {\n try {\n const fn = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n fn(`[flonk:${code}] ${message}`, detail ?? '');\n } catch {\n /* never let logging throw */\n }\n }\n\n for (const handler of handlers) {\n try {\n handler(event);\n } catch {\n /* a consumer handler must never break the SDK */\n }\n }\n}\n","/**\n * Self-prewarming for the KYC widget.\n *\n * Warms the connection and assets to our widget origin BEFORE the user clicks\n * \"Start\", so the loader (and ultimately the widget) appears with little or no\n * wait. All work is scheduled at idle / after the host page's `load`, so it\n * never competes with the host page's own critical resources.\n *\n * Levels (`prewarm`):\n * - 'connect' (default): preconnect + idle prefetch of the loader/branding\n * assets and the widget document. Cheap; warms DNS/TLS + caches.\n * - 'intent': warm when the user signals intent (hover / focus / the trigger\n * scrolls into view). Best for widgets on general pages — no cost for\n * visitors who never engage.\n * - 'eager': also pre-mount a hidden iframe at idle so the full widget bundle\n * loads in the background. Best for dedicated, high-click-through KYC pages.\n * - 'none': do nothing.\n *\n * Never throws; SSR-safe (no-ops when there's no document). Sessions are NEVER\n * pre-created here — only static assets are warmed.\n */\n\nimport { emitDiagnostic } from './diagnostics';\n\nexport type PrewarmLevel = 'connect' | 'intent' | 'eager' | 'none';\n\nexport interface PrewarmOptions {\n /** Widget origin to warm, e.g. https://widget.flonk.id (with or without path). */\n widgetUrl: string;\n /** API base, used to prefetch design tokens / loader config. */\n apiBase?: string;\n /** Publishable key, used to scope the branding/loader prefetch. */\n publishableKey?: string;\n /** Session id (alternative branding scope). */\n sessionId?: string;\n /** How aggressively to warm. Default 'connect'. */\n level?: PrewarmLevel;\n /** Element whose hover/focus/in-view triggers 'intent' warming. */\n trigger?: Element | null;\n /** Injectable idle scheduler (tests). Defaults to rIC / load / setTimeout. */\n scheduleIdle?: (fn: () => void) => void;\n /** Injectable document (tests). Defaults to the global document. */\n doc?: Document;\n}\n\nconst noop = () => {};\n\nfunction originOf(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return url.replace(/\\/+$/, '');\n }\n}\n\n/** Idempotently add a `<link rel>` hint to <head>; dedupes by rel+href. */\nfunction addLinkHint(\n doc: Document,\n rel: string,\n href: string,\n attrs?: Record<string, string>,\n): void {\n try {\n const existing = doc.querySelector(`link[rel=\"${rel}\"][href=\"${href}\"]`);\n if (existing) return;\n const link = doc.createElement('link');\n link.rel = rel;\n link.href = href;\n if (attrs) for (const k of Object.keys(attrs)) link.setAttribute(k, attrs[k]);\n (doc.head || doc.documentElement).appendChild(link);\n } catch {\n /* best-effort */\n }\n}\n\n/** Warm DNS/TLS to the widget origin. Cheap; safe to call eagerly and often. */\nexport function preconnect(widgetUrl: string, doc: Document = document): void {\n const origin = originOf(widgetUrl);\n addLinkHint(doc, 'preconnect', origin, { crossorigin: '' });\n addLinkHint(doc, 'dns-prefetch', origin);\n}\n\n/** Run `fn` when the browser is idle, never blocking the host page's load. */\nexport function defaultScheduleIdle(fn: () => void): void {\n if (typeof window === 'undefined') {\n fn();\n return;\n }\n const w = window as Window & {\n requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n };\n const run = () => {\n if (typeof w.requestIdleCallback === 'function') {\n w.requestIdleCallback(fn, { timeout: 2000 });\n } else {\n setTimeout(fn, 200);\n }\n };\n // Wait until the host page has finished its own load before warming.\n if (document.readyState === 'complete') run();\n else window.addEventListener('load', run, { once: true });\n}\n\n/**\n * Start prewarming. Returns a cleanup function (removes intent listeners).\n */\nexport function prewarm(options: PrewarmOptions): () => void {\n const level: PrewarmLevel = options.level ?? 'connect';\n const doc = options.doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (level === 'none' || !doc) {\n emitDiagnostic('PREWARM_SKIPPED', 'info', `Prewarm skipped (level=${level}${doc ? '' : ', no document'}).`);\n return noop;\n }\n\n const scheduleIdle = options.scheduleIdle ?? defaultScheduleIdle;\n const origin = originOf(options.widgetUrl);\n\n // preconnect is always worth it and effectively free — do it immediately so\n // DNS/TLS is warm by the time anything else (asset or iframe) is fetched.\n preconnect(options.widgetUrl, doc);\n\n const warmAssets = () => {\n if (options.apiBase) {\n const q = options.publishableKey\n ? `pk=${encodeURIComponent(options.publishableKey)}`\n : options.sessionId\n ? `sessionId=${encodeURIComponent(options.sessionId)}`\n : '';\n addLinkHint(doc, 'prefetch', `${options.apiBase}/v1/public/design-tokens${q ? `?${q}` : ''}`);\n }\n // Prefetch the widget document so its Next bundle/chunks are cached.\n addLinkHint(doc, 'prefetch', `${origin}/`, { as: 'document' });\n };\n\n if (level === 'intent') {\n return attachIntent(doc, options.trigger ?? null, () => {\n warmAssets();\n mountHiddenIframe(doc, origin);\n });\n }\n\n // 'connect' and 'eager' warm at idle. 'eager' also pre-mounts the iframe so\n // the whole bundle is loaded (not just prefetched) before the click.\n scheduleIdle(() => {\n warmAssets();\n if (level === 'eager') mountHiddenIframe(doc, origin);\n });\n return noop;\n}\n\n/** Attach one-shot intent listeners (hover/focus/in-view) to the trigger. */\nfunction attachIntent(doc: Document, trigger: Element | null, warm: () => void): () => void {\n let fired = false;\n const fire = () => {\n if (fired) return;\n fired = true;\n cleanup();\n warm();\n };\n\n const events: Array<[string, EventListener]> = [\n ['mouseenter', fire as EventListener],\n ['focusin', fire as EventListener],\n ['touchstart', fire as EventListener],\n ];\n let io: IntersectionObserver | null = null;\n\n const cleanup = () => {\n if (trigger) for (const [type, fn] of events) trigger.removeEventListener(type, fn);\n if (io) { io.disconnect(); io = null; }\n };\n\n if (trigger) {\n for (const [type, fn] of events) trigger.addEventListener(type, fn, { passive: true } as AddEventListenerOptions);\n const w = (doc.defaultView || (typeof window !== 'undefined' ? window : undefined)) as\n | (Window & typeof globalThis)\n | undefined;\n if (w && typeof w.IntersectionObserver === 'function') {\n const observer = new w.IntersectionObserver((entries: IntersectionObserverEntry[]) => {\n if (entries.some((e) => e.isIntersecting)) fire();\n });\n observer.observe(trigger);\n io = observer;\n }\n } else {\n // No trigger to observe — fall back to idle warming so 'intent' still warms.\n defaultScheduleIdle(fire);\n }\n\n return cleanup;\n}\n\n/** Pre-mount a hidden, inert iframe so the widget bundle loads in the background. */\nfunction mountHiddenIframe(doc: Document, origin: string): void {\n try {\n if (doc.querySelector('iframe[data-flonk-prewarm]')) return;\n const iframe = doc.createElement('iframe');\n iframe.src = `${origin}/?prewarm=1`;\n iframe.setAttribute('data-flonk-prewarm', '1');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n iframe.style.cssText =\n 'position:absolute;width:1px;height:1px;left:-9999px;top:-9999px;border:0;opacity:0;pointer-events:none';\n (doc.body || doc.documentElement).appendChild(iframe);\n } catch {\n /* best-effort */\n }\n}\n","import { createEl, setStyles, isDesktop, debounce } from './utils';\r\nimport { emitDiagnostic } from './diagnostics';\r\n\r\nconst LOADER_I18N: Record<string, { title: string; subtitle: string; errorTitle: string; close: string }> = {\r\n en: { title: 'Initializing...', subtitle: 'Loading KYC widget', errorTitle: 'Something went wrong', close: 'Close' },\r\n de: { title: 'Initialisierung...', subtitle: 'KYC-Widget wird geladen', errorTitle: 'Ein Fehler ist aufgetreten', close: 'Schließen' },\r\n uk: { title: 'Ініціалізація...', subtitle: 'Завантаження KYC-віджета', errorTitle: 'Щось пішло не так', close: 'Закрити' },\r\n};\r\n\r\nconst KEYFRAMES = `\r\n@keyframes kycspin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}\r\n@keyframes kycdash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}\r\n@keyframes kycprogress{0%{transform:translateX(-100%)}50%{transform:translateX(0%)}100%{transform:translateX(250%)}}\r\n`.trim();\r\n\r\nlet styleInjected = false;\r\n\r\nexport class Loader {\r\n private overlay: HTMLElement | null = null;\r\n private cleanup: (() => void) | null = null;\r\n private origBodyStyles: { overflow: string; position: string } | null = null;\r\n\r\n show(primaryColor: string, lang?: string): HTMLElement {\r\n const color = primaryColor || '#15BA68';\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const d = isDesktop();\r\n\r\n // Inject keyframes once\r\n if (!styleInjected) {\r\n const style = document.createElement('style');\r\n style.textContent = KEYFRAMES;\r\n document.head.appendChild(style);\r\n styleInjected = true;\r\n }\r\n\r\n // Overlay\r\n const overlay = createEl('div', {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n background: d ? 'rgba(0,0,0,0.05)' : 'transparent',\r\n backdropFilter: d ? 'blur(2px)' : 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '9998',\r\n transition: 'opacity 600ms ease-out,transform 400ms ease-out',\r\n opacity: '1',\r\n overflow: 'hidden',\r\n margin: '0',\r\n padding: '0',\r\n });\r\n\r\n // Card\r\n const card = createEl('div', {\r\n width: d ? 'min(400px, 35vw)' : 'min(360px, 85vw)',\r\n backgroundColor: '#FFF',\r\n borderRadius: d ? '32px' : '24px',\r\n boxShadow: d\r\n ? '0 20px 64px rgba(17,17,17,0.12),0 4px 16px rgba(17,17,17,0.08)'\r\n : '0 8px 32px rgba(17,17,17,0.08)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: d ? '48px 36px' : '36px 24px',\r\n gap: d ? '24px' : '20px',\r\n transition: 'transform 400ms ease-out,opacity 400ms ease-out',\r\n });\r\n\r\n // Spinner SVG\r\n const wrap = createEl('div', {\r\n width: '48px',\r\n height: '48px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '48');\r\n svg.setAttribute('height', '48');\r\n svg.setAttribute('viewBox', '0 0 48 48');\r\n svg.style.animation = 'kycspin 1.2s cubic-bezier(0.4,0,0.6,1) infinite';\r\n\r\n const bg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none', stroke: color + '33',\r\n })) bg.setAttribute(k, v);\r\n\r\n const fg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none',\r\n stroke: color, 'stroke-linecap': 'round', 'stroke-dasharray': '62.8', 'stroke-dashoffset': '15.7',\r\n })) fg.setAttribute(k, v);\r\n setStyles(fg as unknown as HTMLElement, { transformOrigin: 'center', animation: 'kycdash 1.5s ease-in-out infinite' });\r\n\r\n svg.append(bg, fg);\r\n wrap.appendChild(svg);\r\n\r\n // Text\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n const textBox = createEl('div', { textAlign: 'center' });\r\n const title = createEl('h3', { fontFamily: font, fontWeight: '600', fontSize: '18px', lineHeight: '1.3', color: '#1F2937', margin: '0 0 4px 0' });\r\n title.textContent = strings.title;\r\n const subtitle = createEl('p', { fontFamily: font, fontWeight: '400', fontSize: '13px', lineHeight: '1.4', color: 'rgba(31,41,55,0.7)', margin: '0' });\r\n subtitle.textContent = strings.subtitle;\r\n textBox.append(title, subtitle);\r\n\r\n // Progress bar\r\n const track = createEl('div', { width: '100%', maxWidth: '240px', height: '3px', backgroundColor: color + '1A', borderRadius: '2px', overflow: 'hidden' });\r\n const bar = createEl('div', { width: '40%', height: '100%', backgroundColor: color, borderRadius: '2px', transform: 'translateX(-100%)', animation: 'kycprogress 2000ms ease-in-out infinite' });\r\n track.appendChild(bar);\r\n\r\n card.append(wrap, textBox, track);\r\n overlay.appendChild(card);\r\n\r\n // Lock body scroll\r\n this.origBodyStyles = { overflow: document.body.style.overflow, position: document.body.style.position };\r\n setStyles(document.body, { overflow: 'hidden', position: 'fixed', width: '100%', height: '100%' });\r\n document.body.appendChild(overlay);\r\n\r\n // Resize handler\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n const onResize = debounce(() => {\r\n const w = window.innerWidth;\r\n const h = window.innerHeight;\r\n if (Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1) {\r\n setStyles(overlay, { width: w + 'px', height: h + 'px' });\r\n prevW = w;\r\n prevH = h;\r\n }\r\n }, d ? 50 : 150);\r\n window.addEventListener('resize', onResize);\r\n\r\n this.overlay = overlay;\r\n this.cleanup = () => {\r\n window.removeEventListener('resize', onResize);\r\n if (this.origBodyStyles) {\r\n setStyles(document.body, { ...this.origBodyStyles, width: '', height: '' });\r\n }\r\n };\r\n\r\n return overlay;\r\n }\r\n\r\n get element(): HTMLElement | null {\r\n return this.overlay;\r\n }\r\n\r\n updateColor(primaryColor: string): void {\r\n if (!this.overlay) return;\r\n const color = primaryColor || '#15BA68';\r\n const bgCircle = this.overlay.querySelector('circle:first-child') as SVGCircleElement | null;\r\n const fgCircle = this.overlay.querySelector('circle:last-child') as SVGCircleElement | null;\r\n const bar = this.overlay.querySelector<HTMLElement>('[style*=\"kycprogress\"]');\r\n if (bgCircle) bgCircle.setAttribute('stroke', color + '33');\r\n if (fgCircle) fgCircle.setAttribute('stroke', color);\r\n if (bar) bar.style.backgroundColor = color;\r\n const track = bar?.parentElement;\r\n if (track) track.style.backgroundColor = color + '1A';\r\n }\r\n\r\n showError(message: string, lang?: string): void {\r\n if (!this.overlay) return;\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const card = this.overlay.querySelector('div') as HTMLElement | null;\r\n if (!card) return;\r\n\r\n // Replace card content with error state\r\n card.innerHTML = '';\r\n\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n\r\n // Error icon (X circle)\r\n const iconWrap = createEl('div', {\r\n width: '48px', height: '48px', borderRadius: '50%',\r\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\r\n display: 'flex', alignItems: 'center', justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '24'); svg.setAttribute('height', '24');\r\n svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('fill', 'none');\r\n svg.setAttribute('stroke', '#ef4444'); svg.setAttribute('stroke-width', '2');\r\n svg.setAttribute('stroke-linecap', 'round');\r\n const line1 = document.createElementNS(NS, 'line');\r\n line1.setAttribute('x1', '18'); line1.setAttribute('y1', '6');\r\n line1.setAttribute('x2', '6'); line1.setAttribute('y2', '18');\r\n const line2 = document.createElementNS(NS, 'line');\r\n line2.setAttribute('x1', '6'); line2.setAttribute('y1', '6');\r\n line2.setAttribute('x2', '18'); line2.setAttribute('y2', '18');\r\n svg.append(line1, line2);\r\n iconWrap.appendChild(svg);\r\n\r\n // Title\r\n const title = createEl('h3', {\r\n fontFamily: font, fontWeight: '600', fontSize: '18px',\r\n lineHeight: '1.3', color: '#1F2937', margin: '0', textAlign: 'center',\r\n });\r\n title.textContent = strings.errorTitle;\r\n\r\n // Message\r\n const msg = createEl('p', {\r\n fontFamily: font, fontWeight: '400', fontSize: '13px',\r\n lineHeight: '1.5', color: 'rgba(31,41,55,0.7)', margin: '0',\r\n textAlign: 'center', wordBreak: 'break-word', maxWidth: '300px',\r\n });\r\n msg.textContent = message;\r\n\r\n // Close button\r\n const btn = createEl('button', {\r\n fontFamily: font, fontWeight: '600', fontSize: '14px',\r\n padding: '10px 32px', borderRadius: '12px', border: 'none',\r\n backgroundColor: '#1F2937', color: '#fff', cursor: 'pointer',\r\n transition: 'opacity 150ms',\r\n });\r\n btn.textContent = strings.close;\r\n btn.onmouseenter = () => { btn.style.opacity = '0.85'; };\r\n btn.onmouseleave = () => { btn.style.opacity = '1'; };\r\n btn.onclick = () => this.destroy();\r\n\r\n card.append(iconWrap, title, msg, btn);\r\n }\r\n\r\n fadeOut(): void {\r\n if (!this.overlay) return;\r\n const d = isDesktop();\r\n const card = this.overlay.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n this.overlay.style.opacity = '0';\r\n }\r\n\r\n destroy(): void {\r\n this.cleanup?.();\r\n if (this.overlay?.parentNode) this.overlay.remove();\r\n this.overlay = null;\r\n this.cleanup = null;\r\n }\r\n}\r\n\r\n// ── Server-hosted loader (single implementation, restyleable without a client\r\n// SDK bump). Loaded from /public/loader.js, exposed as window.FlonkWidgetLoader.\r\n\r\ntype ServerOverlay = HTMLElement & {\r\n updateColor?: (c: string) => void;\r\n showError?: (m: string, lang?: string) => void;\r\n fadeOut?: (onDone?: () => void) => void;\r\n};\r\n\r\ninterface ServerLoaderApi {\r\n show(opts: { primaryColor?: string; lang?: string; zIndex?: number }): ServerOverlay;\r\n version: string;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n FlonkWidgetLoader?: ServerLoaderApi;\r\n }\r\n}\r\n\r\nexport function isServerLoaderReady(): boolean {\r\n return typeof window !== 'undefined' && !!window.FlonkWidgetLoader?.show;\r\n}\r\n\r\nlet serverScriptRequested = false;\r\n/** Inject the server-hosted loader script (idempotent, async, best-effort). */\r\nexport function loadServerLoaderScript(apiBase: string, pk?: string, sessionId?: string): void {\r\n if (typeof document === 'undefined' || serverScriptRequested || isServerLoaderReady()) return;\r\n serverScriptRequested = true;\r\n try {\r\n const q = pk\r\n ? `?publishableKey=${encodeURIComponent(pk)}`\r\n : sessionId\r\n ? `?sessionId=${encodeURIComponent(sessionId)}`\r\n : '';\r\n const s = document.createElement('script');\r\n s.src = `${apiBase}/public/loader.js${q}`;\r\n s.async = true;\r\n s.onerror = () => {\r\n // Most often a CSP `script-src` block or CORP/network failure — name the\r\n // likely fix so a silent bundled-loader fallback is debuggable.\r\n serverScriptRequested = false;\r\n emitDiagnostic(\r\n 'LOADER_SCRIPT_BLOCKED',\r\n 'warn',\r\n `Failed to load the server loader (${s.src}). Likely a CSP script-src or CORP block — allow the API origin in script-src. Falling back to the bundled loader.`,\r\n { src: s.src },\r\n );\r\n };\r\n (document.head || document.documentElement).appendChild(s);\r\n } catch {\r\n /* fall back to the bundled Loader */\r\n }\r\n}\r\n\r\n/** Adapter implementing the bundled-Loader surface over window.FlonkWidgetLoader. */\r\nexport class ServerLoader {\r\n private overlay: ServerOverlay | null = null;\r\n\r\n show(primaryColor: string, lang?: string): HTMLElement {\r\n this.overlay = window.FlonkWidgetLoader!.show({ primaryColor, lang });\r\n return this.overlay;\r\n }\r\n get element(): HTMLElement | null {\r\n return this.overlay;\r\n }\r\n updateColor(primaryColor: string): void {\r\n this.overlay?.updateColor?.(primaryColor);\r\n }\r\n showError(message: string, lang?: string): void {\r\n this.overlay?.showError?.(message, lang);\r\n }\r\n fadeOut(): void {\r\n this.overlay?.fadeOut?.();\r\n }\r\n destroy(): void {\r\n try {\r\n this.overlay?.remove();\r\n } catch {\r\n /* noop */\r\n }\r\n this.overlay = null;\r\n }\r\n}\r\n\r\nexport type WidgetLoader = Loader | ServerLoader;\r\n\r\n/** Prefer the server-hosted loader when ready; else the bundled one. */\r\nexport function makeLoader(): WidgetLoader {\r\n if (isServerLoaderReady()) return new ServerLoader();\r\n emitDiagnostic(\r\n 'LOADER_FALLBACK_BUNDLED',\r\n 'info',\r\n 'Server loader not ready at show time — using the bundled loader.',\r\n );\r\n return new Loader();\r\n}\r\n","import { WIDGET_EVENTS, PROTOCOL_VERSION } from '../shared/constants';\r\nimport { emitDiagnostic } from './diagnostics';\r\nimport { getOrigin } from './utils';\r\n\r\n/**\r\n * The iframe echoes the protocol version it speaks on READY. A mismatch is\r\n * informational, never fatal — the contract is additive-only, so an older\r\n * iframe simply ignores newer optional fields. We surface it so a genuinely\r\n * incompatible (stale-cached) iframe is debuggable instead of silently odd.\r\n */\r\nfunction checkProtocol(data: { protocolVersion?: unknown }): void {\r\n const remote = data.protocolVersion;\r\n if (typeof remote === 'number' && remote !== PROTOCOL_VERSION) {\r\n emitDiagnostic(\r\n 'PROTOCOL_VERSION_MISMATCH',\r\n 'warn',\r\n `SDK speaks protocol ${PROTOCOL_VERSION}, iframe speaks ${remote}. Additive-compatible, but check for a stale-cached widget if behavior is off.`,\r\n { sdk: PROTOCOL_VERSION, iframe: remote },\r\n );\r\n }\r\n}\r\n\r\nexport interface MessageCallbacks {\r\n onSuccess?: (result: Record<string, unknown>) => void;\r\n onError?: (error: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n}\r\n\r\nexport class MessageHandler {\r\n private listener: ((e: MessageEvent) => void) | null = null;\r\n private readyListener: ((e: MessageEvent) => void) | null = null;\r\n private completionHandled = false;\r\n\r\n constructor(\r\n private readonly iframeSrc: string,\r\n private readonly iframe: HTMLIFrameElement,\r\n private readonly callbacks: MessageCallbacks,\r\n ) {}\r\n\r\n /**\r\n * Start listening for postMessage events from the widget iframe.\r\n */\r\n listen(): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.listener = (e: MessageEvent) => {\r\n if (e.origin !== origin) return;\r\n if (e.source !== this.iframe.contentWindow) return;\r\n const data = e.data || {};\r\n const type = data.type as string;\r\n\r\n // Completion is handled exactly once, regardless of which callbacks the\r\n // caller wired. Teardown is owned by openWidget (via afterCleanup) — this\r\n // handler must not remove the iframe itself, or it races/leaks the loader\r\n // and viewport listeners.\r\n if (type === WIDGET_EVENTS.COMPLETE) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onSuccess?.(data.result);\r\n } else if (type === WIDGET_EVENTS.CANCEL) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onCancel?.();\r\n } else if (type === WIDGET_EVENTS.ERROR) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onError?.(data.error || 'Unknown error');\r\n } else if (type === WIDGET_EVENTS.READY) {\r\n checkProtocol(data);\r\n this.callbacks.onReady?.();\r\n }\r\n };\r\n\r\n window.addEventListener('message', this.listener);\r\n }\r\n\r\n /**\r\n * Listen for the first READY event, then call the callback once.\r\n */\r\n onReadyOnce(callback: () => void): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.readyListener = (e: MessageEvent) => {\r\n if (\r\n e.origin !== origin ||\r\n e.source !== this.iframe.contentWindow ||\r\n e.data?.type !== WIDGET_EVENTS.READY\r\n ) {\r\n return;\r\n }\r\n window.removeEventListener('message', this.readyListener!);\r\n this.readyListener = null;\r\n callback();\r\n };\r\n\r\n window.addEventListener('message', this.readyListener);\r\n }\r\n\r\n destroy(): void {\r\n if (this.listener) {\r\n window.removeEventListener('message', this.listener);\r\n this.listener = null;\r\n }\r\n if (this.readyListener) {\r\n window.removeEventListener('message', this.readyListener);\r\n this.readyListener = null;\r\n }\r\n }\r\n}\r\n","import { setStyles, isDesktop, debounce } from './utils';\r\n\r\ninterface ViewportInfo {\r\n width: number;\r\n height: number;\r\n offsetTop: number;\r\n offsetLeft: number;\r\n}\r\n\r\nfunction getVV(): ViewportInfo {\r\n if (window.visualViewport) {\r\n return {\r\n width: window.visualViewport.width,\r\n height: window.visualViewport.height,\r\n offsetTop: window.visualViewport.offsetTop || 0,\r\n offsetLeft: window.visualViewport.offsetLeft || 0,\r\n };\r\n }\r\n return { width: window.innerWidth, height: window.innerHeight, offsetTop: 0, offsetLeft: 0 };\r\n}\r\n\r\nexport function ensureViewportMeta(): void {\r\n try {\r\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"viewport\"]');\r\n if (!meta) {\r\n const m = document.createElement('meta');\r\n m.setAttribute('name', 'viewport');\r\n m.setAttribute('content', 'width=device-width, initial-scale=1.0, viewport-fit=cover');\r\n document.head.appendChild(m);\r\n } else {\r\n const c = meta.getAttribute('content') || '';\r\n if (!c.includes('viewport-fit=cover')) {\r\n meta.setAttribute('content', c + ', viewport-fit=cover');\r\n }\r\n }\r\n } catch { /* noop */ }\r\n}\r\n\r\nexport function setupViewportSizing(\r\n overlay: HTMLElement | null,\r\n iframe: HTMLElement | null,\r\n): () => void {\r\n ensureViewportMeta();\r\n\r\n let baselineHeight = 0;\r\n let desktop = isDesktop();\r\n let rafId: number | null = null;\r\n\r\n const initBaseline = () => {\r\n const vv = getVV();\r\n baselineHeight = window.innerHeight || vv.height || document.documentElement.clientHeight || 0;\r\n desktop = isDesktop();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n const applySize = () => {\r\n try {\r\n const vv = getVV();\r\n const inner = window.innerHeight || vv.height;\r\n const kbThreshold = desktop ? 200 : 150;\r\n const isKeyboard = (inner - vv.height) > kbThreshold;\r\n const height = isKeyboard ? vv.height : (baselineHeight || inner);\r\n\r\n const dims = desktop\r\n ? { top: '0', left: '0', width: window.innerWidth + 'px', height: window.innerHeight + 'px' }\r\n : { top: vv.offsetTop + 'px', left: vv.offsetLeft + 'px', width: vv.width + 'px', height: height + 'px' };\r\n\r\n if (overlay) setStyles(overlay, dims);\r\n if (iframe) setStyles(iframe, dims);\r\n } catch { /* noop */ }\r\n };\r\n\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n let prevX = 0;\r\n let prevY = 0;\r\n\r\n const debouncedApply = debounce(() => {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n }, desktop ? 50 : 150);\r\n\r\n const handleResize = () => {\r\n const vv = getVV();\r\n const w = vv.width;\r\n const h = vv.height;\r\n const x = vv.offsetLeft;\r\n const y = vv.offsetTop;\r\n const changed = Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1\r\n || Math.abs(x - prevX) > 1 || Math.abs(y - prevY) > 1;\r\n if (!changed) return;\r\n\r\n if (Math.abs(h - prevH) > 1) initBaseline();\r\n prevW = w;\r\n prevH = h;\r\n prevX = x;\r\n prevY = y;\r\n\r\n if (desktop) {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n } else {\r\n debouncedApply();\r\n }\r\n };\r\n\r\n const handleOrientation = () => {\r\n initBaseline();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n initBaseline();\r\n applySize();\r\n\r\n window.addEventListener('resize', handleResize);\r\n window.addEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.addEventListener('resize', handleResize);\r\n window.visualViewport.addEventListener('scroll', handleResize);\r\n }\r\n\r\n return () => {\r\n try {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n window.removeEventListener('resize', handleResize);\r\n window.removeEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.removeEventListener('resize', handleResize);\r\n window.visualViewport.removeEventListener('scroll', handleResize);\r\n }\r\n } catch { /* noop */ }\r\n };\r\n}\r\n","import { SDK_VERSION, DEFAULT_WIDGET_URL, DEFAULT_API_BASE, PROTOCOL_VERSION, WIDGET_PARAMS } from '../shared/constants';\r\nimport { FlonkValidationError } from '../shared/errors';\r\nimport type {\r\n FlonkKYCOptions,\r\n WidgetInitConfig,\r\n WidgetPreviewConfig,\r\n WidgetEmbedConfig,\r\n WidgetInstance,\r\n EmbedInstance,\r\n PreviewColors,\r\n VerificationResult,\r\n} from '../shared/types';\r\nimport {\r\n generateSecondaryColor,\r\n fetchWidgetToken,\r\n fetchDesignTokens,\r\n preloadDesignTokens,\r\n fetchSessionFromServer,\r\n exchangeSessionForToken,\r\n type DesignTokens,\r\n} from './utils';\r\nimport { createIframe, adjustZIndex, transitionLoaderToIframe } from './iframe-manager';\r\nimport { prewarm as prewarmWidget, preconnect, type PrewarmLevel } from './prewarm';\r\nimport { makeLoader, loadServerLoaderScript, type WidgetLoader } from './loader';\r\nimport { addDiagnosticHandler, emitDiagnostic } from './diagnostics';\r\nimport { MessageHandler } from './message-handler';\r\nimport { setupViewportSizing } from './viewport';\r\n\r\n/** Brand color used until project design tokens resolve. */\r\nconst FALLBACK_PRIMARY = '#15BA68';\r\n\r\n/**\r\n * How long to wait for the branded color before showing the loader. Design\r\n * tokens are a lightweight Redis-cached read (~50-150ms typical); 800ms covers\r\n * slow cold starts, beyond which we paint the fallback to avoid a blank screen.\r\n */\r\nconst EARLY_COLOR_BUDGET_MS = 800;\r\n\r\nconst primaryFrom = (tokens: DesignTokens | null): string =>\r\n tokens?.colors?.primary?.cannabis || FALLBACK_PRIMARY;\r\n\r\n/**\r\n * Race the design-tokens fetch against the early-color budget, then show a\r\n * loader painted with whatever color resolved first (or the fallback). Shared\r\n * by every init flow so branding latency and behavior are uniform.\r\n */\r\nasync function showLoaderWithEarlyColor(\r\n tokensPromise: Promise<DesignTokens | null>,\r\n lang?: string,\r\n): Promise<{ loader: WidgetLoader; primaryColor: string }> {\r\n const earlyTokens = await Promise.race([\r\n tokensPromise,\r\n new Promise<null>((resolve) => setTimeout(() => resolve(null), EARLY_COLOR_BUDGET_MS)),\r\n ]);\r\n const primaryColor = primaryFrom(earlyTokens);\r\n // Prefer the server-hosted loader (loaded in the constructor); falls back to\r\n // the bundled Loader when it isn't ready (CSP, offline, not-yet-loaded).\r\n const loader = makeLoader();\r\n loader.show(primaryColor, lang);\r\n return { loader, primaryColor };\r\n}\r\n\r\nexport class FlonkKYC {\r\n static readonly version = SDK_VERSION;\r\n\r\n private readonly widgetUrl: string;\r\n private readonly apiBase: string;\r\n private disposeDiagnostics: (() => void) | null = null;\r\n\r\n constructor(options: FlonkKYCOptions = {}) {\r\n this.widgetUrl = (options.widgetUrl || DEFAULT_WIDGET_URL).replace(/\\/$/, '');\r\n this.apiBase = (options.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n // Observe SDK degradations. Registered before preconnect/loader so the very\r\n // first diagnostics (loader fallback/block) are captured. Call dispose() to\r\n // unregister if you construct many short-lived instances.\r\n if (options.onDiagnostic) this.disposeDiagnostics = addDiagnosticHandler(options.onDiagnostic);\r\n // Warm DNS/TLS to the widget origin the moment the SDK is instantiated —\r\n // effectively free, and shaves the connection setup off the first asset /\r\n // iframe fetch. Also start loading the server-hosted loader script so it's\r\n // ready by the time a loader is shown (it's restyleable without a client\r\n // bump; the bundled Loader is the fallback). SSR-safe.\r\n if (typeof document !== 'undefined') {\r\n try { preconnect(this.widgetUrl); } catch { /* best-effort */ }\r\n try { loadServerLoaderScript(this.apiBase); } catch { /* best-effort */ }\r\n }\r\n }\r\n\r\n /** Unregister this instance's `onDiagnostic` handler. */\r\n dispose(): void {\r\n this.disposeDiagnostics?.();\r\n this.disposeDiagnostics = null;\r\n }\r\n\r\n /**\r\n * Prewarm the widget ahead of the user's click — preconnect + idle prefetch\r\n * of branding/assets, and (with `level:'eager'`) a hidden background iframe so\r\n * the full bundle is loaded before the click. Call on page mount / route\r\n * enter. Returns a cleanup (removes `intent` listeners). Never pre-creates a\r\n * session. SSR-safe.\r\n *\r\n * @example\r\n * FlonkKYC.prewarm({ publishableKey: 'pk_live_…', level: 'eager' });\r\n * // or, warm only when the user shows intent:\r\n * FlonkKYC.prewarm({ publishableKey: 'pk_live_…', level: 'intent', trigger: btn });\r\n */\r\n static prewarm(opts: {\r\n publishableKey?: string;\r\n sessionId?: string;\r\n widgetUrl?: string;\r\n apiBase?: string;\r\n level?: PrewarmLevel;\r\n trigger?: Element | null;\r\n } = {}): () => void {\r\n if (typeof document === 'undefined') return () => {};\r\n return prewarmWidget({\r\n widgetUrl: (opts.widgetUrl || DEFAULT_WIDGET_URL).replace(/\\/$/, ''),\r\n apiBase: (opts.apiBase || DEFAULT_API_BASE).replace(/\\/$/, ''),\r\n publishableKey: opts.publishableKey,\r\n sessionId: opts.sessionId,\r\n level: opts.level,\r\n trigger: opts.trigger ?? null,\r\n });\r\n }\r\n\r\n /**\r\n * Warm the project's branding (colors) ahead of time so the widget paints the\r\n * brand color on the first frame, with no branding round-trip at click time.\r\n *\r\n * Call it early — on page mount, route enter, or hover of the \"verify\" button\r\n * — well before `init()`. The result is cached (module-level, 5-min TTL) and\r\n * every subsequent `init()`/`open()` for the same key reads from it. Safe to\r\n * call repeatedly; concurrent calls dedupe. Never throws.\r\n *\r\n * @example\r\n * // in a layout effect, long before the user clicks \"Verify\"\r\n * FlonkKYC.preloadBranding({ publishableKey: 'pk_live_...' });\r\n */\r\n static preloadBranding(opts: {\r\n publishableKey?: string;\r\n sessionId?: string;\r\n apiBase?: string;\r\n }): Promise<void> {\r\n const apiBase = (opts.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n return preloadDesignTokens(apiBase, {\r\n pk: opts.publishableKey,\r\n sessionId: opts.sessionId,\r\n }).then(() => undefined);\r\n }\r\n\r\n // ── Public API ───────────────────────────────────────\r\n\r\n /**\r\n * Open the KYC verification widget.\r\n *\r\n * Flows (pick one; add `publishableKey` to any for an instant branded loader):\r\n * 1. `{ serverUrl }` — SDK auto-creates the session via your backend (recommended).\r\n * 2. `{ sessionId, embedToken }` — you created the session; pass its credentials.\r\n * 3. `{ sessionId }` — **deprecated**: exchanges the sessionId for an embedToken\r\n * via an extra round-trip. Prefer flow 2 by returning `embedToken` from your\r\n * backend alongside `sessionId`.\r\n * 4. `{ publishableKey }` — client-only; SDK mints a short-lived widget token.\r\n */\r\n async init(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n if (!config) throw new FlonkValidationError('config is required');\r\n\r\n // Flow: serverUrl — SDK calls client's backend to auto-create session\r\n if (config.serverUrl) {\r\n return this.initWithServerUrl(config);\r\n }\r\n\r\n // Flow: sessionId + embedToken — direct server-to-server\r\n if (config.sessionId && config.embedToken) {\r\n return this.initWithEmbedToken(config);\r\n }\r\n\r\n // Flow: sessionId only — deprecated (extra round-trip to exchange for token)\r\n if (config.sessionId) {\r\n return this.initWithSession(config);\r\n }\r\n\r\n // Flow: publishableKey — client-side\r\n const pk = config.publishableKey;\r\n if (!pk || !/^pk_/.test(pk)) {\r\n throw new FlonkValidationError(\r\n 'Provide one of: serverUrl, sessionId + embedToken, or publishableKey (pk_*)',\r\n );\r\n }\r\n return this.initWithPublishableKey(config);\r\n }\r\n\r\n /**\r\n * Preview mode — no API calls, mock data.\r\n */\r\n preview(config: WidgetPreviewConfig = {}): WidgetInstance {\r\n const colors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n return this.openWidget({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(colors),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n lang: config.lang || 'de',\r\n overlayColor: config.overlayColor,\r\n }, {\r\n primaryColor: colors.primaryColor || '#3b82f6',\r\n lang: config.lang,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n });\r\n }\r\n\r\n /**\r\n * Embed inline preview in a container (for dashboards).\r\n */\r\n embed(config: WidgetEmbedConfig): EmbedInstance {\r\n if (!config?.container) throw new FlonkValidationError('container is required');\r\n\r\n const container =\r\n typeof config.container === 'string'\r\n ? document.querySelector<HTMLElement>(config.container)\r\n : config.container;\r\n if (!container) throw new FlonkValidationError('Container element not found');\r\n\r\n let colors: PreviewColors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n let device = config.device || 'mobile';\r\n let scale = config.scale ?? 1;\r\n const lang = config.lang || 'de';\r\n\r\n const buildSrc = (c: PreviewColors, d: string) => {\r\n const p = new URLSearchParams({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(c),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n device: d,\r\n lang,\r\n });\r\n return `${this.widgetUrl}/?${p.toString()}`;\r\n };\r\n\r\n const applyScale = () => {\r\n iframe.style.transform = scale !== 1 ? `scale(${scale})` : '';\r\n iframe.style.transformOrigin = scale !== 1 ? 'top left' : '';\r\n };\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.style.cssText = 'border:none;width:100%;height:100%;display:block';\r\n iframe.src = buildSrc(colors, device);\r\n iframe.title = 'KYC Widget Preview';\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms');\r\n applyScale();\r\n\r\n container.innerHTML = '';\r\n container.appendChild(iframe);\r\n\r\n return {\r\n iframe,\r\n setColors(newColors: Partial<PreviewColors>) {\r\n colors = { ...colors, ...newColors };\r\n if (newColors.primaryColor && !newColors.secondaryColor) {\r\n colors.secondaryColor = generateSecondaryColor(newColors.primaryColor);\r\n }\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n setDevice(d: 'mobile' | 'desktop') {\r\n device = d;\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n getColors: () => ({ ...colors }),\r\n destroy: () => iframe.remove(),\r\n };\r\n }\r\n\r\n // ── Private flows ────────────────────────────────────\r\n\r\n /**\r\n * Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.\r\n *\r\n * When `publishableKey` is provided, design tokens are fetched in parallel\r\n * with the session creation request. This shows the branded loader ~200-500ms\r\n * faster because we don't have to wait for the session to be created first.\r\n */\r\n private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey;\r\n\r\n // Kick off both requests immediately in parallel\r\n const designTokensPromise = pk\r\n ? fetchDesignTokens(this.apiBase, { pk })\r\n : Promise.resolve(null);\r\n const sessionPromise = fetchSessionFromServer(\r\n config.serverUrl!, config.clientMetadata, config.requestHeaders,\r\n );\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const [{ sessionId, embedToken, qrCodeUrl }, designTokens] = await Promise.all([\r\n sessionPromise,\r\n designTokensPromise,\r\n ]);\r\n\r\n // If pk didn't resolve tokens (no pk case), fall back to sessionId\r\n const finalTokens = designTokens ?? await fetchDesignTokens(this.apiBase, { sessionId });\r\n const finalColor = primaryFrom(finalTokens);\r\n if (finalColor !== primaryColor) loader.updateColor(finalColor);\r\n\r\n // No fetchPublicSession — the widget fetches the authoritative session\r\n // policy itself (server is the single source of truth). We do forward\r\n // qrCodeUrl if the backend returned it, so the mobile-transfer QR renders.\r\n return this.buildWidget(embedToken, sessionId, config, loader, finalTokens, qrCodeUrl);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to create session';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 2: sessionId + embedToken — fetch session data, open widget.\r\n */\r\n private async initWithEmbedToken(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey;\r\n\r\n // Kick off both requests in parallel. When a publishableKey is supplied we\r\n // resolve branding by pk (no session round-trip needed for the color), so\r\n // the loader can paint the brand color before session data arrives —\r\n // mirroring the initWithServerUrl fast path. Without a pk we fall back to\r\n // resolving tokens by sessionId.\r\n const designTokensPromise = pk\r\n ? fetchDesignTokens(this.apiBase, { pk })\r\n : fetchDesignTokens(this.apiBase, { sessionId: config.sessionId });\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const designTokens = await designTokensPromise;\r\n\r\n const finalColor = primaryFrom(designTokens);\r\n if (finalColor !== primaryColor) loader.updateColor(finalColor);\r\n\r\n // No fetchPublicSession — the widget fetches the authoritative session\r\n // policy itself (server is the single source of truth).\r\n return this.buildWidget(config.embedToken!, config.sessionId!, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 3: sessionId only — exchange for embedToken, then init.\r\n *\r\n * @deprecated Prefer flow 2 (`sessionId` + `embedToken`). Return the\r\n * `embedToken` from your backend together with the `sessionId` to skip this\r\n * extra token-exchange round-trip.\r\n */\r\n private async initWithSession(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokensPromise = fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const exchangePromise = exchangeSessionForToken(this.apiBase, config.sessionId!);\r\n\r\n const { loader } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const [{ embedToken, session }, designTokens] = await Promise.all([\r\n exchangePromise,\r\n designTokensPromise,\r\n ]);\r\n return this.buildWidget(embedToken, config.sessionId || session.id, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 4: publishableKey — fetch widget token, open widget.\r\n */\r\n private async initWithPublishableKey(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey!;\r\n const designTokensPromise = fetchDesignTokens(this.apiBase, { pk });\r\n const widgetTokenPromise = fetchWidgetToken(pk, this.apiBase);\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const data = await widgetTokenPromise;\r\n\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n publishableKey: pk,\r\n allowManualUpload: String(data.allowManualUpload !== false),\r\n };\r\n\r\n if (data.token) params.token = data.token;\r\n if (config.clientMetadata) {\r\n params.clientMetadata = JSON.stringify(config.clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor,\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n // ── Core widget builder ──────────────────────────────\r\n\r\n private buildWidget(\r\n token: string,\r\n sessionId: string,\r\n config: WidgetInitConfig,\r\n loader: WidgetLoader,\r\n designTokens: DesignTokens | null,\r\n qrCodeUrl?: string,\r\n ): WidgetInstance {\r\n\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n sessionId,\r\n token,\r\n };\r\n\r\n // The desktop→mobile QR needs this URL; the iframe reads it from the param.\r\n const qr = qrCodeUrl ?? config.qrCodeUrl;\r\n if (qr) params.qrCodeUrl = encodeURIComponent(qr);\r\n\r\n if (config.allowManualUpload !== undefined) {\r\n params.allowManualUpload = String(config.allowManualUpload !== false);\r\n }\r\n if (designTokens?.colors) {\r\n params.designTokens = JSON.stringify(designTokens);\r\n }\r\n if (config.embedToken) params.embedToken = config.embedToken;\r\n\r\n if (config.clientMetadata) {\r\n params.clientMetadata = JSON.stringify(config.clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor: primaryFrom(designTokens),\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n }\r\n\r\n /**\r\n * Core: create iframe, attach listeners, return WidgetInstance.\r\n */\r\n private openWidget(\r\n params: Record<string, string | undefined>,\r\n opts: {\r\n primaryColor: string;\r\n lang?: string;\r\n loader?: WidgetLoader;\r\n onSuccess?: (r: VerificationResult) => void;\r\n onError?: (e: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n mount?: HTMLElement;\r\n },\r\n ): WidgetInstance {\r\n // Build URL. Stamp the wire-contract version so the iframe knows which SDK\r\n // protocol it's talking to (it echoes its own back on READY).\r\n const filtered = Object.fromEntries(\r\n Object.entries(params).filter(([, v]) => v != null),\r\n ) as Record<string, string>;\r\n filtered[WIDGET_PARAMS.PROTOCOL_VERSION] = String(PROTOCOL_VERSION);\r\n const search = new URLSearchParams(filtered);\r\n const src = `${this.widgetUrl}/?${search.toString()}`;\r\n\r\n // Create iframe (always fresh today; warm-iframe reuse is a later phase).\r\n const iframe = createIframe(src);\r\n emitDiagnostic('IFRAME_FRESH', 'info', 'Built a fresh widget iframe');\r\n const mountTarget = opts.mount || document.body;\r\n\r\n // Loader z-index\r\n const loader = opts.loader ?? (() => {\r\n const l = makeLoader();\r\n l.show(opts.primaryColor, opts.lang);\r\n return l;\r\n })();\r\n\r\n if (loader.element) adjustZIndex(loader.element, iframe);\r\n mountTarget.appendChild(iframe);\r\n\r\n // Viewport sizing\r\n const cleanupViewport = setupViewportSizing(loader.element, iframe);\r\n\r\n // Shared cleanup — runs on both manual destroy() and auto-close from MessageHandler\r\n let cleaned = false;\r\n const cleanupAll = () => {\r\n if (cleaned) return;\r\n cleaned = true;\r\n try {\r\n handler.destroy();\r\n cleanupViewport();\r\n loader.destroy();\r\n if (iframe.parentNode) iframe.remove();\r\n } catch { /* noop */ }\r\n };\r\n\r\n // Always tear down on completion, even if the caller wired no callback —\r\n // otherwise an error/cancel with a missing handler would leave the widget\r\n // open forever. The user callback is invoked first when present.\r\n const afterCleanup = (delayMs: number) => setTimeout(cleanupAll, delayMs);\r\n\r\n // Message handler\r\n const handler = new MessageHandler(src, iframe, {\r\n onSuccess: (r) => { opts.onSuccess?.(r); afterCleanup(1000); },\r\n onError: (e) => { opts.onError?.(e); afterCleanup(500); },\r\n onCancel: () => { opts.onCancel?.(); afterCleanup(500); },\r\n onReady: opts.onReady,\r\n });\r\n handler.listen();\r\n\r\n // Fade the loader overlay out (revealing the already-visible iframe) on\r\n // READY — OR on a safety timeout, so a missing READY can never leave the\r\n // overlay covering the iframe forever. The iframe is never hidden, so the\r\n // worst case is a brief extra overlay, never a permanent \"stuck loader\".\r\n let revealed = false;\r\n const revealOnce = () => {\r\n if (revealed) return;\r\n revealed = true;\r\n clearTimeout(revealTimer);\r\n if (loader.element) transitionLoaderToIframe(loader.element, iframe, () => loader.destroy());\r\n };\r\n const revealTimer = setTimeout(() => {\r\n emitDiagnostic('READY_TIMEOUT_REVEAL', 'warn', 'Widget did not signal READY in time; revealing anyway');\r\n revealOnce();\r\n }, 4000);\r\n handler.onReadyOnce(revealOnce);\r\n\r\n return {\r\n iframe,\r\n destroy: cleanupAll,\r\n };\r\n }\r\n}\r\n","import { useEffect, useRef, useMemo } from 'react';\r\nimport { FlonkKYC } from './index';\r\nimport type { WidgetInitConfig, WidgetInstance, FlonkKYCOptions, VerificationResult, WidgetLanguage } from '../shared/types';\r\n\r\nexport interface FlonkKYCProps extends FlonkKYCOptions {\r\n publishableKey?: string;\r\n serverUrl?: string;\r\n sessionId?: string;\r\n embedToken?: string;\r\n clientMetadata?: Record<string, unknown>;\r\n lang?: WidgetLanguage;\r\n overlayColor?: string;\r\n allowManualUpload?: boolean;\r\n /**\r\n * Extra headers sent with the `serverUrl` POST request.\r\n * Use this to pass Authorization tokens (e.g. JWT) when your\r\n * backend requires authentication.\r\n *\r\n * @example { Authorization: 'Bearer <jwt>' }\r\n */\r\n requestHeaders?: Record<string, string>;\r\n onSuccess?: (result: VerificationResult) => void;\r\n onError?: (error: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n /** Auto-open on mount. Default: true */\r\n autoOpen?: boolean;\r\n}\r\n\r\nexport function FlonkKYCWidget({\r\n widgetUrl,\r\n apiBase,\r\n autoOpen = true,\r\n publishableKey,\r\n serverUrl,\r\n sessionId,\r\n embedToken,\r\n clientMetadata,\r\n lang,\r\n overlayColor,\r\n allowManualUpload,\r\n requestHeaders,\r\n onSuccess,\r\n onError,\r\n onCancel,\r\n onReady,\r\n}: FlonkKYCProps) {\r\n const mountRef = useRef<HTMLDivElement>(null);\r\n const widgetRef = useRef<WidgetInstance | null>(null);\r\n\r\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\r\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\r\n\r\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\r\n\r\n // Auto-warm branding on mount so the brand color is ready the moment the\r\n // widget opens — even when autoOpen is false and the user clicks later. No\r\n // extra setup required; the cached result is reused by init() below.\r\n useEffect(() => {\r\n if (!publishableKey && !sessionId) return;\r\n void FlonkKYC.preloadBranding({ publishableKey, sessionId, apiBase });\r\n }, [publishableKey, sessionId, apiBase]);\r\n\r\n // Track mount generation to ignore stale inits from StrictMode\r\n const generationRef = useRef(0);\r\n\r\n useEffect(() => {\r\n if (!autoOpen) return;\r\n\r\n const thisGeneration = ++generationRef.current;\r\n\r\n const config: WidgetInitConfig = {\r\n publishableKey,\r\n serverUrl,\r\n sessionId,\r\n embedToken,\r\n clientMetadata,\r\n lang,\r\n overlayColor,\r\n allowManualUpload,\r\n requestHeaders,\r\n mount: mountRef.current || undefined,\r\n onSuccess: (r) => callbacksRef.current.onSuccess?.(r),\r\n onError: (e) => callbacksRef.current.onError?.(e),\r\n onCancel: () => callbacksRef.current.onCancel?.(),\r\n onReady: () => callbacksRef.current.onReady?.(),\r\n };\r\n\r\n // Delay init to skip StrictMode's first mount-unmount cycle\r\n const timer = setTimeout(() => {\r\n if (generationRef.current !== thisGeneration) return;\r\n\r\n sdk.init(config)\r\n .then((instance) => {\r\n if (generationRef.current !== thisGeneration) {\r\n instance.destroy();\r\n } else {\r\n widgetRef.current = instance;\r\n }\r\n })\r\n .catch((err) => {\r\n if (generationRef.current === thisGeneration) {\r\n callbacksRef.current.onError?.((err as Error).message);\r\n }\r\n });\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(timer);\r\n widgetRef.current?.destroy();\r\n widgetRef.current = null;\r\n };\r\n // Re-init when any primitive config input changes. `clientMetadata` and\r\n // `requestHeaders` are intentionally omitted: as object props their\r\n // identity changes every render, which would re-init the widget on each\r\n // render. Memoize them on the caller side if they must trigger a re-init.\r\n }, [sdk, publishableKey, serverUrl, sessionId, embedToken, lang, overlayColor, allowManualUpload, autoOpen]);\r\n\r\n return <div ref={mountRef} />;\r\n}\r\n\r\nexport interface FlonkKYCBrandingPreloaderProps {\r\n publishableKey?: string;\r\n sessionId?: string;\r\n apiBase?: string;\r\n}\r\n\r\n/**\r\n * Invisible helper that warms the project's branding cache on mount, so the\r\n * widget paints the brand color on the first frame when the user later opens it.\r\n *\r\n * Mount it high in the tree (e.g. an authenticated layout) so branding is ready\r\n * long before the user reaches the verification screen. Renders nothing.\r\n *\r\n * @example\r\n * // app/(authed)/layout.tsx\r\n * <FlonkKYCBrandingPreloader publishableKey={process.env.NEXT_PUBLIC_FLONK_PK} />\r\n */\r\nexport function FlonkKYCBrandingPreloader({\r\n publishableKey,\r\n sessionId,\r\n apiBase,\r\n}: FlonkKYCBrandingPreloaderProps): null {\r\n useEffect(() => {\r\n void FlonkKYC.preloadBranding({ publishableKey, sessionId, apiBase });\r\n }, [publishableKey, sessionId, apiBase]);\r\n\r\n return null;\r\n}\r\n"]}
|