@coxwave/tap-sdk 0.2.2 → 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 +38 -4
- package/dist/index.d.ts +38 -4
- 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 +55 -18
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -46,7 +46,37 @@ type SeekTimelineParamsType = {
|
|
|
46
46
|
* This keeps the npm package minimal and allows instant updates via CDN.
|
|
47
47
|
*/
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* TapKit instance type from tap-kit-core
|
|
51
|
+
* This matches the actual TapKit class exported from @coxwave/tap-kit-core
|
|
52
|
+
*/
|
|
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;
|
|
50
80
|
declare global {
|
|
51
81
|
interface Window {
|
|
52
82
|
TapKit?: TapKitConstructor;
|
|
@@ -54,6 +84,10 @@ declare global {
|
|
|
54
84
|
__TAP_KIT_LOADER_LOADING__?: Promise<void>;
|
|
55
85
|
}
|
|
56
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Public TapKit instance interface
|
|
89
|
+
* This is what users interact with when using the SDK
|
|
90
|
+
*/
|
|
57
91
|
interface TapKitInstance {
|
|
58
92
|
events: {
|
|
59
93
|
seekTimeline: (params: SeekTimelineParamsType) => void;
|
|
@@ -68,7 +102,7 @@ interface TapKitInstance {
|
|
|
68
102
|
};
|
|
69
103
|
isOpen: boolean;
|
|
70
104
|
isInitialized: boolean;
|
|
71
|
-
|
|
105
|
+
ready: Promise<void>;
|
|
72
106
|
init(params: TapKitInitParams): Promise<void>;
|
|
73
107
|
destroy(): void;
|
|
74
108
|
getVersion(): string;
|
|
@@ -94,7 +128,7 @@ declare class TapKit implements TapKitInstance {
|
|
|
94
128
|
constructor(config: TapKitConfig);
|
|
95
129
|
private loadAndInitialize;
|
|
96
130
|
private ensureLoaded;
|
|
97
|
-
get
|
|
131
|
+
get ready(): Promise<void>;
|
|
98
132
|
get events(): {
|
|
99
133
|
seekTimeline: (params: SeekTimelineParamsType) => void;
|
|
100
134
|
onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
|
|
@@ -121,4 +155,4 @@ declare class TapKit implements TapKitInstance {
|
|
|
121
155
|
}): Promise<void>;
|
|
122
156
|
}
|
|
123
157
|
|
|
124
|
-
export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type
|
|
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
|
@@ -46,7 +46,37 @@ type SeekTimelineParamsType = {
|
|
|
46
46
|
* This keeps the npm package minimal and allows instant updates via CDN.
|
|
47
47
|
*/
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* TapKit instance type from tap-kit-core
|
|
51
|
+
* This matches the actual TapKit class exported from @coxwave/tap-kit-core
|
|
52
|
+
*/
|
|
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;
|
|
50
80
|
declare global {
|
|
51
81
|
interface Window {
|
|
52
82
|
TapKit?: TapKitConstructor;
|
|
@@ -54,6 +84,10 @@ declare global {
|
|
|
54
84
|
__TAP_KIT_LOADER_LOADING__?: Promise<void>;
|
|
55
85
|
}
|
|
56
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Public TapKit instance interface
|
|
89
|
+
* This is what users interact with when using the SDK
|
|
90
|
+
*/
|
|
57
91
|
interface TapKitInstance {
|
|
58
92
|
events: {
|
|
59
93
|
seekTimeline: (params: SeekTimelineParamsType) => void;
|
|
@@ -68,7 +102,7 @@ interface TapKitInstance {
|
|
|
68
102
|
};
|
|
69
103
|
isOpen: boolean;
|
|
70
104
|
isInitialized: boolean;
|
|
71
|
-
|
|
105
|
+
ready: Promise<void>;
|
|
72
106
|
init(params: TapKitInitParams): Promise<void>;
|
|
73
107
|
destroy(): void;
|
|
74
108
|
getVersion(): string;
|
|
@@ -94,7 +128,7 @@ declare class TapKit implements TapKitInstance {
|
|
|
94
128
|
constructor(config: TapKitConfig);
|
|
95
129
|
private loadAndInitialize;
|
|
96
130
|
private ensureLoaded;
|
|
97
|
-
get
|
|
131
|
+
get ready(): Promise<void>;
|
|
98
132
|
get events(): {
|
|
99
133
|
seekTimeline: (params: SeekTimelineParamsType) => void;
|
|
100
134
|
onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => void;
|
|
@@ -121,4 +155,4 @@ declare class TapKit implements TapKitInstance {
|
|
|
121
155
|
}): Promise<void>;
|
|
122
156
|
}
|
|
123
157
|
|
|
124
|
-
export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type
|
|
158
|
+
export { type ContainerStyle, type Course, type PositionType, type SeekTimelineParamsType, type TapKitConfig, type TapKitConstructor, 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 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
|
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// 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
|
|
2
|
-
module.exports=
|
|
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\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
|
|
2
|
-
export{
|
|
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
|
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// 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
|
@@ -18,9 +18,44 @@ import type {
|
|
|
18
18
|
|
|
19
19
|
const CDN_LOADER_URL = "https://files.edutap.ai/tap-sdk/loader.js";
|
|
20
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
|
+
|
|
21
54
|
// Global namespace for loaded SDK
|
|
22
55
|
// Export type for IIFE bundles loaded via window.TapKit
|
|
23
|
-
export type TapKitConstructor = new (
|
|
56
|
+
export type TapKitConstructor = new (
|
|
57
|
+
config: TapKitConfig
|
|
58
|
+
) => TapKitCoreInstance;
|
|
24
59
|
|
|
25
60
|
declare global {
|
|
26
61
|
interface Window {
|
|
@@ -30,7 +65,11 @@ declare global {
|
|
|
30
65
|
}
|
|
31
66
|
}
|
|
32
67
|
|
|
33
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Public TapKit instance interface
|
|
70
|
+
* This is what users interact with when using the SDK
|
|
71
|
+
*/
|
|
72
|
+
export interface TapKitInstance {
|
|
34
73
|
events: {
|
|
35
74
|
seekTimeline: (params: SeekTimelineParamsType) => void;
|
|
36
75
|
onTimelineSeek: (
|
|
@@ -48,7 +87,7 @@ interface TapKitInstance {
|
|
|
48
87
|
};
|
|
49
88
|
isOpen: boolean;
|
|
50
89
|
isInitialized: boolean;
|
|
51
|
-
|
|
90
|
+
ready: Promise<void>;
|
|
52
91
|
init(params: TapKitInitParams): Promise<void>;
|
|
53
92
|
destroy(): void;
|
|
54
93
|
getVersion(): string;
|
|
@@ -144,7 +183,7 @@ const SDK_INSTANCE_LOADING = Symbol("sdkInstanceLoading");
|
|
|
144
183
|
* Loads the CDN loader and proxies all calls to the actual SDK
|
|
145
184
|
*/
|
|
146
185
|
class TapKit implements TapKitInstance {
|
|
147
|
-
private [SDK_INSTANCE]?:
|
|
186
|
+
private [SDK_INSTANCE]?: TapKitCoreInstance;
|
|
148
187
|
private [SDK_INSTANCE_LOADING]: Promise<void>;
|
|
149
188
|
|
|
150
189
|
constructor(config: TapKitConfig) {
|
|
@@ -152,36 +191,29 @@ class TapKit implements TapKitInstance {
|
|
|
152
191
|
}
|
|
153
192
|
|
|
154
193
|
private async loadAndInitialize(config: TapKitConfig): Promise<void> {
|
|
155
|
-
console.log("[tap-sdk] Loading CDN loader...");
|
|
156
194
|
await loadCDNLoader();
|
|
157
|
-
console.log("[tap-sdk] CDN loader loaded, window.TapKit:", !!window.TapKit);
|
|
158
195
|
|
|
159
196
|
if (!window.TapKit) {
|
|
160
197
|
throw new Error("TapKit not available after loading CDN loader");
|
|
161
198
|
}
|
|
162
199
|
|
|
163
|
-
console.log("[tap-sdk] Creating TapKit instance...");
|
|
164
200
|
this[SDK_INSTANCE] = new window.TapKit(config);
|
|
165
|
-
console.log("[tap-sdk] TapKit instance created");
|
|
166
201
|
}
|
|
167
202
|
|
|
168
|
-
private async ensureLoaded(): Promise<
|
|
169
|
-
console.log("[tap-sdk] ensureLoaded: waiting for SDK_INSTANCE_LOADING...");
|
|
203
|
+
private async ensureLoaded(): Promise<TapKitCoreInstance> {
|
|
170
204
|
await this[SDK_INSTANCE_LOADING]; // Wait for SDK instance to be created
|
|
171
|
-
console.log("[tap-sdk] ensureLoaded: SDK_INSTANCE_LOADING completed");
|
|
172
205
|
|
|
173
206
|
if (!this[SDK_INSTANCE]) {
|
|
174
207
|
throw new Error("TapKit instance not initialized");
|
|
175
208
|
}
|
|
176
209
|
|
|
177
|
-
console.log("[tap-sdk] ensureLoaded: returning SDK instance");
|
|
178
210
|
return this[SDK_INSTANCE];
|
|
179
211
|
}
|
|
180
212
|
|
|
181
|
-
// Expose tap-kit-core's
|
|
213
|
+
// Expose tap-kit-core's 'ready' promise as 'ready' for better API naming
|
|
182
214
|
// This resolves after init() is called and tap-kit-core is fully initialized
|
|
183
|
-
get
|
|
184
|
-
return this.ensureLoaded().then((sdk) => sdk.
|
|
215
|
+
get ready(): Promise<void> {
|
|
216
|
+
return this.ensureLoaded().then((sdk) => sdk.ready);
|
|
185
217
|
}
|
|
186
218
|
|
|
187
219
|
// Public API - all methods proxy to the loaded SDK
|
|
@@ -241,7 +273,12 @@ class TapKit implements TapKitInstance {
|
|
|
241
273
|
}
|
|
242
274
|
|
|
243
275
|
getVersion(): string {
|
|
244
|
-
|
|
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)";
|
|
245
282
|
}
|
|
246
283
|
|
|
247
284
|
// Deprecated methods
|
|
@@ -269,8 +306,8 @@ class TapKit implements TapKitInstance {
|
|
|
269
306
|
// Export the SDK class as default (for: import TapKit from '@coxwave/tap-sdk')
|
|
270
307
|
export default TapKit;
|
|
271
308
|
|
|
272
|
-
//
|
|
273
|
-
|
|
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'
|
|
274
311
|
|
|
275
312
|
// Re-export types for API compatibility
|
|
276
313
|
export type {
|