@cloudpss/ubrpc 0.6.14 → 0.6.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -7
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +9 -2
- package/dist/logger.js.map +1 -1
- package/dist/ready.d.ts +6 -0
- package/dist/ready.d.ts.map +1 -0
- package/dist/ready.js +29 -0
- package/dist/ready.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/socket.d.ts +1 -10
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +66 -69
- package/dist/socket.js.map +1 -1
- package/dist/types/callbacks.d.ts +6 -0
- package/dist/types/callbacks.d.ts.map +1 -0
- package/dist/types/callbacks.js +2 -0
- package/dist/types/callbacks.js.map +1 -0
- package/dist/utils/serialize.d.ts.map +1 -1
- package/dist/utils/serialize.js +1 -1
- package/dist/utils/serialize.js.map +1 -1
- package/package.json +3 -3
- package/src/logger.ts +10 -2
- package/src/ready.ts +36 -0
- package/src/server.ts +3 -3
- package/src/socket.ts +70 -73
- package/src/types/callbacks.ts +7 -0
- package/src/utils/serialize.ts +1 -2
- package/tests/client.ts +6 -4
- package/tests/runner.ts +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
# @cloudpss/ubrpc
|
|
2
2
|
|
|
3
|
-
Rpc server/client build on websocket and ubjson.
|
|
3
|
+
Rpc server/client build on websocket and ubjson, supports bidirectional calls, async iterators and observables.
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
本模块是基于 websocket 和 ubjson 的 rpc 服务端/客户端模块。使用 websocket 作为底层通信协议,使用 ubjson 作为数据序列化协议。在建立连接后,支持通过 websocket 实现双向调用。
|
|
8
|
-
|
|
9
|
-
## Usage
|
|
5
|
+
## Example
|
|
10
6
|
|
|
11
7
|
### 作为 WebSocket 服务端
|
|
12
8
|
|
|
@@ -22,6 +18,7 @@ const rpc = new RpcServer(
|
|
|
22
18
|
},
|
|
23
19
|
(meta) => {
|
|
24
20
|
// 校验客户端信息,拒绝连接时抛出异常
|
|
21
|
+
if (!meta.token) throw new Error('Unauthorized');
|
|
25
22
|
// 返回服务端信息供客户端验证
|
|
26
23
|
return {};
|
|
27
24
|
},
|
|
@@ -46,7 +43,8 @@ server.on('connection', async (socket) => {
|
|
|
46
43
|
```ts
|
|
47
44
|
import { RpcClientSocket } from '@cloudpss/ubrpc';
|
|
48
45
|
|
|
49
|
-
const rpc = new RpcClientSocket('ws://localhost:8090');
|
|
46
|
+
const rpc = new RpcClientSocket('ws://localhost:8090', { token: 'my-token' });
|
|
50
47
|
const result = await rpc.call('hello', 'world');
|
|
51
48
|
console.log(result);
|
|
49
|
+
rpc.destroy();
|
|
52
50
|
```
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,eAAO,IAAI,MAAM,EAAE,mBAAmB,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export let logger;
|
|
2
|
+
if (typeof process != 'undefined' && typeof process.getBuiltinModule == 'function') {
|
|
3
|
+
const { debuglog } = process.getBuiltinModule('node:util');
|
|
4
|
+
logger = debuglog('cloudpss/ubrpc', (l) => (logger = l));
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
// eslint-disable-next-line no-console
|
|
8
|
+
logger = (msg, ...param) => console.debug(`[cloudpss/ubrpc] ${msg}`, ...param);
|
|
9
|
+
}
|
|
3
10
|
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,IAAI,MAA2B,CAAC;AAEvC,IAAI,OAAO,OAAO,IAAI,WAAW,IAAI,OAAO,OAAO,CAAC,gBAAgB,IAAI,UAAU,EAAE,CAAC;IACjF,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;KAAM,CAAC;IACJ,sCAAsC;IACtC,MAAM,GAAG,CAAC,GAAW,EAAE,GAAG,KAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;AACtG,CAAC"}
|
package/dist/ready.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ready.d.ts","sourceRoot":"","sources":["../src/ready.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAS7D;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAuB7E"}
|
package/dist/ready.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const kReadyCallbacks = Symbol('kReadyCallbacks');
|
|
2
|
+
/**
|
|
3
|
+
* 创建或返回 ready Promise
|
|
4
|
+
*/
|
|
5
|
+
export function makeReady(target) {
|
|
6
|
+
const t = target;
|
|
7
|
+
const existing = t[kReadyCallbacks];
|
|
8
|
+
if (existing != null)
|
|
9
|
+
return existing;
|
|
10
|
+
let callbacks;
|
|
11
|
+
const ready = new Promise((resolve, reject) => {
|
|
12
|
+
callbacks = [resolve, reject];
|
|
13
|
+
});
|
|
14
|
+
if (callbacks == null)
|
|
15
|
+
throw new Error(`Bad promise`);
|
|
16
|
+
t[kReadyCallbacks] = callbacks;
|
|
17
|
+
ready
|
|
18
|
+
.catch(() => {
|
|
19
|
+
// Avoid unhandled rejection
|
|
20
|
+
})
|
|
21
|
+
.finally(() => {
|
|
22
|
+
if (t[kReadyCallbacks] === callbacks) {
|
|
23
|
+
t[kReadyCallbacks] = undefined;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
t.ready = ready;
|
|
27
|
+
return callbacks;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ready.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ready.js","sourceRoot":"","sources":["../src/ready.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAOlD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAmB,MAAS;IACjD,MAAM,CAAC,GAAG,MAAsB,CAAC;IAEjC,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IACpC,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC;IAEtC,IAAI,SAA6C,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAChD,SAAS,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IACH,IAAI,SAAS,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IAC/B,KAAK;SACA,KAAK,CAAC,GAAG,EAAE;QACR,4BAA4B;IAChC,CAAC,CAAC;SACD,OAAO,CAAC,GAAG,EAAE;QACV,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,SAAS,EAAE,CAAC;YACnC,CAAC,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;QACnC,CAAC;IACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;IAChB,OAAO,SAAS,CAAC;AACrB,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD,QAAA,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD,QAAA,MAAM,QAAQ,eAAyB,CAAC;AACxC,QAAA,MAAM,SAAS,eAA0B,CAAC;AAC1C,QAAA,MAAM,cAAc,eAA+B,CAAC;AAEpD,kBAAkB;AAClB,KAAK,qBAAqB,GAAG,SAAS,GAAG;IAAE,CAAC,SAAS,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AACtE;;;;;GAKG;AACH,KAAK,sBAAsB,GAAG,CAAC,QAAQ,EAAE,WAAW,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAI5F,8BAA8B;AAC9B,qBAAa,SAAS,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM,SAAS,MAAM;IAI5D,cAAc;IACd,QAAQ,CAAC,aAAa,EAAE,sBAAsB;;IAH9C,iBAAiB;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7F,cAAc;IACL,aAAa,GAAE,sBAAmC;IAU/D,kBAAkB;IAClB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;IAEjF,gBAAgB;IAChB,SAAS,CAAC,QAAQ,CAAC,QAAQ,sDAA6D;IACxF,gBAAgB;IAChB,IAAI,OAAO,IAAI,WAAW,CAAC,YAAY,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAEzE;IAED,kCAAkC;IAC5B,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAuB3E,YAAY;cACI,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAoCnG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0D;IAC/F,sBAAsB;IACtB,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI;CAgB7D;AAED,6BAA6B;AAC7B,qBAAa,eAAe,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM,SAAS,MAAM,CAAE,SAAQ,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAGtG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAD3C,EAAE,EAAE,YAAY,EACP,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAK/C,kBAAkB;IAElB,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAG5C,kBAAkB;IAClB,cAAuB,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAE5D;IACD,kBAAkB;cACC,OAAO,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;IAIhD,gBAAgB;IACV,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAI1E"}
|
package/dist/server.js
CHANGED
|
@@ -5,9 +5,9 @@ import { RpcSocket } from './socket.js';
|
|
|
5
5
|
import { send } from './utils/messaging.js';
|
|
6
6
|
import { serializeError } from './utils/serialize.js';
|
|
7
7
|
import { VERSION } from './version.js';
|
|
8
|
-
const kOnClose = Symbol('kOnClose');
|
|
9
|
-
const kMetadata = Symbol('kMetadata');
|
|
10
|
-
const kReplaceSocket = Symbol('kReplaceSocket');
|
|
8
|
+
const kOnClose = Symbol.for('kOnClose');
|
|
9
|
+
const kMetadata = Symbol.for('kMetadata');
|
|
10
|
+
const kReplaceSocket = Symbol.for('kReplaceSocket');
|
|
11
11
|
let tempIdGen = 0;
|
|
12
12
|
/** 由 WS Server 建立的 RPC 连接组 */
|
|
13
13
|
export class RpcServer {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/socket.d.ts
CHANGED
|
@@ -14,18 +14,12 @@ export declare abstract class RpcSocket<TRemote extends object, TLocal extends o
|
|
|
14
14
|
get remoteMetadata(): RpcMetadata | undefined;
|
|
15
15
|
/** 连接是否已认证 */
|
|
16
16
|
get authenticated(): boolean;
|
|
17
|
-
private readonly __local?;
|
|
18
17
|
/** 用于响应调用的本地对象 */
|
|
19
18
|
protected get local(): RpcObject<TLocal> | undefined;
|
|
20
|
-
private __socket?;
|
|
21
19
|
/** 作为底层传输的 WebSocket */
|
|
22
20
|
get socket(): WebSocket;
|
|
23
21
|
protected set socket(value: WebSocket);
|
|
24
|
-
|
|
25
|
-
private makeReady;
|
|
26
|
-
private __readyCallbacks?;
|
|
27
|
-
protected ready: Promise<void>;
|
|
28
|
-
private readonly __handlers;
|
|
22
|
+
protected readonly ready: Promise<void>;
|
|
29
23
|
/** 初始化 WebSocket */
|
|
30
24
|
protected initSocket(oldValue: WebSocket | undefined, newValue: WebSocket): Promise<void>;
|
|
31
25
|
/** 认证 WebSocket */
|
|
@@ -42,7 +36,6 @@ export declare abstract class RpcSocket<TRemote extends object, TLocal extends o
|
|
|
42
36
|
protected onPayload(payload: RpcPayload): boolean;
|
|
43
37
|
/** 调用本地方法 */
|
|
44
38
|
protected localCall(payload: RpcCallPayload | RpcNotifyPayload): Promise<void>;
|
|
45
|
-
private readonly localSubscription;
|
|
46
39
|
/** 调用本地方法 */
|
|
47
40
|
protected localSubscribe(payload: RpcSubscribePayload): Promise<void>;
|
|
48
41
|
/** 发送数据 */
|
|
@@ -53,12 +46,10 @@ export declare abstract class RpcSocket<TRemote extends object, TLocal extends o
|
|
|
53
46
|
protected seq: number;
|
|
54
47
|
/** 获取下一个序列号 */
|
|
55
48
|
protected nextSeq(): number;
|
|
56
|
-
private readonly pendingCalls;
|
|
57
49
|
/** 调用远程方法 */
|
|
58
50
|
call<TMethod extends Methods<TRemote>>(method: TMethod, ...args: RpcParameters<TRemote[TMethod]>): Promise<RpcReturns<TRemote[TMethod]>>;
|
|
59
51
|
/** 调用远程方法,放弃返回值 */
|
|
60
52
|
notify<TNotification extends Notifications<TRemote>>(method: TNotification, ...args: RpcParameters<TRemote[TNotification]>): void;
|
|
61
|
-
private readonly pendingSubscriptions;
|
|
62
53
|
/** 调用远程订阅 */
|
|
63
54
|
subscribe<TSubject extends Subjects<TRemote>>(method: TSubject, ...args: RpcParameters<TRemote[TSubject]>): Observable<RpcReturns<TRemote[TSubject]>>;
|
|
64
55
|
/** 是否已结束 */
|
package/dist/socket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,UAAU,
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}
|
package/dist/socket.js
CHANGED
|
@@ -4,24 +4,25 @@ import { send } from './utils/messaging.js';
|
|
|
4
4
|
import { decodePayload, deserializeError, serializeError } from './utils/serialize.js';
|
|
5
5
|
import { logger } from './logger.js';
|
|
6
6
|
import { WebSocketAppCode } from './codes.js';
|
|
7
|
+
import { makeReady } from './ready.js';
|
|
7
8
|
/** RPC 连接 */
|
|
8
9
|
export class RpcSocket {
|
|
9
10
|
constructor(id, local) {
|
|
10
11
|
this.id = id;
|
|
11
|
-
this
|
|
12
|
+
this.#handlers = Object.freeze({
|
|
12
13
|
open: (ev) => this.onOpen(ev),
|
|
13
14
|
close: (ev) => this.onClose(ev),
|
|
14
15
|
error: (ev) => this.onError(ev),
|
|
15
16
|
message: (ev) => this.onMessage(ev),
|
|
16
17
|
});
|
|
17
|
-
this
|
|
18
|
+
this.#localSubscription = new Map();
|
|
18
19
|
/** 序列号 */
|
|
19
20
|
this.seq = 0;
|
|
20
|
-
this
|
|
21
|
-
this
|
|
21
|
+
this.#pendingCalls = new Map();
|
|
22
|
+
this.#pendingSubscriptions = new Map();
|
|
22
23
|
this.#destroyed = false;
|
|
23
|
-
this
|
|
24
|
-
|
|
24
|
+
this.#local = local;
|
|
25
|
+
makeReady(this);
|
|
25
26
|
}
|
|
26
27
|
/** 本地认证信息 */
|
|
27
28
|
get localMetadata() {
|
|
@@ -35,54 +36,39 @@ export class RpcSocket {
|
|
|
35
36
|
get authenticated() {
|
|
36
37
|
return this._remoteMetadata != null;
|
|
37
38
|
}
|
|
39
|
+
#local;
|
|
38
40
|
/** 用于响应调用的本地对象 */
|
|
39
41
|
get local() {
|
|
40
|
-
return this
|
|
42
|
+
return this.#local;
|
|
41
43
|
}
|
|
44
|
+
#socket;
|
|
42
45
|
/** 作为底层传输的 WebSocket */
|
|
43
46
|
get socket() {
|
|
44
47
|
if (this.#destroyed)
|
|
45
48
|
throw new Error(`RPC Socket destroyed.`);
|
|
46
|
-
if (!this
|
|
49
|
+
if (!this.#socket)
|
|
47
50
|
throw new Error(`Socket not initialized`);
|
|
48
|
-
return this
|
|
51
|
+
return this.#socket;
|
|
49
52
|
}
|
|
50
53
|
set socket(value) {
|
|
51
54
|
if (this.#destroyed)
|
|
52
55
|
throw new Error(`RPC Socket destroyed.`);
|
|
53
|
-
if (this
|
|
56
|
+
if (this.#socket === value)
|
|
54
57
|
return;
|
|
55
|
-
const callbacks =
|
|
56
|
-
const oldValue = this
|
|
57
|
-
this
|
|
58
|
+
const callbacks = makeReady(this);
|
|
59
|
+
const oldValue = this.#socket;
|
|
60
|
+
this.#socket = value;
|
|
58
61
|
void this.initSocket(oldValue, value).then(...callbacks);
|
|
59
62
|
}
|
|
60
|
-
|
|
61
|
-
makeReady() {
|
|
62
|
-
if (this.__readyCallbacks != null)
|
|
63
|
-
return this.__readyCallbacks;
|
|
64
|
-
const ready = new Promise((...args) => (this.__readyCallbacks = args));
|
|
65
|
-
ready
|
|
66
|
-
.catch(() => {
|
|
67
|
-
// Avoid unhandled rejection
|
|
68
|
-
})
|
|
69
|
-
.finally(() => {
|
|
70
|
-
if (this.ready === ready)
|
|
71
|
-
this.__readyCallbacks = undefined;
|
|
72
|
-
});
|
|
73
|
-
this.ready = ready;
|
|
74
|
-
if (!this.__readyCallbacks)
|
|
75
|
-
throw new Error(`Bad promise`);
|
|
76
|
-
return this.__readyCallbacks;
|
|
77
|
-
}
|
|
63
|
+
#handlers;
|
|
78
64
|
/** 初始化 WebSocket */
|
|
79
65
|
async initSocket(oldValue, newValue) {
|
|
80
66
|
try {
|
|
81
67
|
if (oldValue) {
|
|
82
|
-
oldValue.removeEventListener('open', this.
|
|
83
|
-
oldValue.removeEventListener('close', this.
|
|
84
|
-
oldValue.removeEventListener('error', this.
|
|
85
|
-
oldValue.removeEventListener('message', this.
|
|
68
|
+
oldValue.removeEventListener('open', this.#handlers.open);
|
|
69
|
+
oldValue.removeEventListener('close', this.#handlers.close);
|
|
70
|
+
oldValue.removeEventListener('error', this.#handlers.error);
|
|
71
|
+
oldValue.removeEventListener('message', this.#handlers.message);
|
|
86
72
|
if (oldValue.readyState === oldValue.OPEN || oldValue.readyState === oldValue.CONNECTING) {
|
|
87
73
|
logger('[%s] close old socket', this.id);
|
|
88
74
|
oldValue.close(WebSocketAppCode.REPLACED);
|
|
@@ -90,11 +76,11 @@ export class RpcSocket {
|
|
|
90
76
|
}
|
|
91
77
|
await connected(newValue);
|
|
92
78
|
const info = await this.authSocket();
|
|
93
|
-
if (this
|
|
94
|
-
newValue.addEventListener('open', this.
|
|
95
|
-
newValue.addEventListener('close', this.
|
|
96
|
-
newValue.addEventListener('error', this.
|
|
97
|
-
newValue.addEventListener('message', this.
|
|
79
|
+
if (this.#socket === newValue) {
|
|
80
|
+
newValue.addEventListener('open', this.#handlers.open);
|
|
81
|
+
newValue.addEventListener('close', this.#handlers.close);
|
|
82
|
+
newValue.addEventListener('error', this.#handlers.error);
|
|
83
|
+
newValue.addEventListener('message', this.#handlers.message);
|
|
98
84
|
this._remoteMetadata = info ?? {};
|
|
99
85
|
}
|
|
100
86
|
}
|
|
@@ -107,7 +93,7 @@ export class RpcSocket {
|
|
|
107
93
|
/** 响应 WebSocket error */
|
|
108
94
|
onError(_ev) {
|
|
109
95
|
this._remoteMetadata = undefined;
|
|
110
|
-
|
|
96
|
+
makeReady(this);
|
|
111
97
|
}
|
|
112
98
|
/** 响应 WebSocket open */
|
|
113
99
|
onOpen(_ev) {
|
|
@@ -120,7 +106,7 @@ export class RpcSocket {
|
|
|
120
106
|
this.destroy();
|
|
121
107
|
}
|
|
122
108
|
else {
|
|
123
|
-
|
|
109
|
+
makeReady(this);
|
|
124
110
|
}
|
|
125
111
|
}
|
|
126
112
|
/** 响应 WebSocket message */
|
|
@@ -150,11 +136,11 @@ export class RpcSocket {
|
|
|
150
136
|
void this.localCall(payload);
|
|
151
137
|
return true;
|
|
152
138
|
case 'return': {
|
|
153
|
-
const pending = this
|
|
139
|
+
const pending = this.#pendingCalls.get(payload.seq);
|
|
154
140
|
// 即使不存在等待的请求,也认为响应是有效的
|
|
155
141
|
if (!pending)
|
|
156
142
|
return true;
|
|
157
|
-
this
|
|
143
|
+
this.#pendingCalls.delete(payload.seq);
|
|
158
144
|
if (payload.error) {
|
|
159
145
|
pending[1](deserializeError(payload.error));
|
|
160
146
|
}
|
|
@@ -167,29 +153,31 @@ export class RpcSocket {
|
|
|
167
153
|
void this.localSubscribe(payload);
|
|
168
154
|
return true;
|
|
169
155
|
case 'unsubscribe': {
|
|
170
|
-
const subscription = this
|
|
156
|
+
const subscription = this.#localSubscription.get(payload.seq);
|
|
171
157
|
// 即使不存在对应订阅,也认为响应是有效的
|
|
172
158
|
if (!subscription)
|
|
173
159
|
return true;
|
|
174
160
|
subscription.unsubscribe();
|
|
175
|
-
this
|
|
161
|
+
this.#localSubscription.delete(payload.seq);
|
|
176
162
|
return true;
|
|
177
163
|
}
|
|
178
164
|
case 'publish': {
|
|
179
|
-
const
|
|
165
|
+
const status = this.#pendingSubscriptions.get(payload.seq);
|
|
180
166
|
// 即使不存在对应订阅,也认为响应是有效的
|
|
181
|
-
if (!
|
|
167
|
+
if (!status) {
|
|
182
168
|
void this.sendPayload('unsubscribe', { seq: payload.seq });
|
|
183
169
|
return true;
|
|
184
170
|
}
|
|
185
171
|
if (payload.error) {
|
|
186
|
-
|
|
172
|
+
status[1] = true;
|
|
173
|
+
status[0].error(deserializeError(payload.error));
|
|
187
174
|
}
|
|
188
175
|
else if (payload.complete) {
|
|
189
|
-
|
|
176
|
+
status[1] = true;
|
|
177
|
+
status[0].complete();
|
|
190
178
|
}
|
|
191
179
|
else {
|
|
192
|
-
|
|
180
|
+
status[0].next(payload.next);
|
|
193
181
|
}
|
|
194
182
|
return true;
|
|
195
183
|
}
|
|
@@ -225,6 +213,7 @@ export class RpcSocket {
|
|
|
225
213
|
return this.sendPayload('return', { seq, error: serializeError(ex) });
|
|
226
214
|
}
|
|
227
215
|
}
|
|
216
|
+
#localSubscription;
|
|
228
217
|
/** 调用本地方法 */
|
|
229
218
|
async localSubscribe(payload) {
|
|
230
219
|
const method = this.local ? this.local[payload.method] : undefined;
|
|
@@ -242,15 +231,15 @@ export class RpcSocket {
|
|
|
242
231
|
void this.sendPayload('publish', { seq, next: value });
|
|
243
232
|
},
|
|
244
233
|
error: (err) => {
|
|
245
|
-
this
|
|
234
|
+
this.#localSubscription.delete(payload.seq);
|
|
246
235
|
void this.sendPayload('publish', { seq, error: serializeError(err) });
|
|
247
236
|
},
|
|
248
237
|
complete: () => {
|
|
249
|
-
this
|
|
238
|
+
this.#localSubscription.delete(payload.seq);
|
|
250
239
|
void this.sendPayload('publish', { seq, complete: true });
|
|
251
240
|
},
|
|
252
241
|
});
|
|
253
|
-
this
|
|
242
|
+
this.#localSubscription.set(seq, subscription);
|
|
254
243
|
}
|
|
255
244
|
catch (ex) {
|
|
256
245
|
return this.sendPayload('publish', { seq, error: serializeError(ex) });
|
|
@@ -269,13 +258,14 @@ export class RpcSocket {
|
|
|
269
258
|
this.seq += 2;
|
|
270
259
|
return seq;
|
|
271
260
|
}
|
|
261
|
+
#pendingCalls;
|
|
272
262
|
/** 调用远程方法 */
|
|
273
263
|
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
274
264
|
call(method, ...args) {
|
|
275
265
|
return new Promise((resolve, reject) => {
|
|
276
266
|
const seq = this.nextSeq();
|
|
277
267
|
void this.sendPayload('call', { seq, method, args });
|
|
278
|
-
this
|
|
268
|
+
this.#pendingCalls.set(seq, [resolve, reject]);
|
|
279
269
|
});
|
|
280
270
|
}
|
|
281
271
|
/** 调用远程方法,放弃返回值 */
|
|
@@ -283,15 +273,18 @@ export class RpcSocket {
|
|
|
283
273
|
const seq = this.nextSeq();
|
|
284
274
|
void this.sendPayload('notify', { seq, method, args });
|
|
285
275
|
}
|
|
276
|
+
#pendingSubscriptions;
|
|
286
277
|
/** 调用远程订阅 */
|
|
287
278
|
subscribe(method, ...args) {
|
|
288
279
|
return new Observable((subscriber) => {
|
|
289
280
|
const seq = this.nextSeq();
|
|
281
|
+
const status = [subscriber, false];
|
|
290
282
|
void this.sendPayload('subscribe', { seq, method, args });
|
|
291
|
-
this
|
|
283
|
+
this.#pendingSubscriptions.set(seq, status);
|
|
292
284
|
return () => {
|
|
293
|
-
this
|
|
294
|
-
|
|
285
|
+
this.#pendingSubscriptions.delete(seq);
|
|
286
|
+
if (!status[1])
|
|
287
|
+
void this.sendPayload('unsubscribe', { seq });
|
|
295
288
|
};
|
|
296
289
|
});
|
|
297
290
|
}
|
|
@@ -305,20 +298,24 @@ export class RpcSocket {
|
|
|
305
298
|
if (this.#destroyed)
|
|
306
299
|
return;
|
|
307
300
|
logger('[%s] socket destroyed', this.id);
|
|
308
|
-
if (this
|
|
309
|
-
(this.
|
|
310
|
-
this.
|
|
301
|
+
if (this.#socket &&
|
|
302
|
+
(this.#socket.readyState === this.#socket.CONNECTING || this.#socket.readyState === this.#socket.OPEN)) {
|
|
303
|
+
this.#socket.close(1000);
|
|
311
304
|
}
|
|
312
|
-
this
|
|
313
|
-
for (const s of this
|
|
305
|
+
this.#socket = undefined;
|
|
306
|
+
for (const s of this.#localSubscription.values()) {
|
|
314
307
|
s.unsubscribe();
|
|
315
|
-
|
|
316
|
-
|
|
308
|
+
}
|
|
309
|
+
this.#localSubscription.clear();
|
|
310
|
+
for (const [, reject] of this.#pendingCalls.values()) {
|
|
317
311
|
reject(new Error(`RPC Socket closed.`));
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
312
|
+
}
|
|
313
|
+
this.#pendingCalls.clear();
|
|
314
|
+
for (const s of this.#pendingSubscriptions.values()) {
|
|
315
|
+
s[1] = true;
|
|
316
|
+
s[0].error(new Error(`RPC Socket closed.`));
|
|
317
|
+
}
|
|
318
|
+
this.#pendingSubscriptions.clear();
|
|
322
319
|
this.#destroyed = true;
|
|
323
320
|
}
|
|
324
321
|
}
|
package/dist/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Subscriber } from 'rxjs';
|
|
2
|
+
/** Promise callbacks */
|
|
3
|
+
export type PromiseCallbacks<T = unknown> = [resolve: (value: T) => void, reject: (reason?: unknown) => void];
|
|
4
|
+
/** Observable status */
|
|
5
|
+
export type ObservableStatus<T = unknown> = [subscriber: Subscriber<T>, end: boolean];
|
|
6
|
+
//# sourceMappingURL=callbacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callbacks.d.ts","sourceRoot":"","sources":["../../src/types/callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,wBAAwB;AACxB,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC;AAE9G,wBAAwB;AACxB,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../src/types/callbacks.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/utils/serialize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEpE,WAAW;AACX,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAWnE;AAGD,cAAc;AACd,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/utils/serialize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEpE,WAAW;AACX,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAWnE;AAGD,cAAc;AACd,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAyB3D;AACD,eAAe;AACf,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAqB3D"}
|
package/dist/utils/serialize.js
CHANGED
|
@@ -37,7 +37,7 @@ export function serializeError(error) {
|
|
|
37
37
|
return {
|
|
38
38
|
...rest,
|
|
39
39
|
name: String(name ?? 'Error'),
|
|
40
|
-
message:
|
|
40
|
+
message: typeof message == 'string' ? message : String(error),
|
|
41
41
|
stack: stack,
|
|
42
42
|
errors: reenter ? undefined : Array.isArray(errors) ? errors.map((e) => serializeError(e)) : errors,
|
|
43
43
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/utils/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C,WAAW;AACX,MAAM,UAAU,aAAa,CAAC,IAAa;IACvC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,QAAQ;QAAE,OAAO,SAAS,CAAC;IACvD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAoB,CAAe,CAAC;QAC3D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,IAAI,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC7D,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACvD,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACtD,OAAO,OAAO,CAAC;IACnB,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED,MAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAChD,cAAc;AACd,MAAM,UAAU,cAAc,CAAC,KAAc;IACzC,IAAI,KAAK,IAAI,IAAI;QACb,OAAO;YACH,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE;SACd,CAAC;IACN,IAAI,OAAO,KAAK,IAAI,QAAQ;QACxB,OAAO;YACH,IAAI,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/utils/serialize.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudpss/ubrpc",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.16",
|
|
4
4
|
"author": "CloudPSS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"rxjs": "^7.8.2",
|
|
21
21
|
"uuid": "^13.0.0",
|
|
22
|
-
"@cloudpss/fetch": "~0.6.
|
|
23
|
-
"@cloudpss/ubjson": "~0.6.
|
|
22
|
+
"@cloudpss/fetch": "~0.6.16",
|
|
23
|
+
"@cloudpss/ubjson": "~0.6.16"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/ws": "^8.18.1",
|
package/src/logger.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { DebugLoggerFunction } from 'node:util';
|
|
2
2
|
|
|
3
|
-
export let logger: DebugLoggerFunction
|
|
3
|
+
export let logger: DebugLoggerFunction;
|
|
4
|
+
|
|
5
|
+
if (typeof process != 'undefined' && typeof process.getBuiltinModule == 'function') {
|
|
6
|
+
const { debuglog } = process.getBuiltinModule('node:util');
|
|
7
|
+
logger = debuglog('cloudpss/ubrpc', (l) => (logger = l));
|
|
8
|
+
} else {
|
|
9
|
+
// eslint-disable-next-line no-console
|
|
10
|
+
logger = (msg: string, ...param: unknown[]) => console.debug(`[cloudpss/ubrpc] ${msg}`, ...param);
|
|
11
|
+
}
|
package/src/ready.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PromiseCallbacks } from './types/callbacks.js';
|
|
2
|
+
|
|
3
|
+
const kReadyCallbacks = Symbol('kReadyCallbacks');
|
|
4
|
+
|
|
5
|
+
/** Ready Promise */
|
|
6
|
+
type WithReady<T extends object> = T & {
|
|
7
|
+
ready: Promise<void>;
|
|
8
|
+
[kReadyCallbacks]?: PromiseCallbacks<void>;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 创建或返回 ready Promise
|
|
12
|
+
*/
|
|
13
|
+
export function makeReady<T extends object>(target: T): PromiseCallbacks<void> {
|
|
14
|
+
const t = target as WithReady<T>;
|
|
15
|
+
|
|
16
|
+
const existing = t[kReadyCallbacks];
|
|
17
|
+
if (existing != null) return existing;
|
|
18
|
+
|
|
19
|
+
let callbacks: PromiseCallbacks<void> | undefined;
|
|
20
|
+
const ready = new Promise<void>((resolve, reject) => {
|
|
21
|
+
callbacks = [resolve, reject];
|
|
22
|
+
});
|
|
23
|
+
if (callbacks == null) throw new Error(`Bad promise`);
|
|
24
|
+
t[kReadyCallbacks] = callbacks;
|
|
25
|
+
ready
|
|
26
|
+
.catch(() => {
|
|
27
|
+
// Avoid unhandled rejection
|
|
28
|
+
})
|
|
29
|
+
.finally(() => {
|
|
30
|
+
if (t[kReadyCallbacks] === callbacks) {
|
|
31
|
+
t[kReadyCallbacks] = undefined;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
t.ready = ready;
|
|
35
|
+
return callbacks;
|
|
36
|
+
}
|
package/src/server.ts
CHANGED
|
@@ -8,9 +8,9 @@ import { send } from './utils/messaging.js';
|
|
|
8
8
|
import { serializeError } from './utils/serialize.js';
|
|
9
9
|
import { VERSION } from './version.js';
|
|
10
10
|
|
|
11
|
-
const kOnClose = Symbol('kOnClose');
|
|
12
|
-
const kMetadata = Symbol('kMetadata');
|
|
13
|
-
const kReplaceSocket = Symbol('kReplaceSocket');
|
|
11
|
+
const kOnClose = Symbol.for('kOnClose');
|
|
12
|
+
const kMetadata = Symbol.for('kMetadata');
|
|
13
|
+
const kReplaceSocket = Symbol.for('kReplaceSocket');
|
|
14
14
|
|
|
15
15
|
/** 认证过的 socket */
|
|
16
16
|
type WebSocketWithMetadata = WebSocket & { [kMetadata]: RpcMetadata };
|
package/src/socket.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { connected } from '@cloudpss/fetch';
|
|
2
|
-
import { from, Observable, type
|
|
2
|
+
import { from, Observable, type Subscription } from 'rxjs';
|
|
3
3
|
import type {
|
|
4
4
|
ConnectionID,
|
|
5
5
|
RpcCallPayload,
|
|
@@ -17,10 +17,12 @@ import type {
|
|
|
17
17
|
RpcReturns,
|
|
18
18
|
Subjects,
|
|
19
19
|
} from './types/utils.js';
|
|
20
|
+
import type { ObservableStatus, PromiseCallbacks } from './types/callbacks.js';
|
|
20
21
|
import { send } from './utils/messaging.js';
|
|
21
22
|
import { decodePayload, deserializeError, serializeError } from './utils/serialize.js';
|
|
22
23
|
import { logger } from './logger.js';
|
|
23
24
|
import { WebSocketAppCode } from './codes.js';
|
|
25
|
+
import { makeReady } from './ready.js';
|
|
24
26
|
|
|
25
27
|
/** RPC 连接 */
|
|
26
28
|
export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
@@ -28,8 +30,8 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
28
30
|
readonly id: ConnectionID,
|
|
29
31
|
local?: RpcObject<TLocal>,
|
|
30
32
|
) {
|
|
31
|
-
this
|
|
32
|
-
|
|
33
|
+
this.#local = local;
|
|
34
|
+
makeReady(this);
|
|
33
35
|
}
|
|
34
36
|
protected _localMetadata?: RpcMetadata;
|
|
35
37
|
protected _remoteMetadata?: RpcMetadata;
|
|
@@ -45,44 +47,28 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
45
47
|
get authenticated(): boolean {
|
|
46
48
|
return this._remoteMetadata != null;
|
|
47
49
|
}
|
|
48
|
-
|
|
50
|
+
readonly #local?: RpcObject<TLocal>;
|
|
49
51
|
/** 用于响应调用的本地对象 */
|
|
50
52
|
protected get local(): RpcObject<TLocal> | undefined {
|
|
51
|
-
return this
|
|
53
|
+
return this.#local;
|
|
52
54
|
}
|
|
53
|
-
|
|
55
|
+
#socket?: WebSocket;
|
|
54
56
|
/** 作为底层传输的 WebSocket */
|
|
55
57
|
get socket(): WebSocket {
|
|
56
58
|
if (this.#destroyed) throw new Error(`RPC Socket destroyed.`);
|
|
57
|
-
if (!this
|
|
58
|
-
return this
|
|
59
|
+
if (!this.#socket) throw new Error(`Socket not initialized`);
|
|
60
|
+
return this.#socket;
|
|
59
61
|
}
|
|
60
62
|
protected set socket(value: WebSocket) {
|
|
61
63
|
if (this.#destroyed) throw new Error(`RPC Socket destroyed.`);
|
|
62
|
-
if (this
|
|
63
|
-
const callbacks =
|
|
64
|
-
const oldValue = this
|
|
65
|
-
this
|
|
64
|
+
if (this.#socket === value) return;
|
|
65
|
+
const callbacks = makeReady(this);
|
|
66
|
+
const oldValue = this.#socket;
|
|
67
|
+
this.#socket = value;
|
|
66
68
|
void this.initSocket(oldValue, value).then(...callbacks);
|
|
67
69
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (this.__readyCallbacks != null) return this.__readyCallbacks;
|
|
71
|
-
const ready = new Promise<void>((...args) => (this.__readyCallbacks = args));
|
|
72
|
-
ready
|
|
73
|
-
.catch(() => {
|
|
74
|
-
// Avoid unhandled rejection
|
|
75
|
-
})
|
|
76
|
-
.finally(() => {
|
|
77
|
-
if (this.ready === ready) this.__readyCallbacks = undefined;
|
|
78
|
-
});
|
|
79
|
-
this.ready = ready;
|
|
80
|
-
if (!this.__readyCallbacks) throw new Error(`Bad promise`);
|
|
81
|
-
return this.__readyCallbacks;
|
|
82
|
-
}
|
|
83
|
-
private __readyCallbacks?: Parameters<ConstructorParameters<typeof Promise<void>>[0]>;
|
|
84
|
-
protected ready!: Promise<void>;
|
|
85
|
-
private readonly __handlers = Object.freeze({
|
|
70
|
+
protected readonly ready!: Promise<void>;
|
|
71
|
+
readonly #handlers = Object.freeze({
|
|
86
72
|
open: (ev: Event) => this.onOpen(ev),
|
|
87
73
|
close: (ev: CloseEvent) => this.onClose(ev),
|
|
88
74
|
error: (ev: Event | ErrorEvent) => this.onError(ev),
|
|
@@ -92,10 +78,10 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
92
78
|
protected async initSocket(oldValue: WebSocket | undefined, newValue: WebSocket): Promise<void> {
|
|
93
79
|
try {
|
|
94
80
|
if (oldValue) {
|
|
95
|
-
oldValue.removeEventListener('open', this.
|
|
96
|
-
oldValue.removeEventListener('close', this.
|
|
97
|
-
oldValue.removeEventListener('error', this.
|
|
98
|
-
oldValue.removeEventListener('message', this.
|
|
81
|
+
oldValue.removeEventListener('open', this.#handlers.open);
|
|
82
|
+
oldValue.removeEventListener('close', this.#handlers.close);
|
|
83
|
+
oldValue.removeEventListener('error', this.#handlers.error);
|
|
84
|
+
oldValue.removeEventListener('message', this.#handlers.message);
|
|
99
85
|
if (oldValue.readyState === oldValue.OPEN || oldValue.readyState === oldValue.CONNECTING) {
|
|
100
86
|
logger('[%s] close old socket', this.id);
|
|
101
87
|
oldValue.close(WebSocketAppCode.REPLACED);
|
|
@@ -103,11 +89,11 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
103
89
|
}
|
|
104
90
|
await connected(newValue);
|
|
105
91
|
const info = await this.authSocket();
|
|
106
|
-
if (this
|
|
107
|
-
newValue.addEventListener('open', this.
|
|
108
|
-
newValue.addEventListener('close', this.
|
|
109
|
-
newValue.addEventListener('error', this.
|
|
110
|
-
newValue.addEventListener('message', this.
|
|
92
|
+
if (this.#socket === newValue) {
|
|
93
|
+
newValue.addEventListener('open', this.#handlers.open);
|
|
94
|
+
newValue.addEventListener('close', this.#handlers.close);
|
|
95
|
+
newValue.addEventListener('error', this.#handlers.error);
|
|
96
|
+
newValue.addEventListener('message', this.#handlers.message);
|
|
111
97
|
this._remoteMetadata = info ?? {};
|
|
112
98
|
}
|
|
113
99
|
} catch (ex) {
|
|
@@ -121,7 +107,7 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
121
107
|
/** 响应 WebSocket error */
|
|
122
108
|
protected onError(_ev: ErrorEvent | Event): void {
|
|
123
109
|
this._remoteMetadata = undefined;
|
|
124
|
-
|
|
110
|
+
makeReady(this);
|
|
125
111
|
}
|
|
126
112
|
/** 响应 WebSocket open */
|
|
127
113
|
protected onOpen(_ev: Event): void {
|
|
@@ -133,7 +119,7 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
133
119
|
if (ev.code === 1000) {
|
|
134
120
|
this.destroy();
|
|
135
121
|
} else {
|
|
136
|
-
|
|
122
|
+
makeReady(this);
|
|
137
123
|
}
|
|
138
124
|
}
|
|
139
125
|
/** 响应 WebSocket message */
|
|
@@ -162,10 +148,10 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
162
148
|
void this.localCall(payload);
|
|
163
149
|
return true;
|
|
164
150
|
case 'return': {
|
|
165
|
-
const pending = this
|
|
151
|
+
const pending = this.#pendingCalls.get(payload.seq);
|
|
166
152
|
// 即使不存在等待的请求,也认为响应是有效的
|
|
167
153
|
if (!pending) return true;
|
|
168
|
-
this
|
|
154
|
+
this.#pendingCalls.delete(payload.seq);
|
|
169
155
|
if (payload.error) {
|
|
170
156
|
pending[1](deserializeError(payload.error));
|
|
171
157
|
} else {
|
|
@@ -177,26 +163,28 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
177
163
|
void this.localSubscribe(payload);
|
|
178
164
|
return true;
|
|
179
165
|
case 'unsubscribe': {
|
|
180
|
-
const subscription = this
|
|
166
|
+
const subscription = this.#localSubscription.get(payload.seq);
|
|
181
167
|
// 即使不存在对应订阅,也认为响应是有效的
|
|
182
168
|
if (!subscription) return true;
|
|
183
169
|
subscription.unsubscribe();
|
|
184
|
-
this
|
|
170
|
+
this.#localSubscription.delete(payload.seq);
|
|
185
171
|
return true;
|
|
186
172
|
}
|
|
187
173
|
case 'publish': {
|
|
188
|
-
const
|
|
174
|
+
const status = this.#pendingSubscriptions.get(payload.seq);
|
|
189
175
|
// 即使不存在对应订阅,也认为响应是有效的
|
|
190
|
-
if (!
|
|
176
|
+
if (!status) {
|
|
191
177
|
void this.sendPayload('unsubscribe', { seq: payload.seq });
|
|
192
178
|
return true;
|
|
193
179
|
}
|
|
194
180
|
if (payload.error) {
|
|
195
|
-
|
|
181
|
+
status[1] = true;
|
|
182
|
+
status[0].error(deserializeError(payload.error));
|
|
196
183
|
} else if (payload.complete) {
|
|
197
|
-
|
|
184
|
+
status[1] = true;
|
|
185
|
+
status[0].complete();
|
|
198
186
|
} else {
|
|
199
|
-
|
|
187
|
+
status[0].next(payload.next);
|
|
200
188
|
}
|
|
201
189
|
return true;
|
|
202
190
|
}
|
|
@@ -228,7 +216,7 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
228
216
|
return this.sendPayload('return', { seq, error: serializeError(ex) });
|
|
229
217
|
}
|
|
230
218
|
}
|
|
231
|
-
|
|
219
|
+
readonly #localSubscription = new Map<number, Subscription>();
|
|
232
220
|
/** 调用本地方法 */
|
|
233
221
|
protected async localSubscribe(payload: RpcSubscribePayload): Promise<void> {
|
|
234
222
|
const method = this.local ? this.local[payload.method as Subjects<RpcObject<TLocal>>] : undefined;
|
|
@@ -246,15 +234,15 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
246
234
|
void this.sendPayload('publish', { seq, next: value });
|
|
247
235
|
},
|
|
248
236
|
error: (err) => {
|
|
249
|
-
this
|
|
237
|
+
this.#localSubscription.delete(payload.seq);
|
|
250
238
|
void this.sendPayload('publish', { seq, error: serializeError(err) });
|
|
251
239
|
},
|
|
252
240
|
complete: () => {
|
|
253
|
-
this
|
|
241
|
+
this.#localSubscription.delete(payload.seq);
|
|
254
242
|
void this.sendPayload('publish', { seq, complete: true });
|
|
255
243
|
},
|
|
256
244
|
});
|
|
257
|
-
this
|
|
245
|
+
this.#localSubscription.set(seq, subscription);
|
|
258
246
|
} catch (ex) {
|
|
259
247
|
return this.sendPayload('publish', { seq, error: serializeError(ex) });
|
|
260
248
|
}
|
|
@@ -276,10 +264,7 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
276
264
|
this.seq += 2;
|
|
277
265
|
return seq;
|
|
278
266
|
}
|
|
279
|
-
|
|
280
|
-
number,
|
|
281
|
-
[resolve: (result: unknown) => void, reject: (error: Error) => void]
|
|
282
|
-
>();
|
|
267
|
+
readonly #pendingCalls = new Map<number, PromiseCallbacks>();
|
|
283
268
|
/** 调用远程方法 */
|
|
284
269
|
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
285
270
|
call<TMethod extends Methods<TRemote>>(
|
|
@@ -289,7 +274,7 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
289
274
|
return new Promise((resolve, reject) => {
|
|
290
275
|
const seq = this.nextSeq();
|
|
291
276
|
void this.sendPayload('call', { seq, method, args });
|
|
292
|
-
this
|
|
277
|
+
this.#pendingCalls.set(seq, [resolve as (result: unknown) => void, reject]);
|
|
293
278
|
});
|
|
294
279
|
}
|
|
295
280
|
/** 调用远程方法,放弃返回值 */
|
|
@@ -301,7 +286,7 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
301
286
|
void this.sendPayload('notify', { seq, method, args });
|
|
302
287
|
}
|
|
303
288
|
|
|
304
|
-
|
|
289
|
+
readonly #pendingSubscriptions = new Map<number, ObservableStatus>();
|
|
305
290
|
/** 调用远程订阅 */
|
|
306
291
|
subscribe<TSubject extends Subjects<TRemote>>(
|
|
307
292
|
method: TSubject,
|
|
@@ -309,11 +294,12 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
309
294
|
): Observable<RpcReturns<TRemote[TSubject]>> {
|
|
310
295
|
return new Observable((subscriber) => {
|
|
311
296
|
const seq = this.nextSeq();
|
|
297
|
+
const status: ObservableStatus<RpcReturns<TRemote[TSubject]>> = [subscriber, false];
|
|
312
298
|
void this.sendPayload('subscribe', { seq, method, args });
|
|
313
|
-
this
|
|
299
|
+
this.#pendingSubscriptions.set(seq, status);
|
|
314
300
|
return () => {
|
|
315
|
-
this
|
|
316
|
-
void this.sendPayload('unsubscribe', { seq });
|
|
301
|
+
this.#pendingSubscriptions.delete(seq);
|
|
302
|
+
if (!status[1]) void this.sendPayload('unsubscribe', { seq });
|
|
317
303
|
};
|
|
318
304
|
});
|
|
319
305
|
}
|
|
@@ -328,18 +314,29 @@ export abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
|
328
314
|
if (this.#destroyed) return;
|
|
329
315
|
logger('[%s] socket destroyed', this.id);
|
|
330
316
|
if (
|
|
331
|
-
this
|
|
332
|
-
(this.
|
|
317
|
+
this.#socket &&
|
|
318
|
+
(this.#socket.readyState === this.#socket.CONNECTING || this.#socket.readyState === this.#socket.OPEN)
|
|
333
319
|
) {
|
|
334
|
-
this.
|
|
320
|
+
this.#socket.close(1000);
|
|
335
321
|
}
|
|
336
|
-
this
|
|
337
|
-
|
|
338
|
-
this
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
322
|
+
this.#socket = undefined;
|
|
323
|
+
|
|
324
|
+
for (const s of this.#localSubscription.values()) {
|
|
325
|
+
s.unsubscribe();
|
|
326
|
+
}
|
|
327
|
+
this.#localSubscription.clear();
|
|
328
|
+
|
|
329
|
+
for (const [, reject] of this.#pendingCalls.values()) {
|
|
330
|
+
reject(new Error(`RPC Socket closed.`));
|
|
331
|
+
}
|
|
332
|
+
this.#pendingCalls.clear();
|
|
333
|
+
|
|
334
|
+
for (const s of this.#pendingSubscriptions.values()) {
|
|
335
|
+
s[1] = true;
|
|
336
|
+
s[0].error(new Error(`RPC Socket closed.`));
|
|
337
|
+
}
|
|
338
|
+
this.#pendingSubscriptions.clear();
|
|
339
|
+
|
|
343
340
|
this.#destroyed = true;
|
|
344
341
|
}
|
|
345
342
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Subscriber } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
/** Promise callbacks */
|
|
4
|
+
export type PromiseCallbacks<T = unknown> = [resolve: (value: T) => void, reject: (reason?: unknown) => void];
|
|
5
|
+
|
|
6
|
+
/** Observable status */
|
|
7
|
+
export type ObservableStatus<T = unknown> = [subscriber: Subscriber<T>, end: boolean];
|
package/src/utils/serialize.ts
CHANGED
|
@@ -26,7 +26,6 @@ export function serializeError(error: unknown): RpcErrorLike {
|
|
|
26
26
|
if (typeof error != 'object')
|
|
27
27
|
return {
|
|
28
28
|
name: 'Error',
|
|
29
|
-
|
|
30
29
|
message: String(error),
|
|
31
30
|
};
|
|
32
31
|
try {
|
|
@@ -36,7 +35,7 @@ export function serializeError(error: unknown): RpcErrorLike {
|
|
|
36
35
|
return {
|
|
37
36
|
...rest,
|
|
38
37
|
name: String(name ?? 'Error'),
|
|
39
|
-
message:
|
|
38
|
+
message: typeof message == 'string' ? message : String(error),
|
|
40
39
|
stack: stack,
|
|
41
40
|
errors: reenter ? undefined : Array.isArray(errors) ? errors.map((e) => serializeError(e)) : errors,
|
|
42
41
|
};
|
package/tests/client.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { RpcClientSocket } from '@cloudpss/ubrpc';
|
|
2
2
|
import { setTimeout } from 'node:timers/promises';
|
|
3
|
-
import { WebSocket } from 'ws';
|
|
4
3
|
|
|
5
4
|
const rpc = new RpcClientSocket('ws://localhost:8090');
|
|
6
5
|
//await setTimeout(1000);
|
|
@@ -13,10 +12,13 @@ const s = rpc.subscribe('timer', 1000).subscribe({
|
|
|
13
12
|
error: () => console.log('error'),
|
|
14
13
|
});
|
|
15
14
|
await setTimeout(1200);
|
|
16
|
-
s.unsubscribe();
|
|
15
|
+
// s.unsubscribe();
|
|
17
16
|
await setTimeout(1000);
|
|
18
|
-
|
|
17
|
+
|
|
18
|
+
// 模拟链接意外断开
|
|
19
|
+
rpc.socket.close();
|
|
20
|
+
|
|
19
21
|
await setTimeout(1000);
|
|
20
22
|
console.log(await rpc.call('hello', undefined));
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
s.add(() => rpc.destroy());
|
package/tests/runner.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { setTimeout } from 'node:timers/promises';
|
|
|
4
4
|
|
|
5
5
|
const token = 'a7193dc0-f65f-465f-89ed-18a3f72cf13a';
|
|
6
6
|
const id = v5(token, '24b716e5-01c6-452a-9584-845b586d915f');
|
|
7
|
-
const rpc = new RpcClientSocket('wss://
|
|
7
|
+
const rpc = new RpcClientSocket('wss://dev.local.ddns.cloudpss.net/api/job', {
|
|
8
8
|
info: {
|
|
9
9
|
id,
|
|
10
10
|
token,
|