diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index b8e7d7a1..1bfd5c77 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -16,18 +16,22 @@ class IPCHandler { router, windows = [], }: { - createContext?: () => Awaitable>; + createContext?: (event: IpcMainInvokeEvent) => Awaitable>; router: TRouter; windows?: BrowserWindow[]; }) { this.#windows = windows; - ipcMain.on(ELECTRON_TRPC_CHANNEL, (_event: IpcMainInvokeEvent, args: Operation) => { + ipcMain.on(ELECTRON_TRPC_CHANNEL, (event: IpcMainInvokeEvent, args: Operation) => { handleIPCOperation({ router, createContext, + event, operation: args, - respond: (response) => this.#sendToAllWindows(response), + respond: (response) => { + if(!event.sender.isDestroyed()) return; + event.sender.send(ELECTRON_TRPC_CHANNEL, response); + }, }); }); } diff --git a/packages/electron-trpc/src/main/handleIPCOperation.ts b/packages/electron-trpc/src/main/handleIPCOperation.ts index 0489fe74..73ed3c67 100644 --- a/packages/electron-trpc/src/main/handleIPCOperation.ts +++ b/packages/electron-trpc/src/main/handleIPCOperation.ts @@ -1,6 +1,7 @@ import { callProcedure, TRPCError } from '@trpc/server'; import type { AnyRouter, inferRouterContext } from '@trpc/server'; import type { TRPCResponseMessage } from '@trpc/server/rpc'; +import type { IpcMainInvokeEvent } from 'electron'; import { isObservable } from '@trpc/server/observable'; import { Operation } from '@trpc/client'; import { getTRPCErrorFromUnknown, transformTRPCResponseItem } from './utils'; @@ -10,11 +11,13 @@ export async function handleIPCOperation({ createContext, operation, respond, + event }: { router: TRouter; - createContext?: () => Promise>; + createContext?: (event: IpcMainInvokeEvent) => Promise>; operation: Operation; respond: (response: TRPCResponseMessage) => void; + event: IpcMainInvokeEvent; }) { const { type, input: serializedInput, id, path } = operation; const input = router._def._config.transformer.input.deserialize(serializedInput); @@ -22,7 +25,7 @@ export async function handleIPCOperation({ // type TSuccessResponse = TRPCSuccessResponse>; // type TErrorResponse = TRPCErrorResponse>; - const ctx = (await createContext?.()) ?? {}; + const ctx = (await createContext?.(event)) ?? {}; try { const result = await callProcedure({ @@ -88,7 +91,7 @@ export async function handleIPCOperation({ }, }); - void subscription; + event.sender.on("destroyed", () => subscription.unsubscribe()); } catch (cause) { const error: TRPCError = getTRPCErrorFromUnknown(cause); @@ -102,6 +105,6 @@ export async function handleIPCOperation({ }), }); - return { response }; + return respond({id, ...response}); } }