From 755985c640ab4b9cc2a1a69f31d791b5a34f03c4 Mon Sep 17 00:00:00 2001 From: 0nepeop1e Date: Tue, 7 Feb 2023 13:49:30 +0800 Subject: [PATCH 1/2] fix duplicated id problem (#106) - send response back to the webcontents which send the request - pass IpcMainInvokeEvent to createContext --- packages/electron-trpc/src/main/createIPCHandler.ts | 10 +++++++--- packages/electron-trpc/src/main/handleIPCOperation.ts | 11 +++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index b8e7d7a1..3c0517cc 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}); } } From 2f441cacbef42ecd4de6e93fa83add38f35bd66a Mon Sep 17 00:00:00 2001 From: 0nepeop1e Date: Tue, 7 Feb 2023 13:56:22 +0800 Subject: [PATCH 2/2] fix function call --- packages/electron-trpc/src/main/createIPCHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index 3c0517cc..1bfd5c77 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -29,7 +29,7 @@ class IPCHandler { event, operation: args, respond: (response) => { - if(!event.sender.isDestroyed) return; + if(!event.sender.isDestroyed()) return; event.sender.send(ELECTRON_TRPC_CHANNEL, response); }, });