1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

fix: loading cluster frame + error in loading terminal default font (which was causing network exception error and hidden cluster-view)

fix: proxying websockets (e.g. terminal)

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2022-02-08 15:04:11 +02:00
parent 8a6ef6c9f0
commit 2ef9861d10
4 changed files with 53 additions and 28 deletions

View File

@ -10,7 +10,7 @@ import * as Mobx from "mobx";
import * as LensExtensionsCommonApi from "../extensions/common-api"; import * as LensExtensionsCommonApi from "../extensions/common-api";
import * as LensExtensionsMainApi from "../extensions/main-api"; import * as LensExtensionsMainApi from "../extensions/main-api";
import { app, autoUpdater, dialog, powerMonitor } from "electron"; import { app, autoUpdater, dialog, powerMonitor } from "electron";
import { appName, isIntegrationTesting, isMac, isWindows, productName, isDevelopment } from "../common/vars"; import { appName, isIntegrationTesting, isMac, isWindows, productName } from "../common/vars";
import { LensProxy } from "./lens-proxy"; import { LensProxy } from "./lens-proxy";
import { WindowManager } from "./window-manager"; import { WindowManager } from "./window-manager";
import { ClusterManager } from "./cluster-manager"; import { ClusterManager } from "./cluster-manager";
@ -43,16 +43,23 @@ import { initTray } from "./tray/tray";
import { ShellSession } from "./shell-session/shell-session"; import { ShellSession } from "./shell-session/shell-session";
import { getDi } from "./getDi"; import { getDi } from "./getDi";
import extensionLoaderInjectable from "../extensions/extension-loader/extension-loader.injectable"; import extensionLoaderInjectable from "../extensions/extension-loader/extension-loader.injectable";
import lensProtocolRouterMainInjectable from "./protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable"; import lensProtocolRouterMainInjectable
import extensionDiscoveryInjectable from "../extensions/extension-discovery/extension-discovery.injectable"; from "./protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable";
import directoryForExesInjectable from "../common/app-paths/directory-for-exes/directory-for-exes.injectable"; import extensionDiscoveryInjectable
import initIpcMainHandlersInjectable from "./initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable"; from "../extensions/extension-discovery/extension-discovery.injectable";
import directoryForExesInjectable
from "../common/app-paths/directory-for-exes/directory-for-exes.injectable";
import initIpcMainHandlersInjectable
from "./initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable";
import electronMenuItemsInjectable from "./menu/electron-menu-items.injectable"; import electronMenuItemsInjectable from "./menu/electron-menu-items.injectable";
import directoryForKubeConfigsInjectable from "../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; import directoryForKubeConfigsInjectable
import kubeconfigSyncManagerInjectable from "./catalog-sources/kubeconfig-sync-manager/kubeconfig-sync-manager.injectable"; from "../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable";
import kubeconfigSyncManagerInjectable
from "./catalog-sources/kubeconfig-sync-manager/kubeconfig-sync-manager.injectable";
import clusterStoreInjectable from "../common/cluster-store/cluster-store.injectable"; import clusterStoreInjectable from "../common/cluster-store/cluster-store.injectable";
import routerInjectable from "./router/router.injectable"; import routerInjectable from "./router/router.injectable";
import shellApiRequestInjectable from "./proxy-functions/shell-api-request/shell-api-request.injectable"; import shellApiRequestInjectable
from "./proxy-functions/shell-api-request/shell-api-request.injectable";
import userStoreInjectable from "../common/user-store/user-store.injectable"; import userStoreInjectable from "../common/user-store/user-store.injectable";
import trayMenuItemsInjectable from "./tray/tray-menu-items.injectable"; import trayMenuItemsInjectable from "./tray/tray-menu-items.injectable";
import { createDevServer } from "../../webpack.dev-server"; import { createDevServer } from "../../webpack.dev-server";
@ -170,6 +177,7 @@ di.runSetups().then(() => {
kubeApiRequest, kubeApiRequest,
shellApiRequest, shellApiRequest,
}); });
const devServer = createDevServer(lensProxy.port);
ClusterManager.createInstance().init(); ClusterManager.createInstance().init();
@ -177,7 +185,10 @@ di.runSetups().then(() => {
try { try {
logger.info("🔌 Starting LensProxy"); logger.info("🔌 Starting LensProxy");
await lensProxy.listen(); await Promise.all([
lensProxy.listen(),
devServer?.start(),
]);
} catch (error) { } catch (error) {
dialog.showErrorBox("Lens Error", `Could not start proxy: ${error?.message || "unknown error"}`); dialog.showErrorBox("Lens Error", `Could not start proxy: ${error?.message || "unknown error"}`);
@ -228,10 +239,8 @@ di.runSetups().then(() => {
logger.info("🖥️ Starting WindowManager"); logger.info("🖥️ Starting WindowManager");
const windowManager = WindowManager.createInstance(); const windowManager = WindowManager.createInstance();
if (devServer) {
if (isDevelopment) { // override main content view url to local webpack-dev-server to support HMR / live-reload
const devServer = createDevServer(lensProxy.port);
await devServer.start(); // waiting dev-server to start
windowManager.mainContentUrl = `http://localhost:${devServer.options.port}`; windowManager.mainContentUrl = `http://localhost:${devServer.options.port}`;
} }

View File

@ -136,7 +136,14 @@ export async function bootstrap(di: DependencyInjectionContainer) {
App = (await import("./frames/cluster-frame/cluster-frame")).ClusterFrame; App = (await import("./frames/cluster-frame/cluster-frame")).ClusterFrame;
} }
await initializeApp(rootElem); try {
await initializeApp(rootElem);
} catch (error) {
console.error(`[BOOTSTRAP]: view initialization error: ${error}`, {
origin: location.href,
isTopFrameView: process.isMainFrame,
});
}
render( render(
<DiContextProvider value={{ di }}> <DiContextProvider value={{ di }}>

View File

@ -17,6 +17,7 @@ import { UserStore } from "../../../../common/user-store";
import { clipboard } from "electron"; import { clipboard } from "electron";
import logger from "../../../../common/logger"; import logger from "../../../../common/logger";
import type { TerminalConfig } from "../../../../common/user-store/preferences-helpers"; import type { TerminalConfig } from "../../../../common/user-store/preferences-helpers";
import RobotoMonoFontUrl from "../../fonts/roboto-mono-nerd.ttf";
export class Terminal { export class Terminal {
private terminalConfig: TerminalConfig = UserStore.getInstance().terminalConfig; private terminalConfig: TerminalConfig = UserStore.getInstance().terminalConfig;
@ -26,11 +27,14 @@ export class Terminal {
} }
static async preloadFonts() { static async preloadFonts() {
const fontPath = require("../../fonts/roboto-mono-nerd.ttf").default; // eslint-disable-line @typescript-eslint/no-var-requires try {
const fontFace = new FontFace(defaultTerminalFontFamily, `url(${fontPath})`); const fontFace = new FontFace(defaultTerminalFontFamily, `url(${RobotoMonoFontUrl})`);
await fontFace.load(); await fontFace.load();
document.fonts.add(fontFace); document.fonts.add(fontFace);
} catch (error) {
logger.error(`[TERMINAL]: preloading default font failed`, error);
}
} }
private xterm: XTerm | null = new XTerm({ private xterm: XTerm | null = new XTerm({

View File

@ -6,9 +6,11 @@
import Webpack from "webpack"; import Webpack from "webpack";
import WebpackDevServer from "webpack-dev-server"; import WebpackDevServer from "webpack-dev-server";
import { webpackLensRenderer } from "./webpack.renderer"; import { webpackLensRenderer } from "./webpack.renderer";
import { buildDir, webpackDevServerPort } from "./src/common/vars"; import { buildDir, isDevelopment, webpackDevServerPort } from "./src/common/vars";
import logger from "./src/common/logger"; import logger from "./src/common/logger";
import { getClusterIdFromHost } from "./src/common/utils";
export interface DevServer extends WebpackDevServer {
}
/** /**
* Creates `webpack-dev-server` * Creates `webpack-dev-server`
@ -16,11 +18,18 @@ import { getClusterIdFromHost } from "./src/common/utils";
* @url https://webpack.js.org/configuration/dev-server/ * @url https://webpack.js.org/configuration/dev-server/
* @url https://github.com/chimurai/http-proxy-middleware * @url https://github.com/chimurai/http-proxy-middleware
*/ */
export function createDevServer(lensProxyPort: number): WebpackDevServer { export function createDevServer(lensProxyPort: number): DevServer | undefined {
if (!isDevelopment) {
return undefined;
}
const config = webpackLensRenderer(); const config = webpackLensRenderer();
const compiler = Webpack(config); const compiler = Webpack(config);
const server = new WebpackDevServer({ const server = new WebpackDevServer({
headers: {
"Access-Control-Allow-Origin": "*",
},
allowedHosts: "all", allowedHosts: "all",
host: "localhost", host: "localhost",
port: webpackDevServerPort, port: webpackDevServerPort,
@ -29,17 +38,13 @@ export function createDevServer(lensProxyPort: number): WebpackDevServer {
proxy: { proxy: {
'*': { '*': {
router(req) { router(req) {
logger.info(`[WEBPACK-DEV-SERVER]: proxy path ${req.path}`, req.headers); logger.silly(`[WEBPACK-DEV-SERVER]: proxy path ${req.path}`, req.headers);
const clusterId = getClusterIdFromHost(req.headers.host);
if (clusterId) {
return `http://${clusterId}.localhost:${lensProxyPort}`;
}
return `http://localhost:${lensProxyPort}`; return `http://localhost:${lensProxyPort}`;
}, },
secure: false, // allow http connections secure: false, // allow http connections
logLevel: "debug", ws: true, // proxy websockets, e.g. terminal
logLevel: "error",
} }
}, },
client: { client: {