UNPKG

node-ddk

Version:
759 lines (751 loc) 18.9 kB
const c = {}; let h = {}, y = {}, L = 1, F = {}, z = (/* @__PURE__ */ new Date()).getTime(), I = !1; const C = () => { I || (I = !0, Z(), j(), Y()); }, B = async (e) => ({ windowUniqueId: "", status: "DDK:NOMODULE", data: { desc: "cmdDefault" } }), Z = () => { window.nodeDDkWorld.on("rendererRequestChannel^ddk-module", (e) => { let t = { ...e }; if (!t.sn || !t.module) return; let n = t.module, a = B; h[n] && (a = h[n]), a(t).then((s) => { let o = { sn: t.sn, status: s.status || "OK", data: s.data }; window.nodeDDkWorld.send("rendererResponseChannel^ddk-proxy", o); }); }); }, H = (e, t) => { h[e] = t; }, j = () => { window.nodeDDkWorld.on("messageReceiverChannel^ddk-message", (e) => { let t = e.sn + "", n = F[t]; n && n(e.data); }); }, Y = () => { window.nodeDDkWorld.on("moduleMessageReceiverChannel^ddk-message", (e) => { let t = e.sn + "", n = y[t]; !n || !n.notify || n.notify(e.data); }); }, J = (e) => { e = { ...e }; let t = "R" + z + "_" + L++, n = { toWindowUniqueId: e.toWindowUniqueId, module: e.module, data: e.data, timeout: e.data, sn: t }, a = n.data; return Array.isArray(a) ? n.data = [...a] : typeof a == "object" && (n.data = { ...a }), new Promise((s) => { let o = n.module + "^ddk-module"; n.toWindowUniqueId && (o = "rendererProxyChannel^ddk-proxy"), y[t] = { notify: e.notify }, window.nodeDDkWorld.invoke(o, n).then((u) => { try { delete y[t]; } catch { } s({ status: u.status || "OK", data: u.data, fromWindowUniqueId: u.fromWindowUniqueId || "" }); }).catch(() => { try { delete y[t]; } catch { } s({ fromWindowUniqueId: "", status: "ERROR", data: {} }); }); }); }, Q = (e, t) => { F[e] = t; }, V = () => { C(); }; C(); let v = { request: J, registerListenModule: H, registerMessageReceiver: Q }; const i = { init: V, ...v }, $ = (e) => { let t = parseInt(e); return isNaN(t) ? 0 : t; }, W = () => (/* @__PURE__ */ new Date()).getTime(); let O = 1; const G = () => (O++, W() + "_" + O); function X(e, t) { let n, a = null, s = 0; return function() { n = this, a = arguments; let r = W(); if (r - s > t) { s = r, e.apply(n, a), n = a = null; return; } }; } const ee = async (e) => new Promise((t) => { setTimeout(() => { t(""); }, e); }), te = async (e) => { let t = e; if (!t()) return new Promise((n) => { function a() { if (t()) { n(!0); return; } setTimeout(() => { a(); }, 1); } a(); }); }, ne = (e, t) => { let n = t; try { n = JSON.parse(e); } catch { n = t; } return n; }, ae = (e, t) => { let n = e, a = 0; for (let o = 0; o < n.length; o++) n.charCodeAt(o) > 127 ? a += 2 : a += 1; let s = t; for (; a < s; a += 2) n += " "; return n; }, d = { parseInt: $, getTime: W, getId: G, debounce: X, sleep: ee, simpleUntilTrue: te, jsonParse: ne, labelPad: ae }; c._window_info = { webContentsId: -1, type: "", uniqueId: "", args: {} }; c._deal_window_info = () => { let e = window; if (!e.___NODE_DDK_WINDOW_INFO___) return; c._window_info = e.___NODE_DDK_WINDOW_INFO___; let t = c._window_info; t.args = t.args || {}; }; const se = () => { let e = window.location.href.split("?", 2); if (e.length < 2) return; let t = e[1]; if (t.length < 1) return; let n = window; n.___NODE_DDK_WINDOW_INFO___ = d.jsonParse(decodeURIComponent(t), c._window_info), c._deal_window_info(); }; se(); const S = () => c._window_info, oe = async (e) => { let t = e.type, n = e.uniqueId || d.getId(), a = window.location.href, s = e.args || {}, o = e.features || ""; o.length && (o += ","); let r = S(), u = { appName: r.appName, appVersion: r.appVersion, devMode: r.devMode, windowOpen: !0, type: t, uniqueId: n, args: s }, g = encodeURIComponent(JSON.stringify(u)); a = a.split("?", 2)[0] + "?" + g, e.aboutBlankMode && (a = "about:blank"), o += "_NODE_DDK_20240811_=" + t; let f = window.open(a, e.frameName, o); return f ? (f.addEventListener("load", () => { let _ = e.onClose; _ && f && f.addEventListener("unload", () => { setTimeout(() => { _(); }, 1); }); }), f) : null; }, ie = async (e) => { let t = e.uniqueId; t === void 0 && (t = d.getId()); let n = e.args; n === void 0 && (n = {}); let a = await i.request({ module: "DDK:createWindow", data: { type: e.type, uniqueId: t, args: n } }), s = !0; return a.status != "OK" && (s = !1), s; }, l = async (e, t) => (await i.request({ toWindowUniqueId: t ? t.windowUniqueId : void 0, module: "DDK:" + e, data: {} })).status === "OK", re = async (e) => l("closeWindow", e), le = async (e) => l("forcedCloseWindow", e), de = async (e) => l("hideWindow", e), ue = async (e) => l("showWindow", e), ce = async (e) => l("startFlashWindow", e), we = async (e) => l("stopFlashWindow", e), fe = async (e) => l("setTitle", e), me = async (e) => { let t = await i.request({ toWindowUniqueId: e ? e.windowUniqueId : void 0, module: "DDK:getTitle", data: {} }); return t.status === "OK" ? t.data.title + "" : ""; }, De = async (e) => (await i.request({ toWindowUniqueId: e ? e.windowUniqueId : void 0, module: "DDK:operateWindowStepByStep", data: { steps: e.steps } })).status === "OK", pe = async (e) => l("maximizeWindow", e), ye = async (e) => l("unmaximizeWindow", e), ge = async (e) => { let t = await i.request({ toWindowUniqueId: e ? e.windowUniqueId : void 0, module: "DDK:maximizeSwitchWindow", data: {} }); return t.status === "OK" ? t.data.isMaximized === !0 : !1; }, he = async (e) => l("minimizeWindow", e), We = async (e) => l("restoreWindow", e), _e = async (e) => l("setWindowFullscreen", e), Ie = async (e) => l("unsetWindowFullscreen", e), Oe = async (e) => l("setWindowAlwaysOnTop", e), qe = async (e) => l("unsetWindowAlwaysOnTop", e), Ke = async (e) => (await i.request({ toWindowUniqueId: e.windowUniqueId, module: "DDK:setWindowRectangle", data: { ...e } })).status === "OK", be = async (e) => { let t = await i.request({ toWindowUniqueId: e ? e.windowUniqueId : void 0, module: "DDK:getWindowRectangle", data: {} }); if (t.status === "OK") return t.data; }, ke = async (e) => (await i.request({ toWindowUniqueId: e ? e.windowUniqueId : void 0, module: "DDK:setWindowCenter", data: { ...e } })).status === "OK", Fe = async () => await i.request({ module: "DDK:getAllWindowStatistics", data: {} }), Ce = async (e) => l("activeWindowAndFocus", e), ve = async (e) => { typeof e == "number" && (e = { factor: e }); let t = await i.request({ toWindowUniqueId: e.windowUniqueId, module: "DDK:setWindowZoomFactor", data: { factor: e.factor } }), n = -1; return t.status === "OK" && (n = t.data.factor), n; }, Se = async (e) => { typeof e == "number" && (e = { factor: e }); let t = await i.request({ toWindowUniqueId: e.windowUniqueId, module: "DDK:increaseWindowZoomFactor", data: { factor: e.factor } }), n = -1; return t.status === "OK" && (n = t.data.factor), n; }, Te = async () => { let e = await i.request({ module: "DDK:getWindowZoomFactor", data: {} }), t; return e.status != "OK" ? t = -1 : t = e.data.factor, t < 0 && (t = 1), t; }; let q = null; const Me = async (e) => { (await i.request({ module: "DDK:registerBeforeunloadOnce", data: {} })).status == "OK" && (q = e, i.registerMessageReceiver("DDK:beforeunloadOnce", async (n) => { let a = !1; try { await q() !== !1 && (a = !0); } catch { a = !0; } a && await i.request({ module: "DDK:forcedCloseWindow", data: {} }); })); }; let K = !1, b; const Ue = async (e) => { b = e, !(K || (K = !0, (await i.request({ module: "DDK:registerMaximizeState", data: {} })).status != "OK")) && i.registerMessageReceiver("DDK:maximizeState", async (n) => { b(n.isMaximized); }); }, D = { getInfo: S, openModal: oe, create: ie, close: re, forcedClose: le, hide: de, show: ue, startFlash: ce, stopFlash: we, setTitle: fe, getTitle: me, operateWindowStepByStep: De, maximize: pe, unmaximize: ye, maximizeSwitch: ge, minimize: he, restore: We, setWindowFullscreen: _e, unsetWindowFullscreen: Ie, setWindowAlwaysOnTop: Oe, unsetWindowAlwaysOnTop: qe, setRectangle: Ke, getRectangle: be, setCenter: ke, getAllWindowStatistics: Fe, activeAndFocus: Ce, setZoomFactor: ve, increaseZoomFactor: Se, getZoomFactor: Te, registerBeforeunloadOnce: Me, registerMaximizeState: Ue }, Re = async () => { let e = D.getInfo(); e.windowOpen === !0 && await i.request({ module: "DDK:registerWindowOpen", data: { type: e.type, uniqueId: e.uniqueId } }); }, xe = async () => (Re(), new Promise((e) => { let t = window; if (t.___NODE_DDK_WINDOW_INFO___) { c._deal_window_info(), e(); return; } t.___NODE_DDK_WINDOW_INFO_DEAL___ = () => { c._deal_window_info(), e(); }; })), Ee = async () => { window.nodeDDkWorld.send("app-quit^ddk-system", {}); }, Ne = () => { window.nodeDDkWorld.send("to-tray^ddk-system", {}); }, Pe = (e) => { window.nodeDDkWorld.startDrag(e); }, Ae = () => { window.nodeDDkWorld.send("open-dev-tools^ddk-system", { open: !0 }); }, m = { appStart: xe, appQuit: Ee, appToTray: Ne, dragSaveFiles: Pe, openDevTools: Ae }; let w = {}; function Le() { let e = d.getTime() - 1e5; Object.keys(w).forEach((t) => { w[t].stamp < e && delete w[t]; }); } const ze = (e, t) => { if (!t) return; let n = null; function a(s) { s.forEach((o) => { if (!n) { if (!o.separator) { n = o; return; } a(o.submenu || []); } }); } a(e), n && (n.label = d.labelPad(n.label, t)); }; let k = !1; const Be = () => { k || (k = !0, i.registerMessageReceiver("DDK:systemMenuEvent", He)); }, Ze = (e) => { Le(), Be(); let t = {}; t.position = e.position; let n = d.getId(); t.menuId = n; let a = {}; w[n] = a, a.stamp = d.getTime(), a.afterClose = e.afterClose; function s(o) { return o = [...o], o.forEach((r) => { if (r.clickId = "", r.submenu && (r.submenu = s(r.submenu)), r.click) { let u = d.getId(); r.clickId = u, a[u] = r.click, delete r.click; } r.separator === !0 && (r.type = "separator"); }), o; } t.menus = s(e.menus), ze(t.menus, e.minAbcCharLength || 0), i.request({ module: "DDK:systemMenuEvent", data: t }); }, He = async (e) => { let t = e.menuId, n = w[t]; if (!n) return; let a = e.clickId, s = n[a]; a == "afterClose" ? delete w[t] : n.afterClose ? w[t] = { afterClose: n.afterClose } : delete w[t], s && s(e); }; let T = { show: Ze }; ({ ...T }); const je = async (e) => (e = e || {}, await i.request({ module: "DDK:startTrayFlashing", data: { ...e } }), !0), Ye = async () => (await i.request({ module: "DDK:stopTrayFlashing", data: {} }), !0), Je = async (e) => (typeof e == "string" && (e = { tooltip: e }), await i.request({ module: "DDK:setToolTip", data: { ...e } }), !0); let M = { startFlashing: je, stopFlashing: Ye, setToolTip: Je }; ({ ...M }); const Qe = async (e) => { e = e || {}; let t = await i.request({ module: "DDK:systemNotification", data: { ...e } }); return t.status != "OK" ? "error" : t.data.type + "" == "click" ? "click" : "cancel"; }; let U = { notify: Qe }; ({ ...U }); let Ve = String.raw` let stamp = (new Date()).getTime() const getStreamFromUserMedia = (sourceid) => { return new Promise(resolve => { navigator.mediaDevices.getUserMedia({ video: { mandatory: { chromeMediaSource: "desktop", chromeMediaSourceId: sourceid, }, }, }).then((stream) => { resolve(stream) }).catch((error) => { resolve(null) }) }) } async function sendResult(imageData) { window._image_data_ = imageData + "" window.close() } async function completeCallback(imageInfo) { await sendResult(imageInfo.base64) } async function closeCallback() { await sendResult("") } function setWindowFullscreen() { let req = {} let sn = 'R' + stamp + (new Date()).getTime() req.sn = sn req.module = "DDK:setWindowFullscreen" req.data = {} window.nodeDDkWorld.invoke(req.module + "^ddk-module", req) } function triggerCallback(res) { if (res.code == 0) { setWindowFullscreen() let o = document.getElementById("screenShotContainer") if (o) { o.style.cursor = "crosshair" } } } async function doScreenShot() { let options = { // enableWebRtc: true, // screenFlow: stream, // imgSrc: imageData, canvasWidth: screen.width - 2, canvasHeight: screen.height - 2, position: { left: 1, top: 1 }, level: 999, useRatioArrow: false, showScreenData: true, triggerCallback: triggerCallback, completeCallback: completeCallback, closeCallback: closeCallback, cancelCallback: closeCallback, writeBase64: true, hiddenToolIco: { save: true, undo: false, confirm: false }, imgAutoFit: true, } let imageData = infos.imageData if (imageData) { options.enableWebRtc = false options.imgSrc = imageData } else { options.enableWebRtc = true options.wrcReplyTime = 100 options.screenFlow = await getStreamFromUserMedia(infos.sourceId) } new screenShotPlugin(options); } `; const $e = async (e, t) => { let n = await i.request({ module: "DDK:desktopCapturerScreenshot", data: {} }); if (n.status != "OK") return ""; let a = {}; a.sourceId = n.data.sourceId, a.imageData = n.data.imageData; let s = await D.openModal({ type: "DDK_desktopCapturerScreenshot", aboutBlankMode: !0 }); if (!s) return ""; let o = '<!DOCTYPE html><HTML style="width:100%;height:100%;overflow:hidden;">'; o += "<HEAD>", o += "<TITLE>截屏</TITLE>", o += '<META CHARSET="utf-8"><META HTTP-EQUIV="X-UA-Compatible">', o += '<style type="text/css">BODY #screenShotContainer {cursor:none}</style>', o += "<script> var infos=" + JSON.stringify(a) + "<\/script>", o += "</HEAD>", o += '<BODY onload="doScreenShot();" style="width:100%;height:100%;overflow:hidden;margin:0px;background:transparent">', o += "</BODY>", o += '<script src="' + e + '"><\/script>', o += "<script>" + Ve + "<\/script>", o += "</HTML>"; let r = s.document; return r.open(), r.write(o), r.close(), new Promise((u) => { s.addEventListener("load", () => { s.addEventListener("unload", () => { let g = s._image_data_ || ""; u(g + ""); }); }); }); }, Ge = async (e, t) => { t = t || {}; let n = t.hideMe === !0, a = t.hideCursor !== !1, s; if (a && !n) { s = document.createElement("style"); try { document.head.appendChild(s), s.sheet.insertRule("BODY * { cursor: none; }", 0), await d.sleep(10); } catch { } } n && (await D.minimize(), await d.sleep(10)); let o = await $e(e); if (a && s) try { s.remove(); } catch { } return n && await D.activeAndFocus(), o; }; let R = { screenshot: Ge }; ({ ...R }); const Xe = async (e) => { e = { ...e }; let t = await i.request({ module: "DDK:openLocalFile", data: e }); return t.status === "OK" && t.data.status === "OK"; }, et = async (e) => { e = { ...e }; let t = await i.request({ module: "DDK:openUrl", data: e }); return t.status === "OK" && t.data.status === "OK"; }; let x = { openLocalFile: Xe, openUrl: et }; ({ ...x }); const p = async (e) => { let t = await i.request({ module: "DDK:showOpenDialog", data: e }), n = []; return t.status === "OK" && (n = t.data.fileList), n; }, tt = async (e) => { e = { ...e }; let t = e; t.openFile = !0; let n = "", a = await p(t); return a.length && (n = a[0]), n; }, nt = async (e) => { e = { ...e }; let t = e; t.openDirectory = !0, t.multiSelections = !0; let n = "", a = await p(t); return a.length && (n = a[0]), n; }, at = async (e) => { e = { ...e }; let t = e; return t.openFile = !0, t.multiSelections = !0, p(t); }, st = async (e) => { e = { ...e }; let t = e; return t.openDirectory = !0, t.multiSelections = !0, p(t); }, ot = async (e) => { e = { ...e }; let t = await i.request({ module: "DDK:showSaveDialog", data: e }), n = ""; return t.status === "OK" && (n = t.data.filePath), n; }, it = async (e) => { e = { ...e }; let t = e; t.openDirectory = !0; let n = "", a = await p(t); return a.length && (n = a[0]), n; }, E = async (e) => { e = { ...e }; let t = e.minAbcCharLength || 32, n = e.message.split(` `); n[0] = d.labelPad(n[0], t), n.unshift(""), e.checkboxChecked || n.push(""), e.message = n.join(` `); let a = await i.request({ module: "DDK:showMessageBox", data: e }), s = { response: 0, checkboxChecked: !1 }; return a.status != "OK" || (s.response = a.data.response, s.checkboxChecked = a.data.checkboxChecked), s; }, rt = async (e) => { let t = { ...e }; return t.buttons = [e.okLabel || "确定"], await E(t), ""; }; let N = { getOneOpenFile: tt, getOneOpenDir: nt, getOpenFileList: at, getOpenDirList: st, getOneSaveFile: ot, getOneSaveDir: it, showMessageBox: E, alert: rt }; ({ ...N }); const lt = async (e) => { let t = { status: "OK", type: "other", size: 0, ctime: 0, mtime: 0 }, n = await i.request({ module: "DDK:getFileInfo", data: { filePath: e + "" } }); return n.status !== "OK" ? t : n.data.fileInfo; }, dt = async (e) => { let t = await i.request({ module: "DDK:getFileInfoList", data: { filePathList: [...e] } }); return t.status !== "OK" ? {} : t.data.fileInfos; }; let P = { getFileInfo: lt, getFileInfoList: dt }; ({ ...P }); const ut = async (e) => { let t = await i.request({ module: "DDK:findInPage", data: { ...e } }); return t.status !== "OK" ? { matches: -1, sn: -1 } : t.data.result; }, ct = async () => { (await i.request({ module: "DDK:stopFindInPage", data: {} })).status; }; let A = { find: ut, stop: ct }; ({ ...A }); let wt = { start: m.appStart, quit: m.appQuit, toTray: m.appToTray, dragSaveFiles: m.dragSaveFiles, openDevTools: m.openDevTools }; const ft = { app: wt, ipc: v, window: D, systemMenu: T, tray: M, systemNotification: U, desktopCapturer: R, shell: x, dialog: N, fs: P, findInPage: A }; export { ft as default };