@coxwave/tap-sdk 0.2.4 → 0.2.5-demo.2
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 +6 -17
- package/dist/index.d.ts +6 -17
- package/dist/index.global.js +2 -2
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/index.ts +11 -27
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -49,6 +49,7 @@ type SeekTimelineParamsType = {
|
|
|
49
49
|
/**
|
|
50
50
|
* TapKit instance type from tap-kit-core
|
|
51
51
|
* This matches the actual TapKit class exported from @coxwave/tap-kit-core
|
|
52
|
+
* Exported for advanced use cases (e.g., when using window.TapKit directly)
|
|
52
53
|
*/
|
|
53
54
|
interface TapKitCoreInstance {
|
|
54
55
|
events: {
|
|
@@ -106,14 +107,6 @@ interface TapKitInstance {
|
|
|
106
107
|
init(params: TapKitInitParams): Promise<void>;
|
|
107
108
|
destroy(): void;
|
|
108
109
|
getVersion(): string;
|
|
109
|
-
initChat(params: TapKitInitParams): Promise<void>;
|
|
110
|
-
postChatInfo(params: {
|
|
111
|
-
clipId: string;
|
|
112
|
-
clipPlayHead: number;
|
|
113
|
-
}): Promise<void>;
|
|
114
|
-
getTimelineInfo(params: {
|
|
115
|
-
callback: (clipPlayHead: number, clipId: string) => void;
|
|
116
|
-
}): Promise<void>;
|
|
117
110
|
}
|
|
118
111
|
declare const SDK_INSTANCE: unique symbol;
|
|
119
112
|
declare const SDK_INSTANCE_LOADING: unique symbol;
|
|
@@ -145,14 +138,10 @@ declare class TapKit implements TapKitInstance {
|
|
|
145
138
|
init(params: TapKitInitParams): Promise<void>;
|
|
146
139
|
destroy(): void;
|
|
147
140
|
getVersion(): string;
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}): Promise<void>;
|
|
153
|
-
getTimelineInfo(params: {
|
|
154
|
-
callback: (clipPlayHead: number, clipId: string) => void;
|
|
155
|
-
}): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Custom object tag for better console display
|
|
143
|
+
*/
|
|
144
|
+
get [Symbol.toStringTag](): string;
|
|
156
145
|
}
|
|
157
146
|
|
|
158
|
-
export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitConfig, type TapKitConstructor, type TapKitInitParams, type TapKitInstance, TapKit as default };
|
|
147
|
+
export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitConfig, type TapKitConstructor, type TapKitCoreInstance, type TapKitInitParams, type TapKitInstance, TapKit as default };
|
package/dist/index.d.ts
CHANGED
|
@@ -49,6 +49,7 @@ type SeekTimelineParamsType = {
|
|
|
49
49
|
/**
|
|
50
50
|
* TapKit instance type from tap-kit-core
|
|
51
51
|
* This matches the actual TapKit class exported from @coxwave/tap-kit-core
|
|
52
|
+
* Exported for advanced use cases (e.g., when using window.TapKit directly)
|
|
52
53
|
*/
|
|
53
54
|
interface TapKitCoreInstance {
|
|
54
55
|
events: {
|
|
@@ -106,14 +107,6 @@ interface TapKitInstance {
|
|
|
106
107
|
init(params: TapKitInitParams): Promise<void>;
|
|
107
108
|
destroy(): void;
|
|
108
109
|
getVersion(): string;
|
|
109
|
-
initChat(params: TapKitInitParams): Promise<void>;
|
|
110
|
-
postChatInfo(params: {
|
|
111
|
-
clipId: string;
|
|
112
|
-
clipPlayHead: number;
|
|
113
|
-
}): Promise<void>;
|
|
114
|
-
getTimelineInfo(params: {
|
|
115
|
-
callback: (clipPlayHead: number, clipId: string) => void;
|
|
116
|
-
}): Promise<void>;
|
|
117
110
|
}
|
|
118
111
|
declare const SDK_INSTANCE: unique symbol;
|
|
119
112
|
declare const SDK_INSTANCE_LOADING: unique symbol;
|
|
@@ -145,14 +138,10 @@ declare class TapKit implements TapKitInstance {
|
|
|
145
138
|
init(params: TapKitInitParams): Promise<void>;
|
|
146
139
|
destroy(): void;
|
|
147
140
|
getVersion(): string;
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}): Promise<void>;
|
|
153
|
-
getTimelineInfo(params: {
|
|
154
|
-
callback: (clipPlayHead: number, clipId: string) => void;
|
|
155
|
-
}): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Custom object tag for better console display
|
|
143
|
+
*/
|
|
144
|
+
get [Symbol.toStringTag](): string;
|
|
156
145
|
}
|
|
157
146
|
|
|
158
|
-
export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitConfig, type TapKitConstructor, type TapKitInitParams, type TapKitInstance, TapKit as default };
|
|
147
|
+
export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitConfig, type TapKitConstructor, type TapKitCoreInstance, type TapKitInitParams, type TapKitInstance, TapKit as default };
|
package/dist/index.global.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var TapSDK=(function(){'use strict';var
|
|
2
|
-
return
|
|
1
|
+
var TapSDK=(function(){'use strict';var _=Object.defineProperty;var h=(n,e,i)=>e in n?_(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var s=(n,e,i)=>h(n,typeof e!="symbol"?e+"":e,i);var m="https://demo-edutap.vercel.app",v="https://tapadminstaging.coxwave.link";function I(){if(!(typeof window>"u"||typeof localStorage>"u"))try{localStorage.setItem("tap-url",JSON.stringify({state:{tapUrl:m},version:0})),localStorage.setItem("tap-api-url",JSON.stringify({state:{apiUrl:v},version:0})),localStorage.setItem("tap-environment","demo"),console.log("[TapSDK Demo] Environment configured:"),console.log(" - Frontend:",m),console.log(" - API:",v),console.log(" - Logging: enabled (demo mode)");}catch(n){console.error("[TapSDK Demo] Failed to configure localStorage:",n);}}I();var r="https://files.edutap.ai/tap-sdk/loader.js";function u(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let n=new Promise((e,i)=>{if(typeof document>"u"){i(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=r,t.async=true,t.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${r}`));};let d=document.querySelector(`script[src="${r}"]`);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: ${r}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),c,T,p=class{constructor(e){s(this,T);s(this,c);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await u(),!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.2.5)":"Not initialized"}get[(T=o,c=l,Symbol.toStringTag)](){return "TapKit"}},y=p;
|
|
2
|
+
return y;})();//# sourceMappingURL=index.global.js.map
|
|
3
3
|
//# sourceMappingURL=index.global.js.map
|
package/dist/index.global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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"]}
|
|
1
|
+
{"version":3,"sources":["../demo-setting.ts","../index.ts"],"names":["DEMO_TAP_URL","DEMO_TAP_API_URL","setupDemoEnvironment","error","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 * Demo Environment Configuration\n *\n * This file automatically configures localStorage for demo environment.\n * Only included in demo builds (published with @demo tag).\n */\n\n// Demo environment URLs\nconst DEMO_TAP_URL = \"https://demo-edutap.vercel.app\";\nconst DEMO_TAP_API_URL = \"https://tapadminstaging.coxwave.link\";\n\n/**\n * Configure localStorage for demo environment\n * This ensures demo SDK always uses demo backend/frontend\n *\n * Format matches zustand persist structure used by playground:\n * { state: { tapUrl/apiUrl }, version: 0 }\n */\nexport function setupDemoEnvironment(): void {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n return;\n }\n\n try {\n // Force demo environment URLs in localStorage with zustand persist format\n localStorage.setItem(\n \"tap-url\",\n JSON.stringify({ state: { tapUrl: DEMO_TAP_URL }, version: 0 })\n );\n localStorage.setItem(\n \"tap-api-url\",\n JSON.stringify({ state: { apiUrl: DEMO_TAP_API_URL }, version: 0 })\n );\n\n // Enable console logging for demo environment\n localStorage.setItem(\"tap-environment\", \"demo\");\n\n console.log(\"[TapSDK Demo] Environment configured:\");\n console.log(\" - Frontend:\", DEMO_TAP_URL);\n console.log(\" - API:\", DEMO_TAP_API_URL);\n console.log(\" - Logging: enabled (demo mode)\");\n } catch (error) {\n console.error(\"[TapSDK Demo] Failed to configure localStorage:\", error);\n }\n}\n\n// Auto-execute on module load\nsetupDemoEnvironment();\n","/**\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\n// Demo environment configuration (auto-executes on module load)\nimport \"./demo-setting\";\n\nimport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from \"./types\";\n\nconst CDN_LOADER_URL = \"https://files.edutap.ai/tap-sdk/loader.js\";\n\n/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapKitInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void>;\n}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = CDN_LOADER_URL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = () => {\n if (window.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = () => {\n if (window.TapKit) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then((sdk) => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\n this.ensureLoaded().then((sdk) => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\n this.ensureLoaded().then((sdk) => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return \"Loaded from CDN (tap-sdk wrapper v0.2.5)\";\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
module.exports=
|
|
1
|
+
'use strict';var _=Object.defineProperty;var h=(n,e,i)=>e in n?_(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var s=(n,e,i)=>h(n,typeof e!="symbol"?e+"":e,i);var m="https://demo-edutap.vercel.app",v="https://tapadminstaging.coxwave.link";function I(){if(!(typeof window>"u"||typeof localStorage>"u"))try{localStorage.setItem("tap-url",JSON.stringify({state:{tapUrl:m},version:0})),localStorage.setItem("tap-api-url",JSON.stringify({state:{apiUrl:v},version:0})),localStorage.setItem("tap-environment","demo"),console.log("[TapSDK Demo] Environment configured:"),console.log(" - Frontend:",m),console.log(" - API:",v),console.log(" - Logging: enabled (demo mode)");}catch(n){console.error("[TapSDK Demo] Failed to configure localStorage:",n);}}I();var r="https://files.edutap.ai/tap-sdk/loader.js";function u(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let n=new Promise((e,i)=>{if(typeof document>"u"){i(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=r,t.async=true,t.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${r}`));};let d=document.querySelector(`script[src="${r}"]`);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: ${r}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),c,T,p=class{constructor(e){s(this,T);s(this,c);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await u(),!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.2.5)":"Not initialized"}get[(T=o,c=l,Symbol.toStringTag)](){return "TapKit"}},y=p;
|
|
2
|
+
module.exports=y;//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts"],"names":["CDN_LOADER_URL","loadCDNLoader","loadingPromise","resolve","reject","script","checkSDK","existingScript","SDK_INSTANCE","SDK_INSTANCE_LOADING","_a","_b","TapKit","config","__publicField","sdk","params","callback","handler","index_default"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * TapKit wrapper - npm package wrapper\n *\n * Simply loads the CDN loader which handles version management and SDK loading.\n * This keeps the npm package minimal and allows instant updates via CDN.\n */\n\nimport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from \"./types\";\n\nconst CDN_LOADER_URL = \"https://files.edutap.ai/tap-sdk/loader.js\";\n\n/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n */\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"]}
|
|
1
|
+
{"version":3,"sources":["../demo-setting.ts","../index.ts"],"names":["DEMO_TAP_URL","DEMO_TAP_API_URL","setupDemoEnvironment","error","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 * Demo Environment Configuration\n *\n * This file automatically configures localStorage for demo environment.\n * Only included in demo builds (published with @demo tag).\n */\n\n// Demo environment URLs\nconst DEMO_TAP_URL = \"https://demo-edutap.vercel.app\";\nconst DEMO_TAP_API_URL = \"https://tapadminstaging.coxwave.link\";\n\n/**\n * Configure localStorage for demo environment\n * This ensures demo SDK always uses demo backend/frontend\n *\n * Format matches zustand persist structure used by playground:\n * { state: { tapUrl/apiUrl }, version: 0 }\n */\nexport function setupDemoEnvironment(): void {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n return;\n }\n\n try {\n // Force demo environment URLs in localStorage with zustand persist format\n localStorage.setItem(\n \"tap-url\",\n JSON.stringify({ state: { tapUrl: DEMO_TAP_URL }, version: 0 })\n );\n localStorage.setItem(\n \"tap-api-url\",\n JSON.stringify({ state: { apiUrl: DEMO_TAP_API_URL }, version: 0 })\n );\n\n // Enable console logging for demo environment\n localStorage.setItem(\"tap-environment\", \"demo\");\n\n console.log(\"[TapSDK Demo] Environment configured:\");\n console.log(\" - Frontend:\", DEMO_TAP_URL);\n console.log(\" - API:\", DEMO_TAP_API_URL);\n console.log(\" - Logging: enabled (demo mode)\");\n } catch (error) {\n console.error(\"[TapSDK Demo] Failed to configure localStorage:\", error);\n }\n}\n\n// Auto-execute on module load\nsetupDemoEnvironment();\n","/**\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\n// Demo environment configuration (auto-executes on module load)\nimport \"./demo-setting\";\n\nimport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from \"./types\";\n\nconst CDN_LOADER_URL = \"https://files.edutap.ai/tap-sdk/loader.js\";\n\n/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapKitInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void>;\n}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = CDN_LOADER_URL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = () => {\n if (window.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = () => {\n if (window.TapKit) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then((sdk) => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\n this.ensureLoaded().then((sdk) => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\n this.ensureLoaded().then((sdk) => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return \"Loaded from CDN (tap-sdk wrapper v0.2.5)\";\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
2
|
-
export{
|
|
1
|
+
var _=Object.defineProperty;var h=(n,e,i)=>e in n?_(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var s=(n,e,i)=>h(n,typeof e!="symbol"?e+"":e,i);var m="https://demo-edutap.vercel.app",v="https://tapadminstaging.coxwave.link";function I(){if(!(typeof window>"u"||typeof localStorage>"u"))try{localStorage.setItem("tap-url",JSON.stringify({state:{tapUrl:m},version:0})),localStorage.setItem("tap-api-url",JSON.stringify({state:{apiUrl:v},version:0})),localStorage.setItem("tap-environment","demo"),console.log("[TapSDK Demo] Environment configured:"),console.log(" - Frontend:",m),console.log(" - API:",v),console.log(" - Logging: enabled (demo mode)");}catch(n){console.error("[TapSDK Demo] Failed to configure localStorage:",n);}}I();var r="https://files.edutap.ai/tap-sdk/loader.js";function u(){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let n=new Promise((e,i)=>{if(typeof document>"u"){i(new Error("TapKit requires browser environment (document is undefined)"));return}let t=document.createElement("script");t.src=r,t.async=true,t.onload=()=>{let a=()=>{window.TapKit?(window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,e()):setTimeout(a,50);};a();},t.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${r}`));};let d=document.querySelector(`script[src="${r}"]`);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: ${r}`)))):document.head.appendChild(t);});return window.__TAP_KIT_LOADER_LOADING__=n,n}var o=Symbol("sdkInstance"),l=Symbol("sdkInstanceLoading"),c,T,p=class{constructor(e){s(this,T);s(this,c);this[l]=this.loadAndInitialize(e);}async loadAndInitialize(e){if(await u(),!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.2.5)":"Not initialized"}get[(T=o,c=l,Symbol.toStringTag)](){return "TapKit"}},y=p;
|
|
2
|
+
export{y as default};//# sourceMappingURL=index.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.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.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"]}
|
|
1
|
+
{"version":3,"sources":["../demo-setting.ts","../index.ts"],"names":["DEMO_TAP_URL","DEMO_TAP_API_URL","setupDemoEnvironment","error","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 * Demo Environment Configuration\n *\n * This file automatically configures localStorage for demo environment.\n * Only included in demo builds (published with @demo tag).\n */\n\n// Demo environment URLs\nconst DEMO_TAP_URL = \"https://demo-edutap.vercel.app\";\nconst DEMO_TAP_API_URL = \"https://tapadminstaging.coxwave.link\";\n\n/**\n * Configure localStorage for demo environment\n * This ensures demo SDK always uses demo backend/frontend\n *\n * Format matches zustand persist structure used by playground:\n * { state: { tapUrl/apiUrl }, version: 0 }\n */\nexport function setupDemoEnvironment(): void {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n return;\n }\n\n try {\n // Force demo environment URLs in localStorage with zustand persist format\n localStorage.setItem(\n \"tap-url\",\n JSON.stringify({ state: { tapUrl: DEMO_TAP_URL }, version: 0 })\n );\n localStorage.setItem(\n \"tap-api-url\",\n JSON.stringify({ state: { apiUrl: DEMO_TAP_API_URL }, version: 0 })\n );\n\n // Enable console logging for demo environment\n localStorage.setItem(\"tap-environment\", \"demo\");\n\n console.log(\"[TapSDK Demo] Environment configured:\");\n console.log(\" - Frontend:\", DEMO_TAP_URL);\n console.log(\" - API:\", DEMO_TAP_API_URL);\n console.log(\" - Logging: enabled (demo mode)\");\n } catch (error) {\n console.error(\"[TapSDK Demo] Failed to configure localStorage:\", error);\n }\n}\n\n// Auto-execute on module load\nsetupDemoEnvironment();\n","/**\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\n// Demo environment configuration (auto-executes on module load)\nimport \"./demo-setting\";\n\nimport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n} from \"./types\";\n\nconst CDN_LOADER_URL = \"https://files.edutap.ai/tap-sdk/loader.js\";\n\n/**\n * TapKit instance type from tap-kit-core\n * This matches the actual TapKit class exported from @coxwave/tap-kit-core\n * Exported for advanced use cases (e.g., when using window.TapKit directly)\n */\nexport interface TapKitCoreInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n // Deprecated methods\n initChat(params: TapKitInitParams): Promise<void>;\n postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;\n getTimelineInfo(params: {\n callback: (clipPlayHead: number, clipId: string) => void;\n }): Promise<void>;\n}\n\n// Global namespace for loaded SDK\n// Export type for IIFE bundles loaded via window.TapKit\nexport type TapKitConstructor = new (\n config: TapKitConfig\n) => TapKitCoreInstance;\n\ndeclare global {\n interface Window {\n TapKit?: TapKitConstructor;\n __TAP_KIT_LOADER_LOADED__?: boolean;\n __TAP_KIT_LOADER_LOADING__?: Promise<void>;\n }\n}\n\n/**\n * Public TapKit instance interface\n * This is what users interact with when using the SDK\n */\nexport interface TapKitInstance {\n events: {\n seekTimeline: (params: SeekTimelineParamsType) => void;\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => void;\n onChatInitiated: (handler: () => void) => void;\n onChatOpened: (handler: () => void) => void;\n onChatClosed: (handler: () => void) => void;\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => void;\n onPopUpOpen: (handler: (popUpInfo: any) => void) => void;\n onPdfOpen: (handler: () => void) => void;\n onPdfClose: (handler: () => void) => void;\n };\n isOpen: boolean;\n isInitialized: boolean;\n ready: Promise<void>;\n init(params: TapKitInitParams): Promise<void>;\n destroy(): void;\n getVersion(): string;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n */\nfunction loadCDNLoader(): Promise<void> {\n // If already loaded, return immediately\n if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {\n return Promise.resolve();\n }\n\n // If currently loading, return the existing promise\n if (window.__TAP_KIT_LOADER_LOADING__) {\n return window.__TAP_KIT_LOADER_LOADING__;\n }\n\n // Create loading promise\n const loadingPromise = new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(\n new Error(\"TapKit requires browser environment (document is undefined)\")\n );\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = CDN_LOADER_URL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = () => {\n if (window.TapKit) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n // Check again after a short delay\n setTimeout(checkSDK, 50);\n }\n };\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[src=\"${CDN_LOADER_URL}\"]`\n );\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = () => {\n if (window.TapKit) resolve();\n else setTimeout(checkSDK, 50);\n };\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${CDN_LOADER_URL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n\n// Use Symbol to hide SDK instance from enumeration\nconst SDK_INSTANCE = Symbol(\"sdkInstance\");\nconst SDK_INSTANCE_LOADING = Symbol(\"sdkInstanceLoading\");\n\n/**\n * TapKit Wrapper Class\n *\n * Loads the CDN loader and proxies all calls to the actual SDK\n */\nclass TapKit implements TapKitInstance {\n private [SDK_INSTANCE]?: TapKitCoreInstance;\n private [SDK_INSTANCE_LOADING]: Promise<void>;\n\n constructor(config: TapKitConfig) {\n this[SDK_INSTANCE_LOADING] = this.loadAndInitialize(config);\n }\n\n private async loadAndInitialize(config: TapKitConfig): Promise<void> {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this[SDK_INSTANCE] = new window.TapKit(config);\n }\n\n private async ensureLoaded(): Promise<TapKitCoreInstance> {\n await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created\n\n if (!this[SDK_INSTANCE]) {\n throw new Error(\"TapKit instance not initialized\");\n }\n\n return this[SDK_INSTANCE];\n }\n\n // Expose tap-kit-core's 'ready' promise as 'ready' for better API naming\n // This resolves after init() is called and tap-kit-core is fully initialized\n get ready(): Promise<void> {\n return this.ensureLoaded().then((sdk) => sdk.ready);\n }\n\n // Public API - all methods proxy to the loaded SDK\n get events() {\n return {\n seekTimeline: (params: SeekTimelineParamsType) => {\n this.ensureLoaded().then((sdk) => sdk.events.seekTimeline(params));\n },\n onTimelineSeek: (\n callback: (clipPlayHead: number, clipId: string) => void\n ) => {\n this.ensureLoaded().then((sdk) => sdk.events.onTimelineSeek(callback));\n },\n onChatInitiated: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatInitiated(handler));\n },\n onChatOpened: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatOpened(handler));\n },\n onChatClosed: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onChatClosed(handler));\n },\n onAlarmFadeIn: (\n handler: (messageInfo: AlarmMessageInstanceType) => void\n ) => {\n this.ensureLoaded().then((sdk) => sdk.events.onAlarmFadeIn(handler));\n },\n onPopUpOpen: (handler: (popUpInfo: any) => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPopUpOpen(handler));\n },\n onPdfOpen: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPdfOpen(handler));\n },\n onPdfClose: (handler: () => void) => {\n this.ensureLoaded().then((sdk) => sdk.events.onPdfClose(handler));\n },\n };\n }\n\n get isOpen(): boolean {\n return this[SDK_INSTANCE]?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this[SDK_INSTANCE]?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n const sdk = await this.ensureLoaded();\n return sdk.init(params);\n }\n\n destroy(): void {\n if (this[SDK_INSTANCE]) {\n this[SDK_INSTANCE].destroy();\n }\n }\n\n getVersion(): string {\n // tap-kit-core doesn't expose getVersion, return SDK wrapper version\n // The actual implementation is loaded from CDN dynamically\n if (!this[SDK_INSTANCE]) {\n return \"Not initialized\";\n }\n return \"Loaded from CDN (tap-sdk wrapper v0.2.5)\";\n }\n\n /**\n * Custom object tag for better console display\n */\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')\nexport default TapKit;\n\n// TapKitInstance is already exported via the interface declaration above (line 72)\n// Users can import it via: import type { TapKitInstance } from '@coxwave/tap-sdk'\n\n// Re-export types for API compatibility\nexport type {\n TapKitConfig,\n TapKitInitParams,\n Course,\n ContainerStyle,\n PositionType,\n SeekTimelineParamsType,\n AlarmMessageInstanceType,\n AlarmType,\n};\n"]}
|
package/index.ts
CHANGED
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* This keeps the npm package minimal and allows instant updates via CDN.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
// Demo environment configuration (auto-executes on module load)
|
|
9
|
+
import "./demo-setting";
|
|
10
|
+
|
|
8
11
|
import type {
|
|
9
12
|
TapKitConfig,
|
|
10
13
|
TapKitInitParams,
|
|
@@ -21,8 +24,9 @@ const CDN_LOADER_URL = "https://files.edutap.ai/tap-sdk/loader.js";
|
|
|
21
24
|
/**
|
|
22
25
|
* TapKit instance type from tap-kit-core
|
|
23
26
|
* This matches the actual TapKit class exported from @coxwave/tap-kit-core
|
|
27
|
+
* Exported for advanced use cases (e.g., when using window.TapKit directly)
|
|
24
28
|
*/
|
|
25
|
-
interface TapKitCoreInstance {
|
|
29
|
+
export interface TapKitCoreInstance {
|
|
26
30
|
events: {
|
|
27
31
|
seekTimeline: (params: SeekTimelineParamsType) => void;
|
|
28
32
|
onTimelineSeek: (
|
|
@@ -91,12 +95,6 @@ export interface TapKitInstance {
|
|
|
91
95
|
init(params: TapKitInitParams): Promise<void>;
|
|
92
96
|
destroy(): void;
|
|
93
97
|
getVersion(): string;
|
|
94
|
-
// Deprecated methods
|
|
95
|
-
initChat(params: TapKitInitParams): Promise<void>;
|
|
96
|
-
postChatInfo(params: { clipId: string; clipPlayHead: number }): Promise<void>;
|
|
97
|
-
getTimelineInfo(params: {
|
|
98
|
-
callback: (clipPlayHead: number, clipId: string) => void;
|
|
99
|
-
}): Promise<void>;
|
|
100
98
|
}
|
|
101
99
|
|
|
102
100
|
/**
|
|
@@ -278,28 +276,14 @@ class TapKit implements TapKitInstance {
|
|
|
278
276
|
if (!this[SDK_INSTANCE]) {
|
|
279
277
|
return "Not initialized";
|
|
280
278
|
}
|
|
281
|
-
return "Loaded from CDN (tap-sdk wrapper v0.
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Deprecated methods
|
|
285
|
-
async initChat(params: TapKitInitParams): Promise<void> {
|
|
286
|
-
const sdk = await this.ensureLoaded();
|
|
287
|
-
return sdk.initChat(params);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
async postChatInfo(params: {
|
|
291
|
-
clipId: string;
|
|
292
|
-
clipPlayHead: number;
|
|
293
|
-
}): Promise<void> {
|
|
294
|
-
const sdk = await this.ensureLoaded();
|
|
295
|
-
return sdk.postChatInfo(params);
|
|
279
|
+
return "Loaded from CDN (tap-sdk wrapper v0.2.5)";
|
|
296
280
|
}
|
|
297
281
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
return
|
|
282
|
+
/**
|
|
283
|
+
* Custom object tag for better console display
|
|
284
|
+
*/
|
|
285
|
+
get [Symbol.toStringTag]() {
|
|
286
|
+
return "TapKit";
|
|
303
287
|
}
|
|
304
288
|
}
|
|
305
289
|
|