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"; return "invalid protocol";
case RoutingErrorType.INVALID_PATHNAME: case RoutingErrorType.INVALID_PATHNAME:
return "invalid pathname"; return "invalid pathname";
case RoutingErrorType.NO_HANDLER:
return "no handler";
case RoutingErrorType.NO_EXTENSION_ID: case RoutingErrorType.NO_EXTENSION_ID:
return "no extension ID"; return "no extension ID";
case RoutingErrorType.MISSING_EXTENSION: 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 routes the array of (path schemas, handler) paris to match against
* @param url the url (in its current state) * @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); const route = this._findMatchingRoute(routes, url);
if (!route) { 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; const [match, handler] = route;
@ -198,7 +204,7 @@ export abstract class LensProtocolRouter extends Singleton {
.map<[string, RouteHandler]>(({ pathSchema, handler }) => [pathSchema, handler]); .map<[string, RouteHandler]>(({ pathSchema, handler }) => [pathSchema, handler]);
try { try {
this._route(handlers, url); this._route(handlers, url, extension.name);
} catch (error) { } catch (error) {
if (error instanceof RoutingError) { if (error instanceof RoutingError) {
error.extensionName = extension.name; error.extensionName = extension.name;

View File

@ -70,12 +70,16 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter {
} }
protected _routeToInternal(url: Url): void { protected _routeToInternal(url: Url): void {
const rawUrl = url.toString(); // for sending to renderer
super._routeToInternal(url); super._routeToInternal(url);
broadcastMessage(proto.ProtocolHandlerInternal, url); broadcastMessage(proto.ProtocolHandlerInternal, rawUrl);
} }
protected async _routeToExtension(url: Url): Promise<void> { 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 * This needs to be done first, so that the missing extension handlers can
* be called before notifying the renderer. * be called before notifying the renderer.
@ -85,7 +89,7 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter {
*/ */
await super._routeToExtension(new Url(url.toString(), true)); 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 { extensionLoader } from "../extensions/extension-loader";
import { broadcastMessage } from "../common/ipc"; import { broadcastMessage } from "../common/ipc";
import { CommandContainer } from "./components/command-palette/command-container"; import { CommandContainer } from "./components/command-palette/command-container";
import { LensProtocolRouterRenderer } from "./protocol-handler/router";
@observer @observer
export class LensApp extends React.Component { export class LensApp extends React.Component {
static async init() { static async init() {
extensionLoader.loadOnClusterManagerRenderer(); extensionLoader.loadOnClusterManagerRenderer();
LensProtocolRouterRenderer.getInstance<LensProtocolRouterRenderer>().init();
window.addEventListener("offline", () => { window.addEventListener("offline", () => {
broadcastMessage("network:offline"); broadcastMessage("network:offline");
}); });

View File

@ -1,6 +1,9 @@
import { ipcRenderer } from "electron"; import { ipcRenderer } from "electron";
import * as proto from "../../common/protocol-handler"; import * as proto from "../../common/protocol-handler";
import logger from "../../main/logger"; import logger from "../../main/logger";
import Url from "url-parse";
import { autobind } from "../utils";
export class LensProtocolRouterRenderer extends proto.LensProtocolRouter { export class LensProtocolRouterRenderer extends proto.LensProtocolRouter {
/** /**
* This function is needed to be called early on in the renderers lifetime. * 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); .on(proto.ProtocolHandlerExtension, this.ipcExtensionHandler);
} }
@autobind()
private ipcInternalHandler(event: Electron.IpcRendererEvent, ...args: any[]): void { private ipcInternalHandler(event: Electron.IpcRendererEvent, ...args: any[]): void {
if (args.length !== 1) { if (args.length !== 1) {
return void logger.warn(`${proto.LensProtocolRouter.LoggingPrefix}: unexpected number of args`, { args }); 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 { private ipcExtensionHandler(event: Electron.IpcRendererEvent, ...args: any[]): void {
if (args.length !== 1) { if (args.length !== 1) {
return void logger.warn(`${proto.LensProtocolRouter.LoggingPrefix}: unexpected number of args`, { args }); 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);
} }
} }