@cloudpss/ubrpc 0.4.12 → 0.4.14

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/dist/auth.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- /// <reference types="ws" />
2
- import type WebSocket from 'isomorphic-ws';
3
- import type { ConnectionID, RpcMetadata } from './types/payload.js';
4
- /** 接受认证消息 */
5
- export declare function waitAuth(socket: WebSocket, seq?: number, id?: ConnectionID): Promise<[number, ConnectionID, RpcMetadata]>;
1
+ /// <reference types="ws" />
2
+ import type WebSocket from 'isomorphic-ws';
3
+ import type { ConnectionID, RpcMetadata } from './types/payload.js';
4
+ /** 接受认证消息 */
5
+ export declare function waitAuth(socket: WebSocket, seq?: number, id?: ConnectionID): Promise<[number, ConnectionID, RpcMetadata]>;
package/dist/auth.js CHANGED
@@ -1,52 +1,52 @@
1
- import { decodePayload, deserializeError } from './utils/serialize.js';
2
- import { VERSION } from './version.js';
3
- const AUTH_TIMEOUT = 5000;
4
- /** 接受认证消息 */
5
- export function waitAuth(socket, seq, id) {
6
- return new Promise((resolve, reject) => {
7
- const isResponse = seq != null && id != null;
8
- const timeout = setTimeout(() => {
9
- reject(new Error(`Failed to authenticate, no ${isResponse ? 'response' : 'request'} in ${AUTH_TIMEOUT}ms`));
10
- finalize();
11
- }, AUTH_TIMEOUT);
12
- const handleMessage = (ev) => {
13
- try {
14
- const payload = decodePayload(ev.data);
15
- if (!payload || payload.type !== 'auth') {
16
- if (isResponse)
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]);
37
- }
38
- catch (ex) {
39
- reject(ex);
40
- }
41
- finally {
42
- finalize();
43
- }
44
- };
45
- const finalize = () => {
46
- clearTimeout(timeout);
47
- socket.removeListener('message', handleMessage);
48
- };
49
- socket.addEventListener('message', handleMessage, { once: true });
50
- });
51
- }
1
+ import { decodePayload, deserializeError } from './utils/serialize.js';
2
+ import { VERSION } from './version.js';
3
+ const AUTH_TIMEOUT = 5000;
4
+ /** 接受认证消息 */
5
+ export function waitAuth(socket, seq, id) {
6
+ return new Promise((resolve, reject) => {
7
+ const isResponse = seq != null && id != null;
8
+ const timeout = setTimeout(() => {
9
+ reject(new Error(`Failed to authenticate, no ${isResponse ? 'response' : 'request'} in ${AUTH_TIMEOUT}ms`));
10
+ finalize();
11
+ }, AUTH_TIMEOUT);
12
+ const handleMessage = (ev) => {
13
+ try {
14
+ const payload = decodePayload(ev.data);
15
+ if (!payload || payload.type !== 'auth') {
16
+ if (isResponse)
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]);
37
+ }
38
+ catch (ex) {
39
+ reject(ex);
40
+ }
41
+ finally {
42
+ finalize();
43
+ }
44
+ };
45
+ const finalize = () => {
46
+ clearTimeout(timeout);
47
+ socket.removeListener('message', handleMessage);
48
+ };
49
+ socket.addEventListener('message', handleMessage, { once: true });
50
+ });
51
+ }
52
52
  //# sourceMappingURL=auth.js.map
