@coxwave/tap-sdk 0.3.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -36,10 +36,8 @@ await sdk.init({
36
36
  },
37
37
  });
38
38
 
39
- // 3단계: 이벤트 리스너 등록 (선택사항)
40
- sdk.events.onChatOpened(() => {
41
- console.log("채팅이 열렸습니다");
42
- });
39
+ // 3단계: 채팅 상태 확인 (선택사항)
40
+ console.log("채팅 열림 상태:", sdk.isOpen);
43
41
  ```
44
42
 
45
43
  ## 커스터마이징
@@ -141,29 +139,6 @@ sdk.destroy();
141
139
 
142
140
  이벤트는 `sdk.events`를 통해 제공됩니다. 모든 리스너는 구독 해제 함수를 반환합니다.
143
141
 
144
- ### `events.onChatOpened(handler)`
145
-
146
- 채팅이 열렸을 때 호출됩니다.
147
-
148
- ```typescript
149
- const unsubscribe = sdk.events.onChatOpened(() => {
150
- console.log("채팅이 열렸습니다");
151
- });
152
-
153
- // 구독 해제
154
- unsubscribe();
155
- ```
156
-
157
- ### `events.onChatClosed(handler)`
158
-
159
- 채팅이 닫혔을 때 호출됩니다.
160
-
161
- ```typescript
162
- sdk.events.onChatClosed(() => {
163
- console.log("채팅이 닫혔습니다");
164
- });
165
- ```
166
-
167
142
  ### `events.onAlarmFadeIn(handler)`
168
143
 
169
144
  알람 메시지가 표시될 때 호출됩니다.
package/dist/index.d.cts CHANGED
@@ -1,53 +1,23 @@
1
- import * as _coxwave_tap_kit_types from '@coxwave/tap-kit-types';
2
- import { TapKitInstance, TapKitConfig, TapKitInitParams, TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL$1, TapKitConfigOptions } from '@coxwave/tap-kit-types';
3
- export { AlarmMessageInstanceType, AlarmType, ContainerStyle, Course, PositionType, SeekTimelineParamsType, TapKitConfig, TapKitConstructor, TapKitInitParams, TapKitInstance } from '@coxwave/tap-kit-types';
1
+ export * from '@coxwave/tap-kit';
2
+ export { TAPKIT_CONFIG_SYMBOL, default } from '@coxwave/tap-kit';
4
3
 
5
- /** @internal Symbol for internal configuration method */
6
- declare const TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL$1;
7
4
  /**
8
- * TapSDK - Official TapKit Web SDK
5
+ * ⚠️ 중요: 패키지는 이상 사용되지 않습니다
9
6
  *
10
- * @example
11
- * ```typescript
12
- * import TapSDK from "@coxwave/tap-sdk";
7
+ * @coxwave/tap-kit으로 마이그레이션해 주세요!
13
8
  *
14
- * const sdk = new TapSDK({ apiKey: 'your-api-key' });
9
+ * 마이그레이션 방법:
10
+ * 1. 설치: npm install @coxwave/tap-kit
11
+ * 2. import 변경:
12
+ * [기존] import TapSDK from '@coxwave/tap-sdk'
13
+ * [신규] import TapKit from '@coxwave/tap-kit'
14
+ * 3. 클래스명만 변경하면 끝! (API는 100% 호환)
15
15
  *
16
- * await sdk.init({
17
- * buttonId: 'tap-button',
18
- * course: {
19
- * userId: 'user-123',
20
- * courseId: 'course-456',
21
- * clipId: 'clip-789',
22
- * },
23
- * container: {
24
- * position: { top: '64px', right: '32px' },
25
- * width: '360px',
26
- * height: 'calc(100% - 128px)',
27
- * },
28
- * });
29
- * ```
16
+ * 자세한 내용: https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit
30
17
  */
31
- declare class TapKit implements TapKitInstance {
32
- #private;
33
- private instance;
34
- private pendingConfig?;
35
- constructor(config: TapKitConfig);
36
- private load;
37
- get ready(): Promise<void>;
38
- get events(): {
39
- seekTimeline: (params: _coxwave_tap_kit_types.SeekTimelineParamsType) => void;
40
- onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => () => void;
41
- onChatOpened: (handler: () => void) => () => void;
42
- onChatClosed: (handler: () => void) => () => void;
43
- onAlarmFadeIn: (handler: (messageInfo: _coxwave_tap_kit_types.AlarmMessageInstanceType) => void) => () => void;
44
- };
45
- get isOpen(): boolean;
46
- get isInitialized(): boolean;
47
- init(params: TapKitInitParams): Promise<void>;
48
- destroy(): void;
49
- [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void;
50
- get [Symbol.toStringTag](): string;
51
- }
52
18
 
53
- export { TapKit as default };
19
+ declare global {
20
+ interface Window {
21
+ __TAP_SDK_DEPRECATION_WARNED__?: boolean;
22
+ }
23
+ }
package/dist/index.d.ts CHANGED
@@ -1,53 +1,23 @@
1
- import * as _coxwave_tap_kit_types from '@coxwave/tap-kit-types';
2
- import { TapKitInstance, TapKitConfig, TapKitInitParams, TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL$1, TapKitConfigOptions } from '@coxwave/tap-kit-types';
3
- export { AlarmMessageInstanceType, AlarmType, ContainerStyle, Course, PositionType, SeekTimelineParamsType, TapKitConfig, TapKitConstructor, TapKitInitParams, TapKitInstance } from '@coxwave/tap-kit-types';
1
+ export * from '@coxwave/tap-kit';
2
+ export { TAPKIT_CONFIG_SYMBOL, default } from '@coxwave/tap-kit';
4
3
 
5
- /** @internal Symbol for internal configuration method */
6
- declare const TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL$1;
7
4
  /**
8
- * TapSDK - Official TapKit Web SDK
5
+ * ⚠️ 중요: 패키지는 이상 사용되지 않습니다
9
6
  *
10
- * @example
11
- * ```typescript
12
- * import TapSDK from "@coxwave/tap-sdk";
7
+ * @coxwave/tap-kit으로 마이그레이션해 주세요!
13
8
  *
14
- * const sdk = new TapSDK({ apiKey: 'your-api-key' });
9
+ * 마이그레이션 방법:
10
+ * 1. 설치: npm install @coxwave/tap-kit
11
+ * 2. import 변경:
12
+ * [기존] import TapSDK from '@coxwave/tap-sdk'
13
+ * [신규] import TapKit from '@coxwave/tap-kit'
14
+ * 3. 클래스명만 변경하면 끝! (API는 100% 호환)
15
15
  *
