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:
parent
eb8d316eea
commit
17ca80f895
@ -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");
|
||||
|
||||
@ -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");
|
||||
|
||||
|
||||
|
||||
22
src/common/app-paths/app-paths-channel.injectable.ts
Normal file
22
src/common/app-paths/app-paths-channel.injectable.ts
Normal 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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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);
|
||||
@ -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;
|
||||
}
|
||||
@ -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,
|
||||
});
|
||||
@ -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",
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
@ -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;
|
||||
@ -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);
|
||||
@ -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;
|
||||
@ -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);
|
||||
|
||||
const appPathsState = di.inject(appPathsStateInjectable);
|
||||
return {
|
||||
run: async () => {
|
||||
const appPaths = await getValueFromChannel(
|
||||
appPathsChannel,
|
||||
);
|
||||
|
||||
appPathsState.set(syncAppPaths);
|
||||
},
|
||||
}),
|
||||
assert(appPaths);
|
||||
|
||||
const appPathsState = di.inject(appPathsStateInjectable);
|
||||
|
||||
appPathsState.set(appPaths);
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: beforeFrameStartsInjectionToken,
|
||||
});
|
||||
|
||||
@ -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";
|
||||
|
||||
22
src/renderer/channel/get-value-from-channel.injectable.ts
Normal file
22
src/renderer/channel/get-value-from-channel.injectable.ts
Normal 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;
|
||||
@ -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",
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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,11 +37,7 @@ 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);
|
||||
});
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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",
|
||||
});
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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({
|
||||
|
||||
@ -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,
|
||||
() =>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user