package/dist/client.d.ts CHANGED
@@ -1,16 +1,16 @@
1
- /// <reference types="ws" />
2
- import WebSocket from 'isomorphic-ws';
3
- import { RpcSocket } from './socket.js';
4
- import type { RpcMetadata } from './types/payload.js';
5
- import type { RpcObject } from './types/utils.js';
6
- /** 由 WS Client 建立的 RPC 连接 */
7
- export declare class RpcClientSocket<TRemote extends {}, TLocal extends {}> extends RpcSocket<TRemote, TLocal> {
8
- constructor(url: string | URL, metadata?: RpcMetadata, local?: RpcObject<TLocal>);
9
- readonly url: string;
10
- /** @inheritdoc */
11
- protected authSocket(): Promise<RpcMetadata>;
12
- /** @inheritdoc */
13
- protected onClose(ev: WebSocket.CloseEvent): void;
14
- /** 建立连接 */
15
- protected connect(): void;
16
- }
1
+ /// <reference types="ws" />
2
+ import WebSocket from 'isomorphic-ws';
3
+ import { RpcSocket } from './socket.js';
4
+ import type { RpcMetadata } from './types/payload.js';
5
+ import type { RpcObject } from './types/utils.js';
6
+ /** 由 WS Client 建立的 RPC 连接 */
7
+ export declare class RpcClientSocket<TRemote extends {}, TLocal extends {}> extends RpcSocket<TRemote, TLocal> {
8
+ constructor(url: string | URL, metadata?: RpcMetadata, local?: RpcObject<TLocal>);
9
+ readonly url: string;
10
+ /** @inheritdoc */
11
+ protected authSocket(): Promise<RpcMetadata>;
12
+ /** @inheritdoc */
13
+ protected onClose(ev: WebSocket.CloseEvent): void;
14
+ /** 建立连接 */
15
+ protected connect(): void;
16
+ }
package/dist/client.js CHANGED
@@ -1,48 +1,48 @@
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 { send } from './utils/messaging.js';
6
- import { VERSION } from './version.js';
7
- /** 由 WS Client 建立的 RPC 连接 */
8
- export class RpcClientSocket extends RpcSocket {
9
- constructor(url, metadata, local) {
10
- super(v4(), local);
11
- this._localMetadata = metadata;
12
- this.url = typeof url == 'string' ? url : url.href;
13
- this.seq = 2;
14
- this.connect();
15
- }
16
- /** @inheritdoc */
17
- async authSocket() {
18
- const socket = this.socket;
19
- const seq = this.nextSeq();
20
- send(socket, 'auth', {
21
- seq,
22
- id: this.id,
23
- version: VERSION,
24
- metadata: this.localMetadata ?? {},
25
- });
26
- const [, , metadata] = await waitAuth(socket, seq, this.id);
27
- return metadata;
28
- }
29
- /** @inheritdoc */
30
- onClose(ev) {
31
- super.onClose(ev);
32
- if (ev.code === 1000)
33
- return;
34
- setTimeout(() => {
35
- this.connect();
36
- }, 1000);
37
- }
38
- /** 建立连接 */
39
- connect() {
40
- this.socket = new WebSocket(this.url);
41
- this.ready.catch(() => {
42
- setTimeout(() => {
43
- this.connect();
44
- }, 2000);
45
- });
46
- }
47
- }
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 { send } from './utils/messaging.js';
6
+ import { VERSION } from './version.js';
7
+ /** 由 WS Client 建立的 RPC 连接 */
8
+ export class RpcClientSocket extends RpcSocket {
9
+ constructor(url, metadata, local) {
10
+ super(v4(), local);
11
+ this._localMetadata = metadata;
12
+ this.url = typeof url == 'string' ? url : url.href;
13
+ this.seq = 2;
14
+ this.connect();
15
+ }
16
+ /** @inheritdoc */
17
+ async authSocket() {
18
+ const socket = this.socket;
19
+ const seq = this.nextSeq();
20
+ send(socket, 'auth', {
21
+ seq,
22
+ id: this.id,
23
+ version: VERSION,
24
+ metadata: this.localMetadata ?? {},
25
+ });
26
+ const [, , metadata] = await waitAuth(socket, seq, this.id);
27
+ return metadata;
28
+ }
29
+ /** @inheritdoc */
30
+ onClose(ev) {
31
+ super.onClose(ev);
32
+ if (ev.code === 1000)
33
+ return;
34
+ setTimeout(() => {
35
+ this.connect();
36
+ }, 1000);
37
+ }
38
+ /** 建立连接 */
39
+ connect() {
40
+ this.socket = new WebSocket(this.url);
41
+ this.ready.catch(() => {
42
+ setTimeout(() => {
43
+ this.connect();
44
+ }, 2000);
45
+ });
46
+ }
47
+ }
48
48
  //# sourceMappingURL=client.js.map
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { RpcClientSocket } from './client.js';
2
- export { RpcSocket } from './socket.js';
3
- export { RpcServer, RpcServerSocket } from './server.js';
1
+ export { RpcClientSocket } from './client.js';
2
+ export { RpcSocket } from './socket.js';
3
+ export { RpcServer, RpcServerSocket } from './server.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { RpcClientSocket } from './client.js';
2
- export { RpcSocket } from './socket.js';
3
- export { RpcServer, RpcServerSocket } from './server.js';
1
+ export { RpcClientSocket } from './client.js';
2
+ export { RpcSocket } from './socket.js';
3
+ export { RpcServer, RpcServerSocket } from './server.js';
4
4
  //# sourceMappingURL=index.js.map