16
- * await sdk.init({
17
- * buttonId: 'tap-button',
18
- * course: {
19
- * userId: 'user-123',
20
- * courseId: 'course-456',
21
- * clipId: 'clip-789',
22
- * },
23
- * container: {
24
- * position: { top: '64px', right: '32px' },
25
- * width: '360px',
26
- * height: 'calc(100% - 128px)',
27
- * },
28
- * });
29
- * ```
16
+ * 자세한 내용: https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit
30
17
  */
31
- declare class TapKit implements TapKitInstance {
32
- #private;
33
- private instance;
34
- private pendingConfig?;
35
- constructor(config: TapKitConfig);
36
- private load;
37
- get ready(): Promise<void>;
38
- get events(): {
39
- seekTimeline: (params: _coxwave_tap_kit_types.SeekTimelineParamsType) => void;
40
- onTimelineSeek: (callback: (clipPlayHead: number, clipId: string) => void) => () => void;
41
- onChatOpened: (handler: () => void) => () => void;
42
- onChatClosed: (handler: () => void) => () => void;
43
- onAlarmFadeIn: (handler: (messageInfo: _coxwave_tap_kit_types.AlarmMessageInstanceType) => void) => () => void;
44
- };
45
- get isOpen(): boolean;
46
- get isInitialized(): boolean;
47
- init(params: TapKitInitParams): Promise<void>;
48
- destroy(): void;
49
- [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void;
50
- get [Symbol.toStringTag](): string;
51
- }
52
18
 
53
- export { TapKit as default };
19
+ declare global {
20
+ interface Window {
21
+ __TAP_SDK_DEPRECATION_WARNED__?: boolean;
22
+ }
23
+ }
@@ -1,3 +1,3 @@
1
- var TapKit=(function(){'use strict';var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader.js";function O(){return typeof window<"u"&&window.__TAP_KIT_LOADER_URL__?window.__TAP_KIT_LOADER_URL__:E}function C(){return typeof window<"u"&&!!window.__TAP_KIT_CORE_URL__}function m(){return window.__TAP_KIT_CORE_URL__||""}function u(n,e,i){let o=Date.now(),t=()=>{if(window.TapKit&&window.TapKitLoaded===true){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,n();return}if(Date.now()-o>i){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader timeout: SDK not available after ${i}ms`));return}typeof requestIdleCallback<"u"?requestIdleCallback(t,{timeout:500}):setTimeout(t,500);};return t}function A(n=4e3){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let e=new Promise((i,o)=>{if(typeof document>"u"){o(new Error("TapKit requires browser environment (document is undefined)"));return}if(C()){let d=m(),s=document.createElement("script");s.src=d,s.async=true,s.onload=()=>{window.TapKit?(window.TapKitLoaded=true,window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,i()):(window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error("TapKit not available after loading local core")));},s.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load local TapKit core: ${d}`));},document.head.appendChild(s);return}let t=O(),a=document.createElement("script");a.src=t,a.async=true,a.onload=()=>{u(i,o,n)();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load TapKit CDN loader: ${t}`));};let l=document.querySelector(`script[src="${t}"]`);l?(l.addEventListener("load",()=>{u(i,o,n)();}),l.addEventListener("error",()=>o(new Error(`Failed to load TapKit CDN loader: ${t}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=e,e}var K=Symbol.for("tapkit.#config"),r,_,f=class{constructor(e){T(this,"instance",null);p(this,r);p(this,_);T(this,"pendingConfig");w(this,_,e),w(this,r,this.load());}async load(){try{await A();}catch(e){throw e}if(!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this.instance=new window.TapKit(c(this,_)),this.pendingConfig&&(this.instance[K]?.(this.pendingConfig),this.pendingConfig=void 0);}get ready(){return c(this,r).then(()=>{if(!this.instance)throw new Error("TapKit instance not initialized");return this.instance.ready})}get events(){if(!this.instance)throw new Error("TapKit not loaded yet. Use await sdk.ready first.");return this.instance.events}get isOpen(){return this.instance?.isOpen??false}get isInitialized(){return this.instance?.isInitialized??false}async init(e){await c(this,r),await this.instance.init(e);}destroy(){this.instance&&(this.instance.destroy(),this.instance=null);}[K](e){if(!this.instance){this.pendingConfig=e;return}this.instance[K]?.(e);}get[Symbol.toStringTag](){return "TapKit"}};r=new WeakMap,_=new WeakMap;
2
- return f;})();//# sourceMappingURL=index.global.js.map
1
+ var TapKit=(function(exports){'use strict';var E=Object.defineProperty,A=t=>{throw TypeError(t)},K=(t,e,n)=>e in t?E(t,e,{enumerable:true,configurable:true,writable:true,value:n}):t[e]=n,f=(t,e,n)=>K(t,typeof e!="symbol"?e+"":e,n),D=(t,e,n)=>e.has(t)||A("Cannot "+n),o=(t,e,n)=>(D(t,e,"read from private field"),n?n.call(t):e.get(t)),p=(t,e,n)=>e.has(t)?A("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),u=(t,e,n,i)=>(D(t,e,"write to private field"),e.set(t,n),n),O="https://files.edutap.ai/tap-sdk/loader.js";function I(){return window?.__TAP_KIT_LOADER_URL__?window.__TAP_KIT_LOADER_URL__:O}function L(){return typeof window<"u"&&!!window.__TAP_KIT_CORE_URL__}function v(){return window.__TAP_KIT_CORE_URL__||""}function h(t,e,n){let i=Date.now(),r=()=>{if(window.TapKit&&window.TapKitLoaded===true){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,t();return}if(Date.now()-i>n){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader timeout: SDK not available after ${n}ms`));return}typeof requestIdleCallback<"u"?requestIdleCallback(r,{timeout:500}):setTimeout(r,500);};return r}function m(t=4e3){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let e=new Promise((n,i)=>{if(typeof document>"u"){i(new Error("TapKit requires browser environment (document is undefined)"));return}if(L()){let T=v(),d=document.createElement("script");d.src=T,d.async=true,d.onload=()=>{window.TapKit?(window.TapKitLoaded=true,window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,n()):(window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error("TapKit not available after loading local core")));},d.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load local TapKit core: ${T}`));},document.head.appendChild(d);return}let r=I(),_=document.createElement("script");_.src=r,_.async=true,_.onload=()=>{h(n,i,t)();},_.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,i(new Error(`Failed to load TapKit CDN loader: ${r}`));};let c=document.querySelector(`script[src="${r}"]`);c?(c.addEventListener("load",()=>{h(n,i,t)();}),c.addEventListener("error",()=>i(new Error(`Failed to load TapKit CDN loader: ${r}`)))):document.head.appendChild(_);});return window.__TAP_KIT_LOADER_LOADING__=e,e}var w=Symbol.for("tapkit.config"),s,l,a,g=class{constructor(t){f(this,"instance",null),p(this,s),p(this,l),p(this,a,null),f(this,"pendingConfig"),u(this,l,t),u(this,s,this.load());}async load(){try{if(await m(),!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this.instance=new window.TapKit(o(this,l)),this.pendingConfig&&(this.instance[w]?.(this.pendingConfig),this.pendingConfig=void 0);}catch(t){throw u(this,a,t instanceof Error?t:new Error(String(t))),o(this,a)}}get ready(){return o(this,s).then(()=>{if(o(this,a))throw o(this,a);if(!this.instance)throw new Error("TapKit instance not initialized. Check console for errors.");return this.instance.ready})}get events(){return new Proxy({},{get:(t,e)=>(...n)=>this.ready.then(()=>{let i=(this.instance?.events)[e];return typeof i=="function"?i(...n):i})})}get isOpen(){return this.instance?.isOpen??false}get isInitialized(){return this.instance?.isInitialized??false}get video(){return new Proxy({},{get:(t,e)=>(...n)=>this.ready.then(()=>{let i=(this.instance?.video)[e];return typeof i=="function"?i(...n):i})})}async init(t){if(await o(this,s),!this.instance)throw new Error("TapKit instance not available after loading");return await this.instance.init(t)}destroy(){this.instance&&(this.instance.destroy(),this.instance=null);}[w](t){if(!this.instance){this.pendingConfig=t;return}this.instance[w]?.(t);}get[Symbol.toStringTag](){return "TapKit"}};s=new WeakMap,l=new WeakMap,a=new WeakMap;typeof window<"u"&&!window.__TAP_SDK_DEPRECATION_WARNED__&&(window.__TAP_SDK_DEPRECATION_WARNED__=true);
2
+ exports.TAPKIT_CONFIG_SYMBOL=w;exports.default=g;Object.defineProperty(exports,'__esModule',{value:true});return exports;})({});//# sourceMappingURL=index.global.js.map
3
3
  //# sourceMappingURL=index.global.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.global.js","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): 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(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
1
+ {"version":3,"sources":["../../tap-kit/src/loader.ts","../../tap-kit/src/kit.ts","../src/index.ts"],"names":["h","e","I","n","t","K","r","l","p","DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","_loadError","TapKit","config","__publicField","__privateAdd","__privateSet","__privateGet","err","_target","prop","args","method","params","options"],"mappings":"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","file":"index.global.js","sourcesContent":["/**\n * CDN loader for TapKit\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL =\n typeof __DEFAULT_CDN_LOADER_URL__ !== \"undefined\"\n ? __DEFAULT_CDN_LOADER_URL__\n : \"https://files.edutap.ai/tap-sdk/loader.js\";\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return window?.__TAP_KIT_LOADER_URL__ ? window.__TAP_KIT_LOADER_URL__ : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: unknown) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): 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(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n TapKitConfig,\n TapKitConfigOptions,\n TapKitInitParams,\n TapKitInstance,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\n// biome-ignore lint/suspicious/noExplicitAny: Symbol type casting required for compatibility\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.config\") as any;\n\n/**\n * TapKit - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapKit from \"@coxwave/tap-kit\";\n *\n * const kit = new TapKit({ apiKey: 'your-api-key' });\n *\n * await kit.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n #loadError: Error | null = null;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n try {\n await loadCDNLoader();\n\n if (!window.TapKit) {\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n this.instance = new window.TapKit(this.#config);\n\n // Apply pending config if any\n if (this.pendingConfig) {\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n } catch (err) {\n this.#loadError = err instanceof Error ? err : new Error(String(err));\n throw this.#loadError;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (this.#loadError) {\n throw this.#loadError;\n }\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized. Check console for errors.\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n // Proxy pattern: automatically wait for ready when calling methods\n return new Proxy({} as TapKitInstance[\"events\"], {\n get: (_target, prop: string) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic method signature unknown at compile time\n return (...args: any[]) => {\n return this.ready.then(() => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic property access requires any\n const method = (this.instance?.events as any)[prop];\n if (typeof method === \"function\") {\n return method(...args);\n }\n return method;\n });\n };\n },\n });\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n get video() {\n // Proxy pattern: automatically wait for ready when calling methods\n return new Proxy({} as TapKitInstance[\"video\"], {\n get: (_target, prop: string) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic method signature unknown at compile time\n return (...args: any[]) => {\n return this.ready.then(() => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic property access requires any\n const method = (this.instance?.video as any)[prop];\n if (typeof method === \"function\") {\n return method(...args);\n }\n return method;\n });\n };\n },\n });\n }\n\n async init(params: TapKitInitParams): Promise<() => void> {\n await this.#loading;\n if (!this.instance) {\n throw new Error(\"TapKit instance not available after loading\");\n }\n return await this.instance.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n\n// Export the symbol for type compatibility\nexport { TAPKIT_CONFIG_SYMBOL };\n","/**\n * ⚠️ 중요: 이 패키지는 더 이상 사용되지 않습니다\n *\n * @coxwave/tap-kit으로 마이그레이션해 주세요!\n *\n * 마이그레이션 방법:\n * 1. 설치: npm install @coxwave/tap-kit\n * 2. import 변경:\n * [기존] import TapSDK from '@coxwave/tap-sdk'\n * [신규] import TapKit from '@coxwave/tap-kit'\n * 3. 클래스명만 변경하면 끝! (API는 100% 호환)\n *\n * 자세한 내용: https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit\n */\n\nexport type * from \"@coxwave/tap-kit\";\n// Re-export from tap-kit\nexport { default, TAPKIT_CONFIG_SYMBOL } from \"@coxwave/tap-kit\";\n\n// 한국어 경고 메시지 (한 번만 출력)\nif (typeof window !== \"undefined\" && !window.__TAP_SDK_DEPRECATION_WARNED__) {\n console.warn(\n \"\\n\" +\n \"┌─────────────────────────────────────────────────────────────┐\\n\" +\n \"│ ⚠️ @coxwave/tap-sdk는 더 이상 사용되지 않습니다 │\\n\" +\n \"├─────────────────────────────────────────────────────────────┤\\n\" +\n \"│ 새로운 패키지로 마이그레이션해 주세요: │\\n\" +\n \"│ │\\n\" +\n \"│ 📦 설치: │\\n\" +\n \"│ npm install @coxwave/tap-kit │\\n\" +\n \"│ │\\n\" +\n \"│ 📝 사용법 (변경 사항 최소): │\\n\" +\n \"│ [기존] import TapSDK from '@coxwave/tap-sdk' │\\n\" +\n \"│ [신규] import TapKit from '@coxwave/tap-kit' │\\n\" +\n \"│ │\\n\" +\n \"│ [기존] const sdk = new TapSDK({ ... }) │\\n\" +\n \"│ [신규] const kit = new TapKit({ ... }) │\\n\" +\n \"│ │\\n\" +\n \"│ ✅ API는 100% 호환됩니다! │\\n\" +\n \"│ │\\n\" +\n \"│ 📖 자세한 마이그레이션 가이드: │\\n\" +\n \"│ https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit │\\n\" +\n \"└─────────────────────────────────────────────────────────────┘\\n\",\n );\n window.__TAP_SDK_DEPRECATION_WARNED__ = true;\n}\n\ndeclare global {\n interface Window {\n __TAP_SDK_DEPRECATION_WARNED__?: boolean;\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -1,3 +1,2 @@
1
- 'use strict';var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader.js";function O(){return typeof window<"u"&&window.__TAP_KIT_LOADER_URL__?window.__TAP_KIT_LOADER_URL__:E}function C(){return typeof window<"u"&&!!window.__TAP_KIT_CORE_URL__}function m(){return window.__TAP_KIT_CORE_URL__||""}function u(n,e,i){let o=Date.now(),t=()=>{if(window.TapKit&&window.TapKitLoaded===true){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,n();return}if(Date.now()-o>i){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader timeout: SDK not available after ${i}ms`));return}typeof requestIdleCallback<"u"?requestIdleCallback(t,{timeout:500}):setTimeout(t,500);};return t}function A(n=4e3){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let e=new Promise((i,o)=>{if(typeof document>"u"){o(new Error("TapKit requires browser environment (document is undefined)"));return}if(C()){let d=m(),s=document.createElement("script");s.src=d,s.async=true,s.onload=()=>{window.TapKit?(window.TapKitLoaded=true,window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,i()):(window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error("TapKit not available after loading local core")));},s.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load local TapKit core: ${d}`));},document.head.appendChild(s);return}let t=O(),a=document.createElement("script");a.src=t,a.async=true,a.onload=()=>{u(i,o,n)();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load TapKit CDN loader: ${t}`));};let l=document.querySelector(`script[src="${t}"]`);l?(l.addEventListener("load",()=>{u(i,o,n)();}),l.addEventListener("error",()=>o(new Error(`Failed to load TapKit CDN loader: ${t}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=e,e}var K=Symbol.for("tapkit.#config"),r,_,f=class{constructor(e){T(this,"instance",null);p(this,r);p(this,_);T(this,"pendingConfig");w(this,_,e),w(this,r,this.load());}async load(){try{await A();}catch(e){throw e}if(!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this.instance=new window.TapKit(c(this,_)),this.pendingConfig&&(this.instance[K]?.(this.pendingConfig),this.pendingConfig=void 0);}get ready(){return c(this,r).then(()=>{if(!this.instance)throw new Error("TapKit instance not initialized");return this.instance.ready})}get events(){if(!this.instance)throw new Error("TapKit not loaded yet. Use await sdk.ready first.");return this.instance.events}get isOpen(){return this.instance?.isOpen??false}get isInitialized(){return this.instance?.isInitialized??false}async init(e){await c(this,r),await this.instance.init(e);}destroy(){this.instance&&(this.instance.destroy(),this.instance=null);}[K](e){if(!this.instance){this.pendingConfig=e;return}this.instance[K]?.(e);}get[Symbol.toStringTag](){return "TapKit"}};r=new WeakMap,_=new WeakMap;
2
- module.exports=f;//# sourceMappingURL=index.js.map
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var tapKit=require('@coxwave/tap-kit');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var tapKit__default=/*#__PURE__*/_interopDefault(tapKit);typeof window<"u"&&!window.__TAP_SDK_DEPRECATION_WARNED__&&(window.__TAP_SDK_DEPRECATION_WARNED__=true);Object.defineProperty(exports,"TAPKIT_CONFIG_SYMBOL",{enumerable:true,get:function(){return tapKit.TAPKIT_CONFIG_SYMBOL}});Object.defineProperty(exports,"default",{enumerable:true,get:function(){return tapKit__default.default}});//# sourceMappingURL=index.js.map
3
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): 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(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"uOAoBI,OAAO,MAAA,CAAW,GAAA,EAAe,CAAC,MAAA,CAAO,8BAAA,GAwB3C,MAAA,CAAO,8BAAA,CAAiC,IAAA,CAAA","file":"index.js","sourcesContent":["/**\n * ⚠️ 중요: 이 패키지는 더 이상 사용되지 않습니다\n *\n * @coxwave/tap-kit으로 마이그레이션해 주세요!\n *\n * 마이그레이션 방법:\n * 1. 설치: npm install @coxwave/tap-kit\n * 2. import 변경:\n * [기존] import TapSDK from '@coxwave/tap-sdk'\n * [신규] import TapKit from '@coxwave/tap-kit'\n * 3. 클래스명만 변경하면 끝! (API는 100% 호환)\n *\n * 자세한 내용: https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit\n */\n\nexport type * from \"@coxwave/tap-kit\";\n// Re-export from tap-kit\nexport { default, TAPKIT_CONFIG_SYMBOL } from \"@coxwave/tap-kit\";\n\n// 한국어 경고 메시지 (한 번만 출력)\nif (typeof window !== \"undefined\" && !window.__TAP_SDK_DEPRECATION_WARNED__) {\n console.warn(\n \"\\n\" +\n \"┌─────────────────────────────────────────────────────────────┐\\n\" +\n \"│ ⚠️ @coxwave/tap-sdk는 더 이상 사용되지 않습니다 │\\n\" +\n \"├─────────────────────────────────────────────────────────────┤\\n\" +\n \"│ 새로운 패키지로 마이그레이션해 주세요: │\\n\" +\n \"│ │\\n\" +\n \"│ 📦 설치: │\\n\" +\n \"│ npm install @coxwave/tap-kit │\\n\" +\n \"│ │\\n\" +\n \"│ 📝 사용법 (변경 사항 최소): │\\n\" +\n \"│ [기존] import TapSDK from '@coxwave/tap-sdk' │\\n\" +\n \"│ [신규] import TapKit from '@coxwave/tap-kit' │\\n\" +\n \"│ │\\n\" +\n \"│ [기존] const sdk = new TapSDK({ ... }) │\\n\" +\n \"│ [신규] const kit = new TapKit({ ... }) │\\n\" +\n \"│ │\\n\" +\n \"│ ✅ API는 100% 호환됩니다! │\\n\" +\n \"│ │\\n\" +\n \"│ 📖 자세한 마이그레이션 가이드: │\\n\" +\n \"│ https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit │\\n\" +\n \"└─────────────────────────────────────────────────────────────┘\\n\",\n );\n window.__TAP_SDK_DEPRECATION_WARNED__ = true;\n}\n\ndeclare global {\n interface Window {\n __TAP_SDK_DEPRECATION_WARNED__?: boolean;\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,2 @@
1
- var g=Object.defineProperty;var L=n=>{throw TypeError(n)};var I=(n,e,i)=>e in n?g(n,e,{enumerable:true,configurable:true,writable:true,value:i}):n[e]=i;var T=(n,e,i)=>I(n,typeof e!="symbol"?e+"":e,i),D=(n,e,i)=>e.has(n)||L("Cannot "+i);var c=(n,e,i)=>(D(n,e,"read from private field"),i?i.call(n):e.get(n)),p=(n,e,i)=>e.has(n)?L("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,i),w=(n,e,i,o)=>(D(n,e,"write to private field"),e.set(n,i),i);var E="https://files.edutap.ai/tap-sdk/loader.js";function O(){return typeof window<"u"&&window.__TAP_KIT_LOADER_URL__?window.__TAP_KIT_LOADER_URL__:E}function C(){return typeof window<"u"&&!!window.__TAP_KIT_CORE_URL__}function m(){return window.__TAP_KIT_CORE_URL__||""}function u(n,e,i){let o=Date.now(),t=()=>{if(window.TapKit&&window.TapKitLoaded===true){window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,n();return}if(Date.now()-o>i){window.__TAP_KIT_LOADER_LOADING__=void 0,e(new Error(`TapKit loader timeout: SDK not available after ${i}ms`));return}typeof requestIdleCallback<"u"?requestIdleCallback(t,{timeout:500}):setTimeout(t,500);};return t}function A(n=4e3){if(window.__TAP_KIT_LOADER_LOADED__&&window.TapKit)return Promise.resolve();if(window.__TAP_KIT_LOADER_LOADING__)return window.__TAP_KIT_LOADER_LOADING__;let e=new Promise((i,o)=>{if(typeof document>"u"){o(new Error("TapKit requires browser environment (document is undefined)"));return}if(C()){let d=m(),s=document.createElement("script");s.src=d,s.async=true,s.onload=()=>{window.TapKit?(window.TapKitLoaded=true,window.__TAP_KIT_LOADER_LOADED__=true,window.__TAP_KIT_LOADER_LOADING__=void 0,i()):(window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error("TapKit not available after loading local core")));},s.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load local TapKit core: ${d}`));},document.head.appendChild(s);return}let t=O(),a=document.createElement("script");a.src=t,a.async=true,a.onload=()=>{u(i,o,n)();},a.onerror=()=>{window.__TAP_KIT_LOADER_LOADING__=void 0,o(new Error(`Failed to load TapKit CDN loader: ${t}`));};let l=document.querySelector(`script[src="${t}"]`);l?(l.addEventListener("load",()=>{u(i,o,n)();}),l.addEventListener("error",()=>o(new Error(`Failed to load TapKit CDN loader: ${t}`)))):document.head.appendChild(a);});return window.__TAP_KIT_LOADER_LOADING__=e,e}var K=Symbol.for("tapkit.#config"),r,_,f=class{constructor(e){T(this,"instance",null);p(this,r);p(this,_);T(this,"pendingConfig");w(this,_,e),w(this,r,this.load());}async load(){try{await A();}catch(e){throw e}if(!window.TapKit)throw new Error("TapKit not available after loading CDN loader");this.instance=new window.TapKit(c(this,_)),this.pendingConfig&&(this.instance[K]?.(this.pendingConfig),this.pendingConfig=void 0);}get ready(){return c(this,r).then(()=>{if(!this.instance)throw new Error("TapKit instance not initialized");return this.instance.ready})}get events(){if(!this.instance)throw new Error("TapKit not loaded yet. Use await sdk.ready first.");return this.instance.events}get isOpen(){return this.instance?.isOpen??false}get isInitialized(){return this.instance?.isInitialized??false}async init(e){await c(this,r),await this.instance.init(e);}destroy(){this.instance&&(this.instance.destroy(),this.instance=null);}[K](e){if(!this.instance){this.pendingConfig=e;return}this.instance[K]?.(e);}get[Symbol.toStringTag](){return "TapKit"}};r=new WeakMap,_=new WeakMap;
2
- export{f as default};//# sourceMappingURL=index.mjs.map
1
+ export{TAPKIT_CONFIG_SYMBOL,default}from'@coxwave/tap-kit';typeof window<"u"&&!window.__TAP_SDK_DEPRECATION_WARNED__&&(window.__TAP_SDK_DEPRECATION_WARNED__=true);//# sourceMappingURL=index.mjs.map
3
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loader.ts","../src/sdk.ts"],"names":["DEFAULT_CDN_LOADER_URL","getLoaderURL","isLocalCoreMode","getLocalCoreURL","createSDKChecker","resolve","reject","timeoutMs","startTime","checkSDK","loadCDNLoader","loadingPromise","coreURL","script","loaderURL","existingScript","TAPKIT_CONFIG_SYMBOL","_loading","_config","TapKit","config","__publicField","__privateAdd","__privateSet","err","__privateGet","params","options"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * CDN loader for TapSDK\n * Dynamically loads the TapKit SDK from CDN\n *\n * For local testing, you can override the loader URL:\n * window.__TAP_KIT_LOADER_URL__ = '/tap-kit-core/loader.js';\n *\n * For local development (bypass loader, load IIFE directly):\n * window.__TAP_KIT_CORE_URL__ = '/packages/tap-kit-core/dist/index.global.js';\n */\n\n// Build-time constant injected by tsup define\n// Production: https://files.edutap.ai/tap-sdk/loader.js\n// Demo: https://files.edutap.ai/tap-sdk/loader-demo.js\ndeclare const __DEFAULT_CDN_LOADER_URL__: string;\n\nconst DEFAULT_CDN_LOADER_URL = __DEFAULT_CDN_LOADER_URL__;\nconst DEFAULT_TIMEOUT_MS = 4000; // 4 seconds total timeout\nconst IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback\n\n/**\n * Get the loader URL from window override or default CDN\n */\nfunction getLoaderURL(): string {\n return typeof window !== \"undefined\" && window.__TAP_KIT_LOADER_URL__\n ? window.__TAP_KIT_LOADER_URL__\n : DEFAULT_CDN_LOADER_URL;\n}\n\n/**\n * Check if local core mode is enabled\n * When __TAP_KIT_CORE_URL__ is set, directly load the IIFE bundle\n * This bypasses the loader.js and loads tap-kit-core directly\n */\nfunction isLocalCoreMode(): boolean {\n return typeof window !== \"undefined\" && !!window.__TAP_KIT_CORE_URL__;\n}\n\n/**\n * Get the local core URL\n */\nfunction getLocalCoreURL(): string {\n return window.__TAP_KIT_CORE_URL__ || \"\";\n}\n\n/**\n * Creates a SDK checker function with timeout and retry logic\n * Uses requestIdleCallback to avoid blocking browser rendering\n * @param resolve - Promise resolve function\n * @param reject - Promise reject function\n * @param timeoutMs - Maximum time to wait for SDK to load (milliseconds)\n * @returns Checker function to be called repeatedly\n */\nfunction createSDKChecker(\n resolve: (value: void | PromiseLike<void>) => void,\n reject: (reason?: any) => void,\n timeoutMs: number\n): () => void {\n const startTime = Date.now();\n\n const checkSDK = (): void => {\n // Check if real TapKit is loaded (not just stub)\n // Stub has TapKitLoaded flag set to true by loader.js after real SDK loads\n if (window.TapKit && window.TapKitLoaded === true) {\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n resolve();\n return;\n }\n\n const elapsed = Date.now() - startTime;\n\n // Check if exceeded timeout\n if (elapsed > timeoutMs) {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));\n return;\n }\n\n // Use requestIdleCallback for better performance\n // Falls back to setTimeout if not available\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(checkSDK, { timeout: IDLE_CALLBACK_TIMEOUT_MS });\n } else {\n setTimeout(checkSDK, IDLE_CALLBACK_TIMEOUT_MS);\n }\n };\n\n return checkSDK;\n}\n\n/**\n * Loads the CDN loader script\n * The loader will then fetch versions.json and load the appropriate SDK version\n *\n * If __TAP_KIT_CORE_URL__ is set, bypasses loader and loads IIFE directly\n *\n * @param timeoutMs - Maximum time to wait for SDK to load (default: 4000ms)\n * @returns Promise that resolves when SDK is loaded\n * @throws {Error} If loader fails to load or times out\n */\nexport function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): 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(new Error(\"TapKit requires browser environment (document is undefined)\"));\n return;\n }\n\n // Local core mode: Load IIFE directly\n if (isLocalCoreMode()) {\n const coreURL = getLocalCoreURL();\n console.log(\"[TapSDK] Loading local core:\", coreURL);\n\n const script = document.createElement(\"script\");\n script.src = coreURL;\n script.async = true;\n\n script.onload = () => {\n // IIFE directly sets window.TapKit\n // Set the loaded flag manually since we bypass loader.js\n if (window.TapKit) {\n window.TapKitLoaded = true;\n window.__TAP_KIT_LOADER_LOADED__ = true;\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n console.log(\"[TapSDK] Local core loaded successfully\");\n resolve();\n } else {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(\"TapKit not available after loading local core\"));\n }\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load local TapKit core: ${coreURL}`));\n };\n\n document.head.appendChild(script);\n return;\n }\n\n // CDN mode: Load loader.js\n const loaderURL = getLoaderURL();\n const script = document.createElement(\"script\");\n script.src = loaderURL;\n script.async = true;\n\n script.onload = () => {\n // The loader script will load the actual SDK\n // We need to wait a bit for the loader to fetch and load the SDK\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n };\n\n script.onerror = () => {\n window.__TAP_KIT_LOADER_LOADING__ = undefined;\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`));\n };\n\n // Check if script already exists\n const existingScript = document.querySelector(`script[src=\"${loaderURL}\"]`);\n\n if (existingScript) {\n // Script already added but not yet loaded\n existingScript.addEventListener(\"load\", () => {\n const checkSDK = createSDKChecker(resolve, reject, timeoutMs);\n checkSDK();\n });\n existingScript.addEventListener(\"error\", () =>\n reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))\n );\n } else {\n document.head.appendChild(script);\n }\n });\n\n window.__TAP_KIT_LOADER_LOADING__ = loadingPromise;\n return loadingPromise;\n}\n","import type {\n TapKitConfig,\n TapKitInitParams,\n TapKitInstance,\n TapKitConfigOptions,\n TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,\n} from \"@coxwave/tap-kit-types\";\nimport { loadCDNLoader } from \"./loader\";\n\n/** @internal Symbol for internal configuration method */\nconst TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(\"tapkit.#config\") as any;\n\n/**\n * TapSDK - Official TapKit Web SDK\n *\n * @example\n * ```typescript\n * import TapSDK from \"@coxwave/tap-sdk\";\n *\n * const sdk = new TapSDK({ apiKey: 'your-api-key' });\n *\n * await sdk.init({\n * buttonId: 'tap-button',\n * course: {\n * userId: 'user-123',\n * courseId: 'course-456',\n * clipId: 'clip-789',\n * },\n * container: {\n * position: { top: '64px', right: '32px' },\n * width: '360px',\n * height: 'calc(100% - 128px)',\n * },\n * });\n * ```\n */\nexport class TapKit implements TapKitInstance {\n private instance: TapKitInstance | null = null;\n #loading: Promise<void>;\n #config: TapKitConfig;\n private pendingConfig?: TapKitConfigOptions; // Queue config until instance is ready\n\n constructor(config: TapKitConfig) {\n this.#config = config;\n this.#loading = this.load();\n }\n\n private async load(): Promise<void> {\n console.log(\"[TapSDK] Starting CDN loader...\");\n\n try {\n await loadCDNLoader();\n console.log(\"[TapSDK] CDN loader completed\");\n } catch (err) {\n console.error(\"[TapSDK] CDN loader failed:\", err);\n throw err;\n }\n\n if (!window.TapKit) {\n console.error(\"[TapSDK] window.TapKit not available after loading\");\n throw new Error(\"TapKit not available after loading CDN loader\");\n }\n\n console.log(\"[TapSDK] Creating TapKit instance from window.TapKit\");\n this.instance = new window.TapKit(this.#config);\n console.log(\"[TapSDK] TapKit instance created successfully\");\n\n // Apply pending config if any\n if (this.pendingConfig) {\n console.log(\"[TapSDK] Applying pending config:\", this.pendingConfig);\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(this.pendingConfig);\n this.pendingConfig = undefined;\n }\n }\n\n get ready(): Promise<void> {\n return this.#loading.then(() => {\n if (!this.instance) {\n throw new Error(\"TapKit instance not initialized\");\n }\n return this.instance.ready;\n });\n }\n\n get events() {\n if (!this.instance) {\n throw new Error(\"TapKit not loaded yet. Use await sdk.ready first.\");\n }\n return this.instance.events;\n }\n\n get isOpen(): boolean {\n return this.instance?.isOpen ?? false;\n }\n\n get isInitialized(): boolean {\n return this.instance?.isInitialized ?? false;\n }\n\n async init(params: TapKitInitParams): Promise<void> {\n await this.#loading; // Wait for CDN loader to complete\n await this.instance!.init(params);\n }\n\n destroy(): void {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {\n if (!this.instance) {\n // Queue config until instance is ready\n console.log(\"[TapSDK] Queueing config (instance not loaded yet):\", options);\n this.pendingConfig = options;\n return;\n }\n this.instance[TAPKIT_CONFIG_SYMBOL]?.(options);\n }\n\n get [Symbol.toStringTag]() {\n return \"TapKit\";\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"2DAoBI,OAAO,MAAA,CAAW,GAAA,EAAe,CAAC,MAAA,CAAO,8BAAA,GAwB3C,MAAA,CAAO,8BAAA,CAAiC,IAAA,CAAA","file":"index.mjs","sourcesContent":["/**\n * ⚠️ 중요: 이 패키지는 더 이상 사용되지 않습니다\n *\n * @coxwave/tap-kit으로 마이그레이션해 주세요!\n *\n * 마이그레이션 방법:\n * 1. 설치: npm install @coxwave/tap-kit\n * 2. import 변경:\n * [기존] import TapSDK from '@coxwave/tap-sdk'\n * [신규] import TapKit from '@coxwave/tap-kit'\n * 3. 클래스명만 변경하면 끝! (API는 100% 호환)\n *\n * 자세한 내용: https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit\n */\n\nexport type * from \"@coxwave/tap-kit\";\n// Re-export from tap-kit\nexport { default, TAPKIT_CONFIG_SYMBOL } from \"@coxwave/tap-kit\";\n\n// 한국어 경고 메시지 (한 번만 출력)\nif (typeof window !== \"undefined\" && !window.__TAP_SDK_DEPRECATION_WARNED__) {\n console.warn(\n \"\\n\" +\n \"┌─────────────────────────────────────────────────────────────┐\\n\" +\n \"│ ⚠️ @coxwave/tap-sdk는 더 이상 사용되지 않습니다 │\\n\" +\n \"├─────────────────────────────────────────────────────────────┤\\n\" +\n \"│ 새로운 패키지로 마이그레이션해 주세요: │\\n\" +\n \"│ │\\n\" +\n \"│ 📦 설치: │\\n\" +\n \"│ npm install @coxwave/tap-kit │\\n\" +\n \"│ │\\n\" +\n \"│ 📝 사용법 (변경 사항 최소): │\\n\" +\n \"│ [기존] import TapSDK from '@coxwave/tap-sdk' │\\n\" +\n \"│ [신규] import TapKit from '@coxwave/tap-kit' │\\n\" +\n \"│ │\\n\" +\n \"│ [기존] const sdk = new TapSDK({ ... }) │\\n\" +\n \"│ [신규] const kit = new TapKit({ ... }) │\\n\" +\n \"│ │\\n\" +\n \"│ ✅ API는 100% 호환됩니다! │\\n\" +\n \"│ │\\n\" +\n \"│ 📖 자세한 마이그레이션 가이드: │\\n\" +\n \"│ https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit │\\n\" +\n \"└─────────────────────────────────────────────────────────────┘\\n\",\n );\n window.__TAP_SDK_DEPRECATION_WARNED__ = true;\n}\n\ndeclare global {\n interface Window {\n __TAP_SDK_DEPRECATION_WARNED__?: boolean;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@coxwave/tap-sdk",
3
- "version": "0.3.7",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
- "description": "TapSDK - Minimal wrapper that loads TapSDK from CDN",
5
+ "description": "[더 이상 사용되지 않음] @coxwave/tap-kit을 사용해 주세요",
6
+ "deprecated": "⚠️ 이 패키지는 더 이상 사용되지 않습니다. @coxwave/tap-kit으로 마이그레이션해 주세요. 설치 방법: npm install @coxwave/tap-kit",
6
7
  "main": "dist/index.js",
