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

Consolidate usage of channel abstraction to same implementation

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-05-20 12:36:27 +03:00
parent eb8d316eea
commit 17ca80f895
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
35 changed files with 166 additions and 251 deletions

View File

@ -10,7 +10,7 @@ import extensionsStoreInjectable from "../../extensions/extensions-store/extensi
import type { ExtensionsStore } from "../../extensions/extensions-store/extensions-store";
import fileSystemProvisionerStoreInjectable from "../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable";
import type { FileSystemProvisionerStore } from "../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store";
import focusWindowInjectable from "../../renderer/ipc-channel-listeners/focus-window.injectable";
import focusWindowInjectable from "../../renderer/navigation/focus-window.injectable";
// TODO: Make components free of side effects by making them deterministic
jest.mock("../../renderer/components/input/input");

View File

@ -4,12 +4,9 @@
*/
import { getInjectionToken } from "@ogre-tools/injectable";
import type { PathName } from "./app-path-names";
import { createChannel } from "../ipc-channel/create-channel/create-channel";
export type AppPaths = Record<PathName, string>;
export const appPathsInjectionToken = getInjectionToken<AppPaths>({ id: "app-paths-token" });
export const appPathsIpcChannel = createChannel<AppPaths>("app-paths");

View File

@ -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 type { Channel } from "../channel/channel-injection-token";
import { channelInjectionToken } from "../channel/channel-injection-token";
import type { AppPaths } from "./app-path-injection-token";
export type AppPathsChannel = Channel<AppPaths, AppPaths>;
const appPathsChannelInjectable = getInjectable({
id: "app-paths-channel",
instantiate: (): AppPathsChannel => ({
id: "app-paths",
}),
injectionToken: channelInjectionToken,
});
export default appPathsChannelInjectable;

View File

@ -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 type { Channel } from "../channel/channel-injection-token";
import { channelInjectionToken } from "../channel/channel-injection-token";
import { IpcRendererNavigationEvents } from "../../renderer/navigation/events";
export type AppNavigationChannel = Channel<string, never>;
const appNavigationChannelInjectable = getInjectable({
id: "app-navigation-channel",
instantiate: (): AppNavigationChannel => ({
id: IpcRendererNavigationEvents.NAVIGATE_IN_APP,
}),
injectionToken: channelInjectionToken,
});
export default appNavigationChannelInjectable;

View File

@ -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 type { Channel } from "../channel/channel-injection-token";
import { channelInjectionToken } from "../channel/channel-injection-token";
import { IpcRendererNavigationEvents } from "../../renderer/navigation/events";
export type ClusterFrameNavigationChannel = Channel<string, never>;
const clusterFrameNavigationChannelInjectable = getInjectable({
id: "cluster-frame-navigation-channel",
instantiate: (): ClusterFrameNavigationChannel => ({
id: IpcRendererNavigationEvents.NAVIGATE_IN_CLUSTER,
}),
injectionToken: channelInjectionToken,
});
export default clusterFrameNavigationChannelInjectable;

View File

@ -1,9 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { createChannel } from "../ipc-channel/create-channel/create-channel";
import { IpcRendererNavigationEvents } from "../../renderer/navigation/events";
export const appNavigationIpcChannel = createChannel<string>(IpcRendererNavigationEvents.NAVIGATE_IN_APP);
export const clusterFrameNavigationIpcChannel = createChannel<string>(IpcRendererNavigationEvents.NAVIGATE_IN_CLUSTER);

View File

@ -1,12 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
/**
* @deprecated Switch to using newer version of Channel abstraction
*/
export interface Channel<TInstance> {
name: string;
_template: TInstance;
}

View File

@ -1,13 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { Channel } from "../channel";
/**
* @deprecated Switch to using newer version of Channel abstraction
*/
export const createChannel = <Message>(name: string): Channel<Message> => ({
name,
_template: null as never,
});

View File

