@flonkid/kyc 1.4.0 → 1.4.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/dist/index.cjs +86 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +86 -34
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -80,7 +80,15 @@ async function fetchWidgetToken(pk, apiBase) {
|
|
|
80
80
|
headers: { "x-kyc-pk": pk },
|
|
81
81
|
credentials: "include"
|
|
82
82
|
});
|
|
83
|
-
if (!res.ok)
|
|
83
|
+
if (!res.ok) {
|
|
84
|
+
let message = `Widget token request failed (${res.status})`;
|
|
85
|
+
try {
|
|
86
|
+
const b = await res.json();
|
|
87
|
+
message = b.error || b.message || message;
|
|
88
|
+
} catch {
|
|
89
|
+
}
|
|
90
|
+
throw new Error(message);
|
|
91
|
+
}
|
|
84
92
|
return res.json();
|
|
85
93
|
}
|
|
86
94
|
async function fetchDesignTokens(apiBase, opts) {
|
|
@@ -120,7 +128,16 @@ async function fetchSessionFromServer(serverUrl, clientMetadata) {
|
|
|
120
128
|
headers: { "Content-Type": "application/json" },
|
|
121
129
|
body: JSON.stringify({ clientMetadata })
|
|
122
130
|
});
|
|
123
|
-
if (!res.ok)
|
|
131
|
+
if (!res.ok) {
|
|
132
|
+
let message = `Session request failed (${res.status})`;
|
|
133
|
+
try {
|
|
134
|
+
const body = await res.json();
|
|
135
|
+
if (body.error) message = body.error;
|
|
136
|
+
else if (body.message) message = body.message;
|
|
137
|
+
} catch {
|
|
138
|
+
}
|
|
139
|
+
throw new Error(message);
|
|
140
|
+
}
|
|
124
141
|
return res.json();
|
|
125
142
|
}
|
|
126
143
|
async function fetchPublicSession(apiBase, sessionId, embedToken) {
|
|
@@ -130,7 +147,15 @@ async function fetchPublicSession(apiBase, sessionId, embedToken) {
|
|
|
130
147
|
"Authorization": `Bearer ${embedToken}`
|
|
131
148
|
}
|
|
132
149
|
});
|
|
133
|
-
if (!res.ok)
|
|
150
|
+
if (!res.ok) {
|
|
151
|
+
let message = `Failed to fetch session (${res.status})`;
|
|
152
|
+
try {
|
|
153
|
+
const b = await res.json();
|
|
154
|
+
message = b.error || b.message || message;
|
|
155
|
+
} catch {
|
|
156
|
+
}
|
|
157
|
+
throw new Error(message);
|
|
158
|
+
}
|
|
134
159
|
return res.json();
|
|
135
160
|
}
|
|
136
161
|
async function exchangeSessionForToken(apiBase, sessionId) {
|
|
@@ -138,7 +163,15 @@ async function exchangeSessionForToken(apiBase, sessionId) {
|
|
|
138
163
|
method: "POST",
|
|
139
164
|
headers: { "Content-Type": "application/json" }
|
|
140
165
|
});
|
|
141
|
-
if (!res.ok)
|
|
166
|
+
if (!res.ok) {
|
|
167
|
+
let message = `Token exchange failed (${res.status})`;
|
|
168
|
+
try {
|
|
169
|
+
const b = await res.json();
|
|
170
|
+
message = b.error || b.message || message;
|
|
171
|
+
} catch {
|
|
172
|
+
}
|
|
173
|
+
throw new Error(message);
|
|
174
|
+
}
|
|
142
175
|
return res.json();
|
|
143
176
|
}
|
|
144
177
|
|
|
@@ -737,11 +770,21 @@ var FlonkKYC = class {
|
|
|
737
770
|
* Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.
|
|
738
771
|
*/
|
|
739
772
|
async initWithServerUrl(config) {
|
|
740
|
-
const
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
773
|
+
const loader = new Loader();
|
|
774
|
+
loader.show("#15BA68", config.lang);
|
|
775
|
+
try {
|
|
776
|
+
const { sessionId, embedToken } = await fetchSessionFromServer(
|
|
777
|
+
config.serverUrl,
|
|
778
|
+
config.clientMetadata
|
|
779
|
+
);
|
|
780
|
+
loader.destroy();
|
|
781
|
+
return this.initWithEmbedToken({ ...config, sessionId, embedToken });
|
|
782
|
+
} catch (err) {
|
|
783
|
+
const msg = err.message || "Failed to create session";
|
|
784
|
+
loader.showError(msg, config.lang);
|
|
785
|
+
config.onError?.(msg);
|
|
786
|
+
throw err;
|
|
787
|
+
}
|
|
745
788
|
}
|
|
746
789
|
/**
|
|
747
790
|
* Flow 2: sessionId + embedToken — fetch session data, open widget.
|
|
@@ -949,38 +992,47 @@ function FlonkKYCWidget({
|
|
|
949
992
|
const mountRef = react.useRef(null);
|
|
950
993
|
const widgetRef = react.useRef(null);
|
|
951
994
|
const destroyedRef = react.useRef(false);
|
|
995
|
+
const initPromiseRef = react.useRef(null);
|
|
952
996
|
const callbacksRef = react.useRef({ onSuccess, onError, onCancel, onReady });
|
|
953
997
|
callbacksRef.current = { onSuccess, onError, onCancel, onReady };
|
|
954
998
|
const sdk = react.useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);
|
|
955
999
|
react.useEffect(() => {
|
|
956
1000
|
if (!autoOpen) return;
|
|
1001
|
+
const prev = initPromiseRef.current;
|
|
957
1002
|
destroyedRef.current = false;
|
|
958
|
-
const
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
1003
|
+
const run = async () => {
|
|
1004
|
+
if (prev) await prev.catch(() => {
|
|
1005
|
+
});
|
|
1006
|
+
if (destroyedRef.current) return;
|
|
1007
|
+
const config = {
|
|
1008
|
+
publishableKey,
|
|
1009
|
+
serverUrl,
|
|
1010
|
+
sessionId,
|
|
1011
|
+
embedToken,
|
|
1012
|
+
clientMetadata,
|
|
1013
|
+
lang,
|
|
1014
|
+
overlayColor,
|
|
1015
|
+
allowManualUpload,
|
|
1016
|
+
mount: mountRef.current || void 0,
|
|
1017
|
+
onSuccess: (r) => callbacksRef.current.onSuccess?.(r),
|
|
1018
|
+
onError: (e) => callbacksRef.current.onError?.(e),
|
|
1019
|
+
onCancel: () => callbacksRef.current.onCancel?.(),
|
|
1020
|
+
onReady: () => callbacksRef.current.onReady?.()
|
|
1021
|
+
};
|
|
1022
|
+
try {
|
|
1023
|
+
const instance = await sdk.init(config);
|
|
1024
|
+
if (destroyedRef.current) {
|
|
1025
|
+
instance.destroy();
|
|
1026
|
+
} else {
|
|
1027
|
+
widgetRef.current = instance;
|
|
1028
|
+
}
|
|
1029
|
+
} catch (err) {
|
|
1030
|
+
if (!destroyedRef.current) {
|
|
1031
|
+
callbacksRef.current.onError?.(err.message);
|
|
1032
|
+
}
|
|
982
1033
|
}
|
|
983
|
-
}
|
|
1034
|
+
};
|
|
1035
|
+
initPromiseRef.current = run();
|
|
984
1036
|
return () => {
|
|
985
1037
|
destroyedRef.current = true;
|
|
986
1038
|
widgetRef.current?.destroy();
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/browser/utils.ts","../src/browser/iframe-manager.ts","../src/browser/loader.ts","../src/browser/message-handler.ts","../src/browser/viewport.ts","../src/browser/index.ts","../src/browser/react.tsx"],"names":["useRef","useMemo","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["export const SDK_VERSION = '1.4.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 [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) throw new Error(`Widget token request failed: ${res.status}`);\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): 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' },\r\n body: JSON.stringify({ clientMetadata }),\r\n });\r\n if (!res.ok) throw new Error(`Server session request failed: ${res.status}`);\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) throw new Error(`Failed to fetch session: ${res.status}`);\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) throw new Error(`Token exchange failed: ${res.status}`);\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 private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const { sessionId, embedToken } = await fetchSessionFromServer(\r\n config.serverUrl!,\r\n config.clientMetadata,\r\n );\r\n return this.initWithEmbedToken({ ...config, sessionId, embedToken });\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 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 onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n const destroyedRef = useRef(false);\n\n // Callbacks in ref — always fresh, never trigger re-init\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\n\n // Stable SDK instance — recreate only when host URLs change\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\n\n useEffect(() => {\n if (!autoOpen) return;\n destroyedRef.current = false;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\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 sdk.init(config)\n .then((instance) => {\n if (destroyedRef.current) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n })\n .catch((err) => {\n if (!destroyedRef.current) {\n callbacksRef.current.onError?.(err.message);\n }\n });\n\n return () => {\n destroyedRef.current = true;\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":["useRef","useMemo","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["export const SDK_VERSION = '1.4.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 [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): 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' },\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 private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const loader = new Loader();\r\n loader.show('#15BA68', config.lang);\r\n\r\n try {\r\n const { sessionId, embedToken } = await fetchSessionFromServer(\r\n config.serverUrl!,\r\n config.clientMetadata,\r\n );\r\n loader.destroy();\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 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 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 onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n const destroyedRef = useRef(false);\n const initPromiseRef = useRef<Promise<void> | 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 useEffect(() => {\n if (!autoOpen) return;\n\n // StrictMode guard: wait for previous init to cleanup before starting new one\n const prev = initPromiseRef.current;\n destroyedRef.current = false;\n\n const run = async () => {\n if (prev) await prev.catch(() => {});\n\n if (destroyedRef.current) return;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\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 try {\n const instance = await sdk.init(config);\n if (destroyedRef.current) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n } catch (err) {\n if (!destroyedRef.current) {\n callbacksRef.current.onError?.((err as Error).message);\n }\n }\n };\n\n initPromiseRef.current = run();\n\n return () => {\n destroyedRef.current = true;\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/index.js
CHANGED
|
@@ -78,7 +78,15 @@ async function fetchWidgetToken(pk, apiBase) {
|
|
|
78
78
|
headers: { "x-kyc-pk": pk },
|
|
79
79
|
credentials: "include"
|
|
80
80
|
});
|
|
81
|
-
if (!res.ok)
|
|
81
|
+
if (!res.ok) {
|
|
82
|
+
let message = `Widget token request failed (${res.status})`;
|
|
83
|
+
try {
|
|
84
|
+
const b = await res.json();
|
|
85
|
+
message = b.error || b.message || message;
|
|
86
|
+
} catch {
|
|
87
|
+
}
|
|
88
|
+
throw new Error(message);
|
|
89
|
+
}
|
|
82
90
|
return res.json();
|
|
83
91
|
}
|
|
84
92
|
async function fetchDesignTokens(apiBase, opts) {
|
|
@@ -118,7 +126,16 @@ async function fetchSessionFromServer(serverUrl, clientMetadata) {
|
|
|
118
126
|
headers: { "Content-Type": "application/json" },
|
|
119
127
|
body: JSON.stringify({ clientMetadata })
|
|
120
128
|
});
|
|
121
|
-
if (!res.ok)
|
|
129
|
+
if (!res.ok) {
|
|
130
|
+
let message = `Session request failed (${res.status})`;
|
|
131
|
+
try {
|
|
132
|
+
const body = await res.json();
|
|
133
|
+
if (body.error) message = body.error;
|
|
134
|
+
else if (body.message) message = body.message;
|
|
135
|
+
} catch {
|
|
136
|
+
}
|
|
137
|
+
throw new Error(message);
|
|
138
|
+
}
|
|
122
139
|
return res.json();
|
|
123
140
|
}
|
|
124
141
|
async function fetchPublicSession(apiBase, sessionId, embedToken) {
|
|
@@ -128,7 +145,15 @@ async function fetchPublicSession(apiBase, sessionId, embedToken) {
|
|
|
128
145
|
"Authorization": `Bearer ${embedToken}`
|
|
129
146
|
}
|
|
130
147
|
});
|
|
131
|
-
if (!res.ok)
|
|
148
|
+
if (!res.ok) {
|
|
149
|
+
let message = `Failed to fetch session (${res.status})`;
|
|
150
|
+
try {
|
|
151
|
+
const b = await res.json();
|
|
152
|
+
message = b.error || b.message || message;
|
|
153
|
+
} catch {
|
|
154
|
+
}
|
|
155
|
+
throw new Error(message);
|
|
156
|
+
}
|
|
132
157
|
return res.json();
|
|
133
158
|
}
|
|
134
159
|
async function exchangeSessionForToken(apiBase, sessionId) {
|
|
@@ -136,7 +161,15 @@ async function exchangeSessionForToken(apiBase, sessionId) {
|
|
|
136
161
|
method: "POST",
|
|
137
162
|
headers: { "Content-Type": "application/json" }
|
|
138
163
|
});
|
|
139
|
-
if (!res.ok)
|
|
164
|
+
if (!res.ok) {
|
|
165
|
+
let message = `Token exchange failed (${res.status})`;
|
|
166
|
+
try {
|
|
167
|
+
const b = await res.json();
|
|
168
|
+
message = b.error || b.message || message;
|
|
169
|
+
} catch {
|
|
170
|
+
}
|
|
171
|
+
throw new Error(message);
|
|
172
|
+
}
|
|
140
173
|
return res.json();
|
|
141
174
|
}
|
|
142
175
|
|
|
@@ -735,11 +768,21 @@ var FlonkKYC = class {
|
|
|
735
768
|
* Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.
|
|
736
769
|
*/
|
|
737
770
|
async initWithServerUrl(config) {
|
|
738
|
-
const
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
771
|
+
const loader = new Loader();
|
|
772
|
+
loader.show("#15BA68", config.lang);
|
|
773
|
+
try {
|
|
774
|
+
const { sessionId, embedToken } = await fetchSessionFromServer(
|
|
775
|
+
config.serverUrl,
|
|
776
|
+
config.clientMetadata
|
|
777
|
+
);
|
|
778
|
+
loader.destroy();
|
|
779
|
+
return this.initWithEmbedToken({ ...config, sessionId, embedToken });
|
|
780
|
+
} catch (err) {
|
|
781
|
+
const msg = err.message || "Failed to create session";
|
|
782
|
+
loader.showError(msg, config.lang);
|
|
783
|
+
config.onError?.(msg);
|
|
784
|
+
throw err;
|
|
785
|
+
}
|
|
743
786
|
}
|
|
744
787
|
/**
|
|
745
788
|
* Flow 2: sessionId + embedToken — fetch session data, open widget.
|
|
@@ -947,38 +990,47 @@ function FlonkKYCWidget({
|
|
|
947
990
|
const mountRef = useRef(null);
|
|
948
991
|
const widgetRef = useRef(null);
|
|
949
992
|
const destroyedRef = useRef(false);
|
|
993
|
+
const initPromiseRef = useRef(null);
|
|
950
994
|
const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });
|
|
951
995
|
callbacksRef.current = { onSuccess, onError, onCancel, onReady };
|
|
952
996
|
const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);
|
|
953
997
|
useEffect(() => {
|
|
954
998
|
if (!autoOpen) return;
|
|
999
|
+
const prev = initPromiseRef.current;
|
|
955
1000
|
destroyedRef.current = false;
|
|
956
|
-
const
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
1001
|
+
const run = async () => {
|
|
1002
|
+
if (prev) await prev.catch(() => {
|
|
1003
|
+
});
|
|
1004
|
+
if (destroyedRef.current) return;
|
|
1005
|
+
const config = {
|
|
1006
|
+
publishableKey,
|
|
1007
|
+
serverUrl,
|
|
1008
|
+
sessionId,
|
|
1009
|
+
embedToken,
|
|
1010
|
+
clientMetadata,
|
|
1011
|
+
lang,
|
|
1012
|
+
overlayColor,
|
|
1013
|
+
allowManualUpload,
|
|
1014
|
+
mount: mountRef.current || void 0,
|
|
1015
|
+
onSuccess: (r) => callbacksRef.current.onSuccess?.(r),
|
|
1016
|
+
onError: (e) => callbacksRef.current.onError?.(e),
|
|
1017
|
+
onCancel: () => callbacksRef.current.onCancel?.(),
|
|
1018
|
+
onReady: () => callbacksRef.current.onReady?.()
|
|
1019
|
+
};
|
|
1020
|
+
try {
|
|
1021
|
+
const instance = await sdk.init(config);
|
|
1022
|
+
if (destroyedRef.current) {
|
|
1023
|
+
instance.destroy();
|
|
1024
|
+
} else {
|
|
1025
|
+
widgetRef.current = instance;
|
|
1026
|
+
}
|
|
1027
|
+
} catch (err) {
|
|
1028
|
+
if (!destroyedRef.current) {
|
|
1029
|
+
callbacksRef.current.onError?.(err.message);
|
|
1030
|
+
}
|
|
980
1031
|
}
|
|
981
|
-
}
|
|
1032
|
+
};
|
|
1033
|
+
initPromiseRef.current = run();
|
|
982
1034
|
return () => {
|
|
983
1035
|
destroyedRef.current = true;
|
|
984
1036
|
widgetRef.current?.destroy();
|
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.4.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 [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) throw new Error(`Widget token request failed: ${res.status}`);\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): 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' },\r\n body: JSON.stringify({ clientMetadata }),\r\n });\r\n if (!res.ok) throw new Error(`Server session request failed: ${res.status}`);\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) throw new Error(`Failed to fetch session: ${res.status}`);\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) throw new Error(`Token exchange failed: ${res.status}`);\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 private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const { sessionId, embedToken } = await fetchSessionFromServer(\r\n config.serverUrl!,\r\n config.clientMetadata,\r\n );\r\n return this.initWithEmbedToken({ ...config, sessionId, embedToken });\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 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 onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n const destroyedRef = useRef(false);\n\n // Callbacks in ref — always fresh, never trigger re-init\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\n\n // Stable SDK instance — recreate only when host URLs change\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\n\n useEffect(() => {\n if (!autoOpen) return;\n destroyedRef.current = false;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\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 sdk.init(config)\n .then((instance) => {\n if (destroyedRef.current) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n })\n .catch((err) => {\n if (!destroyedRef.current) {\n callbacksRef.current.onError?.(err.message);\n }\n });\n\n return () => {\n destroyedRef.current = true;\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":[],"mappings":"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","file":"index.js","sourcesContent":["export const SDK_VERSION = '1.4.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 [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): 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' },\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 private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const loader = new Loader();\r\n loader.show('#15BA68', config.lang);\r\n\r\n try {\r\n const { sessionId, embedToken } = await fetchSessionFromServer(\r\n config.serverUrl!,\r\n config.clientMetadata,\r\n );\r\n loader.destroy();\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 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 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 onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n const destroyedRef = useRef(false);\n const initPromiseRef = useRef<Promise<void> | 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 useEffect(() => {\n if (!autoOpen) return;\n\n // StrictMode guard: wait for previous init to cleanup before starting new one\n const prev = initPromiseRef.current;\n destroyedRef.current = false;\n\n const run = async () => {\n if (prev) await prev.catch(() => {});\n\n if (destroyedRef.current) return;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\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 try {\n const instance = await sdk.init(config);\n if (destroyedRef.current) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n } catch (err) {\n if (!destroyedRef.current) {\n callbacksRef.current.onError?.((err as Error).message);\n }\n }\n };\n\n initPromiseRef.current = run();\n\n return () => {\n destroyedRef.current = true;\n widgetRef.current?.destroy();\n widgetRef.current = null;\n };\n }, [sdk, publishableKey, serverUrl, sessionId, autoOpen]);\n\n return <div ref={mountRef} />;\n}\n"]}
|
package/package.json
CHANGED