@cloudpss/ubrpc 0.4.10 → 0.4.12
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 +49 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.js +11 -2
- package/dist/client.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +7 -8
- package/dist/server.js.map +1 -1
- package/dist/socket.d.ts +3 -1
- package/dist/socket.js +24 -3
- package/dist/socket.js.map +1 -1
- package/package.json +3 -3
- package/src/client.ts +12 -2
- package/src/server.ts +8 -9
- package/src/socket.ts +23 -5
package/README.md
CHANGED
|
@@ -1,3 +1,52 @@
|
|
|
1
1
|
# @cloudpss/ubrpc
|
|
2
2
|
|
|
3
3
|
Rpc server/client build on websocket and ubjson.
|
|
4
|
+
|
|
5
|
+
## Introduction
|
|
6
|
+
|
|
7
|
+
本模块是基于 websocket 和 ubjson 的 rpc 服务端/客户端模块。使用 websocket 作为底层通信协议,使用 ubjson 作为数据序列化协议。在建立连接后,支持通过 websocket 实现双向调用。
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
### 作为 WebSocket 服务端
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { WebSocketServer } from 'ws';
|
|
15
|
+
import { RpcServer } from '@cloudpss/ubrpc';
|
|
16
|
+
|
|
17
|
+
const rpc = new RpcServer(
|
|
18
|
+
{
|
|
19
|
+
hello(name) {
|
|
20
|
+
return `Hello, ${name}`;
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
(meta) => {
|
|
24
|
+
// 校验客户端信息,拒绝连接时抛出异常
|
|
25
|
+
// 返回服务端信息供客户端验证
|
|
26
|
+
return {};
|
|
27
|
+
},
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const server = new WebSocketServer({
|
|
31
|
+
host: 'localhost',
|
|
32
|
+
port: 8090,
|
|
33
|
+
path: '/',
|
|
34
|
+
});
|
|
35
|
+
server.on('connection', async (socket) => {
|
|
36
|
+
try {
|
|
37
|
+
await rpc.connect(socket);
|
|
38
|
+
} catch (ex) {
|
|
39
|
+
console.log(ex);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 作为 WebSocket 客户端
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { RpcClientSocket } from '@cloudpss/ubrpc';
|
|
48
|
+
|
|
49
|
+
const rpc = new RpcClientSocket('ws://localhost:8090');
|
|
50
|
+
const result = await rpc.call('hello', 'world');
|
|
51
|
+
console.log(result);
|
|
52
|
+
```
|
package/dist/client.d.ts
CHANGED
package/dist/client.js
CHANGED
|
@@ -11,7 +11,7 @@ export class RpcClientSocket extends RpcSocket {
|
|
|
11
11
|
this._localMetadata = metadata;
|
|
12
12
|
this.url = typeof url == 'string' ? url : url.href;
|
|
13
13
|
this.seq = 2;
|
|
14
|
-
this.
|
|
14
|
+
this.connect();
|
|
15
15
|
}
|
|
16
16
|
/** @inheritdoc */
|
|
17
17
|
async authSocket() {
|
|
@@ -32,8 +32,17 @@ export class RpcClientSocket extends RpcSocket {
|
|
|
32
32
|
if (ev.code === 1000)
|
|
33
33
|
return;
|
|
34
34
|
setTimeout(() => {
|
|
35
|
-
this.
|
|
35
|
+
this.connect();
|
|
36
36
|
}, 1000);
|
|
37
37
|
}
|
|
38
|
+
/** 建立连接 */
|
|
39
|
+
connect() {
|
|
40
|
+
this.socket = new WebSocket(this.url);
|
|
41
|
+
this.ready.catch(() => {
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
this.connect();
|
|
44
|
+
}, 2000);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
38
47
|
}
|
|
39
48
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,6BAA6B;AAC7B,MAAM,OAAO,eAAuD,SAAQ,SAA0B;IAClG,YAAY,GAAiB,EAAE,QAAsB,EAAE,KAAyB;QAC5E,KAAK,CAAC,EAAE,EAAkB,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,OAAO,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACnD,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,6BAA6B;AAC7B,MAAM,OAAO,eAAuD,SAAQ,SAA0B;IAClG,YAAY,GAAiB,EAAE,QAAsB,EAAE,KAAyB;QAC5E,KAAK,CAAC,EAAE,EAAkB,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,OAAO,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACnD,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,kBAAkB;IACC,KAAK,CAAC,UAAU;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;YACjB,GAAG;YACH,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE;SACrC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,kBAAkB;IACC,OAAO,CAAC,EAAwB;QAC/C,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClB,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAE7B,UAAU,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,CAAC;IACb,CAAC;IAED,WAAW;IACD,OAAO;QACb,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YAClB,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
package/dist/server.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export declare class RpcServer<TRemote extends {}, TLocal extends {}> {
|
|
|
31
31
|
/** 由 WS Server 建立的 RPC 连接 */
|
|
32
32
|
export declare class RpcServerSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
|
|
33
33
|
readonly server: RpcServer<TRemote, TLocal>;
|
|
34
|
-
constructor(id: ConnectionID, server: RpcServer<TRemote, TLocal
|
|
34
|
+
constructor(id: ConnectionID, server: RpcServer<TRemote, TLocal>);
|
|
35
35
|
/** @inheritdoc */
|
|
36
36
|
protected authSocket(): Promise<RpcMetadata>;
|
|
37
37
|
/** @inheritdoc */
|
|
@@ -39,6 +39,6 @@ export declare class RpcServerSocket<TRemote extends object, TLocal extends obje
|
|
|
39
39
|
/** @inheritdoc */
|
|
40
40
|
protected onClose(ev: WebSocket.CloseEvent): void;
|
|
41
41
|
/** 替换 socket */
|
|
42
|
-
[kReplaceSocket](newSocket: WebSocketWithMetadata): void
|
|
42
|
+
[kReplaceSocket](newSocket: WebSocketWithMetadata): Promise<void>;
|
|
43
43
|
}
|
|
44
44
|
export {};
|
package/dist/server.js
CHANGED
|
@@ -29,11 +29,10 @@ export class RpcServer {
|
|
|
29
29
|
const s = socket;
|
|
30
30
|
const [id, metadata] = await this.authSocket(socket);
|
|
31
31
|
s[kMetadata] = metadata;
|
|
32
|
-
|
|
33
|
-
if (!
|
|
34
|
-
|
|
32
|
+
let client = this.sockets.get(id);
|
|
33
|
+
if (!client) {
|
|
34
|
+
client = new RpcServerSocket(id, this);
|
|
35
35
|
this.sockets.set(id, client);
|
|
36
|
-
return client;
|
|
37
36
|
}
|
|
38
37
|
else {
|
|
39
38
|
const tid = this.disconnectingSockets.get(id);
|
|
@@ -41,9 +40,9 @@ export class RpcServer {
|
|
|
41
40
|
this.disconnectingSockets.delete(id);
|
|
42
41
|
clearTimeout(tid);
|
|
43
42
|
}
|
|
44
|
-
exist[kReplaceSocket](s);
|
|
45
|
-
return exist;
|
|
46
43
|
}
|
|
44
|
+
await client[kReplaceSocket](s);
|
|
45
|
+
return client;
|
|
47
46
|
}
|
|
48
47
|
/** 认证客户端 */
|
|
49
48
|
async authSocket(socket) {
|
|
@@ -92,11 +91,10 @@ export class RpcServer {
|
|
|
92
91
|
}
|
|
93
92
|
/** 由 WS Server 建立的 RPC 连接 */
|
|
94
93
|
export class RpcServerSocket extends RpcSocket {
|
|
95
|
-
constructor(id, server
|
|
94
|
+
constructor(id, server) {
|
|
96
95
|
super(id);
|
|
97
96
|
this.server = server;
|
|
98
97
|
this.seq = 1;
|
|
99
|
-
this.socket = socket;
|
|
100
98
|
}
|
|
101
99
|
/** @inheritdoc */
|
|
102
100
|
authSocket() {
|
|
@@ -114,6 +112,7 @@ export class RpcServerSocket extends RpcSocket {
|
|
|
114
112
|
/** 替换 socket */
|
|
115
113
|
[kReplaceSocket](newSocket) {
|
|
116
114
|
this.socket = newSocket;
|
|
115
|
+
return this.ready;
|
|
117
116
|
}
|
|
118
117
|
}
|
|
119
118
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,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;AACpC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACtC,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAKhD,8BAA8B;AAC9B,MAAM,OAAO,SAAS;IAClB,YACI,KAA6F;IAC7F,YAAY;IACH,gBAA+E,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QAAzF,kBAAa,GAAb,aAAa,CAA4E;QAa7F,YAAO,GAAG,IAAI,GAAG,EAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/socket.d.ts
CHANGED
|
@@ -22,7 +22,9 @@ export declare abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
22
22
|
/** 作为底层传输的 WebSocket */
|
|
23
23
|
get socket(): WebSocket;
|
|
24
24
|
protected set socket(value: WebSocket);
|
|
25
|
-
|
|
25
|
+
/** 创建 ready Promise */
|
|
26
|
+
private makeReady;
|
|
27
|
+
private __readyCallbacks?;
|
|
26
28
|
protected ready: Promise<void>;
|
|
27
29
|
private readonly __handlers;
|
|
28
30
|
/** 初始化 WebSocket */
|
package/dist/socket.js
CHANGED
|
@@ -18,7 +18,7 @@ export class RpcSocket {
|
|
|
18
18
|
this.pendingCalls = new Map();
|
|
19
19
|
this.pendingSubscriptions = new Map();
|
|
20
20
|
this.__local = local;
|
|
21
|
-
this.
|
|
21
|
+
this.makeReady();
|
|
22
22
|
}
|
|
23
23
|
/** 本地认证信息 */
|
|
24
24
|
get localMetadata() {
|
|
@@ -45,8 +45,28 @@ export class RpcSocket {
|
|
|
45
45
|
set socket(value) {
|
|
46
46
|
if (this.__socket === value)
|
|
47
47
|
return;
|
|
48
|
+
const callbacks = this.makeReady();
|
|
49
|
+
const oldValue = this.__socket;
|
|
48
50
|
this.__socket = value;
|
|
49
|
-
void this.initSocket(
|
|
51
|
+
void this.initSocket(oldValue, value).then(...callbacks);
|
|
52
|
+
}
|
|
53
|
+
/** 创建 ready Promise */
|
|
54
|
+
makeReady() {
|
|
55
|
+
if (this.__readyCallbacks != null)
|
|
56
|
+
return this.__readyCallbacks;
|
|
57
|
+
const ready = new Promise((...args) => (this.__readyCallbacks = args));
|
|
58
|
+
ready
|
|
59
|
+
.catch(() => {
|
|
60
|
+
// Avoid unhandled rejection
|
|
61
|
+
})
|
|
62
|
+
.finally(() => {
|
|
63
|
+
if (this.ready === ready)
|
|
64
|
+
this.__readyCallbacks = undefined;
|
|
65
|
+
});
|
|
66
|
+
this.ready = ready;
|
|
67
|
+
if (!this.__readyCallbacks)
|
|
68
|
+
throw new Error(`Bad promise`);
|
|
69
|
+
return this.__readyCallbacks;
|
|
50
70
|
}
|
|
51
71
|
/** 初始化 WebSocket */
|
|
52
72
|
async initSocket(oldValue, newValue) {
|
|
@@ -75,6 +95,7 @@ export class RpcSocket {
|
|
|
75
95
|
/** 响应 WebSocket error */
|
|
76
96
|
onError(_ev) {
|
|
77
97
|
this._remoteMetadata = undefined;
|
|
98
|
+
this.makeReady();
|
|
78
99
|
}
|
|
79
100
|
/** 响应 WebSocket open */
|
|
80
101
|
onOpen(_ev) {
|
|
@@ -87,7 +108,7 @@ export class RpcSocket {
|
|
|
87
108
|
this.destroy();
|
|
88
109
|
}
|
|
89
110
|
else {
|
|
90
|
-
this.
|
|
111
|
+
this.makeReady();
|
|
91
112
|
}
|
|
92
113
|
}
|
|
93
114
|
/** 响应 WebSocket message */
|
package/dist/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,UAAU,EAA4B,MAAM,MAAM,CAAC;AAkBlE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,aAAa;AACb,MAAM,OAAgB,SAAS;IAC3B,YAAqB,EAAgB,EAAE,KAAyB;QAA3C,OAAE,GAAF,EAAE,CAAc;
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.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.4.
|
|
3
|
+
"version": "0.4.12",
|
|
4
4
|
"author": "CloudPSS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -28,12 +28,12 @@
|
|
|
28
28
|
"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@cloudpss/ubjson": "~0.4.
|
|
31
|
+
"@cloudpss/ubjson": "~0.4.12",
|
|
32
32
|
"@types/ws": "^8.5.4",
|
|
33
33
|
"isomorphic-ws": "^5.0.0",
|
|
34
34
|
"rxjs": "^7.8.0",
|
|
35
35
|
"uuid": "^9.0.0",
|
|
36
|
-
"ws": "^8.
|
|
36
|
+
"ws": "^8.13.0"
|
|
37
37
|
},
|
|
38
38
|
"optionalDependencies": {
|
|
39
39
|
"bufferutil": "^4.0.7",
|
package/src/client.ts
CHANGED
|
@@ -14,7 +14,7 @@ export class RpcClientSocket<TRemote extends {}, TLocal extends {}> extends RpcS
|
|
|
14
14
|
this._localMetadata = metadata;
|
|
15
15
|
this.url = typeof url == 'string' ? url : url.href;
|
|
16
16
|
this.seq = 2;
|
|
17
|
-
this.
|
|
17
|
+
this.connect();
|
|
18
18
|
}
|
|
19
19
|
readonly url: string;
|
|
20
20
|
/** @inheritdoc */
|
|
@@ -36,7 +36,17 @@ export class RpcClientSocket<TRemote extends {}, TLocal extends {}> extends RpcS
|
|
|
36
36
|
if (ev.code === 1000) return;
|
|
37
37
|
|
|
38
38
|
setTimeout(() => {
|
|
39
|
-
this.
|
|
39
|
+
this.connect();
|
|
40
40
|
}, 1000);
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
/** 建立连接 */
|
|
44
|
+
protected connect(): void {
|
|
45
|
+
this.socket = new WebSocket(this.url);
|
|
46
|
+
this.ready.catch(() => {
|
|
47
|
+
setTimeout(() => {
|
|
48
|
+
this.connect();
|
|
49
|
+
}, 2000);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
42
52
|
}
|
package/src/server.ts
CHANGED
|
@@ -39,20 +39,19 @@ export class RpcServer<TRemote extends {}, TLocal extends {}> {
|
|
|
39
39
|
const s = socket as WebSocketWithMetadata;
|
|
40
40
|
const [id, metadata] = await this.authSocket(socket);
|
|
41
41
|
s[kMetadata] = metadata;
|
|
42
|
-
|
|
43
|
-
if (!
|
|
44
|
-
|
|
42
|
+
let client = this.sockets.get(id);
|
|
43
|
+
if (!client) {
|
|
44
|
+
client = new RpcServerSocket(id, this);
|
|
45
45
|
this.sockets.set(id, client);
|
|
46
|
-
return client;
|
|
47
46
|
} else {
|
|
48
47
|
const tid = this.disconnectingSockets.get(id);
|
|
49
48
|
if (tid != null) {
|
|
50
49
|
this.disconnectingSockets.delete(id);
|
|
51
50
|
clearTimeout(tid);
|
|
52
51
|
}
|
|
53
|
-
exist[kReplaceSocket](s);
|
|
54
|
-
return exist;
|
|
55
52
|
}
|
|
53
|
+
await client[kReplaceSocket](s);
|
|
54
|
+
return client;
|
|
56
55
|
}
|
|
57
56
|
/** 认证客户端 */
|
|
58
57
|
protected async authSocket(socket: WebSocket): Promise<[ConnectionID, RpcMetadata]> {
|
|
@@ -102,10 +101,9 @@ export class RpcServer<TRemote extends {}, TLocal extends {}> {
|
|
|
102
101
|
|
|
103
102
|
/** 由 WS Server 建立的 RPC 连接 */
|
|
104
103
|
export class RpcServerSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
|
|
105
|
-
constructor(id: ConnectionID, readonly server: RpcServer<TRemote, TLocal
|
|
104
|
+
constructor(id: ConnectionID, readonly server: RpcServer<TRemote, TLocal>) {
|
|
106
105
|
super(id);
|
|
107
106
|
this.seq = 1;
|
|
108
|
-
this.socket = socket;
|
|
109
107
|
}
|
|
110
108
|
/** @inheritdoc */
|
|
111
109
|
protected authSocket(): Promise<RpcMetadata> {
|
|
@@ -121,7 +119,8 @@ export class RpcServerSocket<TRemote extends object, TLocal extends object> exte
|
|
|
121
119
|
this.server[kOnClose](this, ev);
|
|
122
120
|
}
|
|
123
121
|
/** 替换 socket */
|
|
124
|
-
[kReplaceSocket](newSocket: WebSocketWithMetadata): void {
|
|
122
|
+
[kReplaceSocket](newSocket: WebSocketWithMetadata): Promise<void> {
|
|
125
123
|
this.socket = newSocket;
|
|
124
|
+
return this.ready;
|
|
126
125
|
}
|
|
127
126
|
}
|
package/src/socket.ts
CHANGED
|
@@ -25,7 +25,7 @@ import { ready } from './utils/websocket.js';
|
|
|
25
25
|
export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
26
26
|
constructor(readonly id: ConnectionID, local?: RpcObject<TLocal>) {
|
|
27
27
|
this.__local = local;
|
|
28
|
-
this.
|
|
28
|
+
this.makeReady();
|
|
29
29
|
}
|
|
30
30
|
protected _localMetadata?: RpcMetadata;
|
|
31
31
|
protected _remoteMetadata?: RpcMetadata;
|
|
@@ -54,11 +54,28 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
54
54
|
}
|
|
55
55
|
protected set socket(value: WebSocket) {
|
|
56
56
|
if (this.__socket === value) return;
|
|
57
|
+
const callbacks = this.makeReady();
|
|
58
|
+
const oldValue = this.__socket;
|
|
57
59
|
this.__socket = value;
|
|
58
|
-
void this.initSocket(
|
|
60
|
+
void this.initSocket(oldValue, value).then(...callbacks);
|
|
59
61
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
/** 创建 ready Promise */
|
|
63
|
+
private makeReady(): Parameters<ConstructorParameters<typeof Promise<void>>[0]> {
|
|
64
|
+
if (this.__readyCallbacks != null) return this.__readyCallbacks;
|
|
65
|
+
const ready = new Promise<void>((...args) => (this.__readyCallbacks = args));
|
|
66
|
+
ready
|
|
67
|
+
.catch(() => {
|
|
68
|
+
// Avoid unhandled rejection
|
|
69
|
+
})
|
|
70
|
+
.finally(() => {
|
|
71
|
+
if (this.ready === ready) this.__readyCallbacks = undefined;
|
|
72
|
+
});
|
|
73
|
+
this.ready = ready;
|
|
74
|
+
if (!this.__readyCallbacks) throw new Error(`Bad promise`);
|
|
75
|
+
return this.__readyCallbacks;
|
|
76
|
+
}
|
|
77
|
+
private __readyCallbacks?: Parameters<ConstructorParameters<typeof Promise<void>>[0]>;
|
|
78
|
+
protected ready!: Promise<void>;
|
|
62
79
|
private readonly __handlers = Object.freeze({
|
|
63
80
|
open: (ev: WebSocket.Event) => this.onOpen(ev),
|
|
64
81
|
close: (ev: WebSocket.CloseEvent) => this.onClose(ev),
|
|
@@ -93,6 +110,7 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
93
110
|
/** 响应 WebSocket error */
|
|
94
111
|
protected onError(_ev: WebSocket.ErrorEvent): void {
|
|
95
112
|
this._remoteMetadata = undefined;
|
|
113
|
+
this.makeReady();
|
|
96
114
|
}
|
|
97
115
|
/** 响应 WebSocket open */
|
|
98
116
|
protected onOpen(_ev: WebSocket.Event): void {
|
|
@@ -104,7 +122,7 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
104
122
|
if (ev.code === 1000) {
|
|
105
123
|
this.destroy();
|
|
106
124
|
} else {
|
|
107
|
-
this.
|
|
125
|
+
this.makeReady();
|
|
108
126
|
}
|
|
109
127
|
}
|
|
110
128
|
/** 响应 WebSocket message */
|