mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
136 lines
4.4 KiB
TypeScript
136 lines
4.4 KiB
TypeScript
// Main process
|
|
|
|
import "../common/system-ca"
|
|
import "../common/prometheus-providers"
|
|
import { app, dialog, protocol } from "electron"
|
|
import { PromiseIpc } from "electron-promise-ipc"
|
|
import path from "path"
|
|
import { format as formatUrl } from "url"
|
|
import logger from "./logger"
|
|
import initMenu from "./menu"
|
|
import * as proxy from "./proxy"
|
|
import { WindowManager } from "./window-manager";
|
|
import { clusterStore } from "../common/cluster-store"
|
|
import { tracker } from "./tracker"
|
|
import { ClusterManager } from "./cluster-manager";
|
|
import AppUpdater from "./app-updater"
|
|
import { shellSync } from "./shell-sync"
|
|
import { getFreePort } from "./port"
|
|
import { mangleProxyEnv } from "./proxy-env"
|
|
import { findMainWebContents } from "./webcontents"
|
|
import { registerStaticProtocol } from "../common/register-static";
|
|
import { isMac, vueAppName } from "../common/vars";
|
|
|
|
mangleProxyEnv()
|
|
if (app.commandLine.getSwitchValue("proxy-server") !== "") {
|
|
process.env.HTTPS_PROXY = app.commandLine.getSwitchValue("proxy-server")
|
|
}
|
|
|
|
const promiseIpc = new PromiseIpc({ timeout: 2000 })
|
|
let windowManager: WindowManager = null;
|
|
let clusterManager: ClusterManager = null;
|
|
let proxyServer: proxy.LensProxy = null;
|
|
|
|
const vmURL = formatUrl({
|
|
pathname: path.join(__dirname, `${vueAppName}.html`),
|
|
protocol: "file",
|
|
slashes: true,
|
|
})
|
|
|
|
async function main() {
|
|
shellSync(app.getLocale())
|
|
|
|
const updater = new AppUpdater()
|
|
updater.start();
|
|
|
|
tracker.event("app", "start");
|
|
|
|
registerStaticProtocol();
|
|
protocol.registerFileProtocol('store', (request, callback) => {
|
|
const url = request.url.substr(8)
|
|
callback(path.normalize(`${app.getPath("userData")}/${url}`))
|
|
}, (error) => {
|
|
if (error) console.error('Failed to register protocol')
|
|
})
|
|
|
|
let port: number = null
|
|
// find free port
|
|
try {
|
|
port = await getFreePort()
|
|
} catch (error) {
|
|
logger.error(error)
|
|
await dialog.showErrorBox("Lens Error", "Could not find a free port for the cluster proxy")
|
|
app.quit();
|
|
}
|
|
|
|
// create cluster manager
|
|
clusterManager = new ClusterManager(clusterStore.getAllClusterObjects(), port)
|
|
// run proxy
|
|
try {
|
|
proxyServer = proxy.listen(port, clusterManager)
|
|
} catch (error) {
|
|
logger.error(`Could not start proxy (127.0.0:${port}): ${error.message}`)
|
|
await dialog.showErrorBox("Lens Error", `Could not start proxy (127.0.0:${port}): ${error.message || "unknown error"}`)
|
|
app.quit();
|
|
}
|
|
|
|
// boot windowmanager
|
|
windowManager = new WindowManager();
|
|
windowManager.showMain(vmURL)
|
|
|
|
initMenu({
|
|
logoutHook: async () => {
|
|
// IPC send needs webContents as we're sending it to renderer
|
|
promiseIpc.send('logout', findMainWebContents(), {}).then((data: any) => {
|
|
logger.debug("logout IPC sent");
|
|
})
|
|
},
|
|
showPreferencesHook: async () => {
|
|
// IPC send needs webContents as we're sending it to renderer
|
|
promiseIpc.send('navigate', findMainWebContents(), { name: 'preferences-page' }).then((data: any) => {
|
|
logger.debug("navigate: preferences IPC sent");
|
|
})
|
|
},
|
|
addClusterHook: async () => {
|
|
promiseIpc.send('navigate', findMainWebContents(), { name: "add-cluster-page" }).then((data: any) => {
|
|
logger.debug("navigate: add-cluster-page IPC sent");
|
|
})
|
|
},
|
|
showWhatsNewHook: async () => {
|
|
promiseIpc.send('navigate', findMainWebContents(), { name: "whats-new-page" }).then((data: any) => {
|
|
logger.debug("navigate: whats-new-page IPC sent");
|
|
})
|
|
},
|
|
clusterSettingsHook: async () => {
|
|
promiseIpc.send('navigate', findMainWebContents(), { name: "cluster-settings-page" }).then((data: any) => {
|
|
logger.debug("navigate: cluster-settings-page IPC sent");
|
|
})
|
|
},
|
|
}, promiseIpc)
|
|
}
|
|
|
|
app.on("ready", main)
|
|
app.on('window-all-closed', function () {
|
|
// On OS X it is common for applications and their menu bar
|
|
// to stay active until the user quits explicitly with Cmd + Q
|
|
if (!isMac) {
|
|
app.quit();
|
|
} else {
|
|
windowManager = null
|
|
if (clusterManager) clusterManager.stop()
|
|
}
|
|
})
|
|
app.on("activate", () => {
|
|
if (!windowManager) {
|
|
logger.debug("activate main window")
|
|
windowManager = new WindowManager({ showSplash: false })
|
|
windowManager.showMain(vmURL)
|
|
}
|
|
})
|
|
app.on("will-quit", async (event) => {
|
|
event.preventDefault(); // To allow mixpanel sending to be executed
|
|
if (clusterManager) clusterManager.stop()
|
|
if (proxyServer) proxyServer.close()
|
|
app.exit(0);
|
|
})
|