@coxwave/tap-sdk 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -169,9 +169,3 @@ if (sdk.isInitialized) {
169
169
  console.log("SDK 사용 준비 완료");
170
170
  }
171
171
  ```
172
-
173
- ## 더 이상 사용되지 않는 헬퍼
174
-
175
- - `initChat(options)` – `init(options)` 사용 권장; v1.0.0에서 제거 예정
176
- - `postChatInfo({ clipId, clipPlayHead })` – `events.seekTimeline`의 별칭; v1.0.0에서 제거 예정
177
- - `getTimelineInfo({ callback })` – `sdk.events.onTimelineSeek` 사용 권장; v1.0.0에서 제거 예정
package/dist/index.d.cts CHANGED
@@ -47,11 +47,10 @@ type SeekTimelineParamsType = {
47
47
  */
48
48
 
49
49
  /**
50
- * TapKit instance type from tap-kit-core
51
- * This matches the actual TapKit class exported from @coxwave/tap-kit-core
52
- * Exported for advanced use cases (e.g., when using window.TapKit directly)
50
+ * Base TapKit instance interface
51
+ * Shared properties and methods between core and wrapper
53
52
  */
54
- interface TapKitCoreInstance {
53
+ interface TapKitBaseInstance {
55
54
  events: {
56
55
  seekTimeline: (params: SeekTimelineParamsType) => void;
57
56
  onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
@@ -68,14 +67,13 @@ interface TapKitCoreInstance {
68
67
  ready: Promise<void>;
69
68
  init(params: TapKitInitParams): Promise<void>;
70
69
  destroy(): void;
71
- initChat(params: TapKitInitParams): Promise<void>;
72
- postChatInfo(params: {
73
- clipId: string;
74
- clipPlayHead: number;
75
- }): Promise<void>;
76
- getTimelineInfo(params: {
77
- callback: (clipPlayHead: number, clipId: string) => void;
78
- }): Promise<void>;
70
+ }
71
+ /**
72
+ * TapKit instance type from tap-kit-core
73
+ * This matches the actual TapKit class exported from @coxwave/tap-kit-core
74
+ * Exported for advanced use cases (e.g., when using window.TapKit directly)
75
+ */
76
+ interface TapKitCoreInstance extends TapKitBaseInstance {
79
77
  }
80
78
  type TapKitConstructor = new (config: TapKitConfig) => TapKitCoreInstance;
81
79
  declare global {
@@ -89,23 +87,7 @@ declare global {
89
87
  * Public TapKit instance interface
90
88
  * This is what users interact with when using the SDK
91
89
  */
92
- interface TapKitInstance {
93
- events: {
94
- seekTimeline: (params: SeekTimelineParamsType) => void;
95
- onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
96
- onChatInitiated: (handler: () => void) => void;
97
- onChatOpened: (handler: () => void) => void;
98
- onChatClosed: (handler: () => void) => void;
99
- onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;
100
- onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
101
- onPdfOpen: (handler: () => void) => void;
102
- onPdfClose: (handler: () => void) => void;
103
- };
104
- isOpen: boolean;
105
- isInitialized: boolean;
106
- ready: Promise<void>;
107
- init(params: TapKitInitParams): Promise<void>;
108
- destroy(): void;
90
+ interface TapKitInstance extends TapKitBaseInstance {
109
91
  getVersion(): string;
110
92
  }
111
93
  declare const SDK_INSTANCE: unique symbol;
package/dist/index.d.ts CHANGED
@@ -47,11 +47,10 @@ type SeekTimelineParamsType = {
47
47
  */
48
48
 
49
49
  /**
50
- * TapKit instance type from tap-kit-core
51
- * This matches the actual TapKit class exported from @coxwave/tap-kit-core
52
- * Exported for advanced use cases (e.g., when using window.TapKit directly)
50
+ * Base TapKit instance interface
51
+ * Shared properties and methods between core and wrapper
53
52
  */
54
- interface TapKitCoreInstance {
53
+ interface TapKitBaseInstance {
55
54
  events: {
56
55
  seekTimeline: (params: SeekTimelineParamsType) => void;
57
56
  onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
@@ -68,14 +67,13 @@ interface TapKitCoreInstance {
68
67
  ready: Promise<void>;
69
68
  init(params: TapKitInitParams): Promise<void>;
70
69
  destroy(): void;
71
- initChat(params: TapKitInitParams): Promise<void>;
72
- postChatInfo(params: {
73
- clipId: string;
74
- clipPlayHead: number;
75
- }): Promise<void>;
76
- getTimelineInfo(params: {
77
- callback: (clipPlayHead: number, clipId: string) => void;
78
- }): Promise<void>;
70
+ }
71
+ /**
72
+ * TapKit instance type from tap-kit-core
73
+ * This matches the actual TapKit class exported from @coxwave/tap-kit-core
74
+ * Exported for advanced use cases (e.g., when using window.TapKit directly)
75
+ */
76
+ interface TapKitCoreInstance extends TapKitBaseInstance {
79
77
  }
80
78
  type TapKitConstructor = new (config: TapKitConfig) => TapKitCoreInstance;
81
79
  declare global {
@@ -89,23 +87,7 @@ declare global {
89
87
  * Public TapKit instance interface
90
88
  * This is what users interact with when using the SDK
91
89
  */
92
- interface TapKitInstance {
93
- events: {
94
- seekTimeline: (params: SeekTimelineParamsType) => void;
95
- onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
96
- onChatInitiated: (handler: () => void) => void;
97
- onChatOpened: (handler: () => void) => void;
98
- onChatClosed: (handler: () => void) => void;
99
- onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;
100
- onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
101
- onPdfOpen: (handler: () => void) => void;
102
- onPdfClose: (handler: () => void) => void;
103
- };
104
- isOpen: boolean;
105
- isInitialized: boolean;
106
- ready: Promise<void>;
107
- init(params: TapKitInitParams): Promise<void>;
108
- destroy(): void;
90
+ interface TapKitInstance extends TapKitBaseInstance {
109
91
  getVersion(): string;
110
92
  }
111
93
  declare const SDK_INSTANCE: unique symbol;
@@ -1,3 +1,3 @@
1
- var TapKit=(function(){'use strict';var T=Object.defineProperty;var c=(n,e,i)=>e in n?T(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var s=(n,e,i)=>c(n,typeof e!="symbol"?e+"":e,i);var d="https://files.edutap.ai/tap-sdk/loader.js";function _(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let n=new Promise((e,i)=>{if(typeof document>"u"){i(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=d,t.async=true,t.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${d}`));};let r=document.querySelector(`script[src="${d}"]`);r?(r.addEventListener("load",()=>{let a=()=>{window.TapKit?e():setTimeout(a,50);};a();}),r.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${d}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),p=Symbol("sdkInstanceLoading"),m,v,l=class{constructor(e){s(this,v);s(this,m);this[p]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await _(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[o]=new window.TapKit(e);}async ensureLoaded(){if(await this[p],!this[o])throw new Error("TapKit instance not initialized");return this[o]}get ready(){return this.ensureLoaded().then(e=>e.ready)}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(i=>i.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(i=>i.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(i=>i.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(i=>i.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(i=>i.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(i=>i.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(i=>i.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(i=>i.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(i=>i.events.onPdfClose(e));}}}get isOpen(){return this[o]?.isOpen??false}get isInitialized(){return this[o]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[o]&&this[o].destroy();}getVersion(){return this[o]?"Loaded from CDN (tap-sdk wrapper v0.2.5)":"Not initialized"}get[(v=o,m=p,Symbol.toStringTag)](){return "TapKit"}},I=l;
2
- return I;})();//# sourceMappingURL=index.global.js.map
1
+ var TapKit=(function(){'use strict';var m=Object.defineProperty;var I=(o,e,n)=>e in o?m(o,e,{enumerable:true,configurable:true,writable:true,value:n}):o[e]=n;var d=(o,e,n)=>I(o,typeof e!="symbol"?e+"":e,n);var a="https://files.edutap.ai/tap-sdk/loader.js";function T(o,e){let r=0,s=Date.now(),c=()=>{if(window.TapKit){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,o();return}if(r++,Date.now()-s>4e3){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error("TapKit loader timeout: SDK not available after 4000ms"));return}if(r>=26){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader failed: SDK not available after ${r} retries`));return}setTimeout(c,150);};return c}function v(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let o=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=a,t.async=true,t.onload=()=>{T(e,n)();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapKit CDN loader: ${a}`));};let r=document.querySelector(`script[src="${a}"]`);r?(r.addEventListener("load",()=>{T(e,n)();}),r.addEventListener("error",()=>n(new Error(`Failed to load TapKit CDN loader: ${a}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=o,o}var i=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),_,h,p=class{constructor(e){d(this,h);d(this,_);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await v(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[i]=new window.TapKit(e);}async ensureLoaded(){if(await this[l],!this[i])throw new Error("TapKit instance not initialized");return this[i]}get ready(){return this.ensureLoaded().then(e=>e.ready)}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e)).catch(n=>{});},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e)).catch(n=>{});},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e)).catch(n=>{});},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e)).catch(n=>{});},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e)).catch(n=>{});},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e)).catch(n=>{});},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e)).catch(n=>{});},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e)).catch(n=>{});},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e)).catch(n=>{});}}}get isOpen(){return this[i]?.isOpen??false}get isInitialized(){return this[i]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[i]&&this[i].destroy();}getVersion(){return this[i]?"Loaded from CDN (tap-sdk wrapper v0.2.8)":"Not initialized"}get[(h=i,_=l,Symbol.toStringTag)](){return "TapKit"}},A=p;
2
+ return A;})();//# 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","SDK_INSTANCE","SDK_INSTANCE_LOADING","_a","_b","TapKit","config","__publicField","sdk","params","callback","handler","index_default"],"mappings":"8MAkBA,IAAMA,CAAAA,CAAiB,2CAAA,CAkFvB,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,EACE,IAAI,KAAA,CAAM,6DAA6D,CACzE,CAAA,CACA,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,CAC9B,CAAA,YAAA,EAAeP,CAAc,CAAA,EAAA,CAC/B,CAAA,CACIO,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,CAGA,IAAMM,CAAAA,CAAe,OAAO,aAAa,CAAA,CACnCC,CAAAA,CAAuB,MAAA,CAAO,oBAAoB,CAAA,CA5KxDC,CAAAA,CAAAC,CAAAA,CAmLMC,CAAAA,CAAN,KAAuC,CAIrC,WAAA,CAAYC,CAAAA,CAAsB,CAHlCC,EAAA,IAAA,CAASH,CAAAA,CAAAA,CACTG,CAAAA,CAAA,IAAA,CAASJ,CAAAA,CAAAA,CAGP,IAAA,CAAKD,CAAoB,CAAA,CAAI,IAAA,CAAK,iBAAA,CAAkBI,CAAM,EAC5D,CAEA,MAAc,iBAAA,CAAkBA,CAAAA,CAAqC,CAGnE,GAFA,MAAMZ,CAAAA,GAEF,CAAC,MAAA,CAAO,MAAA,CACV,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAGjE,IAAA,CAAKO,CAAY,CAAA,CAAI,IAAI,MAAA,CAAO,OAAOK,CAAM,EAC/C,CAEA,MAAc,YAAA,EAA4C,CAGxD,GAFA,MAAM,IAAA,CAAKJ,CAAoB,CAAA,CAE3B,CAAC,IAAA,CAAKD,CAAY,CAAA,CACpB,MAAM,IAAI,KAAA,CAAM,iCAAiC,CAAA,CAGnD,OAAO,KAAKA,CAAY,CAC1B,CAIA,IAAI,KAAA,EAAuB,CACzB,OAAO,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAMO,CAAAA,EAAQA,CAAAA,CAAI,KAAK,CACpD,CAGA,IAAI,MAAA,EAAS,CACX,OAAO,CACL,YAAA,CAAeC,CAAAA,EAAmC,CAChD,IAAA,CAAK,YAAA,EAAa,CAAE,KAAMD,CAAAA,EAAQA,CAAAA,CAAI,MAAA,CAAO,YAAA,CAAaC,CAAM,CAAC,EACnE,CAAA,CACA,cAAA,CACEC,CAAAA,EACG,CACH,IAAA,CAAK,YAAA,GAAe,IAAA,CAAMF,CAAAA,EAAQA,CAAAA,CAAI,MAAA,CAAO,cAAA,CAAeE,CAAQ,CAAC,EACvE,CAAA,CACA,eAAA,CAAkBC,CAAAA,EAAwB,CACxC,IAAA,CAAK,cAAa,CAAE,IAAA,CAAMH,CAAAA,EAAQA,CAAAA,CAAI,MAAA,CAAO,eAAA,CAAgBG,CAAO,CAAC,EACvE,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAwB,CACrC,KAAK,YAAA,EAAa,CAAE,IAAA,CAAMH,CAAAA,EAAQA,CAAAA,CAAI,MAAA,CAAO,aAAaG,CAAO,CAAC,EACpE,CAAA,CACA,YAAA,CAAeA,CAAAA,EAAwB,CACrC,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAMH,CAAAA,EAAQA,CAAAA,CAAI,OAAO,YAAA,CAAaG,CAAO,CAAC,EACpE,CAAA,CACA,aAAA,CACEA,GACG,CACH,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAMH,CAAAA,EAAQA,CAAAA,CAAI,MAAA,CAAO,aAAA,CAAcG,CAAO,CAAC,EACrE,CAAA,CACA,WAAA,CAAcA,GAAsC,CAClD,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAMH,CAAAA,EAAQA,EAAI,MAAA,CAAO,WAAA,CAAYG,CAAO,CAAC,EACnE,CAAA,CACA,UAAYA,CAAAA,EAAwB,CAClC,IAAA,CAAK,YAAA,EAAa,CAAE,IAAA,CAAMH,GAAQA,CAAAA,CAAI,MAAA,CAAO,SAAA,CAAUG,CAAO,CAAC,EACjE,EACA,UAAA,CAAaA,CAAAA,EAAwB,CACnC,IAAA,CAAK,YAAA,EAAa,CAAE,KAAMH,CAAAA,EAAQA,CAAAA,CAAI,MAAA,CAAO,UAAA,CAAWG,CAAO,CAAC,EAClE,CACF,CACF,CAEA,IAAI,MAAA,EAAkB,CACpB,OAAO,IAAA,CAAKV,CAAY,CAAA,EAAG,MAAA,EAAU,KACvC,CAEA,IAAI,eAAyB,CAC3B,OAAO,IAAA,CAAKA,CAAY,CAAA,EAAG,aAAA,EAAiB,KAC9C,CAEA,MAAM,IAAA,CAAKQ,CAAAA,CAAyC,CAElD,OAAA,CADY,MAAM,IAAA,CAAK,YAAA,EAAa,EACzB,IAAA,CAAKA,CAAM,CACxB,CAEA,OAAA,EAAgB,CACV,IAAA,CAAKR,CAAY,CAAA,EACnB,IAAA,CAAKA,CAAY,CAAA,CAAE,OAAA,GAEvB,CAEA,UAAA,EAAqB,CAGnB,OAAK,IAAA,CAAKA,CAAY,CAAA,CAGf,0CAAA,CAFE,iBAGX,CAKA,KArGSG,CAAAA,CAAAH,CAAAA,CACAE,CAAAA,CAAAD,CAAAA,CAoGJ,MAAA,CAAO,WAAA,EAAW,EAAI,CACzB,OAAO,QACT,CACF,CAAA,CAGOU,CAAAA,CAAQP","file":"index.global.js","sourcesContent":["/**\n * TapKit wrapper - 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 TapKitConfig,\n TapKitInitParams,\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/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapKitInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void>;\n}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\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_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(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\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.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_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_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = () => {\n if (window.TapKit) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\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: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\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: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\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[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return \"Loaded from CDN (tap-sdk wrapper v0.2.5)\";\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
1
+ {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","createSDKChecker","resolve","reject","retryCount","startTime","checkSDK","loadCDNLoader","loadingPromise","script","existingScript","SDK_INSTANCE","SDK_INSTANCE_LOADING","_a","_b","TapKit","config","__publicField","sdk","params","error","callback","handler","index_default"],"mappings":"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","file":"index.global.js","sourcesContent":["/**\n * TapKit wrapper - 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 TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from \"./types\";\n\n// Version injected at build time via tsup define\ndeclare const __PACKAGE_VERSION__: string;\n\nconst CDN_LOADER_URL = \"https://files.edutap.ai/tap-sdk/loader.js\";\n\n/**\n * Base TapKit instance interface\n * Shared properties and methods between core and wrapper\n */\ninterface TapKitBaseInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n}\n\n/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance extends TapKitBaseInstance {}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance extends TapKitBaseInstance {\n // Wrapper-specific method\n getVersion(): string;\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void\n): () => void {\n const MAX_RETRIES = 26; // 26 * 150ms ≈ 4 seconds max\n const TIMEOUT_MS = 4000; // 4 seconds total timeout\n let retryCount = 0;\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n if (window.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n retryCount++;\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout or max retries\n if (elapsed > TIMEOUT_MS) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(\n new Error(\n `TapKit loader timeout: SDK not available after ${TIMEOUT_MS}ms`\n )\n );\n return;\n }\n\n if (retryCount >= MAX_RETRIES) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(\n new Error(\n `TapKit loader failed: SDK not available after ${retryCount} retries`\n )\n );\n return;\n }\n\n setTimeout(checkSDK, 150);\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 */\nfunction loadCDNLoader(): 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(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\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 = createSDKChecker(resolve, reject);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.seekTimeline(params))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to call seekTimeline:\", error);\n });\n },\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onTimelineSeek(callback))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onTimelineSeek:\", error);\n });\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatInitiated(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatInitiated:\", error);\n });\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatOpened(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatOpened:\", error);\n });\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatClosed(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatClosed:\", error);\n });\n },\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onAlarmFadeIn(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onAlarmFadeIn:\", error);\n });\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPopUpOpen(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPopUpOpen:\", error);\n });\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPdfOpen(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPdfOpen:\", error);\n });\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPdfClose(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPdfClose:\", error);\n });\n },\n };\n }\n\n get isOpen(): boolean {\n return this[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return `Loaded from CDN (tap-sdk wrapper v${__PACKAGE_VERSION__})`;\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\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';var T=Object.defineProperty;var c=(n,e,i)=>e in n?T(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var s=(n,e,i)=>c(n,typeof e!="symbol"?e+"":e,i);var d="https://files.edutap.ai/tap-sdk/loader.js";function _(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let n=new Promise((e,i)=>{if(typeof document>"u"){i(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=d,t.async=true,t.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${d}`));};let r=document.querySelector(`script[src="${d}"]`);r?(r.addEventListener("load",()=>{let a=()=>{window.TapKit?e():setTimeout(a,50);};a();}),r.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${d}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),p=Symbol("sdkInstanceLoading"),m,v,l=class{constructor(e){s(this,v);s(this,m);this[p]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await _(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[o]=new window.TapKit(e);}async ensureLoaded(){if(await this[p],!this[o])throw new Error("TapKit instance not initialized");return this[o]}get ready(){return this.ensureLoaded().then(e=>e.ready)}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(i=>i.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(i=>i.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(i=>i.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(i=>i.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(i=>i.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(i=>i.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(i=>i.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(i=>i.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(i=>i.events.onPdfClose(e));}}}get isOpen(){return this[o]?.isOpen??false}get isInitialized(){return this[o]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[o]&&this[o].destroy();}getVersion(){return this[o]?"Loaded from CDN (tap-sdk wrapper v0.2.5)":"Not initialized"}get[(v=o,m=p,Symbol.toStringTag)](){return "TapKit"}},I=l;
2
- module.exports=I;//# sourceMappingURL=index.js.map
1
+ 'use strict';var m=Object.defineProperty;var I=(o,e,n)=>e in o?m(o,e,{enumerable:true,configurable:true,writable:true,value:n}):o[e]=n;var d=(o,e,n)=>I(o,typeof e!="symbol"?e+"":e,n);var a="https://files.edutap.ai/tap-sdk/loader.js";function T(o,e){let r=0,s=Date.now(),c=()=>{if(window.TapKit){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,o();return}if(r++,Date.now()-s>4e3){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error("TapKit loader timeout: SDK not available after 4000ms"));return}if(r>=26){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader failed: SDK not available after ${r} retries`));return}setTimeout(c,150);};return c}function v(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let o=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=a,t.async=true,t.onload=()=>{T(e,n)();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapKit CDN loader: ${a}`));};let r=document.querySelector(`script[src="${a}"]`);r?(r.addEventListener("load",()=>{T(e,n)();}),r.addEventListener("error",()=>n(new Error(`Failed to load TapKit CDN loader: ${a}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=o,o}var i=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),_,h,p=class{constructor(e){d(this,h);d(this,_);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await v(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[i]=new window.TapKit(e);}async ensureLoaded(){if(await this[l],!this[i])throw new Error("TapKit instance not initialized");return this[i]}get ready(){return this.ensureLoaded().then(e=>e.ready)}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e)).catch(n=>{});},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e)).catch(n=>{});},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e)).catch(n=>{});},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e)).catch(n=>{});},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e)).catch(n=>{});},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e)).catch(n=>{});},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e)).catch(n=>{});},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e)).catch(n=>{});},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e)).catch(n=>{});}}}get isOpen(){return this[i]?.isOpen??false}get isInitialized(){return this[i]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[i]&&this[i].destroy();}getVersion(){return this[i]?"Loaded from CDN (tap-sdk wrapper v0.2.8)":"Not initialized"}get[(h=i,_=l,Symbol.toStringTag)](){return "TapKit"}},A=p;
2
+ module.exports=A;//# 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","SDK_INSTANCE","SDK_INSTANCE_LOADING","_a","_b","TapKit","config","__publicField","sdk","params","callback","handler","index_default"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * TapKit wrapper - 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 TapKitConfig,\n TapKitInitParams,\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/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapKitInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void>;\n}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\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_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(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\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.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_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_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = () => {\n if (window.TapKit) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\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: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\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: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\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[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return \"Loaded from CDN (tap-sdk wrapper v0.2.5)\";\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
1
+ {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","createSDKChecker","resolve","reject","retryCount","startTime","checkSDK","loadCDNLoader","loadingPromise","script","existingScript","SDK_INSTANCE","SDK_INSTANCE_LOADING","_a","_b","TapKit","config","__publicField","sdk","params","error","callback","handler","index_default"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * TapKit wrapper - 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 TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from \"./types\";\n\n// Version injected at build time via tsup define\ndeclare const __PACKAGE_VERSION__: string;\n\nconst CDN_LOADER_URL = \"https://files.edutap.ai/tap-sdk/loader.js\";\n\n/**\n * Base TapKit instance interface\n * Shared properties and methods between core and wrapper\n */\ninterface TapKitBaseInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n}\n\n/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance extends TapKitBaseInstance {}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance extends TapKitBaseInstance {\n // Wrapper-specific method\n getVersion(): string;\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void\n): () => void {\n const MAX_RETRIES = 26; // 26 * 150ms ≈ 4 seconds max\n const TIMEOUT_MS = 4000; // 4 seconds total timeout\n let retryCount = 0;\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n if (window.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n retryCount++;\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout or max retries\n if (elapsed > TIMEOUT_MS) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(\n new Error(\n `TapKit loader timeout: SDK not available after ${TIMEOUT_MS}ms`\n )\n );\n return;\n }\n\n if (retryCount >= MAX_RETRIES) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(\n new Error(\n `TapKit loader failed: SDK not available after ${retryCount} retries`\n )\n );\n return;\n }\n\n setTimeout(checkSDK, 150);\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 */\nfunction loadCDNLoader(): 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(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\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 = createSDKChecker(resolve, reject);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.seekTimeline(params))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to call seekTimeline:\", error);\n });\n },\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onTimelineSeek(callback))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onTimelineSeek:\", error);\n });\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatInitiated(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatInitiated:\", error);\n });\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatOpened(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatOpened:\", error);\n });\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatClosed(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatClosed:\", error);\n });\n },\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onAlarmFadeIn(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onAlarmFadeIn:\", error);\n });\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPopUpOpen(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPopUpOpen:\", error);\n });\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPdfOpen(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPdfOpen:\", error);\n });\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPdfClose(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPdfClose:\", error);\n });\n },\n };\n }\n\n get isOpen(): boolean {\n return this[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return `Loaded from CDN (tap-sdk wrapper v${__PACKAGE_VERSION__})`;\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\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 T=Object.defineProperty;var c=(n,e,i)=>e in n?T(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var s=(n,e,i)=>c(n,typeof e!="symbol"?e+"":e,i);var d="https://files.edutap.ai/tap-sdk/loader.js";function _(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let n=new Promise((e,i)=>{if(typeof document>"u"){i(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=d,t.async=true,t.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${d}`));};let r=document.querySelector(`script[src="${d}"]`);r?(r.addEventListener("load",()=>{let a=()=>{window.TapKit?e():setTimeout(a,50);};a();}),r.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${d}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),p=Symbol("sdkInstanceLoading"),m,v,l=class{constructor(e){s(this,v);s(this,m);this[p]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await _(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[o]=new window.TapKit(e);}async ensureLoaded(){if(await this[p],!this[o])throw new Error("TapKit instance not initialized");return this[o]}get ready(){return this.ensureLoaded().then(e=>e.ready)}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(i=>i.events.seekTimeline(e));},onTimelineSeek:e=>{this.ensureLoaded().then(i=>i.events.onTimelineSeek(e));},onChatInitiated:e=>{this.ensureLoaded().then(i=>i.events.onChatInitiated(e));},onChatOpened:e=>{this.ensureLoaded().then(i=>i.events.onChatOpened(e));},onChatClosed:e=>{this.ensureLoaded().then(i=>i.events.onChatClosed(e));},onAlarmFadeIn:e=>{this.ensureLoaded().then(i=>i.events.onAlarmFadeIn(e));},onPopUpOpen:e=>{this.ensureLoaded().then(i=>i.events.onPopUpOpen(e));},onPdfOpen:e=>{this.ensureLoaded().then(i=>i.events.onPdfOpen(e));},onPdfClose:e=>{this.ensureLoaded().then(i=>i.events.onPdfClose(e));}}}get isOpen(){return this[o]?.isOpen??false}get isInitialized(){return this[o]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[o]&&this[o].destroy();}getVersion(){return this[o]?"Loaded from CDN (tap-sdk wrapper v0.2.5)":"Not initialized"}get[(v=o,m=p,Symbol.toStringTag)](){return "TapKit"}},I=l;
2
- export{I as default};//# sourceMappingURL=index.mjs.map
1
+ var m=Object.defineProperty;var I=(o,e,n)=>e in o?m(o,e,{enumerable:true,configurable:true,writable:true,value:n}):o[e]=n;var d=(o,e,n)=>I(o,typeof e!="symbol"?e+"":e,n);var a="https://files.edutap.ai/tap-sdk/loader.js";function T(o,e){let r=0,s=Date.now(),c=()=>{if(window.TapKit){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,o();return}if(r++,Date.now()-s>4e3){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error("TapKit loader timeout: SDK not available after 4000ms"));return}if(r>=26){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader failed: SDK not available after ${r} retries`));return}setTimeout(c,150);};return c}function v(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let o=new Promise((e,n)=>{if(typeof document>"u"){n(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=a,t.async=true,t.onload=()=>{T(e,n)();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,n(new Error(`Failed to load TapKit CDN loader: ${a}`));};let r=document.querySelector(`script[src="${a}"]`);r?(r.addEventListener("load",()=>{T(e,n)();}),r.addEventListener("error",()=>n(new Error(`Failed to load TapKit CDN loader: ${a}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=o,o}var i=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),_,h,p=class{constructor(e){d(this,h);d(this,_);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await v(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[i]=new window.TapKit(e);}async ensureLoaded(){if(await this[l],!this[i])throw new Error("TapKit instance not initialized");return this[i]}get ready(){return this.ensureLoaded().then(e=>e.ready)}get events(){return {seekTimeline:e=>{this.ensureLoaded().then(n=>n.events.seekTimeline(e)).catch(n=>{});},onTimelineSeek:e=>{this.ensureLoaded().then(n=>n.events.onTimelineSeek(e)).catch(n=>{});},onChatInitiated:e=>{this.ensureLoaded().then(n=>n.events.onChatInitiated(e)).catch(n=>{});},onChatOpened:e=>{this.ensureLoaded().then(n=>n.events.onChatOpened(e)).catch(n=>{});},onChatClosed:e=>{this.ensureLoaded().then(n=>n.events.onChatClosed(e)).catch(n=>{});},onAlarmFadeIn:e=>{this.ensureLoaded().then(n=>n.events.onAlarmFadeIn(e)).catch(n=>{});},onPopUpOpen:e=>{this.ensureLoaded().then(n=>n.events.onPopUpOpen(e)).catch(n=>{});},onPdfOpen:e=>{this.ensureLoaded().then(n=>n.events.onPdfOpen(e)).catch(n=>{});},onPdfClose:e=>{this.ensureLoaded().then(n=>n.events.onPdfClose(e)).catch(n=>{});}}}get isOpen(){return this[i]?.isOpen??false}get isInitialized(){return this[i]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[i]&&this[i].destroy();}getVersion(){return this[i]?"Loaded from CDN (tap-sdk wrapper v0.2.8)":"Not initialized"}get[(h=i,_=l,Symbol.toStringTag)](){return "TapKit"}},A=p;
2
+ export{A 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","SDK_INSTANCE","SDK_INSTANCE_LOADING","_a","_b","TapKit","config","__publicField","sdk","params","callback","handler","index_default"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TapKit wrapper - 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 TapKitConfig,\n TapKitInitParams,\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/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapKitInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void>;\n}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\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_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(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\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.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_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_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = () => {\n if (window.TapKit) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\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: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\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: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\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[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return \"Loaded from CDN (tap-sdk wrapper v0.2.5)\";\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
1
+ {"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","createSDKChecker","resolve","reject","retryCount","startTime","checkSDK","loadCDNLoader","loadingPromise","script","existingScript","SDK_INSTANCE","SDK_INSTANCE_LOADING","_a","_b","TapKit","config","__publicField","sdk","params","error","callback","handler","index_default"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TapKit wrapper - 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 TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from \"./types\";\n\n// Version injected at build time via tsup define\ndeclare const __PACKAGE_VERSION__: string;\n\nconst CDN_LOADER_URL = \"https://files.edutap.ai/tap-sdk/loader.js\";\n\n/**\n * Base TapKit instance interface\n * Shared properties and methods between core and wrapper\n */\ninterface TapKitBaseInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => 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 ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n}\n\n/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance extends TapKitBaseInstance {}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance extends TapKitBaseInstance {\n // Wrapper-specific method\n getVersion(): string;\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void\n): () => void {\n const MAX_RETRIES = 26; // 26 * 150ms ≈ 4 seconds max\n const TIMEOUT_MS = 4000; // 4 seconds total timeout\n let retryCount = 0;\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n if (window.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n retryCount++;\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout or max retries\n if (elapsed > TIMEOUT_MS) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(\n new Error(\n `TapKit loader timeout: SDK not available after ${TIMEOUT_MS}ms`\n )\n );\n return;\n }\n\n if (retryCount >= MAX_RETRIES) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(\n new Error(\n `TapKit loader failed: SDK not available after ${retryCount} retries`\n )\n );\n return;\n }\n\n setTimeout(checkSDK, 150);\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 */\nfunction loadCDNLoader(): 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(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\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 = createSDKChecker(resolve, reject);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.seekTimeline(params))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to call seekTimeline:\", error);\n });\n },\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onTimelineSeek(callback))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onTimelineSeek:\", error);\n });\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatInitiated(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatInitiated:\", error);\n });\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatOpened(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatOpened:\", error);\n });\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onChatClosed(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onChatClosed:\", error);\n });\n },\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onAlarmFadeIn(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onAlarmFadeIn:\", error);\n });\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPopUpOpen(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPopUpOpen:\", error);\n });\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPdfOpen(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPdfOpen:\", error);\n });\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded()\n .then((sdk) => sdk.events.onPdfClose(handler))\n .catch((error) => {\n console.error(\"[TapSDK] Failed to register onPdfClose:\", error);\n });\n },\n };\n }\n\n get isOpen(): boolean {\n return this[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return `Loaded from CDN (tap-sdk wrapper v${__PACKAGE_VERSION__})`;\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
package/index.ts CHANGED
@@ -16,14 +16,16 @@ import type {
16
16
  AlarmType,
17
17
  } from "./types";
18
18
 
19
+ // Version injected at build time via tsup define
20
+ declare const __PACKAGE_VERSION__: string;
21
+
19
22
  const CDN_LOADER_URL = "https://files.edutap.ai/tap-sdk/loader.js";
20
23
 
21
24
  /**
22
- * TapKit instance type from tap-kit-core
23
- * This matches the actual TapKit class exported from @coxwave/tap-kit-core
24
- * Exported for advanced use cases (e.g., when using window.TapKit directly)
25
+ * Base TapKit instance interface
26
+ * Shared properties and methods between core and wrapper
25
27
  */
26
- export interface TapKitCoreInstance {
28
+ interface TapKitBaseInstance {
27
29
  events: {
28
30
  seekTimeline: (params: SeekTimelineParamsType) => void;
29
31
  onTimelineSeek: (
@@ -44,14 +46,15 @@ export interface TapKitCoreInstance {
44
46
  ready: Promise<void>;
45
47
  init(params: TapKitInitParams): Promise<void>;
46
48
  destroy(): void;
47
- // Deprecated methods
48
- initChat(params: TapKitInitParams): Promise<void>;
49
- postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;
50
- getTimelineInfo(params: {
51
- callback: (clipPlayHead: number, clipId: string) => void;
52
- }): Promise<void>;
53
49
  }
54
50
 
51
+ /**
52
+ * TapKit instance type from tap-kit-core
53
+ * This matches the actual TapKit class exported from @coxwave/tap-kit-core
54
+ * Exported for advanced use cases (e.g., when using window.TapKit directly)
55
+ */
56
+ export interface TapKitCoreInstance extends TapKitBaseInstance {}
57
+
55
58
  // Global namespace for loaded SDK
56
59
  // Export type for IIFE bundles loaded via window.TapKit
57
60
  export type TapKitConstructor = new (
@@ -70,30 +73,61 @@ declare global {
70
73
  * Public TapKit instance interface
71
74
  * This is what users interact with when using the SDK
72
75
  */
73
- export interface TapKitInstance {
74
- events: {
75
- seekTimeline: (params: SeekTimelineParamsType) => void;
76
- onTimelineSeek: (
77
- callback: (clipPlayHead: number, clipId: string) => void
78
- ) => void;
79
- onChatInitiated: (handler: () => void) => void;
80
- onChatOpened: (handler: () => void) => void;
81
- onChatClosed: (handler: () => void) => void;
82
- onAlarmFadeIn: (
83
- handler: (messageInfo: AlarmMessageInstanceType) => void
84
- ) => void;
85
- onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
86
- onPdfOpen: (handler: () => void) => void;
87
- onPdfClose: (handler: () => void) => void;
88
- };
89
- isOpen: boolean;
90
- isInitialized: boolean;
91
- ready: Promise<void>;
92
- init(params: TapKitInitParams): Promise<void>;
93
- destroy(): void;
76
+ export interface TapKitInstance extends TapKitBaseInstance {
77
+ // Wrapper-specific method
94
78
  getVersion(): string;
95
79
  }
96
80
 
81
+ /**
82
+ * Creates a SDK checker function with timeout and retry logic
83
+ */
84
+ function createSDKChecker(
85
+ resolve: (value: void | PromiseLike<void>) => void,
86
+ reject: (reason?: any) => void
87
+ ): () => void {
88
+ const MAX_RETRIES = 26; // 26 * 150ms ≈ 4 seconds max
89
+ const TIMEOUT_MS = 4000; // 4 seconds total timeout
90
+ let retryCount = 0;
91
+ const startTime = Date.now();
92
+
93
+ const checkSDK = (): void => {
94
+ if (window.TapKit) {
95
+ window.__TAP_KIT_LOADER_LOADED__ = true;
96
+ window.__TAP_KIT_LOADER_LOADING__ = undefined;
97
+ resolve();
98
+ return;
99
+ }
100
+
101
+ retryCount++;
102
+ const elapsed = Date.now() - startTime;
103
+
104
+ // Check if exceeded timeout or max retries
105
+ if (elapsed > TIMEOUT_MS) {
106
+ window.__TAP_KIT_LOADER_LOADING__ = undefined;
107
+ reject(
108
+ new Error(
109
+ `TapKit loader timeout: SDK not available after ${TIMEOUT_MS}ms`
110
+ )
111
+ );
112
+ return;
113
+ }
114
+
115
+ if (retryCount >= MAX_RETRIES) {
116
+ window.__TAP_KIT_LOADER_LOADING__ = undefined;
117
+ reject(
118
+ new Error(
119
+ `TapKit loader failed: SDK not available after ${retryCount} retries`
120
+ )
121
+ );
122
+ return;
123
+ }
124
+
125
+ setTimeout(checkSDK, 150);
126
+ };
127
+
128
+ return checkSDK;
129
+ }
130
+
97
131
  /**
98
132
  * Loads the CDN loader script
99
133
  * The loader will then fetch versions.json and load the appropriate SDK version
@@ -125,16 +159,7 @@ function loadCDNLoader(): Promise<void> {
125
159
  script.onload = () => {
126
160
  // The loader script will load the actual SDK
127
161
  // We need to wait a bit for the loader to fetch and load the SDK
128
- const checkSDK = () => {
129
- if (window.TapKit) {
130
- window.__TAP_KIT_LOADER_LOADED__ = true;
131
- window.__TAP_KIT_LOADER_LOADING__ = undefined;
132
- resolve();
133
- } else {
134
- // Check again after a short delay
135
- setTimeout(checkSDK, 50);
136
- }
137
- };
162
+ const checkSDK = createSDKChecker(resolve, reject);
138
163
  checkSDK();
139
164
  };
140
165
 
@@ -150,10 +175,7 @@ function loadCDNLoader(): Promise<void> {
150
175
  if (existingScript) {
151
176
  // Script already added but not yet loaded
152
177
  existingScript.addEventListener("load", () => {
153
- const checkSDK = () => {
154
- if (window.TapKit) resolve();
155
- else setTimeout(checkSDK, 50);
156
- };
178
+ const checkSDK = createSDKChecker(resolve, reject);
157
179
  checkSDK();
158
180
  });
159
181
  existingScript.addEventListener("error", () =>
@@ -215,35 +237,71 @@ class TapKit implements TapKitInstance {
215
237
  get events() {
216
238
  return {
217
239
  seekTimeline: (params: SeekTimelineParamsType) => {
218
- this.ensureLoaded().then((sdk) => sdk.events.seekTimeline(params));
240
+ this.ensureLoaded()
241
+ .then((sdk) => sdk.events.seekTimeline(params))
242
+ .catch((error) => {
243
+ console.error("[TapSDK] Failed to call seekTimeline:", error);
244
+ });
219
245
  },
220
246
  onTimelineSeek: (
221
247
  callback: (clipPlayHead: number, clipId: string) => void
222
248
  ) => {
223
- this.ensureLoaded().then((sdk) => sdk.events.onTimelineSeek(callback));
249
+ this.ensureLoaded()
250
+ .then((sdk) => sdk.events.onTimelineSeek(callback))
251
+ .catch((error) => {
252
+ console.error("[TapSDK] Failed to register onTimelineSeek:", error);
253
+ });
224
254
  },
225
255
  onChatInitiated: (handler: () => void) => {
226
- this.ensureLoaded().then((sdk) => sdk.events.onChatInitiated(handler));
256
+ this.ensureLoaded()
257
+ .then((sdk) => sdk.events.onChatInitiated(handler))
258
+ .catch((error) => {
259
+ console.error("[TapSDK] Failed to register onChatInitiated:", error);
260
+ });
227
261
  },
228
262
  onChatOpened: (handler: () => void) => {
229
- this.ensureLoaded().then((sdk) => sdk.events.onChatOpened(handler));
263
+ this.ensureLoaded()
264
+ .then((sdk) => sdk.events.onChatOpened(handler))
265
+ .catch((error) => {
266
+ console.error("[TapSDK] Failed to register onChatOpened:", error);
267
+ });
230
268
  },
231
269
  onChatClosed: (handler: () => void) => {
232
- this.ensureLoaded().then((sdk) => sdk.events.onChatClosed(handler));
270
+ this.ensureLoaded()
271
+ .then((sdk) => sdk.events.onChatClosed(handler))
272
+ .catch((error) => {
273
+ console.error("[TapSDK] Failed to register onChatClosed:", error);
274
+ });
233
275
  },
234
276
  onAlarmFadeIn: (
235
277
  handler: (messageInfo: AlarmMessageInstanceType) => void
236
278
  ) => {
237
- this.ensureLoaded().then((sdk) => sdk.events.onAlarmFadeIn(handler));
279
+ this.ensureLoaded()
280
+ .then((sdk) => sdk.events.onAlarmFadeIn(handler))
281
+ .catch((error) => {
282
+ console.error("[TapSDK] Failed to register onAlarmFadeIn:", error);
283
+ });
238
284
  },
239
285
  onPopUpOpen: (handler: (popUpInfo: any) => void) => {
240
- this.ensureLoaded().then((sdk) => sdk.events.onPopUpOpen(handler));
286
+ this.ensureLoaded()
287
+ .then((sdk) => sdk.events.onPopUpOpen(handler))
288
+ .catch((error) => {
289
+ console.error("[TapSDK] Failed to register onPopUpOpen:", error);
290
+ });
241
291
  },
242
292
  onPdfOpen: (handler: () => void) => {
243
- this.ensureLoaded().then((sdk) => sdk.events.onPdfOpen(handler));
293
+ this.ensureLoaded()
294
+ .then((sdk) => sdk.events.onPdfOpen(handler))
295
+ .catch((error) => {
296
+ console.error("[TapSDK] Failed to register onPdfOpen:", error);
297
+ });
244
298
  },
245
299
  onPdfClose: (handler: () => void) => {
246
- this.ensureLoaded().then((sdk) => sdk.events.onPdfClose(handler));
300
+ this.ensureLoaded()
301
+ .then((sdk) => sdk.events.onPdfClose(handler))
302
+ .catch((error) => {
303
+ console.error("[TapSDK] Failed to register onPdfClose:", error);
304
+ });
247
305
  },
248
306
  };
249
307
  }
@@ -273,7 +331,7 @@ class TapKit implements TapKitInstance {
273
331
  if (!this[SDK_INSTANCE]) {
274
332
  return "Not initialized";
275
333
  }
276
- return "Loaded from CDN (tap-sdk wrapper v0.2.5)";
334
+ return `Loaded from CDN (tap-sdk wrapper v${__PACKAGE_VERSION__})`;
277
335
  }
278
336
 
279
337
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coxwave/tap-sdk",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "type": "module",
5
5
  "description": "TapSDK - Minimal wrapper that loads TapSDK from CDN",
6
6
  "main": "dist/index.js",