@coxwave/tap-sdk 0.3.5 → 0.3.7
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.global.js +1 -1
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -3
package/dist/index.global.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var TapKit=(function(){'use strict';var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader
|
|
1
|
+
var TapKit=(function(){'use strict';var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader.js";function O(){return typeof window<"u"&&window.__TAP_KIT_LOADER_URL__?window.__TAP_KIT_LOADER_URL__:E}function C(){return typeof window<"u"&&!!window.__TAP_KIT_CORE_URL__}function m(){return window.__TAP_KIT_CORE_URL__||""}function u(n,e,i){let o=Date.now(),t=()=>{if(window.TapKit&&window.TapKitLoaded===true){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,n();return}if(Date.now()-o>i){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader timeout: SDK not available after ${i}ms`));return}typeof requestIdleCallback<"u"?requestIdleCallback(t,{timeout:500}):setTimeout(t,500);};return t}function A(n=4e3){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let e=new Promise((i,o)=>{if(typeof document>"u"){o(new Error("TapKit requires browser environment (document is undefined)"));return}if(C()){let d=m(),s=document.createElement("script");s.src=d,s.async=true,s.onload=()=>{window.TapKit?(window.TapKitLoaded=true,window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,i()):(window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error("TapKit not available after loading local core")));},s.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load local TapKit core: ${d}`));},document.head.appendChild(s);return}let t=O(),a=document.createElement("script");a.src=t,a.async=true,a.onload=()=>{u(i,o,n)();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load TapKit CDN loader: ${t}`));};let l=document.querySelector(`script[src="${t}"]`);l?(l.addEventListener("load",()=>{u(i,o,n)();}),l.addEventListener("error",()=>o(new Error(`Failed to load TapKit CDN loader: ${t}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=e,e}var K=Symbol.for("tapkit.#config"),r,_,f=class{constructor(e){T(this,"instance",null);p(this,r);p(this,_);T(this,"pendingConfig");w(this,_,e),w(this,r,this.load());}async load(){try{await A();}catch(e){throw e}if(!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this.instance=new window.TapKit(c(this,_)),this.pendingConfig&&(this.instance[K]?.(this.pendingConfig),this.pendingConfig=void 0);}get ready(){return c(this,r).then(()=>{if(!this.instance)throw new Error("TapKit instance not initialized");return this.instance.ready})}get events(){if(!this.instance)throw new Error("TapKit not loaded yet. Use await sdk.ready first.");return this.instance.events}get isOpen(){return this.instance?.isOpen??false}get isInitialized(){return this.instance?.isInitialized??false}async init(e){await c(this,r),await this.instance.init(e);}destroy(){this.instance&&(this.instance.destroy(),this.instance=null);}[K](e){if(!this.instance){this.pendingConfig=e;return}this.instance[K]?.(e);}get[Symbol.toStringTag](){return "TapKit"}};r=new WeakMap,_=new WeakMap;
|
|
2
2
|
return f;})();//# sourceMappingURL=index.global.js.map
|
|
3
3
|
//# sourceMappingURL=index.global.js.map
|
package/dist/index.global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"ugBAgBA,IAAMA,CAAAA,CAAyB,gDAAA,CAO/B,SAASC,CAAAA,EAAuB,CAC9B,OAAO,OAAO,MAAA,CAAW,GAAA,EAAe,MAAA,CAAO,sBAAA,CAC3C,MAAA,CAAO,sBAAA,CACPD,CACN,CAOA,SAASE,CAAAA,EAA2B,CAClC,OAAO,OAAO,MAAA,CAAW,GAAA,EAAe,CAAC,CAAC,MAAA,CAAO,oBACnD,CAKA,SAASC,CAAAA,EAA0B,CACjC,OAAO,MAAA,CAAO,oBAAA,EAAwB,EACxC,CAUA,SAASC,CAAAA,CACPC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAErBC,CAAAA,CAAW,IAAY,CAG3B,GAAI,MAAA,CAAO,MAAA,EAAU,MAAA,CAAO,YAAA,GAAiB,IAAA,CAAM,CACjD,MAAA,CAAO,yBAAA,CAA4B,IAAA,CACnC,MAAA,CAAO,0BAAA,CAA6B,MAAA,CACpCJ,CAAAA,EAAQ,CACR,MACF,CAKA,GAHgB,IAAA,CAAK,GAAA,EAAI,CAAIG,CAAAA,CAGfD,CAAAA,CAAW,CACvB,MAAA,CAAO,0BAAA,CAA6B,MAAA,CACpCD,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkDC,CAAS,CAAA,EAAA,CAAI,CAAC,CAAA,CACjF,MACF,CAII,OAAO,mBAAA,CAAwB,GAAA,CACjC,mBAAA,CAAoBE,CAAAA,CAAU,CAAE,OAAA,CAAS,GAAyB,CAAC,CAAA,CAEnE,UAAA,CAAWA,CAAAA,CAAU,GAAwB,EAEjD,CAAA,CAEA,OAAOA,CACT,CAYO,SAASC,CAAAA,CAAcH,CAAAA,CAAoB,GAAA,CAAmC,CAEnF,GAAI,MAAA,CAAO,yBAAA,EAA6B,MAAA,CAAO,MAAA,CAC7C,OAAO,OAAA,CAAQ,OAAA,EAAQ,CAIzB,GAAI,MAAA,CAAO,0BAAA,CACT,OAAO,MAAA,CAAO,0BAAA,CAIhB,IAAMI,CAAAA,CAAiB,IAAI,OAAA,CAAc,CAACN,CAAAA,CAASC,CAAAA,GAAW,CAC5D,GAAI,OAAO,QAAA,CAAa,GAAA,CAAa,CACnCA,CAAAA,CAAO,IAAI,KAAA,CAAM,6DAA6D,CAAC,CAAA,CAC/E,MACF,CAGA,GAAIJ,CAAAA,EAAgB,CAAG,CACrB,IAAMU,CAAAA,CAAUT,CAAAA,EAAgB,CAG1BU,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CA,CAAAA,CAAO,GAAA,CAAMD,CAAAA,CACbC,CAAAA,CAAO,KAAA,CAAQ,IAAA,CAEfA,CAAAA,CAAO,MAAA,CAAS,IAAM,CAGhB,MAAA,CAAO,MAAA,EACT,MAAA,CAAO,YAAA,CAAe,IAAA,CACtB,MAAA,CAAO,yBAAA,CAA4B,IAAA,CACnC,MAAA,CAAO,0BAAA,CAA6B,MAAA,CAEpCR,CAAAA,EAAQ,GAER,MAAA,CAAO,0BAAA,CAA6B,MAAA,CACpCC,CAAAA,CAAO,IAAI,KAAA,CAAM,+CAA+C,CAAC,CAAA,EAErE,CAAA,CAEAO,CAAAA,CAAO,OAAA,CAAU,IAAM,CACrB,MAAA,CAAO,0BAAA,CAA6B,MAAA,CACpCP,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqCM,CAAO,CAAA,CAAE,CAAC,EAClE,CAAA,CAEA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYC,CAAM,CAAA,CAChC,MACF,CAGA,IAAMC,CAAAA,CAAYb,CAAAA,EAAa,CACzBY,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CA,CAAAA,CAAO,GAAA,CAAMC,CAAAA,CACbD,CAAAA,CAAO,KAAA,CAAQ,IAAA,CAEfA,CAAAA,CAAO,MAAA,CAAS,IAAM,CAGHT,CAAAA,CAAiBC,CAAAA,CAASC,CAAAA,CAAQC,CAAS,CAAA,GAE9D,CAAA,CAEAM,CAAAA,CAAO,OAAA,CAAU,IAAM,CACrB,MAAA,CAAO,0BAAA,CAA6B,MAAA,CACpCP,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqCQ,CAAS,CAAA,CAAE,CAAC,EACpE,CAAA,CAGA,IAAMC,CAAAA,CAAiB,QAAA,CAAS,aAAA,CAAc,CAAA,YAAA,EAAeD,CAAS,CAAA,EAAA,CAAI,CAAA,CAEtEC,CAAAA,EAEFA,CAAAA,CAAe,gBAAA,CAAiB,MAAA,CAAQ,IAAM,CAC3BX,CAAAA,CAAiBC,CAAAA,CAASC,CAAAA,CAAQC,CAAS,CAAA,GAE9D,CAAC,CAAA,CACDQ,CAAAA,CAAe,gBAAA,CAAiB,OAAA,CAAS,IACvCT,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqCQ,CAAS,CAAA,CAAE,CAAC,CACpE,CAAA,EAEA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYD,CAAM,EAEpC,CAAC,CAAA,CAED,OAAA,MAAA,CAAO,0BAAA,CAA6BF,CAAAA,CAC7BA,CACT,CCnLA,IAAMK,CAAAA,CAAyD,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,CAV1FC,CAAAA,CAAAC,CAAAA,CAoCaC,CAAAA,CAAN,KAAuC,CAM5C,WAAA,CAAYC,CAAAA,CAAsB,CALlCC,CAAAA,CAAA,IAAA,CAAQ,UAAA,CAAkC,IAAA,CAAA,CAC1CC,CAAAA,CAAA,IAAA,CAAAL,CAAAA,CAAAA,CACAK,CAAAA,CAAA,IAAA,CAAAJ,CAAAA,CAAAA,CACAG,CAAAA,CAAA,IAAA,CAAQ,eAAA,CAAA,CAGNE,CAAAA,CAAA,IAAA,CAAKL,CAAAA,CAAUE,CAAAA,CAAAA,CACfG,CAAAA,CAAA,IAAA,CAAKN,CAAAA,CAAW,IAAA,CAAK,IAAA,EAAK,EAC5B,CAEA,MAAc,IAAA,EAAsB,CAGlC,GAAI,CACF,MAAMP,CAAAA,GAER,CAAA,MAASc,CAAAA,CAAK,CAEZ,MAAMA,CACR,CAEA,GAAI,CAAC,MAAA,CAAO,MAAA,CAEV,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAIjE,IAAA,CAAK,QAAA,CAAW,IAAI,MAAA,CAAO,MAAA,CAAOC,CAAAA,CAAA,IAAA,CAAKP,CAAAA,CAAO,CAAA,CAI1C,IAAA,CAAK,aAAA,GAEP,IAAA,CAAK,QAAA,CAASF,CAAoB,CAAA,GAAI,IAAA,CAAK,aAAa,CAAA,CACxD,IAAA,CAAK,aAAA,CAAgB,MAAA,EAEzB,CAEA,IAAI,KAAA,EAAuB,CACzB,OAAOS,CAAAA,CAAA,IAAA,CAAKR,CAAAA,CAAAA,CAAS,IAAA,CAAK,IAAM,CAC9B,GAAI,CAAC,IAAA,CAAK,QAAA,CACR,MAAM,IAAI,KAAA,CAAM,iCAAiC,CAAA,CAEnD,OAAO,IAAA,CAAK,QAAA,CAAS,KACvB,CAAC,CACH,CAEA,IAAI,MAAA,EAAS,CACX,GAAI,CAAC,IAAA,CAAK,QAAA,CACR,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAErE,OAAO,IAAA,CAAK,QAAA,CAAS,MACvB,CAEA,IAAI,MAAA,EAAkB,CACpB,OAAO,IAAA,CAAK,QAAA,EAAU,MAAA,EAAU,KAClC,CAEA,IAAI,aAAA,EAAyB,CAC3B,OAAO,IAAA,CAAK,QAAA,EAAU,aAAA,EAAiB,KACzC,CAEA,MAAM,IAAA,CAAKS,CAAAA,CAAyC,CAClD,MAAMD,CAAAA,CAAA,IAAA,CAAKR,CAAAA,CAAAA,CACX,MAAM,IAAA,CAAK,QAAA,CAAU,IAAA,CAAKS,CAAM,EAClC,CAEA,OAAA,EAAgB,CACV,IAAA,CAAK,QAAA,GACP,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ,CACtB,IAAA,CAAK,QAAA,CAAW,IAAA,EAEpB,CAEA,CAACV,CAAoB,CAAA,CAAEW,CAAAA,CAAoC,CACzD,GAAI,CAAC,IAAA,CAAK,QAAA,CAAU,CAGlB,IAAA,CAAK,aAAA,CAAgBA,CAAAA,CACrB,MACF,CACA,IAAA,CAAK,QAAA,CAASX,CAAoB,CAAA,GAAIW,CAAO,EAC/C,CAEA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAI,CACzB,OAAO,QACT,CACF,EAtFEV,CAAAA,CAAA,IAAA,OAAA,CACAC,CAAAA,CAAA,IAAA,OAAA","file":"index.global.js","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.global.js","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader
|
|
1
|
+
'use strict';var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader.js";function O(){return typeof window<"u"&&window.__TAP_KIT_LOADER_URL__?window.__TAP_KIT_LOADER_URL__:E}function C(){return typeof window<"u"&&!!window.__TAP_KIT_CORE_URL__}function m(){return window.__TAP_KIT_CORE_URL__||""}function u(n,e,i){let o=Date.now(),t=()=>{if(window.TapKit&&window.TapKitLoaded===true){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,n();return}if(Date.now()-o>i){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader timeout: SDK not available after ${i}ms`));return}typeof requestIdleCallback<"u"?requestIdleCallback(t,{timeout:500}):setTimeout(t,500);};return t}function A(n=4e3){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let e=new Promise((i,o)=>{if(typeof document>"u"){o(new Error("TapKit requires browser environment (document is undefined)"));return}if(C()){let d=m(),s=document.createElement("script");s.src=d,s.async=true,s.onload=()=>{window.TapKit?(window.TapKitLoaded=true,window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,i()):(window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error("TapKit not available after loading local core")));},s.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load local TapKit core: ${d}`));},document.head.appendChild(s);return}let t=O(),a=document.createElement("script");a.src=t,a.async=true,a.onload=()=>{u(i,o,n)();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load TapKit CDN loader: ${t}`));};let l=document.querySelector(`script[src="${t}"]`);l?(l.addEventListener("load",()=>{u(i,o,n)();}),l.addEventListener("error",()=>o(new Error(`Failed to load TapKit CDN loader: ${t}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=e,e}var K=Symbol.for("tapkit.#config"),r,_,f=class{constructor(e){T(this,"instance",null);p(this,r);p(this,_);T(this,"pendingConfig");w(this,_,e),w(this,r,this.load());}async load(){try{await A();}catch(e){throw e}if(!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this.instance=new window.TapKit(c(this,_)),this.pendingConfig&&(this.instance[K]?.(this.pendingConfig),this.pendingConfig=void 0);}get ready(){return c(this,r).then(()=>{if(!this.instance)throw new Error("TapKit instance not initialized");return this.instance.ready})}get events(){if(!this.instance)throw new Error("TapKit not loaded yet. Use await sdk.ready first.");return this.instance.events}get isOpen(){return this.instance?.isOpen??false}get isInitialized(){return this.instance?.isInitialized??false}async init(e){await c(this,r),await this.instance.init(e);}destroy(){this.instance&&(this.instance.destroy(),this.instance=null);}[K](e){if(!this.instance){this.pendingConfig=e;return}this.instance[K]?.(e);}get[Symbol.toStringTag](){return "TapKit"}};r=new WeakMap,_=new WeakMap;
|
|
2
2
|
module.exports=f;//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader
|
|
1
|
+
var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader.js";function O(){return typeof window<"u"&&window.__TAP_KIT_LOADER_URL__?window.__TAP_KIT_LOADER_URL__:E}function C(){return typeof window<"u"&&!!window.__TAP_KIT_CORE_URL__}function m(){return window.__TAP_KIT_CORE_URL__||""}function u(n,e,i){let o=Date.now(),t=()=>{if(window.TapKit&&window.TapKitLoaded===true){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,n();return}if(Date.now()-o>i){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader timeout: SDK not available after ${i}ms`));return}typeof requestIdleCallback<"u"?requestIdleCallback(t,{timeout:500}):setTimeout(t,500);};return t}function A(n=4e3){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let e=new Promise((i,o)=>{if(typeof document>"u"){o(new Error("TapKit requires browser environment (document is undefined)"));return}if(C()){let d=m(),s=document.createElement("script");s.src=d,s.async=true,s.onload=()=>{window.TapKit?(window.TapKitLoaded=true,window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,i()):(window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error("TapKit not available after loading local core")));},s.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load local TapKit core: ${d}`));},document.head.appendChild(s);return}let t=O(),a=document.createElement("script");a.src=t,a.async=true,a.onload=()=>{u(i,o,n)();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load TapKit CDN loader: ${t}`));};let l=document.querySelector(`script[src="${t}"]`);l?(l.addEventListener("load",()=>{u(i,o,n)();}),l.addEventListener("error",()=>o(new Error(`Failed to load TapKit CDN loader: ${t}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=e,e}var K=Symbol.for("tapkit.#config"),r,_,f=class{constructor(e){T(this,"instance",null);p(this,r);p(this,_);T(this,"pendingConfig");w(this,_,e),w(this,r,this.load());}async load(){try{await A();}catch(e){throw e}if(!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this.instance=new window.TapKit(c(this,_)),this.pendingConfig&&(this.instance[K]?.(this.pendingConfig),this.pendingConfig=void 0);}get ready(){return c(this,r).then(()=>{if(!this.instance)throw new Error("TapKit instance not initialized");return this.instance.ready})}get events(){if(!this.instance)throw new Error("TapKit not loaded yet. Use await sdk.ready first.");return this.instance.events}get isOpen(){return this.instance?.isOpen??false}get isInitialized(){return this.instance?.isInitialized??false}async init(e){await c(this,r),await this.instance.init(e);}destroy(){this.instance&&(this.instance.destroy(),this.instance=null);}[K](e){if(!this.instance){this.pendingConfig=e;return}this.instance[K]?.(e);}get[Symbol.toStringTag](){return "TapKit"}};r=new WeakMap,_=new WeakMap;
|
|
2
2
|
export{f as default};//# sourceMappingURL=index.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coxwave/tap-sdk",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "TapSDK - Minimal wrapper that loads TapSDK from CDN",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"tsup": "^8.5.0",
|
|
36
|
-
"@coxwave/config-
|
|
37
|
-
"@coxwave/config-
|
|
36
|
+
"@coxwave/config-typescript": "1.0.0",
|
|
37
|
+
"@coxwave/config-eslint": "1.0.0"
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
40
|
"build": "tsup",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"build:analyze": "tsup --metafile",
|
|
43
43
|
"dev": "tsup --watch",
|
|
44
44
|
"lint": "eslint .",
|
|
45
|
+
"version:demo": "npm version prerelease --preid=demo --no-git-tag-version",
|
|
45
46
|
"publish:npm": "./scripts/publish.sh",
|
|
46
47
|
"publish:npm:demo": "DEMO=true ./scripts/publish.sh"
|
|
47
48
|
}
|