From 1437f8a945cdef7fb64296513d73707e9cb873b3 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 23 Jul 2021 15:14:11 -0400 Subject: [PATCH] Fix auto cleanup of Extension's IPC classes (#3505) --- src/extensions/ipc/ipc-main.ts | 19 ++++++++++++++++--- src/extensions/ipc/ipc-renderer.ts | 11 +++++++++-- src/renderer/navigation/events.ts | 4 ++-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/extensions/ipc/ipc-main.ts b/src/extensions/ipc/ipc-main.ts index 5884a3989e..09d26b00fb 100644 --- a/src/extensions/ipc/ipc-main.ts +++ b/src/extensions/ipc/ipc-main.ts @@ -25,11 +25,14 @@ import type { LensMainExtension } from "../lens-main-extension"; import type { Disposer } from "../../common/utils"; import { once } from "lodash"; import { ipcMainHandle } from "../../common/ipc"; +import logger from "../../main/logger"; export abstract class IpcMain extends IpcRegistrar { constructor(extension: LensMainExtension) { super(extension); - extension[Disposers].push(() => IpcMain.resetInstance()); + + // Call the static method on the bottom child class. + extension[Disposers].push(() => (this.constructor as typeof IpcMain).resetInstance()); } /** @@ -40,8 +43,13 @@ export abstract class IpcMain extends IpcRegistrar { */ listen(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; - const cleanup = once(() => ipcMain.removeListener(prefixedChannel, listener)); + const cleanup = once(() => { + logger.info(`[IPC-RENDERER]: removing extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version } }); + return ipcMain.removeListener(prefixedChannel, listener); + }); + + logger.info(`[IPC-RENDERER]: adding extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version } }); ipcMain.addListener(prefixedChannel, listener); this.extension[Disposers].push(cleanup); @@ -56,7 +64,12 @@ export abstract class IpcMain extends IpcRegistrar { handle(channel: string, handler: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any): void { const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; + logger.info(`[IPC-RENDERER]: adding extension handler`, { channel, extension: { name: this.extension.name, version: this.extension.version } }); ipcMainHandle(prefixedChannel, handler); - this.extension[Disposers].push(() => ipcMain.removeHandler(prefixedChannel)); + this.extension[Disposers].push(() => { + logger.info(`[IPC-RENDERER]: removing extension handler`, { channel, extension: { name: this.extension.name, version: this.extension.version } }); + + return ipcMain.removeHandler(prefixedChannel); + }); } } diff --git a/src/extensions/ipc/ipc-renderer.ts b/src/extensions/ipc/ipc-renderer.ts index 0facfb2085..364ebc5d73 100644 --- a/src/extensions/ipc/ipc-renderer.ts +++ b/src/extensions/ipc/ipc-renderer.ts @@ -28,7 +28,9 @@ import { once } from "lodash"; export abstract class IpcRenderer extends IpcRegistrar { constructor(extension: LensRendererExtension) { super(extension); - extension[Disposers].push(() => IpcRenderer.resetInstance()); + + // Call the static method on the bottom child class. + extension[Disposers].push(() => (this.constructor as typeof IpcRenderer).resetInstance()); } /** @@ -41,8 +43,13 @@ export abstract class IpcRenderer extends IpcRegistrar { */ listen(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; - const cleanup = once(() => ipcRenderer.removeListener(prefixedChannel, listener)); + const cleanup = once(() => { + console.info(`[IPC-RENDERER]: removing extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version } }); + return ipcRenderer.removeListener(prefixedChannel, listener); + }); + + console.info(`[IPC-RENDERER]: adding extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version } }); ipcRenderer.addListener(prefixedChannel, listener); this.extension[Disposers].push(cleanup); diff --git a/src/renderer/navigation/events.ts b/src/renderer/navigation/events.ts index f5a9968f4a..eaf3741b34 100644 --- a/src/renderer/navigation/events.ts +++ b/src/renderer/navigation/events.ts @@ -61,7 +61,7 @@ function bindClusterManagerRouteEvents() { // Handle navigation via IPC ipcRendererOn(IpcRendererNavigationEvents.NAVIGATE_IN_APP, (event, url: string) => { - logger.info(`[IPC]: ${event.type}: ${url}`, { currentLocation: location.href }); + logger.info(`[IPC]: navigate to ${url}`, { currentLocation: location.href }); navigate(url); }); } @@ -69,7 +69,7 @@ function bindClusterManagerRouteEvents() { // Handle cluster-view renderer process events within iframes function bindClusterFrameRouteEvents() { ipcRendererOn(IpcRendererNavigationEvents.NAVIGATE_IN_CLUSTER, (event, url: string) => { - logger.info(`[IPC]: ${event.type}: ${url}`, { currentLocation: location.href }); + logger.info(`[IPC]: navigate to ${url}`, { currentLocation: location.href }); navigate(url); }); }