@socket-mesh/core 1.0.4 → 2.1.0
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/maps/handler-map.d.ts +5 -3
- package/dist/maps/method-map.d.ts +2 -0
- package/dist/packet.d.ts +26 -11
- package/dist/plugins/plugin.d.ts +30 -30
- package/dist/request-handler.d.ts +9 -7
- package/dist/request.d.ts +20 -27
- package/dist/response.d.ts +15 -11
- package/dist/socket-event.d.ts +14 -7
- package/dist/socket-transport.d.ts +38 -33
- package/dist/socket-transport.js +32 -16
- package/dist/socket.d.ts +34 -25
- package/dist/socket.js +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +3 -0
- package/package.json +1 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { RequestHandler } from '../request-handler.js';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { BaseSocketTransport } from '../socket-transport.js';
|
|
3
|
+
import { BaseSocket } from '../socket.js';
|
|
4
|
+
import { MethodMap } from './method-map.js';
|
|
5
|
+
export type HandlerMap<TIncoming extends MethodMap, TState extends object, TSocket extends BaseSocket<TState> = BaseSocket<TState>, TTransport extends BaseSocketTransport<TState> = BaseSocketTransport<TState>> = Partial<{
|
|
6
|
+
[K in keyof TIncoming]: RequestHandler<Parameters<TIncoming[K]>[0], ReturnType<TIncoming[K]>, TState, TSocket, TTransport>;
|
|
5
7
|
}>;
|
|
@@ -20,3 +20,5 @@ export type RemoveIndexSignature<T> = {
|
|
|
20
20
|
export type ServiceMap = {
|
|
21
21
|
[service: string]: MethodMap;
|
|
22
22
|
};
|
|
23
|
+
export type ServiceMethodName<TService extends ServiceMap, TServiceName extends ServiceName<TService>> = string & keyof TService[TServiceName];
|
|
24
|
+
export type ServiceName<TService extends ServiceMap> = string & keyof TService;
|
package/dist/packet.d.ts
CHANGED
|
@@ -1,26 +1,41 @@
|
|
|
1
1
|
import { MethodMap, ServiceMap } from './maps/method-map.js';
|
|
2
|
-
export type AnyPacket
|
|
3
|
-
export type
|
|
4
|
-
[TMethod in keyof TMethodMap]:
|
|
2
|
+
export type AnyPacket = MethodPacket | ServicePacket;
|
|
3
|
+
export type IncomingMethodPacket<TMethodMap extends MethodMap> = {
|
|
4
|
+
[TMethod in keyof TMethodMap]: IncomingMethodRequestPacket<TMethodMap, TMethod>;
|
|
5
5
|
}[keyof TMethodMap];
|
|
6
|
-
export interface
|
|
6
|
+
export interface IncomingMethodRequestPacket<TMethodMap extends MethodMap, TMethod extends keyof TMethodMap> extends RequestPacket {
|
|
7
7
|
ackTimeoutMs?: boolean | number;
|
|
8
8
|
data: Parameters<TMethodMap[TMethod]>[0];
|
|
9
9
|
method: TMethod;
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
export type ServicePacket<TServiceMap extends ServiceMap> = {
|
|
11
|
+
export type IncomingPacket<TIncoming extends MethodMap, TService extends ServiceMap> = IncomingMethodPacket<TIncoming> | IncomingServicePacket<TService>;
|
|
12
|
+
export type IncomingServicePacket<TServiceMap extends ServiceMap> = {
|
|
15
13
|
[TService in keyof TServiceMap]: {
|
|
16
|
-
[TMethod in keyof TServiceMap[TService]]:
|
|
14
|
+
[TMethod in keyof TServiceMap[TService]]: IncomingServiceRequestPacket<TServiceMap, TService, TMethod>;
|
|
17
15
|
}[keyof TServiceMap[TService]];
|
|
18
16
|
}[keyof TServiceMap];
|
|
19
|
-
export interface
|
|
17
|
+
export interface IncomingServiceRequestPacket<TServiceMap extends ServiceMap, TService extends keyof TServiceMap, TMethod extends keyof TServiceMap[TService]> extends RequestPacket {
|
|
20
18
|
ackTimeoutMs?: boolean | number;
|
|
21
19
|
data?: Parameters<TServiceMap[TService][TMethod]>[0];
|
|
22
20
|
method: TMethod;
|
|
23
21
|
service: TService;
|
|
24
22
|
}
|
|
25
|
-
export
|
|
23
|
+
export type MethodPacket = MethodRequestPacket;
|
|
24
|
+
export interface MethodRequestPacket extends RequestPacket {
|
|
25
|
+
ackTimeoutMs?: boolean | number;
|
|
26
|
+
data?: unknown;
|
|
27
|
+
method: string;
|
|
28
|
+
}
|
|
29
|
+
interface RequestPacket {
|
|
30
|
+
cid?: number;
|
|
31
|
+
}
|
|
32
|
+
export type ServicePacket = ServiceRequestPacket;
|
|
33
|
+
export interface ServiceRequestPacket extends RequestPacket {
|
|
34
|
+
ackTimeoutMs?: boolean | number;
|
|
35
|
+
data?: unknown;
|
|
36
|
+
method: string;
|
|
37
|
+
service: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function isRequestPacket(packet: unknown): packet is AnyPacket;
|
|
40
|
+
export declare function isRequestPacket<TIncoming extends MethodMap, TService extends ServiceMap = {}>(packet: unknown): packet is IncomingPacket<TIncoming, TService>;
|
|
26
41
|
export {};
|
package/dist/plugins/plugin.d.ts
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
import ws from 'isomorphic-ws';
|
|
2
|
-
import { HandlerMap } from '../maps/handler-map.js';
|
|
3
|
-
import { MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from '../maps/method-map.js';
|
|
4
2
|
import { AnyPacket } from '../packet.js';
|
|
3
|
+
import { LooseHandlerMap } from '../request-handler.js';
|
|
5
4
|
import { AnyRequest } from '../request.js';
|
|
6
5
|
import { AnyResponse } from '../response.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
export
|
|
6
|
+
import { BaseSocketTransport } from '../socket-transport.js';
|
|
7
|
+
import { BaseSocket, SocketStatus } from '../socket.js';
|
|
8
|
+
export type AnyPlugin = Plugin<any, any>;
|
|
9
|
+
export interface DisconnectedPluginArgs<TSocket extends BaseSocket = BaseSocket, TTransport extends BaseSocketTransport = BaseSocketTransport> extends PluginArgs<TSocket, TTransport> {
|
|
10
10
|
code: number;
|
|
11
11
|
reason?: string;
|
|
12
12
|
status: SocketStatus;
|
|
13
13
|
}
|
|
14
|
-
export interface MessagePluginArgs<
|
|
15
|
-
packet: AnyPacket
|
|
14
|
+
export interface MessagePluginArgs<TSocket extends BaseSocket = BaseSocket, TTransport extends BaseSocketTransport = BaseSocketTransport> extends PluginArgs<TSocket, TTransport> {
|
|
15
|
+
packet: AnyPacket | AnyResponse;
|
|
16
16
|
timestamp: Date;
|
|
17
17
|
}
|
|
18
|
-
export interface MessageRawPluginArgs<
|
|
18
|
+
export interface MessageRawPluginArgs<TSocket extends BaseSocket = BaseSocket, TTransport extends BaseSocketTransport = BaseSocketTransport> extends PluginArgs<TSocket, TTransport> {
|
|
19
19
|
message: string | ws.RawData;
|
|
20
20
|
promise: Promise<void>;
|
|
21
21
|
timestamp: Date;
|
|
22
22
|
}
|
|
23
|
-
export interface Plugin<
|
|
24
|
-
handlers?:
|
|
25
|
-
onAuthenticated?(options: PluginArgs<
|
|
26
|
-
onClose?(options: PluginArgs<
|
|
27
|
-
onDeauthenticate?(options: PluginArgs<
|
|
28
|
-
onDisconnected?(options: DisconnectedPluginArgs<
|
|
29
|
-
onEnd?(options: PluginArgs<
|
|
30
|
-
onMessage?(options: MessagePluginArgs<
|
|
31
|
-
onMessageRaw?(options: MessageRawPluginArgs<
|
|
32
|
-
onOpen?(options: PluginArgs<
|
|
33
|
-
onReady?(options: PluginArgs<
|
|
34
|
-
sendRequest?(options: SendRequestPluginArgs<
|
|
35
|
-
sendResponse?(options: SendResponsePluginArgs<
|
|
23
|
+
export interface Plugin<TSocket extends BaseSocket = BaseSocket, TTransport extends BaseSocketTransport = BaseSocketTransport> {
|
|
24
|
+
handlers?: LooseHandlerMap;
|
|
25
|
+
onAuthenticated?(options: PluginArgs<TSocket, TTransport>): void;
|
|
26
|
+
onClose?(options: PluginArgs<TSocket, TTransport>): void;
|
|
27
|
+
onDeauthenticate?(options: PluginArgs<TSocket, TTransport>): void;
|
|
28
|
+
onDisconnected?(options: DisconnectedPluginArgs<TSocket, TTransport>): void;
|
|
29
|
+
onEnd?(options: PluginArgs<TSocket, TTransport>): void;
|
|
30
|
+
onMessage?(options: MessagePluginArgs<TSocket, TTransport>): Promise<AnyPacket | AnyResponse>;
|
|
31
|
+
onMessageRaw?(options: MessageRawPluginArgs<TSocket, TTransport>): Promise<string | ws.RawData>;
|
|
32
|
+
onOpen?(options: PluginArgs<TSocket, TTransport>): void;
|
|
33
|
+
onReady?(options: PluginArgs<TSocket, TTransport>): void;
|
|
34
|
+
sendRequest?(options: SendRequestPluginArgs<TSocket, TTransport>): void;
|
|
35
|
+
sendResponse?(options: SendResponsePluginArgs<TSocket, TTransport>): void;
|
|
36
36
|
type: string;
|
|
37
37
|
}
|
|
38
|
-
export interface PluginArgs<
|
|
39
|
-
socket:
|
|
40
|
-
transport:
|
|
38
|
+
export interface PluginArgs<TSocket extends BaseSocket = BaseSocket, TTransport extends BaseSocketTransport = BaseSocketTransport> {
|
|
39
|
+
socket: TSocket;
|
|
40
|
+
transport: TTransport;
|
|
41
41
|
}
|
|
42
42
|
export type PluginType = 'handshake' | 'request' | 'response';
|
|
43
|
-
export interface SendRequestPluginArgs<
|
|
44
|
-
cont: (requests: AnyRequest
|
|
45
|
-
requests: AnyRequest
|
|
43
|
+
export interface SendRequestPluginArgs<TSocket extends BaseSocket = BaseSocket, TTransport extends BaseSocketTransport = BaseSocketTransport> extends PluginArgs<TSocket, TTransport> {
|
|
44
|
+
cont: (requests: AnyRequest[]) => void;
|
|
45
|
+
requests: AnyRequest[];
|
|
46
46
|
}
|
|
47
|
-
export interface SendResponsePluginArgs<
|
|
48
|
-
cont: (requests: AnyResponse
|
|
49
|
-
responses: AnyResponse
|
|
47
|
+
export interface SendResponsePluginArgs<TSocket extends BaseSocket = BaseSocket, TTransport extends BaseSocketTransport = BaseSocketTransport> extends PluginArgs<TSocket, TTransport> {
|
|
48
|
+
cont: (requests: AnyResponse[]) => void;
|
|
49
|
+
responses: AnyResponse[];
|
|
50
50
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { BaseSocketTransport } from './socket-transport.js';
|
|
2
|
+
import { BaseSocket } from './socket.js';
|
|
3
|
+
export interface LooseHandlerMap {
|
|
4
|
+
[method: string]: ((args: RequestHandlerArgs<any, any, any, any>) => Promise<any>) | undefined;
|
|
5
|
+
}
|
|
6
|
+
export type RequestHandler<TOptions, U, TState extends object, TSocket extends BaseSocket<TState> = BaseSocket<TState>, TTransport extends BaseSocketTransport<TState> = BaseSocketTransport<TState>> = (args: RequestHandlerArgs<TOptions, TState, TSocket, TTransport>) => Promise<U>;
|
|
7
|
+
export interface RequestHandlerArgsOptions<TOptions, TState extends object, TSocket extends BaseSocket<TState> = BaseSocket<TState>, TTransport extends BaseSocketTransport<TState> = BaseSocketTransport<TState>> {
|
|
6
8
|
isRpc: boolean;
|
|
7
9
|
method: string;
|
|
8
10
|
options: TOptions;
|
|
@@ -10,7 +12,7 @@ export interface RequestHandlerArgsOptions<TOptions, TIncoming extends MethodMap
|
|
|
10
12
|
timeoutMs?: boolean | number;
|
|
11
13
|
transport: TTransport;
|
|
12
14
|
}
|
|
13
|
-
export declare class RequestHandlerArgs<TOptions,
|
|
15
|
+
export declare class RequestHandlerArgs<TOptions, TState extends object = {}, TSocket extends BaseSocket<TState> = BaseSocket<TState>, TTransport extends BaseSocketTransport<TState> = BaseSocketTransport<TState>> {
|
|
14
16
|
isRpc: boolean;
|
|
15
17
|
method: string;
|
|
16
18
|
options: TOptions;
|
|
@@ -18,7 +20,7 @@ export declare class RequestHandlerArgs<TOptions, TIncoming extends MethodMap =
|
|
|
18
20
|
socket: TSocket;
|
|
19
21
|
timeoutMs?: boolean | number;
|
|
20
22
|
transport: TTransport;
|
|
21
|
-
constructor(options: RequestHandlerArgsOptions<TOptions,
|
|
23
|
+
constructor(options: RequestHandlerArgsOptions<TOptions, TState, TSocket, TTransport>);
|
|
22
24
|
checkTimeout(timeLeftMs?: number): void;
|
|
23
25
|
getRemainingTimeMs(): number;
|
|
24
26
|
}
|
package/dist/request.d.ts
CHANGED
|
@@ -1,51 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export interface InvokeMethodRequest<TMethodMap extends MethodMap, TMethod extends keyof TMethodMap> extends TransmitMethodRequest<TMethodMap, TMethod> {
|
|
1
|
+
export type AnyRequest = MethodRequest | ServiceRequest;
|
|
2
|
+
export interface InvokeMethodRequest extends TransmitMethodRequest {
|
|
4
3
|
ackTimeoutMs: false | number;
|
|
5
|
-
callback: ((err: Error | null, result?:
|
|
4
|
+
callback: ((err: Error | null, result?: unknown) => void) | null;
|
|
6
5
|
cid: number;
|
|
7
6
|
timeoutId?: NodeJS.Timeout;
|
|
8
7
|
}
|
|
9
|
-
export interface InvokeServiceRequest
|
|
8
|
+
export interface InvokeServiceRequest extends TransmitServiceRequest {
|
|
10
9
|
ackTimeoutMs: false | number;
|
|
11
|
-
callback: ((err: Error | null, result?:
|
|
10
|
+
callback: ((err: Error | null, result?: unknown) => void) | null;
|
|
12
11
|
cid: number;
|
|
13
12
|
timeoutId?: NodeJS.Timeout;
|
|
14
13
|
}
|
|
15
|
-
export type MethodRequest
|
|
16
|
-
[TMethod in keyof TMethodMap]: InvokeMethodRequest<TMethodMap, TMethod> | TransmitMethodRequest<TMethodMap, TMethod>;
|
|
17
|
-
}[keyof TMethodMap];
|
|
14
|
+
export type MethodRequest = InvokeMethodRequest | TransmitMethodRequest;
|
|
18
15
|
export interface Request {
|
|
19
16
|
promise: Promise<void>;
|
|
20
17
|
sentCallback?: (err?: Error) => void;
|
|
21
18
|
}
|
|
22
|
-
export type ServiceRequest
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}[keyof TServiceMap];
|
|
27
|
-
export interface TransmitMethodRequest<TMethodMap extends MethodMap, TMethod extends keyof TMethodMap> extends Request {
|
|
28
|
-
data?: Parameters<TMethodMap[TMethod]>[0];
|
|
29
|
-
method: TMethod;
|
|
19
|
+
export type ServiceRequest = InvokeServiceRequest | TransmitServiceRequest;
|
|
20
|
+
export interface TransmitMethodRequest extends Request {
|
|
21
|
+
data?: unknown;
|
|
22
|
+
method: string;
|
|
30
23
|
}
|
|
31
|
-
export interface TransmitServiceRequest
|
|
32
|
-
data?:
|
|
33
|
-
method:
|
|
34
|
-
service:
|
|
24
|
+
export interface TransmitServiceRequest extends Request {
|
|
25
|
+
data?: unknown;
|
|
26
|
+
method: string;
|
|
27
|
+
service: string;
|
|
35
28
|
}
|
|
36
|
-
export declare function abortRequest
|
|
37
|
-
export declare function isRequestDone
|
|
38
|
-
export declare class RequestCollection
|
|
29
|
+
export declare function abortRequest(request: AnyRequest, err: Error): void;
|
|
30
|
+
export declare function isRequestDone(request: AnyRequest): boolean;
|
|
31
|
+
export declare class RequestCollection {
|
|
39
32
|
private readonly _callbacks;
|
|
40
33
|
private readonly _requests;
|
|
41
|
-
constructor(requests: AnyRequest
|
|
34
|
+
constructor(requests: AnyRequest | AnyRequest[]);
|
|
42
35
|
isDone(): boolean;
|
|
43
|
-
get items(): ReadonlyArray<AnyRequest
|
|
36
|
+
get items(): ReadonlyArray<AnyRequest>;
|
|
44
37
|
listen(cb: () => void): void;
|
|
45
38
|
[Symbol.iterator](): {
|
|
46
39
|
next(): {
|
|
47
40
|
done: boolean;
|
|
48
|
-
value: AnyRequest
|
|
41
|
+
value: AnyRequest | undefined;
|
|
49
42
|
} | {
|
|
50
43
|
done: boolean;
|
|
51
44
|
value?: undefined;
|
package/dist/response.d.ts
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import { MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './maps/method-map.js';
|
|
2
|
-
export type AnyResponse
|
|
3
|
-
export interface DataResponse
|
|
4
|
-
data:
|
|
2
|
+
export type AnyResponse = DataResponse | ErrorResponse | Response;
|
|
3
|
+
export interface DataResponse extends Response {
|
|
4
|
+
data: unknown;
|
|
5
5
|
}
|
|
6
6
|
export interface ErrorResponse extends Response {
|
|
7
7
|
error: Error;
|
|
8
8
|
}
|
|
9
|
-
export
|
|
10
|
-
|
|
9
|
+
export interface OutgoingDataResponse<T> extends Response {
|
|
10
|
+
data: T;
|
|
11
|
+
}
|
|
12
|
+
export type OutgoingMethodDataResponse<TMethodMap extends MethodMap> = {
|
|
13
|
+
[TMethod in keyof TMethodMap]: OutgoingDataResponse<ReturnType<TMethodMap[TMethod]>>;
|
|
11
14
|
}[keyof TMethodMap];
|
|
15
|
+
export type OutgoingResponse<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap> = ErrorResponse | OutgoingMethodDataResponse<TOutgoing> | OutgoingMethodDataResponse<TPrivateOutgoing> | OutgoingServiceDataResponse<TService> | Response;
|
|
16
|
+
export type OutgoingServiceDataResponse<TServiceMap extends ServiceMap> = {
|
|
17
|
+
[TService in keyof TServiceMap]: {
|
|
18
|
+
[TMethod in keyof TServiceMap[TService]]: OutgoingDataResponse<ReturnType<TServiceMap[TService][TMethod]>>;
|
|
19
|
+
}[keyof TServiceMap[TService]];
|
|
20
|
+
}[keyof TServiceMap];
|
|
12
21
|
export interface Response {
|
|
13
22
|
rid: number;
|
|
14
23
|
timeoutAt?: Date;
|
|
15
24
|
}
|
|
16
|
-
export
|
|
17
|
-
[TService in keyof TServiceMap]: {
|
|
18
|
-
[TMethod in keyof TServiceMap[TService]]: DataResponse<ReturnType<TServiceMap[TService][TMethod]>>;
|
|
19
|
-
}[keyof TServiceMap[TService]];
|
|
20
|
-
}[keyof TServiceMap];
|
|
21
|
-
export declare function isResponsePacket<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap>(packet?: unknown): packet is AnyResponse<TOutgoing, TPrivateOutgoing, TService>;
|
|
25
|
+
export declare function isResponsePacket(packet?: unknown): packet is AnyResponse;
|
package/dist/socket-event.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AuthToken, SignedAuthToken } from '@socket-mesh/auth';
|
|
2
2
|
import ws from 'isomorphic-ws';
|
|
3
3
|
import { MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './maps/method-map.js';
|
|
4
|
-
import {
|
|
5
|
-
import { AnyResponse } from './response.js';
|
|
4
|
+
import { AnyPacket, IncomingPacket } from './packet.js';
|
|
5
|
+
import { AnyResponse, OutgoingResponse } from './response.js';
|
|
6
6
|
export interface AuthenticatedChangeEvent {
|
|
7
7
|
authToken: AuthToken | null;
|
|
8
8
|
isAuthenticated: true;
|
|
@@ -54,10 +54,17 @@ export type PongEvent = object;
|
|
|
54
54
|
export interface RemoveAuthTokenEvent {
|
|
55
55
|
oldAuthToken: SignedAuthToken;
|
|
56
56
|
}
|
|
57
|
-
export interface RequestEvent
|
|
58
|
-
request:
|
|
57
|
+
export interface RequestEvent {
|
|
58
|
+
request: AnyPacket;
|
|
59
59
|
}
|
|
60
|
-
export interface ResponseEvent
|
|
61
|
-
response: AnyResponse
|
|
60
|
+
export interface ResponseEvent {
|
|
61
|
+
response: AnyResponse;
|
|
62
62
|
}
|
|
63
|
-
export type SocketEvent
|
|
63
|
+
export type SocketEvent = AuthenticateEvent | AuthStateChangeEvent | BadAuthTokenEvent | CloseEvent | ConnectEvent | ConnectingEvent | DeauthenticateEvent | DisconnectEvent | ErrorEvent | MessageEvent | PingEvent | PongEvent | RemoveAuthTokenEvent | RequestEvent | ResponseEvent;
|
|
64
|
+
export interface TypedRequestEvent<TIncoming extends MethodMap, TService extends ServiceMap = {}> {
|
|
65
|
+
request: IncomingPacket<TIncoming, TService>;
|
|
66
|
+
}
|
|
67
|
+
export interface TypedResponseEvent<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap = {}, TService extends ServiceMap = {}> {
|
|
68
|
+
response: OutgoingResponse<TOutgoing, TPrivateOutgoing, TService>;
|
|
69
|
+
}
|
|
70
|
+
export type TypedSocketEvent<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap = {}, TService extends ServiceMap = {}> = AuthenticateEvent | AuthStateChangeEvent | BadAuthTokenEvent | CloseEvent | ConnectEvent | ConnectingEvent | DeauthenticateEvent | DisconnectEvent | ErrorEvent | MessageEvent | PingEvent | PongEvent | RemoveAuthTokenEvent | TypedRequestEvent<TIncoming, TService> | TypedResponseEvent<TOutgoing, TPrivateOutgoing, TService>;
|
|
@@ -1,46 +1,58 @@
|
|
|
1
1
|
import { AuthToken, SignedAuthToken } from '@socket-mesh/auth';
|
|
2
2
|
import { CodecEngine } from '@socket-mesh/formatter';
|
|
3
3
|
import ws from 'isomorphic-ws';
|
|
4
|
-
import { FunctionReturnType, MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './maps/method-map.js';
|
|
4
|
+
import { FunctionReturnType, MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap, ServiceMethodName, ServiceName } from './maps/method-map.js';
|
|
5
5
|
import { AnyPacket } from './packet.js';
|
|
6
|
-
import {
|
|
7
|
-
import { AnyRequest
|
|
6
|
+
import { AnyPlugin } from './plugins/plugin.js';
|
|
7
|
+
import { AnyRequest } from './request.js';
|
|
8
8
|
import { AnyResponse } from './response.js';
|
|
9
|
-
import {
|
|
9
|
+
import { BaseSocket, BaseSocketOptions, Socket, SocketStatus, StreamCleanupMode } from './socket.js';
|
|
10
10
|
export type CallIdGenerator = () => number;
|
|
11
|
-
export interface InboundMessage
|
|
12
|
-
packet: (AnyPacket
|
|
11
|
+
export interface InboundMessage {
|
|
12
|
+
packet: (AnyPacket | AnyResponse)[] | (AnyPacket | AnyResponse) | null;
|
|
13
13
|
timestamp: Date;
|
|
14
14
|
}
|
|
15
|
-
export interface InvokeMethodOptions<TMethodMap extends MethodMap, TMethod extends keyof TMethodMap> {
|
|
15
|
+
export interface InvokeMethodOptions<TMethodMap extends MethodMap = MethodMap, TMethod extends keyof TMethodMap & string = keyof TMethodMap & string> {
|
|
16
16
|
ackTimeoutMs?: false | number;
|
|
17
17
|
method: TMethod;
|
|
18
18
|
}
|
|
19
|
-
export interface InvokeServiceOptions<TServiceMap extends ServiceMap, TService extends keyof TServiceMap, TMethod extends keyof TServiceMap[TService]> {
|
|
19
|
+
export interface InvokeServiceOptions<TServiceMap extends ServiceMap = ServiceMap, TService extends keyof TServiceMap & string = keyof TServiceMap & string, TMethod extends keyof TServiceMap[TService] & string = keyof TServiceMap[TService] & string> {
|
|
20
20
|
ackTimeoutMs?: false | number;
|
|
21
21
|
method: TMethod;
|
|
22
22
|
service: TService;
|
|
23
23
|
}
|
|
24
|
-
export
|
|
24
|
+
export type SocketTransport<TIncoming extends PublicMethodMap = {}, TOutgoing extends PublicMethodMap = {}, TState extends object = {}, TService extends ServiceMap = {}, TPrivateIncoming extends PrivateMethodMap = {}, TPrivateOutgoing extends PrivateMethodMap = {}> = Omit<BaseSocketTransport<TState>, 'invoke' | 'socket' | 'transmit'> & {
|
|
25
|
+
invoke<TMethod extends keyof TOutgoing & string>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TOutgoing[TMethod]>>, () => void];
|
|
26
|
+
invoke<TMethod extends keyof TOutgoing & string>(options: InvokeMethodOptions<TOutgoing, TMethod>, arg?: Parameters<TOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TOutgoing[TMethod]>>, () => void];
|
|
27
|
+
invoke<TServiceName extends ServiceName<TService>, TMethod extends ServiceMethodName<TService, TServiceName>>(options: [TServiceName, TMethod, (false | number)?], arg?: Parameters<TService[TServiceName][TMethod]>[0]): [Promise<FunctionReturnType<TService[TServiceName][TMethod]>>, () => void];
|
|
28
|
+
invoke<TServiceName extends ServiceName<TService>, TMethod extends ServiceMethodName<TService, TServiceName>>(options: InvokeServiceOptions<TService, TServiceName, TMethod>, arg?: Parameters<TService[TServiceName][TMethod]>[0]): [Promise<FunctionReturnType<TService[TServiceName][TMethod]>>, () => void];
|
|
29
|
+
invoke<TMethod extends keyof TPrivateOutgoing & string>(method: TMethod, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TPrivateOutgoing[TMethod]>>, () => void];
|
|
30
|
+
invoke<TMethod extends keyof TPrivateOutgoing & string>(options: InvokeMethodOptions<TPrivateOutgoing, TMethod>, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TPrivateOutgoing[TMethod]>>, () => void];
|
|
31
|
+
readonly socket: Socket<TIncoming, TOutgoing, TState, TService, TPrivateIncoming, TPrivateOutgoing>;
|
|
32
|
+
transmit<TMethod extends keyof TOutgoing & string>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<void>;
|
|
33
|
+
transmit<TServiceName extends ServiceName<TService>, TMethod extends ServiceMethodName<TService, TServiceName>>(options: [TServiceName, TMethod], arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<void>;
|
|
34
|
+
transmit<TMethod extends keyof TPrivateOutgoing & string>(method: TMethod, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): Promise<void>;
|
|
35
|
+
};
|
|
36
|
+
export declare class BaseSocketTransport<TState extends object = {}> {
|
|
25
37
|
private _authToken;
|
|
26
38
|
private readonly _callbackMap;
|
|
27
39
|
private readonly _callIdGenerator;
|
|
28
|
-
private readonly _handlers;
|
|
29
40
|
private _inboundProcessedMessageCount;
|
|
30
41
|
private _inboundReceivedMessageCount;
|
|
31
42
|
private _isReady;
|
|
32
43
|
private _outboundPreparedMessageCount;
|
|
33
44
|
private _outboundSentMessageCount;
|
|
34
45
|
private _pingTimeoutRef;
|
|
46
|
+
private readonly _serviceHandlers;
|
|
35
47
|
private _signedAuthToken;
|
|
36
48
|
private _socket;
|
|
37
49
|
private _webSocket;
|
|
38
50
|
ackTimeoutMs: number;
|
|
39
51
|
readonly codecEngine: CodecEngine;
|
|
40
52
|
id: null | string;
|
|
41
|
-
readonly plugins:
|
|
53
|
+
readonly plugins: AnyPlugin[];
|
|
42
54
|
streamCleanupMode: StreamCleanupMode;
|
|
43
|
-
protected constructor(options?:
|
|
55
|
+
protected constructor(options?: BaseSocketOptions<TState>);
|
|
44
56
|
protected abortAllPendingCallbacksDueToBadConnection(status: SocketStatus): void;
|
|
45
57
|
get authToken(): AuthToken | null;
|
|
46
58
|
changeToUnauthenticatedState(): Promise<boolean>;
|
|
@@ -49,42 +61,35 @@ export declare class SocketTransport<TIncoming extends MethodMap, TOutgoing exte
|
|
|
49
61
|
getBackpressure(): number;
|
|
50
62
|
getInboundBackpressure(): number;
|
|
51
63
|
getOutboundBackpressure(): number;
|
|
52
|
-
protected handleInboudMessage({ packet, timestamp }: InboundMessage
|
|
53
|
-
invoke
|
|
54
|
-
invoke<TServiceName extends keyof TService, TMethod extends keyof TService[TServiceName]>(options: [TServiceName, TMethod, (false | number)?], arg?: Parameters<TService[TServiceName][TMethod]>[0]): [Promise<FunctionReturnType<TService[TServiceName][TMethod]>>, () => void];
|
|
55
|
-
invoke<TServiceName extends keyof TService, TMethod extends keyof TService[TServiceName]>(options: InvokeServiceOptions<TService, TServiceName, TMethod>, arg?: Parameters<TService[TServiceName][TMethod]>[0]): [Promise<FunctionReturnType<TService[TServiceName][TMethod]>>, () => void];
|
|
56
|
-
invoke<TMethod extends keyof TOutgoing>(options: InvokeMethodOptions<TOutgoing, TMethod>, arg?: Parameters<TOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TOutgoing[TMethod]>>, () => void];
|
|
57
|
-
invoke<TMethod extends keyof TPrivateOutgoing>(method: TMethod, arg: Parameters<TPrivateOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TPrivateOutgoing[TMethod]>>, () => void];
|
|
58
|
-
invoke<TMethod extends keyof TPrivateOutgoing>(options: InvokeMethodOptions<TPrivateOutgoing, TMethod>, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TPrivateOutgoing[TMethod]>>, () => void];
|
|
64
|
+
protected handleInboudMessage({ packet, timestamp }: InboundMessage): Promise<void>;
|
|
65
|
+
invoke(methodOptions: [string, string, (false | number)?] | InvokeMethodOptions | InvokeServiceOptions | string, arg?: unknown): [Promise<unknown>, () => void];
|
|
59
66
|
protected onClose(code: number, reason?: Buffer | string): void;
|
|
60
67
|
protected onDisconnect(status: SocketStatus, code: number, reason?: string): void;
|
|
61
68
|
onError(error: Error): void;
|
|
62
|
-
protected onInvoke
|
|
69
|
+
protected onInvoke(request: AnyRequest): void;
|
|
63
70
|
protected onMessage(data: ws.Data, isBinary: boolean): void;
|
|
64
71
|
protected onOpen(): void;
|
|
65
72
|
protected onPingPong(): void;
|
|
66
|
-
protected onRequest(packet: AnyPacket
|
|
67
|
-
protected onResponse(response: AnyResponse
|
|
73
|
+
protected onRequest(packet: AnyPacket, timestamp: Date, pluginError?: Error): Promise<boolean>;
|
|
74
|
+
protected onResponse(response: AnyResponse, pluginError?: Error): void;
|
|
68
75
|
private onSocketClose;
|
|
69
76
|
private onSocketError;
|
|
70
77
|
private onSocketMessage;
|
|
71
|
-
protected onTransmit
|
|
72
|
-
protected onUnhandledRequest(
|
|
78
|
+
protected onTransmit(request: AnyRequest): void;
|
|
79
|
+
protected onUnhandledRequest(_: AnyPacket): boolean;
|
|
73
80
|
protected resetPingTimeout(timeoutMs: false | number, code: number): void;
|
|
74
81
|
send(data: Buffer | string): Promise<void>;
|
|
75
|
-
protected sendRequest(requests:
|
|
76
|
-
protected sendRequest(index: number, requests:
|
|
77
|
-
protected sendResponse(responses:
|
|
78
|
-
protected sendResponse(index: number, responses:
|
|
82
|
+
protected sendRequest(requests: AnyRequest[]): void;
|
|
83
|
+
protected sendRequest(index: number, requests: AnyRequest[]): void;
|
|
84
|
+
protected sendResponse(responses: AnyResponse[]): void;
|
|
85
|
+
protected sendResponse(index: number, responses: AnyResponse[]): void;
|
|
79
86
|
setAuthorization(signedAuthToken: SignedAuthToken, authToken?: AuthToken): Promise<boolean>;
|
|
80
87
|
setReadyStatus(pingTimeoutMs: number, authError?: Error): void;
|
|
81
88
|
get signedAuthToken(): null | SignedAuthToken;
|
|
82
|
-
get socket():
|
|
83
|
-
set socket(value:
|
|
89
|
+
get socket(): BaseSocket<TState>;
|
|
90
|
+
set socket(value: BaseSocket<TState>);
|
|
84
91
|
get status(): SocketStatus;
|
|
85
|
-
transmit
|
|
86
|
-
transmit<TServiceName extends keyof TService, TMethod extends keyof TService[TServiceName]>(options: [TServiceName, TMethod], arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<void>;
|
|
87
|
-
transmit<TMethod extends keyof TPrivateOutgoing>(method: TMethod, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): Promise<void>;
|
|
92
|
+
transmit(serviceAndMethod: [string, string] | string, arg?: unknown): Promise<void>;
|
|
88
93
|
triggerAuthenticationEvents(wasSigned: boolean, wasAuthenticated: boolean): void;
|
|
89
94
|
get url(): string;
|
|
90
95
|
protected get webSocket(): null | ws.WebSocket;
|
package/dist/socket-transport.js
CHANGED
|
@@ -6,18 +6,18 @@ import { isRequestPacket } from './packet.js';
|
|
|
6
6
|
import { RequestHandlerArgs } from './request-handler.js';
|
|
7
7
|
import { abortRequest, isRequestDone } from './request.js';
|
|
8
8
|
import { isResponsePacket } from './response.js';
|
|
9
|
-
import { toArray, wait } from './utils.js';
|
|
10
|
-
export class
|
|
9
|
+
import { toArray, toError, wait } from './utils.js';
|
|
10
|
+
export class BaseSocketTransport {
|
|
11
11
|
_authToken;
|
|
12
12
|
_callbackMap;
|
|
13
13
|
_callIdGenerator;
|
|
14
|
-
_handlers;
|
|
15
14
|
_inboundProcessedMessageCount;
|
|
16
15
|
_inboundReceivedMessageCount;
|
|
17
16
|
_isReady;
|
|
18
17
|
_outboundPreparedMessageCount;
|
|
19
18
|
_outboundSentMessageCount;
|
|
20
19
|
_pingTimeoutRef;
|
|
20
|
+
_serviceHandlers;
|
|
21
21
|
_signedAuthToken;
|
|
22
22
|
_socket;
|
|
23
23
|
_webSocket;
|
|
@@ -28,21 +28,34 @@ export class SocketTransport {
|
|
|
28
28
|
streamCleanupMode;
|
|
29
29
|
constructor(options) {
|
|
30
30
|
let cid = 1;
|
|
31
|
+
this._isReady = false;
|
|
31
32
|
this._authToken = null;
|
|
32
33
|
this._signedAuthToken = null;
|
|
34
|
+
this._webSocket = null;
|
|
33
35
|
this.ackTimeoutMs = options?.ackTimeoutMs ?? 10000;
|
|
34
36
|
this._callIdGenerator = options?.callIdGenerator || (() => {
|
|
35
37
|
return cid++;
|
|
36
38
|
});
|
|
37
39
|
this._callbackMap = {};
|
|
38
40
|
this.codecEngine = options?.codecEngine || defaultCodec;
|
|
39
|
-
this._handlers = options?.handlers || {};
|
|
40
41
|
this.id = null;
|
|
41
42
|
this._inboundProcessedMessageCount = 0;
|
|
42
43
|
this._inboundReceivedMessageCount = 0;
|
|
43
44
|
this._outboundPreparedMessageCount = 0;
|
|
44
45
|
this._outboundSentMessageCount = 0;
|
|
45
46
|
this._pingTimeoutRef = null;
|
|
47
|
+
this._serviceHandlers = options?.serviceHandlers || {};
|
|
48
|
+
// Flat (non-service) handlers live under the empty-string service key
|
|
49
|
+
// so dispatch only has to consult one map. We merge `options.handlers`
|
|
50
|
+
// into that slot without cloning the top-level map, so dynamic mutations
|
|
51
|
+
// to the caller's serviceHandlers reference (e.g. Server.addHandlers)
|
|
52
|
+
// still propagate to this transport.
|
|
53
|
+
if (options?.handlers) {
|
|
54
|
+
this._serviceHandlers[''] = {
|
|
55
|
+
...this._serviceHandlers[''],
|
|
56
|
+
...options.handlers
|
|
57
|
+
};
|
|
58
|
+
}
|
|
46
59
|
this.plugins = options?.plugins || [];
|
|
47
60
|
this.streamCleanupMode = options?.streamCleanupMode || 'kill';
|
|
48
61
|
}
|
|
@@ -80,10 +93,11 @@ export class SocketTransport {
|
|
|
80
93
|
return this.codecEngine.decode(data);
|
|
81
94
|
}
|
|
82
95
|
catch (err) {
|
|
83
|
-
|
|
84
|
-
|
|
96
|
+
const error = toError(err);
|
|
97
|
+
if (error.name === 'Error') {
|
|
98
|
+
error.name = 'InvalidMessageError';
|
|
85
99
|
}
|
|
86
|
-
this.onError(
|
|
100
|
+
this.onError(error);
|
|
87
101
|
return null;
|
|
88
102
|
}
|
|
89
103
|
}
|
|
@@ -117,7 +131,7 @@ export class SocketTransport {
|
|
|
117
131
|
}
|
|
118
132
|
}
|
|
119
133
|
catch (err) {
|
|
120
|
-
pluginError = err;
|
|
134
|
+
pluginError = toError(err);
|
|
121
135
|
}
|
|
122
136
|
// Check to see if it is a request or response packet.
|
|
123
137
|
if (isResponsePacket(curPacket)) {
|
|
@@ -156,7 +170,7 @@ export class SocketTransport {
|
|
|
156
170
|
cid: this._callIdGenerator(),
|
|
157
171
|
data: arg,
|
|
158
172
|
method: serviceMethod,
|
|
159
|
-
service
|
|
173
|
+
service: service
|
|
160
174
|
};
|
|
161
175
|
}
|
|
162
176
|
else {
|
|
@@ -165,7 +179,7 @@ export class SocketTransport {
|
|
|
165
179
|
callback: null,
|
|
166
180
|
cid: this._callIdGenerator(),
|
|
167
181
|
data: arg,
|
|
168
|
-
method: (
|
|
182
|
+
method: (typeof methodOptions === 'object') ? methodOptions.method : methodOptions
|
|
169
183
|
};
|
|
170
184
|
}
|
|
171
185
|
const callbackMap = this._callbackMap;
|
|
@@ -322,13 +336,14 @@ export class SocketTransport {
|
|
|
322
336
|
}
|
|
323
337
|
}
|
|
324
338
|
else {
|
|
325
|
-
const
|
|
339
|
+
const service = 'service' in packet ? packet.service : '';
|
|
340
|
+
const handler = this._serviceHandlers[service]?.[packet.method];
|
|
326
341
|
if (handler) {
|
|
327
342
|
wasHandled = true;
|
|
328
343
|
try {
|
|
329
344
|
const data = await handler(new RequestHandlerArgs({
|
|
330
345
|
isRpc: !!packet.cid,
|
|
331
|
-
method: packet.method
|
|
346
|
+
method: packet.method,
|
|
332
347
|
options: packet.data,
|
|
333
348
|
socket: this._socket,
|
|
334
349
|
timeoutMs: packet.ackTimeoutMs,
|
|
@@ -339,7 +354,7 @@ export class SocketTransport {
|
|
|
339
354
|
}
|
|
340
355
|
}
|
|
341
356
|
catch (err) {
|
|
342
|
-
error = err;
|
|
357
|
+
error = toError(err);
|
|
343
358
|
if (packet.cid) {
|
|
344
359
|
response = { error, rid: packet.cid, timeoutAt };
|
|
345
360
|
}
|
|
@@ -393,7 +408,7 @@ export class SocketTransport {
|
|
|
393
408
|
onTransmit(request) {
|
|
394
409
|
this.sendRequest([request]);
|
|
395
410
|
}
|
|
396
|
-
onUnhandledRequest(
|
|
411
|
+
onUnhandledRequest(_) {
|
|
397
412
|
return false;
|
|
398
413
|
}
|
|
399
414
|
resetPingTimeout(timeoutMs, code) {
|
|
@@ -456,8 +471,9 @@ export class SocketTransport {
|
|
|
456
471
|
});
|
|
457
472
|
}
|
|
458
473
|
catch (err) {
|
|
474
|
+
const error = toError(err);
|
|
459
475
|
for (const req of requests) {
|
|
460
|
-
abortRequest(req,
|
|
476
|
+
abortRequest(req, error);
|
|
461
477
|
}
|
|
462
478
|
}
|
|
463
479
|
return;
|
|
@@ -537,7 +553,7 @@ export class SocketTransport {
|
|
|
537
553
|
}
|
|
538
554
|
// If the socket is closed we need to call them back with an error.
|
|
539
555
|
if (this.status === 'closed') {
|
|
540
|
-
for (const
|
|
556
|
+
for (const _ of responses) {
|
|
541
557
|
this.onError(new Error(`WebSocket is not open: readyState 3 (CLOSED)`));
|
|
542
558
|
}
|
|
543
559
|
return;
|
package/dist/socket.d.ts
CHANGED
|
@@ -2,29 +2,42 @@ import { AsyncStreamEmitter } from '@socket-mesh/async-stream-emitter';
|
|
|
2
2
|
import { AuthToken, SignedAuthToken } from '@socket-mesh/auth';
|
|
3
3
|
import { CodecEngine } from '@socket-mesh/formatter';
|
|
4
4
|
import { DemuxedConsumableStream, StreamEvent } from '@socket-mesh/stream-demux';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
export interface SocketOptions<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object, TSocket extends Socket<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> = Socket<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>> {
|
|
5
|
+
import { FunctionReturnType, PrivateMethodMap, PublicMethodMap, ServiceMap, ServiceMethodName, ServiceName } from './maps/method-map.js';
|
|
6
|
+
import { AnyPlugin } from './plugins/plugin.js';
|
|
7
|
+
import { LooseHandlerMap } from './request-handler.js';
|
|
8
|
+
import { AuthenticateEvent, AuthStateChangeEvent, BadAuthTokenEvent, CloseEvent, ConnectEvent, ConnectingEvent, DeauthenticateEvent, DisconnectEvent, ErrorEvent, MessageEvent, PingEvent, PongEvent, RemoveAuthTokenEvent, RequestEvent, ResponseEvent, SocketEvent, TypedRequestEvent, TypedResponseEvent } from './socket-event.js';
|
|
9
|
+
import { BaseSocketTransport, CallIdGenerator, InvokeMethodOptions, InvokeServiceOptions } from './socket-transport.js';
|
|
10
|
+
export interface BaseSocketOptions<TState extends object = {}> {
|
|
12
11
|
ackTimeoutMs?: number;
|
|
13
12
|
callIdGenerator?: CallIdGenerator;
|
|
14
13
|
codecEngine?: CodecEngine;
|
|
15
|
-
handlers?:
|
|
14
|
+
handlers?: LooseHandlerMap;
|
|
16
15
|
isPingTimeoutDisabled?: boolean;
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
plugins?: AnyPlugin[];
|
|
17
|
+
serviceHandlers?: {
|
|
18
|
+
[service: string]: LooseHandlerMap;
|
|
19
|
+
};
|
|
19
20
|
state?: Partial<TState>;
|
|
20
21
|
streamCleanupMode?: StreamCleanupMode;
|
|
21
22
|
}
|
|
23
|
+
export type Socket<TIncoming extends PublicMethodMap = {}, TOutgoing extends PublicMethodMap = {}, TState extends object = {}, TService extends ServiceMap = {}, TPrivateIncoming extends PrivateMethodMap = {}, TPrivateOutgoing extends PrivateMethodMap = {}> = Omit<BaseSocket<TState>, 'invoke' | 'listen' | 'transmit'> & {
|
|
24
|
+
invoke<TMethod extends keyof TOutgoing & string>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TOutgoing[TMethod]>>;
|
|
25
|
+
invoke<TMethod extends keyof TOutgoing & string>(options: InvokeMethodOptions<TOutgoing, TMethod>, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TOutgoing[TMethod]>>;
|
|
26
|
+
invoke<TServiceName extends ServiceName<TService>, TMethod extends ServiceMethodName<TService, TServiceName>>(options: [TServiceName, TMethod, (false | number)?], arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<FunctionReturnType<TService[TServiceName][TMethod]>>;
|
|
27
|
+
invoke<TServiceName extends ServiceName<TService>, TMethod extends ServiceMethodName<TService, TServiceName>>(options: InvokeServiceOptions<TService, TServiceName, TMethod>, arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<FunctionReturnType<TService[TServiceName][TMethod]>>;
|
|
28
|
+
invoke<TMethod extends keyof TPrivateOutgoing & string>(method: TMethod, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TPrivateOutgoing[TMethod]>>;
|
|
29
|
+
listen(event: 'request'): DemuxedConsumableStream<TypedRequestEvent<TIncoming & TPrivateIncoming, TService>>;
|
|
30
|
+
listen(event: 'response'): DemuxedConsumableStream<TypedResponseEvent<TOutgoing, TPrivateOutgoing, TService>>;
|
|
31
|
+
transmit<TMethod extends keyof TOutgoing & string>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<void>;
|
|
32
|
+
transmit<TServiceName extends ServiceName<TService>, TMethod extends ServiceMethodName<TService, TServiceName>>(options: [TServiceName, TMethod], arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<void>;
|
|
33
|
+
transmit<TMethod extends keyof TPrivateOutgoing & string>(method: TMethod, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): Promise<void>;
|
|
34
|
+
};
|
|
22
35
|
export type SocketStatus = 'closed' | 'closing' | 'connecting' | 'ready';
|
|
23
36
|
export type StreamCleanupMode = 'close' | 'kill' | 'none';
|
|
24
|
-
export declare class
|
|
37
|
+
export declare class BaseSocket<TState extends object = {}> extends AsyncStreamEmitter<SocketEvent | undefined> {
|
|
25
38
|
private readonly _transport;
|
|
26
39
|
readonly state: Partial<TState>;
|
|
27
|
-
protected constructor(transport:
|
|
40
|
+
protected constructor(transport: BaseSocketTransport<TState>, options?: BaseSocketOptions<TState>);
|
|
28
41
|
get authToken(): AuthToken | null;
|
|
29
42
|
deauthenticate(): Promise<boolean>;
|
|
30
43
|
disconnect(code?: number, reason?: string): void;
|
|
@@ -43,17 +56,14 @@ export declare class Socket<TIncoming extends MethodMap, TOutgoing extends Publi
|
|
|
43
56
|
emit(event: 'ping', data: PingEvent): void;
|
|
44
57
|
emit(event: 'pong', data: PongEvent): void;
|
|
45
58
|
emit(event: 'removeAuthToken', data: RemoveAuthTokenEvent): void;
|
|
46
|
-
emit(event: 'request', data: RequestEvent
|
|
47
|
-
emit(event: 'response', data: ResponseEvent
|
|
59
|
+
emit(event: 'request', data: RequestEvent): void;
|
|
60
|
+
emit(event: 'response', data: ResponseEvent): void;
|
|
48
61
|
getBackpressure(): number;
|
|
49
62
|
getInboundBackpressure(): number;
|
|
50
63
|
getOutboundBackpressure(): number;
|
|
51
64
|
get id(): null | string;
|
|
52
|
-
invoke
|
|
53
|
-
|
|
54
|
-
invoke<TServiceName extends keyof TService, TMethod extends keyof TService[TServiceName]>(options: InvokeServiceOptions<TService, TServiceName, TMethod>, arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<FunctionReturnType<TService[TServiceName][TMethod]>>;
|
|
55
|
-
invoke<TMethod extends keyof TOutgoing>(options: InvokeMethodOptions<TOutgoing, TMethod>, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TOutgoing[TMethod]>>;
|
|
56
|
-
listen(): DemuxedConsumableStream<StreamEvent<SocketEvent<TIncoming, TOutgoing, TPrivateOutgoing, TService>>>;
|
|
65
|
+
invoke(methodOptions: [string, string, (false | number)?] | InvokeMethodOptions | InvokeServiceOptions | string, arg?: unknown): Promise<unknown>;
|
|
66
|
+
listen(): DemuxedConsumableStream<StreamEvent<SocketEvent>>;
|
|
57
67
|
listen(event: 'authStateChange'): DemuxedConsumableStream<AuthStateChangeEvent>;
|
|
58
68
|
listen(event: 'authenticate'): DemuxedConsumableStream<AuthenticateEvent>;
|
|
59
69
|
listen(event: 'badAuthToken'): DemuxedConsumableStream<BadAuthTokenEvent>;
|
|
@@ -61,7 +71,7 @@ export declare class Socket<TIncoming extends MethodMap, TOutgoing extends Publi
|
|
|
61
71
|
listen(event: 'connect'): DemuxedConsumableStream<ConnectEvent>;
|
|
62
72
|
listen(event: 'connectAbort'): DemuxedConsumableStream<DisconnectEvent>;
|
|
63
73
|
listen(event: 'connecting'): DemuxedConsumableStream<ConnectingEvent>;
|
|
64
|
-
listen(event: 'deauthenticate'): DemuxedConsumableStream<
|
|
74
|
+
listen(event: 'deauthenticate'): DemuxedConsumableStream<DeauthenticateEvent>;
|
|
65
75
|
listen(event: 'disconnect'): DemuxedConsumableStream<DisconnectEvent>;
|
|
66
76
|
listen(event: 'end'): DemuxedConsumableStream<void>;
|
|
67
77
|
listen(event: 'error'): DemuxedConsumableStream<ErrorEvent>;
|
|
@@ -69,12 +79,11 @@ export declare class Socket<TIncoming extends MethodMap, TOutgoing extends Publi
|
|
|
69
79
|
listen(event: 'ping'): DemuxedConsumableStream<PingEvent>;
|
|
70
80
|
listen(event: 'pong'): DemuxedConsumableStream<PongEvent>;
|
|
71
81
|
listen(event: 'removeAuthToken'): DemuxedConsumableStream<RemoveAuthTokenEvent>;
|
|
72
|
-
listen(event: 'request'): DemuxedConsumableStream<RequestEvent
|
|
73
|
-
listen(event: 'response'): DemuxedConsumableStream<ResponseEvent
|
|
74
|
-
listen<U extends SocketEvent
|
|
82
|
+
listen(event: 'request'): DemuxedConsumableStream<RequestEvent>;
|
|
83
|
+
listen(event: 'response'): DemuxedConsumableStream<ResponseEvent>;
|
|
84
|
+
listen<U extends SocketEvent, V = U>(event: string): DemuxedConsumableStream<V>;
|
|
75
85
|
get signedAuthToken(): null | SignedAuthToken;
|
|
76
86
|
get status(): SocketStatus;
|
|
77
|
-
transmit
|
|
78
|
-
transmit<TServiceName extends keyof TService, TMethod extends keyof TService[TServiceName]>(options: [TServiceName, TMethod], arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<void>;
|
|
87
|
+
transmit(serviceAndMethod: [string, string] | string, arg?: unknown): Promise<void>;
|
|
79
88
|
get url(): string;
|
|
80
89
|
}
|
package/dist/socket.js
CHANGED
package/dist/utils.d.ts
CHANGED
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export function toArray(arr) {
|
|
2
2
|
return Array.isArray(arr) ? arr : [arr];
|
|
3
3
|
}
|
|
4
|
+
export function toError(err) {
|
|
5
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
6
|
+
}
|
|
4
7
|
export function wait(duration) {
|
|
5
8
|
return new Promise((resolve) => {
|
|
6
9
|
setTimeout(() => {
|