@flonkid/kyc 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +68 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +37 -2
- package/dist/index.d.ts +37 -2
- package/dist/index.js +68 -12
- 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/package.json +1 -1
package/dist/index.js.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/loader.ts","../src/browser/message-handler.ts","../src/browser/viewport.ts","../src/browser/index.ts","../src/browser/react.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const SDK_VERSION = '1.7.0';\r\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\r\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\r\n\r\nexport const WIDGET_EVENTS = {\r\n READY: 'KYC_WIDGET_READY',\r\n COMPLETE: 'KYC_COMPLETE',\r\n CANCEL: 'KYC_CANCEL',\r\n ERROR: 'KYC_ERROR',\r\n} as const;\r\n","export class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\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 ) {\r\n super(message, 'api_error', 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 [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\nexport async function fetchWidgetToken(\r\n pk: string,\r\n apiBase: string,\r\n): Promise<{ token: string; mode: string; allowManualUpload: boolean }> {\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}\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 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 try {\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 } catch {\r\n return null;\r\n }\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\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 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}\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 background: 'transparent',\r\n backgroundColor: 'transparent',\r\n opacity: '0',\r\n visibility: 'hidden',\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 * Transition: loader fades out, iframe fades in.\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 setStyles(iframe, { opacity: '0', visibility: 'hidden' });\r\n const card = loader.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 loader.style.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 { createEl, setStyles, isDesktop, debounce } from './utils';\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","import { WIDGET_EVENTS } from '../shared/constants';\r\nimport { getOrigin } from './utils';\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 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 } 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 fetchSessionFromServer,\r\n fetchPublicSession,\r\n exchangeSessionForToken,\r\n type DesignTokens,\r\n type PublicSessionData,\r\n} from './utils';\r\nimport { createIframe, adjustZIndex, transitionLoaderToIframe } from './iframe-manager';\r\nimport { Loader } from './loader';\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: Loader; 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 const loader = new Loader();\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\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 }\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 const sessionData = await fetchPublicSession(this.apiBase, sessionId, embedToken);\r\n const session: PublicSessionData = {\r\n id: sessionData.id,\r\n allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,\r\n clientMetadata: sessionData.clientMetadata || config.clientMetadata,\r\n qrCodeUrl: sessionData.qrCodeUrl,\r\n testMode: sessionData.testMode || false,\r\n poaEnabled: sessionData.poaEnabled || false,\r\n poaRequired: sessionData.poaRequired || false,\r\n mlAutoCaptureEnabled: sessionData.mlAutoCaptureEnabled || false,\r\n mlCropEnabled: sessionData.mlCropEnabled ?? true,\r\n mlVerifyEnabled: sessionData.mlVerifyEnabled || false,\r\n };\r\n\r\n return this.buildWidget(embedToken, session, 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 const sessionPromise = fetchPublicSession(\r\n this.apiBase,\r\n config.sessionId!,\r\n config.embedToken!,\r\n );\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const [sessionData, designTokens] = await Promise.all([\r\n sessionPromise,\r\n designTokensPromise,\r\n ]);\r\n\r\n const finalColor = primaryFrom(designTokens);\r\n if (finalColor !== primaryColor) loader.updateColor(finalColor);\r\n\r\n const session = {\r\n id: sessionData.id,\r\n allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,\r\n clientMetadata: sessionData.clientMetadata || config.clientMetadata,\r\n qrCodeUrl: sessionData.qrCodeUrl,\r\n testMode: sessionData.testMode || false,\r\n poaEnabled: sessionData.poaEnabled || false,\r\n poaRequired: sessionData.poaRequired || false,\r\n mlAutoCaptureEnabled: sessionData.mlAutoCaptureEnabled || false,\r\n mlCropEnabled: sessionData.mlCropEnabled ?? true,\r\n mlVerifyEnabled: sessionData.mlVerifyEnabled || false,\r\n };\r\n\r\n return this.buildWidget(config.embedToken!, session, 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, session, 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 session: PublicSessionData,\r\n config: WidgetInitConfig,\r\n loader: Loader,\r\n designTokens: DesignTokens | null,\r\n ): WidgetInstance {\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n sessionId: config.sessionId || session.id,\r\n token,\r\n allowManualUpload: String(session.allowManualUpload !== false),\r\n };\r\n\r\n if (session.testMode) params.testMode = 'true';\r\n if (session.poaEnabled) params.poaEnabled = 'true';\r\n if (session.poaRequired) params.poaRequired = 'true';\r\n if (session.mlAutoCaptureEnabled) params.mlAutoCaptureEnabled = 'true';\r\n if (session.mlCropEnabled !== false) params.mlCropEnabled = 'true';\r\n if (session.mlVerifyEnabled) params.mlVerifyEnabled = 'true';\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 if (session.qrCodeUrl) params.qrCodeUrl = session.qrCodeUrl;\r\n\r\n const clientMetadata = session.clientMetadata || config.clientMetadata;\r\n if (clientMetadata) {\r\n params.clientMetadata = JSON.stringify(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?: Loader;\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\r\n const filtered = Object.fromEntries(\r\n Object.entries(params).filter(([, v]) => v != null),\r\n ) as Record<string, string>;\r\n const search = new URLSearchParams(filtered);\r\n const src = `${this.widgetUrl}/?${search.toString()}`;\r\n\r\n // Create iframe\r\n const iframe = createIframe(src);\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 = new Loader();\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 // Ready transition: loader → iframe. The loader may already be gone if the\r\n // flow was torn down before READY arrived, so guard the element.\r\n handler.onReadyOnce(() => {\r\n if (loader.element) {\r\n transitionLoaderToIframe(loader.element, iframe, () => loader.destroy());\r\n }\r\n });\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 // 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/browser/utils.ts","../src/browser/iframe-manager.ts","../src/browser/loader.ts","../src/browser/message-handler.ts","../src/browser/viewport.ts","../src/browser/index.ts","../src/browser/react.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const SDK_VERSION = '1.8.0';\r\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\r\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\r\n\r\nexport const WIDGET_EVENTS = {\r\n READY: 'KYC_WIDGET_READY',\r\n COMPLETE: 'KYC_COMPLETE',\r\n CANCEL: 'KYC_CANCEL',\r\n ERROR: 'KYC_ERROR',\r\n} as const;\r\n","export class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\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 ) {\r\n super(message, 'api_error', 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 [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\nexport async function fetchWidgetToken(\r\n pk: string,\r\n apiBase: string,\r\n): Promise<{ token: string; mode: string; allowManualUpload: boolean }> {\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}\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\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 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}\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 background: 'transparent',\r\n backgroundColor: 'transparent',\r\n opacity: '0',\r\n visibility: 'hidden',\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 * Transition: loader fades out, iframe fades in.\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 setStyles(iframe, { opacity: '0', visibility: 'hidden' });\r\n const card = loader.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 loader.style.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 { createEl, setStyles, isDesktop, debounce } from './utils';\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","import { WIDGET_EVENTS } from '../shared/constants';\r\nimport { getOrigin } from './utils';\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 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 } 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 fetchPublicSession,\r\n exchangeSessionForToken,\r\n type DesignTokens,\r\n type PublicSessionData,\r\n} from './utils';\r\nimport { createIframe, adjustZIndex, transitionLoaderToIframe } from './iframe-manager';\r\nimport { Loader } from './loader';\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: Loader; 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 const loader = new Loader();\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\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 }\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 const sessionData = await fetchPublicSession(this.apiBase, sessionId, embedToken);\r\n const session: PublicSessionData = {\r\n id: sessionData.id,\r\n allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,\r\n clientMetadata: sessionData.clientMetadata || config.clientMetadata,\r\n qrCodeUrl: sessionData.qrCodeUrl,\r\n testMode: sessionData.testMode || false,\r\n poaEnabled: sessionData.poaEnabled || false,\r\n poaRequired: sessionData.poaRequired || false,\r\n mlAutoCaptureEnabled: sessionData.mlAutoCaptureEnabled || false,\r\n mlCropEnabled: sessionData.mlCropEnabled ?? true,\r\n mlVerifyEnabled: sessionData.mlVerifyEnabled || false,\r\n };\r\n\r\n return this.buildWidget(embedToken, session, 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 const sessionPromise = fetchPublicSession(\r\n this.apiBase,\r\n config.sessionId!,\r\n config.embedToken!,\r\n );\r\n\r\n const { loader, primaryColor } = await showLoaderWithEarlyColor(designTokensPromise, config.lang);\r\n\r\n try {\r\n const [sessionData, designTokens] = await Promise.all([\r\n sessionPromise,\r\n designTokensPromise,\r\n ]);\r\n\r\n const finalColor = primaryFrom(designTokens);\r\n if (finalColor !== primaryColor) loader.updateColor(finalColor);\r\n\r\n const session = {\r\n id: sessionData.id,\r\n allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,\r\n clientMetadata: sessionData.clientMetadata || config.clientMetadata,\r\n qrCodeUrl: sessionData.qrCodeUrl,\r\n testMode: sessionData.testMode || false,\r\n poaEnabled: sessionData.poaEnabled || false,\r\n poaRequired: sessionData.poaRequired || false,\r\n mlAutoCaptureEnabled: sessionData.mlAutoCaptureEnabled || false,\r\n mlCropEnabled: sessionData.mlCropEnabled ?? true,\r\n mlVerifyEnabled: sessionData.mlVerifyEnabled || false,\r\n };\r\n\r\n return this.buildWidget(config.embedToken!, session, 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, session, 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 session: PublicSessionData,\r\n config: WidgetInitConfig,\r\n loader: Loader,\r\n designTokens: DesignTokens | null,\r\n ): WidgetInstance {\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n sessionId: config.sessionId || session.id,\r\n token,\r\n allowManualUpload: String(session.allowManualUpload !== false),\r\n };\r\n\r\n if (session.testMode) params.testMode = 'true';\r\n if (session.poaEnabled) params.poaEnabled = 'true';\r\n if (session.poaRequired) params.poaRequired = 'true';\r\n if (session.mlAutoCaptureEnabled) params.mlAutoCaptureEnabled = 'true';\r\n if (session.mlCropEnabled !== false) params.mlCropEnabled = 'true';\r\n if (session.mlVerifyEnabled) params.mlVerifyEnabled = 'true';\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 if (session.qrCodeUrl) params.qrCodeUrl = session.qrCodeUrl;\r\n\r\n const clientMetadata = session.clientMetadata || config.clientMetadata;\r\n if (clientMetadata) {\r\n params.clientMetadata = JSON.stringify(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?: Loader;\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\r\n const filtered = Object.fromEntries(\r\n Object.entries(params).filter(([, v]) => v != null),\r\n ) as Record<string, string>;\r\n const search = new URLSearchParams(filtered);\r\n const src = `${this.widgetUrl}/?${search.toString()}`;\r\n\r\n // Create iframe\r\n const iframe = createIframe(src);\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 = new Loader();\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 // Ready transition: loader → iframe. The loader may already be gone if the\r\n // flow was torn down before READY arrived, so guard the element.\r\n handler.onReadyOnce(() => {\r\n if (loader.element) {\r\n transitionLoaderToIframe(loader.element, iframe, () => loader.destroy());\r\n }\r\n });\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"]}
|
package/dist/server.cjs
CHANGED
|
@@ -23,7 +23,7 @@ function _interopNamespace(e) {
|
|
|
23
23
|
var crypto__namespace = /*#__PURE__*/_interopNamespace(crypto);
|
|
24
24
|
|
|
25
25
|
// src/shared/constants.ts
|
|
26
|
-
var SDK_VERSION = "1.
|
|
26
|
+
var SDK_VERSION = "1.8.0";
|
|
27
27
|
var DEFAULT_API_BASE = "https://api.flonk.id/v1";
|
|
28
28
|
|
|
29
29
|
// src/shared/errors.ts
|
package/dist/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/server/http-client.ts","../src/server/webhooks.ts","../src/server/index.ts"],"names":["crypto"],"mappings":"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","file":"server.cjs","sourcesContent":["export const SDK_VERSION = '1.7.0';\r\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\r\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\r\n\r\nexport const WIDGET_EVENTS = {\r\n READY: 'KYC_WIDGET_READY',\r\n COMPLETE: 'KYC_COMPLETE',\r\n CANCEL: 'KYC_CANCEL',\r\n ERROR: 'KYC_ERROR',\r\n} as const;\r\n","export class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\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 ) {\r\n super(message, 'api_error', 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","import { SDK_VERSION } from '../shared/constants';\r\nimport { FlonkAPIError, FlonkAuthenticationError } from '../shared/errors';\r\n\r\nexport class HttpClient {\r\n constructor(\r\n private readonly baseUrl: string,\r\n private readonly secretKey: string,\r\n private readonly timeout = 30_000,\r\n ) {}\r\n\r\n async get<T>(path: string): Promise<T> {\r\n return this.request<T>('GET', path);\r\n }\r\n\r\n async post<T>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>('POST', path, body);\r\n }\r\n\r\n async patch<T>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>('PATCH', path, body);\r\n }\r\n\r\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method,\r\n headers: {\r\n 'Authorization': `Bearer ${this.secretKey}`,\r\n 'Content-Type': 'application/json',\r\n 'User-Agent': `flonk-kyc-node/${SDK_VERSION}`,\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n const json = await res.json().catch(() => null);\r\n\r\n if (!res.ok) {\r\n if (res.status === 401) throw new FlonkAuthenticationError();\r\n throw new FlonkAPIError(\r\n json?.message || `Request failed: ${res.status}`,\r\n res.status,\r\n json,\r\n );\r\n }\r\n\r\n return json as T;\r\n } catch (err) {\r\n if (err instanceof FlonkAPIError || err instanceof FlonkAuthenticationError) throw err;\r\n throw new FlonkAPIError((err as Error).message, 0);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n}\r\n","import * as crypto from 'crypto';\r\nimport { FlonkWebhookSignatureError } from '../shared/errors';\r\nimport type { WebhookEvent, WebhookVerifyOptions } from '../shared/types';\r\n\r\nexport class Webhooks {\r\n /**\r\n * Verify X-Signature-256 header: \"sha256=<hex>\"\r\n */\r\n verifySignature(payload: string, signature: string, secret: string): WebhookEvent {\r\n const expected =\r\n 'sha256=' + crypto.createHmac('sha256', secret).update(payload).digest('hex');\r\n\r\n if (!this.safeEqual(signature, expected)) {\r\n throw new FlonkWebhookSignatureError();\r\n }\r\n\r\n return this.parsePayload(payload);\r\n }\r\n\r\n /**\r\n * Verify Stripe-like header: \"t=<unix>, v1=<hex>\"\r\n */\r\n verifyTimestampSignature(\r\n payload: string,\r\n header: string,\r\n secret: string,\r\n options?: WebhookVerifyOptions,\r\n ): WebhookEvent {\r\n const maxSkew = options?.maxSkewSeconds ?? 300;\r\n const parts = this.parseHeader(header);\r\n const ts = Number(parts['t']);\r\n const v1 = parts['v1'];\r\n\r\n if (!ts || !v1) {\r\n throw new FlonkWebhookSignatureError('Missing timestamp or signature');\r\n }\r\n\r\n if (Math.abs(Math.floor(Date.now() / 1000) - ts) > maxSkew) {\r\n throw new FlonkWebhookSignatureError(`Timestamp skew exceeds ${maxSkew}s`);\r\n }\r\n\r\n const expected = crypto\r\n .createHmac('sha256', secret)\r\n .update(`${ts}.${payload}`)\r\n .digest('hex');\r\n\r\n if (!this.safeEqual(v1, expected)) {\r\n throw new FlonkWebhookSignatureError();\r\n }\r\n\r\n return this.parsePayload(payload);\r\n }\r\n\r\n /**\r\n * Auto-detect signature format and verify.\r\n */\r\n constructEvent(payload: string, signature: string, secret: string): WebhookEvent {\r\n if (signature.startsWith('sha256=')) {\r\n return this.verifySignature(payload, signature, secret);\r\n }\r\n if (signature.includes('t=') && signature.includes('v1=')) {\r\n return this.verifyTimestampSignature(payload, signature, secret);\r\n }\r\n throw new FlonkWebhookSignatureError('Unrecognized signature format');\r\n }\r\n\r\n private parsePayload(payload: string): WebhookEvent {\r\n try {\r\n return JSON.parse(payload) as WebhookEvent;\r\n } catch {\r\n throw new FlonkWebhookSignatureError('Malformed JSON payload');\r\n }\r\n }\r\n\r\n private parseHeader(header: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n for (const part of header.split(',')) {\r\n const [k, v] = part.trim().split('=');\r\n if (k && v) result[k] = v;\r\n }\r\n return result;\r\n }\r\n\r\n private safeEqual(a: string, b: string): boolean {\r\n if (a.length !== b.length) return false;\r\n return crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));\r\n }\r\n}\r\n","import { SDK_VERSION, DEFAULT_API_BASE } from '../shared/constants';\r\nimport { FlonkAuthenticationError, FlonkValidationError } from '../shared/errors';\r\nimport type {\r\n FlonkKYCServerOptions,\r\n CreateSessionParams,\r\n Session,\r\n SessionDetails,\r\n UpdateSessionParams,\r\n} from '../shared/types';\r\nimport { HttpClient } from './http-client';\r\nimport { Webhooks } from './webhooks';\r\n\r\nconst SK_PATTERN = /^sk_(live|sandbox|test_sandbox|test_live)_[A-Za-z0-9]{16,}$/;\r\n\r\nexport class FlonkKYCServer {\r\n static readonly version = SDK_VERSION;\r\n\r\n private readonly http: HttpClient;\r\n public readonly webhooks = new Webhooks();\r\n\r\n constructor(options: FlonkKYCServerOptions) {\r\n if (!options.secretKey) throw new FlonkAuthenticationError('secretKey is required');\r\n if (!SK_PATTERN.test(options.secretKey)) {\r\n throw new FlonkAuthenticationError('Invalid secret key format. Expected: sk_live_*, sk_sandbox_*, sk_test_sandbox_*, sk_test_live_*');\r\n }\r\n\r\n const base = (options.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n this.http = new HttpClient(base, options.secretKey, options.timeout);\r\n }\r\n\r\n async createSession(params?: CreateSessionParams): Promise<Session> {\r\n return this.http.post<Session>('/sessions', params ?? {});\r\n }\r\n\r\n async getSession(sessionId: string): Promise<SessionDetails> {\r\n if (!sessionId) throw new FlonkValidationError('sessionId is required');\r\n return this.http.get<SessionDetails>(`/sessions/${sessionId}`);\r\n }\r\n\r\n async updateSession(sessionId: string, params: UpdateSessionParams): Promise<SessionDetails> {\r\n if (!sessionId) throw new FlonkValidationError('sessionId is required');\r\n return this.http.patch<SessionDetails>(`/sessions/${sessionId}`, params);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/server/http-client.ts","../src/server/webhooks.ts","../src/server/index.ts"],"names":["crypto"],"mappings":"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","file":"server.cjs","sourcesContent":["export const SDK_VERSION = '1.8.0';\r\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\r\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\r\n\r\nexport const WIDGET_EVENTS = {\r\n READY: 'KYC_WIDGET_READY',\r\n COMPLETE: 'KYC_COMPLETE',\r\n CANCEL: 'KYC_CANCEL',\r\n ERROR: 'KYC_ERROR',\r\n} as const;\r\n","export class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\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 ) {\r\n super(message, 'api_error', 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","import { SDK_VERSION } from '../shared/constants';\r\nimport { FlonkAPIError, FlonkAuthenticationError } from '../shared/errors';\r\n\r\nexport class HttpClient {\r\n constructor(\r\n private readonly baseUrl: string,\r\n private readonly secretKey: string,\r\n private readonly timeout = 30_000,\r\n ) {}\r\n\r\n async get<T>(path: string): Promise<T> {\r\n return this.request<T>('GET', path);\r\n }\r\n\r\n async post<T>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>('POST', path, body);\r\n }\r\n\r\n async patch<T>(path: string, body?: unknown): Promise<T> {\r\n return this.request<T>('PATCH', path, body);\r\n }\r\n\r\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method,\r\n headers: {\r\n 'Authorization': `Bearer ${this.secretKey}`,\r\n 'Content-Type': 'application/json',\r\n 'User-Agent': `flonk-kyc-node/${SDK_VERSION}`,\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n const json = await res.json().catch(() => null);\r\n\r\n if (!res.ok) {\r\n if (res.status === 401) throw new FlonkAuthenticationError();\r\n throw new FlonkAPIError(\r\n json?.message || `Request failed: ${res.status}`,\r\n res.status,\r\n json,\r\n );\r\n }\r\n\r\n return json as T;\r\n } catch (err) {\r\n if (err instanceof FlonkAPIError || err instanceof FlonkAuthenticationError) throw err;\r\n throw new FlonkAPIError((err as Error).message, 0);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n}\r\n","import * as crypto from 'crypto';\r\nimport { FlonkWebhookSignatureError } from '../shared/errors';\r\nimport type { WebhookEvent, WebhookVerifyOptions } from '../shared/types';\r\n\r\nexport class Webhooks {\r\n /**\r\n * Verify X-Signature-256 header: \"sha256=<hex>\"\r\n */\r\n verifySignature(payload: string, signature: string, secret: string): WebhookEvent {\r\n const expected =\r\n 'sha256=' + crypto.createHmac('sha256', secret).update(payload).digest('hex');\r\n\r\n if (!this.safeEqual(signature, expected)) {\r\n throw new FlonkWebhookSignatureError();\r\n }\r\n\r\n return this.parsePayload(payload);\r\n }\r\n\r\n /**\r\n * Verify Stripe-like header: \"t=<unix>, v1=<hex>\"\r\n */\r\n verifyTimestampSignature(\r\n payload: string,\r\n header: string,\r\n secret: string,\r\n options?: WebhookVerifyOptions,\r\n ): WebhookEvent {\r\n const maxSkew = options?.maxSkewSeconds ?? 300;\r\n const parts = this.parseHeader(header);\r\n const ts = Number(parts['t']);\r\n const v1 = parts['v1'];\r\n\r\n if (!ts || !v1) {\r\n throw new FlonkWebhookSignatureError('Missing timestamp or signature');\r\n }\r\n\r\n if (Math.abs(Math.floor(Date.now() / 1000) - ts) > maxSkew) {\r\n throw new FlonkWebhookSignatureError(`Timestamp skew exceeds ${maxSkew}s`);\r\n }\r\n\r\n const expected = crypto\r\n .createHmac('sha256', secret)\r\n .update(`${ts}.${payload}`)\r\n .digest('hex');\r\n\r\n if (!this.safeEqual(v1, expected)) {\r\n throw new FlonkWebhookSignatureError();\r\n }\r\n\r\n return this.parsePayload(payload);\r\n }\r\n\r\n /**\r\n * Auto-detect signature format and verify.\r\n */\r\n constructEvent(payload: string, signature: string, secret: string): WebhookEvent {\r\n if (signature.startsWith('sha256=')) {\r\n return this.verifySignature(payload, signature, secret);\r\n }\r\n if (signature.includes('t=') && signature.includes('v1=')) {\r\n return this.verifyTimestampSignature(payload, signature, secret);\r\n }\r\n throw new FlonkWebhookSignatureError('Unrecognized signature format');\r\n }\r\n\r\n private parsePayload(payload: string): WebhookEvent {\r\n try {\r\n return JSON.parse(payload) as WebhookEvent;\r\n } catch {\r\n throw new FlonkWebhookSignatureError('Malformed JSON payload');\r\n }\r\n }\r\n\r\n private parseHeader(header: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n for (const part of header.split(',')) {\r\n const [k, v] = part.trim().split('=');\r\n if (k && v) result[k] = v;\r\n }\r\n return result;\r\n }\r\n\r\n private safeEqual(a: string, b: string): boolean {\r\n if (a.length !== b.length) return false;\r\n return crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));\r\n }\r\n}\r\n","import { SDK_VERSION, DEFAULT_API_BASE } from '../shared/constants';\r\nimport { FlonkAuthenticationError, FlonkValidationError } from '../shared/errors';\r\nimport type {\r\n FlonkKYCServerOptions,\r\n CreateSessionParams,\r\n Session,\r\n SessionDetails,\r\n UpdateSessionParams,\r\n} from '../shared/types';\r\nimport { HttpClient } from './http-client';\r\nimport { Webhooks } from './webhooks';\r\n\r\nconst SK_PATTERN = /^sk_(live|sandbox|test_sandbox|test_live)_[A-Za-z0-9]{16,}$/;\r\n\r\nexport class FlonkKYCServer {\r\n static readonly version = SDK_VERSION;\r\n\r\n private readonly http: HttpClient;\r\n public readonly webhooks = new Webhooks();\r\n\r\n constructor(options: FlonkKYCServerOptions) {\r\n if (!options.secretKey) throw new FlonkAuthenticationError('secretKey is required');\r\n if (!SK_PATTERN.test(options.secretKey)) {\r\n throw new FlonkAuthenticationError('Invalid secret key format. Expected: sk_live_*, sk_sandbox_*, sk_test_sandbox_*, sk_test_live_*');\r\n }\r\n\r\n const base = (options.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n this.http = new HttpClient(base, options.secretKey, options.timeout);\r\n }\r\n\r\n async createSession(params?: CreateSessionParams): Promise<Session> {\r\n return this.http.post<Session>('/sessions', params ?? {});\r\n }\r\n\r\n async getSession(sessionId: string): Promise<SessionDetails> {\r\n if (!sessionId) throw new FlonkValidationError('sessionId is required');\r\n return this.http.get<SessionDetails>(`/sessions/${sessionId}`);\r\n }\r\n\r\n async updateSession(sessionId: string, params: UpdateSessionParams): Promise<SessionDetails> {\r\n if (!sessionId) throw new FlonkValidationError('sessionId is required');\r\n return this.http.patch<SessionDetails>(`/sessions/${sessionId}`, params);\r\n }\r\n}\r\n"]}
|
package/dist/server.d.cts
CHANGED
package/dist/server.d.ts
CHANGED