comlink-electron-endpoint
Version:
Use Comlink to communicate between main and renderer.
26 lines (22 loc) • 906 B
text/typescript
import { Endpoint, expose, transferHandlers, wrap } from "comlink";
import { MessageChannelMain } from "electron";
import type { MessagePortMain } from "electron";
import { electronEndpoint as rendererEndpoint } from "./renderer";
export function electronEndpoint(port: MessagePortMain): Endpoint {
(port as any).addEventListener = port.on.bind(port);
(port as any).removeEventListener = port.off.bind(port);
return rendererEndpoint(port as any);
}
const handler = transferHandlers.get("proxy");
if (handler) {
handler.serialize = (obj: unknown) => {
const { port1, port2 } = new MessageChannelMain();
expose(obj, electronEndpoint(port1));
return [port2, [port2 as unknown as Transferable]];
};
handler.deserialize = (port: MessagePortMain) => {
port.start();
return wrap(electronEndpoint(port));
};
transferHandlers.set("proxy", handler);
}