node-ddk
Version:
759 lines (751 loc) • 18.9 kB
JavaScript
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
};