import { app, BrowserWindow, ipcMain, WebContents } from "electron"; import program = require("commander"); import { IElectronWindowParams } from "./ElectronWindow"; import path = require("path"); program.option("-u, --user-data-dir ", "User data dir").parse(process.argv); if (program.userDataDir) { app.setPath("userData", path.resolve(program.userDataDir)); } if (!process.send) { app.exit(2); process.exit(2); } const send: NonNullable = (process.send as any).bind(process); let isExited = false; let wb: WebContents | undefined; ipcMain.on("preload-ready", () => { send("loaded"); }); ipcMain.on("message", (_: any, arg: any) => { send(arg); }); let savedParams: IElectronWindowParams | undefined; process.on("message", async (message: "quit" | ({ type: "loadURL"; params: IElectronWindowParams })) => { if (message === "quit") { isExited = true; app.quit(); return; } if (message.type === "loadURL" && !wb) { const params = message.params; savedParams = params; const br = new BrowserWindow(params.browserWindowOptions); if (params.openDevTools === true) { br.webContents.openDevTools(); } const proxy = params.proxy; if (proxy) { await new Promise((resolve) => br.webContents.session.setProxy(proxy as any, () => { resolve(); }), ); } br.loadURL(params.url, params.loadURLOptions); br.webContents.on("did-finish-load", () => { br.webContents.send("finish-load"); }); br.webContents.on("crashed", () => processError("crashed")); br.webContents.on("destroyed", () => processError("destroyed")); br.webContents.on("did-fail-load", () => processError("failLoad")); wb = br.webContents; return; } if (!wb) { processError("Not found webcontents for command " + JSON.stringify(message)); return; } wb.send("message", message); }); function processError(err: string) { if (!isExited) { send({ type: "error", error: err }); app.exit(3); } } app.on("login", (event, _, __, ___, callback) => { if (savedParams && savedParams.proxyAuth) { event.preventDefault(); callback(savedParams.proxyAuth.login, savedParams.proxyAuth.password); } }); app.on("window-all-closed", () => { if (!isExited) { processError("allWindowClosed"); } }); app.once("ready", () => { send("ready"); });