@coxwave/tap-sdk 0.1.0 → 0.2.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.d.cts CHANGED
@@ -70,6 +70,7 @@ interface TapSDKInstance {
70
70
  isInitialized: boolean;
71
71
  init(params: TapSDKInitParams): Promise<void>;
72
72
  destroy(): void;
73
+ getVersion(): string;
73
74
  initChat(params: TapSDKInitParams): Promise<void>;
74
75
  postChatInfo(params: {
75
76
  clipId: string;
@@ -106,6 +107,7 @@ declare class TapSDK implements TapSDKInstance {
106
107
  get isInitialized(): boolean;
107
108
  init(params: TapSDKInitParams): Promise<void>;
108
109
  destroy(): void;
110
+ getVersion(): string;
109
111
  initChat(params: TapSDKInitParams): Promise<void>;
110
112
  postChatInfo(params: {
111
113
  clipId: string;
@@ -116,4 +118,4 @@ declare class TapSDK implements TapSDKInstance {
116
118
  }): Promise<void>;
117
119
  }
118
120
 
119
- export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, TapSDK, type TapSDKConfig, type TapSDKConstructor, type TapSDKInitParams, type TapSDKInstance, TapSDK as default };
121
+ export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapSDKInstance as TapSDK, type TapSDKConfig, type TapSDKConstructor, type TapSDKInitParams, type TapSDKInstance, TapSDK as default };
package/dist/index.d.ts CHANGED
@@ -70,6 +70,7 @@ interface TapSDKInstance {
70
70
  isInitialized: boolean;
71
71
  init(params: TapSDKInitParams): Promise<void>;
72
72
  destroy(): void;
73
+ getVersion(): string;
73
74
  initChat(params: TapSDKInitParams): Promise<void>;
74
75
  postChatInfo(params: {
75
76
  clipId: string;
@@ -106,6 +107,7 @@ declare class TapSDK implements TapSDKInstance {
106
107
  get isInitialized(): boolean;
107
108
  init(params: TapSDKInitParams): Promise<void>;
108
109
  destroy(): void;
110
+ getVersion(): string;
109
111
  initChat(params: TapSDKInitParams): Promise<void>;
110
112
  postChatInfo(params: {
111
113
  clipId: string;
@@ -116,4 +118,4 @@ declare class TapSDK implements TapSDKInstance {
116
118
  }): Promise<void>;
117
119
  }
118
120
 
119
- export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, TapSDK, type TapSDKConfig, type TapSDKConstructor, type TapSDKInitParams, type TapSDKInstance, TapSDK as default };
121
+ export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapSDKInstance as TapSDK, type TapSDKConfig, type TapSDKConstructor, type TapSDKInitParams, type TapSDKInstance, TapSDK as default };
@@ -1,3 +1,3 @@
1
- var TapSDK=(function(exports){'use strict';var p=Object.defineProperty;var l=(i,e,n)=>e in i?p(i,e,{enumerable:true,configurable:true,writable:true,value:n}):i[e]=n;var t=(i,e,n)=>l(i,typeof e!="symbol"?e+"":e,n);var s="https://files.edutap.ai/tap-sdk/loader.js";function c(){if(window.__TAP_SDK_LOADER_LOADED__&&window.TapSDK)return Promise.resolve();if(window.__TAP_SDK_LOADER_LOADING__)return window.__TAP_SDK_LOADER_LOADING__;let i=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapSDK requires browser environment (document is undefined)"));return}let o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapSDK?(window.__TAP_SDK_LOADER_LOADED__=true,window.__TAP_SDK_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_SDK_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapSDK CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapSDK?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>n(new Error(`Failed to load TapSDK CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_SDK_LOADER_LOADING__=i,i}var r=class{constructor(e){t(this,"config");t(this,"sdkInstance");t(this,"loadPromise");this.config=e,this.loadPromise=this.loadAndInitialize();}async loadAndInitialize(){if(await c(),!window.TapSDK)throw new Error("TapSDK not available after loading CDN loader");this.sdkInstance=new window.TapSDK(this.config);}async ensureLoaded(){if(await this.loadPromise,!this.sdkInstance)throw new Error("TapSDK instance not initialized");return this.sdkInstance}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e));}}}get isOpen(){return this.sdkInstance?.isOpen??false}get isInitialized(){return this.sdkInstance?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this.sdkInstance&&this.sdkInstance.destroy();}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},D=r;
2
- exports.TapSDK=r;exports.default=D;Object.defineProperty(exports,'__esModule',{value:true});return exports;})({});//# sourceMappingURL=index.global.js.map
1
+ var TapSDK=(function(){'use strict';var p=Object.defineProperty;var l=(i,e,n)=>e in i?p(i,e,{enumerable:true,configurable:true,writable:true,value:n}):i[e]=n;var t=(i,e,n)=>l(i,typeof e!="symbol"?e+"":e,n);var s="https://files.edutap.ai/tap-sdk/loader.js";function c(){if(window.__TAP_SDK_LOADER_LOADED__&&window.TapSDK)return Promise.resolve();if(window.__TAP_SDK_LOADER_LOADING__)return window.__TAP_SDK_LOADER_LOADING__;let i=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapSDK requires browser environment (document is undefined)"));return}let o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapSDK?(window.__TAP_SDK_LOADER_LOADED__=true,window.__TAP_SDK_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_SDK_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapSDK CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapSDK?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>n(new Error(`Failed to load TapSDK CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_SDK_LOADER_LOADING__=i,i}var r=class{constructor(e){t(this,"config");t(this,"sdkInstance");t(this,"loadPromise");this.config=e,this.loadPromise=this.loadAndInitialize();}async loadAndInitialize(){if(await c(),!window.TapSDK)throw new Error("TapSDK not available after loading CDN loader");this.sdkInstance=new window.TapSDK(this.config);}async ensureLoaded(){if(await this.loadPromise,!this.sdkInstance)throw new Error("TapSDK instance not initialized");return this.sdkInstance}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e));}}}get isOpen(){return this.sdkInstance?.isOpen??false}get isInitialized(){return this.sdkInstance?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this.sdkInstance&&this.sdkInstance.destroy();}getVersion(){return this.sdkInstance?.getVersion()??"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},D=r;
2
+ return D;})();//# sourceMappingURL=index.global.js.map
3
3
  //# sourceMappingURL=index.global.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","loadCDNLoader","loadingPromise","resolve","reject","script","checkSDK","existingScript","TapSDK","config","__publicField","params","sdk","callback","handler","index_default"],"mappings":"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","file":"index.global.js","sourcesContent":["/**\n * TapSDK - npm package wrapper\n *\n * Simply loads the CDN loader which handles version management and SDK loading.\n * This keeps the npm package minimal and allows instant updates via CDN.\n */\n\nimport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from './types';\n\nconst CDN_LOADER_URL = 'https://files.edutap.ai/tap-sdk/loader.js';\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapSDK\nexport type TapSDKConstructor = new (config: TapSDKConfig) => TapSDKInstance;\n\ndeclare global {\n interface Window {\n TapSDK?: TapSDKConstructor;\n __TAP_SDK_LOADER_LOADED__?: boolean;\n __TAP_SDK_LOADER_LOADING__?: Promise<void>;\n }\n}\n\ninterface TapSDKInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n init(params: TapSDKInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapSDKInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void>;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_SDK_LOADER_LOADED__ && window.TapSDK) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_SDK_LOADER_LOADING__) {\n return window.__TAP_SDK_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('TapSDK requires browser environment (document is undefined)'));\n return;\n }\n\n const script = document.createElement('script');\n script.src = CDN_LOADER_URL;\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 = () => {\n if (window.TapSDK) {\n window.__TAP_SDK_LOADER_LOADED__ = true;\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${CDN_LOADER_URL}\"]`);\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener('load', () => {\n const checkSDK = () => {\n if (window.TapSDK) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener('error', () =>\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_SDK_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n/**\n * TapSDK Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapSDK implements TapSDKInstance {\n private config: TapSDKConfig;\n private sdkInstance?: TapSDKInstance;\n private loadPromise: Promise<void>;\n\n constructor(config: TapSDKConfig) {\n this.config = config;\n this.loadPromise = this.loadAndInitialize();\n }\n\n private async loadAndInitialize(): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapSDK) {\n throw new Error('TapSDK not available after loading CDN loader');\n }\n\n this.sdkInstance = new window.TapSDK(this.config);\n }\n\n private async ensureLoaded(): Promise<TapSDKInstance> {\n await this.loadPromise;\n if (!this.sdkInstance) {\n throw new Error('TapSDK instance not initialized');\n }\n return this.sdkInstance;\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then(sdk => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this.sdkInstance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.sdkInstance?.isInitialized ?? false;\n }\n\n async init(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this.sdkInstance) {\n this.sdkInstance.destroy();\n }\n }\n\n // Deprecated methods\n async initChat(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK as default\nexport default TapSDK;\nexport { TapSDK };\n\n// Export TapSDK instance type\nexport type { TapSDKInstance };\n\n// Re-export types for API compatibility\nexport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
1
+ {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","loadCDNLoader","loadingPromise","resolve","reject","script","checkSDK","existingScript","TapSDK","config","__publicField","params","sdk","callback","handler","index_default"],"mappings":"8MAkBA,IAAMA,CAAAA,CAAiB,2CAAA,CAyCvB,SAASC,CAAAA,EAA+B,CAEtC,GAAI,MAAA,CAAO,yBAAA,EAA6B,MAAA,CAAO,MAAA,CAC7C,OAAO,OAAA,CAAQ,SAAQ,CAIzB,GAAI,MAAA,CAAO,0BAAA,CACT,OAAO,MAAA,CAAO,2BAIhB,IAAMC,CAAAA,CAAiB,IAAI,OAAA,CAAc,CAACC,CAAAA,CAASC,IAAW,CAC5D,GAAI,OAAO,QAAA,CAAa,GAAA,CAAa,CACnCA,EAAO,IAAI,KAAA,CAAM,6DAA6D,CAAC,CAAA,CAC/E,MACF,CAEA,IAAMC,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CA,EAAO,GAAA,CAAML,CAAAA,CACbK,CAAAA,CAAO,KAAA,CAAQ,IAAA,CAEfA,CAAAA,CAAO,OAAS,IAAM,CAGpB,IAAMC,CAAAA,CAAW,IAAM,CACjB,OAAO,MAAA,EACT,MAAA,CAAO,yBAAA,CAA4B,IAAA,CACnC,MAAA,CAAO,0BAAA,CAA6B,OACpCH,CAAAA,EAAQ,EAGR,UAAA,CAAWG,CAAAA,CAAU,EAAE,EAE3B,EACAA,CAAAA,GACF,CAAA,CAEAD,CAAAA,CAAO,OAAA,CAAU,IAAM,CACrB,MAAA,CAAO,0BAAA,CAA6B,MAAA,CACpCD,CAAAA,CAAO,IAAI,KAAA,CAAM,qCAAqCJ,CAAc,CAAA,CAAE,CAAC,EACzE,CAAA,CAGA,IAAMO,EAAiB,QAAA,CAAS,aAAA,CAAc,CAAA,YAAA,EAAeP,CAAc,CAAA,EAAA,CAAI,CAAA,CAC3EO,CAAAA,EAEFA,CAAAA,CAAe,gBAAA,CAAiB,MAAA,CAAQ,IAAM,CAC5C,IAAMD,CAAAA,CAAW,IAAM,CACjB,MAAA,CAAO,MAAA,CAAQH,CAAAA,EAAQ,CACtB,UAAA,CAAWG,EAAU,EAAE,EAC9B,CAAA,CACAA,CAAAA,GACF,CAAC,EACDC,CAAAA,CAAe,gBAAA,CAAiB,OAAA,CAAS,IACvCH,CAAAA,CAAO,IAAI,MAAM,CAAA,kCAAA,EAAqCJ,CAAc,CAAA,CAAE,CAAC,CACzE,CAAA,EAEA,SAAS,IAAA,CAAK,WAAA,CAAYK,CAAM,EAEpC,CAAC,CAAA,CAED,cAAO,0BAAA,CAA6BH,CAAAA,CAC7BA,CACT,CAOA,IAAMM,CAAAA,CAAN,KAAuC,CAKrC,WAAA,CAAYC,CAAAA,CAAsB,CAJlCC,CAAAA,CAAA,IAAA,CAAQ,QAAA,CAAA,CACRA,CAAAA,CAAA,IAAA,CAAQ,aAAA,CAAA,CACRA,CAAAA,CAAA,IAAA,CAAQ,aAAA,CAAA,CAGN,IAAA,CAAK,OAASD,CAAAA,CACd,IAAA,CAAK,WAAA,CAAc,IAAA,CAAK,iBAAA,GAC1B,CAEA,MAAc,iBAAA,EAAmC,CAG/C,GAFA,MAAMR,CAAAA,GAEF,CAAC,MAAA,CAAO,MAAA,CACV,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAGjE,IAAA,CAAK,WAAA,CAAc,IAAI,MAAA,CAAO,MAAA,CAAO,KAAK,MAAM,EAClD,CAEA,MAAc,YAAA,EAAwC,CAEpD,GADA,MAAM,IAAA,CAAK,WAAA,CACP,CAAC,IAAA,CAAK,WAAA,CACR,MAAM,IAAI,KAAA,CAAM,iCAAiC,CAAA,CAEnD,OAAO,IAAA,CAAK,WACd,CAGA,IAAI,MAAA,EAAS,CACX,OAAO,CACL,YAAA,CAAeU,GAAmC,CAChD,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAKC,CAAAA,EAAOA,EAAI,MAAA,CAAO,YAAA,CAAaD,CAAM,CAAC,EACjE,CAAA,CACA,eAAiBE,CAAAA,EAA6D,CAC5E,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAKD,GAAOA,CAAAA,CAAI,MAAA,CAAO,cAAA,CAAeC,CAAQ,CAAC,EACrE,EACA,eAAA,CAAkBC,CAAAA,EAAwB,CACxC,IAAA,CAAK,YAAA,EAAa,CAAE,KAAKF,CAAAA,EAAOA,CAAAA,CAAI,MAAA,CAAO,eAAA,CAAgBE,CAAO,CAAC,EACrE,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAwB,CACrC,IAAA,CAAK,YAAA,GAAe,IAAA,CAAKF,CAAAA,EAAOA,CAAAA,CAAI,MAAA,CAAO,YAAA,CAAaE,CAAO,CAAC,EAClE,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAwB,CACrC,IAAA,CAAK,cAAa,CAAE,IAAA,CAAKF,CAAAA,EAAOA,CAAAA,CAAI,MAAA,CAAO,YAAA,CAAaE,CAAO,CAAC,EAClE,CAAA,CACA,aAAA,CAAgBA,CAAAA,EAA6D,CAC3E,KAAK,YAAA,EAAa,CAAE,IAAA,CAAKF,CAAAA,EAAOA,CAAAA,CAAI,MAAA,CAAO,cAAcE,CAAO,CAAC,EACnE,CAAA,CACA,WAAA,CAAcA,CAAAA,EAAsC,CAClD,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAKF,CAAAA,EAAOA,CAAAA,CAAI,OAAO,WAAA,CAAYE,CAAO,CAAC,EACjE,CAAA,CACA,SAAA,CAAYA,CAAAA,EAAwB,CAClC,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAKF,CAAAA,EAAOA,CAAAA,CAAI,OAAO,SAAA,CAAUE,CAAO,CAAC,EAC/D,CAAA,CACA,UAAA,CAAaA,GAAwB,CACnC,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAKF,CAAAA,EAAOA,EAAI,MAAA,CAAO,UAAA,CAAWE,CAAO,CAAC,EAChE,CACF,CACF,CAEA,IAAI,MAAA,EAAkB,CACpB,OAAO,IAAA,CAAK,aAAa,MAAA,EAAU,KACrC,CAEA,IAAI,aAAA,EAAyB,CAC3B,OAAO,IAAA,CAAK,WAAA,EAAa,aAAA,EAAiB,KAC5C,CAEA,MAAM,KAAKH,CAAAA,CAAyC,CAElD,OAAA,CADY,MAAM,IAAA,CAAK,YAAA,EAAa,EACzB,IAAA,CAAKA,CAAM,CACxB,CAEA,OAAA,EAAgB,CACV,IAAA,CAAK,aACP,IAAA,CAAK,WAAA,CAAY,OAAA,GAErB,CAEA,UAAA,EAAqB,CACnB,OAAO,IAAA,CAAK,WAAA,EAAa,UAAA,EAAW,EAAK,iBAC3C,CAGA,MAAM,QAAA,CAASA,CAAAA,CAAyC,CAEtD,OAAA,CADY,MAAM,KAAK,YAAA,EAAa,EACzB,QAAA,CAASA,CAAM,CAC5B,CAEA,MAAM,YAAA,CAAaA,CAAAA,CAAiE,CAElF,OAAA,CADY,MAAM,IAAA,CAAK,cAAa,EACzB,YAAA,CAAaA,CAAM,CAChC,CAEA,MAAM,gBAAgBA,CAAAA,CAAqF,CAEzG,OAAA,CADY,MAAM,IAAA,CAAK,YAAA,EAAa,EACzB,eAAA,CAAgBA,CAAM,CACnC,CACF,CAAA,CAGOI,CAAAA,CAAQP","file":"index.global.js","sourcesContent":["/**\n * TapSDK - npm package wrapper\n *\n * Simply loads the CDN loader which handles version management and SDK loading.\n * This keeps the npm package minimal and allows instant updates via CDN.\n */\n\nimport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from './types';\n\nconst CDN_LOADER_URL = 'https://files.edutap.ai/tap-sdk/loader.js';\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapSDK\nexport type TapSDKConstructor = new (config: TapSDKConfig) => TapSDKInstance;\n\ndeclare global {\n interface Window {\n TapSDK?: TapSDKConstructor;\n __TAP_SDK_LOADER_LOADED__?: boolean;\n __TAP_SDK_LOADER_LOADING__?: Promise<void>;\n }\n}\n\ninterface TapSDKInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n init(params: TapSDKInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\n // Deprecated methods\n initChat(params: TapSDKInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void>;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_SDK_LOADER_LOADED__ && window.TapSDK) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_SDK_LOADER_LOADING__) {\n return window.__TAP_SDK_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('TapSDK requires browser environment (document is undefined)'));\n return;\n }\n\n const script = document.createElement('script');\n script.src = CDN_LOADER_URL;\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 = () => {\n if (window.TapSDK) {\n window.__TAP_SDK_LOADER_LOADED__ = true;\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${CDN_LOADER_URL}\"]`);\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener('load', () => {\n const checkSDK = () => {\n if (window.TapSDK) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener('error', () =>\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_SDK_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n/**\n * TapSDK Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapSDK implements TapSDKInstance {\n private config: TapSDKConfig;\n private sdkInstance?: TapSDKInstance;\n private loadPromise: Promise<void>;\n\n constructor(config: TapSDKConfig) {\n this.config = config;\n this.loadPromise = this.loadAndInitialize();\n }\n\n private async loadAndInitialize(): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapSDK) {\n throw new Error('TapSDK not available after loading CDN loader');\n }\n\n this.sdkInstance = new window.TapSDK(this.config);\n }\n\n private async ensureLoaded(): Promise<TapSDKInstance> {\n await this.loadPromise;\n if (!this.sdkInstance) {\n throw new Error('TapSDK instance not initialized');\n }\n return this.sdkInstance;\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then(sdk => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this.sdkInstance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.sdkInstance?.isInitialized ?? false;\n }\n\n async init(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this.sdkInstance) {\n this.sdkInstance.destroy();\n }\n }\n\n getVersion(): string {\n return this.sdkInstance?.getVersion() ?? 'Not initialized';\n }\n\n // Deprecated methods\n async initChat(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import TapSDK from '@coxwave/tap-sdk')\nexport default TapSDK;\n\n// Export TapSDK instance type (for: import type { TapSDK } from '@coxwave/tap-sdk')\nexport type { TapSDKInstance as TapSDK };\n\n// Keep TapSDKInstance for backward compatibility\nexport type { TapSDKInstance };\n\n// Re-export types for API compatibility\nexport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var p=Object.defineProperty;var l=(i,e,n)=>e in i?p(i,e,{enumerable:true,configurable:true,writable:true,value:n}):i[e]=n;var t=(i,e,n)=>l(i,typeof e!="symbol"?e+"":e,n);var s="https://files.edutap.ai/tap-sdk/loader.js";function c(){if(window.__TAP_SDK_LOADER_LOADED__&&window.TapSDK)return Promise.resolve();if(window.__TAP_SDK_LOADER_LOADING__)return window.__TAP_SDK_LOADER_LOADING__;let i=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapSDK requires browser environment (document is undefined)"));return}let o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapSDK?(window.__TAP_SDK_LOADER_LOADED__=true,window.__TAP_SDK_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_SDK_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapSDK CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapSDK?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>n(new Error(`Failed to load TapSDK CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_SDK_LOADER_LOADING__=i,i}var r=class{constructor(e){t(this,"config");t(this,"sdkInstance");t(this,"loadPromise");this.config=e,this.loadPromise=this.loadAndInitialize();}async loadAndInitialize(){if(await c(),!window.TapSDK)throw new Error("TapSDK not available after loading CDN loader");this.sdkInstance=new window.TapSDK(this.config);}async ensureLoaded(){if(await this.loadPromise,!this.sdkInstance)throw new Error("TapSDK instance not initialized");return this.sdkInstance}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e));}}}get isOpen(){return this.sdkInstance?.isOpen??false}get isInitialized(){return this.sdkInstance?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this.sdkInstance&&this.sdkInstance.destroy();}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},D=r;
2
- exports.TapSDK=r;exports.default=D;//# sourceMappingURL=index.js.map
1
+ 'use strict';var p=Object.defineProperty;var l=(i,e,n)=>e in i?p(i,e,{enumerable:true,configurable:true,writable:true,value:n}):i[e]=n;var t=(i,e,n)=>l(i,typeof e!="symbol"?e+"":e,n);var s="https://files.edutap.ai/tap-sdk/loader.js";function c(){if(window.__TAP_SDK_LOADER_LOADED__&&window.TapSDK)return Promise.resolve();if(window.__TAP_SDK_LOADER_LOADING__)return window.__TAP_SDK_LOADER_LOADING__;let i=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapSDK requires browser environment (document is undefined)"));return}let o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapSDK?(window.__TAP_SDK_LOADER_LOADED__=true,window.__TAP_SDK_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_SDK_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapSDK CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapSDK?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>n(new Error(`Failed to load TapSDK CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_SDK_LOADER_LOADING__=i,i}var r=class{constructor(e){t(this,"config");t(this,"sdkInstance");t(this,"loadPromise");this.config=e,this.loadPromise=this.loadAndInitialize();}async loadAndInitialize(){if(await c(),!window.TapSDK)throw new Error("TapSDK not available after loading CDN loader");this.sdkInstance=new window.TapSDK(this.config);}async ensureLoaded(){if(await this.loadPromise,!this.sdkInstance)throw new Error("TapSDK instance not initialized");return this.sdkInstance}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e));}}}get isOpen(){return this.sdkInstance?.isOpen??false}get isInitialized(){return this.sdkInstance?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this.sdkInstance&&this.sdkInstance.destroy();}getVersion(){return this.sdkInstance?.getVersion()??"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},D=r;
2
+ module.exports=D;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","loadCDNLoader","loadingPromise","resolve","reject","script","checkSDK","existingScript","TapSDK","config","__publicField","params","sdk","callback","handler","index_default"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * TapSDK - npm package wrapper\n *\n * Simply loads the CDN loader which handles version management and SDK loading.\n * This keeps the npm package minimal and allows instant updates via CDN.\n */\n\nimport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from './types';\n\nconst CDN_LOADER_URL = 'https://files.edutap.ai/tap-sdk/loader.js';\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapSDK\nexport type TapSDKConstructor = new (config: TapSDKConfig) => TapSDKInstance;\n\ndeclare global {\n interface Window {\n TapSDK?: TapSDKConstructor;\n __TAP_SDK_LOADER_LOADED__?: boolean;\n __TAP_SDK_LOADER_LOADING__?: Promise<void>;\n }\n}\n\ninterface TapSDKInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n init(params: TapSDKInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapSDKInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void>;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_SDK_LOADER_LOADED__ && window.TapSDK) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_SDK_LOADER_LOADING__) {\n return window.__TAP_SDK_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('TapSDK requires browser environment (document is undefined)'));\n return;\n }\n\n const script = document.createElement('script');\n script.src = CDN_LOADER_URL;\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 = () => {\n if (window.TapSDK) {\n window.__TAP_SDK_LOADER_LOADED__ = true;\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${CDN_LOADER_URL}\"]`);\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener('load', () => {\n const checkSDK = () => {\n if (window.TapSDK) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener('error', () =>\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_SDK_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n/**\n * TapSDK Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapSDK implements TapSDKInstance {\n private config: TapSDKConfig;\n private sdkInstance?: TapSDKInstance;\n private loadPromise: Promise<void>;\n\n constructor(config: TapSDKConfig) {\n this.config = config;\n this.loadPromise = this.loadAndInitialize();\n }\n\n private async loadAndInitialize(): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapSDK) {\n throw new Error('TapSDK not available after loading CDN loader');\n }\n\n this.sdkInstance = new window.TapSDK(this.config);\n }\n\n private async ensureLoaded(): Promise<TapSDKInstance> {\n await this.loadPromise;\n if (!this.sdkInstance) {\n throw new Error('TapSDK instance not initialized');\n }\n return this.sdkInstance;\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then(sdk => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this.sdkInstance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.sdkInstance?.isInitialized ?? false;\n }\n\n async init(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this.sdkInstance) {\n this.sdkInstance.destroy();\n }\n }\n\n // Deprecated methods\n async initChat(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK as default\nexport default TapSDK;\nexport { TapSDK };\n\n// Export TapSDK instance type\nexport type { TapSDKInstance };\n\n// Re-export types for API compatibility\nexport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
1
+ {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","loadCDNLoader","loadingPromise","resolve","reject","script","checkSDK","existingScript","TapSDK","config","__publicField","params","sdk","callback","handler","index_default"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * TapSDK - npm package wrapper\n *\n * Simply loads the CDN loader which handles version management and SDK loading.\n * This keeps the npm package minimal and allows instant updates via CDN.\n */\n\nimport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from './types';\n\nconst CDN_LOADER_URL = 'https://files.edutap.ai/tap-sdk/loader.js';\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapSDK\nexport type TapSDKConstructor = new (config: TapSDKConfig) => TapSDKInstance;\n\ndeclare global {\n interface Window {\n TapSDK?: TapSDKConstructor;\n __TAP_SDK_LOADER_LOADED__?: boolean;\n __TAP_SDK_LOADER_LOADING__?: Promise<void>;\n }\n}\n\ninterface TapSDKInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n init(params: TapSDKInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\n // Deprecated methods\n initChat(params: TapSDKInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void>;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_SDK_LOADER_LOADED__ && window.TapSDK) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_SDK_LOADER_LOADING__) {\n return window.__TAP_SDK_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('TapSDK requires browser environment (document is undefined)'));\n return;\n }\n\n const script = document.createElement('script');\n script.src = CDN_LOADER_URL;\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 = () => {\n if (window.TapSDK) {\n window.__TAP_SDK_LOADER_LOADED__ = true;\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${CDN_LOADER_URL}\"]`);\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener('load', () => {\n const checkSDK = () => {\n if (window.TapSDK) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener('error', () =>\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_SDK_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n/**\n * TapSDK Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapSDK implements TapSDKInstance {\n private config: TapSDKConfig;\n private sdkInstance?: TapSDKInstance;\n private loadPromise: Promise<void>;\n\n constructor(config: TapSDKConfig) {\n this.config = config;\n this.loadPromise = this.loadAndInitialize();\n }\n\n private async loadAndInitialize(): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapSDK) {\n throw new Error('TapSDK not available after loading CDN loader');\n }\n\n this.sdkInstance = new window.TapSDK(this.config);\n }\n\n private async ensureLoaded(): Promise<TapSDKInstance> {\n await this.loadPromise;\n if (!this.sdkInstance) {\n throw new Error('TapSDK instance not initialized');\n }\n return this.sdkInstance;\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then(sdk => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this.sdkInstance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.sdkInstance?.isInitialized ?? false;\n }\n\n async init(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this.sdkInstance) {\n this.sdkInstance.destroy();\n }\n }\n\n getVersion(): string {\n return this.sdkInstance?.getVersion() ?? 'Not initialized';\n }\n\n // Deprecated methods\n async initChat(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import TapSDK from '@coxwave/tap-sdk')\nexport default TapSDK;\n\n// Export TapSDK instance type (for: import type { TapSDK } from '@coxwave/tap-sdk')\nexport type { TapSDKInstance as TapSDK };\n\n// Keep TapSDKInstance for backward compatibility\nexport type { TapSDKInstance };\n\n// Re-export types for API compatibility\nexport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- var p=Object.defineProperty;var l=(i,e,n)=>e in i?p(i,e,{enumerable:true,configurable:true,writable:true,value:n}):i[e]=n;var t=(i,e,n)=>l(i,typeof e!="symbol"?e+"":e,n);var s="https://files.edutap.ai/tap-sdk/loader.js";function c(){if(window.__TAP_SDK_LOADER_LOADED__&&window.TapSDK)return Promise.resolve();if(window.__TAP_SDK_LOADER_LOADING__)return window.__TAP_SDK_LOADER_LOADING__;let i=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapSDK requires browser environment (document is undefined)"));return}let o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapSDK?(window.__TAP_SDK_LOADER_LOADED__=true,window.__TAP_SDK_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_SDK_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapSDK CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapSDK?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>n(new Error(`Failed to load TapSDK CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_SDK_LOADER_LOADING__=i,i}var r=class{constructor(e){t(this,"config");t(this,"sdkInstance");t(this,"loadPromise");this.config=e,this.loadPromise=this.loadAndInitialize();}async loadAndInitialize(){if(await c(),!window.TapSDK)throw new Error("TapSDK not available after loading CDN loader");this.sdkInstance=new window.TapSDK(this.config);}async ensureLoaded(){if(await this.loadPromise,!this.sdkInstance)throw new Error("TapSDK instance not initialized");return this.sdkInstance}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e));}}}get isOpen(){return this.sdkInstance?.isOpen??false}get isInitialized(){return this.sdkInstance?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this.sdkInstance&&this.sdkInstance.destroy();}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},D=r;
2
- export{r as TapSDK,D as default};//# sourceMappingURL=index.mjs.map
1
+ var p=Object.defineProperty;var l=(i,e,n)=>e in i?p(i,e,{enumerable:true,configurable:true,writable:true,value:n}):i[e]=n;var t=(i,e,n)=>l(i,typeof e!="symbol"?e+"":e,n);var s="https://files.edutap.ai/tap-sdk/loader.js";function c(){if(window.__TAP_SDK_LOADER_LOADED__&&window.TapSDK)return Promise.resolve();if(window.__TAP_SDK_LOADER_LOADING__)return window.__TAP_SDK_LOADER_LOADING__;let i=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapSDK requires browser environment (document is undefined)"));return}let o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapSDK?(window.__TAP_SDK_LOADER_LOADED__=true,window.__TAP_SDK_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_SDK_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapSDK CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapSDK?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>n(new Error(`Failed to load TapSDK CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_SDK_LOADER_LOADING__=i,i}var r=class{constructor(e){t(this,"config");t(this,"sdkInstance");t(this,"loadPromise");this.config=e,this.loadPromise=this.loadAndInitialize();}async loadAndInitialize(){if(await c(),!window.TapSDK)throw new Error("TapSDK not available after loading CDN loader");this.sdkInstance=new window.TapSDK(this.config);}async ensureLoaded(){if(await this.loadPromise,!this.sdkInstance)throw new Error("TapSDK instance not initialized");return this.sdkInstance}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e));}}}get isOpen(){return this.sdkInstance?.isOpen??false}get isInitialized(){return this.sdkInstance?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this.sdkInstance&&this.sdkInstance.destroy();}getVersion(){return this.sdkInstance?.getVersion()??"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},D=r;
2
+ export{D as default};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","loadCDNLoader","loadingPromise","resolve","reject","script","checkSDK","existingScript","TapSDK","config","__publicField","params","sdk","callback","handler","index_default"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TapSDK - npm package wrapper\n *\n * Simply loads the CDN loader which handles version management and SDK loading.\n * This keeps the npm package minimal and allows instant updates via CDN.\n */\n\nimport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from './types';\n\nconst CDN_LOADER_URL = 'https://files.edutap.ai/tap-sdk/loader.js';\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapSDK\nexport type TapSDKConstructor = new (config: TapSDKConfig) => TapSDKInstance;\n\ndeclare global {\n interface Window {\n TapSDK?: TapSDKConstructor;\n __TAP_SDK_LOADER_LOADED__?: boolean;\n __TAP_SDK_LOADER_LOADING__?: Promise<void>;\n }\n}\n\ninterface TapSDKInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n init(params: TapSDKInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapSDKInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void>;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_SDK_LOADER_LOADED__ && window.TapSDK) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_SDK_LOADER_LOADING__) {\n return window.__TAP_SDK_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('TapSDK requires browser environment (document is undefined)'));\n return;\n }\n\n const script = document.createElement('script');\n script.src = CDN_LOADER_URL;\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 = () => {\n if (window.TapSDK) {\n window.__TAP_SDK_LOADER_LOADED__ = true;\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${CDN_LOADER_URL}\"]`);\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener('load', () => {\n const checkSDK = () => {\n if (window.TapSDK) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener('error', () =>\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_SDK_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n/**\n * TapSDK Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapSDK implements TapSDKInstance {\n private config: TapSDKConfig;\n private sdkInstance?: TapSDKInstance;\n private loadPromise: Promise<void>;\n\n constructor(config: TapSDKConfig) {\n this.config = config;\n this.loadPromise = this.loadAndInitialize();\n }\n\n private async loadAndInitialize(): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapSDK) {\n throw new Error('TapSDK not available after loading CDN loader');\n }\n\n this.sdkInstance = new window.TapSDK(this.config);\n }\n\n private async ensureLoaded(): Promise<TapSDKInstance> {\n await this.loadPromise;\n if (!this.sdkInstance) {\n throw new Error('TapSDK instance not initialized');\n }\n return this.sdkInstance;\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then(sdk => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this.sdkInstance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.sdkInstance?.isInitialized ?? false;\n }\n\n async init(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this.sdkInstance) {\n this.sdkInstance.destroy();\n }\n }\n\n // Deprecated methods\n async initChat(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK as default\nexport default TapSDK;\nexport { TapSDK };\n\n// Export TapSDK instance type\nexport type { TapSDKInstance };\n\n// Re-export types for API compatibility\nexport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
1
+ {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","loadCDNLoader","loadingPromise","resolve","reject","script","checkSDK","existingScript","TapSDK","config","__publicField","params","sdk","callback","handler","index_default"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TapSDK - npm package wrapper\n *\n * Simply loads the CDN loader which handles version management and SDK loading.\n * This keeps the npm package minimal and allows instant updates via CDN.\n */\n\nimport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from './types';\n\nconst CDN_LOADER_URL = 'https://files.edutap.ai/tap-sdk/loader.js';\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapSDK\nexport type TapSDKConstructor = new (config: TapSDKConfig) => TapSDKInstance;\n\ndeclare global {\n interface Window {\n TapSDK?: TapSDKConstructor;\n __TAP_SDK_LOADER_LOADED__?: boolean;\n __TAP_SDK_LOADER_LOADING__?: Promise<void>;\n }\n}\n\ninterface TapSDKInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n init(params: TapSDKInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\n // Deprecated methods\n initChat(params: TapSDKInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void>;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_SDK_LOADER_LOADED__ && window.TapSDK) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_SDK_LOADER_LOADING__) {\n return window.__TAP_SDK_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('TapSDK requires browser environment (document is undefined)'));\n return;\n }\n\n const script = document.createElement('script');\n script.src = CDN_LOADER_URL;\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 = () => {\n if (window.TapSDK) {\n window.__TAP_SDK_LOADER_LOADED__ = true;\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_SDK_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${CDN_LOADER_URL}\"]`);\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener('load', () => {\n const checkSDK = () => {\n if (window.TapSDK) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener('error', () =>\n reject(new Error(`Failed to load TapSDK CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_SDK_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n/**\n * TapSDK Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapSDK implements TapSDKInstance {\n private config: TapSDKConfig;\n private sdkInstance?: TapSDKInstance;\n private loadPromise: Promise<void>;\n\n constructor(config: TapSDKConfig) {\n this.config = config;\n this.loadPromise = this.loadAndInitialize();\n }\n\n private async loadAndInitialize(): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapSDK) {\n throw new Error('TapSDK not available after loading CDN loader');\n }\n\n this.sdkInstance = new window.TapSDK(this.config);\n }\n\n private async ensureLoaded(): Promise<TapSDKInstance> {\n await this.loadPromise;\n if (!this.sdkInstance) {\n throw new Error('TapSDK instance not initialized');\n }\n return this.sdkInstance;\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then(sdk => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then(sdk => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this.sdkInstance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.sdkInstance?.isInitialized ?? false;\n }\n\n async init(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this.sdkInstance) {\n this.sdkInstance.destroy();\n }\n }\n\n getVersion(): string {\n return this.sdkInstance?.getVersion() ?? 'Not initialized';\n }\n\n // Deprecated methods\n async initChat(params: TapSDKInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: { callback: (clipPlayHead: number, clipId: string) => void }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import TapSDK from '@coxwave/tap-sdk')\nexport default TapSDK;\n\n// Export TapSDK instance type (for: import type { TapSDK } from '@coxwave/tap-sdk')\nexport type { TapSDKInstance as TapSDK };\n\n// Keep TapSDKInstance for backward compatibility\nexport type { TapSDKInstance };\n\n// Re-export types for API compatibility\nexport type {\n TapSDKConfig,\n TapSDKInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
package/index.ts CHANGED
@@ -46,6 +46,7 @@ interface TapSDKInstance {
46
46
  isInitialized: boolean;
47
47
  init(params: TapSDKInitParams): Promise<void>;
48
48
  destroy(): void;
49
+ getVersion(): string;
49
50
  // Deprecated methods
50
51
  initChat(params: TapSDKInitParams): Promise<void>;
51
52
  postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;
@@ -207,6 +208,10 @@ class TapSDK implements TapSDKInstance {
207
208
  }
208
209
  }
209
210
 
211
+ getVersion(): string {
212
+ return this.sdkInstance?.getVersion() ?? 'Not initialized';
213
+ }
214
+
210
215
  // Deprecated methods
211
216
  async initChat(params: TapSDKInitParams): Promise<void> {
212
217
  const sdk = await this.ensureLoaded();
@@ -224,11 +229,13 @@ class TapSDK implements TapSDKInstance {
224
229
  }
225
230
  }
226
231
 
227
- // Export the SDK as default
232
+ // Export the SDK class as default (for: import TapSDK from '@coxwave/tap-sdk')
228
233
  export default TapSDK;
229
- export { TapSDK };
230
234
 
231
- // Export TapSDK instance type
235
+ // Export TapSDK instance type (for: import type { TapSDK } from '@coxwave/tap-sdk')
236
+ export type { TapSDKInstance as TapSDK };
237
+
238
+ // Keep TapSDKInstance for backward compatibility
232
239
  export type { TapSDKInstance };
233
240
 
234
241
  // Re-export types for API compatibility
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coxwave/tap-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "TapSDK - Minimal wrapper that loads TapSDK from CDN",
6
6
  "main": "dist/index.js",
@@ -36,12 +36,10 @@
36
36
  "types.ts",
37
37
  "index.ts"
38
38
  ],
39
- "dependencies": {
40
- "@coxwave/tap-messages": "workspace:*"
41
- },
42
39
  "devDependencies": {
43
40
  "@coxwave/config-eslint": "workspace:*",
44
41
  "@coxwave/config-typescript": "workspace:*",
42
+ "@coxwave/tap-messages": "workspace:*",
45
43
  "tsup": "^8.5.0"
46
44
  }
47
45
  }