@ -6,6 +6,9 @@ import { getInjectable } from "@ogre-tools/injectable";
import ipcMainInjectable from "./ipc-main/ipc-main.injectable";
import { registerChannel } from "./register-channel";
/**
* @deprecated Switch to using channelListenerInjectionToken
*/
const registerChannelInjectable = getInjectable({
id: "register-channel",

View File

@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { IpcMain } from "electron";
import type { Channel } from "../../../common/ipc-channel/channel";
import type { Channel } from "../../../common/channel/channel-injection-token";
interface Dependencies {
ipcMain: IpcMain;
@ -11,8 +11,8 @@ interface Dependencies {
export const registerChannel =
({ ipcMain }: Dependencies) =>
<TChannel extends Channel<TInstance>, TInstance>(
<TChannel extends Channel<unknown, unknown>>(
channel: TChannel,
getValue: () => TInstance,
getValue: () => TChannel["_messageTemplate"],
) =>
ipcMain.handle(channel.name, getValue);
ipcMain.handle(channel.id, getValue);

View File

@ -12,10 +12,10 @@ import appPathsStateInjectable from "../../common/app-paths/app-paths-state.inje
import { pathNames } from "../../common/app-paths/app-path-names";
import { fromPairs, map } from "lodash/fp";
import { pipeline } from "@ogre-tools/fp";
import { appPathsIpcChannel } from "../../common/app-paths/app-path-injection-token";
import registerChannelInjectable from "./register-channel/register-channel.injectable";
import joinPathsInjectable from "../../common/path/join-paths.injectable";
import { beforeElectronIsReadyInjectionToken } from "../start-main-application/runnable-tokens/before-electron-is-ready-injection-token";
import appPathsChannelInjectable from "../../common/app-paths/app-paths-channel.injectable";
const setupAppPathsInjectable = getInjectable({
id: "setup-app-paths",
@ -26,6 +26,7 @@ const setupAppPathsInjectable = getInjectable({
const getAppPath = di.inject(getElectronAppPathInjectable);
const appPathsState = di.inject(appPathsStateInjectable);
const registerChannel = di.inject(registerChannelInjectable);
const appPathsChannel = di.inject(appPathsChannelInjectable);
const directoryForIntegrationTesting = di.inject(directoryForIntegrationTestingInjectable);
const joinPaths = di.inject(joinPathsInjectable);
@ -47,7 +48,7 @@ const setupAppPathsInjectable = getInjectable({
appPathsState.set(appPaths);
registerChannel(appPathsIpcChannel, () => appPaths);
registerChannel(appPathsChannel, () => appPaths);
},
};
},

View File

@ -1,20 +0,0 @@
/**
* 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 ipcRendererInjectable from "./ipc-renderer/ipc-renderer.injectable";
import { getValueFromRegisteredChannel } from "./get-value-from-registered-channel";
import type { Channel } from "../../../common/ipc-channel/channel";
export type GetValueFromRegisteredChannel = <TChannel extends Channel<TInstance>, TInstance>(channel: TChannel) => Promise<TChannel["_template"]>;
const getValueFromRegisteredChannelInjectable = getInjectable({
id: "get-value-from-registered-channel",
instantiate: (di) => getValueFromRegisteredChannel({
ipcRenderer: di.inject(ipcRendererInjectable),
}),
});
export default getValueFromRegisteredChannelInjectable;

View File

@ -1,16 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { IpcRenderer } from "electron";
import type { Channel } from "../../../common/ipc-channel/channel";
interface Dependencies {
ipcRenderer: IpcRenderer;
}
export const getValueFromRegisteredChannel = ({ ipcRenderer }: Dependencies) =>
<TChannel extends Channel<TInstance>, TInstance>(
channel: TChannel,
): Promise<TChannel["_template"]> =>
ipcRenderer.invoke(channel.name);

View File

@ -1,25 +0,0 @@
/**
* 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 ipcRendererInjectable from "./ipc-renderer/ipc-renderer.injectable";
import type {
IpcChannelListener,
} from "../../ipc-channel-listeners/ipc-channel-listener-injection-token";
const registerIpcChannelListenerInjectable = getInjectable({
id: "register-ipc-channel-listener",
instantiate: (di) => {
const ipc = di.inject(ipcRendererInjectable);
return ({ channel, handle }: IpcChannelListener) => {
ipc.on(channel.name, (_, data) => {
handle(data);
});
};
},
});
export default registerIpcChannelListenerInjectable;

View File

@ -3,27 +3,36 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { appPathsIpcChannel } from "../../common/app-paths/app-path-injection-token";
import getValueFromRegisteredChannelInjectable from "./get-value-from-registered-channel/get-value-from-registered-channel.injectable";
import getValueFromChannelInjectable from "../channel/get-value-from-channel.injectable";
import appPathsStateInjectable from "../../common/app-paths/app-paths-state.injectable";
import { beforeFrameStartsInjectionToken } from "../before-frame-starts/before-frame-starts-injection-token";
import appPathsChannelInjectable from "../../common/app-paths/app-paths-channel.injectable";
import assert from "assert";
const setupAppPathsInjectable = getInjectable({
id: "setup-app-paths",
instantiate: (di) => ({
run: async () => {
const getValueFromRegisteredChannel = di.inject(
getValueFromRegisteredChannelInjectable,
instantiate: (di) => {
const getValueFromChannel = di.inject(
getValueFromChannelInjectable,
);
const syncAppPaths = await getValueFromRegisteredChannel(appPathsIpcChannel);
const appPathsChannel = di.inject(appPathsChannelInjectable);
return {
run: async () => {
const appPaths = await getValueFromChannel(
appPathsChannel,
);
assert(appPaths);
const appPathsState = di.inject(appPathsStateInjectable);
appPathsState.set(syncAppPaths);
appPathsState.set(appPaths);
},
};
},
}),
injectionToken: beforeFrameStartsInjectionToken,
});

View File

@ -2,7 +2,7 @@
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import ipcRendererInjectable from "../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
import ipcRendererInjectable from "../ipc-renderer.injectable";
import { getInjectable } from "@ogre-tools/injectable";
import type { IpcRendererEvent } from "electron";
import { enlistChannelListenerInjectionToken } from "../../../common/channel/enlist-channel-listener-injection-token";

View File

@ -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 ipcRendererInjectable from "./ipc-renderer.injectable";
import type { Channel } from "../../common/channel/channel-injection-token";
const getValueFromChannelInjectable = getInjectable({
id: "get-value-from-channel",
instantiate: (di) => {
const ipcRenderer = di.inject(ipcRendererInjectable);
return <TChannel extends Channel<unknown, unknown>>(
channel: TChannel,
): Promise<TChannel["_returnTemplate"]> =>
ipcRenderer.invoke(channel.id);
},
});
export default getValueFromChannelInjectable;

View File

@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import ipcRendererInjectable from "../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
import ipcRendererInjectable from "./ipc-renderer.injectable";
const sendToMainInjectable = getInjectable({
id: "send-to-main",

View File

@ -26,7 +26,6 @@ import appVersionInjectable from "../../../common/get-configuration-file-model/a
import type { AppEvent } from "../../../common/app-event-bus/event-bus";
import appEventBusInjectable from "../../../common/app-event-bus/app-event-bus.injectable";
import { computed } from "mobx";
import ipcRendererInjectable from "../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
import broadcastMessageInjectable from "../../../common/ipc/broadcast-message.injectable";
mockWindow();
@ -107,10 +106,6 @@ describe("<Catalog />", () => {
catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable);
di.override(catalogEntityRegistryInjectable, () => catalogEntityRegistry);
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
emitEvent = jest.fn();

View File

@ -12,7 +12,6 @@ import type { DiRender } from "../../../test-utils/renderFor";
import { renderFor } from "../../../test-utils/renderFor";
import clusterRoleStoreInjectable from "../../+cluster-roles/store.injectable";
import storesAndApisCanBeCreatedInjectable from "../../../../stores-apis-can-be-created.injectable";
import ipcRendererInjectable from "../../../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
describe("ClusterRoleBindingDialog tests", () => {
let render: DiRender;
@ -21,10 +20,6 @@ describe("ClusterRoleBindingDialog tests", () => {
const di = getDiForUnitTesting({ doGeneralOverrides: true });
di.override(storesAndApisCanBeCreatedInjectable, () => true);
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
render = renderFor(di);

View File

@ -13,7 +13,6 @@ import { renderFor } from "../../../test-utils/renderFor";
import directoryForUserDataInjectable from "../../../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
import clusterRoleStoreInjectable from "../../+cluster-roles/store.injectable";
import storesAndApisCanBeCreatedInjectable from "../../../../stores-apis-can-be-created.injectable";
import ipcRendererInjectable from "../../../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
describe("RoleBindingDialog tests", () => {
let render: DiRender;
@ -23,10 +22,6 @@ describe("RoleBindingDialog tests", () => {
di.override(storesAndApisCanBeCreatedInjectable, () => true);
di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
render = renderFor(di);

View File

@ -5,7 +5,6 @@
import directoryForUserDataInjectable from "../../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
import hostedClusterIdInjectable from "../../../../common/cluster-store/hosted-cluster-id.injectable";
import ipcRendererInjectable from "../../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
import { getDiForUnitTesting } from "../../../getDiForUnitTesting";
import type { DockStore, DockTab } from "../dock/store";
import { TabKind } from "../dock/store";
@ -26,10 +25,6 @@ describe("DockStore", () => {
const di = getDiForUnitTesting({ doGeneralOverrides: true });
di.override(hostedClusterIdInjectable, () => "some-cluster-id");
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
dockStore = di.inject(dockStoreInjectable);

View File

@ -20,7 +20,6 @@ import getConfigurationFileModelInjectable from "../../../../common/get-configur
import appVersionInjectable from "../../../../common/get-configuration-file-model/app-version/app-version.injectable";
import assert from "assert";
import hostedClusterIdInjectable from "../../../../common/cluster-store/hosted-cluster-id.injectable";
import ipcRendererInjectable from "../../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
jest.mock("electron", () => ({
app: {
@ -83,10 +82,6 @@ describe("<DockTabs />", () => {
directoryForUserDataInjectable,
() => "some-test-suite-specific-directory-for-user-data",
);
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
di.permitSideEffects(getConfigurationFileModelInjectable);
di.permitSideEffects(appVersionInjectable);

View File

@ -22,7 +22,6 @@ import { SearchStore } from "../../../../search-store/search-store";
import getConfigurationFileModelInjectable from "../../../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
import appVersionInjectable from "../../../../../common/get-configuration-file-model/app-version/app-version.injectable";
import assert from "assert";
import ipcRendererInjectable from "../../../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
jest.mock("electron", () => ({
app: {
@ -132,10 +131,6 @@ describe("<LogResourceSelector />", () => {
di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
di.override(callForLogsInjectable, () => () => Promise.resolve("some-logs"));
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
di.permitSideEffects(getConfigurationFileModelInjectable);
di.permitSideEffects(appVersionInjectable);

View File

@ -19,7 +19,6 @@ import getConfigurationFileModelInjectable from "../../../../common/get-configur
import appVersionInjectable from "../../../../common/get-configuration-file-model/app-version/app-version.injectable";
import type { HotbarStore } from "../../../../common/hotbars/store";
import storesAndApisCanBeCreatedInjectable from "../../../stores-apis-can-be-created.injectable";
import ipcRendererInjectable from "../../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
const mockHotbars: Partial<Record<string, any>> = {
"1": {
@ -47,10 +46,6 @@ describe("<HotbarRemoveCommand />", () => {
di.override(storesAndApisCanBeCreatedInjectable, () => true);
di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
di.permitSideEffects(hotbarStoreInjectable);
di.permitSideEffects(getConfigurationFileModelInjectable);

View File

@ -17,7 +17,6 @@ import { computed } from "mobx";
import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
import getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
import appVersionInjectable from "../../../common/get-configuration-file-model/app-version/app-version.injectable";
import ipcRendererInjectable from "../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
jest.mock("electron", () => ({
ipcRenderer: {
@ -38,10 +37,6 @@ describe("<Select />", () => {
di.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
di.override(rendererExtensionsInjectable, () => computed(() => [] as LensRendererExtension[]));
di.override(ipcRendererInjectable, () => ({
on: jest.fn(),
invoke: jest.fn(), // TODO: replace with proper mocking via the IPC bridge
} as never));
di.permitSideEffects(getConfigurationFileModelInjectable);
di.permitSideEffects(appVersionInjectable);

View File

@ -5,7 +5,7 @@
import { getInjectable } from "@ogre-tools/injectable";
import { initRootFrame } from "./init-root-frame";
import extensionLoaderInjectable from "../../../../extensions/extension-loader/extension-loader.injectable";
import ipcRendererInjectable from "../../../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
import ipcRendererInjectable from "../../../channel/ipc-renderer.injectable";
import bindProtocolAddRouteHandlersInjectable from "../../../protocol-handler/bind-protocol-add-route-handlers/bind-protocol-add-route-handlers.injectable";
import lensProtocolRouterRendererInjectable from "../../../protocol-handler/lens-protocol-router-renderer/lens-protocol-router-renderer.injectable";
import catalogEntityRegistryInjectable from "../../../api/catalog/entity/registry.injectable";

View File

@ -7,12 +7,11 @@ import glob from "glob";
import { memoize, noop } from "lodash/fp";
import { createContainer } from "@ogre-tools/injectable";
import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api";
import getValueFromRegisteredChannelInjectable from "./app-paths/get-value-from-registered-channel/get-value-from-registered-channel.injectable";
import getValueFromChannelInjectable from "./channel/get-value-from-channel.injectable";
import loggerInjectable from "../common/logger.injectable";
import { overrideFsWithFakes } from "../test-utils/override-fs-with-fakes";
import { createMemoryHistory } from "history";
import registerIpcChannelListenerInjectable from "./app-paths/get-value-from-registered-channel/register-ipc-channel-listener.injectable";
import focusWindowInjectable from "./ipc-channel-listeners/focus-window.injectable";
import focusWindowInjectable from "./navigation/focus-window.injectable";
import extensionsStoreInjectable from "../extensions/extensions-store/extensions-store.injectable";
import type { ExtensionsStore } from "../extensions/extensions-store/extensions-store";
import fileSystemProvisionerStoreInjectable from "../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable";
@ -38,7 +37,7 @@ import { ApiManager } from "../common/k8s-api/api-manager";
import lensResourcesDirInjectable from "../common/vars/lens-resources-dir.injectable";
import broadcastMessageInjectable from "../common/ipc/broadcast-message.injectable";
import apiManagerInjectable from "../common/k8s-api/api-manager/manager.injectable";
import ipcRendererInjectable from "./app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
import ipcRendererInjectable from "./channel/ipc-renderer.injectable";
import type { IpcRenderer } from "electron";
import setupOnApiErrorListenersInjectable from "./api/setup-on-api-errors.injectable";
import { observable } from "mobx";
@ -119,8 +118,7 @@ export const getDiForUnitTesting = (opts: GetDiForUnitTestingOptions = {}) => {
di.override(apiManagerInjectable, () => new ApiManager());
di.override(getValueFromRegisteredChannelInjectable, () => () => Promise.resolve(undefined as never));
di.override(registerIpcChannelListenerInjectable, () => () => undefined);
di.override(getValueFromChannelInjectable, () => () => Promise.resolve(undefined as never));
overrideFsWithFakes(di);

View File

@ -1,16 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectionToken } from "@ogre-tools/injectable";
import type { Channel } from "../../common/ipc-channel/channel";
export interface IpcChannelListener {
channel: Channel<unknown>;
handle: (value: any) => void;
}
export const ipcChannelListenerInjectionToken =
getInjectionToken<IpcChannelListener>({
id: "ipc-channel-listener-injection-token",
});

View File

@ -1,28 +0,0 @@
/**
* 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 { ipcChannelListenerInjectionToken } from "./ipc-channel-listener-injection-token";
import registerIpcChannelListenerInjectable from "../app-paths/get-value-from-registered-channel/register-ipc-channel-listener.injectable";
import { beforeFrameStartsInjectionToken } from "../before-frame-starts/before-frame-starts-injection-token";
const registerIpcChannelListenersInjectable = getInjectable({
id: "register-ipc-channel-listeners",
instantiate: di => ({
run: async () => {
const registerIpcChannelListener = di.inject(registerIpcChannelListenerInjectable);
const listeners = di.injectMany(ipcChannelListenerInjectionToken);
listeners.forEach(listener => {
registerIpcChannelListener(listener);
});
},
}),
injectionToken: beforeFrameStartsInjectionToken,
});
export default registerIpcChannelListenersInjectable;

View File

@ -3,26 +3,31 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { ipcChannelListenerInjectionToken } from "./ipc-channel-listener-injection-token";
import { appNavigationIpcChannel, clusterFrameNavigationIpcChannel } from "../../common/front-end-routing/navigation-ipc-channel";
import currentlyInClusterFrameInjectable from "../routes/currently-in-cluster-frame.injectable";
import { navigateToUrlInjectionToken } from "../../common/front-end-routing/navigate-to-url-injection-token";
import focusWindowInjectable from "./focus-window.injectable";
import { channelListenerInjectionToken } from "../../common/channel/channel-listener-injection-token";
const navigationListenerInjectable = getInjectable({
id: "navigation-listener",
import currentlyInClusterFrameInjectable from "../routes/currently-in-cluster-frame.injectable";
import appNavigationChannelInjectable from "../../common/front-end-routing/app-navigation-channel.injectable";
import clusterFrameNavigationChannelInjectable from "../../common/front-end-routing/cluster-frame-navigation-channel.injectable";
import focusWindowInjectable from "./focus-window.injectable";
import { navigateToUrlInjectionToken } from "../../common/front-end-routing/navigate-to-url-injection-token";
const navigationChannelListenerInjectable = getInjectable({
id: "navigation-channel-listener",
instantiate: (di) => {
const navigateToUrl = di.inject(navigateToUrlInjectionToken);
const currentlyInClusterFrame = di.inject(currentlyInClusterFrameInjectable);
const appNavigationChannel = di.inject(appNavigationChannelInjectable);
const clusterFrameNavigationChannel = di.inject(clusterFrameNavigationChannelInjectable);
const focusWindow = di.inject(focusWindowInjectable);
const navigateToUrl = di.inject(navigateToUrlInjectionToken);
return {
channel: currentlyInClusterFrame
? clusterFrameNavigationIpcChannel
: appNavigationIpcChannel,
? clusterFrameNavigationChannel
: appNavigationChannel,
handle: (url: string) => {
handler: (url: string) => {
navigateToUrl(url);
if (!currentlyInClusterFrame) {
@ -31,8 +36,7 @@ const navigationListenerInjectable = getInjectable({
},
};
},
injectionToken: ipcChannelListenerInjectionToken,
injectionToken: channelListenerInjectionToken,
});
export default navigationListenerInjectable;
export default navigationChannelListenerInjectable;

View File

@ -4,7 +4,7 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import userStoreInjectable from "../../common/user-store/user-store.injectable";
import ipcRendererInjectable from "../app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
import ipcRendererInjectable from "../channel/ipc-renderer.injectable";
import { ThemeStore } from "./store";
const themeStoreInjectable = getInjectable({

View File

@ -3,17 +3,16 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { DiContainer } from "@ogre-tools/injectable";
import type { Channel } from "../common/ipc-channel/channel";
import getValueFromRegisteredChannelInjectable from "../renderer/app-paths/get-value-from-registered-channel/get-value-from-registered-channel.injectable";
import getValueFromChannelInjectable from "../renderer/channel/get-value-from-channel.injectable";
import registerChannelInjectable from "../main/app-paths/register-channel/register-channel.injectable";
import asyncFn from "@async-fn/jest";
import registerIpcChannelListenerInjectable from "../renderer/app-paths/get-value-from-registered-channel/register-ipc-channel-listener.injectable";
import type { SendToViewArgs } from "../main/start-main-application/lens-window/application-window/lens-window-injection-token";
import sendToChannelInElectronBrowserWindowInjectable from "../main/start-main-application/lens-window/application-window/send-to-channel-in-electron-browser-window.injectable";
import { isEmpty } from "lodash/fp";
import enlistChannelListenerInjectableInRenderer from "../renderer/channel/channel-listeners/enlist-channel-listener.injectable";
import enlistChannelListenerInjectableInMain from "../main/channel/channel-listeners/enlist-channel-listener.injectable";
import sendToMainInjectable from "../renderer/channel/send-to-main.injectable";
import type { Channel } from "../common/channel/channel-injection-token";
export const overrideIpcBridge = ({
rendererDi,
@ -23,43 +22,48 @@ export const overrideIpcBridge = ({
mainDi: DiContainer;
}) => {
const fakeChannelMap = new Map<
Channel<any>,
string,
{ promise: Promise<any>; resolve: (arg0: any) => Promise<void> }
>();
const mainIpcRegistrations = {
set: <TChannel extends Channel<TInstance>, TInstance>(
key: TChannel,
callback: () => TChannel["_template"],
set: <TChannel extends Channel<unknown, unknown>>(
channel: TChannel,
callback: () => TChannel["_messageTemplate"],
) => {
if (!fakeChannelMap.has(key)) {
const id = channel.id;
if (!fakeChannelMap.has(id)) {
const mockInstance = asyncFn();
fakeChannelMap.set(key, {
fakeChannelMap.set(id, {
promise: mockInstance(),
resolve: mockInstance.resolve,
});
}
return fakeChannelMap.get(key)?.resolve(callback);
return fakeChannelMap.get(id)?.resolve(callback);
},
get: <TChannel extends Channel<TInstance>, TInstance>(key: TChannel) => {
if (!fakeChannelMap.has(key)) {
get: <TChannel extends Channel<unknown, unknown>>(channel: TChannel) => {
const id = channel.id;
if (!fakeChannelMap.has(id)) {
const mockInstance = asyncFn();
fakeChannelMap.set(key, {
fakeChannelMap.set(id, {
promise: mockInstance(),
resolve: mockInstance.resolve,
});
}
return fakeChannelMap.get(key)?.promise;
return fakeChannelMap.get(id)?.promise;
},
};
// TODO: Consolidate to using mainIpcFakeHandles
rendererDi.override(
getValueFromRegisteredChannelInjectable,
getValueFromChannelInjectable,
() => async (channel) => {
const callback = await mainIpcRegistrations.get(channel);
@ -76,16 +80,6 @@ export const overrideIpcBridge = ({
((...args: any[]) => void)[]
>();
rendererDi.override(
registerIpcChannelListenerInjectable,
() =>
({ channel, handle }) => {
const existingHandles = rendererIpcFakeHandles.get(channel.name) || [];
rendererIpcFakeHandles.set(channel.name, [...existingHandles, handle]);
},
);
mainDi.override(
sendToChannelInElectronBrowserWindowInjectable,
() =>