@cloudpss/ubrpc 0.4.10 → 0.4.11
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/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/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/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.11",
|
|
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.11",
|
|
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/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 */
|