@auroraview/sdk 0.4.4 → 0.4.5
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/{bridge-CRwRGPq-.d.cts → bridge--3Gt_WQR.d.cts} +8 -0
- package/dist/{bridge-CRwRGPq-.d.ts → bridge--3Gt_WQR.d.ts} +8 -0
- package/dist/index.cjs +24 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +24 -7
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +24 -7
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +24 -7
- package/dist/react.js.map +1 -1
- package/dist/vue.cjs +24 -7
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.cts +1 -1
- package/dist/vue.d.ts +1 -1
- package/dist/vue.js +24 -7
- package/dist/vue.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,11 @@ type EventHandler<T = unknown> = (data: T) => void;
|
|
|
9
9
|
type Unsubscribe = () => void;
|
|
10
10
|
/** State change handler function */
|
|
11
11
|
type StateChangeHandler = (key: string, value: unknown, source: 'python' | 'javascript') => void;
|
|
12
|
+
interface AuroraViewConfig {
|
|
13
|
+
callTimeoutMs?: number;
|
|
14
|
+
backendFailFast?: boolean;
|
|
15
|
+
heartbeatTimeoutMs?: number;
|
|
16
|
+
}
|
|
12
17
|
/** IPC message payload types */
|
|
13
18
|
type IPCMessageType = 'call' | 'event' | 'invoke';
|
|
14
19
|
/** Base IPC message structure */
|
|
@@ -182,6 +187,7 @@ interface AuroraViewBridge {
|
|
|
182
187
|
isReady(): boolean;
|
|
183
188
|
isMethodBound?(fullMethodName: string): boolean;
|
|
184
189
|
getBoundMethods?(): string[];
|
|
190
|
+
setConfig?(config: AuroraViewConfig): void;
|
|
185
191
|
_registerApiMethods?(namespace: string, methods: string[], options?: {
|
|
186
192
|
allowRebind?: boolean;
|
|
187
193
|
}): void;
|
|
@@ -281,6 +287,8 @@ interface AuroraViewClient {
|
|
|
281
287
|
isReady(): boolean;
|
|
282
288
|
/** Wait for bridge to be ready */
|
|
283
289
|
whenReady(): Promise<AuroraViewClient>;
|
|
290
|
+
/** Configure timeouts and health strategy */
|
|
291
|
+
setConfig(config: AuroraViewConfig): void;
|
|
284
292
|
/** Get the raw bridge object */
|
|
285
293
|
getRawBridge(): AuroraViewBridge | undefined;
|
|
286
294
|
/** File system API */
|
|
@@ -9,6 +9,11 @@ type EventHandler<T = unknown> = (data: T) => void;
|
|
|
9
9
|
type Unsubscribe = () => void;
|
|
10
10
|
/** State change handler function */
|
|
11
11
|
type StateChangeHandler = (key: string, value: unknown, source: 'python' | 'javascript') => void;
|
|
12
|
+
interface AuroraViewConfig {
|
|
13
|
+
callTimeoutMs?: number;
|
|
14
|
+
backendFailFast?: boolean;
|
|
15
|
+
heartbeatTimeoutMs?: number;
|
|
16
|
+
}
|
|
12
17
|
/** IPC message payload types */
|
|
13
18
|
type IPCMessageType = 'call' | 'event' | 'invoke';
|
|
14
19
|
/** Base IPC message structure */
|
|
@@ -182,6 +187,7 @@ interface AuroraViewBridge {
|
|
|
182
187
|
isReady(): boolean;
|
|
183
188
|
isMethodBound?(fullMethodName: string): boolean;
|
|
184
189
|
getBoundMethods?(): string[];
|
|
190
|
+
setConfig?(config: AuroraViewConfig): void;
|
|
185
191
|
_registerApiMethods?(namespace: string, methods: string[], options?: {
|
|
186
192
|
allowRebind?: boolean;
|
|
187
193
|
}): void;
|
|
@@ -281,6 +287,8 @@ interface AuroraViewClient {
|
|
|
281
287
|
isReady(): boolean;
|
|
282
288
|
/** Wait for bridge to be ready */
|
|
283
289
|
whenReady(): Promise<AuroraViewClient>;
|
|
290
|
+
/** Configure timeouts and health strategy */
|
|
291
|
+
setConfig(config: AuroraViewConfig): void;
|
|
284
292
|
/** Get the raw bridge object */
|
|
285
293
|
getRawBridge(): AuroraViewBridge | undefined;
|
|
286
294
|
/** File system API */
|
package/dist/index.cjs
CHANGED
|
@@ -107,27 +107,38 @@ var AuroraViewClientImpl = class {
|
|
|
107
107
|
* Install intercept on window.auroraview.trigger to forward events
|
|
108
108
|
*/
|
|
109
109
|
installTriggerIntercept() {
|
|
110
|
-
if (this.interceptInstalled) return;
|
|
111
110
|
if (typeof window === "undefined") return;
|
|
111
|
+
const self = this;
|
|
112
112
|
const install = () => {
|
|
113
113
|
const bridge = window.auroraview;
|
|
114
114
|
if (!bridge) return;
|
|
115
|
+
if (bridge.trigger?._sdkWrapped) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
115
118
|
const originalTrigger = bridge.trigger;
|
|
116
|
-
|
|
119
|
+
const wrappedTrigger = function(event, detail) {
|
|
117
120
|
originalTrigger?.call(bridge, event, detail);
|
|
118
|
-
|
|
121
|
+
self.events.emit(event, detail);
|
|
119
122
|
};
|
|
120
|
-
|
|
123
|
+
wrappedTrigger._sdkWrapped = true;
|
|
124
|
+
bridge.trigger = wrappedTrigger;
|
|
125
|
+
self.interceptInstalled = true;
|
|
121
126
|
};
|
|
122
127
|
if (window.auroraview) {
|
|
123
128
|
install();
|
|
124
|
-
}
|
|
129
|
+
}
|
|
130
|
+
window.addEventListener("auroraviewready", () => {
|
|
131
|
+
install();
|
|
132
|
+
});
|
|
133
|
+
if (!this.interceptInstalled) {
|
|
125
134
|
const checkInterval = setInterval(() => {
|
|
126
135
|
if (window.auroraview) {
|
|
127
|
-
clearInterval(checkInterval);
|
|
128
136
|
install();
|
|
137
|
+
if (self.interceptInstalled) {
|
|
138
|
+
clearInterval(checkInterval);
|
|
139
|
+
}
|
|
129
140
|
}
|
|
130
|
-
},
|
|
141
|
+
}, 50);
|
|
131
142
|
setTimeout(() => clearInterval(checkInterval), 1e4);
|
|
132
143
|
}
|
|
133
144
|
}
|
|
@@ -189,6 +200,12 @@ var AuroraViewClientImpl = class {
|
|
|
189
200
|
}
|
|
190
201
|
});
|
|
191
202
|
}
|
|
203
|
+
setConfig(config2) {
|
|
204
|
+
const bridge = window.auroraview;
|
|
205
|
+
if (bridge?.setConfig) {
|
|
206
|
+
bridge.setConfig(config2);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
192
209
|
getRawBridge() {
|
|
193
210
|
return window.auroraview;
|
|
194
211
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/events.ts","../src/core/bridge.ts","../src/inject/plugins/utils.ts","../src/inject/plugins/interactive.ts"],"names":["observer"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AuroraView SDK Event System\n *\n * Provides a type-safe event emitter with proper unsubscribe support.\n */\n\nimport type { EventHandler, Unsubscribe } from './types';\n\n/**\n * Event emitter with unsubscribe support\n */\nexport class EventEmitter {\n private handlers = new Map<string, Set<EventHandler>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n const handlers = this.handlers.get(event)!;\n handlers.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.handlers.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event once\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n const wrapper: EventHandler<T> = (data) => {\n unsubscribe();\n handler(data);\n };\n const unsubscribe = this.on(event, wrapper);\n return unsubscribe;\n }\n\n /**\n * Emit an event to all handlers\n * @param event - Event name\n * @param data - Event data\n */\n emit<T = unknown>(event: string, data: T): void {\n const handlers = this.handlers.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (e) {\n console.error(`[AuroraView] Error in event handler for \"${event}\":`, e);\n }\n });\n }\n\n /**\n * Remove event handler(s)\n * @param event - Event name\n * @param handler - Optional specific handler to remove\n */\n off(event: string, handler?: EventHandler): void {\n if (handler) {\n this.handlers.get(event)?.delete(handler);\n } else {\n this.handlers.delete(event);\n }\n }\n\n /**\n * Check if event has handlers\n * @param event - Event name\n */\n hasHandlers(event: string): boolean {\n const handlers = this.handlers.get(event);\n return handlers !== undefined && handlers.size > 0;\n }\n\n /**\n * Get handler count for an event\n * @param event - Event name\n */\n handlerCount(event: string): number {\n return this.handlers.get(event)?.size ?? 0;\n }\n\n /**\n * Remove all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/** Singleton event emitter instance */\nlet globalEmitter: EventEmitter | null = null;\n\n/**\n * Get the global event emitter instance\n */\nexport function getGlobalEmitter(): EventEmitter {\n if (!globalEmitter) {\n globalEmitter = new EventEmitter();\n }\n return globalEmitter;\n}\n","/**\n * AuroraView SDK Bridge Client\n *\n * Provides a type-safe wrapper around the native bridge API.\n */\n\nimport { EventEmitter, getGlobalEmitter } from './events';\nimport type {\n EventHandler,\n Unsubscribe,\n AuroraViewBridge,\n FileSystemAPI,\n DialogAPI,\n ClipboardAPI,\n ShellAPI,\n AuroraViewState,\n} from './types';\n\n/**\n * AuroraView client interface\n */\nexport interface AuroraViewClient {\n /** Call a Python method (RPC-style) */\n call<T = unknown>(method: string, params?: unknown): Promise<T>;\n\n /** Invoke a plugin command */\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T>;\n\n /** Send an event to Python (fire-and-forget) */\n emit(event: string, data?: unknown): void;\n\n /** Subscribe to an event from Python */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Subscribe to an event once */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Unsubscribe from an event */\n off(event: string, handler?: EventHandler): void;\n\n /** Check if bridge is ready */\n isReady(): boolean;\n\n /** Wait for bridge to be ready */\n whenReady(): Promise<AuroraViewClient>;\n\n /** Get the raw bridge object */\n getRawBridge(): AuroraViewBridge | undefined;\n\n /** File system API */\n readonly fs: FileSystemAPI | undefined;\n\n /** Dialog API */\n readonly dialog: DialogAPI | undefined;\n\n /** Clipboard API */\n readonly clipboard: ClipboardAPI | undefined;\n\n /** Shell API */\n readonly shell: ShellAPI | undefined;\n\n /** Shared state */\n readonly state: AuroraViewState | undefined;\n}\n\n/**\n * Internal client implementation\n */\nclass AuroraViewClientImpl implements AuroraViewClient {\n private events: EventEmitter;\n private interceptInstalled = false;\n\n constructor() {\n this.events = getGlobalEmitter();\n this.installTriggerIntercept();\n }\n\n /**\n * Install intercept on window.auroraview.trigger to forward events\n */\n private installTriggerIntercept(): void {\n if (this.interceptInstalled) return;\n if (typeof window === 'undefined') return;\n\n const install = () => {\n const bridge = window.auroraview;\n if (!bridge) return;\n\n const originalTrigger = bridge.trigger;\n bridge.trigger = (event: string, detail?: unknown) => {\n // Call original trigger first\n originalTrigger?.call(bridge, event, detail);\n // Forward to our event system\n this.events.emit(event, detail);\n };\n\n this.interceptInstalled = true;\n };\n\n // Try to install immediately\n if (window.auroraview) {\n install();\n } else {\n // Wait for bridge to be available\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n install();\n }\n }, 10);\n\n // Stop checking after 10 seconds\n setTimeout(() => clearInterval(checkInterval), 10000);\n }\n }\n\n call<T = unknown>(method: string, params?: unknown): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.call<T>(method, params);\n }\n\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.invoke<T>(cmd, args);\n }\n\n emit(event: string, data?: unknown): void {\n const bridge = window.auroraview;\n if (bridge) {\n bridge.send_event(event, data);\n }\n }\n\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.on(event, handler);\n }\n\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.once(event, handler);\n }\n\n off(event: string, handler?: EventHandler): void {\n this.events.off(event, handler);\n }\n\n isReady(): boolean {\n return window.auroraview?._ready === true;\n }\n\n whenReady(): Promise<AuroraViewClient> {\n return new Promise((resolve) => {\n if (this.isReady()) {\n resolve(this);\n } else if (window.auroraview) {\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n } else {\n // Wait for bridge to appear\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n }\n }, 10);\n\n // Timeout after 30 seconds\n setTimeout(() => {\n clearInterval(checkInterval);\n resolve(this);\n }, 30000);\n }\n });\n }\n\n getRawBridge(): AuroraViewBridge | undefined {\n return window.auroraview;\n }\n\n get fs(): FileSystemAPI | undefined {\n return window.auroraview?.fs;\n }\n\n get dialog(): DialogAPI | undefined {\n return window.auroraview?.dialog;\n }\n\n get clipboard(): ClipboardAPI | undefined {\n return window.auroraview?.clipboard;\n }\n\n get shell(): ShellAPI | undefined {\n return window.auroraview?.shell;\n }\n\n get state(): AuroraViewState | undefined {\n return window.auroraview?.state;\n }\n}\n\n/** Singleton client instance */\nlet clientInstance: AuroraViewClient | null = null;\n\n/**\n * Create or get the AuroraView client instance\n */\nexport function createAuroraView(): AuroraViewClient {\n if (!clientInstance) {\n clientInstance = new AuroraViewClientImpl();\n }\n return clientInstance;\n}\n\n/**\n * Get the AuroraView client instance (alias for createAuroraView)\n */\nexport function getAuroraView(): AuroraViewClient {\n return createAuroraView();\n}\n","/**\n * Plugin utilities shared across all plugins\n */\n\n/**\n * Invoke a plugin command\n */\nexport async function invokePlugin<T = unknown>(\n plugin: string,\n command: string,\n args?: Record<string, unknown>\n): Promise<T> {\n if (!window.auroraview || !window.auroraview.invoke) {\n throw new Error('AuroraView bridge not available');\n }\n\n const result = await window.auroraview.invoke<T & { success?: boolean; error?: string; code?: string }>(\n `plugin:${plugin}|${command}`,\n args || {}\n );\n\n if (result && result.success === false) {\n const error = new Error(result.error || 'Unknown error') as Error & { code?: string };\n error.code = result.code || 'UNKNOWN';\n throw error;\n }\n\n return result;\n}\n\n/**\n * Attach a plugin to the auroraview object\n */\nexport function attachPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n (window.auroraview as unknown as Record<string, unknown>)[name] = api;\n console.log(`[AuroraView] ${name.charAt(0).toUpperCase() + name.slice(1)} plugin initialized`);\n }\n}\n\n/**\n * Wait for auroraview to be available and attach plugin\n */\nexport function initPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n attachPlugin(name, api);\n } else {\n const observer = setInterval(function () {\n if (window.auroraview) {\n clearInterval(observer);\n attachPlugin(name, api);\n }\n }, 10);\n\n // Stop trying after 5 seconds\n setTimeout(function () {\n clearInterval(observer);\n }, 5000);\n }\n}\n","/**\n * Interactive regions plugin for click-through windows\n *\n * This plugin monitors DOM elements with the `data-interactive` attribute\n * and reports their positions to the native layer for click-through support.\n *\n * @example\n * ```html\n * <!-- Mark an element as interactive -->\n * <button data-interactive>Click Me</button>\n *\n * <!-- The plugin will automatically track this element's position -->\n * ```\n *\n * @example\n * ```typescript\n * import { interactive } from 'auroraview-sdk';\n *\n * // Manually trigger a region update\n * interactive.update();\n *\n * // Get current regions\n * const regions = interactive.getRegions();\n *\n * // Enable/disable tracking\n * interactive.setEnabled(false);\n * ```\n */\n\nimport { invokePlugin, initPlugin } from './utils';\n\n/**\n * Interactive region data\n */\nexport interface InteractiveRegion {\n /** X coordinate (left edge) in pixels */\n x: number;\n /** Y coordinate (top edge) in pixels */\n y: number;\n /** Width in pixels */\n width: number;\n /** Height in pixels */\n height: number;\n /** Element ID (if available) */\n id?: string;\n}\n\n/**\n * Configuration for the interactive plugin\n */\nexport interface InteractiveConfig {\n /** Attribute name to look for (default: 'data-interactive') */\n attribute: string;\n /** Debounce delay in milliseconds (default: 100) */\n debounceMs: number;\n /** Whether to observe DOM changes (default: true) */\n observeChanges: boolean;\n /** Whether to observe resize events (default: true) */\n observeResize: boolean;\n /** Whether to observe scroll events (default: true) */\n observeScroll: boolean;\n}\n\nconst DEFAULT_CONFIG: InteractiveConfig = {\n attribute: 'data-interactive',\n debounceMs: 100,\n observeChanges: true,\n observeResize: true,\n observeScroll: true,\n};\n\nlet config: InteractiveConfig = { ...DEFAULT_CONFIG };\nlet enabled = true;\nlet observer: MutationObserver | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastRegions: InteractiveRegion[] = [];\n\n/**\n * Collect all interactive regions from the DOM\n */\nfunction collectRegions(): InteractiveRegion[] {\n const elements = document.querySelectorAll(`[${config.attribute}]`);\n const regions: InteractiveRegion[] = [];\n\n elements.forEach((element) => {\n const rect = element.getBoundingClientRect();\n\n // Skip invisible elements\n if (rect.width === 0 || rect.height === 0) {\n return;\n }\n\n // Skip elements outside viewport\n if (\n rect.bottom < 0 ||\n rect.top > window.innerHeight ||\n rect.right < 0 ||\n rect.left > window.innerWidth\n ) {\n return;\n }\n\n regions.push({\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n id: element.id || undefined,\n });\n });\n\n return regions;\n}\n\n/**\n * Check if regions have changed\n */\nfunction regionsChanged(newRegions: InteractiveRegion[]): boolean {\n if (newRegions.length !== lastRegions.length) {\n return true;\n }\n\n for (let i = 0; i < newRegions.length; i++) {\n const a = newRegions[i];\n const b = lastRegions[i];\n if (a.x !== b.x || a.y !== b.y || a.width !== b.width || a.height !== b.height) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Send regions to native layer\n */\nasync function sendRegions(regions: InteractiveRegion[]): Promise<void> {\n try {\n await invokePlugin('window', 'update_interactive_regions', { regions });\n console.debug('[AuroraView] Updated interactive regions:', regions.length);\n } catch (error) {\n console.error('[AuroraView] Failed to update interactive regions:', error);\n }\n}\n\n/**\n * Update interactive regions (debounced)\n */\nfunction scheduleUpdate(): void {\n if (!enabled) return;\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(() => {\n const regions = collectRegions();\n if (regionsChanged(regions)) {\n lastRegions = regions;\n sendRegions(regions);\n }\n }, config.debounceMs);\n}\n\n/**\n * Start observing DOM changes\n */\nfunction startObserving(): void {\n if (!config.observeChanges) return;\n\n // MutationObserver for DOM changes\n observer = new MutationObserver((mutations) => {\n // Check if any mutation affects interactive elements\n let needsUpdate = false;\n\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check added/removed nodes\n for (const node of mutation.addedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n for (const node of mutation.removedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n } else if (mutation.type === 'attributes') {\n if (mutation.attributeName === config.attribute) {\n needsUpdate = true;\n }\n }\n\n if (needsUpdate) break;\n }\n\n if (needsUpdate) {\n scheduleUpdate();\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [config.attribute],\n });\n\n // ResizeObserver for element size changes\n if (config.observeResize) {\n resizeObserver = new ResizeObserver(() => {\n scheduleUpdate();\n });\n\n // Observe all interactive elements\n document.querySelectorAll(`[${config.attribute}]`).forEach((element) => {\n resizeObserver?.observe(element);\n });\n }\n\n // Window resize and scroll events\n if (config.observeResize) {\n window.addEventListener('resize', scheduleUpdate, { passive: true });\n }\n if (config.observeScroll) {\n window.addEventListener('scroll', scheduleUpdate, { passive: true });\n }\n}\n\n/**\n * Stop observing DOM changes\n */\nfunction stopObserving(): void {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n\n window.removeEventListener('resize', scheduleUpdate);\n window.removeEventListener('scroll', scheduleUpdate);\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n}\n\n/**\n * Interactive regions API\n */\nexport const interactive = {\n /**\n * Manually trigger a region update\n */\n update(): void {\n scheduleUpdate();\n },\n\n /**\n * Force immediate update (bypasses debounce)\n */\n forceUpdate(): void {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n const regions = collectRegions();\n lastRegions = regions;\n sendRegions(regions);\n },\n\n /**\n * Get current interactive regions\n */\n getRegions(): InteractiveRegion[] {\n return collectRegions();\n },\n\n /**\n * Enable or disable tracking\n */\n setEnabled(value: boolean): void {\n enabled = value;\n if (enabled) {\n startObserving();\n scheduleUpdate();\n } else {\n stopObserving();\n // Clear regions when disabled\n lastRegions = [];\n sendRegions([]);\n }\n },\n\n /**\n * Check if tracking is enabled\n */\n isEnabled(): boolean {\n return enabled;\n },\n\n /**\n * Update configuration\n */\n configure(newConfig: Partial<InteractiveConfig>): void {\n const wasObserving = observer !== null;\n\n if (wasObserving) {\n stopObserving();\n }\n\n config = { ...config, ...newConfig };\n\n if (wasObserving && enabled) {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Get current configuration\n */\n getConfig(): InteractiveConfig {\n return { ...config };\n },\n\n /**\n * Initialize the plugin (called automatically)\n */\n init(): void {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n startObserving();\n scheduleUpdate();\n });\n } else {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Cleanup the plugin\n */\n destroy(): void {\n stopObserving();\n lastRegions = [];\n },\n};\n\n// Auto-initialize when loaded\ninitPlugin('interactive', interactive);\n\n// Start observing when DOM is ready\nif (typeof document !== 'undefined') {\n interactive.init();\n}\n\nexport default interactive;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/events.ts","../src/core/bridge.ts","../src/inject/plugins/utils.ts","../src/inject/plugins/interactive.ts"],"names":["config","observer"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AuroraView SDK Event System\n *\n * Provides a type-safe event emitter with proper unsubscribe support.\n */\n\nimport type { EventHandler, Unsubscribe } from './types';\n\n/**\n * Event emitter with unsubscribe support\n */\nexport class EventEmitter {\n private handlers = new Map<string, Set<EventHandler>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n const handlers = this.handlers.get(event)!;\n handlers.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.handlers.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event once\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n const wrapper: EventHandler<T> = (data) => {\n unsubscribe();\n handler(data);\n };\n const unsubscribe = this.on(event, wrapper);\n return unsubscribe;\n }\n\n /**\n * Emit an event to all handlers\n * @param event - Event name\n * @param data - Event data\n */\n emit<T = unknown>(event: string, data: T): void {\n const handlers = this.handlers.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (e) {\n console.error(`[AuroraView] Error in event handler for \"${event}\":`, e);\n }\n });\n }\n\n /**\n * Remove event handler(s)\n * @param event - Event name\n * @param handler - Optional specific handler to remove\n */\n off(event: string, handler?: EventHandler): void {\n if (handler) {\n this.handlers.get(event)?.delete(handler);\n } else {\n this.handlers.delete(event);\n }\n }\n\n /**\n * Check if event has handlers\n * @param event - Event name\n */\n hasHandlers(event: string): boolean {\n const handlers = this.handlers.get(event);\n return handlers !== undefined && handlers.size > 0;\n }\n\n /**\n * Get handler count for an event\n * @param event - Event name\n */\n handlerCount(event: string): number {\n return this.handlers.get(event)?.size ?? 0;\n }\n\n /**\n * Remove all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/** Singleton event emitter instance */\nlet globalEmitter: EventEmitter | null = null;\n\n/**\n * Get the global event emitter instance\n */\nexport function getGlobalEmitter(): EventEmitter {\n if (!globalEmitter) {\n globalEmitter = new EventEmitter();\n }\n return globalEmitter;\n}\n","/**\n * AuroraView SDK Bridge Client\n *\n * Provides a type-safe wrapper around the native bridge API.\n */\n\nimport { EventEmitter, getGlobalEmitter } from './events';\nimport type {\n EventHandler,\n Unsubscribe,\n AuroraViewBridge,\n AuroraViewConfig,\n FileSystemAPI,\n\n DialogAPI,\n ClipboardAPI,\n ShellAPI,\n AuroraViewState,\n} from './types';\n\n/**\n * AuroraView client interface\n */\nexport interface AuroraViewClient {\n /** Call a Python method (RPC-style) */\n call<T = unknown>(method: string, params?: unknown): Promise<T>;\n\n /** Invoke a plugin command */\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T>;\n\n /** Send an event to Python (fire-and-forget) */\n emit(event: string, data?: unknown): void;\n\n /** Subscribe to an event from Python */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Subscribe to an event once */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Unsubscribe from an event */\n off(event: string, handler?: EventHandler): void;\n\n /** Check if bridge is ready */\n isReady(): boolean;\n\n /** Wait for bridge to be ready */\n whenReady(): Promise<AuroraViewClient>;\n\n /** Configure timeouts and health strategy */\n setConfig(config: AuroraViewConfig): void;\n\n\n /** Get the raw bridge object */\n getRawBridge(): AuroraViewBridge | undefined;\n\n /** File system API */\n readonly fs: FileSystemAPI | undefined;\n\n /** Dialog API */\n readonly dialog: DialogAPI | undefined;\n\n /** Clipboard API */\n readonly clipboard: ClipboardAPI | undefined;\n\n /** Shell API */\n readonly shell: ShellAPI | undefined;\n\n /** Shared state */\n readonly state: AuroraViewState | undefined;\n}\n\n/**\n * Internal client implementation\n */\nclass AuroraViewClientImpl implements AuroraViewClient {\n private events: EventEmitter;\n private interceptInstalled = false;\n\n constructor() {\n this.events = getGlobalEmitter();\n this.installTriggerIntercept();\n }\n\n /**\n * Install intercept on window.auroraview.trigger to forward events\n */\n private installTriggerIntercept(): void {\n if (typeof window === 'undefined') return;\n\n const self = this;\n\n const install = () => {\n const bridge = window.auroraview;\n if (!bridge) return;\n\n // Check if we've already wrapped this trigger function\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((bridge.trigger as any)?._sdkWrapped) {\n return;\n }\n\n const originalTrigger = bridge.trigger;\n const wrappedTrigger = function(event: string, detail?: unknown) {\n // Call original trigger first\n originalTrigger?.call(bridge, event, detail);\n // Forward to our event system\n self.events.emit(event, detail);\n };\n // Mark as wrapped to prevent double-wrapping\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (wrappedTrigger as any)._sdkWrapped = true;\n bridge.trigger = wrappedTrigger;\n\n self.interceptInstalled = true;\n };\n\n // Install immediately if bridge available\n if (window.auroraview) {\n install();\n }\n\n // Also listen for auroraviewready event to handle late initialization\n window.addEventListener('auroraviewready', () => {\n install();\n });\n\n // Fallback: check periodically in case the event was missed\n if (!this.interceptInstalled) {\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n install();\n if (self.interceptInstalled) {\n clearInterval(checkInterval);\n }\n }\n }, 50);\n\n // Stop checking after 10 seconds\n setTimeout(() => clearInterval(checkInterval), 10000);\n }\n }\n\n call<T = unknown>(method: string, params?: unknown): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.call<T>(method, params);\n }\n\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.invoke<T>(cmd, args);\n }\n\n emit(event: string, data?: unknown): void {\n const bridge = window.auroraview;\n if (bridge) {\n bridge.send_event(event, data);\n }\n }\n\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.on(event, handler);\n }\n\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.once(event, handler);\n }\n\n off(event: string, handler?: EventHandler): void {\n this.events.off(event, handler);\n }\n\n isReady(): boolean {\n return window.auroraview?._ready === true;\n }\n\n whenReady(): Promise<AuroraViewClient> {\n return new Promise((resolve) => {\n if (this.isReady()) {\n resolve(this);\n } else if (window.auroraview) {\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n } else {\n // Wait for bridge to appear\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n }\n }, 10);\n\n // Timeout after 30 seconds\n setTimeout(() => {\n clearInterval(checkInterval);\n resolve(this);\n }, 30000);\n }\n });\n }\n\n setConfig(config: AuroraViewConfig): void {\n const bridge = window.auroraview;\n if (bridge?.setConfig) {\n bridge.setConfig(config);\n }\n }\n\n getRawBridge(): AuroraViewBridge | undefined {\n return window.auroraview;\n }\n\n\n get fs(): FileSystemAPI | undefined {\n return window.auroraview?.fs;\n }\n\n get dialog(): DialogAPI | undefined {\n return window.auroraview?.dialog;\n }\n\n get clipboard(): ClipboardAPI | undefined {\n return window.auroraview?.clipboard;\n }\n\n get shell(): ShellAPI | undefined {\n return window.auroraview?.shell;\n }\n\n get state(): AuroraViewState | undefined {\n return window.auroraview?.state;\n }\n}\n\n/** Singleton client instance */\nlet clientInstance: AuroraViewClient | null = null;\n\n/**\n * Create or get the AuroraView client instance\n */\nexport function createAuroraView(): AuroraViewClient {\n if (!clientInstance) {\n clientInstance = new AuroraViewClientImpl();\n }\n return clientInstance;\n}\n\n/**\n * Get the AuroraView client instance (alias for createAuroraView)\n */\nexport function getAuroraView(): AuroraViewClient {\n return createAuroraView();\n}\n\n/**\n * Reset the singleton instance (for testing only)\n * @internal\n */\nexport function _resetClientInstance(): void {\n clientInstance = null;\n}\n","/**\n * Plugin utilities shared across all plugins\n */\n\n/**\n * Invoke a plugin command\n */\nexport async function invokePlugin<T = unknown>(\n plugin: string,\n command: string,\n args?: Record<string, unknown>\n): Promise<T> {\n if (!window.auroraview || !window.auroraview.invoke) {\n throw new Error('AuroraView bridge not available');\n }\n\n const result = await window.auroraview.invoke<T & { success?: boolean; error?: string; code?: string }>(\n `plugin:${plugin}|${command}`,\n args || {}\n );\n\n if (result && result.success === false) {\n const error = new Error(result.error || 'Unknown error') as Error & { code?: string };\n error.code = result.code || 'UNKNOWN';\n throw error;\n }\n\n return result;\n}\n\n/**\n * Attach a plugin to the auroraview object\n */\nexport function attachPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n (window.auroraview as unknown as Record<string, unknown>)[name] = api;\n console.log(`[AuroraView] ${name.charAt(0).toUpperCase() + name.slice(1)} plugin initialized`);\n }\n}\n\n/**\n * Wait for auroraview to be available and attach plugin\n */\nexport function initPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n attachPlugin(name, api);\n } else {\n const observer = setInterval(function () {\n if (window.auroraview) {\n clearInterval(observer);\n attachPlugin(name, api);\n }\n }, 10);\n\n // Stop trying after 5 seconds\n setTimeout(function () {\n clearInterval(observer);\n }, 5000);\n }\n}\n","/**\n * Interactive regions plugin for click-through windows\n *\n * This plugin monitors DOM elements with the `data-interactive` attribute\n * and reports their positions to the native layer for click-through support.\n *\n * @example\n * ```html\n * <!-- Mark an element as interactive -->\n * <button data-interactive>Click Me</button>\n *\n * <!-- The plugin will automatically track this element's position -->\n * ```\n *\n * @example\n * ```typescript\n * import { interactive } from 'auroraview-sdk';\n *\n * // Manually trigger a region update\n * interactive.update();\n *\n * // Get current regions\n * const regions = interactive.getRegions();\n *\n * // Enable/disable tracking\n * interactive.setEnabled(false);\n * ```\n */\n\nimport { invokePlugin, initPlugin } from './utils';\n\n/**\n * Interactive region data\n */\nexport interface InteractiveRegion {\n /** X coordinate (left edge) in pixels */\n x: number;\n /** Y coordinate (top edge) in pixels */\n y: number;\n /** Width in pixels */\n width: number;\n /** Height in pixels */\n height: number;\n /** Element ID (if available) */\n id?: string;\n}\n\n/**\n * Configuration for the interactive plugin\n */\nexport interface InteractiveConfig {\n /** Attribute name to look for (default: 'data-interactive') */\n attribute: string;\n /** Debounce delay in milliseconds (default: 100) */\n debounceMs: number;\n /** Whether to observe DOM changes (default: true) */\n observeChanges: boolean;\n /** Whether to observe resize events (default: true) */\n observeResize: boolean;\n /** Whether to observe scroll events (default: true) */\n observeScroll: boolean;\n}\n\nconst DEFAULT_CONFIG: InteractiveConfig = {\n attribute: 'data-interactive',\n debounceMs: 100,\n observeChanges: true,\n observeResize: true,\n observeScroll: true,\n};\n\nlet config: InteractiveConfig = { ...DEFAULT_CONFIG };\nlet enabled = true;\nlet observer: MutationObserver | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastRegions: InteractiveRegion[] = [];\n\n/**\n * Collect all interactive regions from the DOM\n */\nfunction collectRegions(): InteractiveRegion[] {\n const elements = document.querySelectorAll(`[${config.attribute}]`);\n const regions: InteractiveRegion[] = [];\n\n elements.forEach((element) => {\n const rect = element.getBoundingClientRect();\n\n // Skip invisible elements\n if (rect.width === 0 || rect.height === 0) {\n return;\n }\n\n // Skip elements outside viewport\n if (\n rect.bottom < 0 ||\n rect.top > window.innerHeight ||\n rect.right < 0 ||\n rect.left > window.innerWidth\n ) {\n return;\n }\n\n regions.push({\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n id: element.id || undefined,\n });\n });\n\n return regions;\n}\n\n/**\n * Check if regions have changed\n */\nfunction regionsChanged(newRegions: InteractiveRegion[]): boolean {\n if (newRegions.length !== lastRegions.length) {\n return true;\n }\n\n for (let i = 0; i < newRegions.length; i++) {\n const a = newRegions[i];\n const b = lastRegions[i];\n if (a.x !== b.x || a.y !== b.y || a.width !== b.width || a.height !== b.height) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Send regions to native layer\n */\nasync function sendRegions(regions: InteractiveRegion[]): Promise<void> {\n try {\n await invokePlugin('window', 'update_interactive_regions', { regions });\n console.debug('[AuroraView] Updated interactive regions:', regions.length);\n } catch (error) {\n console.error('[AuroraView] Failed to update interactive regions:', error);\n }\n}\n\n/**\n * Update interactive regions (debounced)\n */\nfunction scheduleUpdate(): void {\n if (!enabled) return;\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(() => {\n const regions = collectRegions();\n if (regionsChanged(regions)) {\n lastRegions = regions;\n sendRegions(regions);\n }\n }, config.debounceMs);\n}\n\n/**\n * Start observing DOM changes\n */\nfunction startObserving(): void {\n if (!config.observeChanges) return;\n\n // MutationObserver for DOM changes\n observer = new MutationObserver((mutations) => {\n // Check if any mutation affects interactive elements\n let needsUpdate = false;\n\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check added/removed nodes\n for (const node of mutation.addedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n for (const node of mutation.removedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n } else if (mutation.type === 'attributes') {\n if (mutation.attributeName === config.attribute) {\n needsUpdate = true;\n }\n }\n\n if (needsUpdate) break;\n }\n\n if (needsUpdate) {\n scheduleUpdate();\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [config.attribute],\n });\n\n // ResizeObserver for element size changes\n if (config.observeResize) {\n resizeObserver = new ResizeObserver(() => {\n scheduleUpdate();\n });\n\n // Observe all interactive elements\n document.querySelectorAll(`[${config.attribute}]`).forEach((element) => {\n resizeObserver?.observe(element);\n });\n }\n\n // Window resize and scroll events\n if (config.observeResize) {\n window.addEventListener('resize', scheduleUpdate, { passive: true });\n }\n if (config.observeScroll) {\n window.addEventListener('scroll', scheduleUpdate, { passive: true });\n }\n}\n\n/**\n * Stop observing DOM changes\n */\nfunction stopObserving(): void {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n\n window.removeEventListener('resize', scheduleUpdate);\n window.removeEventListener('scroll', scheduleUpdate);\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n}\n\n/**\n * Interactive regions API\n */\nexport const interactive = {\n /**\n * Manually trigger a region update\n */\n update(): void {\n scheduleUpdate();\n },\n\n /**\n * Force immediate update (bypasses debounce)\n */\n forceUpdate(): void {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n const regions = collectRegions();\n lastRegions = regions;\n sendRegions(regions);\n },\n\n /**\n * Get current interactive regions\n */\n getRegions(): InteractiveRegion[] {\n return collectRegions();\n },\n\n /**\n * Enable or disable tracking\n */\n setEnabled(value: boolean): void {\n enabled = value;\n if (enabled) {\n startObserving();\n scheduleUpdate();\n } else {\n stopObserving();\n // Clear regions when disabled\n lastRegions = [];\n sendRegions([]);\n }\n },\n\n /**\n * Check if tracking is enabled\n */\n isEnabled(): boolean {\n return enabled;\n },\n\n /**\n * Update configuration\n */\n configure(newConfig: Partial<InteractiveConfig>): void {\n const wasObserving = observer !== null;\n\n if (wasObserving) {\n stopObserving();\n }\n\n config = { ...config, ...newConfig };\n\n if (wasObserving && enabled) {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Get current configuration\n */\n getConfig(): InteractiveConfig {\n return { ...config };\n },\n\n /**\n * Initialize the plugin (called automatically)\n */\n init(): void {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n startObserving();\n scheduleUpdate();\n });\n } else {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Cleanup the plugin\n */\n destroy(): void {\n stopObserving();\n lastRegions = [];\n },\n};\n\n// Auto-initialize when loaded\ninitPlugin('interactive', interactive);\n\n// Start observing when DOM is ready\nif (typeof document !== 'undefined') {\n interactive.init();\n}\n\nexport default interactive;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EventHandler, U as Unsubscribe } from './bridge
|
|
2
|
-
export { s as AuroraViewBridge, A as AuroraViewClient, t as AuroraViewState, e as CallErrorInfo, C as CallMessage, d as CallResult, w as ClipboardAPI, l as ConfirmResult, v as DialogAPI, D as DirEntry, a as EventMessage, m as ExecuteOptions, n as ExecuteResult, f as FileFilter, F as FileStat, u as FileSystemAPI, I as IPCMessage, b as InvokeMessage, M as MessageOptions, k as MessageResult, O as OpenFileOptions, h as OpenFileResult, i as OpenFilesResult, P as PluginResult, q as ProcessExit, p as ProcessOutput, j as SaveFileOptions, x as ShellAPI, o as SpawnResult, S as StateChangeHandler, r as WindowEventData, W as WindowEventType, c as createAuroraView, g as getAuroraView } from './bridge
|
|
1
|
+
import { E as EventHandler, U as Unsubscribe } from './bridge--3Gt_WQR.cjs';
|
|
2
|
+
export { s as AuroraViewBridge, A as AuroraViewClient, t as AuroraViewState, e as CallErrorInfo, C as CallMessage, d as CallResult, w as ClipboardAPI, l as ConfirmResult, v as DialogAPI, D as DirEntry, a as EventMessage, m as ExecuteOptions, n as ExecuteResult, f as FileFilter, F as FileStat, u as FileSystemAPI, I as IPCMessage, b as InvokeMessage, M as MessageOptions, k as MessageResult, O as OpenFileOptions, h as OpenFileResult, i as OpenFilesResult, P as PluginResult, q as ProcessExit, p as ProcessOutput, j as SaveFileOptions, x as ShellAPI, o as SpawnResult, S as StateChangeHandler, r as WindowEventData, W as WindowEventType, c as createAuroraView, g as getAuroraView } from './bridge--3Gt_WQR.cjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* AuroraView SDK Event System
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EventHandler, U as Unsubscribe } from './bridge
|
|
2
|
-
export { s as AuroraViewBridge, A as AuroraViewClient, t as AuroraViewState, e as CallErrorInfo, C as CallMessage, d as CallResult, w as ClipboardAPI, l as ConfirmResult, v as DialogAPI, D as DirEntry, a as EventMessage, m as ExecuteOptions, n as ExecuteResult, f as FileFilter, F as FileStat, u as FileSystemAPI, I as IPCMessage, b as InvokeMessage, M as MessageOptions, k as MessageResult, O as OpenFileOptions, h as OpenFileResult, i as OpenFilesResult, P as PluginResult, q as ProcessExit, p as ProcessOutput, j as SaveFileOptions, x as ShellAPI, o as SpawnResult, S as StateChangeHandler, r as WindowEventData, W as WindowEventType, c as createAuroraView, g as getAuroraView } from './bridge
|
|
1
|
+
import { E as EventHandler, U as Unsubscribe } from './bridge--3Gt_WQR.js';
|
|
2
|
+
export { s as AuroraViewBridge, A as AuroraViewClient, t as AuroraViewState, e as CallErrorInfo, C as CallMessage, d as CallResult, w as ClipboardAPI, l as ConfirmResult, v as DialogAPI, D as DirEntry, a as EventMessage, m as ExecuteOptions, n as ExecuteResult, f as FileFilter, F as FileStat, u as FileSystemAPI, I as IPCMessage, b as InvokeMessage, M as MessageOptions, k as MessageResult, O as OpenFileOptions, h as OpenFileResult, i as OpenFilesResult, P as PluginResult, q as ProcessExit, p as ProcessOutput, j as SaveFileOptions, x as ShellAPI, o as SpawnResult, S as StateChangeHandler, r as WindowEventData, W as WindowEventType, c as createAuroraView, g as getAuroraView } from './bridge--3Gt_WQR.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* AuroraView SDK Event System
|
package/dist/index.js
CHANGED
|
@@ -105,27 +105,38 @@ var AuroraViewClientImpl = class {
|
|
|
105
105
|
* Install intercept on window.auroraview.trigger to forward events
|
|
106
106
|
*/
|
|
107
107
|
installTriggerIntercept() {
|
|
108
|
-
if (this.interceptInstalled) return;
|
|
109
108
|
if (typeof window === "undefined") return;
|
|
109
|
+
const self = this;
|
|
110
110
|
const install = () => {
|
|
111
111
|
const bridge = window.auroraview;
|
|
112
112
|
if (!bridge) return;
|
|
113
|
+
if (bridge.trigger?._sdkWrapped) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
113
116
|
const originalTrigger = bridge.trigger;
|
|
114
|
-
|
|
117
|
+
const wrappedTrigger = function(event, detail) {
|
|
115
118
|
originalTrigger?.call(bridge, event, detail);
|
|
116
|
-
|
|
119
|
+
self.events.emit(event, detail);
|
|
117
120
|
};
|
|
118
|
-
|
|
121
|
+
wrappedTrigger._sdkWrapped = true;
|
|
122
|
+
bridge.trigger = wrappedTrigger;
|
|
123
|
+
self.interceptInstalled = true;
|
|
119
124
|
};
|
|
120
125
|
if (window.auroraview) {
|
|
121
126
|
install();
|
|
122
|
-
}
|
|
127
|
+
}
|
|
128
|
+
window.addEventListener("auroraviewready", () => {
|
|
129
|
+
install();
|
|
130
|
+
});
|
|
131
|
+
if (!this.interceptInstalled) {
|
|
123
132
|
const checkInterval = setInterval(() => {
|
|
124
133
|
if (window.auroraview) {
|
|
125
|
-
clearInterval(checkInterval);
|
|
126
134
|
install();
|
|
135
|
+
if (self.interceptInstalled) {
|
|
136
|
+
clearInterval(checkInterval);
|
|
137
|
+
}
|
|
127
138
|
}
|
|
128
|
-
},
|
|
139
|
+
}, 50);
|
|
129
140
|
setTimeout(() => clearInterval(checkInterval), 1e4);
|
|
130
141
|
}
|
|
131
142
|
}
|
|
@@ -187,6 +198,12 @@ var AuroraViewClientImpl = class {
|
|
|
187
198
|
}
|
|
188
199
|
});
|
|
189
200
|
}
|
|
201
|
+
setConfig(config2) {
|
|
202
|
+
const bridge = window.auroraview;
|
|
203
|
+
if (bridge?.setConfig) {
|
|
204
|
+
bridge.setConfig(config2);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
190
207
|
getRawBridge() {
|
|
191
208
|
return window.auroraview;
|
|
192
209
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/events.ts","../src/core/bridge.ts","../src/inject/plugins/utils.ts","../src/inject/plugins/interactive.ts"],"names":["observer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * AuroraView SDK Event System\n *\n * Provides a type-safe event emitter with proper unsubscribe support.\n */\n\nimport type { EventHandler, Unsubscribe } from './types';\n\n/**\n * Event emitter with unsubscribe support\n */\nexport class EventEmitter {\n private handlers = new Map<string, Set<EventHandler>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n const handlers = this.handlers.get(event)!;\n handlers.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.handlers.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event once\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n const wrapper: EventHandler<T> = (data) => {\n unsubscribe();\n handler(data);\n };\n const unsubscribe = this.on(event, wrapper);\n return unsubscribe;\n }\n\n /**\n * Emit an event to all handlers\n * @param event - Event name\n * @param data - Event data\n */\n emit<T = unknown>(event: string, data: T): void {\n const handlers = this.handlers.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (e) {\n console.error(`[AuroraView] Error in event handler for \"${event}\":`, e);\n }\n });\n }\n\n /**\n * Remove event handler(s)\n * @param event - Event name\n * @param handler - Optional specific handler to remove\n */\n off(event: string, handler?: EventHandler): void {\n if (handler) {\n this.handlers.get(event)?.delete(handler);\n } else {\n this.handlers.delete(event);\n }\n }\n\n /**\n * Check if event has handlers\n * @param event - Event name\n */\n hasHandlers(event: string): boolean {\n const handlers = this.handlers.get(event);\n return handlers !== undefined && handlers.size > 0;\n }\n\n /**\n * Get handler count for an event\n * @param event - Event name\n */\n handlerCount(event: string): number {\n return this.handlers.get(event)?.size ?? 0;\n }\n\n /**\n * Remove all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/** Singleton event emitter instance */\nlet globalEmitter: EventEmitter | null = null;\n\n/**\n * Get the global event emitter instance\n */\nexport function getGlobalEmitter(): EventEmitter {\n if (!globalEmitter) {\n globalEmitter = new EventEmitter();\n }\n return globalEmitter;\n}\n","/**\n * AuroraView SDK Bridge Client\n *\n * Provides a type-safe wrapper around the native bridge API.\n */\n\nimport { EventEmitter, getGlobalEmitter } from './events';\nimport type {\n EventHandler,\n Unsubscribe,\n AuroraViewBridge,\n FileSystemAPI,\n DialogAPI,\n ClipboardAPI,\n ShellAPI,\n AuroraViewState,\n} from './types';\n\n/**\n * AuroraView client interface\n */\nexport interface AuroraViewClient {\n /** Call a Python method (RPC-style) */\n call<T = unknown>(method: string, params?: unknown): Promise<T>;\n\n /** Invoke a plugin command */\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T>;\n\n /** Send an event to Python (fire-and-forget) */\n emit(event: string, data?: unknown): void;\n\n /** Subscribe to an event from Python */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Subscribe to an event once */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Unsubscribe from an event */\n off(event: string, handler?: EventHandler): void;\n\n /** Check if bridge is ready */\n isReady(): boolean;\n\n /** Wait for bridge to be ready */\n whenReady(): Promise<AuroraViewClient>;\n\n /** Get the raw bridge object */\n getRawBridge(): AuroraViewBridge | undefined;\n\n /** File system API */\n readonly fs: FileSystemAPI | undefined;\n\n /** Dialog API */\n readonly dialog: DialogAPI | undefined;\n\n /** Clipboard API */\n readonly clipboard: ClipboardAPI | undefined;\n\n /** Shell API */\n readonly shell: ShellAPI | undefined;\n\n /** Shared state */\n readonly state: AuroraViewState | undefined;\n}\n\n/**\n * Internal client implementation\n */\nclass AuroraViewClientImpl implements AuroraViewClient {\n private events: EventEmitter;\n private interceptInstalled = false;\n\n constructor() {\n this.events = getGlobalEmitter();\n this.installTriggerIntercept();\n }\n\n /**\n * Install intercept on window.auroraview.trigger to forward events\n */\n private installTriggerIntercept(): void {\n if (this.interceptInstalled) return;\n if (typeof window === 'undefined') return;\n\n const install = () => {\n const bridge = window.auroraview;\n if (!bridge) return;\n\n const originalTrigger = bridge.trigger;\n bridge.trigger = (event: string, detail?: unknown) => {\n // Call original trigger first\n originalTrigger?.call(bridge, event, detail);\n // Forward to our event system\n this.events.emit(event, detail);\n };\n\n this.interceptInstalled = true;\n };\n\n // Try to install immediately\n if (window.auroraview) {\n install();\n } else {\n // Wait for bridge to be available\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n install();\n }\n }, 10);\n\n // Stop checking after 10 seconds\n setTimeout(() => clearInterval(checkInterval), 10000);\n }\n }\n\n call<T = unknown>(method: string, params?: unknown): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.call<T>(method, params);\n }\n\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.invoke<T>(cmd, args);\n }\n\n emit(event: string, data?: unknown): void {\n const bridge = window.auroraview;\n if (bridge) {\n bridge.send_event(event, data);\n }\n }\n\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.on(event, handler);\n }\n\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.once(event, handler);\n }\n\n off(event: string, handler?: EventHandler): void {\n this.events.off(event, handler);\n }\n\n isReady(): boolean {\n return window.auroraview?._ready === true;\n }\n\n whenReady(): Promise<AuroraViewClient> {\n return new Promise((resolve) => {\n if (this.isReady()) {\n resolve(this);\n } else if (window.auroraview) {\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n } else {\n // Wait for bridge to appear\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n }\n }, 10);\n\n // Timeout after 30 seconds\n setTimeout(() => {\n clearInterval(checkInterval);\n resolve(this);\n }, 30000);\n }\n });\n }\n\n getRawBridge(): AuroraViewBridge | undefined {\n return window.auroraview;\n }\n\n get fs(): FileSystemAPI | undefined {\n return window.auroraview?.fs;\n }\n\n get dialog(): DialogAPI | undefined {\n return window.auroraview?.dialog;\n }\n\n get clipboard(): ClipboardAPI | undefined {\n return window.auroraview?.clipboard;\n }\n\n get shell(): ShellAPI | undefined {\n return window.auroraview?.shell;\n }\n\n get state(): AuroraViewState | undefined {\n return window.auroraview?.state;\n }\n}\n\n/** Singleton client instance */\nlet clientInstance: AuroraViewClient | null = null;\n\n/**\n * Create or get the AuroraView client instance\n */\nexport function createAuroraView(): AuroraViewClient {\n if (!clientInstance) {\n clientInstance = new AuroraViewClientImpl();\n }\n return clientInstance;\n}\n\n/**\n * Get the AuroraView client instance (alias for createAuroraView)\n */\nexport function getAuroraView(): AuroraViewClient {\n return createAuroraView();\n}\n","/**\n * Plugin utilities shared across all plugins\n */\n\n/**\n * Invoke a plugin command\n */\nexport async function invokePlugin<T = unknown>(\n plugin: string,\n command: string,\n args?: Record<string, unknown>\n): Promise<T> {\n if (!window.auroraview || !window.auroraview.invoke) {\n throw new Error('AuroraView bridge not available');\n }\n\n const result = await window.auroraview.invoke<T & { success?: boolean; error?: string; code?: string }>(\n `plugin:${plugin}|${command}`,\n args || {}\n );\n\n if (result && result.success === false) {\n const error = new Error(result.error || 'Unknown error') as Error & { code?: string };\n error.code = result.code || 'UNKNOWN';\n throw error;\n }\n\n return result;\n}\n\n/**\n * Attach a plugin to the auroraview object\n */\nexport function attachPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n (window.auroraview as unknown as Record<string, unknown>)[name] = api;\n console.log(`[AuroraView] ${name.charAt(0).toUpperCase() + name.slice(1)} plugin initialized`);\n }\n}\n\n/**\n * Wait for auroraview to be available and attach plugin\n */\nexport function initPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n attachPlugin(name, api);\n } else {\n const observer = setInterval(function () {\n if (window.auroraview) {\n clearInterval(observer);\n attachPlugin(name, api);\n }\n }, 10);\n\n // Stop trying after 5 seconds\n setTimeout(function () {\n clearInterval(observer);\n }, 5000);\n }\n}\n","/**\n * Interactive regions plugin for click-through windows\n *\n * This plugin monitors DOM elements with the `data-interactive` attribute\n * and reports their positions to the native layer for click-through support.\n *\n * @example\n * ```html\n * <!-- Mark an element as interactive -->\n * <button data-interactive>Click Me</button>\n *\n * <!-- The plugin will automatically track this element's position -->\n * ```\n *\n * @example\n * ```typescript\n * import { interactive } from 'auroraview-sdk';\n *\n * // Manually trigger a region update\n * interactive.update();\n *\n * // Get current regions\n * const regions = interactive.getRegions();\n *\n * // Enable/disable tracking\n * interactive.setEnabled(false);\n * ```\n */\n\nimport { invokePlugin, initPlugin } from './utils';\n\n/**\n * Interactive region data\n */\nexport interface InteractiveRegion {\n /** X coordinate (left edge) in pixels */\n x: number;\n /** Y coordinate (top edge) in pixels */\n y: number;\n /** Width in pixels */\n width: number;\n /** Height in pixels */\n height: number;\n /** Element ID (if available) */\n id?: string;\n}\n\n/**\n * Configuration for the interactive plugin\n */\nexport interface InteractiveConfig {\n /** Attribute name to look for (default: 'data-interactive') */\n attribute: string;\n /** Debounce delay in milliseconds (default: 100) */\n debounceMs: number;\n /** Whether to observe DOM changes (default: true) */\n observeChanges: boolean;\n /** Whether to observe resize events (default: true) */\n observeResize: boolean;\n /** Whether to observe scroll events (default: true) */\n observeScroll: boolean;\n}\n\nconst DEFAULT_CONFIG: InteractiveConfig = {\n attribute: 'data-interactive',\n debounceMs: 100,\n observeChanges: true,\n observeResize: true,\n observeScroll: true,\n};\n\nlet config: InteractiveConfig = { ...DEFAULT_CONFIG };\nlet enabled = true;\nlet observer: MutationObserver | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastRegions: InteractiveRegion[] = [];\n\n/**\n * Collect all interactive regions from the DOM\n */\nfunction collectRegions(): InteractiveRegion[] {\n const elements = document.querySelectorAll(`[${config.attribute}]`);\n const regions: InteractiveRegion[] = [];\n\n elements.forEach((element) => {\n const rect = element.getBoundingClientRect();\n\n // Skip invisible elements\n if (rect.width === 0 || rect.height === 0) {\n return;\n }\n\n // Skip elements outside viewport\n if (\n rect.bottom < 0 ||\n rect.top > window.innerHeight ||\n rect.right < 0 ||\n rect.left > window.innerWidth\n ) {\n return;\n }\n\n regions.push({\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n id: element.id || undefined,\n });\n });\n\n return regions;\n}\n\n/**\n * Check if regions have changed\n */\nfunction regionsChanged(newRegions: InteractiveRegion[]): boolean {\n if (newRegions.length !== lastRegions.length) {\n return true;\n }\n\n for (let i = 0; i < newRegions.length; i++) {\n const a = newRegions[i];\n const b = lastRegions[i];\n if (a.x !== b.x || a.y !== b.y || a.width !== b.width || a.height !== b.height) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Send regions to native layer\n */\nasync function sendRegions(regions: InteractiveRegion[]): Promise<void> {\n try {\n await invokePlugin('window', 'update_interactive_regions', { regions });\n console.debug('[AuroraView] Updated interactive regions:', regions.length);\n } catch (error) {\n console.error('[AuroraView] Failed to update interactive regions:', error);\n }\n}\n\n/**\n * Update interactive regions (debounced)\n */\nfunction scheduleUpdate(): void {\n if (!enabled) return;\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(() => {\n const regions = collectRegions();\n if (regionsChanged(regions)) {\n lastRegions = regions;\n sendRegions(regions);\n }\n }, config.debounceMs);\n}\n\n/**\n * Start observing DOM changes\n */\nfunction startObserving(): void {\n if (!config.observeChanges) return;\n\n // MutationObserver for DOM changes\n observer = new MutationObserver((mutations) => {\n // Check if any mutation affects interactive elements\n let needsUpdate = false;\n\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check added/removed nodes\n for (const node of mutation.addedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n for (const node of mutation.removedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n } else if (mutation.type === 'attributes') {\n if (mutation.attributeName === config.attribute) {\n needsUpdate = true;\n }\n }\n\n if (needsUpdate) break;\n }\n\n if (needsUpdate) {\n scheduleUpdate();\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [config.attribute],\n });\n\n // ResizeObserver for element size changes\n if (config.observeResize) {\n resizeObserver = new ResizeObserver(() => {\n scheduleUpdate();\n });\n\n // Observe all interactive elements\n document.querySelectorAll(`[${config.attribute}]`).forEach((element) => {\n resizeObserver?.observe(element);\n });\n }\n\n // Window resize and scroll events\n if (config.observeResize) {\n window.addEventListener('resize', scheduleUpdate, { passive: true });\n }\n if (config.observeScroll) {\n window.addEventListener('scroll', scheduleUpdate, { passive: true });\n }\n}\n\n/**\n * Stop observing DOM changes\n */\nfunction stopObserving(): void {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n\n window.removeEventListener('resize', scheduleUpdate);\n window.removeEventListener('scroll', scheduleUpdate);\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n}\n\n/**\n * Interactive regions API\n */\nexport const interactive = {\n /**\n * Manually trigger a region update\n */\n update(): void {\n scheduleUpdate();\n },\n\n /**\n * Force immediate update (bypasses debounce)\n */\n forceUpdate(): void {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n const regions = collectRegions();\n lastRegions = regions;\n sendRegions(regions);\n },\n\n /**\n * Get current interactive regions\n */\n getRegions(): InteractiveRegion[] {\n return collectRegions();\n },\n\n /**\n * Enable or disable tracking\n */\n setEnabled(value: boolean): void {\n enabled = value;\n if (enabled) {\n startObserving();\n scheduleUpdate();\n } else {\n stopObserving();\n // Clear regions when disabled\n lastRegions = [];\n sendRegions([]);\n }\n },\n\n /**\n * Check if tracking is enabled\n */\n isEnabled(): boolean {\n return enabled;\n },\n\n /**\n * Update configuration\n */\n configure(newConfig: Partial<InteractiveConfig>): void {\n const wasObserving = observer !== null;\n\n if (wasObserving) {\n stopObserving();\n }\n\n config = { ...config, ...newConfig };\n\n if (wasObserving && enabled) {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Get current configuration\n */\n getConfig(): InteractiveConfig {\n return { ...config };\n },\n\n /**\n * Initialize the plugin (called automatically)\n */\n init(): void {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n startObserving();\n scheduleUpdate();\n });\n } else {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Cleanup the plugin\n */\n destroy(): void {\n stopObserving();\n lastRegions = [];\n },\n};\n\n// Auto-initialize when loaded\ninitPlugin('interactive', interactive);\n\n// Start observing when DOM is ready\nif (typeof document !== 'undefined') {\n interactive.init();\n}\n\nexport default interactive;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/events.ts","../src/core/bridge.ts","../src/inject/plugins/utils.ts","../src/inject/plugins/interactive.ts"],"names":["config","observer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * AuroraView SDK Event System\n *\n * Provides a type-safe event emitter with proper unsubscribe support.\n */\n\nimport type { EventHandler, Unsubscribe } from './types';\n\n/**\n * Event emitter with unsubscribe support\n */\nexport class EventEmitter {\n private handlers = new Map<string, Set<EventHandler>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n const handlers = this.handlers.get(event)!;\n handlers.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.handlers.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event once\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n const wrapper: EventHandler<T> = (data) => {\n unsubscribe();\n handler(data);\n };\n const unsubscribe = this.on(event, wrapper);\n return unsubscribe;\n }\n\n /**\n * Emit an event to all handlers\n * @param event - Event name\n * @param data - Event data\n */\n emit<T = unknown>(event: string, data: T): void {\n const handlers = this.handlers.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (e) {\n console.error(`[AuroraView] Error in event handler for \"${event}\":`, e);\n }\n });\n }\n\n /**\n * Remove event handler(s)\n * @param event - Event name\n * @param handler - Optional specific handler to remove\n */\n off(event: string, handler?: EventHandler): void {\n if (handler) {\n this.handlers.get(event)?.delete(handler);\n } else {\n this.handlers.delete(event);\n }\n }\n\n /**\n * Check if event has handlers\n * @param event - Event name\n */\n hasHandlers(event: string): boolean {\n const handlers = this.handlers.get(event);\n return handlers !== undefined && handlers.size > 0;\n }\n\n /**\n * Get handler count for an event\n * @param event - Event name\n */\n handlerCount(event: string): number {\n return this.handlers.get(event)?.size ?? 0;\n }\n\n /**\n * Remove all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/** Singleton event emitter instance */\nlet globalEmitter: EventEmitter | null = null;\n\n/**\n * Get the global event emitter instance\n */\nexport function getGlobalEmitter(): EventEmitter {\n if (!globalEmitter) {\n globalEmitter = new EventEmitter();\n }\n return globalEmitter;\n}\n","/**\n * AuroraView SDK Bridge Client\n *\n * Provides a type-safe wrapper around the native bridge API.\n */\n\nimport { EventEmitter, getGlobalEmitter } from './events';\nimport type {\n EventHandler,\n Unsubscribe,\n AuroraViewBridge,\n AuroraViewConfig,\n FileSystemAPI,\n\n DialogAPI,\n ClipboardAPI,\n ShellAPI,\n AuroraViewState,\n} from './types';\n\n/**\n * AuroraView client interface\n */\nexport interface AuroraViewClient {\n /** Call a Python method (RPC-style) */\n call<T = unknown>(method: string, params?: unknown): Promise<T>;\n\n /** Invoke a plugin command */\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T>;\n\n /** Send an event to Python (fire-and-forget) */\n emit(event: string, data?: unknown): void;\n\n /** Subscribe to an event from Python */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Subscribe to an event once */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Unsubscribe from an event */\n off(event: string, handler?: EventHandler): void;\n\n /** Check if bridge is ready */\n isReady(): boolean;\n\n /** Wait for bridge to be ready */\n whenReady(): Promise<AuroraViewClient>;\n\n /** Configure timeouts and health strategy */\n setConfig(config: AuroraViewConfig): void;\n\n\n /** Get the raw bridge object */\n getRawBridge(): AuroraViewBridge | undefined;\n\n /** File system API */\n readonly fs: FileSystemAPI | undefined;\n\n /** Dialog API */\n readonly dialog: DialogAPI | undefined;\n\n /** Clipboard API */\n readonly clipboard: ClipboardAPI | undefined;\n\n /** Shell API */\n readonly shell: ShellAPI | undefined;\n\n /** Shared state */\n readonly state: AuroraViewState | undefined;\n}\n\n/**\n * Internal client implementation\n */\nclass AuroraViewClientImpl implements AuroraViewClient {\n private events: EventEmitter;\n private interceptInstalled = false;\n\n constructor() {\n this.events = getGlobalEmitter();\n this.installTriggerIntercept();\n }\n\n /**\n * Install intercept on window.auroraview.trigger to forward events\n */\n private installTriggerIntercept(): void {\n if (typeof window === 'undefined') return;\n\n const self = this;\n\n const install = () => {\n const bridge = window.auroraview;\n if (!bridge) return;\n\n // Check if we've already wrapped this trigger function\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((bridge.trigger as any)?._sdkWrapped) {\n return;\n }\n\n const originalTrigger = bridge.trigger;\n const wrappedTrigger = function(event: string, detail?: unknown) {\n // Call original trigger first\n originalTrigger?.call(bridge, event, detail);\n // Forward to our event system\n self.events.emit(event, detail);\n };\n // Mark as wrapped to prevent double-wrapping\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (wrappedTrigger as any)._sdkWrapped = true;\n bridge.trigger = wrappedTrigger;\n\n self.interceptInstalled = true;\n };\n\n // Install immediately if bridge available\n if (window.auroraview) {\n install();\n }\n\n // Also listen for auroraviewready event to handle late initialization\n window.addEventListener('auroraviewready', () => {\n install();\n });\n\n // Fallback: check periodically in case the event was missed\n if (!this.interceptInstalled) {\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n install();\n if (self.interceptInstalled) {\n clearInterval(checkInterval);\n }\n }\n }, 50);\n\n // Stop checking after 10 seconds\n setTimeout(() => clearInterval(checkInterval), 10000);\n }\n }\n\n call<T = unknown>(method: string, params?: unknown): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.call<T>(method, params);\n }\n\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.invoke<T>(cmd, args);\n }\n\n emit(event: string, data?: unknown): void {\n const bridge = window.auroraview;\n if (bridge) {\n bridge.send_event(event, data);\n }\n }\n\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.on(event, handler);\n }\n\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.once(event, handler);\n }\n\n off(event: string, handler?: EventHandler): void {\n this.events.off(event, handler);\n }\n\n isReady(): boolean {\n return window.auroraview?._ready === true;\n }\n\n whenReady(): Promise<AuroraViewClient> {\n return new Promise((resolve) => {\n if (this.isReady()) {\n resolve(this);\n } else if (window.auroraview) {\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n } else {\n // Wait for bridge to appear\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n }\n }, 10);\n\n // Timeout after 30 seconds\n setTimeout(() => {\n clearInterval(checkInterval);\n resolve(this);\n }, 30000);\n }\n });\n }\n\n setConfig(config: AuroraViewConfig): void {\n const bridge = window.auroraview;\n if (bridge?.setConfig) {\n bridge.setConfig(config);\n }\n }\n\n getRawBridge(): AuroraViewBridge | undefined {\n return window.auroraview;\n }\n\n\n get fs(): FileSystemAPI | undefined {\n return window.auroraview?.fs;\n }\n\n get dialog(): DialogAPI | undefined {\n return window.auroraview?.dialog;\n }\n\n get clipboard(): ClipboardAPI | undefined {\n return window.auroraview?.clipboard;\n }\n\n get shell(): ShellAPI | undefined {\n return window.auroraview?.shell;\n }\n\n get state(): AuroraViewState | undefined {\n return window.auroraview?.state;\n }\n}\n\n/** Singleton client instance */\nlet clientInstance: AuroraViewClient | null = null;\n\n/**\n * Create or get the AuroraView client instance\n */\nexport function createAuroraView(): AuroraViewClient {\n if (!clientInstance) {\n clientInstance = new AuroraViewClientImpl();\n }\n return clientInstance;\n}\n\n/**\n * Get the AuroraView client instance (alias for createAuroraView)\n */\nexport function getAuroraView(): AuroraViewClient {\n return createAuroraView();\n}\n\n/**\n * Reset the singleton instance (for testing only)\n * @internal\n */\nexport function _resetClientInstance(): void {\n clientInstance = null;\n}\n","/**\n * Plugin utilities shared across all plugins\n */\n\n/**\n * Invoke a plugin command\n */\nexport async function invokePlugin<T = unknown>(\n plugin: string,\n command: string,\n args?: Record<string, unknown>\n): Promise<T> {\n if (!window.auroraview || !window.auroraview.invoke) {\n throw new Error('AuroraView bridge not available');\n }\n\n const result = await window.auroraview.invoke<T & { success?: boolean; error?: string; code?: string }>(\n `plugin:${plugin}|${command}`,\n args || {}\n );\n\n if (result && result.success === false) {\n const error = new Error(result.error || 'Unknown error') as Error & { code?: string };\n error.code = result.code || 'UNKNOWN';\n throw error;\n }\n\n return result;\n}\n\n/**\n * Attach a plugin to the auroraview object\n */\nexport function attachPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n (window.auroraview as unknown as Record<string, unknown>)[name] = api;\n console.log(`[AuroraView] ${name.charAt(0).toUpperCase() + name.slice(1)} plugin initialized`);\n }\n}\n\n/**\n * Wait for auroraview to be available and attach plugin\n */\nexport function initPlugin(name: string, api: Record<string, unknown>): void {\n if (window.auroraview) {\n attachPlugin(name, api);\n } else {\n const observer = setInterval(function () {\n if (window.auroraview) {\n clearInterval(observer);\n attachPlugin(name, api);\n }\n }, 10);\n\n // Stop trying after 5 seconds\n setTimeout(function () {\n clearInterval(observer);\n }, 5000);\n }\n}\n","/**\n * Interactive regions plugin for click-through windows\n *\n * This plugin monitors DOM elements with the `data-interactive` attribute\n * and reports their positions to the native layer for click-through support.\n *\n * @example\n * ```html\n * <!-- Mark an element as interactive -->\n * <button data-interactive>Click Me</button>\n *\n * <!-- The plugin will automatically track this element's position -->\n * ```\n *\n * @example\n * ```typescript\n * import { interactive } from 'auroraview-sdk';\n *\n * // Manually trigger a region update\n * interactive.update();\n *\n * // Get current regions\n * const regions = interactive.getRegions();\n *\n * // Enable/disable tracking\n * interactive.setEnabled(false);\n * ```\n */\n\nimport { invokePlugin, initPlugin } from './utils';\n\n/**\n * Interactive region data\n */\nexport interface InteractiveRegion {\n /** X coordinate (left edge) in pixels */\n x: number;\n /** Y coordinate (top edge) in pixels */\n y: number;\n /** Width in pixels */\n width: number;\n /** Height in pixels */\n height: number;\n /** Element ID (if available) */\n id?: string;\n}\n\n/**\n * Configuration for the interactive plugin\n */\nexport interface InteractiveConfig {\n /** Attribute name to look for (default: 'data-interactive') */\n attribute: string;\n /** Debounce delay in milliseconds (default: 100) */\n debounceMs: number;\n /** Whether to observe DOM changes (default: true) */\n observeChanges: boolean;\n /** Whether to observe resize events (default: true) */\n observeResize: boolean;\n /** Whether to observe scroll events (default: true) */\n observeScroll: boolean;\n}\n\nconst DEFAULT_CONFIG: InteractiveConfig = {\n attribute: 'data-interactive',\n debounceMs: 100,\n observeChanges: true,\n observeResize: true,\n observeScroll: true,\n};\n\nlet config: InteractiveConfig = { ...DEFAULT_CONFIG };\nlet enabled = true;\nlet observer: MutationObserver | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\nlet lastRegions: InteractiveRegion[] = [];\n\n/**\n * Collect all interactive regions from the DOM\n */\nfunction collectRegions(): InteractiveRegion[] {\n const elements = document.querySelectorAll(`[${config.attribute}]`);\n const regions: InteractiveRegion[] = [];\n\n elements.forEach((element) => {\n const rect = element.getBoundingClientRect();\n\n // Skip invisible elements\n if (rect.width === 0 || rect.height === 0) {\n return;\n }\n\n // Skip elements outside viewport\n if (\n rect.bottom < 0 ||\n rect.top > window.innerHeight ||\n rect.right < 0 ||\n rect.left > window.innerWidth\n ) {\n return;\n }\n\n regions.push({\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n id: element.id || undefined,\n });\n });\n\n return regions;\n}\n\n/**\n * Check if regions have changed\n */\nfunction regionsChanged(newRegions: InteractiveRegion[]): boolean {\n if (newRegions.length !== lastRegions.length) {\n return true;\n }\n\n for (let i = 0; i < newRegions.length; i++) {\n const a = newRegions[i];\n const b = lastRegions[i];\n if (a.x !== b.x || a.y !== b.y || a.width !== b.width || a.height !== b.height) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Send regions to native layer\n */\nasync function sendRegions(regions: InteractiveRegion[]): Promise<void> {\n try {\n await invokePlugin('window', 'update_interactive_regions', { regions });\n console.debug('[AuroraView] Updated interactive regions:', regions.length);\n } catch (error) {\n console.error('[AuroraView] Failed to update interactive regions:', error);\n }\n}\n\n/**\n * Update interactive regions (debounced)\n */\nfunction scheduleUpdate(): void {\n if (!enabled) return;\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(() => {\n const regions = collectRegions();\n if (regionsChanged(regions)) {\n lastRegions = regions;\n sendRegions(regions);\n }\n }, config.debounceMs);\n}\n\n/**\n * Start observing DOM changes\n */\nfunction startObserving(): void {\n if (!config.observeChanges) return;\n\n // MutationObserver for DOM changes\n observer = new MutationObserver((mutations) => {\n // Check if any mutation affects interactive elements\n let needsUpdate = false;\n\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check added/removed nodes\n for (const node of mutation.addedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n for (const node of mutation.removedNodes) {\n if (node instanceof Element && node.hasAttribute(config.attribute)) {\n needsUpdate = true;\n break;\n }\n }\n } else if (mutation.type === 'attributes') {\n if (mutation.attributeName === config.attribute) {\n needsUpdate = true;\n }\n }\n\n if (needsUpdate) break;\n }\n\n if (needsUpdate) {\n scheduleUpdate();\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [config.attribute],\n });\n\n // ResizeObserver for element size changes\n if (config.observeResize) {\n resizeObserver = new ResizeObserver(() => {\n scheduleUpdate();\n });\n\n // Observe all interactive elements\n document.querySelectorAll(`[${config.attribute}]`).forEach((element) => {\n resizeObserver?.observe(element);\n });\n }\n\n // Window resize and scroll events\n if (config.observeResize) {\n window.addEventListener('resize', scheduleUpdate, { passive: true });\n }\n if (config.observeScroll) {\n window.addEventListener('scroll', scheduleUpdate, { passive: true });\n }\n}\n\n/**\n * Stop observing DOM changes\n */\nfunction stopObserving(): void {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n\n window.removeEventListener('resize', scheduleUpdate);\n window.removeEventListener('scroll', scheduleUpdate);\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n}\n\n/**\n * Interactive regions API\n */\nexport const interactive = {\n /**\n * Manually trigger a region update\n */\n update(): void {\n scheduleUpdate();\n },\n\n /**\n * Force immediate update (bypasses debounce)\n */\n forceUpdate(): void {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n const regions = collectRegions();\n lastRegions = regions;\n sendRegions(regions);\n },\n\n /**\n * Get current interactive regions\n */\n getRegions(): InteractiveRegion[] {\n return collectRegions();\n },\n\n /**\n * Enable or disable tracking\n */\n setEnabled(value: boolean): void {\n enabled = value;\n if (enabled) {\n startObserving();\n scheduleUpdate();\n } else {\n stopObserving();\n // Clear regions when disabled\n lastRegions = [];\n sendRegions([]);\n }\n },\n\n /**\n * Check if tracking is enabled\n */\n isEnabled(): boolean {\n return enabled;\n },\n\n /**\n * Update configuration\n */\n configure(newConfig: Partial<InteractiveConfig>): void {\n const wasObserving = observer !== null;\n\n if (wasObserving) {\n stopObserving();\n }\n\n config = { ...config, ...newConfig };\n\n if (wasObserving && enabled) {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Get current configuration\n */\n getConfig(): InteractiveConfig {\n return { ...config };\n },\n\n /**\n * Initialize the plugin (called automatically)\n */\n init(): void {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n startObserving();\n scheduleUpdate();\n });\n } else {\n startObserving();\n scheduleUpdate();\n }\n },\n\n /**\n * Cleanup the plugin\n */\n destroy(): void {\n stopObserving();\n lastRegions = [];\n },\n};\n\n// Auto-initialize when loaded\ninitPlugin('interactive', interactive);\n\n// Start observing when DOM is ready\nif (typeof document !== 'undefined') {\n interactive.init();\n}\n\nexport default interactive;\n"]}
|
package/dist/react.cjs
CHANGED
|
@@ -111,27 +111,38 @@ var AuroraViewClientImpl = class {
|
|
|
111
111
|
* Install intercept on window.auroraview.trigger to forward events
|
|
112
112
|
*/
|
|
113
113
|
installTriggerIntercept() {
|
|
114
|
-
if (this.interceptInstalled) return;
|
|
115
114
|
if (typeof window === "undefined") return;
|
|
115
|
+
const self = this;
|
|
116
116
|
const install = () => {
|
|
117
117
|
const bridge = window.auroraview;
|
|
118
118
|
if (!bridge) return;
|
|
119
|
+
if (bridge.trigger?._sdkWrapped) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
119
122
|
const originalTrigger = bridge.trigger;
|
|
120
|
-
|
|
123
|
+
const wrappedTrigger = function(event, detail) {
|
|
121
124
|
originalTrigger?.call(bridge, event, detail);
|
|
122
|
-
|
|
125
|
+
self.events.emit(event, detail);
|
|
123
126
|
};
|
|
124
|
-
|
|
127
|
+
wrappedTrigger._sdkWrapped = true;
|
|
128
|
+
bridge.trigger = wrappedTrigger;
|
|
129
|
+
self.interceptInstalled = true;
|
|
125
130
|
};
|
|
126
131
|
if (window.auroraview) {
|
|
127
132
|
install();
|
|
128
|
-
}
|
|
133
|
+
}
|
|
134
|
+
window.addEventListener("auroraviewready", () => {
|
|
135
|
+
install();
|
|
136
|
+
});
|
|
137
|
+
if (!this.interceptInstalled) {
|
|
129
138
|
const checkInterval = setInterval(() => {
|
|
130
139
|
if (window.auroraview) {
|
|
131
|
-
clearInterval(checkInterval);
|
|
132
140
|
install();
|
|
141
|
+
if (self.interceptInstalled) {
|
|
142
|
+
clearInterval(checkInterval);
|
|
143
|
+
}
|
|
133
144
|
}
|
|
134
|
-
},
|
|
145
|
+
}, 50);
|
|
135
146
|
setTimeout(() => clearInterval(checkInterval), 1e4);
|
|
136
147
|
}
|
|
137
148
|
}
|
|
@@ -193,6 +204,12 @@ var AuroraViewClientImpl = class {
|
|
|
193
204
|
}
|
|
194
205
|
});
|
|
195
206
|
}
|
|
207
|
+
setConfig(config) {
|
|
208
|
+
const bridge = window.auroraview;
|
|
209
|
+
if (bridge?.setConfig) {
|
|
210
|
+
bridge.setConfig(config);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
196
213
|
getRawBridge() {
|
|
197
214
|
return window.auroraview;
|
|
198
215
|
}
|