@cloudpss/ubrpc 0.4.18 → 0.4.20
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 +0 -2
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +1 -3
- package/dist/client.js +4 -2
- package/dist/client.js.map +1 -1
- package/dist/codes.d.ts +4 -0
- package/dist/codes.js +6 -0
- package/dist/codes.js.map +1 -0
- package/dist/server.d.ts +2 -4
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/socket.d.ts +4 -6
- package/dist/socket.js +4 -3
- package/dist/socket.js.map +1 -1
- package/dist/types/utils.d.ts +2 -2
- package/dist/types/utils.js.map +1 -1
- package/dist/utils/messaging.d.ts +0 -2
- package/dist/utils/messaging.js.map +1 -1
- package/dist/utils/serialize.d.ts +2 -3
- package/dist/utils/serialize.js +0 -2
- package/dist/utils/serialize.js.map +1 -1
- package/package.json +4 -13
- package/src/auth.ts +14 -6
- package/src/client.ts +5 -3
- package/src/codes.ts +4 -0
- package/src/server.ts +4 -4
- package/src/socket.ts +52 -20
- package/src/types/utils.ts +10 -2
- package/src/utils/messaging.ts +5 -2
- package/src/utils/serialize.ts +4 -4
- package/tests/client.js +2 -0
- package/tests/server.js +1 -1
- package/dist/utils/websocket.d.ts +0 -4
- package/dist/utils/websocket.js +0 -21
- package/dist/utils/websocket.js.map +0 -1
- package/src/utils/websocket.ts +0 -22
package/dist/auth.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="ws" />
|
|
2
|
-
import type WebSocket from 'isomorphic-ws';
|
|
3
1
|
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
4
2
|
/** 接受认证消息 */
|
|
5
3
|
export declare function waitAuth(socket: WebSocket, seq?: number, id?: ConnectionID): Promise<[number, ConnectionID, RpcMetadata]>;
|
package/dist/auth.js
CHANGED
|
@@ -44,7 +44,7 @@ export function waitAuth(socket, seq, id) {
|
|
|
44
44
|
};
|
|
45
45
|
const finalize = () => {
|
|
46
46
|
clearTimeout(timeout);
|
|
47
|
-
socket.
|
|
47
|
+
socket.removeEventListener('message', handleMessage);
|
|
48
48
|
};
|
|
49
49
|
socket.addEventListener('message', handleMessage, { once: true });
|
|
50
50
|
});
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,aAAa;AACb,MAAM,UAAU,QAAQ,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,aAAa;AACb,MAAM,UAAU,QAAQ,CACpB,MAAiB,EACjB,GAAY,EACZ,EAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,UAAU,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC;YAC5G,QAAQ,EAAE,CAAC;QACf,CAAC,EAAE,YAAY,CAAC,CAAC;QACjB,MAAM,aAAa,GAAG,CAAC,EAAgB,EAAQ,EAAE;YAC7C,IAAI;gBACA,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,IAAY,CAAC,CAAC;gBAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;oBACrC,IAAI,UAAU;wBAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAC;;wBACxF,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;iBACpF;gBACD,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE;oBAC7B,OAAO,MAAM,CACT,IAAI,KAAK,CACL,uDAAuD,OAAO,SAAS,OAAO,CAAC,OAAO,EAAE,CAC3F,CACJ,CAAC;iBACL;gBACD,IAAI,UAAU,EAAE;oBACZ,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,EAAE;wBACrB,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;qBACpF;oBACD,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE;wBACnB,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;qBACnF;iBACJ;gBACD,IAAI,OAAO,CAAC,KAAK,EAAE;oBACf,OAAO,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;iBAClD;gBACD,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACnF,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;aAChD;YAAC,OAAO,EAAE,EAAE;gBACT,MAAM,CAAC,EAAE,CAAC,CAAC;aACd;oBAAS;gBACN,QAAQ,EAAE,CAAC;aACd;QACL,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,GAAS,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="ws" />
|
|
2
|
-
import WebSocket from 'isomorphic-ws';
|
|
3
1
|
import { RpcSocket } from './socket.js';
|
|
4
2
|
import type { RpcMetadata } from './types/payload.js';
|
|
5
3
|
import type { RpcObject } from './types/utils.js';
|
|
@@ -10,7 +8,7 @@ export declare class RpcClientSocket<TRemote extends {}, TLocal extends {}> exte
|
|
|
10
8
|
/** @inheritdoc */
|
|
11
9
|
protected authSocket(): Promise<RpcMetadata>;
|
|
12
10
|
/** @inheritdoc */
|
|
13
|
-
protected onClose(ev:
|
|
11
|
+
protected onClose(ev: CloseEvent): void;
|
|
14
12
|
/** 建立连接 */
|
|
15
13
|
protected connect(): void;
|
|
16
14
|
}
|
package/dist/client.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import WebSocket from '
|
|
1
|
+
import { WebSocket } from '@cloudpss/ws';
|
|
2
|
+
import { WEB_SOCKET_STATUS_CODES } from '@cloudpss/ws';
|
|
2
3
|
import { v4 } from 'uuid';
|
|
3
4
|
import { waitAuth } from './auth.js';
|
|
4
5
|
import { RpcSocket } from './socket.js';
|
|
5
6
|
import { send } from './utils/messaging.js';
|
|
6
7
|
import { VERSION } from './version.js';
|
|
8
|
+
import { APP_CODE } from './codes.js';
|
|
7
9
|
/** 由 WS Client 建立的 RPC 连接 */
|
|
8
10
|
export class RpcClientSocket extends RpcSocket {
|
|
9
11
|
constructor(url, metadata, local) {
|
|
@@ -29,7 +31,7 @@ export class RpcClientSocket extends RpcSocket {
|
|
|
29
31
|
/** @inheritdoc */
|
|
30
32
|
onClose(ev) {
|
|
31
33
|
super.onClose(ev);
|
|
32
|
-
if (ev.code ===
|
|
34
|
+
if (ev.code === WEB_SOCKET_STATUS_CODES.NORMAL_CLOSURE || ev.code === APP_CODE.AUTH_ERROR)
|
|
33
35
|
return;
|
|
34
36
|
setTimeout(() => {
|
|
35
37
|
this.connect();
|
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,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,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;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,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,EAAc;QACrC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClB,IAAI,EAAE,CAAC,IAAI,KAAK,uBAAuB,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,UAAU;YAAE,OAAO;QAElG,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/codes.d.ts
ADDED
package/dist/codes.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codes.js","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,MAAM,CAAN,IAAY,QAEX;AAFD,WAAY,QAAQ;IAChB,sDAAiB,CAAA;AACrB,CAAC,EAFW,QAAQ,GAAR,QAAQ,KAAR,QAAQ,QAEnB"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="ws" />
|
|
2
|
-
import type WebSocket from 'isomorphic-ws';
|
|
3
1
|
import { RpcSocket } from './socket.js';
|
|
4
2
|
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
5
3
|
import type { RpcObject } from './types/utils.js';
|
|
@@ -26,7 +24,7 @@ export declare class RpcServer<TRemote extends {}, TLocal extends {}> {
|
|
|
26
24
|
protected authSocket(socket: WebSocket): Promise<[ConnectionID, RpcMetadata]>;
|
|
27
25
|
private readonly disconnectingSockets;
|
|
28
26
|
/** WebSocket 断开时调用 */
|
|
29
|
-
[kOnClose](socket: RpcServerSocket<TRemote, TLocal>, ev:
|
|
27
|
+
[kOnClose](socket: RpcServerSocket<TRemote, TLocal>, ev: CloseEvent): void;
|
|
30
28
|
}
|
|
31
29
|
/** 由 WS Server 建立的 RPC 连接 */
|
|
32
30
|
export declare class RpcServerSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
|
|
@@ -37,7 +35,7 @@ export declare class RpcServerSocket<TRemote extends object, TLocal extends obje
|
|
|
37
35
|
/** @inheritdoc */
|
|
38
36
|
protected get local(): RpcObject<TLocal> | undefined;
|
|
39
37
|
/** @inheritdoc */
|
|
40
|
-
protected onClose(ev:
|
|
38
|
+
protected onClose(ev: CloseEvent): void;
|
|
41
39
|
/** 替换 socket */
|
|
42
40
|
[kReplaceSocket](newSocket: WebSocketWithMetadata): Promise<void>;
|
|
43
41
|
}
|
package/dist/server.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { waitAuth } from './auth.js';
|
|
2
|
+
import { APP_CODE } from './codes.js';
|
|
2
3
|
import { RpcSocket } from './socket.js';
|
|
3
4
|
import { send } from './utils/messaging.js';
|
|
4
5
|
import { serializeError } from './utils/serialize.js';
|
|
@@ -74,7 +75,7 @@ export class RpcServer {
|
|
|
74
75
|
error: serializeError(ex),
|
|
75
76
|
});
|
|
76
77
|
}
|
|
77
|
-
socket.close(
|
|
78
|
+
socket.close(APP_CODE.AUTH_ERROR);
|
|
78
79
|
throw ex;
|
|
79
80
|
}
|
|
80
81
|
}
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,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;QAsDtD,yBAAoB,GAAG,IAAI,GAAG,EAAyC,CAAC;QAjErF,IAAI,KAAK,IAAI,IAAI,EAAE;YACf,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;SAC1B;aAAM,IAAI,OAAO,KAAK,IAAI,UAAU,EAAE;YACnC,IAAI,CAAC,KAAK,GAAG,KAAwE,CAAC;SACzF;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;SAC5B;IACL,CAAC;IAMD,kCAAkC;IAClC,KAAK,CAAC,OAAO,CAAC,MAAiB;QAC3B,MAAM,CAAC,GAAG,MAA+B,CAAC;QAC1C,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;QACxB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;SAChC;aAAM;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,GAAG,IAAI,IAAI,EAAE;gBACb,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrC,YAAY,CAAC,GAAG,CAAC,CAAC;aACrB;SACJ;QACD,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,YAAY;IACF,KAAK,CAAC,UAAU,CAAC,MAAiB;QACxC,IAAI,GAAG,EAAE,EAAE,EAAE,cAAc,CAAC;QAC5B,IAAI;YACA,CAAC,GAAG,EAAE,EAAE,EAAE,cAAc,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;gBACjB,GAAG;gBACH,EAAE;gBACF,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,aAAa;aAC1B,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;SAC/B;QAAC,OAAO,EAAE,EAAE;YACT,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE;gBAC3B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;oBACjB,GAAG;oBACH,EAAE;oBACF,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;iBAC5B,CAAC,CAAC;aACN;iBAAM;gBACH,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;oBAClB,GAAG,EAAE,CAAC;oBACN,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;iBAC5B,CAAC,CAAC;aACN;YACD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAClC,MAAM,EAAE,CAAC;SACZ;IACL,CAAC;IAGD,sBAAsB;IACtB,CAAC,QAAQ,CAAC,CAAC,MAAwC,EAAE,EAAc;QAC/D,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;CACJ;AAED,6BAA6B;AAC7B,MAAM,OAAO,eAA+D,SAAQ,SAA0B;IAC1G,YAAY,EAAgB,EAAW,MAAkC;QACrE,KAAK,CAAC,EAAE,CAAC,CAAC;QADyB,WAAM,GAAN,MAAM,CAA4B;QAErE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,kBAAkB;IACR,UAAU;QAChB,OAAO,OAAO,CAAC,OAAO,CAAE,IAAI,CAAC,MAAgC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,kBAAkB;IAClB,IAAuB,KAAK;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,kBAAkB;IACC,OAAO,CAAC,EAAc;QACrC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,gBAAgB;IAChB,CAAC,cAAc,CAAC,CAAC,SAAgC;QAC7C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;CACJ"}
|
package/dist/socket.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="ws" />
|
|
2
|
-
import type WebSocket from 'isomorphic-ws';
|
|
3
1
|
import { Observable } from 'rxjs';
|
|
4
2
|
import type { ConnectionID, RpcCallPayload, RpcMetadata, RpcNotifyPayload, RpcPayload, RpcSubscribePayload } from './types/payload.js';
|
|
5
3
|
import type { Methods, Notifications, RpcObject, RpcParameters, RpcReturns, Subjects } from './types/utils.js';
|
|
@@ -32,13 +30,13 @@ export declare abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
32
30
|
/** 认证 WebSocket */
|
|
33
31
|
protected abstract authSocket(): Promise<RpcMetadata>;
|
|
34
32
|
/** 响应 WebSocket error */
|
|
35
|
-
protected onError(_ev:
|
|
33
|
+
protected onError(_ev: ErrorEvent | Event): void;
|
|
36
34
|
/** 响应 WebSocket open */
|
|
37
|
-
protected onOpen(_ev:
|
|
35
|
+
protected onOpen(_ev: Event): void;
|
|
38
36
|
/** 响应 WebSocket close */
|
|
39
|
-
protected onClose(ev:
|
|
37
|
+
protected onClose(ev: CloseEvent): void;
|
|
40
38
|
/** 响应 WebSocket message */
|
|
41
|
-
protected onMessage(ev:
|
|
39
|
+
protected onMessage(ev: MessageEvent): void;
|
|
42
40
|
/** 响应 Rpc 消息 */
|
|
43
41
|
protected onPayload(payload: RpcPayload): boolean;
|
|
44
42
|
/** 调用本地方法 */
|
package/dist/socket.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { connected } from '@cloudpss/ws';
|
|
1
2
|
import { from, Observable, Subscriber, Subscription } from 'rxjs';
|
|
2
3
|
import { send } from './utils/messaging.js';
|
|
3
4
|
import { decodePayload, deserializeError, serializeError } from './utils/serialize.js';
|
|
4
|
-
import { ready } from './utils/websocket.js';
|
|
5
5
|
/** RPC 连接 */
|
|
6
6
|
export class RpcSocket {
|
|
7
7
|
constructor(id, local) {
|
|
@@ -77,7 +77,7 @@ export class RpcSocket {
|
|
|
77
77
|
oldValue.removeEventListener('error', this.__handlers.error);
|
|
78
78
|
oldValue.removeEventListener('message', this.__handlers.message);
|
|
79
79
|
}
|
|
80
|
-
await
|
|
80
|
+
await connected(newValue);
|
|
81
81
|
const info = await this.authSocket();
|
|
82
82
|
if (this.__socket === newValue) {
|
|
83
83
|
newValue.addEventListener('open', this.__handlers.open);
|
|
@@ -281,7 +281,8 @@ export class RpcSocket {
|
|
|
281
281
|
}
|
|
282
282
|
/** 结束 */
|
|
283
283
|
destroy() {
|
|
284
|
-
if (this.__socket &&
|
|
284
|
+
if (this.__socket &&
|
|
285
|
+
(this.__socket.readyState === this.__socket.CONNECTING || this.__socket.readyState === this.__socket.OPEN)) {
|
|
285
286
|
this.__socket.close(1000);
|
|
286
287
|
this.__socket = undefined;
|
|
287
288
|
}
|
package/dist/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export type Methods<T> = {
|
|
|
13
13
|
}[keyof T] & string;
|
|
14
14
|
/** 提取类型中的通知 */
|
|
15
15
|
export type Notifications<T> = {
|
|
16
|
-
[P in keyof T]: T[P] extends (...args: any[]) => infer R ?
|
|
16
|
+
[P in keyof T]: T[P] extends (...args: any[]) => infer R ? IsNotificationReturn<R> extends true ? P : never : never;
|
|
17
17
|
}[keyof T] & string;
|
|
18
18
|
/** 提取类型中的订阅主题 */
|
|
19
19
|
export type Subjects<T> = {
|
|
@@ -22,7 +22,7 @@ export type Subjects<T> = {
|
|
|
22
22
|
/** RPC 调用的参数 */
|
|
23
23
|
export type RpcParameters<T> = T extends (...args: infer R) => any ? R : never;
|
|
24
24
|
/** RPC 调用的返回 */
|
|
25
|
-
export type RpcReturns<T> = T extends (...args: any[]) => infer R ?
|
|
25
|
+
export type RpcReturns<T> = T extends (...args: any[]) => infer R ? Awaited<R> extends ObservableLike<infer U> ? U : Awaited<R> : never;
|
|
26
26
|
/** RPC 调用函数的实现 */
|
|
27
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
28
|
/** RPC 调用对象的实现 */
|
package/dist/types/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/types/utils.ts"],"names":[],"mappings":";
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/utils/messaging.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/utils/messaging.ts"],"names":[],"mappings":"AAAA,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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
import type WebSocket from 'isomorphic-ws';
|
|
1
|
+
import type { Data } from '@cloudpss/ws';
|
|
3
2
|
import type { RpcErrorLike, RpcPayload } from '../types/payload.js';
|
|
4
3
|
/** 反序列化 */
|
|
5
|
-
export declare function decodePayload(data:
|
|
4
|
+
export declare function decodePayload(data: Data): RpcPayload | undefined;
|
|
6
5
|
/** 序列化错误信息 */
|
|
7
6
|
export declare function serializeError(error: unknown): RpcErrorLike;
|
|
8
7
|
/** 反序列化错误信息 */
|
package/dist/utils/serialize.js
CHANGED
|
@@ -3,8 +3,6 @@ import { decode } from '@cloudpss/ubjson';
|
|
|
3
3
|
export function decodePayload(data) {
|
|
4
4
|
if (!data || typeof data == 'string')
|
|
5
5
|
return undefined;
|
|
6
|
-
if (Array.isArray(data))
|
|
7
|
-
data = Buffer.concat(data);
|
|
8
6
|
try {
|
|
9
7
|
const payload = decode(data);
|
|
10
8
|
if (!payload || typeof payload != 'object')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/utils/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,WAAW;AACX,MAAM,UAAU,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/utils/serialize.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.20",
|
|
4
4
|
"author": "CloudPSS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -16,9 +16,6 @@
|
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
17
17
|
"default": "./dist/index.js"
|
|
18
18
|
},
|
|
19
|
-
"engines": {
|
|
20
|
-
"node": ">=14.0.0"
|
|
21
|
-
},
|
|
22
19
|
"scripts": {
|
|
23
20
|
"start": "yarn clean && tsc --watch",
|
|
24
21
|
"build": "yarn clean && tsc",
|
|
@@ -28,16 +25,10 @@
|
|
|
28
25
|
"test": "cross-env NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest"
|
|
29
26
|
},
|
|
30
27
|
"dependencies": {
|
|
31
|
-
"@cloudpss/ubjson": "~0.4.
|
|
32
|
-
"@
|
|
33
|
-
"isomorphic-ws": "^5.0.0",
|
|
28
|
+
"@cloudpss/ubjson": "~0.4.20",
|
|
29
|
+
"@cloudpss/ws": "~0.4.20",
|
|
34
30
|
"rxjs": "^7.8.1",
|
|
35
|
-
"uuid": "^9.0.0"
|
|
36
|
-
"ws": "^8.13.0"
|
|
37
|
-
},
|
|
38
|
-
"optionalDependencies": {
|
|
39
|
-
"bufferutil": "^4.0.7",
|
|
40
|
-
"utf-8-validate": "^6.0.3"
|
|
31
|
+
"uuid": "^9.0.0"
|
|
41
32
|
},
|
|
42
33
|
"devDependencies": {
|
|
43
34
|
"@types/uuid": "^9.0.1"
|
package/src/auth.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type WebSocket from '
|
|
1
|
+
import type { WebSocket, Data } from '@cloudpss/ws';
|
|
2
2
|
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
3
3
|
import { decodePayload, deserializeError } from './utils/serialize.js';
|
|
4
4
|
import { VERSION } from './version.js';
|
|
@@ -6,22 +6,30 @@ import { VERSION } from './version.js';
|
|
|
6
6
|
const AUTH_TIMEOUT = 5000;
|
|
7
7
|
|
|
8
8
|
/** 接受认证消息 */
|
|
9
|
-
export function waitAuth(
|
|
9
|
+
export function waitAuth(
|
|
10
|
+
socket: WebSocket,
|
|
11
|
+
seq?: number,
|
|
12
|
+
id?: ConnectionID,
|
|
13
|
+
): Promise<[number, ConnectionID, RpcMetadata]> {
|
|
10
14
|
return new Promise((resolve, reject) => {
|
|
11
15
|
const isResponse = seq != null && id != null;
|
|
12
16
|
const timeout = setTimeout(() => {
|
|
13
17
|
reject(new Error(`Failed to authenticate, no ${isResponse ? 'response' : 'request'} in ${AUTH_TIMEOUT}ms`));
|
|
14
18
|
finalize();
|
|
15
19
|
}, AUTH_TIMEOUT);
|
|
16
|
-
const handleMessage = (ev:
|
|
20
|
+
const handleMessage = (ev: MessageEvent): void => {
|
|
17
21
|
try {
|
|
18
|
-
const payload = decodePayload(ev.data);
|
|
22
|
+
const payload = decodePayload(ev.data as Data);
|
|
19
23
|
if (!payload || payload.type !== 'auth') {
|
|
20
24
|
if (isResponse) return reject(new Error(`Failed to authenticate, bad response from server`));
|
|
21
25
|
else return reject(new Error(`Failed to authenticate, bad request from client`));
|
|
22
26
|
}
|
|
23
27
|
if (payload.version !== VERSION) {
|
|
24
|
-
return reject(
|
|
28
|
+
return reject(
|
|
29
|
+
new Error(
|
|
30
|
+
`Failed to authenticate, version not match, expected ${VERSION}, got ${payload.version}`,
|
|
31
|
+
),
|
|
32
|
+
);
|
|
25
33
|
}
|
|
26
34
|
if (isResponse) {
|
|
27
35
|
if (payload.seq !== seq) {
|
|
@@ -44,7 +52,7 @@ export function waitAuth(socket: WebSocket, seq?: number, id?: ConnectionID): Pr
|
|
|
44
52
|
};
|
|
45
53
|
const finalize = (): void => {
|
|
46
54
|
clearTimeout(timeout);
|
|
47
|
-
socket.
|
|
55
|
+
socket.removeEventListener('message', handleMessage);
|
|
48
56
|
};
|
|
49
57
|
socket.addEventListener('message', handleMessage, { once: true });
|
|
50
58
|
});
|
package/src/client.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import WebSocket from '
|
|
1
|
+
import { WebSocket } from '@cloudpss/ws';
|
|
2
|
+
import { WEB_SOCKET_STATUS_CODES } from '@cloudpss/ws';
|
|
2
3
|
import { v4 } from 'uuid';
|
|
3
4
|
import { waitAuth } from './auth.js';
|
|
4
5
|
import { RpcSocket } from './socket.js';
|
|
@@ -6,6 +7,7 @@ import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
|
6
7
|
import type { RpcObject } from './types/utils.js';
|
|
7
8
|
import { send } from './utils/messaging.js';
|
|
8
9
|
import { VERSION } from './version.js';
|
|
10
|
+
import { APP_CODE } from './codes.js';
|
|
9
11
|
|
|
10
12
|
/** 由 WS Client 建立的 RPC 连接 */
|
|
11
13
|
export class RpcClientSocket<TRemote extends {}, TLocal extends {}> extends RpcSocket<TRemote, TLocal> {
|
|
@@ -31,9 +33,9 @@ export class RpcClientSocket<TRemote extends {}, TLocal extends {}> extends RpcS
|
|
|
31
33
|
return metadata;
|
|
32
34
|
}
|
|
33
35
|
/** @inheritdoc */
|
|
34
|
-
protected override onClose(ev:
|
|
36
|
+
protected override onClose(ev: CloseEvent): void {
|
|
35
37
|
super.onClose(ev);
|
|
36
|
-
if (ev.code ===
|
|
38
|
+
if (ev.code === WEB_SOCKET_STATUS_CODES.NORMAL_CLOSURE || ev.code === APP_CODE.AUTH_ERROR) return;
|
|
37
39
|
|
|
38
40
|
setTimeout(() => {
|
|
39
41
|
this.connect();
|
package/src/codes.ts
ADDED
package/src/server.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type WebSocket from 'isomorphic-ws';
|
|
2
1
|
import { waitAuth } from './auth.js';
|
|
2
|
+
import { APP_CODE } from './codes.js';
|
|
3
3
|
import { RpcSocket } from './socket.js';
|
|
4
4
|
import type { ConnectionID, RpcMetadata } from './types/payload.js';
|
|
5
5
|
import type { RpcObject } from './types/utils.js';
|
|
@@ -81,14 +81,14 @@ export class RpcServer<TRemote extends {}, TLocal extends {}> {
|
|
|
81
81
|
error: serializeError(ex),
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
|
-
socket.close(
|
|
84
|
+
socket.close(APP_CODE.AUTH_ERROR);
|
|
85
85
|
throw ex;
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
private readonly disconnectingSockets = new Map<string, ReturnType<typeof setTimeout>>();
|
|
90
90
|
/** WebSocket 断开时调用 */
|
|
91
|
-
[kOnClose](socket: RpcServerSocket<TRemote, TLocal>, ev:
|
|
91
|
+
[kOnClose](socket: RpcServerSocket<TRemote, TLocal>, ev: CloseEvent): void {
|
|
92
92
|
const delay = ev.code === 1000 ? 0 : 5000;
|
|
93
93
|
const tid = setTimeout(() => {
|
|
94
94
|
socket.destroy();
|
|
@@ -114,7 +114,7 @@ export class RpcServerSocket<TRemote extends object, TLocal extends object> exte
|
|
|
114
114
|
return this.server.local?.(this);
|
|
115
115
|
}
|
|
116
116
|
/** @inheritdoc */
|
|
117
|
-
protected override onClose(ev:
|
|
117
|
+
protected override onClose(ev: CloseEvent): void {
|
|
118
118
|
super.onClose(ev);
|
|
119
119
|
this.server[kOnClose](this, ev);
|
|
120
120
|
}
|
package/src/socket.ts
CHANGED
|
@@ -1,10 +1,24 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { connected, type Data } from '@cloudpss/ws';
|
|
2
2
|
import { from, Observable, Subscriber, Subscription } from 'rxjs';
|
|
3
|
-
import type {
|
|
4
|
-
|
|
3
|
+
import type {
|
|
4
|
+
ConnectionID,
|
|
5
|
+
RpcCallPayload,
|
|
6
|
+
RpcMetadata,
|
|
7
|
+
RpcNotifyPayload,
|
|
8
|
+
RpcPayload,
|
|
9
|
+
RpcSubscribePayload,
|
|
10
|
+
} from './types/payload.js';
|
|
11
|
+
import type {
|
|
12
|
+
Methods,
|
|
13
|
+
Notifications,
|
|
14
|
+
ObservableLike,
|
|
15
|
+
RpcObject,
|
|
16
|
+
RpcParameters,
|
|
17
|
+
RpcReturns,
|
|
18
|
+
Subjects,
|
|
19
|
+
} from './types/utils.js';
|
|
5
20
|
import { send } from './utils/messaging.js';
|
|
6
21
|
import { decodePayload, deserializeError, serializeError } from './utils/serialize.js';
|
|
7
|
-
import { ready } from './utils/websocket.js';
|
|
8
22
|
|
|
9
23
|
/** RPC 连接 */
|
|
10
24
|
export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
@@ -62,10 +76,10 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
62
76
|
private __readyCallbacks?: Parameters<ConstructorParameters<typeof Promise<void>>[0]>;
|
|
63
77
|
protected ready!: Promise<void>;
|
|
64
78
|
private readonly __handlers = Object.freeze({
|
|
65
|
-
open: (ev:
|
|
66
|
-
close: (ev:
|
|
67
|
-
error: (ev:
|
|
68
|
-
message: (ev:
|
|
79
|
+
open: (ev: Event) => this.onOpen(ev),
|
|
80
|
+
close: (ev: CloseEvent) => this.onClose(ev),
|
|
81
|
+
error: (ev: Event | ErrorEvent) => this.onError(ev),
|
|
82
|
+
message: (ev: MessageEvent) => this.onMessage(ev),
|
|
69
83
|
} as const);
|
|
70
84
|
/** 初始化 WebSocket */
|
|
71
85
|
protected async initSocket(oldValue: WebSocket | undefined, newValue: WebSocket): Promise<void> {
|
|
@@ -76,7 +90,7 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
76
90
|
oldValue.removeEventListener('error', this.__handlers.error);
|
|
77
91
|
oldValue.removeEventListener('message', this.__handlers.message);
|
|
78
92
|
}
|
|
79
|
-
await
|
|
93
|
+
await connected(newValue);
|
|
80
94
|
const info = await this.authSocket();
|
|
81
95
|
if (this.__socket === newValue) {
|
|
82
96
|
newValue.addEventListener('open', this.__handlers.open);
|
|
@@ -93,16 +107,16 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
93
107
|
/** 认证 WebSocket */
|
|
94
108
|
protected abstract authSocket(): Promise<RpcMetadata>;
|
|
95
109
|
/** 响应 WebSocket error */
|
|
96
|
-
protected onError(_ev:
|
|
110
|
+
protected onError(_ev: ErrorEvent | Event): void {
|
|
97
111
|
this._remoteMetadata = undefined;
|
|
98
112
|
this.makeReady();
|
|
99
113
|
}
|
|
100
114
|
/** 响应 WebSocket open */
|
|
101
|
-
protected onOpen(_ev:
|
|
115
|
+
protected onOpen(_ev: Event): void {
|
|
102
116
|
//
|
|
103
117
|
}
|
|
104
118
|
/** 响应 WebSocket close */
|
|
105
|
-
protected onClose(ev:
|
|
119
|
+
protected onClose(ev: CloseEvent): void {
|
|
106
120
|
this._remoteMetadata = undefined;
|
|
107
121
|
if (ev.code === 1000) {
|
|
108
122
|
this.destroy();
|
|
@@ -111,8 +125,8 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
111
125
|
}
|
|
112
126
|
}
|
|
113
127
|
/** 响应 WebSocket message */
|
|
114
|
-
protected onMessage(ev:
|
|
115
|
-
const payload = decodePayload(ev.data);
|
|
128
|
+
protected onMessage(ev: MessageEvent): void {
|
|
129
|
+
const payload = decodePayload(ev.data as Data);
|
|
116
130
|
let error;
|
|
117
131
|
if (payload) {
|
|
118
132
|
const handled = this.onPayload(payload);
|
|
@@ -233,7 +247,10 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
233
247
|
}
|
|
234
248
|
}
|
|
235
249
|
/** 发送数据 */
|
|
236
|
-
protected async sendPayload<T extends RpcPayload['type']>(
|
|
250
|
+
protected async sendPayload<T extends RpcPayload['type']>(
|
|
251
|
+
type: T,
|
|
252
|
+
info: Omit<RpcPayload & { type: T }, 'type'>,
|
|
253
|
+
): Promise<void> {
|
|
237
254
|
await this.ready;
|
|
238
255
|
send(this.socket, type, info);
|
|
239
256
|
}
|
|
@@ -245,9 +262,15 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
245
262
|
this.seq += 2;
|
|
246
263
|
return seq;
|
|
247
264
|
}
|
|
248
|
-
private readonly pendingCalls = new Map<
|
|
265
|
+
private readonly pendingCalls = new Map<
|
|
266
|
+
number,
|
|
267
|
+
[resolve: (result: unknown) => void, reject: (error: Error) => void]
|
|
268
|
+
>();
|
|
249
269
|
/** 调用远程方法 */
|
|
250
|
-
call<TMethod extends Methods<TRemote>>(
|
|
270
|
+
call<TMethod extends Methods<TRemote>>(
|
|
271
|
+
method: TMethod,
|
|
272
|
+
...args: RpcParameters<TRemote[TMethod]>
|
|
273
|
+
): Promise<RpcReturns<TRemote[TMethod]>> {
|
|
251
274
|
return new Promise((resolve, reject) => {
|
|
252
275
|
const seq = this.nextSeq();
|
|
253
276
|
void this.sendPayload('call', { seq, method, args });
|
|
@@ -255,14 +278,20 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
255
278
|
});
|
|
256
279
|
}
|
|
257
280
|
/** 调用远程方法,放弃返回值 */
|
|
258
|
-
notify<TNotification extends Notifications<TRemote>>(
|
|
281
|
+
notify<TNotification extends Notifications<TRemote>>(
|
|
282
|
+
method: TNotification,
|
|
283
|
+
...args: RpcParameters<TRemote[TNotification]>
|
|
284
|
+
): void {
|
|
259
285
|
const seq = this.nextSeq();
|
|
260
286
|
void this.sendPayload('notify', { seq, method, args });
|
|
261
287
|
}
|
|
262
288
|
|
|
263
289
|
private readonly pendingSubscriptions = new Map<number, Subscriber<unknown>>();
|
|
264
290
|
/** 调用远程订阅 */
|
|
265
|
-
subscribe<TSubject extends Subjects<TRemote>>(
|
|
291
|
+
subscribe<TSubject extends Subjects<TRemote>>(
|
|
292
|
+
method: TSubject,
|
|
293
|
+
...args: RpcParameters<TRemote[TSubject]>
|
|
294
|
+
): Observable<RpcReturns<TRemote[TSubject]>> {
|
|
266
295
|
return new Observable((subscriber) => {
|
|
267
296
|
const seq = this.nextSeq();
|
|
268
297
|
void this.sendPayload('subscribe', { seq, method, args });
|
|
@@ -275,7 +304,10 @@ export abstract class RpcSocket<TRemote extends {}, TLocal extends {}> {
|
|
|
275
304
|
}
|
|
276
305
|
/** 结束 */
|
|
277
306
|
destroy(): void {
|
|
278
|
-
if (
|
|
307
|
+
if (
|
|
308
|
+
this.__socket &&
|
|
309
|
+
(this.__socket.readyState === this.__socket.CONNECTING || this.__socket.readyState === this.__socket.OPEN)
|
|
310
|
+
) {
|
|
279
311
|
this.__socket.close(1000);
|
|
280
312
|
this.__socket = undefined;
|
|
281
313
|
}
|
package/src/types/utils.ts
CHANGED
|
@@ -26,7 +26,11 @@ export type Methods<T> = {
|
|
|
26
26
|
string;
|
|
27
27
|
/** 提取类型中的通知 */
|
|
28
28
|
export type Notifications<T> = {
|
|
29
|
-
[P in keyof T]: T[P] extends (...args: any[]) => infer R
|
|
29
|
+
[P in keyof T]: T[P] extends (...args: any[]) => infer R
|
|
30
|
+
? IsNotificationReturn<R> extends true
|
|
31
|
+
? P
|
|
32
|
+
: never
|
|
33
|
+
: never;
|
|
30
34
|
}[keyof T] &
|
|
31
35
|
string;
|
|
32
36
|
/** 提取类型中的订阅主题 */
|
|
@@ -38,7 +42,11 @@ export type Subjects<T> = {
|
|
|
38
42
|
/** RPC 调用的参数 */
|
|
39
43
|
export type RpcParameters<T> = T extends (...args: infer R) => any ? R : never;
|
|
40
44
|
/** RPC 调用的返回 */
|
|
41
|
-
export type RpcReturns<T> = T extends (...args: any[]) => infer R
|
|
45
|
+
export type RpcReturns<T> = T extends (...args: any[]) => infer R
|
|
46
|
+
? Awaited<R> extends ObservableLike<infer U>
|
|
47
|
+
? U
|
|
48
|
+
: Awaited<R>
|
|
49
|
+
: never;
|
|
42
50
|
|
|
43
51
|
/** RPC 调用函数的实现 */
|
|
44
52
|
type RpcField<T> = T extends (...args: infer P) => infer R
|
package/src/utils/messaging.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type WebSocket from 'isomorphic-ws';
|
|
2
1
|
import { encode } from '@cloudpss/ubjson';
|
|
3
2
|
import type { RpcPayload } from '../types/payload.js';
|
|
4
3
|
|
|
5
4
|
/** 发送消息 */
|
|
6
|
-
export function send<T extends RpcPayload['type']>(
|
|
5
|
+
export function send<T extends RpcPayload['type']>(
|
|
6
|
+
socket: WebSocket,
|
|
7
|
+
type: T,
|
|
8
|
+
info: Omit<RpcPayload & { type: T }, 'type'>,
|
|
9
|
+
): void {
|
|
7
10
|
socket.send(
|
|
8
11
|
encode({
|
|
9
12
|
...info,
|
package/src/utils/serialize.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { decode } from '@cloudpss/ubjson';
|
|
2
|
-
import type
|
|
2
|
+
import type { Data } from '@cloudpss/ws';
|
|
3
3
|
import type { RpcErrorLike, RpcPayload } from '../types/payload.js';
|
|
4
4
|
|
|
5
5
|
/** 反序列化 */
|
|
6
|
-
export function decodePayload(data:
|
|
6
|
+
export function decodePayload(data: Data): RpcPayload | undefined {
|
|
7
7
|
if (!data || typeof data == 'string') return undefined;
|
|
8
|
-
if (Array.isArray(data)) data = Buffer.concat(data);
|
|
9
8
|
try {
|
|
10
9
|
const payload = decode(data) as RpcPayload;
|
|
11
10
|
if (!payload || typeof payload != 'object') return undefined;
|
|
@@ -58,7 +57,8 @@ export function deserializeError(error: RpcErrorLike): Error {
|
|
|
58
57
|
} else {
|
|
59
58
|
ex = new Error(message);
|
|
60
59
|
}
|
|
61
|
-
if (name !== ex?.name)
|
|
60
|
+
if (name !== ex?.name)
|
|
61
|
+
Object.defineProperty(ex, 'name', { value: String(name), configurable: true, writable: true });
|
|
62
62
|
Object.defineProperty(ex, 'stack', {
|
|
63
63
|
value: stack ? String(stack) : undefined,
|
|
64
64
|
configurable: true,
|
package/tests/client.js
CHANGED
package/tests/server.js
CHANGED
package/dist/utils/websocket.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/src/utils/websocket.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type WebSocket from 'isomorphic-ws';
|
|
2
|
-
|
|
3
|
-
/** 等待连接建立 */
|
|
4
|
-
export function ready(socket: WebSocket): Promise<void> {
|
|
5
|
-
switch (socket.readyState) {
|
|
6
|
-
case socket.CONNECTING:
|
|
7
|
-
return new Promise((resolve, reject) => {
|
|
8
|
-
socket.addEventListener('open', () => resolve(), { once: true });
|
|
9
|
-
socket.addEventListener('error', (ev) => reject(ev.error ?? new Error(`Failed to connect`)), {
|
|
10
|
-
once: true,
|
|
11
|
-
});
|
|
12
|
-
});
|
|
13
|
-
case socket.OPEN:
|
|
14
|
-
return Promise.resolve();
|
|
15
|
-
case socket.CLOSING:
|
|
16
|
-
return Promise.reject(new Error(`Socket is closing.`));
|
|
17
|
-
case socket.CLOSED:
|
|
18
|
-
return Promise.reject(new Error(`Socket is closed.`));
|
|
19
|
-
default:
|
|
20
|
-
return Promise.reject(new Error(`Socket is in unknown state.`));
|
|
21
|
-
}
|
|
22
|
-
}
|