package/dist/server.d.ts CHANGED
@@ -1,44 +1,44 @@
1
- /// <reference types="ws" />
2
- import type WebSocket from 'isomorphic-ws';
3
- import { RpcSocket } from './socket.js';
4
- import type { ConnectionID, RpcMetadata } from './types/payload.js';
5
- import type { RpcObject } from './types/utils.js';
6
- declare const kOnClose: unique symbol;
7
- declare const kMetadata: unique symbol;
8
- declare const kReplaceSocket: unique symbol;
9
- /** 认证过的 socket */
10
- type WebSocketWithMetadata = WebSocket & {
11
- [kMetadata]: RpcMetadata;
12
- };
13
- /** 由 WS Server 建立的 RPC 连接组 */
14
- export declare class RpcServer<TRemote extends {}, TLocal extends {}> {
15
- /** 认证客户端 */
16
- readonly authenticator: (metadata: RpcMetadata) => RpcMetadata | Promise<RpcMetadata>;
17
- constructor(local?: RpcObject<TLocal> | ((socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>),
18
- /** 认证客户端 */
19
- authenticator?: (metadata: RpcMetadata) => RpcMetadata | Promise<RpcMetadata>);
20
- /** 用于响应调用的本地对象 */
21
- readonly local?: (socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>;
22
- readonly sockets: Map<string, RpcServerSocket<TRemote, TLocal>>;
23
- /** WebSocket 连接后调用此方法建立 RPC 连接 */
24
- connect(socket: WebSocket): Promise<RpcServerSocket<TRemote, TLocal>>;
25
- /** 认证客户端 */
26
- protected authSocket(socket: WebSocket): Promise<[ConnectionID, RpcMetadata]>;
27
- private readonly disconnectingSockets;
28
- /** WebSocket 断开时调用 */
29
- [kOnClose](socket: RpcServerSocket<TRemote, TLocal>, ev: WebSocket.CloseEvent): void;
30
- }
31
- /** 由 WS Server 建立的 RPC 连接 */
32
- export declare class RpcServerSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
33
- readonly server: RpcServer<TRemote, TLocal>;
34
- constructor(id: ConnectionID, server: RpcServer<TRemote, TLocal>);
35
- /** @inheritdoc */
36
- protected authSocket(): Promise<RpcMetadata>;
37
- /** @inheritdoc */
38
- protected get local(): RpcObject<TLocal> | undefined;
39
- /** @inheritdoc */
40
- protected onClose(ev: WebSocket.CloseEvent): void;
41
- /** 替换 socket */
42
- [kReplaceSocket](newSocket: WebSocketWithMetadata): Promise<void>;
43
- }
44
- export {};
1
+ /// <reference types="ws" />
2
+ import type WebSocket from 'isomorphic-ws';
3
+ import { RpcSocket } from './socket.js';
4
+ import type { ConnectionID, RpcMetadata } from './types/payload.js';
5
+ import type { RpcObject } from './types/utils.js';
6
+ declare const kOnClose: unique symbol;
7
+ declare const kMetadata: unique symbol;
8
+ declare const kReplaceSocket: unique symbol;
9
+ /** 认证过的 socket */
10
+ type WebSocketWithMetadata = WebSocket & {
11
+ [kMetadata]: RpcMetadata;
12
+ };
13
+ /** 由 WS Server 建立的 RPC 连接组 */
14
+ export declare class RpcServer<TRemote extends {}, TLocal extends {}> {
15
+ /** 认证客户端 */
16
+ readonly authenticator: (metadata: RpcMetadata) => RpcMetadata | Promise<RpcMetadata>;
17
+ constructor(local?: RpcObject<TLocal> | ((socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>),
18
+ /** 认证客户端 */
19
+ authenticator?: (metadata: RpcMetadata) => RpcMetadata | Promise<RpcMetadata>);
20
+ /** 用于响应调用的本地对象 */
21
+ readonly local?: (socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>;
22
+ readonly sockets: Map<string, RpcServerSocket<TRemote, TLocal>>;
23
+ /** WebSocket 连接后调用此方法建立 RPC 连接 */
24
+ connect(socket: WebSocket): Promise<RpcServerSocket<TRemote, TLocal>>;
25
+ /** 认证客户端 */
26
+ protected authSocket(socket: WebSocket): Promise<[ConnectionID, RpcMetadata]>;
27
+ private readonly disconnectingSockets;
28
+ /** WebSocket 断开时调用 */
29
+ [kOnClose](socket: RpcServerSocket<TRemote, TLocal>, ev: WebSocket.CloseEvent): void;
30
+ }
31
+ /** 由 WS Server 建立的 RPC 连接 */
32
+ export declare class RpcServerSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
33
+ readonly server: RpcServer<TRemote, TLocal>;
34
+ constructor(id: ConnectionID, server: RpcServer<TRemote, TLocal>);
35
+ /** @inheritdoc */
36
+ protected authSocket(): Promise<RpcMetadata>;
37
+ /** @inheritdoc */
38
+ protected get local(): RpcObject<TLocal> | undefined;
39
+ /** @inheritdoc */
40
+ protected onClose(ev: WebSocket.CloseEvent): void;
41
+ /** 替换 socket */
42
+ [kReplaceSocket](newSocket: WebSocketWithMetadata): Promise<void>;
43
+ }
44
+ export {};
package/dist/server.js CHANGED
@@ -1,118 +1,118 @@
1
- import { waitAuth } from './auth.js';
2
- import { RpcSocket } from './socket.js';
3
- import { send } from './utils/messaging.js';
4
- import { serializeError } from './utils/serialize.js';
5
- import { VERSION } from './version.js';
6
- const kOnClose = Symbol('kOnClose');
7
- const kMetadata = Symbol('kMetadata');
8
- const kReplaceSocket = Symbol('kReplaceSocket');
9
- /** 由 WS Server 建立的 RPC 连接组 */
10
- export class RpcServer {
11
- constructor(local,
12
- /** 认证客户端 */
13
- authenticator = () => ({})) {
14
- this.authenticator = authenticator;
15
- this.sockets = new Map();
16
- this.disconnectingSockets = new Map();
17
- if (local == null) {
18
- this.local = undefined;
19
- }
20
- else if (typeof local == 'function') {
21
- this.local = local;
22
- }
23
- else {
24
- this.local = () => local;
25
- }
26
- }
27
- /** WebSocket 连接后调用此方法建立 RPC 连接 */
28
- async connect(socket) {
29
- const s = socket;
30
- const [id, metadata] = await this.authSocket(socket);
31
- s[kMetadata] = metadata;
32
- let client = this.sockets.get(id);
33
- if (!client) {
34
- client = new RpcServerSocket(id, this);
35
- this.sockets.set(id, client);
36
- }
37
- else {
38
- const tid = this.disconnectingSockets.get(id);
39
- if (tid != null) {
40
- this.disconnectingSockets.delete(id);
41
- clearTimeout(tid);
42
- }
43
- }
44
- await client[kReplaceSocket](s);
45
- return client;
46
- }
47
- /** 认证客户端 */
48
- async authSocket(socket) {
49
- let seq, id, remoteMetadata;
50
- try {
51
- [seq, id, remoteMetadata] = await waitAuth(socket);
52
- const localMetadata = await this.authenticator(remoteMetadata);
53
- send(socket, 'auth', {
54
- seq,
55
- id,
56
- version: VERSION,
57
- metadata: localMetadata,
58
- });
59
- return [id, remoteMetadata];
60
- }
61
- catch (ex) {
62
- if (seq != null && id != null) {
63
- send(socket, 'auth', {
64
- seq,
65
- id,
66
- version: VERSION,
67
- metadata: {},
68
- error: serializeError(ex),
69
- });
70
- }
71
- else {
72
- send(socket, 'error', {
73
- seq: 1,
74
- error: serializeError(ex),
75
- });
76
- }
77
- socket.close(3401, 'Auth error');
78
- throw ex;
79
- }
80
- }
81
- /** WebSocket 断开时调用 */
82
- [kOnClose](socket, ev) {
83
- const delay = ev.code === 1000 ? 0 : 5000;
84
- const tid = setTimeout(() => {
85
- socket.destroy();
86
- this.sockets.delete(socket.id);
87
- this.disconnectingSockets.delete(socket.id);
88
- }, delay);
89
- this.disconnectingSockets.set(socket.id, tid);
90
- }
91
- }
92
- /** 由 WS Server 建立的 RPC 连接 */
93
- export class RpcServerSocket extends RpcSocket {
94
- constructor(id, server) {
95
- super(id);
96
- this.server = server;
97
- this.seq = 1;
98
- }
99
- /** @inheritdoc */
100
- authSocket() {
101
- return Promise.resolve(this.socket[kMetadata]);
102
- }
103
- /** @inheritdoc */
104
- get local() {
105
- return this.server.local?.(this);
106
- }
107
- /** @inheritdoc */
108
- onClose(ev) {
109
- super.onClose(ev);
110
- this.server[kOnClose](this, ev);
111
- }
112
- /** 替换 socket */
113
- [kReplaceSocket](newSocket) {
114
- this.socket = newSocket;
115
- return this.ready;
116
- }
117
- }
1
+ import { waitAuth } from './auth.js';
2
+ import { RpcSocket } from './socket.js';
3
+ import { send } from './utils/messaging.js';
4
+ import { serializeError } from './utils/serialize.js';
5
+ import { VERSION } from './version.js';
6
+ const kOnClose = Symbol('kOnClose');
7
+ const kMetadata = Symbol('kMetadata');
8
+ const kReplaceSocket = Symbol('kReplaceSocket');
9
+ /** 由 WS Server 建立的 RPC 连接组 */
10
+ export class RpcServer {
11
+ constructor(local,
12
+ /** 认证客户端 */
13
+ authenticator = () => ({})) {
14
+ this.authenticator = authenticator;
15
+ this.sockets = new Map();
16
+ this.disconnectingSockets = new Map();
17
+ if (local == null) {
18
+ this.local = undefined;
19
+ }
20
+ else if (typeof local == 'function') {
21
+ this.local = local;
22
+ }
23
+ else {
24
+ this.local = () => local;
25
+ }
26
+ }
27
+ /** WebSocket 连接后调用此方法建立 RPC 连接 */
28
+ async connect(socket) {
29
+ const s = socket;
30
+ const [id, metadata] = await this.authSocket(socket);
31
+ s[kMetadata] = metadata;
32
+ let client = this.sockets.get(id);
33
+ if (!client) {
34
+ client = new RpcServerSocket(id, this);
35
+ this.sockets.set(id, client);
36
+ }
37
+ else {
38
+ const tid = this.disconnectingSockets.get(id);
39
+ if (tid != null) {
40
+ this.disconnectingSockets.delete(id);
41
+ clearTimeout(tid);
42
+ }
43
+ }
44
+ await client[kReplaceSocket](s);
45
+ return client;
46
+ }
47
+ /** 认证客户端 */
48
+ async authSocket(socket) {
49
+ let seq, id, remoteMetadata;
50
+ try {
51
+ [seq, id, remoteMetadata] = await waitAuth(socket);
52
+ const localMetadata = await this.authenticator(remoteMetadata);
53
+ send(socket, 'auth', {
54
+ seq,
55
+ id,
56
+ version: VERSION,
57
+ metadata: localMetadata,
58
+ });
59
+ return [id, remoteMetadata];
60
+ }
61
+ catch (ex) {
62
+ if (seq != null && id != null) {
63
+ send(socket, 'auth', {
64
+ seq,
65
+ id,
66
+ version: VERSION,
67
+ metadata: {},
68
+ error: serializeError(ex),
69
+ });
70
+ }
71
+ else {
72
+ send(socket, 'error', {
73
+ seq: 1,
74
+ error: serializeError(ex),
75
+ });
76
+ }
77
+ socket.close(3401, 'Auth error');
78
+ throw ex;
79
+ }
80
+ }
81
+ /** WebSocket 断开时调用 */
82
+ [kOnClose](socket, ev) {
83
+ const delay = ev.code === 1000 ? 0 : 5000;
84
+ const tid = setTimeout(() => {
85
+ socket.destroy();
86
+ this.sockets.delete(socket.id);
87
+ this.disconnectingSockets.delete(socket.id);
88
+ }, delay);
89
+ this.disconnectingSockets.set(socket.id, tid);
90
+ }
91
+ }
92
+ /** 由 WS Server 建立的 RPC 连接 */
93
+ export class RpcServerSocket extends RpcSocket {
94
+ constructor(id, server) {
95
+ super(id);
96
+ this.server = server;
97
+ this.seq = 1;
98
+ }
99
+ /** @inheritdoc */
100
+ authSocket() {
101
+ return Promise.resolve(this.socket[kMetadata]);
102
+ }
103
+ /** @inheritdoc */
104
+ get local() {
105
+ return this.server.local?.(this);
106
+ }
107
+ /** @inheritdoc */
108
+ onClose(ev) {
109
+ super.onClose(ev);
110
+ this.server[kOnClose](this, ev);
111
+ }
112
+ /** 替换 socket */
113
+ [kReplaceSocket](newSocket) {
114
+ this.socket = newSocket;
115
+ return this.ready;
116
+ }
117
+ }
118
118
  //# sourceMappingURL=server.js.map