@elizaos/capacitor-desktop 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,231 @@
1
+ import type { PluginListenerHandle } from "@capacitor/core";
2
+ export interface TrayMenuItemBase {
3
+ id: string;
4
+ label?: string;
5
+ type?: "normal" | "separator" | "checkbox" | "radio";
6
+ checked?: boolean;
7
+ enabled?: boolean;
8
+ visible?: boolean;
9
+ icon?: string;
10
+ accelerator?: string;
11
+ }
12
+ export interface TrayMenuItemWithSubmenu extends TrayMenuItemBase {
13
+ submenu?: TrayMenuItem[];
14
+ }
15
+ export type TrayMenuItem = TrayMenuItemWithSubmenu;
16
+ export interface TrayOptions {
17
+ icon: string;
18
+ tooltip?: string;
19
+ title?: string;
20
+ menu?: TrayMenuItem[];
21
+ }
22
+ export interface TrayClickEvent {
23
+ x: number;
24
+ y: number;
25
+ button: "left" | "right" | "middle";
26
+ modifiers: {
27
+ alt: boolean;
28
+ shift: boolean;
29
+ ctrl: boolean;
30
+ meta: boolean;
31
+ };
32
+ }
33
+ export interface TrayMenuClickEvent {
34
+ itemId: string;
35
+ checked?: boolean;
36
+ }
37
+ export interface GlobalShortcut {
38
+ id: string;
39
+ accelerator: string;
40
+ enabled?: boolean;
41
+ }
42
+ export interface GlobalShortcutEvent {
43
+ id: string;
44
+ accelerator: string;
45
+ }
46
+ export interface AutoLaunchOptions {
47
+ enabled: boolean;
48
+ openAsHidden?: boolean;
49
+ path?: string;
50
+ args?: string[];
51
+ }
52
+ export interface WindowOptions {
53
+ width?: number;
54
+ height?: number;
55
+ x?: number;
56
+ y?: number;
57
+ minWidth?: number;
58
+ minHeight?: number;
59
+ maxWidth?: number;
60
+ maxHeight?: number;
61
+ resizable?: boolean;
62
+ movable?: boolean;
63
+ minimizable?: boolean;
64
+ maximizable?: boolean;
65
+ closable?: boolean;
66
+ focusable?: boolean;
67
+ alwaysOnTop?: boolean;
68
+ fullscreen?: boolean;
69
+ fullscreenable?: boolean;
70
+ skipTaskbar?: boolean;
71
+ frame?: boolean;
72
+ transparent?: boolean;
73
+ opacity?: number;
74
+ title?: string;
75
+ vibrancy?: "appearance-based" | "light" | "dark" | "titlebar" | "selection" | "menu" | "popover" | "sidebar" | "header" | "sheet" | "window" | "hud" | "fullscreen-ui" | "tooltip" | "content" | "under-window" | "under-page";
76
+ backgroundColor?: string;
77
+ }
78
+ export interface WindowBounds {
79
+ x: number;
80
+ y: number;
81
+ width: number;
82
+ height: number;
83
+ }
84
+ export interface NotificationOptions {
85
+ title: string;
86
+ body?: string;
87
+ icon?: string;
88
+ silent?: boolean;
89
+ urgency?: "normal" | "critical" | "low";
90
+ timeoutType?: "default" | "never";
91
+ actions?: Array<{
92
+ type: "button";
93
+ text: string;
94
+ }>;
95
+ closeButtonText?: string;
96
+ hasReply?: boolean;
97
+ replyPlaceholder?: string;
98
+ }
99
+ export interface NotificationEvent {
100
+ action?: string;
101
+ reply?: string;
102
+ }
103
+ export interface PowerMonitorState {
104
+ onBattery: boolean;
105
+ batteryLevel?: number;
106
+ isCharging?: boolean;
107
+ idleState: "active" | "idle" | "locked" | "unknown";
108
+ idleTime: number;
109
+ }
110
+ export interface DesktopPlugin {
111
+ createTray(options: TrayOptions): Promise<void>;
112
+ updateTray(options: Partial<TrayOptions>): Promise<void>;
113
+ destroyTray(): Promise<void>;
114
+ setTrayMenu(options: {
115
+ menu: TrayMenuItem[];
116
+ }): Promise<void>;
117
+ registerShortcut(options: GlobalShortcut): Promise<{
118
+ success: boolean;
119
+ }>;
120
+ unregisterShortcut(options: {
121
+ id: string;
122
+ }): Promise<void>;
123
+ unregisterAllShortcuts(): Promise<void>;
124
+ isShortcutRegistered(options: {
125
+ accelerator: string;
126
+ }): Promise<{
127
+ registered: boolean;
128
+ }>;
129
+ setAutoLaunch(options: AutoLaunchOptions): Promise<void>;
130
+ getAutoLaunchStatus(): Promise<{
131
+ enabled: boolean;
132
+ openAsHidden: boolean;
133
+ }>;
134
+ setWindowOptions(options: WindowOptions): Promise<void>;
135
+ getWindowBounds(): Promise<WindowBounds>;
136
+ setWindowBounds(options: WindowBounds): Promise<void>;
137
+ minimizeWindow(): Promise<void>;
138
+ maximizeWindow(): Promise<void>;
139
+ unmaximizeWindow(): Promise<void>;
140
+ closeWindow(): Promise<void>;
141
+ showWindow(): Promise<void>;
142
+ hideWindow(): Promise<void>;
143
+ focusWindow(): Promise<void>;
144
+ isWindowMaximized(): Promise<{
145
+ maximized: boolean;
146
+ }>;
147
+ isWindowMinimized(): Promise<{
148
+ minimized: boolean;
149
+ }>;
150
+ isWindowVisible(): Promise<{
151
+ visible: boolean;
152
+ }>;
153
+ isWindowFocused(): Promise<{
154
+ focused: boolean;
155
+ }>;
156
+ setAlwaysOnTop(options: {
157
+ flag: boolean;
158
+ level?: "normal" | "floating" | "torn-off-menu" | "modal-panel" | "main-menu" | "status" | "pop-up-menu" | "screen-saver";
159
+ }): Promise<void>;
160
+ setFullscreen(options: {
161
+ flag: boolean;
162
+ }): Promise<void>;
163
+ setOpacity(options: {
164
+ opacity: number;
165
+ }): Promise<void>;
166
+ showNotification(options: NotificationOptions): Promise<{
167
+ id: string;
168
+ }>;
169
+ closeNotification(options: {
170
+ id: string;
171
+ }): Promise<void>;
172
+ getPowerState(): Promise<PowerMonitorState>;
173
+ quit(): Promise<void>;
174
+ relaunch(): Promise<void>;
175
+ getVersion(): Promise<{
176
+ version: string;
177
+ name: string;
178
+ runtime: string;
179
+ chrome: string;
180
+ node: string;
181
+ }>;
182
+ isPackaged(): Promise<{
183
+ packaged: boolean;
184
+ }>;
185
+ getPath(options: {
186
+ name: "home" | "appData" | "userData" | "sessionData" | "temp" | "exe" | "module" | "desktop" | "documents" | "downloads" | "music" | "pictures" | "videos" | "recent" | "logs" | "crashDumps";
187
+ }): Promise<{
188
+ path: string;
189
+ }>;
190
+ writeToClipboard(options: {
191
+ text?: string;
192
+ html?: string;
193
+ image?: string;
194
+ rtf?: string;
195
+ }): Promise<void>;
196
+ readFromClipboard(): Promise<{
197
+ text?: string;
198
+ html?: string;
199
+ rtf?: string;
200
+ hasImage: boolean;
201
+ }>;
202
+ clearClipboard(): Promise<void>;
203
+ openExternal(options: {
204
+ url: string;
205
+ }): Promise<void>;
206
+ showItemInFolder(options: {
207
+ path: string;
208
+ }): Promise<void>;
209
+ beep(): Promise<void>;
210
+ addListener(eventName: "trayClick", listenerFunc: (event: TrayClickEvent) => void): Promise<PluginListenerHandle>;
211
+ addListener(eventName: "trayDoubleClick", listenerFunc: (event: TrayClickEvent) => void): Promise<PluginListenerHandle>;
212
+ addListener(eventName: "trayRightClick", listenerFunc: (event: TrayClickEvent) => void): Promise<PluginListenerHandle>;
213
+ addListener(eventName: "trayMenuClick", listenerFunc: (event: TrayMenuClickEvent) => void): Promise<PluginListenerHandle>;
214
+ addListener(eventName: "shortcutPressed", listenerFunc: (event: GlobalShortcutEvent) => void): Promise<PluginListenerHandle>;
215
+ addListener(eventName: "notificationClick", listenerFunc: (event: NotificationEvent) => void): Promise<PluginListenerHandle>;
216
+ addListener(eventName: "notificationAction", listenerFunc: (event: NotificationEvent) => void): Promise<PluginListenerHandle>;
217
+ addListener(eventName: "notificationReply", listenerFunc: (event: NotificationEvent) => void): Promise<PluginListenerHandle>;
218
+ addListener(eventName: "windowFocus", listenerFunc: () => void): Promise<PluginListenerHandle>;
219
+ addListener(eventName: "windowBlur", listenerFunc: () => void): Promise<PluginListenerHandle>;
220
+ addListener(eventName: "windowMaximize", listenerFunc: () => void): Promise<PluginListenerHandle>;
221
+ addListener(eventName: "windowUnmaximize", listenerFunc: () => void): Promise<PluginListenerHandle>;
222
+ addListener(eventName: "windowMinimize", listenerFunc: () => void): Promise<PluginListenerHandle>;
223
+ addListener(eventName: "windowRestore", listenerFunc: () => void): Promise<PluginListenerHandle>;
224
+ addListener(eventName: "windowClose", listenerFunc: () => void): Promise<PluginListenerHandle>;
225
+ addListener(eventName: "powerSuspend", listenerFunc: () => void): Promise<PluginListenerHandle>;
226
+ addListener(eventName: "powerResume", listenerFunc: () => void): Promise<PluginListenerHandle>;
227
+ addListener(eventName: "powerOnAC", listenerFunc: () => void): Promise<PluginListenerHandle>;
228
+ addListener(eventName: "powerOnBattery", listenerFunc: () => void): Promise<PluginListenerHandle>;
229
+ removeAllListeners(): Promise<void>;
230
+ }
231
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { DesktopPlugin } from "./definitions";
2
+ export * from "./definitions";
3
+ export declare const Desktop: DesktopPlugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,eAAe,CAAC;AAI9B,eAAO,MAAM,OAAO,eAElB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { registerPlugin } from "@capacitor/core";
2
+ export * from "./definitions";
3
+ const loadWeb = () => import("./web").then((m) => new m.DesktopWeb());
4
+ export const Desktop = registerPlugin("Desktop", {
5
+ web: loadWeb,
6
+ });
@@ -0,0 +1,111 @@
1
+ import { WebPlugin } from "@capacitor/core";
2
+ import type { AutoLaunchOptions, GlobalShortcut, GlobalShortcutEvent, NotificationEvent, NotificationOptions, PowerMonitorState, TrayClickEvent, TrayMenuClickEvent, TrayMenuItem, TrayOptions, WindowBounds, WindowOptions } from "./definitions";
3
+ type DesktopEventData = TrayClickEvent | TrayMenuClickEvent | GlobalShortcutEvent | NotificationEvent | undefined;
4
+ export declare class DesktopWeb extends WebPlugin {
5
+ private pluginListeners;
6
+ createTray(_options: TrayOptions): Promise<void>;
7
+ updateTray(_options: Partial<TrayOptions>): Promise<void>;
8
+ destroyTray(): Promise<void>;
9
+ setTrayMenu(_options: {
10
+ menu: TrayMenuItem[];
11
+ }): Promise<void>;
12
+ registerShortcut(_options: GlobalShortcut): Promise<{
13
+ success: boolean;
14
+ }>;
15
+ unregisterShortcut(_options: {
16
+ id: string;
17
+ }): Promise<void>;
18
+ unregisterAllShortcuts(): Promise<void>;
19
+ isShortcutRegistered(_options: {
20
+ accelerator: string;
21
+ }): Promise<{
22
+ registered: boolean;
23
+ }>;
24
+ setAutoLaunch(_options: AutoLaunchOptions): Promise<void>;
25
+ getAutoLaunchStatus(): Promise<{
26
+ enabled: boolean;
27
+ openAsHidden: boolean;
28
+ }>;
29
+ setWindowOptions(_options: WindowOptions): Promise<void>;
30
+ getWindowBounds(): Promise<WindowBounds>;
31
+ setWindowBounds(_options: WindowBounds): Promise<void>;
32
+ minimizeWindow(): Promise<void>;
33
+ maximizeWindow(): Promise<void>;
34
+ unmaximizeWindow(): Promise<void>;
35
+ closeWindow(): Promise<void>;
36
+ showWindow(): Promise<void>;
37
+ hideWindow(): Promise<void>;
38
+ focusWindow(): Promise<void>;
39
+ isWindowMaximized(): Promise<{
40
+ maximized: boolean;
41
+ }>;
42
+ isWindowMinimized(): Promise<{
43
+ minimized: boolean;
44
+ }>;
45
+ isWindowVisible(): Promise<{
46
+ visible: boolean;
47
+ }>;
48
+ isWindowFocused(): Promise<{
49
+ focused: boolean;
50
+ }>;
51
+ setAlwaysOnTop(_options: {
52
+ flag: boolean;
53
+ }): Promise<void>;
54
+ setFullscreen(options: {
55
+ flag: boolean;
56
+ }): Promise<void>;
57
+ setOpacity(_options: {
58
+ opacity: number;
59
+ }): Promise<void>;
60
+ showNotification(options: NotificationOptions): Promise<{
61
+ id: string;
62
+ shown: boolean;
63
+ error?: string;
64
+ }>;
65
+ closeNotification(_options: {
66
+ id: string;
67
+ }): Promise<void>;
68
+ getPowerState(): Promise<PowerMonitorState>;
69
+ quit(): Promise<void>;
70
+ relaunch(): Promise<void>;
71
+ getVersion(): Promise<{
72
+ version: string;
73
+ name: string;
74
+ runtime: string;
75
+ chrome: string;
76
+ node: string;
77
+ }>;
78
+ isPackaged(): Promise<{
79
+ packaged: boolean;
80
+ }>;
81
+ getPath(_options: {
82
+ name: string;
83
+ }): Promise<{
84
+ path: string;
85
+ }>;
86
+ writeToClipboard(options: {
87
+ text?: string;
88
+ html?: string;
89
+ }): Promise<void>;
90
+ readFromClipboard(): Promise<{
91
+ text?: string;
92
+ html?: string;
93
+ rtf?: string;
94
+ hasImage: boolean;
95
+ }>;
96
+ clearClipboard(): Promise<void>;
97
+ openExternal(options: {
98
+ url: string;
99
+ }): Promise<void>;
100
+ showItemInFolder(_options: {
101
+ path: string;
102
+ }): Promise<void>;
103
+ beep(): Promise<void>;
104
+ addListener(eventName: string, listenerFunc: (event: DesktopEventData) => void): Promise<{
105
+ remove: () => Promise<void>;
106
+ }>;
107
+ removeAllListeners(): Promise<void>;
108
+ protected notifyListeners(eventName: string, data: DesktopEventData): void;
109
+ }
110
+ export {};
111
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ import { WebPlugin } from "@capacitor/core";
2
+ // No-op for features unavailable on web; callers should check return values.
3
+ const webUnavailable = (_feature) => { };
4
+ export class DesktopWeb extends WebPlugin {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.pluginListeners = [];
8
+ }
9
+ // System Tray - Not available in browser
10
+ async createTray(_options) {
11
+ webUnavailable("System tray");
12
+ }
13
+ async updateTray(_options) {
14
+ webUnavailable("System tray");
15
+ }
16
+ async destroyTray() {
17
+ webUnavailable("System tray");
18
+ }
19
+ async setTrayMenu(_options) {
20
+ webUnavailable("System tray");
21
+ }
22
+ // Global Shortcuts - Not available in browser
23
+ async registerShortcut(_options) {
24
+ webUnavailable("Global shortcuts");
25
+ return { success: false };
26
+ }
27
+ async unregisterShortcut(_options) {
28
+ webUnavailable("Global shortcuts");
29
+ }
30
+ async unregisterAllShortcuts() {
31
+ webUnavailable("Global shortcuts");
32
+ }
33
+ async isShortcutRegistered(_options) {
34
+ return { registered: false };
35
+ }
36
+ // Auto Launch - Not available in browser
37
+ async setAutoLaunch(_options) {
38
+ webUnavailable("Auto launch");
39
+ }
40
+ async getAutoLaunchStatus() {
41
+ return { enabled: false, openAsHidden: false };
42
+ }
43
+ // Window Management - Limited in browser
44
+ async setWindowOptions(_options) {
45
+ webUnavailable("Window options");
46
+ }
47
+ async getWindowBounds() {
48
+ return {
49
+ x: window.screenX,
50
+ y: window.screenY,
51
+ width: window.outerWidth,
52
+ height: window.outerHeight,
53
+ };
54
+ }
55
+ async setWindowBounds(_options) {
56
+ webUnavailable("Setting window bounds");
57
+ }
58
+ async minimizeWindow() {
59
+ webUnavailable("Window minimize");
60
+ }
61
+ async maximizeWindow() {
62
+ webUnavailable("Window maximize");
63
+ }
64
+ async unmaximizeWindow() {
65
+ webUnavailable("Window unmaximize");
66
+ }
67
+ async closeWindow() {
68
+ window.close();
69
+ }
70
+ async showWindow() {
71
+ window.focus();
72
+ }
73
+ async hideWindow() {
74
+ webUnavailable("Window hide");
75
+ }
76
+ async focusWindow() {
77
+ window.focus();
78
+ }
79
+ async isWindowMaximized() {
80
+ return { maximized: false };
81
+ }
82
+ async isWindowMinimized() {
83
+ return { minimized: document.hidden };
84
+ }
85
+ async isWindowVisible() {
86
+ return { visible: !document.hidden };
87
+ }
88
+ async isWindowFocused() {
89
+ return { focused: document.hasFocus() };
90
+ }
91
+ async setAlwaysOnTop(_options) {
92
+ webUnavailable("Always on top");
93
+ }
94
+ async setFullscreen(options) {
95
+ options.flag
96
+ ? document.documentElement.requestFullscreen()
97
+ : document.exitFullscreen();
98
+ }
99
+ async setOpacity(_options) {
100
+ webUnavailable("Window opacity");
101
+ }
102
+ // Notifications - Using Web Notification API
103
+ async showNotification(options) {
104
+ const id = `notification_${Date.now()}`;
105
+ if (!("Notification" in window)) {
106
+ return {
107
+ id,
108
+ shown: false,
109
+ error: "Notification API not available in this browser",
110
+ };
111
+ }
112
+ if (Notification.permission === "denied") {
113
+ return { id, shown: false, error: "Notification permission denied" };
114
+ }
115
+ if (Notification.permission !== "granted") {
116
+ const permission = await Notification.requestPermission();
117
+ if (permission !== "granted") {
118
+ return {
119
+ id,
120
+ shown: false,
121
+ error: "Notification permission not granted",
122
+ };
123
+ }
124
+ }
125
+ const notification = new Notification(options.title, {
126
+ body: options.body,
127
+ icon: options.icon,
128
+ silent: options.silent,
129
+ });
130
+ notification.onclick = () => this.notifyListeners("notificationClick", {});
131
+ return { id, shown: true };
132
+ }
133
+ async closeNotification(_options) {
134
+ // Web Notification API doesn't provide a way to close notifications by ID.
135
+ // Notifications auto-close or the user dismisses them.
136
+ }
137
+ // Power Monitor
138
+ async getPowerState() {
139
+ const getBattery = navigator.getBattery;
140
+ if (getBattery) {
141
+ try {
142
+ const battery = await getBattery.call(navigator);
143
+ return {
144
+ onBattery: !battery.charging,
145
+ batteryLevel: battery.level * 100,
146
+ isCharging: battery.charging,
147
+ idleState: "active", // Idle detection not available on web
148
+ idleTime: 0,
149
+ };
150
+ }
151
+ catch (err) {
152
+ console.debug("[Desktop] Battery API access failed:", err);
153
+ }
154
+ }
155
+ return {
156
+ onBattery: false, // Unknown, defaulting to false
157
+ idleState: "unknown",
158
+ idleTime: 0,
159
+ };
160
+ }
161
+ // App
162
+ async quit() {
163
+ window.close();
164
+ }
165
+ async relaunch() {
166
+ window.location.reload();
167
+ }
168
+ async getVersion() {
169
+ // On web platform, version info is limited. Return actual browser info where available.
170
+ // Note: "version" and "name" would need to come from app config - returning "unknown" to indicate unavailability
171
+ return {
172
+ version: "unknown", // App version not available on web - would need to be injected at build time
173
+ name: "unknown", // App name not available on web - would need to be injected at build time
174
+ runtime: "N/A", // Not running in the desktop runtime
175
+ chrome: navigator.userAgent.match(/Chrome\/([0-9.]+)/)?.[1] ?? "unknown",
176
+ node: "N/A", // Not running in Node
177
+ };
178
+ }
179
+ async isPackaged() {
180
+ return { packaged: false };
181
+ }
182
+ async getPath(_options) {
183
+ throw new Error("File system paths are not available in browser environment");
184
+ }
185
+ // Clipboard
186
+ async writeToClipboard(options) {
187
+ if (options.text) {
188
+ await navigator.clipboard.writeText(options.text);
189
+ return;
190
+ }
191
+ if (options.html) {
192
+ await navigator.clipboard.write([
193
+ new ClipboardItem({
194
+ "text/html": new Blob([options.html], { type: "text/html" }),
195
+ }),
196
+ ]);
197
+ }
198
+ }
199
+ async readFromClipboard() {
200
+ return { text: await navigator.clipboard.readText(), hasImage: false };
201
+ }
202
+ async clearClipboard() {
203
+ await navigator.clipboard.writeText("");
204
+ }
205
+ // Shell
206
+ async openExternal(options) {
207
+ window.open(options.url, "_blank");
208
+ }
209
+ async showItemInFolder(_options) {
210
+ webUnavailable("Show in folder");
211
+ }
212
+ async beep() {
213
+ const ctx = new AudioContext();
214
+ const osc = ctx.createOscillator();
215
+ const gain = ctx.createGain();
216
+ osc.connect(gain).connect(ctx.destination);
217
+ osc.frequency.value = 800;
218
+ osc.type = "sine";
219
+ gain.gain.setValueAtTime(0.3, ctx.currentTime);
220
+ gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.1);
221
+ osc.start(ctx.currentTime);
222
+ osc.stop(ctx.currentTime + 0.1);
223
+ }
224
+ // Events
225
+ async addListener(eventName, listenerFunc) {
226
+ const entry = { eventName, callback: listenerFunc };
227
+ // Create and track window event listeners to avoid memory leaks
228
+ if (eventName === "windowFocus") {
229
+ entry.windowListener = () => listenerFunc(undefined);
230
+ window.addEventListener("focus", entry.windowListener);
231
+ }
232
+ else if (eventName === "windowBlur") {
233
+ entry.windowListener = () => listenerFunc(undefined);
234
+ window.addEventListener("blur", entry.windowListener);
235
+ }
236
+ this.pluginListeners.push(entry);
237
+ return {
238
+ remove: async () => {
239
+ const i = this.pluginListeners.indexOf(entry);
240
+ if (i >= 0) {
241
+ // Remove window event listener if it exists
242
+ if (entry.windowListener) {
243
+ if (entry.eventName === "windowFocus")
244
+ window.removeEventListener("focus", entry.windowListener);
245
+ else if (entry.eventName === "windowBlur")
246
+ window.removeEventListener("blur", entry.windowListener);
247
+ }
248
+ this.pluginListeners.splice(i, 1);
249
+ }
250
+ },
251
+ };
252
+ }
253
+ async removeAllListeners() {
254
+ // Clean up all window event listeners before clearing
255
+ for (const entry of this.pluginListeners) {
256
+ if (entry.windowListener) {
257
+ if (entry.eventName === "windowFocus")
258
+ window.removeEventListener("focus", entry.windowListener);
259
+ else if (entry.eventName === "windowBlur")
260
+ window.removeEventListener("blur", entry.windowListener);
261
+ }
262
+ }
263
+ this.pluginListeners = [];
264
+ }
265
+ notifyListeners(eventName, data) {
266
+ this.pluginListeners
267
+ .filter((l) => l.eventName === eventName)
268
+ .forEach((l) => {
269
+ l.callback(data);
270
+ });
271
+ }
272
+ }