From b0ff94131499d6a368e2b568747a18e98cd244df Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 17 Feb 2023 15:14:57 -0500 Subject: [PATCH] Convert network online/offline to injectable IPC Signed-off-by: Sebastian Malton --- .../src/common/protocol-handler/router.ts | 9 ++---- .../manager/common/logger.injectable.ts | 13 ++++++++ .../src/features/network/common/channels.ts | 14 +++++++++ .../main/offline-listener.injectable.ts | 31 +++++++++++++++++++ .../main/online-listener.injectable.ts | 29 +++++++++++++++++ ...run-setup-emit-network-state.injectable.ts | 22 +++++++++++++ .../send-network-offline.injectable.ts | 18 +++++++++++ .../send-network-online.injectable.ts | 18 +++++++++++ ...rk-state.global-override-for-injectable.ts | 9 ++++++ .../setup-emiting-network-state.injectable.ts | 23 ++++++++++++++ packages/core/src/main/cluster/manager.ts | 24 -------------- .../root-frame/init-root-frame.injectable.ts | 8 ----- 12 files changed, 180 insertions(+), 38 deletions(-) create mode 100644 packages/core/src/features/cluster/manager/common/logger.injectable.ts create mode 100644 packages/core/src/features/network/common/channels.ts create mode 100644 packages/core/src/features/network/main/offline-listener.injectable.ts create mode 100644 packages/core/src/features/network/main/online-listener.injectable.ts create mode 100644 packages/core/src/features/network/renderer/run-setup-emit-network-state.injectable.ts create mode 100644 packages/core/src/features/network/renderer/send-network-offline.injectable.ts create mode 100644 packages/core/src/features/network/renderer/send-network-online.injectable.ts create mode 100644 packages/core/src/features/network/renderer/setup-emiting-network-state.global-override-for-injectable.ts create mode 100644 packages/core/src/features/network/renderer/setup-emiting-network-state.injectable.ts diff --git a/packages/core/src/common/protocol-handler/router.ts b/packages/core/src/common/protocol-handler/router.ts index a5a91ac07e..31b4f41e52 100644 --- a/packages/core/src/common/protocol-handler/router.ts +++ b/packages/core/src/common/protocol-handler/router.ts @@ -17,12 +17,9 @@ import { when } from "mobx"; import type { Logger } from "../logger"; import type { FindExtensionInstanceByName } from "../../features/extensions/loader/common/find-instance-by-name.injectable"; -// IPC channel for protocol actions. Main broadcasts the open-url events to this channel. -export const ProtocolHandlerIpcPrefix = "protocol-handler"; - -export const ProtocolHandlerInternal = `${ProtocolHandlerIpcPrefix}:internal`; -export const ProtocolHandlerExtension = `${ProtocolHandlerIpcPrefix}:extension`; -export const ProtocolHandlerInvalid = `${ProtocolHandlerIpcPrefix}:invalid`; +export const ProtocolHandlerInternal = `protocol-handler:internal`; +export const ProtocolHandlerExtension = `protocol-handler:extension`; +export const ProtocolHandlerInvalid = `protocol-handler:invalid`; /** * These two names are long and cumbersome by design so as to decrease the chances diff --git a/packages/core/src/features/cluster/manager/common/logger.injectable.ts b/packages/core/src/features/cluster/manager/common/logger.injectable.ts new file mode 100644 index 0000000000..7d155b3279 --- /dev/null +++ b/packages/core/src/features/cluster/manager/common/logger.injectable.ts @@ -0,0 +1,13 @@ +/** + * 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 prefixedLoggerInjectable from "../../../../common/logger/prefixed-logger.injectable"; + +const clusterManagerLoggerInjectable = getInjectable({ + id: "cluster-manager-logger", + instantiate: (di) => di.inject(prefixedLoggerInjectable, "CLUSTER-MANAGER"), +}); + +export default clusterManagerLoggerInjectable; diff --git a/packages/core/src/features/network/common/channels.ts b/packages/core/src/features/network/common/channels.ts new file mode 100644 index 0000000000..8fc6554a5e --- /dev/null +++ b/packages/core/src/features/network/common/channels.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { MessageChannel } from "../../../common/utils/channel/message-channel-listener-injection-token"; + +export const networkGoneOnlineChannel: MessageChannel = { + id: "network-gone-online", +}; + +export const networkGoneOfflineChannel: MessageChannel = { + id: "network-gone-offline", +}; diff --git a/packages/core/src/features/network/main/offline-listener.injectable.ts b/packages/core/src/features/network/main/offline-listener.injectable.ts new file mode 100644 index 0000000000..587b00fd68 --- /dev/null +++ b/packages/core/src/features/network/main/offline-listener.injectable.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import clusterStoreInjectable from "../../../common/cluster-store/cluster-store.injectable"; +import { getMessageChannelListenerInjectable } from "../../../common/utils/channel/message-channel-listener-injection-token"; +import clusterManagerLoggerInjectable from "../../cluster/manager/common/logger.injectable"; +import { networkGoneOfflineChannel } from "../common/channels"; + +const networkGoneOfflineListenerInjectable = getMessageChannelListenerInjectable({ + channel: networkGoneOfflineChannel, + id: "main", + handler: (di) => { + const logger = di.inject(clusterManagerLoggerInjectable); + const store = di.inject(clusterStoreInjectable); + + return () => { + logger.info("network is online"); + + for (const cluster of store.clusters.values()) { + if (!cluster.disconnected) { + cluster.online = false; + cluster.accessible = false; + void cluster.refreshConnectionStatus(); + } + } + }; + }, +}); + +export default networkGoneOfflineListenerInjectable; diff --git a/packages/core/src/features/network/main/online-listener.injectable.ts b/packages/core/src/features/network/main/online-listener.injectable.ts new file mode 100644 index 0000000000..3df0276550 --- /dev/null +++ b/packages/core/src/features/network/main/online-listener.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 clusterStoreInjectable from "../../../common/cluster-store/cluster-store.injectable"; +import { getMessageChannelListenerInjectable } from "../../../common/utils/channel/message-channel-listener-injection-token"; +import clusterManagerLoggerInjectable from "../../cluster/manager/common/logger.injectable"; +import { networkGoneOnlineChannel } from "../common/channels"; + +const networkGoneOnlineListenerInjectable = getMessageChannelListenerInjectable({ + channel: networkGoneOnlineChannel, + id: "main", + handler: (di) => { + const logger = di.inject(clusterManagerLoggerInjectable); + const store = di.inject(clusterStoreInjectable); + + return () => { + logger.info("network is online"); + + for (const cluster of store.clusters.values()) { + if (!cluster.disconnected) { + void cluster.refreshConnectionStatus(); + } + } + }; + }, +}); + +export default networkGoneOnlineListenerInjectable; diff --git a/packages/core/src/features/network/renderer/run-setup-emit-network-state.injectable.ts b/packages/core/src/features/network/renderer/run-setup-emit-network-state.injectable.ts new file mode 100644 index 0000000000..2105b0dab7 --- /dev/null +++ b/packages/core/src/features/network/renderer/run-setup-emit-network-state.injectable.ts @@ -0,0 +1,22 @@ +/** + * 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 { beforeMainFrameStartsFirstInjectionToken } from "../../../renderer/before-frame-starts/tokens"; +import setupEmittingNetworkStateInjectable from "./setup-emiting-network-state.injectable"; + +const runSetupEmitNetworkStateInjectable = getInjectable({ + id: "run-setup-emit-network-state", + instantiate: (di) => ({ + id: "run-setup-emit-network-state", + run: () => { + const setupEmittingNetworkState = di.inject(setupEmittingNetworkStateInjectable); + + setupEmittingNetworkState(); + }, + }), + injectionToken: beforeMainFrameStartsFirstInjectionToken, +}); + +export default runSetupEmitNetworkStateInjectable; diff --git a/packages/core/src/features/network/renderer/send-network-offline.injectable.ts b/packages/core/src/features/network/renderer/send-network-offline.injectable.ts new file mode 100644 index 0000000000..36b1f85637 --- /dev/null +++ b/packages/core/src/features/network/renderer/send-network-offline.injectable.ts @@ -0,0 +1,18 @@ +/** + * 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 { sendMessageToChannelInjectionToken } from "../../../common/utils/channel/message-to-channel-injection-token"; +import { networkGoneOfflineChannel } from "../common/channels"; + +const sendNetworkGoneOfflineInjectable = getInjectable({ + id: "send-network-gone-offline", + instantiate: (di) => { + const sendMessageToChannel = di.inject(sendMessageToChannelInjectionToken); + + return () => sendMessageToChannel(networkGoneOfflineChannel); + }, +}); + +export default sendNetworkGoneOfflineInjectable; diff --git a/packages/core/src/features/network/renderer/send-network-online.injectable.ts b/packages/core/src/features/network/renderer/send-network-online.injectable.ts new file mode 100644 index 0000000000..980872ff8e --- /dev/null +++ b/packages/core/src/features/network/renderer/send-network-online.injectable.ts @@ -0,0 +1,18 @@ +/** + * 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 { sendMessageToChannelInjectionToken } from "../../../common/utils/channel/message-to-channel-injection-token"; +import { networkGoneOnlineChannel } from "../common/channels"; + +const sendNetworkGoneOnlineInjectable = getInjectable({ + id: "send-network-gone-online", + instantiate: (di) => { + const sendMessageToChannel = di.inject(sendMessageToChannelInjectionToken); + + return () => sendMessageToChannel(networkGoneOnlineChannel); + }, +}); + +export default sendNetworkGoneOnlineInjectable; diff --git a/packages/core/src/features/network/renderer/setup-emiting-network-state.global-override-for-injectable.ts b/packages/core/src/features/network/renderer/setup-emiting-network-state.global-override-for-injectable.ts new file mode 100644 index 0000000000..164d67a59e --- /dev/null +++ b/packages/core/src/features/network/renderer/setup-emiting-network-state.global-override-for-injectable.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getGlobalOverride } from "../../../common/test-utils/get-global-override"; +import setupEmittingNetworkStateInjectable from "./setup-emiting-network-state.injectable"; + +export default getGlobalOverride(setupEmittingNetworkStateInjectable, () => () => {}); diff --git a/packages/core/src/features/network/renderer/setup-emiting-network-state.injectable.ts b/packages/core/src/features/network/renderer/setup-emiting-network-state.injectable.ts new file mode 100644 index 0000000000..26ffe817fb --- /dev/null +++ b/packages/core/src/features/network/renderer/setup-emiting-network-state.injectable.ts @@ -0,0 +1,23 @@ +/** + * 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 sendNetworkGoneOfflineInjectable from "./send-network-offline.injectable"; +import sendNetworkGoneOnlineInjectable from "./send-network-online.injectable"; + +const setupEmittingNetworkStateInjectable = getInjectable({ + id: "setup-emitting-network-state", + instantiate: (di) => { + const sendNetworkGoneOnline = di.inject(sendNetworkGoneOnlineInjectable); + const sendNetworkGoneOffline = di.inject(sendNetworkGoneOfflineInjectable); + + return () => { + window.addEventListener("offline", sendNetworkGoneOnline); + window.addEventListener("online", sendNetworkGoneOffline); + }; + }, + causesSideEffects: true, +}); + +export default setupEmittingNetworkStateInjectable; diff --git a/packages/core/src/main/cluster/manager.ts b/packages/core/src/main/cluster/manager.ts index 650a3b7752..dd1328573a 100644 --- a/packages/core/src/main/cluster/manager.ts +++ b/packages/core/src/main/cluster/manager.ts @@ -10,7 +10,6 @@ import type { Cluster } from "../../common/cluster/cluster"; import { isErrnoException } from "../../common/utils"; import type { KubernetesClusterPrometheusMetrics } from "../../common/catalog-entities/kubernetes-cluster"; import { isKubernetesCluster, KubernetesCluster, LensKubernetesClusterStatus } from "../../common/catalog-entities/kubernetes-cluster"; -import { ipcMainOn } from "../../common/ipc"; import { once } from "lodash"; import type { ClusterStore } from "../../common/cluster-store/cluster-store"; import type { ClusterId } from "../../common/cluster-types"; @@ -72,9 +71,6 @@ export class ClusterManager { this.updateEntityStatus(this.dependencies.catalogEntityRegistry.findById(change.newValue) as KubernetesCluster); } }); - - ipcMainOn("network:offline", this.onNetworkOffline); - ipcMainOn("network:online", this.onNetworkOnline); }); @action @@ -233,26 +229,6 @@ export class ClusterManager { } } - protected onNetworkOffline = () => { - this.dependencies.logger.info(`${logPrefix} network is offline`); - this.dependencies.store.clustersList.forEach((cluster) => { - if (!cluster.disconnected) { - cluster.online = false; - cluster.accessible = false; - cluster.refreshConnectionStatus().catch((e) => e); - } - }); - }; - - protected onNetworkOnline = () => { - this.dependencies.logger.info(`${logPrefix} network is online`); - this.dependencies.store.clustersList.forEach((cluster) => { - if (!cluster.disconnected) { - cluster.refreshConnectionStatus().catch((e) => e); - } - }); - }; - stop() { this.dependencies.store.clusters.forEach((cluster: Cluster) => { cluster.disconnect(); diff --git a/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts b/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts index b4f3d183d4..4551c07ea6 100644 --- a/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts +++ b/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts @@ -7,7 +7,6 @@ import bindProtocolAddRouteHandlersInjectable from "../../protocol-handler/bind- import lensProtocolRouterRendererInjectable from "../../protocol-handler/lens-protocol-router-renderer/lens-protocol-router-renderer.injectable"; import registerIpcListenersInjectable from "../../ipc/register-ipc-listeners.injectable"; import loggerInjectable from "../../../common/logger.injectable"; -import { broadcastMessage } from "../../../common/ipc"; import unmountRootComponentInjectable from "../../window/unmount-root-component.injectable"; const initRootFrameInjectable = getInjectable({ @@ -23,13 +22,6 @@ const initRootFrameInjectable = getInjectable({ lensProtocolRouterRenderer.init(); bindProtocolAddRouteHandlers(); - - window.addEventListener("offline", () => - broadcastMessage("network:offline"), - ); - - window.addEventListener("online", () => broadcastMessage("network:online")); - registerIpcListeners(); window.addEventListener("beforeunload", () => {