1
- import { Callable , HandlerConfig , Notifiable , Observable , Observer , Promisify , PromisifyReturn , Publisher } from '@jsonrpc-rx/core' ;
1
+ import {
2
+ Callable ,
3
+ ExposeMode ,
4
+ HandlerConfig ,
5
+ INNER_ONCALL_FOR_QUERY_MODE ,
6
+ Notifiable ,
7
+ Observable ,
8
+ Observer ,
9
+ Promisify ,
10
+ PromisifyReturn ,
11
+ Publisher ,
12
+ } from '@jsonrpc-rx/core' ;
2
13
import { JsonrpcClient } from './jsonrpc-client' ;
3
14
4
15
type To < T > = T ;
16
+
5
17
type ObservableTypeMapper < T extends ( args : any ) => any > = T extends ( publisher : Publisher < infer P > , ...args : infer A ) => infer R
6
18
? ( observer : Observer < P > , ...rest : A ) => Promisify < R >
7
19
: PromisifyReturn < T > ;
20
+
21
+ type DefaultTypeMapper < T extends { [ key : string ] : any } > = T extends ( ) => unknown
22
+ ? PromisifyReturn < T >
23
+ : T extends ( publisher : Publisher < infer P > , ...args : infer A ) => infer R
24
+ ? ( observer : Observer < P > , ...rest : A ) => Promisify < R >
25
+ : PromisifyReturn < T > ;
26
+
8
27
type NotifiableTypeMapper < T extends ( args : any ) => any > = To < ( ...params : Parameters < T > ) => void > ;
28
+
9
29
type CallableTypeMapper < T extends ( args : any ) => any > = To < ( ...params : Parameters < T > ) => Promisify < ReturnType < T > > > ;
30
+
10
31
type HandlersTypeMapper < T extends { [ key : string ] : any } > = To < {
11
32
[ K in keyof T ] : T [ K ] extends Notifiable < any >
12
33
? NotifiableTypeMapper < T [ K ] >
13
34
: T [ K ] extends Observable < any >
14
35
? ObservableTypeMapper < T [ K ] >
15
36
: T [ K ] extends Callable < any >
16
37
? CallableTypeMapper < T [ K ] >
17
- : PromisifyReturn < T [ K ] > ;
38
+ : DefaultTypeMapper < T [ K ] > ;
18
39
} > ;
19
40
41
+ const unifyQueryModeMapKey = Symbol ( 'unifyQueryModeMap' ) ;
42
+
20
43
export const wrap = < T extends HandlerConfig > ( jsonrpcClient : JsonrpcClient ) : HandlersTypeMapper < T > => {
44
+ if ( ( jsonrpcClient as any ) [ unifyQueryModeMapKey ] == null ) {
45
+ ( jsonrpcClient as any ) [ unifyQueryModeMapKey ] = new Map ( ) ;
46
+ }
47
+
21
48
const proxyHandler : ProxyHandler < object > = {
22
- get : function ( target , prop : string ) {
23
- return ( ...params : any [ ] ) => jsonrpcClient . _unify ( prop , params ) ;
49
+ get : function ( _ , name : string ) {
50
+ return async ( ...params : any [ ] ) => {
51
+ const unifyQueryModeMap = ( jsonrpcClient as any ) [ unifyQueryModeMapKey ] as Map < string , ExposeMode > ;
52
+
53
+ let mode : ExposeMode ;
54
+ if ( unifyQueryModeMap . has ( name ) ) {
55
+ mode = unifyQueryModeMap . get ( name ) ! ;
56
+ } else {
57
+ mode = await jsonrpcClient . call < ExposeMode > ( INNER_ONCALL_FOR_QUERY_MODE , [ name ] ) ;
58
+ unifyQueryModeMap . set ( name , mode ) ;
59
+ }
60
+
61
+ if ( mode === 'subscribe' ) {
62
+ const disposable = await jsonrpcClient [ mode ] ( name , params [ 0 ] , params . slice ( 1 ) ) ;
63
+ return disposable . dispose . bind ( disposable ) ;
64
+ } else {
65
+ return jsonrpcClient [ mode ] ( name , params ) ;
66
+ }
67
+ } ;
24
68
} ,
25
69
} ;
26
70
return new Proxy ( { } , proxyHandler ) as any ;
@@ -32,9 +76,12 @@ export const wrap = <T extends HandlerConfig>(jsonrpcClient: JsonrpcClient): Han
32
76
// math: asCall(async (calculator: (...nums: number[]) => number, a: number, b: number) => {
33
77
// return await calculator(a, b);
34
78
// }),
35
- // hello: asNotify(() => {
79
+ // hello: asNotify((a: string ) => {
36
80
// console.log('hello jsonrpc-rx');
37
81
// }),
82
+ // hello01: () => {
83
+ // console.log('hello jsonrpc-rx');
84
+ // },
38
85
// timer: asSubject((publisher: Publisher<number>, maxSecond: number = 10) => {
39
86
// let second = 0;
40
87
// const interval = setInterval(() => {
@@ -63,10 +110,26 @@ export const wrap = <T extends HandlerConfig>(jsonrpcClient: JsonrpcClient): Han
63
110
// clearInterval(interval);
64
111
// };
65
112
// }, 0),
113
+ // timer02: (publisher: Publisher<number>, maxSecond: number = 10) => {
114
+ // let second = 0;
115
+ // const interval = setInterval(() => {
116
+ // if (++second > maxSecond) {
117
+ // clearInterval(interval);
118
+ // publisher.complete();
119
+ // return;
120
+ // }
121
+ // publisher.next(second);
122
+ // }, 1000);
123
+ // return () => {
124
+ // clearInterval(interval);
125
+ // };
126
+ // },
66
127
// };
67
128
68
129
// type HandlersType = typeof handlers;
69
130
// const remote = wrap<HandlersType>({} as any);
70
131
// remote.sum;
71
132
// remote.hello;
133
+ // remote.hello01;
72
134
// remote.timer;
135
+ // remote.timer02;
0 commit comments