@coxwave/tap-sdk 0.2.2-demo.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -44,11 +44,39 @@ type SeekTimelineParamsType = {
44
44
  *
45
45
  * Simply loads the CDN loader which handles version management and SDK loading.
46
46
  * This keeps the npm package minimal and allows instant updates via CDN.
47
- *
48
- * Demo version: Automatically configures localStorage for demo environment.
49
47
  */
50
48
 
51
- type TapKitConstructor = new (config: TapKitConfig) => TapKitInstance;
49
+ /**
50
+ * TapKit instance type from tap-kit-core
51
+ * This matches the actual TapKit class exported from @coxwave/tap-kit-core
52
+ */
53
+ interface TapKitCoreInstance {
54
+ events: {
55
+ seekTimeline: (params: SeekTimelineParamsType) => void;
56
+ onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
57
+ onChatInitiated: (handler: () => void) => void;
58
+ onChatOpened: (handler: () => void) => void;
59
+ onChatClosed: (handler: () => void) => void;
60
+ onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;
61
+ onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
62
+ onPdfOpen: (handler: () => void) => void;
63
+ onPdfClose: (handler: () => void) => void;
64
+ };
65
+ isOpen: boolean;
66
+ isInitialized: boolean;
67
+ ready: Promise<void>;
68
+ init(params: TapKitInitParams): Promise<void>;
69
+ destroy(): void;
70
+ initChat(params: TapKitInitParams): Promise<void>;
71
+ postChatInfo(params: {
72
+ clipId: string;
73
+ clipPlayHead: number;
74
+ }): Promise<void>;
75
+ getTimelineInfo(params: {
76
+ callback: (clipPlayHead: number, clipId: string) => void;
77
+ }): Promise<void>;
78
+ }
79
+ type TapKitConstructor = new (config: TapKitConfig) => TapKitCoreInstance;
52
80
  declare global {
53
81
  interface Window {
54
82
  TapKit?: TapKitConstructor;
@@ -56,6 +84,10 @@ declare global {
56
84
  __TAP_KIT_LOADER_LOADING__?: Promise<void>;
57
85
  }
58
86
  }
87
+ /**
88
+ * Public TapKit instance interface
89
+ * This is what users interact with when using the SDK
90
+ */
59
91
  interface TapKitInstance {
60
92
  events: {
61
93
  seekTimeline: (params: SeekTimelineParamsType) => void;
@@ -70,7 +102,7 @@ interface TapKitInstance {
70
102
  };
71
103
  isOpen: boolean;
72
104
  isInitialized: boolean;
73
- readyPromise: Promise<void>;
105
+ ready: Promise<void>;
74
106
  init(params: TapKitInitParams): Promise<void>;
75
107
  destroy(): void;
76
108
  getVersion(): string;
@@ -96,7 +128,7 @@ declare class TapKit implements TapKitInstance {
96
128
  constructor(config: TapKitConfig);
97
129
  private loadAndInitialize;
98
130
  private ensureLoaded;
99
- get readyPromise(): Promise<void>;
131
+ get ready(): Promise<void>;
100
132
  get events(): {
101
133
  seekTimeline: (params: SeekTimelineParamsType) => void;
102
134
  onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
@@ -123,4 +155,4 @@ declare class TapKit implements TapKitInstance {
123
155
  }): Promise<void>;
124
156
  }
125
157
 
126
- export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitInstance as TapKit, type TapKitConfig, type TapKitConstructor, type TapKitInitParams, TapKit as default };
158
+ export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitConfig, type TapKitConstructor, type TapKitInitParams, type TapKitInstance, TapKit as default };
package/dist/index.d.ts CHANGED
@@ -44,11 +44,39 @@ type SeekTimelineParamsType = {
44
44
  *
45
45
  * Simply loads the CDN loader which handles version management and SDK loading.
46
46
  * This keeps the npm package minimal and allows instant updates via CDN.
47
- *
48
- * Demo version: Automatically configures localStorage for demo environment.
49
47
  */
50
48
 
51
- type TapKitConstructor = new (config: TapKitConfig) => TapKitInstance;
49
+ /**
50
+ * TapKit instance type from tap-kit-core
51
+ * This matches the actual TapKit class exported from @coxwave/tap-kit-core
52
+ */
53
+ interface TapKitCoreInstance {
54
+ events: {
55
+ seekTimeline: (params: SeekTimelineParamsType) => void;
56
+ onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
57
+ onChatInitiated: (handler: () => void) => void;
58
+ onChatOpened: (handler: () => void) => void;
59
+ onChatClosed: (handler: () => void) => void;
60
+ onAlarmFadeIn: (handler: (messageInfo: AlarmMessageInstanceType) => void) => void;
61
+ onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
62
+ onPdfOpen: (handler: () => void) => void;
63
+ onPdfClose: (handler: () => void) => void;
64
+ };
65
+ isOpen: boolean;
66
+ isInitialized: boolean;
67
+ ready: Promise<void>;
68
+ init(params: TapKitInitParams): Promise<void>;
69
+ destroy(): void;
70
+ initChat(params: TapKitInitParams): Promise<void>;
71
+ postChatInfo(params: {
72
+ clipId: string;
73
+ clipPlayHead: number;
74
+ }): Promise<void>;
75
+ getTimelineInfo(params: {
76
+ callback: (clipPlayHead: number, clipId: string) => void;
77
+ }): Promise<void>;
78
+ }
79
+ type TapKitConstructor = new (config: TapKitConfig) => TapKitCoreInstance;
52
80
  declare global {
53
81
  interface Window {
54
82
  TapKit?: TapKitConstructor;
@@ -56,6 +84,10 @@ declare global {
56
84
  __TAP_KIT_LOADER_LOADING__?: Promise<void>;
57
85
  }
58
86
  }
87
+ /**
88
+ * Public TapKit instance interface
89
+ * This is what users interact with when using the SDK
90
+ */
59
91
  interface TapKitInstance {
60
92
  events: {
61
93
  seekTimeline: (params: SeekTimelineParamsType) => void;
@@ -70,7 +102,7 @@ interface TapKitInstance {
70
102
  };
71
103
  isOpen: boolean;
72
104
  isInitialized: boolean;
73
- readyPromise: Promise<void>;
105
+ ready: Promise<void>;
74
106
  init(params: TapKitInitParams): Promise<void>;
75
107
  destroy(): void;
76
108
  getVersion(): string;
@@ -96,7 +128,7 @@ declare class TapKit implements TapKitInstance {
96
128
  constructor(config: TapKitConfig);
97
129
  private loadAndInitialize;
98
130
  private ensureLoaded;
99
- get readyPromise(): Promise<void>;
131
+ get ready(): Promise<void>;
100
132
  get events(): {
101
133
  seekTimeline: (params: SeekTimelineParamsType) => void;
102
134
  onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
@@ -123,4 +155,4 @@ declare class TapKit implements TapKitInstance {
123
155
  }): Promise<void>;
124
156
  }
125
157
 
126
- export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitInstance as TapKit, type TapKitConfig, type TapKitConstructor, type TapKitInitParams, TapKit as default };
158
+ export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitConfig, type TapKitConstructor, type TapKitInitParams, type TapKitInstance, TapKit as default };
@@ -1,3 +1,3 @@
1
- var TapSDK=(function(){'use strict';var T=Object.defineProperty;var v=(n,e,i)=>e in n?T(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var r=(n,e,i)=>v(n,typeof e!="symbol"?e+"":e,i);typeof localStorage<"u"&&(localStorage.setItem("tap-url-storage",JSON.stringify({state:{tapUrl:"https://edutap-ai-git-demo-coxwave.vercel.app"}})),localStorage.setItem("tap-api-url-storage",JSON.stringify({state:{apiUrl:"https://tapadminstaging.coxwave.link"}})),localStorage.setItem("tap-environment","demo"),console.log("[TapSDK Demo] Environment configured:",{tapUrl:"https://edutap-ai-git-demo-coxwave.vercel.app",apiUrl:"https://tapadminstaging.coxwave.link",environment:"demo"}));var s="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 o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapKit?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var t=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),c,m;m=t,c=l;var p=class{constructor(e){r(this,m);r(this,c);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(console.log("[tap-sdk] Loading CDN loader..."),await _(),console.log("[tap-sdk] CDN loader loaded, window.TapKit:",!!window.TapKit),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");console.log("[tap-sdk] Creating TapKit instance..."),this[t]=new window.TapKit(e),console.log("[tap-sdk] TapKit instance created");}async ensureLoaded(){if(console.log("[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING..."),await this[l],console.log("[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed"),!this[t])throw new Error("TapKit instance not initialized");return console.log("[tap-sdk] ensureLoaded: returning SDK instance"),this[t]}get readyPromise(){return this.ensureLoaded().then(e=>e.readyPromise)}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[t]?.isOpen??false}get isInitialized(){return this[t]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[t]&&this[t].destroy();}getVersion(){return this[t]?.getVersion()??"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},h=p;
2
- return h;})();//# sourceMappingURL=index.global.js.map
1
+ var TapSDK=(function(){'use strict';var c=Object.defineProperty;var T=(n,e,i)=>e in n?c(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var r=(n,e,i)=>T(n,typeof e!="symbol"?e+"":e,i);var d="https://files.edutap.ai/tap-sdk/loader.js";function h(){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 a=document.createElement("script");a.src=d,a.async=true,a.onload=()=>{let t=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(t,50);};t();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${d}`));};let s=document.querySelector(`script[src="${d}"]`);s?(s.addEventListener("load",()=>{let t=()=>{window.TapKit?e():setTimeout(t,50);};t();}),s.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${d}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),m,v;v=o,m=l;var p=class{constructor(e){r(this,v);r(this,m);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await h(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[o]=new window.TapKit(e);}async ensureLoaded(){if(await this[l],!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.0.11)":"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},P=p;
2
+ return P;})();//# 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":"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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 * Demo version: Automatically configures localStorage for demo environment.\n */\n\n// Configure demo environment if this is the demo version\nif (typeof localStorage !== \"undefined\") {\n // Demo edutap FE URL\n localStorage.setItem(\n \"tap-url-storage\",\n JSON.stringify({\n state: { tapUrl: \"https://edutap-ai-git-demo-coxwave.vercel.app\" },\n })\n );\n\n // Demo API URL\n localStorage.setItem(\n \"tap-api-url-storage\",\n JSON.stringify({\n state: { apiUrl: \"https://tapadminstaging.coxwave.link\" },\n })\n );\n\n // Demo environment flag (enables console logging)\n localStorage.setItem(\"tap-environment\", \"demo\");\n\n console.log(\"[TapSDK Demo] Environment configured:\", {\n tapUrl: \"https://edutap-ai-git-demo-coxwave.vercel.app\",\n apiUrl: \"https://tapadminstaging.coxwave.link\",\n environment: \"demo\",\n });\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// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (config: TapKitConfig) => TapKitInstance;\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\ninterface 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 readyPromise: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\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/**\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]?: TapKitInstance;\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 console.log(\"[tap-sdk] Loading CDN loader...\");\n await loadCDNLoader();\n console.log(\"[tap-sdk] CDN loader loaded, window.TapKit:\", !!window.TapKit);\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[tap-sdk] Creating TapKit instance...\");\n this[SDK_INSTANCE] = new window.TapKit(config);\n console.log(\"[tap-sdk] TapKit instance created\");\n }\n\n private async ensureLoaded(): Promise<TapKitInstance> {\n console.log(\"[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING...\");\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n console.log(\"[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed\");\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n console.log(\"[tap-sdk] ensureLoaded: returning SDK instance\");\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's readyPromise for advanced users\n // This resolves after init() is called and tap-kit-core is fully initialized\n get readyPromise(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.readyPromise);\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 return this[SDK_INSTANCE]?.getVersion() ?? \"Not initialized\";\n }\n\n // Deprecated methods\n async initChat(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: {\n clipId: string;\n clipPlayHead: number;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// Export TapKit instance type (for: import type { TapKit } from '@coxwave/tap-sdk')\nexport type { TapKitInstance as TapKit };\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","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.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 */\ninterface 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 // 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/**\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.0.11)\";\n }\n\n // Deprecated methods\n async initChat(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: {\n clipId: string;\n clipPlayHead: number;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import 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 v=(n,e,i)=>e in n?T(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var r=(n,e,i)=>v(n,typeof e!="symbol"?e+"":e,i);typeof localStorage<"u"&&(localStorage.setItem("tap-url-storage",JSON.stringify({state:{tapUrl:"https://edutap-ai-git-demo-coxwave.vercel.app"}})),localStorage.setItem("tap-api-url-storage",JSON.stringify({state:{apiUrl:"https://tapadminstaging.coxwave.link"}})),localStorage.setItem("tap-environment","demo"),console.log("[TapSDK Demo] Environment configured:",{tapUrl:"https://edutap-ai-git-demo-coxwave.vercel.app",apiUrl:"https://tapadminstaging.coxwave.link",environment:"demo"}));var s="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 o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapKit?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var t=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),c,m;m=t,c=l;var p=class{constructor(e){r(this,m);r(this,c);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(console.log("[tap-sdk] Loading CDN loader..."),await _(),console.log("[tap-sdk] CDN loader loaded, window.TapKit:",!!window.TapKit),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");console.log("[tap-sdk] Creating TapKit instance..."),this[t]=new window.TapKit(e),console.log("[tap-sdk] TapKit instance created");}async ensureLoaded(){if(console.log("[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING..."),await this[l],console.log("[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed"),!this[t])throw new Error("TapKit instance not initialized");return console.log("[tap-sdk] ensureLoaded: returning SDK instance"),this[t]}get readyPromise(){return this.ensureLoaded().then(e=>e.readyPromise)}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[t]?.isOpen??false}get isInitialized(){return this[t]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[t]&&this[t].destroy();}getVersion(){return this[t]?.getVersion()??"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},h=p;
2
- module.exports=h;//# sourceMappingURL=index.js.map
1
+ 'use strict';var c=Object.defineProperty;var T=(n,e,i)=>e in n?c(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var r=(n,e,i)=>T(n,typeof e!="symbol"?e+"":e,i);var d="https://files.edutap.ai/tap-sdk/loader.js";function h(){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 a=document.createElement("script");a.src=d,a.async=true,a.onload=()=>{let t=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(t,50);};t();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${d}`));};let s=document.querySelector(`script[src="${d}"]`);s?(s.addEventListener("load",()=>{let t=()=>{window.TapKit?e():setTimeout(t,50);};t();}),s.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${d}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),m,v;v=o,m=l;var p=class{constructor(e){r(this,v);r(this,m);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await h(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[o]=new window.TapKit(e);}async ensureLoaded(){if(await this[l],!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.0.11)":"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},P=p;
2
+ module.exports=P;//# 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 * Demo version: Automatically configures localStorage for demo environment.\n */\n\n// Configure demo environment if this is the demo version\nif (typeof localStorage !== \"undefined\") {\n // Demo edutap FE URL\n localStorage.setItem(\n \"tap-url-storage\",\n JSON.stringify({\n state: { tapUrl: \"https://edutap-ai-git-demo-coxwave.vercel.app\" },\n })\n );\n\n // Demo API URL\n localStorage.setItem(\n \"tap-api-url-storage\",\n JSON.stringify({\n state: { apiUrl: \"https://tapadminstaging.coxwave.link\" },\n })\n );\n\n // Demo environment flag (enables console logging)\n localStorage.setItem(\"tap-environment\", \"demo\");\n\n console.log(\"[TapSDK Demo] Environment configured:\", {\n tapUrl: \"https://edutap-ai-git-demo-coxwave.vercel.app\",\n apiUrl: \"https://tapadminstaging.coxwave.link\",\n environment: \"demo\",\n });\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// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (config: TapKitConfig) => TapKitInstance;\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\ninterface 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 readyPromise: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\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/**\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]?: TapKitInstance;\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 console.log(\"[tap-sdk] Loading CDN loader...\");\n await loadCDNLoader();\n console.log(\"[tap-sdk] CDN loader loaded, window.TapKit:\", !!window.TapKit);\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[tap-sdk] Creating TapKit instance...\");\n this[SDK_INSTANCE] = new window.TapKit(config);\n console.log(\"[tap-sdk] TapKit instance created\");\n }\n\n private async ensureLoaded(): Promise<TapKitInstance> {\n console.log(\"[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING...\");\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n console.log(\"[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed\");\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n console.log(\"[tap-sdk] ensureLoaded: returning SDK instance\");\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's readyPromise for advanced users\n // This resolves after init() is called and tap-kit-core is fully initialized\n get readyPromise(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.readyPromise);\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 return this[SDK_INSTANCE]?.getVersion() ?? \"Not initialized\";\n }\n\n // Deprecated methods\n async initChat(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: {\n clipId: string;\n clipPlayHead: number;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// Export TapKit instance type (for: import type { TapKit } from '@coxwave/tap-sdk')\nexport type { TapKitInstance as TapKit };\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","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 */\ninterface 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 // 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/**\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.0.11)\";\n }\n\n // Deprecated methods\n async initChat(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: {\n clipId: string;\n clipPlayHead: number;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import 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 v=(n,e,i)=>e in n?T(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var r=(n,e,i)=>v(n,typeof e!="symbol"?e+"":e,i);typeof localStorage<"u"&&(localStorage.setItem("tap-url-storage",JSON.stringify({state:{tapUrl:"https://edutap-ai-git-demo-coxwave.vercel.app"}})),localStorage.setItem("tap-api-url-storage",JSON.stringify({state:{apiUrl:"https://tapadminstaging.coxwave.link"}})),localStorage.setItem("tap-environment","demo"),console.log("[TapSDK Demo] Environment configured:",{tapUrl:"https://edutap-ai-git-demo-coxwave.vercel.app",apiUrl:"https://tapadminstaging.coxwave.link",environment:"demo"}));var s="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 o=document.createElement("script");o.src=s,o.async=true,o.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},o.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${s}`));};let d=document.querySelector(`script[src="${s}"]`);d?(d.addEventListener("load",()=>{let a=()=>{window.TapKit?e():setTimeout(a,50);};a();}),d.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${s}`)))):document.head.appendChild(o);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var t=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),c,m;m=t,c=l;var p=class{constructor(e){r(this,m);r(this,c);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(console.log("[tap-sdk] Loading CDN loader..."),await _(),console.log("[tap-sdk] CDN loader loaded, window.TapKit:",!!window.TapKit),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");console.log("[tap-sdk] Creating TapKit instance..."),this[t]=new window.TapKit(e),console.log("[tap-sdk] TapKit instance created");}async ensureLoaded(){if(console.log("[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING..."),await this[l],console.log("[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed"),!this[t])throw new Error("TapKit instance not initialized");return console.log("[tap-sdk] ensureLoaded: returning SDK instance"),this[t]}get readyPromise(){return this.ensureLoaded().then(e=>e.readyPromise)}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[t]?.isOpen??false}get isInitialized(){return this[t]?.isInitialized??false}async init(e){return (await this.ensureLoaded()).init(e)}destroy(){this[t]&&this[t].destroy();}getVersion(){return this[t]?.getVersion()??"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},h=p;
2
- export{h as default};//# sourceMappingURL=index.mjs.map
1
+ var c=Object.defineProperty;var T=(n,e,i)=>e in n?c(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var r=(n,e,i)=>T(n,typeof e!="symbol"?e+"":e,i);var d="https://files.edutap.ai/tap-sdk/loader.js";function h(){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 a=document.createElement("script");a.src=d,a.async=true,a.onload=()=>{let t=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(t,50);};t();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${d}`));};let s=document.querySelector(`script[src="${d}"]`);s?(s.addEventListener("load",()=>{let t=()=>{window.TapKit?e():setTimeout(t,50);};t();}),s.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${d}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),m,v;v=o,m=l;var p=class{constructor(e){r(this,v);r(this,m);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await h(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this[o]=new window.TapKit(e);}async ensureLoaded(){if(await this[l],!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.0.11)":"Not initialized"}async initChat(e){return (await this.ensureLoaded()).initChat(e)}async postChatInfo(e){return (await this.ensureLoaded()).postChatInfo(e)}async getTimelineInfo(e){return (await this.ensureLoaded()).getTimelineInfo(e)}},P=p;
2
+ export{P 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 * Demo version: Automatically configures localStorage for demo environment.\n */\n\n// Configure demo environment if this is the demo version\nif (typeof localStorage !== \"undefined\") {\n // Demo edutap FE URL\n localStorage.setItem(\n \"tap-url-storage\",\n JSON.stringify({\n state: { tapUrl: \"https://edutap-ai-git-demo-coxwave.vercel.app\" },\n })\n );\n\n // Demo API URL\n localStorage.setItem(\n \"tap-api-url-storage\",\n JSON.stringify({\n state: { apiUrl: \"https://tapadminstaging.coxwave.link\" },\n })\n );\n\n // Demo environment flag (enables console logging)\n localStorage.setItem(\"tap-environment\", \"demo\");\n\n console.log(\"[TapSDK Demo] Environment configured:\", {\n tapUrl: \"https://edutap-ai-git-demo-coxwave.vercel.app\",\n apiUrl: \"https://tapadminstaging.coxwave.link\",\n environment: \"demo\",\n });\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// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (config: TapKitConfig) => TapKitInstance;\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\ninterface 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 readyPromise: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\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/**\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]?: TapKitInstance;\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 console.log(\"[tap-sdk] Loading CDN loader...\");\n await loadCDNLoader();\n console.log(\"[tap-sdk] CDN loader loaded, window.TapKit:\", !!window.TapKit);\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[tap-sdk] Creating TapKit instance...\");\n this[SDK_INSTANCE] = new window.TapKit(config);\n console.log(\"[tap-sdk] TapKit instance created\");\n }\n\n private async ensureLoaded(): Promise<TapKitInstance> {\n console.log(\"[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING...\");\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n console.log(\"[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed\");\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n console.log(\"[tap-sdk] ensureLoaded: returning SDK instance\");\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's readyPromise for advanced users\n // This resolves after init() is called and tap-kit-core is fully initialized\n get readyPromise(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.readyPromise);\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 return this[SDK_INSTANCE]?.getVersion() ?? \"Not initialized\";\n }\n\n // Deprecated methods\n async initChat(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: {\n clipId: string;\n clipPlayHead: number;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// Export TapKit instance type (for: import type { TapKit } from '@coxwave/tap-sdk')\nexport type { TapKitInstance as TapKit };\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","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 */\ninterface 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 // 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/**\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.0.11)\";\n }\n\n // Deprecated methods\n async initChat(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.initChat(params);\n }\n\n async postChatInfo(params: {\n clipId: string;\n clipPlayHead: number;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.postChatInfo(params);\n }\n\n async getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.getTimelineInfo(params);\n }\n}\n\n// Export the SDK class as default (for: import 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
@@ -3,38 +3,8 @@
3
3
  *
4
4
  * Simply loads the CDN loader which handles version management and SDK loading.
5
5
  * This keeps the npm package minimal and allows instant updates via CDN.
6
- *
7
- * Demo version: Automatically configures localStorage for demo environment.
8
6
  */
9
7
 
10
- // Configure demo environment if this is the demo version
11
- if (typeof localStorage !== "undefined") {
12
- // Demo edutap FE URL
13
- localStorage.setItem(
14
- "tap-url-storage",
15
- JSON.stringify({
16
- state: { tapUrl: "https://edutap-ai-git-demo-coxwave.vercel.app" },
17
- })
18
- );
19
-
20
- // Demo API URL
21
- localStorage.setItem(
22
- "tap-api-url-storage",
23
- JSON.stringify({
24
- state: { apiUrl: "https://tapadminstaging.coxwave.link" },
25
- })
26
- );
27
-
28
- // Demo environment flag (enables console logging)
29
- localStorage.setItem("tap-environment", "demo");
30
-
31
- console.log("[TapSDK Demo] Environment configured:", {
32
- tapUrl: "https://edutap-ai-git-demo-coxwave.vercel.app",
33
- apiUrl: "https://tapadminstaging.coxwave.link",
34
- environment: "demo",
35
- });
36
- }
37
-
38
8
  import type {
39
9
  TapKitConfig,
40
10
  TapKitInitParams,
@@ -48,9 +18,44 @@ import type {
48
18
 
49
19
  const CDN_LOADER_URL = "https://files.edutap.ai/tap-sdk/loader.js";
50
20
 
21
+ /**
22
+ * TapKit instance type from tap-kit-core
23
+ * This matches the actual TapKit class exported from @coxwave/tap-kit-core
24
+ */
25
+ interface TapKitCoreInstance {
26
+ events: {
27
+ seekTimeline: (params: SeekTimelineParamsType) => void;
28
+ onTimelineSeek: (
29
+ callback: (clipPlayHead: number, clipId: string) => void
30
+ ) => void;
31
+ onChatInitiated: (handler: () => void) => void;
32
+ onChatOpened: (handler: () => void) => void;
33
+ onChatClosed: (handler: () => void) => void;
34
+ onAlarmFadeIn: (
35
+ handler: (messageInfo: AlarmMessageInstanceType) => void
36
+ ) => void;
37
+ onPopUpOpen: (handler: (popUpInfo: any) => void) => void;
38
+ onPdfOpen: (handler: () => void) => void;
39
+ onPdfClose: (handler: () => void) => void;
40
+ };
41
+ isOpen: boolean;
42
+ isInitialized: boolean;
43
+ ready: Promise<void>;
44
+ init(params: TapKitInitParams): Promise<void>;
45
+ destroy(): void;
46
+ // Deprecated methods
47
+ initChat(params: TapKitInitParams): Promise<void>;
48
+ postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;
49
+ getTimelineInfo(params: {
50
+ callback: (clipPlayHead: number, clipId: string) => void;
51
+ }): Promise<void>;
52
+ }
53
+
51
54
  // Global namespace for loaded SDK
52
55
  // Export type for IIFE bundles loaded via window.TapKit
53
- export type TapKitConstructor = new (config: TapKitConfig) => TapKitInstance;
56
+ export type TapKitConstructor = new (
57
+ config: TapKitConfig
58
+ ) => TapKitCoreInstance;
54
59
 
55
60
  declare global {
56
61
  interface Window {
@@ -60,7 +65,11 @@ declare global {
60
65
  }
61
66
  }
62
67
 
63
- interface TapKitInstance {
68
+ /**
69
+ * Public TapKit instance interface
70
+ * This is what users interact with when using the SDK
71
+ */
72
+ export interface TapKitInstance {
64
73
  events: {
65
74
  seekTimeline: (params: SeekTimelineParamsType) => void;
66
75
  onTimelineSeek: (
@@ -78,7 +87,7 @@ interface TapKitInstance {
78
87
  };
79
88
  isOpen: boolean;
80
89
  isInitialized: boolean;
81
- readyPromise: Promise<void>;
90
+ ready: Promise<void>;
82
91
  init(params: TapKitInitParams): Promise<void>;
83
92
  destroy(): void;
84
93
  getVersion(): string;
@@ -174,7 +183,7 @@ const SDK_INSTANCE_LOADING = Symbol("sdkInstanceLoading");
174
183
  * Loads the CDN loader and proxies all calls to the actual SDK
175
184
  */
176
185
  class TapKit implements TapKitInstance {
177
- private [SDK_INSTANCE]?: TapKitInstance;
186
+ private [SDK_INSTANCE]?: TapKitCoreInstance;
178
187
  private [SDK_INSTANCE_LOADING]: Promise<void>;
179
188
 
180
189
  constructor(config: TapKitConfig) {
@@ -182,36 +191,29 @@ class TapKit implements TapKitInstance {
182
191
  }
183
192
 
184
193
  private async loadAndInitialize(config: TapKitConfig): Promise<void> {
185
- console.log("[tap-sdk] Loading CDN loader...");
186
194
  await loadCDNLoader();
187
- console.log("[tap-sdk] CDN loader loaded, window.TapKit:", !!window.TapKit);
188
195
 
189
196
  if (!window.TapKit) {
190
197
  throw new Error("TapKit not available after loading CDN loader");
191
198
  }
192
199
 
193
- console.log("[tap-sdk] Creating TapKit instance...");
194
200
  this[SDK_INSTANCE] = new window.TapKit(config);
195
- console.log("[tap-sdk] TapKit instance created");
196
201
  }
197
202
 
198
- private async ensureLoaded(): Promise<TapKitInstance> {
199
- console.log("[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING...");
203
+ private async ensureLoaded(): Promise<TapKitCoreInstance> {
200
204
  await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created
201
- console.log("[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed");
202
205
 
203
206
  if (!this[SDK_INSTANCE]) {
204
207
  throw new Error("TapKit instance not initialized");
205
208
  }
206
209
 
207
- console.log("[tap-sdk] ensureLoaded: returning SDK instance");
208
210
  return this[SDK_INSTANCE];
209
211
  }
210
212
 
211
- // Expose tap-kit-core's readyPromise for advanced users
213
+ // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming
212
214
  // This resolves after init() is called and tap-kit-core is fully initialized
213
- get readyPromise(): Promise<void> {
214
- return this.ensureLoaded().then((sdk) => sdk.readyPromise);
215
+ get ready(): Promise<void> {
216
+ return this.ensureLoaded().then((sdk) => sdk.ready);
215
217
  }
216
218
 
217
219
  // Public API - all methods proxy to the loaded SDK
@@ -271,7 +273,12 @@ class TapKit implements TapKitInstance {
271
273
  }
272
274
 
273
275
  getVersion(): string {
274
- return this[SDK_INSTANCE]?.getVersion() ?? "Not initialized";
276
+ // tap-kit-core doesn't expose getVersion, return SDK wrapper version
277
+ // The actual implementation is loaded from CDN dynamically
278
+ if (!this[SDK_INSTANCE]) {
279
+ return "Not initialized";
280
+ }
281
+ return "Loaded from CDN (tap-sdk wrapper v0.0.11)";
275
282
  }
276
283
 
277
284
  // Deprecated methods
@@ -299,8 +306,8 @@ class TapKit implements TapKitInstance {
299
306
  // Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')
300
307
  export default TapKit;
301
308
 
302
- // Export TapKit instance type (for: import type { TapKit } from '@coxwave/tap-sdk')
303
- export type { TapKitInstance as TapKit };
309
+ // TapKitInstance is already exported via the interface declaration above (line 72)
310
+ // Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'
304
311
 
305
312
  // Re-export types for API compatibility
306
313
  export type {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coxwave/tap-sdk",
3
- "version": "0.2.2-demo.1",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "description": "TapSDK - Minimal wrapper that loads TapSDK from CDN",
6
6
  "main": "dist/index.js",