mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
* Convert runMany and runManySync to use injectManyWithMeta Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fixup type errors due to new Runnable requirements Signed-off-by: Sebastian Malton <sebastian@malton.name> * Add documentation for verifyRunnablesAreDAG Signed-off-by: Sebastian Malton <sebastian@malton.name> * Simplify convertToWithIdWith Signed-off-by: Sebastian Malton <sebastian@malton.name> * Move all utility functions to separate package Signed-off-by: Sebastian Malton <sebastian@malton.name> * Move testing utilities to separate package Signed-off-by: Sebastian Malton <sebastian@malton.name> * Move run-many and run-many-sync to separate package Signed-off-by: Sebastian Malton <sebastian@malton.name> * Replace all internal uses of utilities with new packages Signed-off-by: Sebastian Malton <sebastian@malton.name> * Use new @k8slens/run-many package in core Signed-off-by: Sebastian Malton <sebastian@malton.name> * Add dep to open-lens Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fixup type errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fixup uses of @k8slens/test-utils Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fixup getGlobalOverride Signed-off-by: Sebastian Malton <sebastian@malton.name> * Move tests to new package too Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix type errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fixup uses of AsyncResult and autoBind Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fixup remaining import issues Signed-off-by: Sebastian Malton <sebastian@malton.name> * Finial fixups to fix build Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix lint Signed-off-by: Sebastian Malton <sebastian@malton.name> * Revert moving "testUsingFakeTime" to separate package - This fixes tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix integration tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix unit test failing due to spelling fix Signed-off-by: Sebastian Malton <sebastian@malton.name> --------- Signed-off-by: Sebastian Malton <sebastian@malton.name>
80 lines
2.9 KiB
TypeScript
80 lines
2.9 KiB
TypeScript
/**
|
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
*/
|
|
import type { MessageChannelListener } from "../../common/utils/channel/message-channel-listener-injection-token";
|
|
import enlistMessageChannelListenerInjectableInRenderer from "../../renderer/utils/channel/channel-listeners/enlist-message-channel-listener.injectable";
|
|
import type { DiContainer } from "@ogre-tools/injectable";
|
|
import { getOrInsert, getOrInsertSet } from "@k8slens/utilities";
|
|
import type { SendToViewArgs } from "../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
|
|
import { deserialize, serialize } from "v8";
|
|
|
|
type ListenerSet = Set<MessageChannelListener<any>>;
|
|
type WindowListenerMap = Map<string, ListenerSet>;
|
|
type ListenerFakeMap = Map<string, WindowListenerMap>;
|
|
|
|
export interface OverriddenWindowMessaging {
|
|
sendToWindow(windowId: string, args: SendToViewArgs): void;
|
|
overrideEnlistForWindow(windowDi: DiContainer, windowId: string): void;
|
|
}
|
|
|
|
export const overrideMessagingFromMainToWindow = (): OverriddenWindowMessaging => {
|
|
const messageChannelListenerFakesForRenderer: ListenerFakeMap = new Map();
|
|
|
|
const getWindowListeners = (channelId: string, windowId: string) => {
|
|
const channelListeners = getOrInsert<string, WindowListenerMap>(
|
|
messageChannelListenerFakesForRenderer,
|
|
channelId,
|
|
new Map(),
|
|
);
|
|
|
|
return getOrInsertSet(channelListeners, windowId);
|
|
};
|
|
|
|
return {
|
|
overrideEnlistForWindow: (windowDi, windowId) => {
|
|
windowDi.override(
|
|
enlistMessageChannelListenerInjectableInRenderer,
|
|
|
|
() => (listener) => {
|
|
const windowListeners = getWindowListeners(
|
|
listener.channel.id,
|
|
windowId,
|
|
);
|
|
|
|
windowListeners.add(listener);
|
|
|
|
return () => {
|
|
windowListeners.delete(listener);
|
|
};
|
|
},
|
|
);
|
|
},
|
|
sendToWindow: (windowId, { channel, data, frameInfo }) => {
|
|
try {
|
|
data = deserialize(serialize(data));
|
|
} catch (error) {
|
|
throw new Error(`Tried to send a message to channel "${channel}" that is not compatible with StructuredClone: ${error}`);
|
|
}
|
|
|
|
const windowListeners = getWindowListeners(channel, windowId);
|
|
|
|
if (frameInfo) {
|
|
throw new Error(
|
|
`Tried to send message to frame "${frameInfo.frameId}" in process "${frameInfo.processId}" using channel "${channel}" which isn't supported yet.`,
|
|
);
|
|
}
|
|
|
|
if (windowListeners.size === 0) {
|
|
throw new Error(
|
|
`Tried to send message to channel "${channel}" but there where no listeners. Current channels with listeners: "${[
|
|
...messageChannelListenerFakesForRenderer.keys(),
|
|
].join('", "')}"`,
|
|
);
|
|
}
|
|
|
|
windowListeners.forEach((listener) => listener.handler(data));
|
|
},
|
|
};
|
|
};
|