From 0acad9927afb9a86a867b01f381e2119d34f52d7 Mon Sep 17 00:00:00 2001 From: cc <98377878+hicccc77@users.noreply.github.com> Date: Tue, 7 Apr 2026 20:14:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E4=BF=AE=E5=A4=8D=20#654=20?= =?UTF-8?q?=E6=89=80=E6=8F=90=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/linuxNotificationService.ts | 282 ++++++------------ electron/types/dbus.d.ts | 18 -- package-lock.json | 215 +------------ package.json | 1 - 4 files changed, 97 insertions(+), 419 deletions(-) delete mode 100644 electron/types/dbus.d.ts diff --git a/electron/services/linuxNotificationService.ts b/electron/services/linuxNotificationService.ts index 1e4bd22..8ce8238 100644 --- a/electron/services/linuxNotificationService.ts +++ b/electron/services/linuxNotificationService.ts @@ -1,12 +1,8 @@ -import dbus from "dbus-native"; import https from "https"; import http, { IncomingMessage } from "http"; import { promises as fs } from "fs"; import { join } from "path"; -import { app } from "electron"; - -const BUS_NAME = "org.freedesktop.Notifications"; -const OBJECT_PATH = "/org/freedesktop/Notifications"; +import { app, Notification } from "electron"; export interface LinuxNotificationData { sessionId?: string; @@ -18,26 +14,29 @@ export interface LinuxNotificationData { type NotificationCallback = (sessionId: string) => void; -let sessionBus: dbus.DBusConnection | null = null; let notificationCallbacks: NotificationCallback[] = []; -let pendingNotifications: Map = new Map(); +let notificationCounter = 1; +const activeNotifications: Map = new Map(); +const closeTimers: Map = new Map(); // 头像缓存:url->localFilePath const avatarCache: Map = new Map(); // 缓存目录 let avatarCacheDir: string | null = null; -async function getSessionBus(): Promise { - if (!sessionBus) { - sessionBus = dbus.sessionBus(); +function nextNotificationId(): number { + const id = notificationCounter; + notificationCounter += 1; + return id; +} - // 挂载底层socket的error事件,防止掉线即可 - sessionBus.connection.on("error", (err: Error) => { - console.error("[LinuxNotification] D-Bus connection error:", err); - sessionBus = null; // 报错清理死对象 - }); +function clearNotificationState(notificationId: number): void { + activeNotifications.delete(notificationId); + const timer = closeTimers.get(notificationId); + if (timer) { + clearTimeout(timer); + closeTimers.delete(notificationId); } - return sessionBus; } // 确保缓存目录存在 @@ -125,66 +124,76 @@ async function downloadAvatarToLocal(url: string): Promise { } } +function triggerNotificationCallback(sessionId: string): void { + for (const callback of notificationCallbacks) { + try { + callback(sessionId); + } catch (error) { + console.error("[LinuxNotification] Callback error:", error); + } + } +} + export async function showLinuxNotification( data: LinuxNotificationData, ): Promise { + if (process.platform !== "linux") { + return null; + } + + if (!Notification.isSupported()) { + console.warn("[LinuxNotification] Notification API is not supported"); + return null; + } + try { - const bus = await getSessionBus(); - - const appName = "WeFlow"; - const replaceId = 0; - const expireTimeout = data.expireTimeout ?? 5000; - - // 处理头像:下载到本地或使用URL - let appIcon = ""; - let hints: any[] = []; + let iconPath: string | undefined; if (data.avatarUrl) { - // 优先尝试下载到本地 - const localPath = await downloadAvatarToLocal(data.avatarUrl); - if (localPath) { - hints = [["image-path", ["s", localPath]]]; - } + iconPath = (await downloadAvatarToLocal(data.avatarUrl)) || undefined; } - return new Promise((resolve, reject) => { - bus.invoke( - { - destination: BUS_NAME, - path: OBJECT_PATH, - interface: "org.freedesktop.Notifications", - member: "Notify", - signature: "susssasa{sv}i", - body: [ - appName, - replaceId, - appIcon, - data.title, - data.content, - ["default", "打开"], // 提供default action,否则系统不会抛出点击事件 - hints, - // [], // 传空数组以避开a{sv}变体的序列化崩溃,有pendingNotifications映射维护保证不出错 - expireTimeout, - ], - }, - (err: Error | null, result: any) => { - if (err) { - console.error("[LinuxNotification] Notify error:", err); - reject(err); - return; - } - const notificationId = - typeof result === "number" ? result : result[0]; - if (data.sessionId) { - // 依赖Map实现点击追踪,没有使用D-Bus hints - pendingNotifications.set(notificationId, data); - } - console.log( - `[LinuxNotification] Shown notification ${notificationId}: ${data.title}, icon: ${appIcon || "none"}`, - ); - resolve(notificationId); - }, - ); + const notification = new Notification({ + title: data.title, + body: data.content, + icon: iconPath, }); + + const notificationId = nextNotificationId(); + activeNotifications.set(notificationId, notification); + + notification.on("click", () => { + if (data.sessionId) { + triggerNotificationCallback(data.sessionId); + } + }); + + notification.on("close", () => { + clearNotificationState(notificationId); + }); + + notification.on("failed", (_, error) => { + console.error("[LinuxNotification] Notification failed:", error); + clearNotificationState(notificationId); + }); + + const expireTimeout = data.expireTimeout ?? 5000; + if (expireTimeout > 0) { + const timer = setTimeout(() => { + const currentNotification = activeNotifications.get(notificationId); + if (currentNotification) { + currentNotification.close(); + } + }, expireTimeout); + closeTimers.set(notificationId, timer); + } + + notification.show(); + + console.log( + `[LinuxNotification] Shown notification ${notificationId}: ${data.title}`, + ); + + return notificationId; } catch (error) { console.error("[LinuxNotification] Failed to show notification:", error); return null; @@ -194,59 +203,22 @@ export async function showLinuxNotification( export async function closeLinuxNotification( notificationId: number, ): Promise { - try { - const bus = await getSessionBus(); - return new Promise((resolve, reject) => { - bus.invoke( - { - destination: BUS_NAME, - path: OBJECT_PATH, - interface: "org.freedesktop.Notifications", - member: "CloseNotification", - signature: "u", - body: [notificationId], - }, - (err: Error | null) => { - if (err) { - console.error("[LinuxNotification] CloseNotification error:", err); - reject(err); - return; - } - pendingNotifications.delete(notificationId); - resolve(); - }, - ); - }); - } catch (error) { - console.error("[LinuxNotification] Failed to close notification:", error); - } + const notification = activeNotifications.get(notificationId); + if (!notification) return; + notification.close(); + clearNotificationState(notificationId); } export async function getCapabilities(): Promise { - try { - const bus = await getSessionBus(); - return new Promise((resolve, reject) => { - bus.invoke( - { - destination: BUS_NAME, - path: OBJECT_PATH, - interface: "org.freedesktop.Notifications", - member: "GetCapabilities", - }, - (err: Error | null, result: any) => { - if (err) { - console.error("[LinuxNotification] GetCapabilities error:", err); - reject(err); - return; - } - resolve(result as string[]); - }, - ); - }); - } catch (error) { - console.error("[LinuxNotification] Failed to get capabilities:", error); + if (process.platform !== "linux") { return []; } + + if (!Notification.isSupported()) { + return []; + } + + return ["native-notification", "click"]; } export function onNotificationAction(callback: NotificationCallback): void { @@ -262,83 +234,17 @@ export function removeNotificationCallback( } } -function triggerNotificationCallback(sessionId: string): void { - for (const callback of notificationCallbacks) { - try { - callback(sessionId); - } catch (error) { - console.error("[LinuxNotification] Callback error:", error); - } - } -} - export async function initLinuxNotificationService(): Promise { if (process.platform !== "linux") { console.log("[LinuxNotification] Not on Linux, skipping init"); return; } - try { - const bus = await getSessionBus(); - - // 监听底层connection的message事件 - bus.connection.on("message", (msg: any) => { - // type 4表示SIGNAL - if ( - msg.type === 4 && - msg.path === OBJECT_PATH && - msg.interface === "org.freedesktop.Notifications" - ) { - if (msg.member === "ActionInvoked") { - const [notificationId, actionId] = msg.body; - console.log( - `[LinuxNotification] Action invoked: ${notificationId}, ${actionId}`, - ); - - // 如果用户点击了通知本体,actionId会是'default' - if (actionId === "default") { - const data = pendingNotifications.get(notificationId); - if (data?.sessionId) { - triggerNotificationCallback(data.sessionId); - } - } - } - - if (msg.member === "NotificationClosed") { - const [notificationId] = msg.body; - pendingNotifications.delete(notificationId); - } - } - }); - - // AddMatch用来接收信号 - await new Promise((resolve, reject) => { - bus.invoke( - { - destination: "org.freedesktop.DBus", - path: "/org/freedesktop/DBus", - interface: "org.freedesktop.DBus", - member: "AddMatch", - signature: "s", - body: ["type='signal',interface='org.freedesktop.Notifications'"], - }, - (err: Error | null) => { - if (err) { - console.error("[LinuxNotification] AddMatch error:", err); - reject(err); - return; - } - resolve(); - }, - ); - }); - - console.log("[LinuxNotification] Service initialized"); - - // 打印相关日志 - const caps = await getCapabilities(); - console.log("[LinuxNotification] Server capabilities:", caps); - } catch (error) { - console.error("[LinuxNotification] Failed to initialize:", error); + if (!Notification.isSupported()) { + console.warn("[LinuxNotification] Notification API is not supported"); + return; } + + const caps = await getCapabilities(); + console.log("[LinuxNotification] Service initialized with native API:", caps); } diff --git a/electron/types/dbus.d.ts b/electron/types/dbus.d.ts deleted file mode 100644 index 9585a42..0000000 --- a/electron/types/dbus.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -declare module 'dbus-native' { - namespace dbus { - interface DBusConnection { - invoke(options: any, callback: (err: Error | null, result?: any) => void): void; - on(event: string, listener: Function): void; - // 底层connection,用于监听signal - connection: { - on(event: string, listener: Function): void; - }; - } - - // 声明sessionBus方法 - function sessionBus(): DBusConnection; - function systemBus(): DBusConnection; - } - - export = dbus; -} diff --git a/package-lock.json b/package-lock.json index 7f6e644..bdc0bb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "hasInstallScript": true, "dependencies": { "@vscode/sudo-prompt": "^9.3.2", - "dbus-native": "^0.4.0", "echarts": "^6.0.0", "echarts-for-react": "^3.0.2", "electron-store": "^11.0.2", @@ -3084,25 +3083,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/abstract-socket": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/abstract-socket/-/abstract-socket-2.1.1.tgz", - "integrity": "sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "dependencies": { - "bindings": "^1.2.1", - "nan": "^2.12.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -3615,16 +3595,6 @@ "node": "*" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4459,27 +4429,6 @@ "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "license": "MIT" }, - "node_modules/dbus-native": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/dbus-native/-/dbus-native-0.4.0.tgz", - "integrity": "sha512-i3zvY3tdPEOaMgmK4riwupjDYRJ53rcE1Kj8rAgnLOFmBd0DekUih59qv8v+Oyils/U9p+s4sSsaBzHWLztI+Q==", - "license": "MIT", - "dependencies": { - "event-stream": "^4.0.0", - "hexy": "^0.2.10", - "long": "^4.0.0", - "optimist": "^0.6.1", - "put": "0.0.6", - "safe-buffer": "^5.1.1", - "xml2js": "^0.4.17" - }, - "bin": { - "dbus2js": "bin/dbus2js.js" - }, - "optionalDependencies": { - "abstract-socket": "^2.0.0" - } - }, "node_modules/debounce-fn": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz", @@ -4848,12 +4797,6 @@ "node": ">= 0.4" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -5379,21 +5322,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/event-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", - "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, "node_modules/exceljs": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", @@ -5570,13 +5498,6 @@ "node": ">= 6" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT", - "optional": true - }, "node_modules/filelist": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", @@ -5664,12 +5585,6 @@ "node": ">= 6" } }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "license": "MIT" - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -6069,15 +5984,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hexy": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", - "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", - "license": "MIT", - "bin": { - "hexy": "bin/hexy_cmd.js" - } - }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -6806,12 +6712,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0" - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -6874,12 +6774,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", - "license": "MIT" - }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -8023,13 +7917,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/nan": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.26.2.tgz", - "integrity": "sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==", - "license": "MIT", - "optional": true - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -8222,22 +8109,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", - "license": "MIT/X11", - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "node_modules/optimist/node_modules/minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", - "license": "MIT" - }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -8387,18 +8258,6 @@ "dev": true, "license": "ISC" }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, "node_modules/pe-library": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", @@ -8597,15 +8456,6 @@ "node": ">=6" } }, - "node_modules/put": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/put/-/put-0.0.6.tgz", - "integrity": "sha512-w0szIZ2NkqznMFqxYPRETCIi+q/S8UKis9F4yOl6/N9NDCZmbjZZT85aI4FgJf3vIPrzMPX60+odCLOaYxNWWw==", - "license": "MIT/X11", - "engines": { - "node": ">=0.3.0" - } - }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -9467,18 +9317,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -9510,16 +9348,6 @@ "node": ">= 6" } }, - "node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -9788,12 +9616,6 @@ "utrie": "^1.0.2" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, "node_modules/tiny-async-pool": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", @@ -10318,9 +10140,9 @@ } }, "node_modules/vite-plugin-electron": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/vite-plugin-electron/-/vite-plugin-electron-0.29.1.tgz", - "integrity": "sha512-AejNed5BgHFnuw8h5puTa61C6vdP4ydbsbo/uVjH1fTdHAlCDz1+o6pDQ/scQj1udDrGvH01+vTbzQh/vMnR9w==", + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/vite-plugin-electron/-/vite-plugin-electron-0.28.8.tgz", + "integrity": "sha512-ir+B21oSGK9j23OEvt4EXyco9xDCaF6OGFe0V/8Zc0yL2+HMyQ6mmNQEIhXsEsZCSfIowBpwQBeHH4wVsfraeg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10380,15 +10202,6 @@ "node": ">= 8" } }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -10432,28 +10245,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", diff --git a/package.json b/package.json index fe7db7b..c9811cd 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ }, "dependencies": { "@vscode/sudo-prompt": "^9.3.2", - "dbus-native": "^0.4.0", "echarts": "^6.0.0", "echarts-for-react": "^3.0.2", "electron-store": "^11.0.2",