/
ipcLink.ts
33 lines (29 loc) · 1.02 KB
/
ipcLink.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import { TRPCClientError, TRPCLink } from '@trpc/client';
import type { AnyRouter } from '@trpc/server';
import { observable } from '@trpc/server/observable';
import { IPCResponse } from '../main';
import { transformResult } from './utils';
export function ipcLink<TRouter extends AnyRouter>(): TRPCLink<TRouter> {
return (runtime) =>
({ op }) => {
return observable((observer) => {
const promise = (window as any).electronTRPC.rpc(op) as Promise<IPCResponse>;
promise
.then((res) => {
const transformed = transformResult(res.response, runtime);
if (!transformed.ok) {
observer.error(TRPCClientError.from(transformed.error));
return;
}
observer.next({
result: transformed.result,
});
observer.complete();
})
.catch((cause: Error) => observer.error(TRPCClientError.from(cause)));
return () => {
// cancel promise here
};
});
};
}