@cloudpss/ubrpc 0.4.10
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 +3 -0
- package/dist/auth.d.ts +5 -0
- package/dist/auth.js +52 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +14 -0
- package/dist/client.js +39 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +44 -0
- package/dist/server.js +119 -0
- package/dist/server.js.map +1 -0
- package/dist/socket.d.ts +65 -0
- package/dist/socket.js +276 -0
- package/dist/socket.js.map +1 -0
- package/dist/types/payload.d.ts +99 -0
- package/dist/types/payload.js +2 -0
- package/dist/types/payload.js.map +1 -0
- package/dist/types/utils.d.ts +32 -0
- package/dist/types/utils.js +22 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/utils/messaging.d.ts +7 -0
- package/dist/utils/messaging.js +9 -0
- package/dist/utils/messaging.js.map +1 -0
- package/dist/utils/serialize.d.ts +9 -0
- package/dist/utils/serialize.js +73 -0
- package/dist/utils/serialize.js.map +1 -0
- package/dist/utils/websocket.d.ts +4 -0
- package/dist/utils/websocket.js +21 -0
- package/dist/utils/websocket.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/jest.config.js +3 -0
- package/package.json +45 -0
- package/src/auth.ts +59 -0
- package/src/client.ts +42 -0
- package/src/index.ts +3 -0
- package/src/server.ts +127 -0
- package/src/socket.ts +304 -0
- package/src/types/payload.ts +115 -0
- package/src/types/utils.ts +83 -0
- package/src/utils/messaging.ts +17 -0
- package/src/utils/serialize.ts +67 -0
- package/src/utils/websocket.ts +22 -0
- package/src/version.ts +1 -0
- package/tests/client.js +20 -0
- package/tests/server.js +44 -0
- package/yarn-error.log +4598 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/** RPC 连接 ID */
|
|
2
|
+
export type ConnectionID = string & {
|
|
3
|
+
tag: 'ConnectionID';
|
|
4
|
+
};
|
|
5
|
+
/** 认证信息 */
|
|
6
|
+
export type RpcMetadata = Record<string, unknown>;
|
|
7
|
+
/** RPC 错误 */
|
|
8
|
+
export interface RpcErrorLike {
|
|
9
|
+
/** 名称 */
|
|
10
|
+
name: string;
|
|
11
|
+
/** 消息 */
|
|
12
|
+
message: string;
|
|
13
|
+
/** 调用 */
|
|
14
|
+
stack?: string;
|
|
15
|
+
/** 引发错误的其他错误 */
|
|
16
|
+
errors?: RpcErrorLike[];
|
|
17
|
+
}
|
|
18
|
+
/** RPC 调用的通用属性 */
|
|
19
|
+
interface RpcPayloadBase {
|
|
20
|
+
/** 调用类型 */
|
|
21
|
+
type: string;
|
|
22
|
+
/** 序列号 */
|
|
23
|
+
seq: number;
|
|
24
|
+
}
|
|
25
|
+
/** RPC 认证调用 */
|
|
26
|
+
export interface RpcAuthPayload extends RpcPayloadBase {
|
|
27
|
+
/** @inheritdoc */
|
|
28
|
+
type: 'auth';
|
|
29
|
+
/** 连接 ID */
|
|
30
|
+
id: ConnectionID;
|
|
31
|
+
/** 协议版本 */
|
|
32
|
+
version: number;
|
|
33
|
+
/** 认证信息 */
|
|
34
|
+
metadata: RpcMetadata;
|
|
35
|
+
/** 异常 */
|
|
36
|
+
error?: RpcErrorLike;
|
|
37
|
+
}
|
|
38
|
+
/** RPC 方法调用 */
|
|
39
|
+
export interface RpcCallPayload extends RpcPayloadBase {
|
|
40
|
+
/** @inheritdoc */
|
|
41
|
+
type: 'call';
|
|
42
|
+
/** 调用的方法 */
|
|
43
|
+
method: string;
|
|
44
|
+
/** 参数 */
|
|
45
|
+
args: unknown[];
|
|
46
|
+
}
|
|
47
|
+
/** RPC 方法返回 */
|
|
48
|
+
export interface RpcReturnPayload extends RpcPayloadBase {
|
|
49
|
+
/** @inheritdoc */
|
|
50
|
+
type: 'return';
|
|
51
|
+
/** 返回值 */
|
|
52
|
+
result?: unknown;
|
|
53
|
+
/** 异常 */
|
|
54
|
+
error?: RpcErrorLike;
|
|
55
|
+
}
|
|
56
|
+
/** RPC 通知 */
|
|
57
|
+
export interface RpcNotifyPayload extends RpcPayloadBase {
|
|
58
|
+
/** @inheritdoc */
|
|
59
|
+
type: 'notify';
|
|
60
|
+
/** 调用的方法 */
|
|
61
|
+
method: string;
|
|
62
|
+
/** 参数 */
|
|
63
|
+
args: unknown[];
|
|
64
|
+
}
|
|
65
|
+
/** RPC 订阅 */
|
|
66
|
+
export interface RpcSubscribePayload extends RpcPayloadBase {
|
|
67
|
+
/** @inheritdoc */
|
|
68
|
+
type: 'subscribe';
|
|
69
|
+
/** 调用的方法 */
|
|
70
|
+
method: string;
|
|
71
|
+
/** 参数 */
|
|
72
|
+
args: unknown[];
|
|
73
|
+
}
|
|
74
|
+
/** RPC 发布 */
|
|
75
|
+
export interface RpcPublishPayload extends RpcPayloadBase {
|
|
76
|
+
/** @inheritdoc */
|
|
77
|
+
type: 'publish';
|
|
78
|
+
/** 发布的值 */
|
|
79
|
+
next?: unknown;
|
|
80
|
+
/** 异常结束 */
|
|
81
|
+
error?: RpcErrorLike;
|
|
82
|
+
/** 正常结束 */
|
|
83
|
+
complete?: true;
|
|
84
|
+
}
|
|
85
|
+
/** RPC 取消订阅 */
|
|
86
|
+
export interface RpcUnsubscribePayload extends RpcPayloadBase {
|
|
87
|
+
/** @inheritdoc */
|
|
88
|
+
type: 'unsubscribe';
|
|
89
|
+
}
|
|
90
|
+
/** RPC 错误 */
|
|
91
|
+
export interface RpcErrorPayload extends RpcPayloadBase {
|
|
92
|
+
/** @inheritdoc */
|
|
93
|
+
type: 'error';
|
|
94
|
+
/** 异常 */
|
|
95
|
+
error: RpcErrorLike;
|
|
96
|
+
}
|
|
97
|
+
/** RPC 调用 */
|
|
98
|
+
export type RpcPayload = RpcCallPayload | RpcReturnPayload | RpcNotifyPayload | RpcPublishPayload | RpcSubscribePayload | RpcUnsubscribePayload | RpcAuthPayload | RpcErrorPayload;
|
|
99
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/types/payload.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { InteropObservable, Observable } from 'rxjs';
|
|
2
|
+
/** 可转换为 Observable 的类型 */
|
|
3
|
+
export type ObservableLike<T> = Observable<T> | InteropObservable<T> | AsyncIterable<T>;
|
|
4
|
+
/** Returns a boolean for whether the two given types are equal. */
|
|
5
|
+
type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends <G>() => G extends B ? 1 : 2 ? true : false;
|
|
6
|
+
/** 作为通知输出的方法 */
|
|
7
|
+
type IsNotificationReturn<R> = IsEqual<R, void> extends true ? true : IsEqual<R, undefined> extends true ? true : R extends PromiseLike<void> | void ? true : false;
|
|
8
|
+
/** 作为 Observable 输出的方法 */
|
|
9
|
+
type ObservableReturn = ObservableLike<any> | PromiseLike<ObservableLike<any>>;
|
|
10
|
+
/** 提取类型中的方法 */
|
|
11
|
+
export type Methods<T> = {
|
|
12
|
+
[P in keyof T]: T[P] extends (...args: any[]) => infer R ? (R extends ObservableReturn ? never : P) : never;
|
|
13
|
+
}[keyof T] & string;
|
|
14
|
+
/** 提取类型中的通知 */
|
|
15
|
+
export type Notifications<T> = {
|
|
16
|
+
[P in keyof T]: T[P] extends (...args: any[]) => infer R ? IsNotificationReturn<R> extends true ? P : never : never;
|
|
17
|
+
}[keyof T] & string;
|
|
18
|
+
/** 提取类型中的订阅主题 */
|
|
19
|
+
export type Subjects<T> = {
|
|
20
|
+
[P in keyof T]: T[P] extends (...args: any[]) => ObservableReturn ? P : never;
|
|
21
|
+
}[keyof T] & string;
|
|
22
|
+
/** RPC 调用的参数 */
|
|
23
|
+
export type RpcParameters<T> = T extends (...args: infer R) => any ? R : never;
|
|
24
|
+
/** RPC 调用的返回 */
|
|
25
|
+
export type RpcReturns<T> = T extends (...args: any[]) => infer R ? Awaited<R> extends ObservableLike<infer U> ? U : Awaited<R> : never;
|
|
26
|
+
/** RPC 调用函数的实现 */
|
|
27
|
+
type RpcField<T> = T extends (...args: infer P) => infer R ? Awaited<R> extends ObservableReturn ? (...args: P) => ObservableLike<RpcReturns<T>> | PromiseLike<ObservableLike<RpcReturns<T>>> : (...args: P) => RpcReturns<T> | PromiseLike<RpcReturns<T>> : never;
|
|
28
|
+
/** RPC 调用对象的实现 */
|
|
29
|
+
export type RpcObject<T> = {
|
|
30
|
+
[K in Methods<T> | Subjects<T>]: RpcField<T[K]>;
|
|
31
|
+
};
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
// interface A {
|
|
3
|
+
// field: number;
|
|
4
|
+
// methodA(x: number): number | undefined;
|
|
5
|
+
// methodB: (x: string, y: number) => Promise<number>;
|
|
6
|
+
// readonly methodC: () => Iterable<number>;
|
|
7
|
+
// readonly methodD: () => void | Promise<null | undefined>;
|
|
8
|
+
// readonly notificationA: () => undefined;
|
|
9
|
+
// readonly notificationB: () => Promise<void>;
|
|
10
|
+
// notificationC(): void;
|
|
11
|
+
// readonly notificationD: () => void | PromiseLike<undefined>;
|
|
12
|
+
// readonly notificationE: () => void | Promise<void>;
|
|
13
|
+
// subjectA(x: number): Observable<number>;
|
|
14
|
+
// subjectB: (x: string) => Promise<Observable<number>>;
|
|
15
|
+
// subjectC: () => PromiseLike<InteropObservable<number>>;
|
|
16
|
+
// subjectD: () => AsyncGenerator<number>;
|
|
17
|
+
// subjectE: () => PromiseLike<AsyncGenerator<number>>;
|
|
18
|
+
// }
|
|
19
|
+
// type X = Methods<A>;
|
|
20
|
+
// type Y = Subjects<A>;
|
|
21
|
+
// type Z = Notifications<A>;
|
|
22
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/types/utils.ts"],"names":[],"mappings":";AA8DA,gBAAgB;AAChB,qBAAqB;AACrB,8CAA8C;AAC9C,0DAA0D;AAC1D,gDAAgD;AAChD,gEAAgE;AAChE,+CAA+C;AAC/C,mDAAmD;AACnD,6BAA6B;AAC7B,mEAAmE;AACnE,0DAA0D;AAC1D,+CAA+C;AAC/C,4DAA4D;AAC5D,8DAA8D;AAC9D,8CAA8C;AAC9C,2DAA2D;AAC3D,IAAI;AAEJ,uBAAuB;AACvB,wBAAwB;AACxB,6BAA6B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="ws" />
|
|
2
|
+
import type WebSocket from 'isomorphic-ws';
|
|
3
|
+
import type { RpcPayload } from '../types/payload.js';
|
|
4
|
+
/** 发送消息 */
|
|
5
|
+
export declare function send<T extends RpcPayload['type']>(socket: WebSocket, type: T, info: Omit<RpcPayload & {
|
|
6
|
+
type: T;
|
|
7
|
+
}, 'type'>): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/utils/messaging.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C,WAAW;AACX,MAAM,UAAU,IAAI,CAChB,MAAiB,EACjB,IAAO,EACP,IAA4C;IAE5C,MAAM,CAAC,IAAI,CACP,MAAM,CAAC;QACH,GAAG,IAAI;QACP,IAAI;KACP,CAAC,CACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="ws" />
|
|
2
|
+
import type WebSocket from 'isomorphic-ws';
|
|
3
|
+
import type { RpcErrorLike, RpcPayload } from '../types/payload.js';
|
|
4
|
+
/** 反序列化 */
|
|
5
|
+
export declare function decodePayload(data: WebSocket.Data): RpcPayload | undefined;
|
|
6
|
+
/** 序列化错误信息 */
|
|
7
|
+
export declare function serializeError(error: unknown): RpcErrorLike;
|
|
8
|
+
/** 反序列化错误信息 */
|
|
9
|
+
export declare function deserializeError(error: RpcErrorLike): Error;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { decode } from '@cloudpss/ubjson';
|
|
2
|
+
/** 反序列化 */
|
|
3
|
+
export function decodePayload(data) {
|
|
4
|
+
if (!data || typeof data == 'string')
|
|
5
|
+
return undefined;
|
|
6
|
+
if (Array.isArray(data))
|
|
7
|
+
data = Buffer.concat(data);
|
|
8
|
+
try {
|
|
9
|
+
const payload = decode(data);
|
|
10
|
+
if (!payload || typeof payload != 'object')
|
|
11
|
+
return undefined;
|
|
12
|
+
if (typeof payload.type !== 'string')
|
|
13
|
+
return undefined;
|
|
14
|
+
if (typeof payload.seq !== 'number')
|
|
15
|
+
return undefined;
|
|
16
|
+
return payload;
|
|
17
|
+
}
|
|
18
|
+
catch (ex) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const serializing = Symbol('serializing error');
|
|
23
|
+
/** 序列化错误信息 */
|
|
24
|
+
export function serializeError(error) {
|
|
25
|
+
if (error == null)
|
|
26
|
+
return {
|
|
27
|
+
name: 'Error',
|
|
28
|
+
message: '',
|
|
29
|
+
};
|
|
30
|
+
if (typeof error != 'object')
|
|
31
|
+
return {
|
|
32
|
+
name: 'Error',
|
|
33
|
+
message: String(error),
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
const reenter = !!error[serializing];
|
|
37
|
+
error[serializing] = true;
|
|
38
|
+
const { message, stack, name, errors, ...rest } = error;
|
|
39
|
+
return {
|
|
40
|
+
...rest,
|
|
41
|
+
name: String(name ?? 'Error'),
|
|
42
|
+
message: String(message ?? ''),
|
|
43
|
+
stack: stack,
|
|
44
|
+
errors: reenter ? undefined : Array.isArray(errors) ? errors.map(serializeError) : errors,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
delete error[serializing];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** 反序列化错误信息 */
|
|
52
|
+
export function deserializeError(error) {
|
|
53
|
+
if (error == null || typeof error != 'object')
|
|
54
|
+
return new Error(error ?? '');
|
|
55
|
+
const { message, stack, name, errors, ...rest } = error;
|
|
56
|
+
let ex;
|
|
57
|
+
if (Array.isArray(errors)) {
|
|
58
|
+
ex = new AggregateError(errors.map(deserializeError), message);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
ex = new Error(message);
|
|
62
|
+
}
|
|
63
|
+
if (name !== ex?.name)
|
|
64
|
+
Object.defineProperty(ex, 'name', { value: String(name), configurable: true, writable: true });
|
|
65
|
+
Object.defineProperty(ex, 'stack', {
|
|
66
|
+
value: stack ? String(stack) : undefined,
|
|
67
|
+
configurable: true,
|
|
68
|
+
writable: true,
|
|
69
|
+
});
|
|
70
|
+
Object.assign(ex, rest);
|
|
71
|
+
return ex;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/utils/serialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** 等待连接建立 */
|
|
2
|
+
export function ready(socket) {
|
|
3
|
+
switch (socket.readyState) {
|
|
4
|
+
case socket.CONNECTING:
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
socket.addEventListener('open', () => resolve(), { once: true });
|
|
7
|
+
socket.addEventListener('error', (ev) => reject(ev.error ?? new Error(`Failed to connect`)), {
|
|
8
|
+
once: true,
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
case socket.OPEN:
|
|
12
|
+
return Promise.resolve();
|
|
13
|
+
case socket.CLOSING:
|
|
14
|
+
return Promise.reject(new Error(`Socket is closing.`));
|
|
15
|
+
case socket.CLOSED:
|
|
16
|
+
return Promise.reject(new Error(`Socket is closed.`));
|
|
17
|
+
default:
|
|
18
|
+
return Promise.reject(new Error(`Socket is in unknown state.`));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/utils/websocket.ts"],"names":[],"mappings":"AAEA,aAAa;AACb,MAAM,UAAU,KAAK,CAAC,MAAiB;IACnC,QAAQ,MAAM,CAAC,UAAU,EAAE;QACvB,KAAK,MAAM,CAAC,UAAU;YAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACnC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE;oBACzF,IAAI,EAAE,IAAI;iBACb,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,KAAK,MAAM,CAAC,IAAI;YACZ,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,OAAO;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,MAAM;YACd,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC1D;YACI,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;KACvE;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION = 1;
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC"}
|
package/jest.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cloudpss/ubrpc",
|
|
3
|
+
"version": "0.4.10",
|
|
4
|
+
"author": "CloudPSS",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"ubjson",
|
|
8
|
+
"rpc",
|
|
9
|
+
"websocket"
|
|
10
|
+
],
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"module": "dist/index.js",
|
|
14
|
+
"types": "dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=14.0.0"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"start": "yarn clean && tsc --watch",
|
|
24
|
+
"build": "yarn clean && tsc",
|
|
25
|
+
"prepublishOnly": "yarn build",
|
|
26
|
+
"clean": "rimraf dist",
|
|
27
|
+
"benchmark": "node ./benchmark",
|
|
28
|
+
"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@cloudpss/ubjson": "~0.4.10",
|
|
32
|
+
"@types/ws": "^8.5.4",
|
|
33
|
+
"isomorphic-ws": "^5.0.0",
|
|
34
|
+
"rxjs": "^7.8.0",
|
|
35
|
+
"uuid": "^9.0.0",
|
|
36
|
+
"ws": "^8.12.1"
|
|
37
|
+
},
|
|
38
|
+
"optionalDependencies": {
|
|
39
|
+
"bufferutil": "^4.0.7",
|
|
40
|
+
"utf-8-validate": "^6.0.3"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/uuid": "^9.0.1"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/auth.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type WebSocket from 'isomorphic-ws';
|
|
2
|
+
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
3
|
+
import { decodePayload, deserializeError } from './utils/serialize.js';
|
|
4
|
+
import { VERSION } from './version.js';
|
|
5
|
+
|
|
6
|
+
const AUTH_TIMEOUT = 5000;
|
|
7
|
+
|
|
8
|
+
/** 接受认证消息 */
|
|
9
|
+
export function waitAuth(
|
|
10
|
+
socket: WebSocket,
|
|
11
|
+
seq?: number,
|
|
12
|
+
id?: ConnectionID,
|
|
13
|
+
): Promise<[number, ConnectionID, RpcMetadata]> {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const isResponse = seq != null && id != null;
|
|
16
|
+
const timeout = setTimeout(() => {
|
|
17
|
+
reject(new Error(`Failed to authenticate, no ${isResponse ? 'response' : 'request'} in ${AUTH_TIMEOUT}ms`));
|
|
18
|
+
finalize();
|
|
19
|
+
}, AUTH_TIMEOUT);
|
|
20
|
+
const handleMessage = (ev: WebSocket.MessageEvent): void => {
|
|
21
|
+
try {
|
|
22
|
+
const payload = decodePayload(ev.data);
|
|
23
|
+
if (!payload || payload.type !== 'auth') {
|
|
24
|
+
if (isResponse) return reject(new Error(`Failed to authenticate, bad response from server`));
|
|
25
|
+
else return reject(new Error(`Failed to authenticate, bad request from client`));
|
|
26
|
+
}
|
|
27
|
+
if (payload.version !== VERSION) {
|
|
28
|
+
return reject(
|
|
29
|
+
new Error(
|
|
30
|
+
`Failed to authenticate, version not match, expected ${VERSION}, got ${payload.version}`,
|
|
31
|
+
),
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
if (isResponse) {
|
|
35
|
+
if (payload.seq !== seq) {
|
|
36
|
+
return reject(new Error(`Failed to authenticate, bad response seq from server`));
|
|
37
|
+
}
|
|
38
|
+
if (payload.id !== id) {
|
|
39
|
+
return reject(new Error(`Failed to authenticate, bad response id from server`));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (payload.error) {
|
|
43
|
+
return reject(deserializeError(payload.error));
|
|
44
|
+
}
|
|
45
|
+
const metadata = typeof payload.metadata != 'object' ? {} : payload.metadata ?? {};
|
|
46
|
+
resolve([payload.seq, payload.id, metadata]);
|
|
47
|
+
} catch (ex) {
|
|
48
|
+
reject(ex);
|
|
49
|
+
} finally {
|
|
50
|
+
finalize();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const finalize = (): void => {
|
|
54
|
+
clearTimeout(timeout);
|
|
55
|
+
socket.removeListener('message', handleMessage);
|
|
56
|
+
};
|
|
57
|
+
socket.addEventListener('message', handleMessage, { once: true });
|
|
58
|
+
});
|
|
59
|
+
}
|
package/src/client.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import WebSocket from 'isomorphic-ws';
|
|
2
|
+
import { v4 } from 'uuid';
|
|
3
|
+
import { waitAuth } from './auth.js';
|
|
4
|
+
import { RpcSocket } from './socket.js';
|
|
5
|
+
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
6
|
+
import type { RpcObject } from './types/utils.js';
|
|
7
|
+
import { send } from './utils/messaging.js';
|
|
8
|
+
import { VERSION } from './version.js';
|
|
9
|
+
|
|
10
|
+
/** 由 WS Client 建立的 RPC 连接 */
|
|
11
|
+
export class RpcClientSocket<TRemote extends {}, TLocal extends {}> extends RpcSocket<TRemote, TLocal> {
|
|
12
|
+
constructor(url: string | URL, metadata?: RpcMetadata, local?: RpcObject<TLocal>) {
|
|
13
|
+
super(v4() as ConnectionID, local);
|
|
14
|
+
this._localMetadata = metadata;
|
|
15
|
+
this.url = typeof url == 'string' ? url : url.href;
|
|
16
|
+
this.seq = 2;
|
|
17
|
+
this.socket = new WebSocket(this.url);
|
|
18
|
+
}
|
|
19
|
+
readonly url: string;
|
|
20
|
+
/** @inheritdoc */
|
|
21
|
+
protected override async authSocket(): Promise<RpcMetadata> {
|
|
22
|
+
const socket = this.socket;
|
|
23
|
+
const seq = this.nextSeq();
|
|
24
|
+
send(socket, 'auth', {
|
|
25
|
+
seq,
|
|
26
|
+
id: this.id,
|
|
27
|
+
version: VERSION,
|
|
28
|
+
metadata: this.localMetadata ?? {},
|
|
29
|
+
});
|
|
30
|
+
const [, , metadata] = await waitAuth(socket, seq, this.id);
|
|
31
|
+
return metadata;
|
|
32
|
+
}
|
|
33
|
+
/** @inheritdoc */
|
|
34
|
+
protected override onClose(ev: WebSocket.CloseEvent): void {
|
|
35
|
+
super.onClose(ev);
|
|
36
|
+
if (ev.code === 1000) return;
|
|
37
|
+
|
|
38
|
+
setTimeout(() => {
|
|
39
|
+
this.socket = new WebSocket(this.url);
|
|
40
|
+
}, 1000);
|
|
41
|
+
}
|
|
42
|
+
}
|
package/src/index.ts
ADDED
package/src/server.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type WebSocket from 'isomorphic-ws';
|
|
2
|
+
import { waitAuth } from './auth.js';
|
|
3
|
+
import { RpcSocket } from './socket.js';
|
|
4
|
+
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
5
|
+
import type { RpcObject } from './types/utils.js';
|
|
6
|
+
import { send } from './utils/messaging.js';
|
|
7
|
+
import { serializeError } from './utils/serialize.js';
|
|
8
|
+
import { VERSION } from './version.js';
|
|
9
|
+
|
|
10
|
+
const kOnClose = Symbol('kOnClose');
|
|
11
|
+
const kMetadata = Symbol('kMetadata');
|
|
12
|
+
const kReplaceSocket = Symbol('kReplaceSocket');
|
|
13
|
+
|
|
14
|
+
/** 认证过的 socket */
|
|
15
|
+
type WebSocketWithMetadata = WebSocket & { [kMetadata]: RpcMetadata };
|
|
16
|
+
|
|
17
|
+
/** 由 WS Server 建立的 RPC 连接组 */
|
|
18
|
+
export class RpcServer<TRemote extends {}, TLocal extends {}> {
|
|
19
|
+
constructor(
|
|
20
|
+
local?: RpcObject<TLocal> | ((socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>),
|
|
21
|
+
/** 认证客户端 */
|
|
22
|
+
readonly authenticator: (metadata: RpcMetadata) => RpcMetadata | Promise<RpcMetadata> = () => ({}),
|
|
23
|
+
) {
|
|
24
|
+
if (local == null) {
|
|
25
|
+
this.local = undefined;
|
|
26
|
+
} else if (typeof local == 'function') {
|
|
27
|
+
this.local = local as (socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>;
|
|
28
|
+
} else {
|
|
29
|
+
this.local = () => local;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** 用于响应调用的本地对象 */
|
|
33
|
+
readonly local?: (socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>;
|
|
34
|
+
|
|
35
|
+
readonly sockets = new Map<string, RpcServerSocket<TRemote, TLocal>>();
|
|
36
|
+
|
|
37
|
+
/** WebSocket 连接后调用此方法建立 RPC 连接 */
|
|
38
|
+
async connect(socket: WebSocket): Promise<RpcServerSocket<TRemote, TLocal>> {
|
|
39
|
+
const s = socket as WebSocketWithMetadata;
|
|
40
|
+
const [id, metadata] = await this.authSocket(socket);
|
|
41
|
+
s[kMetadata] = metadata;
|
|
42
|
+
const exist = this.sockets.get(id);
|
|
43
|
+
if (!exist) {
|
|
44
|
+
const client = new RpcServerSocket(id, this, s);
|
|
45
|
+
this.sockets.set(id, client);
|
|
46
|
+
return client;
|
|
47
|
+
} else {
|
|
48
|
+
const tid = this.disconnectingSockets.get(id);
|
|
49
|
+
if (tid != null) {
|
|
50
|
+
this.disconnectingSockets.delete(id);
|
|
51
|
+
clearTimeout(tid);
|
|
52
|
+
}
|
|
53
|
+
exist[kReplaceSocket](s);
|
|
54
|
+
return exist;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** 认证客户端 */
|
|
58
|
+
protected async authSocket(socket: WebSocket): Promise<[ConnectionID, RpcMetadata]> {
|
|
59
|
+
let seq, id, remoteMetadata;
|
|
60
|
+
try {
|
|
61
|
+
[seq, id, remoteMetadata] = await waitAuth(socket);
|
|
62
|
+
const localMetadata = await this.authenticator(remoteMetadata);
|
|
63
|
+
send(socket, 'auth', {
|
|
64
|
+
seq,
|
|
65
|
+
id,
|
|
66
|
+
version: VERSION,
|
|
67
|
+
metadata: localMetadata,
|
|
68
|
+
});
|
|
69
|
+
return [id, remoteMetadata];
|
|
70
|
+
} catch (ex) {
|
|
71
|
+
if (seq != null && id != null) {
|
|
72
|
+
send(socket, 'auth', {
|
|
73
|
+
seq,
|
|
74
|
+
id,
|
|
75
|
+
version: VERSION,
|
|
76
|
+
metadata: {},
|
|
77
|
+
error: serializeError(ex),
|
|
78
|
+
});
|
|
79
|
+
} else {
|
|
80
|
+
send(socket, 'error', {
|
|
81
|
+
seq: 1,
|
|
82
|
+
error: serializeError(ex),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
socket.close(3401, 'Auth error');
|
|
86
|
+
throw ex;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private readonly disconnectingSockets = new Map<string, ReturnType<typeof setTimeout>>();
|
|
91
|
+
/** WebSocket 断开时调用 */
|
|
92
|
+
[kOnClose](socket: RpcServerSocket<TRemote, TLocal>, ev: WebSocket.CloseEvent): void {
|
|
93
|
+
const delay = ev.code === 1000 ? 0 : 5000;
|
|
94
|
+
const tid = setTimeout(() => {
|
|
95
|
+
socket.destroy();
|
|
96
|
+
this.sockets.delete(socket.id);
|
|
97
|
+
this.disconnectingSockets.delete(socket.id);
|
|
98
|
+
}, delay);
|
|
99
|
+
this.disconnectingSockets.set(socket.id, tid);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** 由 WS Server 建立的 RPC 连接 */
|
|
104
|
+
export class RpcServerSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
|
|
105
|
+
constructor(id: ConnectionID, readonly server: RpcServer<TRemote, TLocal>, socket: WebSocketWithMetadata) {
|
|
106
|
+
super(id);
|
|
107
|
+
this.seq = 1;
|
|
108
|
+
this.socket = socket;
|
|
109
|
+
}
|
|
110
|
+
/** @inheritdoc */
|
|
111
|
+
protected authSocket(): Promise<RpcMetadata> {
|
|
112
|
+
return Promise.resolve((this.socket as WebSocketWithMetadata)[kMetadata]);
|
|
113
|
+
}
|
|
114
|
+
/** @inheritdoc */
|
|
115
|
+
protected override get local(): RpcObject<TLocal> | undefined {
|
|
116
|
+
return this.server.local?.(this);
|
|
117
|
+
}
|
|
118
|
+
/** @inheritdoc */
|
|
119
|
+
protected override onClose(ev: WebSocket.CloseEvent): void {
|
|
120
|
+
super.onClose(ev);
|
|
121
|
+
this.server[kOnClose](this, ev);
|
|
122
|
+
}
|
|
123
|
+
/** 替换 socket */
|
|
124
|
+
[kReplaceSocket](newSocket: WebSocketWithMetadata): void {
|
|
125
|
+
this.socket = newSocket;
|
|
126
|
+
}
|
|
127
|
+
}
|