/** * Loads `aaf_sdk.js` when `window.AmeyoClient` is not already provided by the GWT parent. * * **Same resolution order as Omni** (`loadOmniSdk.ts`): optional `sdkBaseUrl`, then `origin` query * param, then `window.location.origin` — so the script request appears in Network even when the * iframe URL has no `origin=` (typical GWT slot: only `instanceId`, etc.). * * Static path matches **background-app** / ECC war: `/app/build/sdk/1.0.0/aaf_sdk.js` * * If your ECC mounts the webapp under a path (e.g. `/ameyo40`) and the SDK is not at * `{origin}/app/build/...`, pass **`?sdkBaseUrl=https://host:port/ameyo40`** (or `?origin=...`). */ function getQueryParam(name: string): string | null { const v = new URLSearchParams(window.location.search).get(name); return v === null || v.trim() === "" ? null : v.trim(); } /** Ameyo webapp root used to build the absolute SDK script URL. */ export function getAafSdkBaseUrl(): string { const base = getQueryParam("sdkBaseUrl") ?? getQueryParam("origin") ?? window.location.origin; return String(base).replace(/\/+$/, ""); } export function getAafSdkScriptUrl(): string { return `${getAafSdkBaseUrl()}/app/build/sdk/1.0.0/aaf_sdk.js`; } function hasAmeyoClient(): boolean { return Boolean(window.AmeyoClient && typeof window.AmeyoClient.init === "function"); } /** * Resolves when `window.AmeyoClient.init` is usable — already present, or after injecting * `aaf_sdk.js` from {@link getAafSdkScriptUrl}. */ export function ensureAafSdkLoaded(): Promise { if (hasAmeyoClient()) { return Promise.resolve(); } const src = getAafSdkScriptUrl(); for (const el of Array.from(document.querySelectorAll("script[src]"))) { const sc = el as HTMLScriptElement; if (!sc.src.includes("aaf_sdk.js")) continue; if (hasAmeyoClient()) return Promise.resolve(); return new Promise((resolve, reject) => { const finish = () => { if (hasAmeyoClient()) resolve(); else reject(new Error("aaf_sdk.js present but window.AmeyoClient.init is still missing")); }; if (sc.readyState === "complete" || sc.readyState === "loaded") { finish(); return; } sc.addEventListener("load", finish); sc.addEventListener("error", () => reject(new Error(`Failed to load ${sc.src || src}`))); }); } return new Promise((resolve, reject) => { const script = document.createElement("script"); script.async = true; script.src = src; script.addEventListener("load", () => { if (hasAmeyoClient()) resolve(); else reject( new Error( `aaf_sdk.js loaded from ${src} but AmeyoClient.init missing — try ?sdkBaseUrl= with your ECC webapp root (e.g. …/ameyo40).` ) ); }); script.addEventListener("error", () => { reject( new Error( `Failed to load aaf_sdk.js from ${src}. Set ?sdkBaseUrl= or ?origin= to the Ameyo base URL that serves /app/build/sdk/1.0.0/.` ) ); }); document.body.appendChild(script); }); }