7
8
  "module": "dist/index.mjs",
8
9
  "types": "dist/index.d.ts",
@@ -29,19 +30,22 @@
29
30
  "src"
30
31
  ],
31
32
  "dependencies": {
32
- "@coxwave/tap-kit-types": "0.0.44"
33
+ "@coxwave/tap-kit": "1.0.0",
34
+ "@coxwave/tap-kit-types": "0.0.66"
33
35
  },
34
36
  "devDependencies": {
35
37
  "tsup": "^8.5.0",
36
- "@coxwave/config-typescript": "1.0.0",
37
- "@coxwave/config-eslint": "1.0.0"
38
+ "@coxwave/config-typescript": "1.0.0"
38
39
  },
39
40
  "scripts": {
40
41
  "build": "tsup",
41
42
  "build:demo": "DEMO=true tsup",
42
43
  "build:analyze": "tsup --metafile",
43
44
  "dev": "tsup --watch",
44
- "lint": "eslint .",
45
+ "lint": "biome check .",
46
+ "lint:fix": "biome check --write .",
47
+ "format": "biome format --write .",
48
+ "typecheck": "tsc --noEmit",
45
49
  "version:demo": "npm version prerelease --preid=demo --no-git-tag-version",
46
50
  "publish:npm": "./scripts/publish.sh",
47
51
  "publish:npm:demo": "DEMO=true ./scripts/publish.sh"
package/src/index.ts CHANGED
@@ -1,21 +1,52 @@
1
1
  /**
2
- * TapSDK - Official TapKit Web SDK
3
- * @see https://edutap-docs.vercel.app
2
+ * ⚠️ 중요: 패키지는 이상 사용되지 않습니다
3
+ *
4
+ * @coxwave/tap-kit으로 마이그레이션해 주세요!
5
+ *
6
+ * 마이그레이션 방법:
7
+ * 1. 설치: npm install @coxwave/tap-kit
8
+ * 2. import 변경:
9
+ * [기존] import TapSDK from '@coxwave/tap-sdk'
10
+ * [신규] import TapKit from '@coxwave/tap-kit'
11
+ * 3. 클래스명만 변경하면 끝! (API는 100% 호환)
12
+ *
13
+ * 자세한 내용: https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit
4
14
  */
5
15
 
6
- // Default export: TapKit class
7
- export { TapKit as default } from "./sdk";
16
+ export type * from "@coxwave/tap-kit";
17
+ // Re-export from tap-kit
18
+ export { default, TAPKIT_CONFIG_SYMBOL } from "@coxwave/tap-kit";
8
19
 
9
- // Type definitions
10
- export type {
11
- TapKitConfig,
12
- TapKitInitParams,
13
- Course,
14
- ContainerStyle,
15
- PositionType,
16
- SeekTimelineParamsType,
17
- AlarmMessageInstanceType,
18
- AlarmType,
19
- TapKitInstance,
20
- TapKitConstructor,
21
- } from "@coxwave/tap-kit-types";
20
+ // 한국어 경고 메시지 (한 번만 출력)
21
+ if (typeof window !== "undefined" && !window.__TAP_SDK_DEPRECATION_WARNED__) {
22
+ console.warn(
23
+ "\n" +
24
+ "┌─────────────────────────────────────────────────────────────┐\n" +
25
+ "│ ⚠️ @coxwave/tap-sdk는 더 이상 사용되지 않습니다 │\n" +
26
+ "├─────────────────────────────────────────────────────────────┤\n" +
27
+ "│ 새로운 패키지로 마이그레이션해 주세요: │\n" +
28
+ "│ │\n" +
29
+ "│ 📦 설치: │\n" +
30
+ "│ npm install @coxwave/tap-kit │\n" +
31
+ "│ │\n" +
32
+ "│ 📝 사용법 (변경 사항 최소): │\n" +
33
+ "│ [기존] import TapSDK from '@coxwave/tap-sdk' │\n" +
34
+ "│ [신규] import TapKit from '@coxwave/tap-kit' │\n" +
35
+ "│ │\n" +
36
+ "│ [기존] const sdk = new TapSDK({ ... }) │\n" +
37
+ "│ [신규] const kit = new TapKit({ ... }) │\n" +
38
+ "│ │\n" +
39
+ "│ ✅ API는 100% 호환됩니다! │\n" +
40
+ "│ │\n" +
41
+ "│ 📖 자세한 마이그레이션 가이드: │\n" +
42
+ "│ https://edutap-ai-docs.vercel.app/docs/migration/tap-sdk-to-tap-kit │\n" +
43
+ "└─────────────────────────────────────────────────────────────┘\n",
44
+ );
45
+ window.__TAP_SDK_DEPRECATION_WARNED__ = true;
46
+ }
47
+
48
+ declare global {
49
+ interface Window {
50
+ __TAP_SDK_DEPRECATION_WARNED__?: boolean;
51
+ }
52
+ }
package/src/loader.ts CHANGED
@@ -22,7 +22,7 @@ const IDLE_CALLBACK_TIMEOUT_MS = 500; // 500ms for requestIdleCallback
22
22
  * Get the loader URL from window override or default CDN
23
23
  */
24
24
  function getLoaderURL(): string {
25
- return typeof window !== "undefined" && window.__TAP_KIT_LOADER_URL__
25
+ return window?.__TAP_KIT_LOADER_URL__
26
26
  ? window.__TAP_KIT_LOADER_URL__
27
27
  : DEFAULT_CDN_LOADER_URL;
28
28
  }
@@ -54,7 +54,7 @@ function getLocalCoreURL(): string {
54
54
  function createSDKChecker(
55
55
  resolve: (value: void | PromiseLike<void>) => void,
56
56
  reject: (reason?: any) => void,
57
- timeoutMs: number
57
+ timeoutMs: number,
58
58
  ): () => void {
59
59
  const startTime = Date.now();
60
60
 
@@ -73,7 +73,11 @@ function createSDKChecker(
73
73
  // Check if exceeded timeout
74
74
  if (elapsed > timeoutMs) {
75
75
  window.__TAP_KIT_LOADER_LOADING__ = undefined;
76
- reject(new Error(`TapKit loader timeout: SDK not available after ${timeoutMs}ms`));
76
+ reject(
77
+ new Error(
78
+ `TapKit loader timeout: SDK not available after ${timeoutMs}ms`,
79
+ ),
80
+ );
77
81
  return;
78
82
  }
79
83
 
@@ -99,7 +103,9 @@ function createSDKChecker(
99
103
  * @returns Promise that resolves when SDK is loaded
100
104
  * @throws {Error} If loader fails to load or times out
101
105
  */
102
- export function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<void> {
106
+ export function loadCDNLoader(
107
+ timeoutMs: number = DEFAULT_TIMEOUT_MS,
108
+ ): Promise<void> {
103
109
  // If already loaded, return immediately
104
110
  if (window.__TAP_KIT_LOADER_LOADED__ && window.TapKit) {
105
111
  return Promise.resolve();
@@ -113,7 +119,11 @@ export function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<v
113
119
  // Create loading promise
114
120
  const loadingPromise = new Promise<void>((resolve, reject) => {
115
121
  if (typeof document === "undefined") {
116
- reject(new Error("TapKit requires browser environment (document is undefined)"));
122
+ reject(
123
+ new Error(
124
+ "TapKit requires browser environment (document is undefined)",
125
+ ),
126
+ );
117
127
  return;
118
128
  }
119
129
 
@@ -178,7 +188,7 @@ export function loadCDNLoader(timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<v
178
188
  checkSDK();
179
189
  });
180
190
  existingScript.addEventListener("error", () =>
181
- reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`))
191
+ reject(new Error(`Failed to load TapKit CDN loader: ${loaderURL}`)),
182
192
  );
183
193
  } else {
184
194
  document.head.appendChild(script);
package/src/sdk.ts CHANGED
@@ -1,14 +1,16 @@
1
1
  import type {
2
+ TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,
2
3
  TapKitConfig,
4
+ TapKitConfigOptions,
3
5
  TapKitInitParams,
4
6
  TapKitInstance,
5
- TapKitConfigOptions,
6
- TAPKIT_CONFIG_SYMBOL as TAPKIT_CONFIG_SYMBOL_TYPE,
7
7
  } from "@coxwave/tap-kit-types";
8
8
  import { loadCDNLoader } from "./loader";
9
9
 
10
10
  /** @internal Symbol for internal configuration method */
11
- const TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for("tapkit.#config") as any;
11
+ const TAPKIT_CONFIG_SYMBOL: typeof TAPKIT_CONFIG_SYMBOL_TYPE = Symbol.for(
12
+ "tapkit.#config",
13
+ ) as any;
12
14
 
13
15
  /**
14
16
  * TapSDK - Official TapKit Web SDK
@@ -97,9 +99,16 @@ export class TapKit implements TapKitInstance {
97
99
  return this.instance?.isInitialized ?? false;
98
100
  }
99
101
 
100
- async init(params: TapKitInitParams): Promise<void> {
101
- await this.#loading; // Wait for CDN loader to complete
102
- await this.instance!.init(params);
102
+ get video() {
103
+ if (!this.instance) {
104
+ throw new Error("TapKit not loaded yet. Use await sdk.ready first.");
105
+ }
106
+ return this.instance.video;
107
+ }
108
+
109
+ async init(params: TapKitInitParams): Promise<() => void> {
110
+ await this.#loading;
111
+ return await this.instance!.init(params);
103
112
  }
104
113
 
105
114
  destroy(): void {
@@ -112,7 +121,10 @@ export class TapKit implements TapKitInstance {
112
121
  [TAPKIT_CONFIG_SYMBOL](options: TapKitConfigOptions): void {
113
122
  if (!this.instance) {
114
123
  // Queue config until instance is ready
115
- console.log("[TapSDK] Queueing config (instance not loaded yet):", options);
124
+ console.log(
125
+ "[TapSDK] Queueing config (instance not loaded yet):",
126
+ options,
127
+ );
116
128
  this.pendingConfig = options;
117
129
  return;
118
130
  }