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

reintroduce renderer routing

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2021-01-22 10:00:45 -05:00
parent 6c4c2b714b
commit 4a98d9717d
5 changed files with 30 additions and 9 deletions

View File

@ -27,8 +27,6 @@ export class RoutingError extends Error {
return "invalid protocol";
case RoutingErrorType.INVALID_PATHNAME:
return "invalid pathname";
case RoutingErrorType.NO_HANDLER:
return "no handler";
case RoutingErrorType.NO_EXTENSION_ID:
return "no extension ID";
case RoutingErrorType.MISSING_EXTENSION:

View File

@ -110,11 +110,17 @@ export abstract class LensProtocolRouter extends Singleton {
* @param routes the array of (path schemas, handler) paris to match against
* @param url the url (in its current state)
*/
protected _route(routes: [string, RouteHandler][], url: Url): void {
protected _route(routes: [string, RouteHandler][], url: Url, extensionName?: string): void {
const route = this._findMatchingRoute(routes, url);
if (!route) {
throw new RoutingError(RoutingErrorType.NO_HANDLER, url);
const data: Record<string, string> = { url: url.toString() };
if (extensionName) {
data.extensionName = extensionName;
}
return void logger.info(`${LensProtocolRouter.LoggingPrefix}: No handler found`, data);
}
const [match, handler] = route;
@ -198,7 +204,7 @@ export abstract class LensProtocolRouter extends Singleton {
.map<[string, RouteHandler]>(({ pathSchema, handler }) => [pathSchema, handler]);
try {
this._route(handlers, url);
this._route(handlers, url, extension.name);
} catch (error) {
if (error instanceof RoutingError) {
error.extensionName = extension.name;

View File

@ -70,12 +70,16 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter {
}
protected _routeToInternal(url: Url): void {
const rawUrl = url.toString(); // for sending to renderer
super._routeToInternal(url);
broadcastMessage(proto.ProtocolHandlerInternal, url);
broadcastMessage(proto.ProtocolHandlerInternal, rawUrl);
}
protected async _routeToExtension(url: Url): Promise<void> {
const rawUrl = url.toString(); // for sending to renderer
/**
* This needs to be done first, so that the missing extension handlers can
* be called before notifying the renderer.
@ -85,7 +89,7 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter {
*/
await super._routeToExtension(new Url(url.toString(), true));
broadcastMessage(proto.ProtocolHandlerExtension, url);
broadcastMessage(proto.ProtocolHandlerExtension, rawUrl);
}
/**

View File

@ -12,11 +12,13 @@ import { ConfirmDialog } from "./components/confirm-dialog";
import { extensionLoader } from "../extensions/extension-loader";
import { broadcastMessage } from "../common/ipc";
import { CommandContainer } from "./components/command-palette/command-container";
import { LensProtocolRouterRenderer } from "./protocol-handler/router";
@observer
export class LensApp extends React.Component {
static async init() {
extensionLoader.loadOnClusterManagerRenderer();
LensProtocolRouterRenderer.getInstance<LensProtocolRouterRenderer>().init();
window.addEventListener("offline", () => {
broadcastMessage("network:offline");
});

View File

@ -1,6 +1,9 @@
import { ipcRenderer } from "electron";
import * as proto from "../../common/protocol-handler";
import logger from "../../main/logger";
import Url from "url-parse";
import { autobind } from "../utils";
export class LensProtocolRouterRenderer extends proto.LensProtocolRouter {
/**
* This function is needed to be called early on in the renderers lifetime.
@ -11,19 +14,27 @@ export class LensProtocolRouterRenderer extends proto.LensProtocolRouter {
.on(proto.ProtocolHandlerExtension, this.ipcExtensionHandler);
}
@autobind()
private ipcInternalHandler(event: Electron.IpcRendererEvent, ...args: any[]): void {
if (args.length !== 1) {
return void logger.warn(`${proto.LensProtocolRouter.LoggingPrefix}: unexpected number of args`, { args });
}
console.log(args[0]);
const [rawUrl] = args;
const url = new Url(rawUrl, true);
this._routeToInternal(url);
}
@autobind()
private ipcExtensionHandler(event: Electron.IpcRendererEvent, ...args: any[]): void {
if (args.length !== 1) {
return void logger.warn(`${proto.LensProtocolRouter.LoggingPrefix}: unexpected number of args`, { args });
}
console.log(args[0]);
const [rawUrl] = args;
const url = new Url(rawUrl, true);
this._routeToExtension(url);
}
}