mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
* wip: command palette Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * register shortcut to global menu Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * introduce openCommandDialog & closeCommandDialog Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * fix ipc broadcast to frames from renderer Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * tweak Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * add more commands Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * ipc fix Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * add integration tests Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * ipc fix Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * implement workspace edit Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * workspace edit fixes Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * make tests green Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * fixes from code review Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup ipc Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup CommandRegistry Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * ipc fix Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * fix ClusterManager cluster auto-init Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * ensure cluster view is active before sending a command Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * switch to last active cluster when workspace change Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * tweak integration tests Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * run integration tests serially Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * fixes based on code review Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup more Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * add workspace fixes Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * cleanup Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
86 lines
2.3 KiB
TypeScript
86 lines
2.3 KiB
TypeScript
// Inter-process communications (main <-> renderer)
|
||
// https://www.electronjs.org/docs/api/ipc-main
|
||
// https://www.electronjs.org/docs/api/ipc-renderer
|
||
|
||
import { ipcMain, ipcRenderer, webContents, remote } from "electron";
|
||
import { toJS } from "mobx";
|
||
import logger from "../main/logger";
|
||
import { ClusterFrameInfo, clusterFrameMap } from "./cluster-frames";
|
||
|
||
const subFramesChannel = "ipc:get-sub-frames";
|
||
|
||
export function handleRequest(channel: string, listener: (...args: any[]) => any) {
|
||
ipcMain.handle(channel, listener);
|
||
}
|
||
|
||
export async function requestMain(channel: string, ...args: any[]) {
|
||
return ipcRenderer.invoke(channel, ...args);
|
||
}
|
||
|
||
function getSubFrames(): ClusterFrameInfo[] {
|
||
return toJS(Array.from(clusterFrameMap.values()), { recurseEverything: true });
|
||
}
|
||
|
||
export async function broadcastMessage(channel: string, ...args: any[]) {
|
||
const views = (webContents || remote?.webContents)?.getAllWebContents();
|
||
|
||
if (!views) return;
|
||
|
||
if (ipcRenderer) {
|
||
ipcRenderer.send(channel, ...args);
|
||
} else {
|
||
ipcMain.emit(channel, ...args);
|
||
}
|
||
|
||
for (const view of views) {
|
||
const type = view.getType();
|
||
|
||
logger.silly(`[IPC]: broadcasting "${channel}" to ${type}=${view.id}`, { args });
|
||
view.send(channel, ...args);
|
||
|
||
try {
|
||
const subFrames: ClusterFrameInfo[] = ipcRenderer
|
||
? await requestMain(subFramesChannel)
|
||
: getSubFrames();
|
||
|
||
for (const frameInfo of subFrames) {
|
||
view.sendToFrame([frameInfo.processId, frameInfo.frameId], channel, ...args);
|
||
}
|
||
} catch (error) {
|
||
logger.error("[IPC]: failed to send IPC message", { error });
|
||
}
|
||
}
|
||
}
|
||
|
||
export function subscribeToBroadcast(channel: string, listener: (...args: any[]) => any) {
|
||
if (ipcRenderer) {
|
||
ipcRenderer.on(channel, listener);
|
||
} else {
|
||
ipcMain.on(channel, listener);
|
||
}
|
||
|
||
return listener;
|
||
}
|
||
|
||
export function unsubscribeFromBroadcast(channel: string, listener: (...args: any[]) => any) {
|
||
if (ipcRenderer) {
|
||
ipcRenderer.off(channel, listener);
|
||
} else {
|
||
ipcMain.off(channel, listener);
|
||
}
|
||
}
|
||
|
||
export function unsubscribeAllFromBroadcast(channel: string) {
|
||
if (ipcRenderer) {
|
||
ipcRenderer.removeAllListeners(channel);
|
||
} else {
|
||
ipcMain.removeAllListeners(channel);
|
||
}
|
||
}
|
||
|
||
export function bindBroadcastHandlers() {
|
||
handleRequest(subFramesChannel, () => {
|
||
return getSubFrames();
|
||
});
|
||
}
|