From 7d9f1e00e5194ed6be90f7ac56a1893e1b7f251c Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 4 Jan 2023 09:02:29 -0500 Subject: [PATCH] Fix injecting side effects by using more injectables Signed-off-by: Sebastian Malton --- src/main/catalog-pusher.ts | 32 ------------------- ...adcaster.global-override-for-injectable.ts | 10 ++++++ .../broadcaster.injectable.ts | 29 +++++++++++++++++ .../catalog-sync-to-renderer.injectable.ts | 25 ++++++++++++--- .../push-catalog-to-renderer.injectable.ts | 20 ++++++++++++ ...tron-app.global-override-for-injectable.ts | 27 +++++++++------- .../setup-ipc-main-handlers.injectable.ts | 6 ++-- .../setup-ipc-main-handlers.ts | 9 ++---- 8 files changed, 102 insertions(+), 56 deletions(-) delete mode 100644 src/main/catalog-pusher.ts create mode 100644 src/main/catalog-sync-to-renderer/broadcaster.global-override-for-injectable.ts create mode 100644 src/main/catalog-sync-to-renderer/broadcaster.injectable.ts create mode 100644 src/main/catalog-sync-to-renderer/push-catalog-to-renderer.injectable.ts diff --git a/src/main/catalog-pusher.ts b/src/main/catalog-pusher.ts deleted file mode 100644 index 7802a0455d..0000000000 --- a/src/main/catalog-pusher.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { reaction } from "mobx"; -import { broadcastMessage, ipcMainOn } from "../common/ipc"; -import type { CatalogEntityRegistry } from "./catalog"; -import "../common/catalog-entities/kubernetes-cluster"; -import { disposer, toJS } from "../common/utils"; -import { debounce } from "lodash"; -import type { CatalogEntity } from "../common/catalog"; -import { catalogInitChannel, catalogItemsChannel } from "../common/ipc/catalog"; - -const broadcaster = debounce((items: CatalogEntity[]) => { - broadcastMessage(catalogItemsChannel, items); -}, 100, { leading: true, trailing: true }); - -export function pushCatalogToRenderer(catalog: CatalogEntityRegistry) { - broadcaster(toJS(catalog.items)); -} - -export function startCatalogSyncToRenderer(catalog: CatalogEntityRegistry) { - return disposer( - ipcMainOn(catalogInitChannel, () => broadcaster(toJS(catalog.items))), - reaction(() => toJS(catalog.items), (items) => { - broadcaster(items); - }, { - fireImmediately: true, - }), - ); -} diff --git a/src/main/catalog-sync-to-renderer/broadcaster.global-override-for-injectable.ts b/src/main/catalog-sync-to-renderer/broadcaster.global-override-for-injectable.ts new file mode 100644 index 0000000000..fce2e7d2eb --- /dev/null +++ b/src/main/catalog-sync-to-renderer/broadcaster.global-override-for-injectable.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { debounce } from "lodash"; +import { getGlobalOverride } from "../../common/test-utils/get-global-override"; +import catalogSyncBroadcasterInjectable from "./broadcaster.injectable"; + +export default getGlobalOverride(catalogSyncBroadcasterInjectable, () => debounce(() => {})); diff --git a/src/main/catalog-sync-to-renderer/broadcaster.injectable.ts b/src/main/catalog-sync-to-renderer/broadcaster.injectable.ts new file mode 100644 index 0000000000..cab7ff86f0 --- /dev/null +++ b/src/main/catalog-sync-to-renderer/broadcaster.injectable.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { debounce } from "lodash"; +import type { CatalogEntity } from "../../common/catalog"; +import broadcastMessageInjectable from "../../common/ipc/broadcast-message.injectable"; +import { catalogItemsChannel } from "../../common/ipc/catalog"; + +const catalogSyncBroadcasterInjectable = getInjectable({ + id: "catalog-sync-broadcaster", + instantiate: (di) => { + const broadcastMessage = di.inject(broadcastMessageInjectable); + + return debounce( + (items: CatalogEntity[]) => { + broadcastMessage(catalogItemsChannel, items); + }, + 100, + { + leading: true, + trailing: true, + }, + ); + }, +}); + +export default catalogSyncBroadcasterInjectable; diff --git a/src/main/catalog-sync-to-renderer/catalog-sync-to-renderer.injectable.ts b/src/main/catalog-sync-to-renderer/catalog-sync-to-renderer.injectable.ts index a9ba676bf9..6be9826c98 100644 --- a/src/main/catalog-sync-to-renderer/catalog-sync-to-renderer.injectable.ts +++ b/src/main/catalog-sync-to-renderer/catalog-sync-to-renderer.injectable.ts @@ -3,23 +3,40 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { startCatalogSyncToRenderer } from "../catalog-pusher"; +import { reaction } from "mobx"; +import { catalogInitChannel } from "../../common/ipc/catalog"; +import { disposer, toJS } from "../../common/utils"; import { getStartableStoppable } from "../../common/utils/get-startable-stoppable"; import catalogEntityRegistryInjectable from "../catalog/entity-registry.injectable"; +import ipcMainInjectable from "../utils/channel/ipc-main/ipc-main.injectable"; +import catalogSyncBroadcasterInjectable from "./broadcaster.injectable"; const catalogSyncToRendererInjectable = getInjectable({ id: "catalog-sync-to-renderer", instantiate: (di) => { const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable); + const ipcMain = di.inject(ipcMainInjectable); + const catalogSyncBroadcaster = di.inject(catalogSyncBroadcasterInjectable); return getStartableStoppable( "catalog-sync", - () => startCatalogSyncToRenderer(catalogEntityRegistry), + () => { + const initChannelHandler = () => catalogSyncBroadcaster(toJS(catalogEntityRegistry.items)); + + ipcMain.on(catalogInitChannel, initChannelHandler); + + return disposer( + () => ipcMain.off(catalogInitChannel, initChannelHandler), + reaction(() => toJS(catalogEntityRegistry.items), (items) => { + catalogSyncBroadcaster(items); + }, { + fireImmediately: true, + }), + ); + }, ); }, - - causesSideEffects: true, }); export default catalogSyncToRendererInjectable; diff --git a/src/main/catalog-sync-to-renderer/push-catalog-to-renderer.injectable.ts b/src/main/catalog-sync-to-renderer/push-catalog-to-renderer.injectable.ts new file mode 100644 index 0000000000..647922fa53 --- /dev/null +++ b/src/main/catalog-sync-to-renderer/push-catalog-to-renderer.injectable.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { toJS } from "../../common/utils"; +import catalogEntityRegistryInjectable from "../catalog/entity-registry.injectable"; +import catalogSyncBroadcasterInjectable from "./broadcaster.injectable"; + +const pushCatalogToRendererInjectable = getInjectable({ + id: "push-catalog-to-renderer", + instantiate: (di) => { + const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable); + const catalogSyncBroadcaster = di.inject(catalogSyncBroadcasterInjectable); + + return () => catalogSyncBroadcaster(toJS(catalogEntityRegistry.items)); + }, +}); + +export default pushCatalogToRendererInjectable; diff --git a/src/main/electron-app/electron-app.global-override-for-injectable.ts b/src/main/electron-app/electron-app.global-override-for-injectable.ts index c7cc065cb2..3d111cac57 100644 --- a/src/main/electron-app/electron-app.global-override-for-injectable.ts +++ b/src/main/electron-app/electron-app.global-override-for-injectable.ts @@ -6,14 +6,19 @@ import { getGlobalOverride } from "../../common/test-utils/get-global-override"; import electronAppInjectable from "./electron-app.injectable"; -export default getGlobalOverride(electronAppInjectable, () => ({ - getVersion: () => "6.0.0", - setLoginItemSettings: () => {}, - commandLine: { - appendArgument: () => {}, - appendSwitch: () => {}, - getSwitchValue: () => "", - hasSwitch: () => false, - removeSwitch: () => {}, - }, -} as Partial as Electron.App)); +export default getGlobalOverride(electronAppInjectable, () => { + const app = ({ + getVersion: () => "6.0.0", + setLoginItemSettings: () => { }, + on: () => app, + commandLine: { + appendArgument: () => {}, + appendSwitch: () => {}, + getSwitchValue: () => "", + hasSwitch: () => false, + removeSwitch: () => {}, + }, + } as Partial as Electron.App); + + return app; +}); diff --git a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts index d3a604177d..b8a869f7fe 100644 --- a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts +++ b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts @@ -7,10 +7,10 @@ import { setupIpcMainHandlers } from "./setup-ipc-main-handlers"; import loggerInjectable from "../../../../common/logger.injectable"; import clusterStoreInjectable from "../../../../common/cluster-store/cluster-store.injectable"; import { onLoadOfApplicationInjectionToken } from "../../../start-main-application/runnable-tokens/on-load-of-application-injection-token"; -import catalogEntityRegistryInjectable from "../../../catalog/entity-registry.injectable"; import applicationMenuItemCompositeInjectable from "../../../../features/application-menu/main/application-menu-item-composite.injectable"; import emitAppEventInjectable from "../../../../common/app-event-bus/emit-event.injectable"; import getClusterByIdInjectable from "../../../../common/cluster-store/get-by-id.injectable"; +import pushCatalogToRendererInjectable from "../../../catalog-sync-to-renderer/push-catalog-to-renderer.injectable"; const setupIpcMainHandlersInjectable = getInjectable({ id: "setup-ipc-main-handlers", @@ -18,7 +18,7 @@ const setupIpcMainHandlersInjectable = getInjectable({ instantiate: (di) => { const logger = di.inject(loggerInjectable); const applicationMenuItemComposite = di.inject(applicationMenuItemCompositeInjectable); - const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable); + const pushCatalogToRenderer = di.inject(pushCatalogToRendererInjectable); const clusterStore = di.inject(clusterStoreInjectable); const emitAppEvent = di.inject(emitAppEventInjectable); const getClusterById = di.inject(getClusterByIdInjectable); @@ -30,7 +30,7 @@ const setupIpcMainHandlersInjectable = getInjectable({ setupIpcMainHandlers({ applicationMenuItemComposite, - catalogEntityRegistry, + pushCatalogToRenderer, clusterStore, emitAppEvent, getClusterById, diff --git a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts index ea079cd42f..4ae020c42d 100644 --- a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts +++ b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts @@ -9,8 +9,6 @@ import { clusterActivateHandler, clusterSetFrameIdHandler, clusterDisconnectHand import type { ClusterId } from "../../../../common/cluster-types"; import type { ClusterStore } from "../../../../common/cluster-store/cluster-store"; import { broadcastMainChannel, broadcastMessage, ipcMainHandle, ipcMainOn } from "../../../../common/ipc"; -import type { CatalogEntityRegistry } from "../../../catalog"; -import { pushCatalogToRenderer } from "../../../catalog-pusher"; import type { IComputedValue } from "mobx"; import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppMenuAsContextMenuChannel } from "../../../../common/ipc/window"; import { handleWindowAction, onLocationChange } from "../../../ipc/window"; @@ -22,18 +20,18 @@ import type { EmitAppEvent } from "../../../../common/app-event-bus/emit-event.i import type { GetClusterById } from "../../../../common/cluster-store/get-by-id.injectable"; interface Dependencies { applicationMenuItemComposite: IComputedValue>; - catalogEntityRegistry: CatalogEntityRegistry; clusterStore: ClusterStore; emitAppEvent: EmitAppEvent; getClusterById: GetClusterById; + pushCatalogToRenderer: () => void; } export const setupIpcMainHandlers = ({ applicationMenuItemComposite, - catalogEntityRegistry, clusterStore, emitAppEvent, getClusterById, + pushCatalogToRenderer, }: Dependencies) => { ipcMainHandle(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => { return getClusterById(clusterId) @@ -45,8 +43,7 @@ export const setupIpcMainHandlers = ({ if (cluster) { clusterFrameMap.set(cluster.id, { frameId: event.frameId, processId: event.processId }); - - pushCatalogToRenderer(catalogEntityRegistry); + pushCatalogToRenderer(); } });