@cloudpss/ubrpc 0.6.15 → 0.6.17
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/auth.d.ts +4 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +50 -35
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +26 -12
- package/dist/client.js.map +1 -1
- package/dist/codes.d.ts +2 -0
- package/dist/codes.d.ts.map +1 -1
- package/dist/codes.js +9 -0
- package/dist/codes.js.map +1 -1
- package/dist/server.d.ts +6 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +5 -4
- package/dist/server.js.map +1 -1
- package/dist/socket.d.ts +4 -13
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +72 -78
- 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/ready.d.ts +6 -0
- package/dist/utils/ready.d.ts.map +1 -0
- package/dist/utils/ready.js +29 -0
- package/dist/utils/ready.js.map +1 -0
- package/package.json +3 -3
- package/src/auth.ts +52 -42
- package/src/client.ts +33 -15
- package/src/codes.ts +9 -0
- package/src/server.ts +17 -7
- package/src/socket.ts +77 -86
- package/src/types/callbacks.ts +7 -0
- package/src/utils/ready.ts +36 -0
- package/tests/client.ts +6 -4
- package/tests/runner.ts +1 -1
- package/tests/server.ts +6 -4
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/auth.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
2
|
+
/** 认证结果 */
|
|
3
|
+
type AuthResult = [seq: number, id: ConnectionID, meta: RpcMetadata];
|
|
2
4
|
/** 接受认证消息 */
|
|
3
|
-
export declare function waitAuth(socket: WebSocket, seq?: number, id?: ConnectionID): Promise<
|
|
5
|
+
export declare function waitAuth(socket: WebSocket, seq?: number, id?: ConnectionID): Promise<AuthResult>;
|
|
6
|
+
export {};
|
|
4
7
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOpE,WAAW;AACX,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AA4BrE,aAAa;AACb,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CA+BtG"}
|
package/dist/auth.js
CHANGED
|
@@ -1,52 +1,67 @@
|
|
|
1
1
|
import { decodePayload, deserializeError } from './utils/serialize.js';
|
|
2
2
|
import { VERSION } from './version.js';
|
|
3
|
+
import { WebSocketAppCode } from './codes.js';
|
|
3
4
|
const AUTH_TIMEOUT = 5000;
|
|
5
|
+
/** 检查认证消息 */
|
|
6
|
+
function checkAuthMessage(data, seq, id) {
|
|
7
|
+
const isResponse = seq != null && id != null;
|
|
8
|
+
const payload = decodePayload(data);
|
|
9
|
+
if (payload?.type !== 'auth') {
|
|
10
|
+
if (isResponse)
|
|
11
|
+
throw new Error(`Failed to authenticate, bad response from server`);
|
|
12
|
+
else
|
|
13
|
+
throw new Error(`Failed to authenticate, bad request from client`);
|
|
14
|
+
}
|
|
15
|
+
if (payload.version !== VERSION) {
|
|
16
|
+
throw new Error(`Failed to authenticate, version not match, expected ${VERSION}, got ${payload.version}`);
|
|
17
|
+
}
|
|
18
|
+
if (isResponse) {
|
|
19
|
+
if (payload.seq !== seq) {
|
|
20
|
+
throw new Error(`Failed to authenticate, bad response seq from server`);
|
|
21
|
+
}
|
|
22
|
+
if (payload.id !== id) {
|
|
23
|
+
throw new Error(`Failed to authenticate, bad response id from server`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (payload.error) {
|
|
27
|
+
throw deserializeError(payload.error);
|
|
28
|
+
}
|
|
29
|
+
const metadata = typeof payload.metadata != 'object' || payload.metadata == null ? {} : payload.metadata;
|
|
30
|
+
return [payload.seq, payload.id, metadata];
|
|
31
|
+
}
|
|
4
32
|
/** 接受认证消息 */
|
|
5
33
|
export async function waitAuth(socket, seq, id) {
|
|
6
34
|
return new Promise((resolve, reject) => {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
35
|
+
const onTimeout = () => {
|
|
36
|
+
reject(new Error(`Failed to authenticate, no remote message in ${AUTH_TIMEOUT}ms`));
|
|
37
|
+
finalize(false);
|
|
38
|
+
};
|
|
39
|
+
const onClose = (ev) => {
|
|
40
|
+
reject(new Error(`Failed to authenticate, socket closed, code=${ev.code}: ${ev.reason}`));
|
|
41
|
+
finalize(false);
|
|
42
|
+
};
|
|
43
|
+
const onMessage = (ev) => {
|
|
13
44
|
try {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return reject(new Error(`Failed to authenticate, bad response from server`));
|
|
18
|
-
else
|
|
19
|
-
return reject(new Error(`Failed to authenticate, bad request from client`));
|
|
20
|
-
}
|
|
21
|
-
if (payload.version !== VERSION) {
|
|
22
|
-
return reject(new Error(`Failed to authenticate, version not match, expected ${VERSION}, got ${payload.version}`));
|
|
23
|
-
}
|
|
24
|
-
if (isResponse) {
|
|
25
|
-
if (payload.seq !== seq) {
|
|
26
|
-
return reject(new Error(`Failed to authenticate, bad response seq from server`));
|
|
27
|
-
}
|
|
28
|
-
if (payload.id !== id) {
|
|
29
|
-
return reject(new Error(`Failed to authenticate, bad response id from server`));
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
if (payload.error) {
|
|
33
|
-
return reject(deserializeError(payload.error));
|
|
34
|
-
}
|
|
35
|
-
const metadata = typeof payload.metadata != 'object' ? {} : (payload.metadata ?? {});
|
|
36
|
-
resolve([payload.seq, payload.id, metadata]);
|
|
45
|
+
const result = checkAuthMessage(ev.data, seq, id);
|
|
46
|
+
resolve(result);
|
|
47
|
+
finalize(true);
|
|
37
48
|
}
|
|
38
49
|
catch (ex) {
|
|
39
50
|
reject(ex);
|
|
40
|
-
|
|
41
|
-
finally {
|
|
42
|
-
finalize();
|
|
51
|
+
finalize(false);
|
|
43
52
|
}
|
|
44
53
|
};
|
|
45
|
-
const
|
|
54
|
+
const timeout = setTimeout(onTimeout, AUTH_TIMEOUT);
|
|
55
|
+
socket.addEventListener('close', onClose);
|
|
56
|
+
socket.addEventListener('message', onMessage);
|
|
57
|
+
const finalize = (ok) => {
|
|
46
58
|
clearTimeout(timeout);
|
|
47
|
-
socket.removeEventListener('message',
|
|
59
|
+
socket.removeEventListener('message', onMessage);
|
|
60
|
+
socket.removeEventListener('close', onClose);
|
|
61
|
+
if (ok)
|
|
62
|
+
return;
|
|
63
|
+
socket.close(WebSocketAppCode.AUTH_ERROR);
|
|
48
64
|
};
|
|
49
|
-
socket.addEventListener('message', handleMessage, { once: true });
|
|
50
65
|
});
|
|
51
66
|
}
|
|
52
67
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -4,9 +4,12 @@ import type { RpcMetadata } from './types/payload.js';
|
|
|
4
4
|
import type { RpcObject } from './types/utils.js';
|
|
5
5
|
/** 由 WS Client 建立的 RPC 连接 */
|
|
6
6
|
export declare class RpcClientSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
|
|
7
|
+
#private;
|
|
7
8
|
/** 建立连接使用的 WebSocket 实现 */
|
|
8
9
|
static WebSocket: typeof WebSocket | null;
|
|
9
10
|
constructor(url: string | URL, metadata?: RpcMetadata, local?: RpcObject<TLocal>);
|
|
11
|
+
/** @inheritdoc */
|
|
12
|
+
protected get local(): RpcObject<TLocal> | undefined;
|
|
10
13
|
readonly url: string;
|
|
11
14
|
/** @inheritdoc */
|
|
12
15
|
protected authSocket(): Promise<RpcMetadata>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQlD,6BAA6B;AAC7B,qBAAa,eAAe,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM,SAAS,MAAM,CAAE,SAAQ,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;;IAC1G,2BAA2B;IAC3B,MAAM,CAAC,SAAS,EAAE,OAAO,SAAS,GAAG,IAAI,CAAQ;gBAErC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC;IAUhF,kBAAkB;IAClB,cAAuB,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAE5D;IACD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kBAAkB;cACO,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAgB3D,kBAAkB;cACC,OAAO,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;IAUhD,WAAW;IACX,SAAS,CAAC,OAAO,IAAI,IAAI;CAoB5B"}
|
package/dist/client.js
CHANGED
|
@@ -1,23 +1,30 @@
|
|
|
1
|
-
import { WebSocket
|
|
1
|
+
import { WebSocket } from '@cloudpss/fetch';
|
|
2
2
|
import { v4 } from 'uuid';
|
|
3
3
|
import { waitAuth } from './auth.js';
|
|
4
4
|
import { RpcSocket } from './socket.js';
|
|
5
5
|
import { send } from './utils/messaging.js';
|
|
6
6
|
import { VERSION } from './version.js';
|
|
7
|
-
import { WebSocketAppCode } from './codes.js';
|
|
8
7
|
import { logger } from './logger.js';
|
|
8
|
+
const INIT_RECONNECT_TIMEOUT = 500;
|
|
9
|
+
const MAX_RECONNECT_TIMEOUT = 30000;
|
|
9
10
|
/** 由 WS Client 建立的 RPC 连接 */
|
|
10
11
|
export class RpcClientSocket extends RpcSocket {
|
|
11
12
|
/** 建立连接使用的 WebSocket 实现 */
|
|
12
13
|
static { this.WebSocket = null; }
|
|
13
14
|
constructor(url, metadata, local) {
|
|
14
|
-
super(v4()
|
|
15
|
+
super(v4());
|
|
16
|
+
this.#local = local;
|
|
15
17
|
this._localMetadata = metadata;
|
|
16
18
|
this.url = typeof url == 'string' ? url : url.href;
|
|
17
19
|
this.seq = 2;
|
|
18
20
|
logger('[%s] client socket created. url=', this.id, this.url);
|
|
19
21
|
this.connect();
|
|
20
22
|
}
|
|
23
|
+
#local;
|
|
24
|
+
/** @inheritdoc */
|
|
25
|
+
get local() {
|
|
26
|
+
return this.#local;
|
|
27
|
+
}
|
|
21
28
|
/** @inheritdoc */
|
|
22
29
|
async authSocket() {
|
|
23
30
|
logger('[%s] authenticating...', this.id);
|
|
@@ -33,27 +40,34 @@ export class RpcClientSocket extends RpcSocket {
|
|
|
33
40
|
logger('[%s] authenticated. remoteMeta=%o', this.id, metadata);
|
|
34
41
|
return metadata;
|
|
35
42
|
}
|
|
43
|
+
#reconnectTimeout = INIT_RECONNECT_TIMEOUT;
|
|
36
44
|
/** @inheritdoc */
|
|
37
45
|
onClose(ev) {
|
|
38
46
|
super.onClose(ev);
|
|
39
|
-
|
|
40
|
-
if (code === WebSocketStatusCode.NORMAL_CLOSURE || code === WebSocketAppCode.AUTH_ERROR)
|
|
47
|
+
if (this.destroyed)
|
|
41
48
|
return;
|
|
42
|
-
logger('[%s]
|
|
49
|
+
logger('[%s] reconnecting in %dms...', this.id, this.#reconnectTimeout);
|
|
43
50
|
setTimeout(() => {
|
|
44
51
|
this.connect();
|
|
45
|
-
},
|
|
52
|
+
}, this.#reconnectTimeout);
|
|
46
53
|
}
|
|
47
54
|
/** 建立连接 */
|
|
48
55
|
connect() {
|
|
49
|
-
|
|
50
|
-
|
|
56
|
+
const socket = new (this.constructor.WebSocket ?? WebSocket)(this.url);
|
|
57
|
+
socket.binaryType = 'arraybuffer';
|
|
58
|
+
this.socket = socket;
|
|
51
59
|
logger('[%s] connecting...', this.id);
|
|
52
|
-
this.ready.
|
|
53
|
-
logger('[%s]
|
|
60
|
+
this.ready.then(() => {
|
|
61
|
+
logger('[%s] connected.', this.id);
|
|
62
|
+
this.#reconnectTimeout = INIT_RECONNECT_TIMEOUT;
|
|
63
|
+
}, () => {
|
|
64
|
+
if (this.destroyed)
|
|
65
|
+
return;
|
|
66
|
+
this.#reconnectTimeout = Math.min(this.#reconnectTimeout * 2, MAX_RECONNECT_TIMEOUT);
|
|
67
|
+
logger('[%s] connect failed. retrying in %dms...', this.id, this.#reconnectTimeout);
|
|
54
68
|
setTimeout(() => {
|
|
55
69
|
this.connect();
|
|
56
|
-
},
|
|
70
|
+
}, this.#reconnectTimeout);
|
|
57
71
|
});
|
|
58
72
|
}
|
|
59
73
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/codes.d.ts
CHANGED
package/dist/codes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"AAEA,qBAAqB;AACrB,oBAAY,gBAAgB;IACxB,UAAU,OAAO;IACjB,QAAQ,OAAO;CAClB;AAED,cAAc;AACd,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI9D"}
|
package/dist/codes.js
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
|
+
import { WebSocketStatusCode } from '@cloudpss/fetch';
|
|
1
2
|
/** WebSocket 关闭代码 */
|
|
2
3
|
export var WebSocketAppCode;
|
|
3
4
|
(function (WebSocketAppCode) {
|
|
4
5
|
WebSocketAppCode[WebSocketAppCode["AUTH_ERROR"] = 3401] = "AUTH_ERROR";
|
|
5
6
|
WebSocketAppCode[WebSocketAppCode["REPLACED"] = 3402] = "REPLACED";
|
|
6
7
|
})(WebSocketAppCode || (WebSocketAppCode = {}));
|
|
8
|
+
/** 是否应进行重连 */
|
|
9
|
+
export function shouldReconnectWebSocket(code) {
|
|
10
|
+
if (code === WebSocketAppCode.AUTH_ERROR || code === WebSocketAppCode.REPLACED)
|
|
11
|
+
return false;
|
|
12
|
+
if (code === WebSocketStatusCode.NORMAL_CLOSURE)
|
|
13
|
+
return false;
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
7
16
|
//# sourceMappingURL=codes.js.map
|
package/dist/codes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codes.js","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,sEAAiB,CAAA;IACjB,kEAAe,CAAA;AACnB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B"}
|
|
1
|
+
{"version":3,"file":"codes.js","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qBAAqB;AACrB,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,sEAAiB,CAAA;IACjB,kEAAe,CAAA;AACnB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED,cAAc;AACd,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACjD,IAAI,IAAI,KAAK,gBAAgB,CAAC,UAAU,IAAI,IAAI,KAAK,gBAAgB,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7F,IAAI,IAAI,KAAK,mBAAmB,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -11,19 +11,21 @@ type WebSocketWithMetadata = WebSocket & {
|
|
|
11
11
|
/**
|
|
12
12
|
* 客户端认证方法
|
|
13
13
|
* @param metadata 客户端传入的认证元数据
|
|
14
|
+
* @param id 客户端连接 ID
|
|
15
|
+
* @param client 已存在的客户端连接对象(断线重连时会传入)
|
|
14
16
|
* @returns 服务端返回客户端的认证元数据
|
|
15
17
|
* @throws {unknown} 认证失败时抛出异常
|
|
16
18
|
*/
|
|
17
|
-
type RpcClientAuthenticator = (metadata: RpcMetadata) => RpcMetadata | Promise<RpcMetadata>;
|
|
19
|
+
type RpcClientAuthenticator<TRemote extends object, TLocal extends object> = (metadata: RpcMetadata, id: ConnectionID, client: RpcServerSocket<TRemote, TLocal> | undefined) => RpcMetadata | Promise<RpcMetadata>;
|
|
18
20
|
/** 由 WS Server 建立的 RPC 连接组 */
|
|
19
21
|
export declare class RpcServer<TRemote extends object, TLocal extends object> {
|
|
20
22
|
/** 客户端认证方法 */
|
|
21
|
-
readonly authenticator: RpcClientAuthenticator
|
|
23
|
+
readonly authenticator: RpcClientAuthenticator<TRemote, TLocal>;
|
|
22
24
|
constructor(
|
|
23
25
|
/** 服务端 RPC 实现 */
|
|
24
26
|
local?: RpcObject<TLocal> | ((socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>),
|
|
25
27
|
/** 客户端认证方法 */
|
|
26
|
-
authenticator?: RpcClientAuthenticator);
|
|
28
|
+
authenticator?: RpcClientAuthenticator<TRemote, TLocal>);
|
|
27
29
|
/** 用于响应调用的本地对象 */
|
|
28
30
|
readonly local?: (socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>;
|
|
29
31
|
/** 已建立连接的客户端 */
|
|
@@ -33,7 +35,7 @@ export declare class RpcServer<TRemote extends object, TLocal extends object> {
|
|
|
33
35
|
/** WebSocket 连接后调用此方法建立 RPC 连接 */
|
|
34
36
|
connect(socket: WebSocket): Promise<RpcServerSocket<TRemote, TLocal>>;
|
|
35
37
|
/** 认证客户端 */
|
|
36
|
-
protected authSocket(socket: WebSocket, tempId: string): Promise<[ConnectionID, RpcMetadata]>;
|
|
38
|
+
protected authSocket(socket: WebSocket, tempId: string): Promise<[ConnectionID, RpcMetadata, RpcServerSocket<TRemote, TLocal> | undefined]>;
|
|
37
39
|
private readonly disconnectingSockets;
|
|
38
40
|
/** WebSocket 断开时调用 */
|
|
39
41
|
[kOnClose](socket: RpcServerSocket<TRemote, TLocal>): void;
|
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,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
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -40,9 +40,9 @@ export class RpcServer {
|
|
|
40
40
|
logger('[%s] incoming connection', tempId);
|
|
41
41
|
socket.binaryType = 'arraybuffer';
|
|
42
42
|
const s = socket;
|
|
43
|
-
const [id, metadata] = await this.authSocket(socket, tempId);
|
|
43
|
+
const [id, metadata, existingClient] = await this.authSocket(socket, tempId);
|
|
44
44
|
s[kMetadata] = metadata;
|
|
45
|
-
let client =
|
|
45
|
+
let client = existingClient;
|
|
46
46
|
if (!client) {
|
|
47
47
|
logger('[%s] new connection created', id);
|
|
48
48
|
client = new RpcServerSocket(id, this);
|
|
@@ -66,7 +66,8 @@ export class RpcServer {
|
|
|
66
66
|
logger('[%s] authenticating...', tempId);
|
|
67
67
|
[seq, id, remoteMetadata] = await waitAuth(socket);
|
|
68
68
|
logger('[%s -> %s] got server auth. remoteMeta=%o', tempId, id, remoteMetadata);
|
|
69
|
-
const
|
|
69
|
+
const client = this._sockets.get(id);
|
|
70
|
+
const localMetadata = await this.authenticator(remoteMetadata, id, client);
|
|
70
71
|
logger('[%s] server auth success. localMeta=%o', id, localMetadata);
|
|
71
72
|
send(socket, 'auth', {
|
|
72
73
|
seq,
|
|
@@ -74,7 +75,7 @@ export class RpcServer {
|
|
|
74
75
|
version: VERSION,
|
|
75
76
|
metadata: localMetadata,
|
|
76
77
|
});
|
|
77
|
-
return [id, remoteMetadata];
|
|
78
|
+
return [id, remoteMetadata, client];
|
|
78
79
|
}
|
|
79
80
|
catch (ex) {
|
|
80
81
|
logger('[%s] server auth failed. remoteMeta=%o, error=%o', id ?? tempId, remoteMetadata, ex);
|
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,GAAG,CAAC,UAAU,CAAC,CAAC;AACxC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,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
|
@@ -5,7 +5,7 @@ import type { Methods, Notifications, RpcObject, RpcParameters, RpcReturns, Subj
|
|
|
5
5
|
export declare abstract class RpcSocket<TRemote extends object, TLocal extends object> {
|
|
6
6
|
#private;
|
|
7
7
|
readonly id: ConnectionID;
|
|
8
|
-
constructor(id: ConnectionID
|
|
8
|
+
constructor(id: ConnectionID);
|
|
9
9
|
protected _localMetadata?: RpcMetadata;
|
|
10
10
|
protected _remoteMetadata?: RpcMetadata;
|
|
11
11
|
/** 本地认证信息 */
|
|
@@ -14,24 +14,18 @@ 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
|
-
protected get local(): RpcObject<TLocal> | undefined;
|
|
20
|
-
private __socket?;
|
|
18
|
+
protected abstract get local(): RpcObject<TLocal> | undefined;
|
|
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 */
|
|
32
26
|
protected abstract authSocket(): Promise<RpcMetadata>;
|
|
33
27
|
/** 响应 WebSocket error */
|
|
34
|
-
protected onError(
|
|
28
|
+
protected onError(ev: ErrorEvent | Event): void;
|
|
35
29
|
/** 响应 WebSocket open */
|
|
36
30
|
protected onOpen(_ev: Event): void;
|
|
37
31
|
/** 响应 WebSocket close */
|
|
@@ -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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"}
|