UNPKG

node-ddk

Version:
1,303 lines (1,302 loc) 40.2 kB
var tt = Object.defineProperty; var nt = (e, t, n) => t in e ? tt(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n; var b = (e, t, n) => nt(e, typeof t != "symbol" ? t + "" : t, n); import { session as oe, ipcMain as q, BrowserWindow as K, nativeImage as S, Tray as it, Menu as se, app as f, Notification as ot, desktopCapturer as st, shell as me, dialog as re, safeStorage as he } from "electron"; import L from "os"; import A from "node:path"; import P from "node:fs"; import V from "node:url"; import ge from "node:os"; const c = {}; let N; const ye = () => N || (N = oe.defaultSession, N), ae = (e) => oe.fromPartition(e), rt = (e) => oe.fromPartition("persist:" + e); let $; const at = () => ($ || ($ = ae("ddk-local-file")), $); let G; const lt = () => (G || (G = ae("ddk-http")), G); let Ae = { getDefaultSession: ye, getPartitionSession: ae, getPersistPartitionSession: rt, getFileSession: at, getHttpSession: lt }; const dt = () => { ye(); }, C = { init: dt, ...Ae }, ut = (e) => { let t = parseInt(e); return isNaN(t) ? 0 : t; }, le = () => (/* @__PURE__ */ new Date()).getTime(); let fe = 1; const ct = () => (fe++, le() + "_" + fe); function ft(e, t) { let n, i = null, o = 0; return function() { n = this, i = arguments; let s = le(); if (s - o > t) { o = s, e.apply(n, i), n = i = null; return; } }; } const wt = async (e) => new Promise((t) => { setTimeout(() => { t(""); }, e); }), pt = (e) => { let t = { status: "OK", type: "other", size: 0, ctime: 0, mtime: 0 }; try { const n = P.statSync(e); n.isFile() ? t.type = "file" : n.isDirectory() && (t.type = "directory"), t.size = n.size, t.ctime = n.ctime.getTime(), t.mtime = n.mtime.getTime(); } catch (n) { n.code === "ENOENT" ? t.status = "none" : t.status = "error"; } return t; }, m = { parseInt: ut, getTime: le, getId: ct, debounce: ft, sleep: wt, getInfo: pt }; let v = {}, I = {}, mt = 1, ht = (/* @__PURE__ */ new Date()).getTime(); function gt() { function e() { let n = {}; K.getAllWindows().forEach(function(o) { n[o.webContents.id] = !0; }); let i = Object.keys(I); for (let o = 0; o < i.length; o++) { let a = i[o], s = I[a]; if (!s) continue; if (!s.webContentsId || s.webContentsId in n) return; delete I[a]; let r = { status: "DDK:NOWINDOW", data: {} }; s.resolve(r); } } function t() { e(), setTimeout(() => { t(); }, 3e3); } setTimeout(() => { t(); }, 1e4); } const yt = async (e) => ({ status: "DDK:NOMODULE", data: { desc: "cmdDefault" } }), At = (e, t) => { v[e] = t, q.handle(e + "^ddk-module", async (n, i) => { i = { ...i }; let o = i.sn + "", a = n.sender.id, s = { ...i, notify: null }; return s.webContentsId = a, s.fromWindowUniqueId = d.getUniqueIdByWebContentsId(n.sender.id), s.notify = (r) => { let u = d.getWindowByWebContentsId(a); if (!u || u.isDestroyed()) return; let p = { sn: o, data: r }; u.webContents.send("moduleMessageReceiverChannel^ddk-message", p); }, new Promise((r) => { t(s).then((u) => { let p = { sn: o, status: u.status || "OK", data: u.data }; r(p); }); }); }); }, Dt = () => { q.on("rendererResponseChannel^ddk-proxy", (e, t) => { let n = { ...t }, i = n.sn + "", o = I[i]; o && (delete I[i], n.fromWindowUniqueId = d.getUniqueIdByWebContentsId(e.sender.id), o.resolve(n)); }); }, _t = () => { q.handle("rendererProxyChannel^ddk-proxy", async (e, t) => { let n = { ...t }; n.fromWindowUniqueId = d.getUniqueIdByWebContentsId(e.sender.id); let i = n.sn + ""; return new Promise((o) => { let a = { sn: n.sn, status: "", data: {} }, s = d.getWindowByUniqueId(n.toWindowUniqueId + ""); if (!s || s.isDestroyed()) { a.status = "DDK:NOWINDOW", o(a); return; } I[i] = { resolve: o, stamp: m.getTime(), webContentsId: s.webContents.id, sn: n.sn }, s.webContents.send("rendererRequestChannel^ddk-module", n); }); }); }, Wt = () => { q.on("app-quit^ddk-system", (e, t) => { d.appQuit(); }), q.on("ondragstart^ddk-system", (e, t) => { const n = {}; t.length && t.length === 1 && (n.file = t[0]), t.length > 1 && (n.files = t), n.icon = A.join(__dirname, "../static/icons", "32x32.png"), e.sender.startDrag(n); }), q.on("open-dev-tools^ddk-system", (e, t) => { t && t.open ? e.sender.openDevTools() : e.sender.closeDevTools(); }); }, bt = async (e) => (e = { ...e }, new Promise((t) => { let n = e.module, i = e.toWindowUniqueId; if (i) { let o = "R" + ht + "_" + mt++; I[o] = { resolve: t, stamp: m.getTime(), webContentsId: 0, sn: o }; let a = d.getWindowByUniqueId(i + ""); if (!a || a.isDestroyed()) { t({ sn: o, status: "DDK:NOWINDOW", data: {} }); return; } let s = { module: e.module, data: e.data, timeout: e.data, sn: o }; a.webContents.send("rendererRequestChannel^ddk-module", s); } else { let o = yt; v[n] ? o = v[n] : v.default && (o = v.default); let a = { module: e.module, data: e.data, timeout: e.timeout || 0, notify: (s) => { e.notify && e.notify(s); } }; o(a).then((s) => { let r = { status: s.status || "OK", data: s.data }; t(r); }); } })), It = (e, t) => { De(null, e, t); }, De = (e, t, n) => { let i = { sn: t, status: "OK", data: n }; e || (e = c.app_main_window), typeof e == "string" && (e = d.getWindowByUniqueId(e)), !(!e || e.isDestroyed()) && e.webContents.send("messageReceiverChannel^ddk-message", i); }; Dt(), _t(), Wt(), gt(); const Ft = () => { }; let _e = { registerListenModule: At, request: bt, sendMessage: It, sendMessageToWindow: De }; const l = { init: Ft, ..._e }; let g, y, Q, X, T, M = "NODE-DDK"; const Mt = () => g, qt = (e) => { try { y = S.createFromPath(e); } catch { } }, We = () => { if (!g || !Array.isArray(X)) return; const e = se.buildFromTemplate(X); g.setContextMenu(e), L.type() == "Darwin" && f.dock.setMenu(e); }, St = (e) => { X = [...e], We(); }, be = (e) => { M = e + "", M == "" && (M = " "), g && g.setToolTip(M); }, Ct = (e) => { T = e; }, Tt = () => { T = async () => { try { let e = c.app_main_window; if (!e || e.isDestroyed()) return; e.showInactive(), e.show(); } catch { } }; }, vt = () => { T = async () => { try { let e = c.app_main_window; if (!e || e.isDestroyed()) return; e.hide(); } catch { } }; }, xt = () => { T = async () => { try { let e = c.app_main_window; if (!e || e.isDestroyed()) return; e.isVisible() ? e.hide() : (e.showInactive(), e.show()); } catch { } }; }; let we = !1; function kt() { if (!we) { if (we = !0, !y) { try { y = S.createFromPath(c.generalFavicon); } catch { } y || (y = S.createEmpty()); } g.setToolTip(M), g.on("click", m.debounce(() => { if (T) try { T(); } catch { } }, 300)), We(); } } const Ie = () => { g.setImage(y); }, Pt = () => { g.setImage(Q); }; let B, U = !0; const Fe = () => { clearInterval(B), U = !0, Ie(), g.setToolTip(M); }, Ot = async (e) => { let n = { ...e }.data, i = n.period, o = 0; i > 0 && (o = m.getTime() + i); let a = n.speed; a === void 0 && (a = 500); let s = n.tooltip; return B && clearInterval(B), B = setInterval(() => { U ? Pt() : Ie(), U = !U, o > 0 && m.getTime() > o && Fe(); }, a), s && g.setToolTip(s + ""), { data: {} }; }, Kt = async (e) => (Fe(), { data: {} }), Lt = async (e) => { let i = { ...e }.data.tooltip + ""; return be(i), { data: {} }; }, zt = () => { if (!y) { try { y = S.createFromPath(c.generalFavicon); } catch { } y || (y = S.createEmpty()); } Q || (Q = S.createFromDataURL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAQAAAD2e2DtAAAAAmJLR0QAAKqNIzIAAACVSURBVHja7cEBAQAAAICQ/q/uCAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAqgEBHgABvBu5bwAAAABJRU5ErkJggg==")), g = new it(y), l.registerListenModule("DDK:startTrayFlashing", Ot), l.registerListenModule("DDK:stopTrayFlashing", Kt), l.registerListenModule("DDK:setToolTip", Lt); }; let Me = { getTray: Mt, setDefaultImage: qt, setContextMenu: St, setToolTip: be, setOnClick: Ct, setShowMainWindowOnClick: Tt, setHideMainWindowOnClick: vt, setShowHideSwitchMainWindowOnClick: xt, activeTray: kt }; const qe = { init: zt, ...Me }; let Se = {}, de; const Ce = (e, t) => { Se[e] = t || null; }, Rt = (e) => { Ce(e); }, Nt = (e) => { de = e; }, Bt = () => { de = void 0; }, Ut = (e, t) => { let n = Se[e.type] || de; if (!n) { t.removeMenu(); return; } try { const i = se.buildFromTemplate(n); t.setMenu(i); } catch { console.error("设置自定义菜单失败"); } }, Et = async (e) => { let t = e.data; t = { ...t }; let n = t.menuId, i = c.___getWindowByUniqueId(e.fromWindowUniqueId); if (!i) return { data: {} }; function o(s) { return s = [...s], s.forEach((r) => { r.submenu && (r.submenu = o(r.submenu)); let u = r.clickId; if (u) { let p = (_, R, W) => { !i || i.isDestroyed() || l.sendMessageToWindow(i, "DDK:systemMenuEvent", { menuId: n, clickId: u, ctrlKey: W.ctrlKey, metaKey: W.metaKey, shiftKey: W.shiftKey, altKey: W.altKey, triggeredByAccelerator: W.triggeredByAccelerator }); }; r.click = p; } }), s; } let a = o(t.menus); try { if (!i.isDestroyed()) { const s = se.buildFromTemplate(a); let r, u; t.position && (r = t.position.x, u = t.position.y, r !== void 0 && (r = Math.ceil(r), u = Math.ceil(u || 0))), s.popup({ x: r, y: u, callback: () => { !i || i.isDestroyed() || l.sendMessageToWindow(i, "DDK:systemMenuEvent", { menuId: n, clickId: "afterClose" }); } }); } } catch { console.error("设置右键菜单失败"); } return { data: {} }; }; l.registerListenModule("DDK:systemMenuEvent", Et), f.applicationMenu = null; let Te = { setMenuByWindowType: Ce, removeMenuByWindowType: Rt, setGlobalMenu: Nt, removeGlobalMenu: Bt }; const jt = () => { }, ve = { init: jt, setMenu: Ut, ...Te }, xe = (e) => (e = A.join(c._sessionData, "ddk-data", e), P.existsSync(e) || P.mkdirSync(e, { recursive: !0 }), e); class Ht { constructor(t) { b(this, "changed"); b(this, "pathId"); b(this, "id"); b(this, "pathname"); b(this, "jsdata"); b(this, "maxItem"); t = { ...t }, this.changed = !1, this.pathId = t.pathId || "cache_data", this.id = t.id, this.pathname = "", this.jsdata = {}, this.maxItem = t.maxItem || 0; } load() { let t = xe(this.pathId); this.pathname = A.join(t, this.id); let n = {}; try { n = require(this.pathname), JSON.stringify(n).startsWith("{") && this.maxItem && Object.keys(n).length > this.maxItem && (n = {}); } catch { n = {}; } this.jsdata = { ...n }, this.timeout_save(3e3); } getData() { return this.jsdata; } setChanged() { this.changed = !0; } async save() { let t = this; if (!t.changed) return; t.changed = !1; let n = JSON.stringify(t.jsdata); return new Promise((i) => { try { P.writeFile(t.pathname, n, () => { i(""); }); } catch { i(""); } }); } timeout_save(t) { let n = this; setTimeout(async () => { await n.save(), n.timeout_save(1e3); }, t); } } const Zt = (e) => new Ht(e); let $t = { getDataDirPath: xe, getJsonCachedFile: Zt }; const ke = { ...$t }; let h = {}; const Y = () => { c.app_true_quit_flag = !0, c.app_main_window = null, f.quit(), setTimeout(() => { f.exit(); }, 100); }; let k = {}, D = {}; const Gt = (e) => { e || (e = [ { type: "main", minWidth: 100, minHeight: 100 } ]), e = [...e], e.push({ type: "DDK_desktopCapturerScreenshot", frame: !1, // fullscreenable: true, // fullscreen: true, alwaysOnTop: !0, transparent: !0, skipTaskbar: !0, kiosk: !0, width: 1e4, height: 1e4 }), D.default = [], e.forEach((t) => { t = { ...t }, t.minWidth === void 0 && (t.minWidth = 100), t.minHeight === void 0 && (t.minHeight = 100), k[t.type] = t, t.frame === !1 ? D["noframe," + t.minWidth + "," + t.minHeight] = [] : D["frame," + t.minWidth + "," + t.minHeight] = []; }), Object.keys(D).length > 5 && console.warn("(minWith x minHeight) X (frame/onframe) 种类(" + Object.keys(D).length + ") > 5, 可能会严重消耗系统资源"), k.main || (console.error('窗口的 type 必须有一个是 "main"'), process.exit(1)); }; function Jt(e, t) { let n = t.webContents.id; t.on("closed", (i) => { try { delete h[n]; } catch { } t == c.app_main_window && Y(); }), t.on("close", (i) => { if (c.app_true_quit_flag || t.isDestroyed()) return; let o = !1, a = h[t.webContents.id]; if (a && a.beforeunloadFlag == !0 && (o = !0), !o) { t == c.app_main_window && Y(); return; } i.preventDefault(), l.sendMessageToWindow(t, "DDK:beforeunloadOnce", {}); }); } function Vt(e, t) { t.webContents.on("will-prevent-unload", (n) => { n.preventDefault(); }); } function Qt(e, t) { if (e.navigate === !1) return; let n = t.webContents; n.on("new-window", (i, o) => { i.preventDefault(); }), n.on("will-navigate", (i, o) => { i.preventDefault(); }); } function Xt(e, t) { e = { ...e }, t.webContents.setWindowOpenHandler(({ url: n, features: i }) => { let o = ""; function a() { if (!i || t.isDestroyed()) return !1; let _ = i.split("_NODE_DDK_20240811_="); return _.length < 2 ? !1 : (o = _[1], !0); } if (!a()) return { action: "deny" }; let s = { parent: t, modal: !0, webPreferences: { preload: A.join(__dirname, "preload.js") } }, r = H(o); s.frame = r.frame !== !1, s.alwaysOnTop = r.alwaysOnTop === !0, s.transparent = r.transparent === !0, s.fullscreenable = r.fullscreenable === !0, s.fullscreen = r.fullscreen === !0, Number.isInteger(r.width) && (s.width = r.width, s.height = r.height), s.skipTaskbar = r.skipTaskbar === !0, s.kiosk = r.kiosk === !0, r.menu || (s.autoHideMenuBar = !0); let u = s.webPreferences || {}; return r.devTools || (u.devTools = !1), { action: "allow", overrideBrowserWindowOptions: s }; }); } function Yt(e, t) { e = { ...e }, t.webContents.on("found-in-page", (n, i) => { let o = c.findInPageSet, a = i.requestId, s = o[a]; delete o[a], s && s({ data: { result: { matches: i.matches, sn: i.activeMatchOrdinal - 1 } } }); }); } let ee = ke.getJsonCachedFile({ id: "window_states.json" }); function en(e, t) { if (e.windowStateType === void 0) return; let n = e.windowStateType + "", i = ee.getData(), o = i[n]; o && (o.x !== void 0 && t.setBounds({ x: o.x, y: o.y, width: o.w, height: o.h }), o.maximize && t.maximize()); let a = m.getTime(), s; function r() { let u = {}, p; if (m.getTime() - a < 1e3) { s || (s = setTimeout(() => { a = 0, r(); }, 1e3)); return; } s && (clearTimeout(s), s = void 0), !t.isDestroyed() && (a = m.getTime(), u.maximize = t.isMaximized() ? 1 : 0, p = t.getPosition(), u.x = p[0], u.y = p[1], p = t.getSize(), u.w = p[0], u.h = p[1], i[n] = u, ee.setChanged()); } t.on("resize", (u) => { r(); }), t.on("move", (u) => { r(); }), t.on("maximize", (u) => { r(); }), t.on("unmaximize", (u) => { r(); }); } function tn(e, t) { c.generalFavicon && t.setIcon(c.generalFavicon), e.width !== void 0 && e.height !== void 0 && t.setSize(e.width, e.height), e.zoomFactor !== void 0 && t.webContents.setZoomFactor(e.zoomFactor), e.hasShadow === !1 && t.setHasShadow(!1), e.backgroundColor !== void 0 && t.setBackgroundColor(e.backgroundColor), e.maximize ? t.maximize() : e.minimize && t.minimize(), e.needCenter && t.center(), e.autoDevTools && t.webContents.openDevTools(); } function nn(e, t) { let n = {}; K.getAllWindows().forEach(function(i) { n[i.webContents.id] = !0; }), Object.keys(h).forEach(function(i) { n[i] || delete h[i]; }), h[t.webContents.id] = e; } function on(e) { let t = ue(e); if (!t) return null; let n = z(t.webContentsId); return !n || n.isDestroyed() ? (delete h[t.webContentsId], null) : n; } function Pe(e, t) { ve.setMenu(e, t), qe.activeTray(), Jt(e, t), Vt(e, t), Qt(e, t), Xt(e, t), Yt(e, t), en(e, t), tn(e, t), nn(e, t); } const sn = (e) => { let t = z(e.webContentsId); !t || t.isDestroyed() || Pe(e, t); }, Oe = (e) => { let t = e.split(","), n = { show: !1, minWidth: m.parseInt(t[1]), minHeight: m.parseInt(t[2]), webPreferences: { // offscreen: true, session: C.getDefaultSession(), preload: A.join(__dirname, "preload.js"), webSecurity: !0, contextIsolation: !0, nodeIntegration: !1, nodeIntegrationInWorker: !0, allowRunningInsecureContent: !1, disableHtmlFullscreenWindowResize: !1, spellcheck: !1 } }; t[0] == "noframe" && (n.frame = !1); let i = new K(n); return f.isPackaged ? i.loadFile(A.join(__dirname, "../dist/index.html")) : i.loadURL("http://localhost:3000/index.html"), i; }, Ke = () => { for (let e of Object.keys(D)) { let t = D[e]; if (t.length > 1) continue; let n = Oe(e); t.push(n); } setTimeout(async () => { Ke(); }, 1e3); }, rn = (e) => { c.__window_pool_mail == null && (c.__window_pool_mail = [], c.__window_pool_other = []); let t = H(e.type), n = "frame"; t.frame === !1 && (n = "noframe"), n += "," + t.minWidth + "," + t.minHeight; let o = D[n].shift(); return o || (o = Oe(n), o); }; function an(e, t, n) { let i = JSON.stringify(n); t.webContents.executeJavaScript("window.___NODE_DDK_WINDOW_INFO___=" + i + ";if(window.___NODE_DDK_WINDOW_INFO_DEAL___)window.___NODE_DDK_WINDOW_INFO_DEAL___();", !0); } let ln = "minWidth,minHeight,resizable,minimizable,minimize,maximizable,maximize,fullscreenable,fullscreen,alwaysOnTop,frame,menu,skipTaskbar,kiosk,focus,needCenter,x,y,width,height,homePage,hide,backgroundColor,navigate,devTools,autoDevTools,transparent,zoomFactor,hasShadow,windowStateType", dn = ln.split(","); const Le = (e) => { let t = { webContentsId: -1, appName: f.getName(), appVersion: f.getVersion(), devMode: process.env.NODE_ENV === "development", ...e }, n = H(e.type); dn.forEach((o) => { e[o] === void 0 && (t[o] = n[o]); }), t.args = t.args || {}; let i = on(t.uniqueId); return i ? (i.show(), i.focus(), i) : (i = rn(e), t.menu || i.removeMenu(), e.uniqueId == "main" && (c.app_main_window = i), t.webContentsId = i.webContents.id, an(e, i, t), Pe(t, i), t.hide ? i.hide() : i.show(), i); }, un = (e = -1) => h[e] || null, cn = (e = -1) => { let t = h[e]; return t ? t.uniqueId : ""; }, ue = (e) => { let t = Object.keys(h).find((n) => h[n].uniqueId == e); return t ? h[t] : null; }, z = (e) => { let t = null; return K.getAllWindows().forEach(function(n) { t || n.webContents.id == e && (t = n); }), t; }, j = (e) => { let t = ue(e + ""); return t ? z(t.webContentsId) : null; }, fn = async () => { Le({ type: "main", uniqueId: "main", args: {} }); }, wn = () => { let e = c.app_main_window; return !e || e.isDestroyed() ? null : e; }, pn = () => { let e = c.app_main_window; return e || null; }, H = (e) => { let t = k[e]; return t || (t = k[Object.keys(k)[0]]), t; }, mn = (e) => { let t; if (e.toWindowUniqueId !== void 0 && e.toWindowUniqueId != "" ? t = j(e.toWindowUniqueId) : (t = j(e.fromWindowUniqueId), t || (t = z(e.webContentsId))), !(!t || t.isDestroyed())) return t; }, hn = async () => { f.on("browser-window-created", (e, t) => { }); }, gn = () => { c.___getWindowByUniqueId = j, hn(), ee.load(), setTimeout(() => { Ke(); }, 2e3); }; let ze = { setWindowTypes: Gt, createWindow: Le, getWindowInfoByWebContentsId: un, getWindowInfoByUniqueId: ue, getWindowByWebContentsId: z, getWindowByUniqueId: j, getUniqueIdByWebContentsId: cn, getMainWindow: wn, getMainRawWindow: pn, getWindowFromModuleRequest: mn }; const d = { init: gn, appQuit: Y, get_window_caches: () => h, windowOpen_init: sn, getWindowType: H, createMainWindow: fn, ...ze }; let w = { data: {} }; const yn = async (e) => { let n = { ...e }.data, i = n.uniqueId; return i === void 0 && (i = m.getId()), new Promise((o) => { d.createWindow({ type: n.type, uniqueId: i, args: n.args || {} }), o(w); }); }, An = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.close(), w; }, Dn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); if (n) { let i = d.getWindowInfoByWebContentsId(n.webContents.id); i && (i.beforeunloadFlag = !1), n.close(), setTimeout(() => { n.isDestroyed() || n.destroy(); }, 1); } return w; }, _n = async (e) => { let t = { ...e }, i = t.data.steps || [], o = d.getWindowFromModuleRequest(t); if (!o) return w; for (let a = 0; a < i.length; a++) { let s = i[a], r = s.type; try { if (r == "sleep") { await m.sleep(s.sleep); continue; } if (o.isDestroyed()) break; if (r == "show") o.show(); else if (r == "hide") o.hide(); else if (r == "rectangle") o.setBounds(s); else if (r == "position") o.setPosition(s.x, s.y); else if (r == "size") o.setSize(s.width, s.height); else if (r == "center") o.center(); else if (r == "maximize") o.maximize(); else if (r == "unmaximize") o.unmaximize(); else if (r == "minimize") o.minimize(); else if (r == "fullscreen") o.setFullScreen(!0); else if (r == "unfullscreen") o.setFullScreen(!1); else if (r == "alwaysOnTop") o.setAlwaysOnTop(!0); else if (r == "unalwaysOnTop") o.setAlwaysOnTop(!1); else if (r == "setZoomFactor") o.webContents.setZoomFactor(s.factor); else if (r == "increaseZoomFactor") { let u = o.webContents.getZoomFactor(); u += s.factor, u > 10 ? u = 10 : u < 0.1 && (u = 0.1), o.webContents.setZoomFactor(u); } } catch { } } return w; }, Wn = async (e) => { let t = { ...e }, n = t.data, i = d.getWindowFromModuleRequest(t); return i && (n.x !== void 0 && n.width !== void 0 ? i.setBounds(n) : (n.x !== void 0 && i.setPosition(n.x, n.y), n.width !== void 0 && i.setSize(n.width, n.height))), w; }, bn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t), i = { x: 0, y: 0, width: 0, height: 0 }; return n && (i = n.getBounds()), { data: i }; }, In = async (e) => { let t = { ...e }; t.data; let n = d.getWindowFromModuleRequest(t); return n && n.center(), w; }, Fn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && (n.blurWebView(), n.blur(), n.minimize()), w; }, Mn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.maximize(), w; }, qn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.unmaximize(), w; }, Sn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t), i = !1; return n && (n.isMaximized() ? (n.unmaximize(), i = !1) : (n.maximize(), i = !0)), { data: { isMaximized: i } }; }, Cn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && (n.setFullScreenable(!0), n.setFullScreen(!0)), w; }, Tn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.setFullScreen(!1), w; }, vn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.setAlwaysOnTop(!0), w; }, xn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.setAlwaysOnTop(!1), w; }, kn = async (e) => { let t = 0, n = 0, i = 0; return K.getAllWindows().forEach((o) => { o.isDestroyed() || (o.isMinimized() ? t++ : o.isFocused() ? n++ : i++); }), { data: { minimized: t, focused: n, other: i } }; }, Pn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && (n.show(), n.focus()), w; }, On = async (e) => { let t = { ...e }, n = t.data.factor, i = d.getWindowFromModuleRequest(t); return i ? (i.webContents.setZoomFactor(n), { data: { factor: n } }) : w; }, Kn = async (e) => { let t = { ...e }, n = t.data.factor, i = d.getWindowFromModuleRequest(t); if (!i) return w; let o = i.webContents.getZoomFactor(); return o += n, o > 10 ? o = 10 : o < 0.1 && (o = 0.1), i.webContents.setZoomFactor(o), { data: { factor: o } }; }, Ln = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t), i = 1; return n && (i = n.webContents.getZoomFactor()), { data: { factor: i } }; }, zn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.hide(), w; }, Rn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.show(), w; }, Nn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.flashFrame(!0), w; }, Bn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.flashFrame(!1), w; }, Un = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.setTitle(t.data.title + ""), w; }, En = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t), i = ""; return n && (i = n.getTitle() + ""), { data: { title: i } }; }, jn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); if (n) { let i = d.getWindowInfoByWebContentsId(n.webContents.id); i && (i.beforeunloadFlag = !0); } return w; }, Hn = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); function i() { let o = !1; n && !n.isDestroyed() && n.isMaximized() && (o = !0), l.sendMessageToWindow(n || null, "DDK:maximizeState", { isMaximized: o }); } return n ? (n.on("maximize", (o) => { i(); }), n.on("unmaximize", (o) => { i(); }), { data: { isMaximized: n.isMaximized() } }) : { data: { isMaximized: !1 } }; }, Zn = async (e) => { let t = { ...e }, n = t.data, i = d.getWindowType(t.data.type); return i = { ...i }, i.webContentsId = t.webContentsId, i.type = n.type, i.uniqueId = n.uniqueId, i.args = {}, d.windowOpen_init(i), w; }; l.registerListenModule("DDK:createWindow", yn), l.registerListenModule("DDK:closeWindow", An), l.registerListenModule("DDK:forcedCloseWindow", Dn), l.registerListenModule("DDK:operateWindowStepByStep", _n), l.registerListenModule("DDK:hideWindow", zn), l.registerListenModule("DDK:showWindow", Rn), l.registerListenModule("DDK:startFlashWindow", Nn), l.registerListenModule("DDK:stopFlashWindow", Bn), l.registerListenModule("DDK:getTitle", En), l.registerListenModule("DDK:setTitle", Un), l.registerListenModule("DDK:minimizeWindow", Fn), l.registerListenModule("DDK:maximizeWindow", Mn), l.registerListenModule("DDK:unmaximizeWindow", qn), l.registerListenModule("DDK:maximizeSwitchWindow", Sn), l.registerListenModule("DDK:setWindowFullscreen", Cn), l.registerListenModule("DDK:unsetWindowFullscreen", Tn), l.registerListenModule("DDK:setWindowAlwaysOnTop", vn), l.registerListenModule("DDK:unsetWindowAlwaysOnTop", xn), l.registerListenModule("DDK:setWindowRectangle", Wn), l.registerListenModule("DDK:setWindowCenter", In), l.registerListenModule("DDK:getWindowSize", bn), l.registerListenModule("DDK:getAllWindowStatistics", kn), l.registerListenModule("DDK:activeWindowAndFocus", Pn), l.registerListenModule("DDK:setWindowZoomFactor", On), l.registerListenModule("DDK:increaseWindowZoomFactor", Kn), l.registerListenModule("DDK:getWindowZoomFactor", Ln), l.registerListenModule("DDK:registerBeforeunloadOnce", jn), l.registerListenModule("DDK:registerMaximizeState", Hn), l.registerListenModule("DDK:registerWindowOpen", Zn); let Re; const $n = (e) => { Re = e + ""; }, Gn = async (e) => { let t = null; const i = { ...e }.data; let o = i.title + "", a = i.body + "", s = i.silent === !0, r = {}, u = Re; u || (u = c.generalFavicon), u || (u = void 0), t = new ot({ title: o, silent: s, body: a, icon: u }); let p; function _(R) { if (p) { let W = p; p = null, W(R); } } return new Promise((R) => { p = R, t.on("click", () => { r.type = "click", _({ data: r }); }), t.on("close", () => { r.type = "cancle", _({ data: r }); }), t.on("failed", () => { r.type = "cancle", _({ data: r }); }), t.show(); }); }; l.registerListenModule("DDK:systemNotification", Gn); let Ne = { setIcon: $n }; const Jn = () => { }, Vn = { init: Jn, ...Ne }, Qn = async (e) => { ({ ...e }); let t = { types: ["screen"], thumbnailSize: { width: 0, height: 0 } }; return new Promise((n) => { st.getSources(t).then((i) => { let o = i[0].id; n({ data: { sourceId: o } }); }).catch(() => { n({ data: {} }); }); }); }; l.registerListenModule("DDK:desktopCapturerScreenshot", Qn); let Xn = ge.type() == "Windows_NT"; const Yn = () => { let e = A.join(__dirname, "../dist").replaceAll("\\", "/"); e = e[0].toUpperCase() + e.substring(1); function t(o) { o = new V.URL(o).pathname, Xn && o.startsWith("/") && (o = o.substring(1)), o = o.replaceAll("\\", "/"); let s = ""; do { if (o.indexOf("../") > -1 || !o.startsWith(e)) break; s = o; } while (!1); return s; } let n = C.getDefaultSession().protocol, i = n; i.handle ? i.handle("file", (o) => { let a = t(o.url), s = ""; return a && (s = V.pathToFileURL(a).toString()), C.getFileSession().fetch(s); }) : n.interceptFileProtocol("file", (o, a) => { let s = t(o.url); a({ path: s }); }); }; let E = {}; const ei = (e) => { e = { ...e }, Ue ? Be(e) : E[e.protocol] = e; }, Be = (e) => { e = { ...e }; let t = C.getDefaultSession().protocol, n = t; n.handle ? n.handle(e.protocol, async (i) => { let o = await e.realpath({ path: i.url }); if (o) { let a = ""; return a = V.pathToFileURL(o).toString(), C.getFileSession().fetch(a); } else return; }) : t.registerFileProtocol(e.protocol, async (i, o) => { let a = await e.realpath({ path: i.url }); o({ path: a }); }); }, ti = () => { Object.keys(E).forEach((e) => { Be(E[e]); }), E = {}; }; let Ue = !1; f.whenReady().then(() => { Ue = !0, Yn(), ti(); }); let Ee = { registerFileProtocol: ei }; const ni = () => { }, ii = { init: ni, ...Ee }; let te; const je = async (e) => { let t = !1; do { if (!te) break; t = await te(e); } while (!1); return t ? (me.openPath(e.path), !0) : !1; }, oi = (e) => { te = e; }; let ne; const He = async (e) => { let t = !1; do { if (!ne) break; t = await ne(e); } while (!1); return t ? (me.openExternal(e.url), !0) : !1; }, si = (e) => { ne = e; }, ri = async (e) => { const n = { ...e }.data; return { data: { status: await je(n) ? "OK" : "error" } }; }, ai = async (e) => { const n = { ...e }.data; return { data: { status: await He(n) ? "OK" : "error" } }; }; l.registerListenModule("DDK:openLocalFile", ri), l.registerListenModule("DDK:openUrl", ai); let Ze = { registerOpenLocalFileChecker: oi, registerOpenUrlChecker: si, openLocalFile: je, openUrl: He }; const li = () => { }, di = { init: li, ...Ze }; let O = ke.getJsonCachedFile({ id: "dialog_state.json" }); const ui = async (e) => { let t = m.getInfo(e); return !(t.status != "OK" || t.type != "directory"); }, ci = async (e, t) => { let n = O.getData(), i = e; if (!await ui(e)) { let o = e.lastIndexOf("/"); if (o < 0) return; i = e.substring(0, o); } n[t] = i, O.setChanged(); }; let J = !1; const $e = async (e, t) => { if (!t) return; let n = t + ""; Array.isArray(e) || (e = [e]), !(e.length < 1) && (J || (J = !0, await ci(e[0], n), J = !1)); }, fi = async (e) => { let n = { ...e }.data; n = { ...n }; let i = O.getData(); n.dirGroup && (n.defaultPath = i[n.dirGroup]); const o = []; return n.openFile && o.push("openFile"), n.openDirectory && o.push("openDirectory"), n.multiSelections && o.push("multiSelections"), n.showHiddenFiles && o.push("showHiddenFiles"), o.push("createDirectory"), new Promise((a) => { re.showOpenDialog({ title: n.title, buttonLabel: n.buttonLabel, defaultPath: n.defaultPath, filters: n.filters, properties: o }).then((s) => { let r = s.filePaths; r = [...r], $e(r, n.dirGroup), a({ data: { fileList: r } }); }).catch((s) => { a({ data: { fileList: [] } }); }); }); }, wi = async (e) => { let n = { ...e }.data; n = { ...n }; let i = O.getData(); n.defaultPath = "", n.dirGroup && (n.defaultPath = i[n.dirGroup] || ""), n.filename && (n.defaultPath && (n.defaultPath += "/"), n.defaultPath += n.filename); const o = []; return n.showHiddenFiles && o.push("showHiddenFiles"), o.push("createDirectory"), o.push("showOverwriteConfirmation"), new Promise((a) => { re.showSaveDialog({ title: n.title, buttonLabel: n.buttonLabel, defaultPath: n.defaultPath, filters: n.filters, properties: o }).then((s) => { let r = s.filePath; $e(r || "", n.dirGroup), a({ data: { filePath: r } }); }).catch((s) => { a({ data: { filePath: "" } }); }); }); }, pi = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); if (!n) return { data: { response: 0, checkboxChecked: !1 } }; let i = t.data; i = { ...i }; let o = await re.showMessageBox(n, i); return o || (o = { response: 0, checkboxChecked: !1 }), { data: o }; }; l.registerListenModule("DDK:showOpenDialog", fi), l.registerListenModule("DDK:showSaveDialog", wi), l.registerListenModule("DDK:showMessageBox", pi); const mi = () => { O.load(); }, hi = { init: mi }, gi = async (e) => { let i = { ...e }.data.filePath + ""; return { data: { fileInfo: m.getInfo(i) } }; }, yi = async (e) => { let i = { ...e }.data.filePathList; Array.isArray(i) || (i = []); let o = {}; return i.forEach((a) => { o[a] = m.getInfo(a); }), { data: { fileInfos: o } }; }; l.registerListenModule("DDK:getFileInfo", gi), l.registerListenModule("DDK:getFileInfoList", yi); c.findInPageSet = {}; let ie = c.findInPageSet; const Ai = (e) => { let t = ie[e]; t && (delete ie[e], t({ data: { result: { matches: 0, sn: -1 } } })); }, Di = async (e) => { let t = { ...e }, n = t.data, i = n.text + ""; i || (i = "nothingToFind"); let o = d.getWindowFromModuleRequest(t); return o ? new Promise((a) => { let s = o.webContents.findInPage(i, { findNext: n.findNext !== !1, forward: n.forward === !0, matchCase: n.matchCase === !0 }); ie[s] = a, setTimeout(() => { Ai(s); }, 10 * 1e3); }) : { data: { result: { matches: 0, sn: -1 } } }; }, _i = async (e) => { let t = { ...e }, n = d.getWindowFromModuleRequest(t); return n && n.webContents.stopFindInPage("clearSelection"), { data: {} }; }; l.registerListenModule("DDK:findInPage", Di), l.registerListenModule("DDK:stopFindInPage", _i); let Ge = ""; const Wi = () => { Ge == "Windows_NT" || process.env.TZ || P.readlinkSync("/etc/localtime").toLowerCase().indexOf("beijing") < 0 || (process.env.TZ = "Asia/Shanghai"); }, bi = () => { Ge = ge.type(); try { Wi(); } catch { } }, Ii = { run: bi }; process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = "true"; f.commandLine.appendSwitch("disable-web-security"); f.commandLine.appendSwitch("disable-features", "OutOfBlinkCors"); f.commandLine.appendSwitch("ignore-certificate-errors", "true"); const pe = async (e, t) => { let n = ""; t && e.length > 1 && (n = e[e.length - 1]), e.includes("--allow-file-access-from-files") && (n = e[e.length - 1]), n !== "" && n[0] !== "-" && n !== "AUTOSTART" && c._my_app_openFile(n); }; async function Fi() { f.on("second-instance", (e, t, n) => { if (c.app_main_window) { const i = c.app_main_window; i.isDestroyed() || (i.isMinimized() && i.unmaximize(), i.show(), i.focus(), pe(t, !1)); } }), f.on("activate", (e, t) => { if (c.app_main_window) { const n = c.app_main_window; n && !n.isDestroyed() && (n.isMinimized() && n.unmaximize(), n.show(), n.focus()); } }), f.on("window-all-closed", () => { process.platform !== "darwin" && f.quit(); }), f.on("before-quit", () => { c.app_true_quit_flag = !0; }), f.on("will-finish-launching", (e) => { f.on("open-file", (t, n) => { t.preventDefault(); }); }), await f.whenReady(), l.init(), C.init(), d.init(), qe.init(), ve.init(), d.createMainWindow(), Vn.init(), ii.init(), di.init(), hi.init(), c._my_app_init(), process.platform !== "darwin" && await pe(process.argv, !0); } const Mi = async () => { Ii.run(), f.requestSingleInstanceLock() ? await Fi() : process.platform !== "darwin" && d.appQuit(); }, qi = { appStart: Mi }; let Z = "Other", Je = !1, Ve = !1, Qe = !1; L.type() == "Windows_NT" && (Je = !0, Z = "Windows"); L.type() == "Darwin" && (Ve = !0, Z = "Darwin"); L.type() == "Linux" && (Qe = !0, Z = "Linux"); let Si = process.env.NODE_ENV === "development", Ci = L.homedir() + "/", ce = ""; { let e = "../public"; f && f.isPackaged && (e = "../dist"), ce = A.join(__dirname, e); } const Ti = () => ce, vi = () => Ci, xi = () => Si, ki = () => Z, Pi = () => Ve, Oi = () => Je, Ki = () => Qe, Li = (e) => { c.generalFavicon = e + ""; }, zi = (e) => A.join(ce, e); let F = "", x = ""; const Ri = (e) => { x = e.path; }, Ni = (e) => { F = e.path; }, Bi = () => f.getPath("userData"), Ui = () => f.getAppPath(), Ei = () => f.getName(), ji = (e) => { f.setName(e); }, Hi = () => f.getPath("appData"), Xe = (e) => he.encryptString(e).toString("hex"), Ye = (e) => he.decryptString(Buffer.from(e, "hex")), Zi = async (e) => ({ data: { result: Xe(e.data.text) } }), $i = async (e) => ({ data: { result: Ye(e.data.text) } }), Gi = async () => { F ? f.setPath("userData", F) : F = f.getPath("userData"), x || (x = A.join(F, "ddk-session")), f.setPath("sessionData", x), c._sessionData = f.getPath("sessionData"), F = void 0, x = void 0, await qi.appStart(); }; c._my_app_openFile = (e) => { }; const Ji = (e) => { c._my_app_openFile = e; }; c._my_app_init = () => { l.registerListenModule("DDK:encryptString", Zi), l.registerListenModule("DDK:decryptString", $i); }; let et = { isPackaged: f && f.isPackaged, getHomeDir: vi, getPublicDir: Ti, osType: ki, osIsDarwin: Pi, osIsWindows: Oi, osIsLinux: Ki, setOpenFile: Ji, start: Gi, quit: d.appQuit, setFavicon: Li, getPathInPublic: zi, getDevMode: xi, setSessionPath: Ri, setDataPath: Ni, getDataPath: Bi, getAppPath: Ui, getAppName: Ei, setAppName: ji, getSystemAppDataPath: Hi, encryptString: Xe, decryptString: Ye }; ({ ...et }); const io = { app: et, session: Ae, ipc: _e, window: ze, menu: Te, tray: Me, systemNotification: Ne, shell: Ze, protocol: Ee }; export { io as default };