Skip to content

Commit 281eccd

Browse files
committed
fix(client): an error occurred when dispose a subscription
1 parent 902e69f commit 281eccd

File tree

3 files changed

+69
-27
lines changed

3 files changed

+69
-27
lines changed

packages/client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@jsonrpc-rx/client",
3-
"version": "0.2.1",
3+
"version": "0.2.2",
44
"author": "jsonrpc-rx",
55
"description": "A tool library for RPC based on JSON-RPC 2.0 and Reactive Programming",
66
"main": "./dist/index.cjs.js",

packages/client/src/jsonrpc-client.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import {
2626
Observer,
2727
JsonrpcParams,
2828
JsonrpcCostomError,
29-
INNER_ONCALL_FOR_QUERY_MODE,
30-
ExposeMode,
3129
asyncFuncParamsInterceptor,
3230
} from '@jsonrpc-rx/core';
3331
import { MessageSenderCtx } from './message-sender-ctx';
@@ -54,7 +52,6 @@ export class JsonrpcClient implements IJsonrpcClient {
5452
disposable: IDisposable;
5553
}
5654
> = new Map();
57-
private unifyQueryModeMap = new Map<string, ExposeMode>();
5855

5956
private msgSenderCtx: MessageSenderCtx;
6057
private msgReceiverCtx: MessageReceiverCtx;
@@ -148,24 +145,6 @@ export class JsonrpcClient implements IJsonrpcClient {
148145
});
149146
};
150147

151-
async _unify(name: string, args: any[]) {
152-
if (toType(name) != 'string') this.throwInvalidParamsError();
153-
154-
let mode: ExposeMode;
155-
if (this.unifyQueryModeMap.has(name)) {
156-
mode = this.unifyQueryModeMap.get(name)!;
157-
} else {
158-
mode = await this.call<ExposeMode>(INNER_ONCALL_FOR_QUERY_MODE, [name]);
159-
this.unifyQueryModeMap.set(name, mode);
160-
}
161-
162-
if (mode === 'subscribe') {
163-
return this[mode](name, args[0], args.slice(1));
164-
} else {
165-
return this[mode](name, args);
166-
}
167-
}
168-
169148
private receiveMessage() {
170149
const receiveHandler = (messageBody: MessageBody) => {
171150
this.receiveMessageForCall(messageBody as JsonrpcResponseBody);

packages/client/src/wrap.ts

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,70 @@
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';
213
import { JsonrpcClient } from './jsonrpc-client';
314

415
type To<T> = T;
16+
517
type ObservableTypeMapper<T extends (args: any) => any> = T extends (publisher: Publisher<infer P>, ...args: infer A) => infer R
618
? (observer: Observer<P>, ...rest: A) => Promisify<R>
719
: 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+
827
type NotifiableTypeMapper<T extends (args: any) => any> = To<(...params: Parameters<T>) => void>;
28+
929
type CallableTypeMapper<T extends (args: any) => any> = To<(...params: Parameters<T>) => Promisify<ReturnType<T>>>;
30+
1031
type HandlersTypeMapper<T extends { [key: string]: any }> = To<{
1132
[K in keyof T]: T[K] extends Notifiable<any>
1233
? NotifiableTypeMapper<T[K]>
1334
: T[K] extends Observable<any>
1435
? ObservableTypeMapper<T[K]>
1536
: T[K] extends Callable<any>
1637
? CallableTypeMapper<T[K]>
17-
: PromisifyReturn<T[K]>;
38+
: DefaultTypeMapper<T[K]>;
1839
}>;
1940

41+
const unifyQueryModeMapKey = Symbol('unifyQueryModeMap');
42+
2043
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+
2148
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+
};
2468
},
2569
};
2670
return new Proxy({}, proxyHandler) as any;
@@ -32,9 +76,12 @@ export const wrap = <T extends HandlerConfig>(jsonrpcClient: JsonrpcClient): Han
3276
// math: asCall(async (calculator: (...nums: number[]) => number, a: number, b: number) => {
3377
// return await calculator(a, b);
3478
// }),
35-
// hello: asNotify(() => {
79+
// hello: asNotify((a: string) => {
3680
// console.log('hello jsonrpc-rx');
3781
// }),
82+
// hello01: () => {
83+
// console.log('hello jsonrpc-rx');
84+
// },
3885
// timer: asSubject((publisher: Publisher<number>, maxSecond: number = 10) => {
3986
// let second = 0;
4087
// const interval = setInterval(() => {
@@ -63,10 +110,26 @@ export const wrap = <T extends HandlerConfig>(jsonrpcClient: JsonrpcClient): Han
63110
// clearInterval(interval);
64111
// };
65112
// }, 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+
// },
66127
// };
67128

68129
// type HandlersType = typeof handlers;
69130
// const remote = wrap<HandlersType>({} as any);
70131
// remote.sum;
71132
// remote.hello;
133+
// remote.hello01;
72134
// remote.timer;
135+
// remote.timer02;

0 commit comments

Comments
 (0)