@flonkid/kyc 1.5.1 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/index.cjs +352 -175
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -8
- package/dist/index.d.ts +16 -8
- package/dist/index.js +352 -175
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +46 -21
- 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 +46 -21
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +8 -0
- 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.5.1';\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 [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 return window.location.origin;\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\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 fetch(`${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 const res = await fetch(url, {\r\n headers: opts.pk ? { 'x-kyc-pk': opts.pk } : {},\r\n credentials: 'omit',\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 fetch(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 fetch(`${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 fetch(`${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 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 if (type === WIDGET_EVENTS.COMPLETE && this.callbacks.onSuccess) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onSuccess(data.result);\r\n setTimeout(() => this.iframe.remove(), 1000);\r\n } else if (type === WIDGET_EVENTS.CANCEL && this.callbacks.onCancel) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onCancel();\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.ERROR && this.callbacks.onError) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onError(data.error || 'Unknown error');\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.READY && this.callbacks.onReady) {\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 (e.origin !== origin || e.data?.type !== WIDGET_EVENTS.READY) return;\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 isDesktop,\r\n setStyles,\r\n getOrigin,\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\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):\r\n * 1. `{ serverUrl }` — auto-create session via your backend (recommended)\r\n * 2. `{ sessionId, embedToken }` — server-to-server with pre-created session\r\n * 3. `{ publishableKey }` — client-side only\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 — legacy (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 /**\r\n * POST to serverUrl to get sessionId + embedToken, then same path as embed token flow.\r\n * No loader here — avoids wrong brand color before design tokens exist; initWithEmbedToken\r\n * fetches tokens first, then shows loader with project primary color.\r\n */\r\n private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n try {\r\n const { sessionId, embedToken } = await fetchSessionFromServer(\r\n config.serverUrl!,\r\n config.clientMetadata,\r\n config.requestHeaders,\r\n );\r\n return this.initWithEmbedToken({ ...config, sessionId, embedToken });\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to create session';\r\n const loader = new Loader();\r\n loader.show('#15BA68', config.lang);\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 designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const sessionData = await fetchPublicSession(\r\n this.apiBase,\r\n config.sessionId!,\r\n config.embedToken!,\r\n );\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 };\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 private async initWithSession(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const { embedToken, session } = await exchangeSessionForToken(\r\n this.apiBase,\r\n config.sessionId!,\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 designTokens = await fetchDesignTokens(this.apiBase, { pk });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const data = await fetchWidgetToken(pk, this.apiBase);\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 (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: designTokens?.colors?.primary?.cannabis || '#15BA68',\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 // Wrap callbacks to run full cleanup after user callback fires\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: opts.onSuccess\r\n ? (r) => { opts.onSuccess?.(r); afterCleanup(1000)(); }\r\n : undefined,\r\n onError: opts.onError\r\n ? (e) => { opts.onError?.(e); afterCleanup(500)(); }\r\n : undefined,\r\n onCancel: opts.onCancel\r\n ? () => { opts.onCancel?.(); afterCleanup(500)(); }\r\n : undefined,\r\n onReady: opts.onReady,\r\n });\r\n handler.listen();\r\n\r\n // Ready transition: loader → iframe\r\n handler.onReadyOnce(() => {\r\n transitionLoaderToIframe(loader.element!, iframe, () => loader.destroy());\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';\nimport { FlonkKYC } from './index';\nimport type { WidgetInitConfig, WidgetInstance, FlonkKYCOptions, VerificationResult, WidgetLanguage } from '../shared/types';\n\nexport interface FlonkKYCProps extends FlonkKYCOptions {\n publishableKey?: string;\n serverUrl?: string;\n sessionId?: string;\n embedToken?: string;\n clientMetadata?: Record<string, unknown>;\n lang?: WidgetLanguage;\n overlayColor?: string;\n allowManualUpload?: boolean;\n /**\n * Extra headers sent with the `serverUrl` POST request.\n * Use this to pass Authorization tokens (e.g. JWT) when your\n * backend requires authentication.\n *\n * @example { Authorization: 'Bearer <jwt>' }\n */\n requestHeaders?: Record<string, string>;\n onSuccess?: (result: VerificationResult) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onReady?: () => void;\n /** Auto-open on mount. Default: true */\n autoOpen?: boolean;\n}\n\nexport function FlonkKYCWidget({\n widgetUrl,\n apiBase,\n autoOpen = true,\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n requestHeaders,\n onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\n\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\n\n // Track mount generation to ignore stale inits from StrictMode\n const generationRef = useRef(0);\n\n useEffect(() => {\n if (!autoOpen) return;\n\n const thisGeneration = ++generationRef.current;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n requestHeaders,\n mount: mountRef.current || undefined,\n onSuccess: (r) => callbacksRef.current.onSuccess?.(r),\n onError: (e) => callbacksRef.current.onError?.(e),\n onCancel: () => callbacksRef.current.onCancel?.(),\n onReady: () => callbacksRef.current.onReady?.(),\n };\n\n // Delay init to skip StrictMode's first mount-unmount cycle\n const timer = setTimeout(() => {\n if (generationRef.current !== thisGeneration) return;\n\n sdk.init(config)\n .then((instance) => {\n if (generationRef.current !== thisGeneration) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n })\n .catch((err) => {\n if (generationRef.current === thisGeneration) {\n callbacksRef.current.onError?.((err as Error).message);\n }\n });\n }, 0);\n\n return () => {\n clearTimeout(timer);\n widgetRef.current?.destroy();\n widgetRef.current = null;\n };\n }, [sdk, publishableKey, serverUrl, sessionId, autoOpen]);\n\n return <div ref={mountRef} />;\n}\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":["SDK_VERSION","DEFAULT_WIDGET_URL","DEFAULT_API_BASE","WIDGET_EVENTS","READY","COMPLETE","CANCEL","ERROR","FlonkError","Error","message","code","statusCode","name","FlonkValidationError","getOrigin","url","URL","origin","window","location","isDesktop","innerWidth","navigator","maxTouchPoints","setStyles","el","styles","Object","assign","style","createEl","tag","attrs","document","createElement","k","v","entries","setAttribute","debounce","fn","ms","timer","args","clearTimeout","setTimeout","generateSecondaryColor","hex","h","replace","r","parseInt","substring","g","b","f","toHex","n","s","toString","length","Math","round","fetchWidgetToken","pk","apiBase","res","fetch","headers","credentials","ok","status","json","error","fetchDesignTokens","opts","params","sessionId","push","encodeURIComponent","clientId","join","validateServerUrl","startsWith","parsed","isLocalhost","hostname","protocol","e","includes","fetchSessionFromServer","serverUrl","clientMetadata","requestHeaders","method","body","JSON","stringify","fetchPublicSession","embedToken","exchangeSessionForToken","createIframe","src","d","iframe","border","width","height","innerHeight","position","top","left","zIndex","background","backgroundColor","opacity","visibility","borderRadius","boxShadow","colorScheme","allow","sandbox","allowtransparency","setProperty","adjustZIndex","loader","all","Array","from","querySelectorAll","maxZ","max","map","getComputedStyle","filter","z","String","transitionLoaderToIframe","onDone","dur","card","querySelector","transform","transition","LOADER_I18N","en","title","subtitle","errorTitle","close","de","uk","KEYFRAMES","trim","styleInjected","Loader","overlay","cleanup","origBodyStyles","show","primaryColor","lang","color","strings","textContent","head","appendChild","right","bottom","backdropFilter","display","alignItems","justifyContent","overflow","margin","padding","flexDirection","gap","wrap","NS","svg","createElementNS","animation","bg","cx","cy","fill","stroke","fg","transformOrigin","append","font","textBox","textAlign","fontFamily","fontWeight","fontSize","lineHeight","track","maxWidth","bar","prevW","prevH","onResize","w","abs","addEventListener","removeEventListener","element","updateColor","bgCircle","fgCircle","parentElement","showError","innerHTML","iconWrap","line1","line2","msg","wordBreak","btn","cursor","onmouseenter","onmouseleave","onclick","destroy","fadeOut","parentNode","remove","MessageHandler","iframeSrc","callbacks","listener","readyListener","completionHandled","listen","source","contentWindow","data","type","onSuccess","result","onCancel","onError","onReady","onReadyOnce","callback","getVV","visualViewport","offsetTop","offsetLeft","ensureViewportMeta","meta","m","c","getAttribute","setupViewportSizing","baselineHeight","desktop","rafId","initBaseline","vv","documentElement","clientHeight","requestAnimationFrame","applySize","inner","kbThreshold","isKeyboard","dims","prevX","prevY","debouncedApply","handleResize","x","y","changed","handleOrientation","FlonkKYC","options","widgetUrl","init","config","initWithServerUrl","initWithEmbedToken","initWithSession","publishableKey","test","initWithPublishableKey","preview","colors","secondaryColor","openWidget","mode","isPreview","previewColors","allowManualUpload","documentType","overlayColor","embed","container","device","scale","buildSrc","p","URLSearchParams","applyScale","cssText","setColors","newColors","setDevice","getColors","designTokensPromise","Promise","resolve","sessionPromise","earlyTokens","race","primary","cannabis","designTokens","finalTokens","finalColor","sessionData","session","id","qrCodeUrl","testMode","poaEnabled","poaRequired","mlAutoCaptureEnabled","mlCropEnabled","mlVerifyEnabled","buildWidget","err","token","mount","filtered","fromEntries","search","mountTarget","l","cleanupViewport","cleaned","cleanupAll","handler","afterCleanup","delayMs","undefined","version","FlonkKYCWidget","autoOpen","mountRef","useRef","widgetRef","callbacksRef","current","sdk","useMemo","generationRef","useEffect","thisGeneration","then","instance","catch","div","ref"],"mappings":"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","file":"index.js","sourcesContent":["export const SDK_VERSION = '1.6.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 return window.location.origin;\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\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 fetch(`${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 const res = await fetch(url, {\r\n headers: opts.pk ? { 'x-kyc-pk': opts.pk } : {},\r\n credentials: 'omit',\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 fetch(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 fetch(`${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 fetch(`${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 if (type === WIDGET_EVENTS.COMPLETE && this.callbacks.onSuccess) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onSuccess(data.result);\r\n setTimeout(() => this.iframe.remove(), 1000);\r\n } else if (type === WIDGET_EVENTS.CANCEL && this.callbacks.onCancel) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onCancel();\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.ERROR && this.callbacks.onError) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onError(data.error || 'Unknown error');\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.READY && this.callbacks.onReady) {\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 (e.origin !== origin || e.data?.type !== WIDGET_EVENTS.READY) return;\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 isDesktop,\r\n setStyles,\r\n getOrigin,\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\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):\r\n * 1. `{ serverUrl, publishableKey }` — auto-create session via your backend (recommended).\r\n * `publishableKey` enables instant branded loader (~200-500ms faster).\r\n * 2. `{ sessionId, embedToken }` — server-to-server with pre-created session\r\n * 3. `{ publishableKey }` — client-side only (legacy)\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 — legacy (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 // Wait up to 800ms for branded color before showing loader.\r\n // Design tokens endpoint is a lightweight Redis-cached read (~50-150ms typical).\r\n // 800ms covers slow cold starts; beyond that we show fallback to avoid blank screen.\r\n const earlyTokens = await Promise.race([\r\n designTokensPromise,\r\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 800)),\r\n ]);\r\n const primaryColor = earlyTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, 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 = finalTokens?.colors?.primary?.cannabis || '#15BA68';\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 designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const sessionData = await fetchPublicSession(\r\n this.apiBase,\r\n config.sessionId!,\r\n config.embedToken!,\r\n );\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 private async initWithSession(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const { embedToken, session } = await exchangeSessionForToken(\r\n this.apiBase,\r\n config.sessionId!,\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 designTokens = await fetchDesignTokens(this.apiBase, { pk });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const data = await fetchWidgetToken(pk, this.apiBase);\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: designTokens?.colors?.primary?.cannabis || '#15BA68',\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 // Wrap callbacks to run full cleanup after user callback fires\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: opts.onSuccess\r\n ? (r) => { opts.onSuccess?.(r); afterCleanup(1000)(); }\r\n : undefined,\r\n onError: opts.onError\r\n ? (e) => { opts.onError?.(e); afterCleanup(500)(); }\r\n : undefined,\r\n onCancel: opts.onCancel\r\n ? () => { opts.onCancel?.(); afterCleanup(500)(); }\r\n : undefined,\r\n onReady: opts.onReady,\r\n });\r\n handler.listen();\r\n\r\n // Ready transition: loader → iframe\r\n handler.onReadyOnce(() => {\r\n transitionLoaderToIframe(loader.element!, iframe, () => loader.destroy());\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';\nimport { FlonkKYC } from './index';\nimport type { WidgetInitConfig, WidgetInstance, FlonkKYCOptions, VerificationResult, WidgetLanguage } from '../shared/types';\n\nexport interface FlonkKYCProps extends FlonkKYCOptions {\n publishableKey?: string;\n serverUrl?: string;\n sessionId?: string;\n embedToken?: string;\n clientMetadata?: Record<string, unknown>;\n lang?: WidgetLanguage;\n overlayColor?: string;\n allowManualUpload?: boolean;\n /**\n * Extra headers sent with the `serverUrl` POST request.\n * Use this to pass Authorization tokens (e.g. JWT) when your\n * backend requires authentication.\n *\n * @example { Authorization: 'Bearer <jwt>' }\n */\n requestHeaders?: Record<string, string>;\n onSuccess?: (result: VerificationResult) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onReady?: () => void;\n /** Auto-open on mount. Default: true */\n autoOpen?: boolean;\n}\n\nexport function FlonkKYCWidget({\n widgetUrl,\n apiBase,\n autoOpen = true,\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n requestHeaders,\n onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\n\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\n\n // Track mount generation to ignore stale inits from StrictMode\n const generationRef = useRef(0);\n\n useEffect(() => {\n if (!autoOpen) return;\n\n const thisGeneration = ++generationRef.current;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n requestHeaders,\n mount: mountRef.current || undefined,\n onSuccess: (r) => callbacksRef.current.onSuccess?.(r),\n onError: (e) => callbacksRef.current.onError?.(e),\n onCancel: () => callbacksRef.current.onCancel?.(),\n onReady: () => callbacksRef.current.onReady?.(),\n };\n\n // Delay init to skip StrictMode's first mount-unmount cycle\n const timer = setTimeout(() => {\n if (generationRef.current !== thisGeneration) return;\n\n sdk.init(config)\n .then((instance) => {\n if (generationRef.current !== thisGeneration) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n })\n .catch((err) => {\n if (generationRef.current === thisGeneration) {\n callbacksRef.current.onError?.((err as Error).message);\n }\n });\n }, 0);\n\n return () => {\n clearTimeout(timer);\n widgetRef.current?.destroy();\n widgetRef.current = null;\n };\n }, [sdk, publishableKey, serverUrl, sessionId, autoOpen]);\n\n return <div ref={mountRef} />;\n}\n"]}
|
package/dist/server.cjs
CHANGED
|
@@ -22,39 +22,57 @@ function _interopNamespace(e) {
|
|
|
22
22
|
|
|
23
23
|
var crypto__namespace = /*#__PURE__*/_interopNamespace(crypto);
|
|
24
24
|
|
|
25
|
+
var __defProp = Object.defineProperty;
|
|
26
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
27
|
+
|
|
25
28
|
// src/shared/constants.ts
|
|
26
|
-
var SDK_VERSION = "1.
|
|
29
|
+
var SDK_VERSION = "1.6.0";
|
|
27
30
|
var DEFAULT_API_BASE = "https://api.flonk.id/v1";
|
|
28
31
|
|
|
29
32
|
// src/shared/errors.ts
|
|
30
33
|
var FlonkError = class extends Error {
|
|
34
|
+
static {
|
|
35
|
+
__name(this, "FlonkError");
|
|
36
|
+
}
|
|
37
|
+
code;
|
|
38
|
+
statusCode;
|
|
31
39
|
constructor(message, code, statusCode) {
|
|
32
|
-
super(message);
|
|
33
|
-
this.code = code;
|
|
34
|
-
this.statusCode = statusCode;
|
|
40
|
+
super(message), this.code = code, this.statusCode = statusCode;
|
|
35
41
|
this.name = "FlonkError";
|
|
36
42
|
}
|
|
37
43
|
};
|
|
38
44
|
var FlonkAPIError = class extends FlonkError {
|
|
45
|
+
static {
|
|
46
|
+
__name(this, "FlonkAPIError");
|
|
47
|
+
}
|
|
48
|
+
body;
|
|
39
49
|
constructor(message, statusCode, body) {
|
|
40
|
-
super(message, "api_error", statusCode);
|
|
41
|
-
this.body = body;
|
|
50
|
+
super(message, "api_error", statusCode), this.body = body;
|
|
42
51
|
this.name = "FlonkAPIError";
|
|
43
52
|
}
|
|
44
53
|
};
|
|
45
54
|
var FlonkAuthenticationError = class extends FlonkError {
|
|
55
|
+
static {
|
|
56
|
+
__name(this, "FlonkAuthenticationError");
|
|
57
|
+
}
|
|
46
58
|
constructor(message = "Invalid or missing secret key") {
|
|
47
59
|
super(message, "authentication_error", 401);
|
|
48
60
|
this.name = "FlonkAuthenticationError";
|
|
49
61
|
}
|
|
50
62
|
};
|
|
51
63
|
var FlonkValidationError = class extends FlonkError {
|
|
64
|
+
static {
|
|
65
|
+
__name(this, "FlonkValidationError");
|
|
66
|
+
}
|
|
52
67
|
constructor(message) {
|
|
53
68
|
super(message, "validation_error", 400);
|
|
54
69
|
this.name = "FlonkValidationError";
|
|
55
70
|
}
|
|
56
71
|
};
|
|
57
72
|
var FlonkWebhookSignatureError = class extends FlonkError {
|
|
73
|
+
static {
|
|
74
|
+
__name(this, "FlonkWebhookSignatureError");
|
|
75
|
+
}
|
|
58
76
|
constructor(message = "Invalid webhook signature") {
|
|
59
77
|
super(message, "webhook_signature_error");
|
|
60
78
|
this.name = "FlonkWebhookSignatureError";
|
|
@@ -63,6 +81,12 @@ var FlonkWebhookSignatureError = class extends FlonkError {
|
|
|
63
81
|
|
|
64
82
|
// src/server/http-client.ts
|
|
65
83
|
var HttpClient = class {
|
|
84
|
+
static {
|
|
85
|
+
__name(this, "HttpClient");
|
|
86
|
+
}
|
|
87
|
+
baseUrl;
|
|
88
|
+
secretKey;
|
|
89
|
+
timeout;
|
|
66
90
|
constructor(baseUrl, secretKey, timeout = 3e4) {
|
|
67
91
|
this.baseUrl = baseUrl;
|
|
68
92
|
this.secretKey = secretKey;
|
|
@@ -94,11 +118,7 @@ var HttpClient = class {
|
|
|
94
118
|
const json = await res.json().catch(() => null);
|
|
95
119
|
if (!res.ok) {
|
|
96
120
|
if (res.status === 401) throw new FlonkAuthenticationError();
|
|
97
|
-
throw new FlonkAPIError(
|
|
98
|
-
json?.message || `Request failed: ${res.status}`,
|
|
99
|
-
res.status,
|
|
100
|
-
json
|
|
101
|
-
);
|
|
121
|
+
throw new FlonkAPIError(json?.message || `Request failed: ${res.status}`, res.status, json);
|
|
102
122
|
}
|
|
103
123
|
return json;
|
|
104
124
|
} catch (err) {
|
|
@@ -110,9 +130,12 @@ var HttpClient = class {
|
|
|
110
130
|
}
|
|
111
131
|
};
|
|
112
132
|
var Webhooks = class {
|
|
133
|
+
static {
|
|
134
|
+
__name(this, "Webhooks");
|
|
135
|
+
}
|
|
113
136
|
/**
|
|
114
|
-
|
|
115
|
-
|
|
137
|
+
* Verify X-Signature-256 header: "sha256=<hex>"
|
|
138
|
+
*/
|
|
116
139
|
verifySignature(payload, signature, secret) {
|
|
117
140
|
const expected = "sha256=" + crypto__namespace.createHmac("sha256", secret).update(payload).digest("hex");
|
|
118
141
|
if (!this.safeEqual(signature, expected)) {
|
|
@@ -121,8 +144,8 @@ var Webhooks = class {
|
|
|
121
144
|
return this.parsePayload(payload);
|
|
122
145
|
}
|
|
123
146
|
/**
|
|
124
|
-
|
|
125
|
-
|
|
147
|
+
* Verify Stripe-like header: "t=<unix>, v1=<hex>"
|
|
148
|
+
*/
|
|
126
149
|
verifyTimestampSignature(payload, header, secret, options) {
|
|
127
150
|
const maxSkew = options?.maxSkewSeconds ?? 300;
|
|
128
151
|
const parts = this.parseHeader(header);
|
|
@@ -141,8 +164,8 @@ var Webhooks = class {
|
|
|
141
164
|
return this.parsePayload(payload);
|
|
142
165
|
}
|
|
143
166
|
/**
|
|
144
|
-
|
|
145
|
-
|
|
167
|
+
* Auto-detect signature format and verify.
|
|
168
|
+
*/
|
|
146
169
|
constructEvent(payload, signature, secret) {
|
|
147
170
|
if (signature.startsWith("sha256=")) {
|
|
148
171
|
return this.verifySignature(payload, signature, secret);
|
|
@@ -176,8 +199,13 @@ var Webhooks = class {
|
|
|
176
199
|
// src/server/index.ts
|
|
177
200
|
var SK_PATTERN = /^sk_(live|sandbox|test_sandbox|test_live)_[A-Za-z0-9]{16,}$/;
|
|
178
201
|
var FlonkKYCServer = class {
|
|
202
|
+
static {
|
|
203
|
+
__name(this, "FlonkKYCServer");
|
|
204
|
+
}
|
|
205
|
+
static version = SDK_VERSION;
|
|
206
|
+
http;
|
|
207
|
+
webhooks = new Webhooks();
|
|
179
208
|
constructor(options) {
|
|
180
|
-
this.webhooks = new Webhooks();
|
|
181
209
|
if (!options.secretKey) throw new FlonkAuthenticationError("secretKey is required");
|
|
182
210
|
if (!SK_PATTERN.test(options.secretKey)) {
|
|
183
211
|
throw new FlonkAuthenticationError("Invalid secret key format. Expected: sk_live_*, sk_sandbox_*, sk_test_sandbox_*, sk_test_live_*");
|
|
@@ -185,9 +213,6 @@ var FlonkKYCServer = class {
|
|
|
185
213
|
const base = (options.apiBase || DEFAULT_API_BASE).replace(/\/$/, "");
|
|
186
214
|
this.http = new HttpClient(base, options.secretKey, options.timeout);
|
|
187
215
|
}
|
|
188
|
-
static {
|
|
189
|
-
this.version = SDK_VERSION;
|
|
190
|
-
}
|
|
191
216
|
async createSession(params) {
|
|
192
217
|
return this.http.post("/sessions", params ?? {});
|
|
193
218
|
}
|