@auroraview/sdk 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,227 @@
1
+ 'use strict';
2
+
3
+ // src/core/events.ts
4
+ var EventEmitter = class {
5
+ constructor() {
6
+ this.handlers = /* @__PURE__ */ new Map();
7
+ }
8
+ /**
9
+ * Subscribe to an event
10
+ * @param event - Event name
11
+ * @param handler - Event handler function
12
+ * @returns Unsubscribe function
13
+ */
14
+ on(event, handler) {
15
+ if (!this.handlers.has(event)) {
16
+ this.handlers.set(event, /* @__PURE__ */ new Set());
17
+ }
18
+ const handlers = this.handlers.get(event);
19
+ handlers.add(handler);
20
+ return () => {
21
+ handlers.delete(handler);
22
+ if (handlers.size === 0) {
23
+ this.handlers.delete(event);
24
+ }
25
+ };
26
+ }
27
+ /**
28
+ * Subscribe to an event once
29
+ * @param event - Event name
30
+ * @param handler - Event handler function
31
+ * @returns Unsubscribe function
32
+ */
33
+ once(event, handler) {
34
+ const wrapper = (data) => {
35
+ unsubscribe();
36
+ handler(data);
37
+ };
38
+ const unsubscribe = this.on(event, wrapper);
39
+ return unsubscribe;
40
+ }
41
+ /**
42
+ * Emit an event to all handlers
43
+ * @param event - Event name
44
+ * @param data - Event data
45
+ */
46
+ emit(event, data) {
47
+ const handlers = this.handlers.get(event);
48
+ if (!handlers) return;
49
+ handlers.forEach((handler) => {
50
+ try {
51
+ handler(data);
52
+ } catch (e) {
53
+ console.error(`[AuroraView] Error in event handler for "${event}":`, e);
54
+ }
55
+ });
56
+ }
57
+ /**
58
+ * Remove event handler(s)
59
+ * @param event - Event name
60
+ * @param handler - Optional specific handler to remove
61
+ */
62
+ off(event, handler) {
63
+ if (handler) {
64
+ this.handlers.get(event)?.delete(handler);
65
+ } else {
66
+ this.handlers.delete(event);
67
+ }
68
+ }
69
+ /**
70
+ * Check if event has handlers
71
+ * @param event - Event name
72
+ */
73
+ hasHandlers(event) {
74
+ const handlers = this.handlers.get(event);
75
+ return handlers !== void 0 && handlers.size > 0;
76
+ }
77
+ /**
78
+ * Get handler count for an event
79
+ * @param event - Event name
80
+ */
81
+ handlerCount(event) {
82
+ return this.handlers.get(event)?.size ?? 0;
83
+ }
84
+ /**
85
+ * Remove all handlers
86
+ */
87
+ clear() {
88
+ this.handlers.clear();
89
+ }
90
+ };
91
+ var globalEmitter = null;
92
+ function getGlobalEmitter() {
93
+ if (!globalEmitter) {
94
+ globalEmitter = new EventEmitter();
95
+ }
96
+ return globalEmitter;
97
+ }
98
+
99
+ // src/core/bridge.ts
100
+ var AuroraViewClientImpl = class {
101
+ constructor() {
102
+ this.interceptInstalled = false;
103
+ this.events = getGlobalEmitter();
104
+ this.installTriggerIntercept();
105
+ }
106
+ /**
107
+ * Install intercept on window.auroraview.trigger to forward events
108
+ */
109
+ installTriggerIntercept() {
110
+ if (this.interceptInstalled) return;
111
+ if (typeof window === "undefined") return;
112
+ const install = () => {
113
+ const bridge = window.auroraview;
114
+ if (!bridge) return;
115
+ const originalTrigger = bridge.trigger;
116
+ bridge.trigger = (event, detail) => {
117
+ originalTrigger?.call(bridge, event, detail);
118
+ this.events.emit(event, detail);
119
+ };
120
+ this.interceptInstalled = true;
121
+ };
122
+ if (window.auroraview) {
123
+ install();
124
+ } else {
125
+ const checkInterval = setInterval(() => {
126
+ if (window.auroraview) {
127
+ clearInterval(checkInterval);
128
+ install();
129
+ }
130
+ }, 10);
131
+ setTimeout(() => clearInterval(checkInterval), 1e4);
132
+ }
133
+ }
134
+ call(method, params) {
135
+ const bridge = window.auroraview;
136
+ if (!bridge) {
137
+ return Promise.reject(new Error("AuroraView bridge not available"));
138
+ }
139
+ return bridge.call(method, params);
140
+ }
141
+ invoke(cmd, args) {
142
+ const bridge = window.auroraview;
143
+ if (!bridge) {
144
+ return Promise.reject(new Error("AuroraView bridge not available"));
145
+ }
146
+ return bridge.invoke(cmd, args);
147
+ }
148
+ emit(event, data) {
149
+ const bridge = window.auroraview;
150
+ if (bridge) {
151
+ bridge.send_event(event, data);
152
+ }
153
+ }
154
+ on(event, handler) {
155
+ return this.events.on(event, handler);
156
+ }
157
+ once(event, handler) {
158
+ return this.events.once(event, handler);
159
+ }
160
+ off(event, handler) {
161
+ this.events.off(event, handler);
162
+ }
163
+ isReady() {
164
+ return window.auroraview?._ready === true;
165
+ }
166
+ whenReady() {
167
+ return new Promise((resolve) => {
168
+ if (this.isReady()) {
169
+ resolve(this);
170
+ } else if (window.auroraview) {
171
+ window.auroraview.whenReady().then(() => {
172
+ this.installTriggerIntercept();
173
+ resolve(this);
174
+ });
175
+ } else {
176
+ const checkInterval = setInterval(() => {
177
+ if (window.auroraview) {
178
+ clearInterval(checkInterval);
179
+ window.auroraview.whenReady().then(() => {
180
+ this.installTriggerIntercept();
181
+ resolve(this);
182
+ });
183
+ }
184
+ }, 10);
185
+ setTimeout(() => {
186
+ clearInterval(checkInterval);
187
+ resolve(this);
188
+ }, 3e4);
189
+ }
190
+ });
191
+ }
192
+ getRawBridge() {
193
+ return window.auroraview;
194
+ }
195
+ get fs() {
196
+ return window.auroraview?.fs;
197
+ }
198
+ get dialog() {
199
+ return window.auroraview?.dialog;
200
+ }
201
+ get clipboard() {
202
+ return window.auroraview?.clipboard;
203
+ }
204
+ get shell() {
205
+ return window.auroraview?.shell;
206
+ }
207
+ get state() {
208
+ return window.auroraview?.state;
209
+ }
210
+ };
211
+ var clientInstance = null;
212
+ function createAuroraView() {
213
+ if (!clientInstance) {
214
+ clientInstance = new AuroraViewClientImpl();
215
+ }
216
+ return clientInstance;
217
+ }
218
+ function getAuroraView() {
219
+ return createAuroraView();
220
+ }
221
+
222
+ exports.EventEmitter = EventEmitter;
223
+ exports.createAuroraView = createAuroraView;
224
+ exports.getAuroraView = getAuroraView;
225
+ exports.getGlobalEmitter = getGlobalEmitter;
226
+ //# sourceMappingURL=index.cjs.map
227
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/core/bridge.ts"],"names":[],"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"]}
@@ -0,0 +1,61 @@
1
+ import { E as EventHandler, U as Unsubscribe } from './bridge-CRwRGPq-.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-CRwRGPq-.cjs';
3
+
4
+ /**
5
+ * AuroraView SDK Event System
6
+ *
7
+ * Provides a type-safe event emitter with proper unsubscribe support.
8
+ */
9
+
10
+ /**
11
+ * Event emitter with unsubscribe support
12
+ */
13
+ declare class EventEmitter {
14
+ private handlers;
15
+ /**
16
+ * Subscribe to an event
17
+ * @param event - Event name
18
+ * @param handler - Event handler function
19
+ * @returns Unsubscribe function
20
+ */
21
+ on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;
22
+ /**
23
+ * Subscribe to an event once
24
+ * @param event - Event name
25
+ * @param handler - Event handler function
26
+ * @returns Unsubscribe function
27
+ */
28
+ once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;
29
+ /**
30
+ * Emit an event to all handlers
31
+ * @param event - Event name
32
+ * @param data - Event data
33
+ */
34
+ emit<T = unknown>(event: string, data: T): void;
35
+ /**
36
+ * Remove event handler(s)
37
+ * @param event - Event name
38
+ * @param handler - Optional specific handler to remove
39
+ */
40
+ off(event: string, handler?: EventHandler): void;
41
+ /**
42
+ * Check if event has handlers
43
+ * @param event - Event name
44
+ */
45
+ hasHandlers(event: string): boolean;
46
+ /**
47
+ * Get handler count for an event
48
+ * @param event - Event name
49
+ */
50
+ handlerCount(event: string): number;
51
+ /**
52
+ * Remove all handlers
53
+ */
54
+ clear(): void;
55
+ }
56
+ /**
57
+ * Get the global event emitter instance
58
+ */
59
+ declare function getGlobalEmitter(): EventEmitter;
60
+
61
+ export { EventEmitter, EventHandler, Unsubscribe, getGlobalEmitter };
@@ -0,0 +1,61 @@
1
+ import { E as EventHandler, U as Unsubscribe } from './bridge-CRwRGPq-.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-CRwRGPq-.js';
3
+
4
+ /**
5
+ * AuroraView SDK Event System
6
+ *
7
+ * Provides a type-safe event emitter with proper unsubscribe support.
8
+ */
9
+
10
+ /**
11
+ * Event emitter with unsubscribe support
12
+ */
13
+ declare class EventEmitter {
14
+ private handlers;
15
+ /**
16
+ * Subscribe to an event
17
+ * @param event - Event name
18
+ * @param handler - Event handler function
19
+ * @returns Unsubscribe function
20
+ */
21
+ on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;
22
+ /**
23
+ * Subscribe to an event once
24
+ * @param event - Event name
25
+ * @param handler - Event handler function
26
+ * @returns Unsubscribe function
27
+ */
28
+ once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;
29
+ /**
30
+ * Emit an event to all handlers
31
+ * @param event - Event name
32
+ * @param data - Event data
33
+ */
34
+ emit<T = unknown>(event: string, data: T): void;
35
+ /**
36
+ * Remove event handler(s)
37
+ * @param event - Event name
38
+ * @param handler - Optional specific handler to remove
39
+ */
40
+ off(event: string, handler?: EventHandler): void;
41
+ /**
42
+ * Check if event has handlers
43
+ * @param event - Event name
44
+ */
45
+ hasHandlers(event: string): boolean;
46
+ /**
47
+ * Get handler count for an event
48
+ * @param event - Event name
49
+ */
50
+ handlerCount(event: string): number;
51
+ /**
52
+ * Remove all handlers
53
+ */
54
+ clear(): void;
55
+ }
56
+ /**
57
+ * Get the global event emitter instance
58
+ */
59
+ declare function getGlobalEmitter(): EventEmitter;
60
+
61
+ export { EventEmitter, EventHandler, Unsubscribe, getGlobalEmitter };
package/dist/index.js ADDED
@@ -0,0 +1,222 @@
1
+ // src/core/events.ts
2
+ var EventEmitter = class {
3
+ constructor() {
4
+ this.handlers = /* @__PURE__ */ new Map();
5
+ }
6
+ /**
7
+ * Subscribe to an event
8
+ * @param event - Event name
9
+ * @param handler - Event handler function
10
+ * @returns Unsubscribe function
11
+ */
12
+ on(event, handler) {
13
+ if (!this.handlers.has(event)) {
14
+ this.handlers.set(event, /* @__PURE__ */ new Set());
15
+ }
16
+ const handlers = this.handlers.get(event);
17
+ handlers.add(handler);
18
+ return () => {
19
+ handlers.delete(handler);
20
+ if (handlers.size === 0) {
21
+ this.handlers.delete(event);
22
+ }
23
+ };
24
+ }
25
+ /**
26
+ * Subscribe to an event once
27
+ * @param event - Event name
28
+ * @param handler - Event handler function
29
+ * @returns Unsubscribe function
30
+ */
31
+ once(event, handler) {
32
+ const wrapper = (data) => {
33
+ unsubscribe();
34
+ handler(data);
35
+ };
36
+ const unsubscribe = this.on(event, wrapper);
37
+ return unsubscribe;
38
+ }
39
+ /**
40
+ * Emit an event to all handlers
41
+ * @param event - Event name
42
+ * @param data - Event data
43
+ */
44
+ emit(event, data) {
45
+ const handlers = this.handlers.get(event);
46
+ if (!handlers) return;
47
+ handlers.forEach((handler) => {
48
+ try {
49
+ handler(data);
50
+ } catch (e) {
51
+ console.error(`[AuroraView] Error in event handler for "${event}":`, e);
52
+ }
53
+ });
54
+ }
55
+ /**
56
+ * Remove event handler(s)
57
+ * @param event - Event name
58
+ * @param handler - Optional specific handler to remove
59
+ */
60
+ off(event, handler) {
61
+ if (handler) {
62
+ this.handlers.get(event)?.delete(handler);
63
+ } else {
64
+ this.handlers.delete(event);
65
+ }
66
+ }
67
+ /**
68
+ * Check if event has handlers
69
+ * @param event - Event name
70
+ */
71
+ hasHandlers(event) {
72
+ const handlers = this.handlers.get(event);
73
+ return handlers !== void 0 && handlers.size > 0;
74
+ }
75
+ /**
76
+ * Get handler count for an event
77
+ * @param event - Event name
78
+ */
79
+ handlerCount(event) {
80
+ return this.handlers.get(event)?.size ?? 0;
81
+ }
82
+ /**
83
+ * Remove all handlers
84
+ */
85
+ clear() {
86
+ this.handlers.clear();
87
+ }
88
+ };
89
+ var globalEmitter = null;
90
+ function getGlobalEmitter() {
91
+ if (!globalEmitter) {
92
+ globalEmitter = new EventEmitter();
93
+ }
94
+ return globalEmitter;
95
+ }
96
+
97
+ // src/core/bridge.ts
98
+ var AuroraViewClientImpl = class {
99
+ constructor() {
100
+ this.interceptInstalled = false;
101
+ this.events = getGlobalEmitter();
102
+ this.installTriggerIntercept();
103
+ }
104
+ /**
105
+ * Install intercept on window.auroraview.trigger to forward events
106
+ */
107
+ installTriggerIntercept() {
108
+ if (this.interceptInstalled) return;
109
+ if (typeof window === "undefined") return;
110
+ const install = () => {
111
+ const bridge = window.auroraview;
112
+ if (!bridge) return;
113
+ const originalTrigger = bridge.trigger;
114
+ bridge.trigger = (event, detail) => {
115
+ originalTrigger?.call(bridge, event, detail);
116
+ this.events.emit(event, detail);
117
+ };
118
+ this.interceptInstalled = true;
119
+ };
120
+ if (window.auroraview) {
121
+ install();
122
+ } else {
123
+ const checkInterval = setInterval(() => {
124
+ if (window.auroraview) {
125
+ clearInterval(checkInterval);
126
+ install();
127
+ }
128
+ }, 10);
129
+ setTimeout(() => clearInterval(checkInterval), 1e4);
130
+ }
131
+ }
132
+ call(method, params) {
133
+ const bridge = window.auroraview;
134
+ if (!bridge) {
135
+ return Promise.reject(new Error("AuroraView bridge not available"));
136
+ }
137
+ return bridge.call(method, params);
138
+ }
139
+ invoke(cmd, args) {
140
+ const bridge = window.auroraview;
141
+ if (!bridge) {
142
+ return Promise.reject(new Error("AuroraView bridge not available"));
143
+ }
144
+ return bridge.invoke(cmd, args);
145
+ }
146
+ emit(event, data) {
147
+ const bridge = window.auroraview;
148
+ if (bridge) {
149
+ bridge.send_event(event, data);
150
+ }
151
+ }
152
+ on(event, handler) {
153
+ return this.events.on(event, handler);
154
+ }
155
+ once(event, handler) {
156
+ return this.events.once(event, handler);
157
+ }
158
+ off(event, handler) {
159
+ this.events.off(event, handler);
160
+ }
161
+ isReady() {
162
+ return window.auroraview?._ready === true;
163
+ }
164
+ whenReady() {
165
+ return new Promise((resolve) => {
166
+ if (this.isReady()) {
167
+ resolve(this);
168
+ } else if (window.auroraview) {
169
+ window.auroraview.whenReady().then(() => {
170
+ this.installTriggerIntercept();
171
+ resolve(this);
172
+ });
173
+ } else {
174
+ const checkInterval = setInterval(() => {
175
+ if (window.auroraview) {
176
+ clearInterval(checkInterval);
177
+ window.auroraview.whenReady().then(() => {
178
+ this.installTriggerIntercept();
179
+ resolve(this);
180
+ });
181
+ }
182
+ }, 10);
183
+ setTimeout(() => {
184
+ clearInterval(checkInterval);
185
+ resolve(this);
186
+ }, 3e4);
187
+ }
188
+ });
189
+ }
190
+ getRawBridge() {
191
+ return window.auroraview;
192
+ }
193
+ get fs() {
194
+ return window.auroraview?.fs;
195
+ }
196
+ get dialog() {
197
+ return window.auroraview?.dialog;
198
+ }
199
+ get clipboard() {
200
+ return window.auroraview?.clipboard;
201
+ }
202
+ get shell() {
203
+ return window.auroraview?.shell;
204
+ }
205
+ get state() {
206
+ return window.auroraview?.state;
207
+ }
208
+ };
209
+ var clientInstance = null;
210
+ function createAuroraView() {
211
+ if (!clientInstance) {
212
+ clientInstance = new AuroraViewClientImpl();
213
+ }
214
+ return clientInstance;
215
+ }
216
+ function getAuroraView() {
217
+ return createAuroraView();
218
+ }
219
+
220
+ export { EventEmitter, createAuroraView, getAuroraView, getGlobalEmitter };
221
+ //# sourceMappingURL=index.js.map
222
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/core/bridge.ts"],"names":[],"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"]}