30 lines
1015 B
TypeScript
30 lines
1015 B
TypeScript
import type { WebContents } from "electron";
|
||
import log from "electron-log";
|
||
|
||
/**
|
||
* Sends an IPC message to the renderer only if the provided `WebContents` is
|
||
* still alive. This prevents `Object has been destroyed` errors that can occur
|
||
* when asynchronous callbacks attempt to communicate after the window has
|
||
* already been closed (e.g. during e2e test teardown).
|
||
*/
|
||
export function safeSend(
|
||
sender: WebContents | null | undefined,
|
||
channel: string,
|
||
...args: unknown[]
|
||
): void {
|
||
if (!sender) return;
|
||
if (sender.isDestroyed()) return;
|
||
// @ts-ignore – `isCrashed` exists at runtime but is not in the type defs
|
||
if (typeof sender.isCrashed === "function" && sender.isCrashed()) return;
|
||
|
||
try {
|
||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||
// @ts-ignore – allow variadic args beyond `data`
|
||
sender.send(channel, ...args);
|
||
} catch (error) {
|
||
log.debug(
|
||
`safeSend: failed to send on channel "${channel}" because: ${(error as Error).message}`,
|
||
);
|
||
}
|
||
}
|