Skip to content

Commit 5a8af9f

Browse files
committed
feat: support promises
1 parent 450dc19 commit 5a8af9f

File tree

8 files changed

+38
-11
lines changed

8 files changed

+38
-11
lines changed

packages/rpc-core/src/communication/channel.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RpcScaffold } from '../interfaces';
1+
import { PromiseScaffold, RpcScaffold } from '../interfaces';
22

33
const channels: string[] = [];
44

@@ -11,13 +11,13 @@ export abstract class Channel<T extends RpcScaffold<T>> {
1111

1212
protected abstract createReceiver(...args: any[]): any;
1313

14-
protected abstract createInvoker(...args: any[]): T;
14+
protected abstract createInvoker(...args: any[]): T | PromiseScaffold<T>;
1515

1616
public abstract getReceiver(...args: any[]): any;
1717

18-
public abstract getInvoker(...args: any[]): T;
19-
2018
public destroy() {
2119
channels.splice(channels.indexOf(this.name), 1);
2220
}
21+
22+
public abstract getInvoker(...args: any[]): T | PromiseScaffold<T>;
2323
}

packages/rpc-core/src/communication/multi-receiver-channel.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RpcScaffold } from '..';
1+
import { PromiseScaffold, RpcScaffold } from '..';
22
import { Channel } from './channel';
33

44
export abstract class MultiReceiverChannel<
@@ -12,7 +12,7 @@ export abstract class MultiReceiverChannel<
1212
return this.receivers.get(args);
1313
}
1414

15-
public getInvoker(...args: any[]): T {
15+
public getInvoker(...args: any[]): PromiseScaffold<T> {
1616
return this.createInvoker(...args);
1717
}
1818

packages/rpc-core/src/communication/single-receiver-channel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export abstract class SingleReceiverChannel<
2020
public getInvoker(...args: any[]): T {
2121
if (this.isReceiver() && process?.env?.TEST !== 'true')
2222
throw new Error('This context cannot invoke remote methods.');
23-
return this.createInvoker(...args);
23+
return this.createInvoker(...args) as T;
2424
}
2525

2626
public abstract isReceiver(): boolean;
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './rpc';
2-
export * from './utils';
2+
export * from './utils';
3+
export * from './promise';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type UnwrapPromise<T> = T extends PromiseLike<infer U> ? U : T;
2+
3+
export type OptionalPromise<T> = Promise<T> | T;

packages/rpc-core/src/interfaces/rpc.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { OptionalPromise, UnwrapPromise } from './promise';
12
import { AnyFunction } from './utils';
23

34
export type RpcScaffold<T> = {
@@ -35,3 +36,21 @@ export interface ServiceCaller {
3536
cb: (obj: any) => Promise<any>;
3637
method: string;
3738
}
39+
40+
export type OptionalPromiseScaffold<T extends RpcScaffold<T>> = {
41+
[K in keyof T]: (
42+
...args: Parameters<T[K]>
43+
) => OptionalPromise<UnwrapPromise<ReturnType<T[K]>>>;
44+
};
45+
46+
export type PromiseScaffold<T extends RpcScaffold<T>> = {
47+
[K in keyof T]: (
48+
...args: Parameters<T[K]>
49+
) => Promise<UnwrapPromise<ReturnType<T[K]>>>;
50+
};
51+
52+
export type SyncScaffold<T extends RpcScaffold<T>> = {
53+
[K in keyof T]: (
54+
...args: Parameters<T[K]>
55+
) => UnwrapPromise<ReturnType<T[K]>>;
56+
};

packages/rpc-node/src/interfaces/worker.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import {
2+
OptionalPromiseScaffold,
3+
PromiseScaffold,
24
RpcEventBase,
35
RpcHandler,
46
RpcObserver,
57
RpcScaffold,
8+
SyncScaffold,
69
} from '@wexond/rpc-core';
710

811
export type RpcWorkerHandler<T extends RpcScaffold<T>> = RpcHandler<
9-
T,
12+
OptionalPromiseScaffold<T>,
1013
RpcWorkerEvent
1114
>;
1215

packages/rpc-node/src/worker/worker-channel.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import {
44
createServiceProxy,
55
makeRandomId,
66
RpcScaffold,
7+
PromiseScaffold,
78
} from '@wexond/rpc-core';
89
import { WorkerReceiver } from './worker-receiver';
910
import { RpcWorkerRequest, RpcWorkerResponse } from '../interfaces';
1011

1112
export declare interface WorkerChannel<T> {
1213
getReceiver(port?: MessagePort | Worker): WorkerReceiver<T>;
13-
getInvoker(port?: MessagePort | Worker): T;
14+
getInvoker(port?: MessagePort | Worker): PromiseScaffold<T>;
1415
}
1516
export class WorkerChannel<
1617
T extends RpcScaffold<T>
1718
> extends MultiReceiverChannel<T> {
18-
protected createInvoker(port?: MessagePort | Worker): T {
19+
protected createInvoker(port?: MessagePort | Worker) {
1920
if (!port && !parentPort) throw new Error('Invalid MessagePort.');
2021

2122
return createServiceProxy<T>((method, ...args: any[]) => {

0 commit comments

Comments
 (0)