@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.
@@ -1,5 +1,7 @@
1
1
  import { RequestHandler } from '../request-handler.js';
2
- import { MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './method-map.js';
3
- export type HandlerMap<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> = Partial<{
4
- [K in keyof TIncoming]: RequestHandler<Parameters<TIncoming[K]>[0], ReturnType<TIncoming[K]>, TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>;
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<TIncoming extends MethodMap, TService extends ServiceMap> = MethodPacket<TIncoming> | ServicePacket<TService>;
3
- export type MethodPacket<TMethodMap extends MethodMap> = {
4
- [TMethod in keyof TMethodMap]: MethodRequestPacket<TMethodMap, TMethod>;
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 MethodRequestPacket<TMethodMap extends MethodMap, TMethod extends keyof TMethodMap> extends RequestPacket {
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
- interface RequestPacket {
12
- cid?: number;
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]]: ServiceRequestPacket<TServiceMap, TService, TMethod>;
14
+ [TMethod in keyof TServiceMap[TService]]: IncomingServiceRequestPacket<TServiceMap, TService, TMethod>;
17
15
  }[keyof TServiceMap[TService]];
18
16
  }[keyof TServiceMap];
19
- export interface ServiceRequestPacket<TServiceMap extends ServiceMap, TService extends keyof TServiceMap, TMethod extends keyof TServiceMap[TService]> extends RequestPacket {
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 declare function isRequestPacket<TIncoming extends MethodMap, TService extends ServiceMap>(packet: unknown): packet is AnyPacket<TIncoming, TService>;
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 {};
@@ -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 { SocketTransport } from '../socket-transport.js';
8
- import { Socket, SocketStatus } from '../socket.js';
9
- export interface DisconnectedPluginArgs<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> extends PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> {
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<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> extends PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> {
15
- packet: AnyPacket<TIncoming, TService> | AnyResponse<TOutgoing, TPrivateOutgoing, TService>;
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<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> extends PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> {
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<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> {
24
- handlers?: HandlerMap<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>;
25
- onAuthenticated?(options: PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
26
- onClose?(options: PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
27
- onDeauthenticate?(options: PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
28
- onDisconnected?(options: DisconnectedPluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
29
- onEnd?(options: PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
30
- onMessage?(options: MessagePluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): Promise<AnyPacket<TIncoming, TService> | AnyResponse<TOutgoing, TPrivateOutgoing, TService>>;
31
- onMessageRaw?(options: MessageRawPluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): Promise<string | ws.RawData>;
32
- onOpen?(options: PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
33
- onReady?(options: PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
34
- sendRequest?(options: SendRequestPluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
35
- sendResponse?(options: SendResponsePluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>): void;
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<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> {
39
- socket: Socket<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>;
40
- transport: SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>;
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<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> extends PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> {
44
- cont: (requests: AnyRequest<TOutgoing, TPrivateOutgoing, TService>[]) => void;
45
- requests: AnyRequest<TOutgoing, TPrivateOutgoing, TService>[];
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<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> extends PluginArgs<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> {
48
- cont: (requests: AnyResponse<TOutgoing, TPrivateOutgoing, TService>[]) => void;
49
- responses: AnyResponse<TOutgoing, TPrivateOutgoing, TService>[];
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 { MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './maps/method-map.js';
2
- import { SocketTransport } from './socket-transport.js';
3
- import { Socket } from './socket.js';
4
- export type RequestHandler<TOptions, U, 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>, TTransport extends SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> = SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>> = (args: RequestHandlerArgs<TOptions, TIncoming, TOutgoing, TPrivateOutgoing, TService, TState, TSocket, TTransport>) => Promise<U>;
5
- export interface RequestHandlerArgsOptions<TOptions, 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>, TTransport extends SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> = SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>> {
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, 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>, TTransport extends SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState> = SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>> {
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, TIncoming, TOutgoing, TPrivateOutgoing, TService, TState, TSocket, TTransport>);
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
- import { MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './maps/method-map.js';
2
- export type AnyRequest<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap> = MethodRequest<TOutgoing> | MethodRequest<TPrivateOutgoing> | ServiceRequest<TService>;
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?: TMethodMap[TMethod]) => void) | null;
4
+ callback: ((err: Error | null, result?: unknown) => void) | null;
6
5
  cid: number;
7
6
  timeoutId?: NodeJS.Timeout;
8
7
  }
9
- export interface InvokeServiceRequest<TServiceMap extends ServiceMap, TService extends keyof TServiceMap, TMethod extends keyof TServiceMap[TService]> extends TransmitServiceRequest<TServiceMap, TService, TMethod> {
8
+ export interface InvokeServiceRequest extends TransmitServiceRequest {
10
9
  ackTimeoutMs: false | number;
11
- callback: ((err: Error | null, result?: TServiceMap[TService][TMethod]) => void) | null;
10
+ callback: ((err: Error | null, result?: unknown) => void) | null;
12
11
  cid: number;
13
12
  timeoutId?: NodeJS.Timeout;
14
13
  }
15
- export type MethodRequest<TMethodMap extends MethodMap> = {
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<TServiceMap extends ServiceMap> = {
23
- [TService in keyof TServiceMap]: {
24
- [TMethod in keyof TServiceMap[TService]]: InvokeServiceRequest<TServiceMap, TService, TMethod> | TransmitServiceRequest<TServiceMap, TService, TMethod>;
25
- }[keyof TServiceMap[TService]];
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<TServiceMap extends ServiceMap, TService extends keyof TServiceMap, TMethod extends keyof TServiceMap[TService]> extends Request {
32
- data?: Parameters<TServiceMap[TService][TMethod]>[0];
33
- method: TMethod;
34
- service: TService;
24
+ export interface TransmitServiceRequest extends Request {
25
+ data?: unknown;
26
+ method: string;
27
+ service: string;
35
28
  }
36
- export declare function abortRequest<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap>(request: AnyRequest<TOutgoing, TPrivateOutgoing, TService>, err: Error): void;
37
- export declare function isRequestDone<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap>(request: AnyRequest<TOutgoing, TPrivateOutgoing, TService>): boolean;
38
- export declare class RequestCollection<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap> {
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<TOutgoing, TPrivateOutgoing, TService> | AnyRequest<TOutgoing, TPrivateOutgoing, TService>[]);
34
+ constructor(requests: AnyRequest | AnyRequest[]);
42
35
  isDone(): boolean;
43
- get items(): ReadonlyArray<AnyRequest<TOutgoing, TPrivateOutgoing, TService>>;
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<TOutgoing, TPrivateOutgoing, TService> | undefined;
41
+ value: AnyRequest | undefined;
49
42
  } | {
50
43
  done: boolean;
51
44
  value?: undefined;
@@ -1,21 +1,25 @@
1
1
  import { MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './maps/method-map.js';
2
- export type AnyResponse<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap> = ErrorResponse | MethodDataResponse<TOutgoing> | MethodDataResponse<TPrivateOutgoing> | Response | ServiceDataResponse<TService>;
3
- export interface DataResponse<T> extends Response {
4
- data: T;
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 type MethodDataResponse<TMethodMap extends MethodMap> = {
10
- [TMethod in keyof TMethodMap]: DataResponse<ReturnType<TMethodMap[TMethod]>>;
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 type ServiceDataResponse<TServiceMap extends ServiceMap> = {
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;
@@ -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 { MethodPacket, ServicePacket } from './packet.js';
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<TIncoming extends MethodMap, TService extends ServiceMap> {
58
- request: MethodPacket<TIncoming> | ServicePacket<TService>;
57
+ export interface RequestEvent {
58
+ request: AnyPacket;
59
59
  }
60
- export interface ResponseEvent<TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap> {
61
- response: AnyResponse<TOutgoing, TPrivateOutgoing, TService>;
60
+ export interface ResponseEvent {
61
+ response: AnyResponse;
62
62
  }
63
- export type SocketEvent<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 | RequestEvent<TIncoming, TService> | ResponseEvent<TOutgoing, TPrivateOutgoing, TService>;
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 { Plugin } from './plugins/plugin.js';
7
- import { AnyRequest, InvokeMethodRequest, InvokeServiceRequest, TransmitMethodRequest, TransmitServiceRequest } from './request.js';
6
+ import { AnyPlugin } from './plugins/plugin.js';
7
+ import { AnyRequest } from './request.js';
8
8
  import { AnyResponse } from './response.js';
9
- import { Socket, SocketOptions, SocketStatus, StreamCleanupMode } from './socket.js';
9
+ import { BaseSocket, BaseSocketOptions, Socket, SocketStatus, StreamCleanupMode } from './socket.js';
10
10
  export type CallIdGenerator = () => number;
11
- export interface InboundMessage<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap> {
12
- packet: (AnyPacket<TIncoming, TService> | AnyResponse<TOutgoing, TPrivateOutgoing, TService>)[] | (AnyPacket<TIncoming, TService> | AnyResponse<TOutgoing, TPrivateOutgoing, TService>) | null;
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 declare class SocketTransport<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> {
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: Plugin<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>[];
53
+ readonly plugins: AnyPlugin[];
42
54
  streamCleanupMode: StreamCleanupMode;
43
- protected constructor(options?: SocketOptions<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>);
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<TIncoming, TOutgoing, TPrivateOutgoing, TService>): Promise<void>;
53
- invoke<TMethod extends keyof TOutgoing>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): [Promise<FunctionReturnType<TOutgoing[TMethod]>>, () => void];
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<TServiceName extends keyof TService, TServiceMethod extends keyof TService[TServiceName], TMethod extends keyof TOutgoing, TPrivateMethod extends keyof TPrivateOutgoing>(request: InvokeMethodRequest<TOutgoing, TMethod> | InvokeMethodRequest<TPrivateOutgoing, TPrivateMethod> | InvokeServiceRequest<TService, TServiceName, TServiceMethod>): void;
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<TIncoming, TService>, timestamp: Date, pluginError?: Error): Promise<boolean>;
67
- protected onResponse(response: AnyResponse<TOutgoing, TPrivateOutgoing, TService>, pluginError?: Error): void;
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<TServiceName extends keyof TService, TServiceMethod extends keyof TService[TServiceName], TMethod extends keyof TOutgoing>(request: TransmitMethodRequest<TOutgoing, TMethod> | TransmitServiceRequest<TService, TServiceName, TServiceMethod>): void;
72
- protected onUnhandledRequest(packet: AnyPacket<TIncoming, TService>): boolean;
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: (AnyRequest<TOutgoing, TPrivateOutgoing, TService>)[]): void;
76
- protected sendRequest(index: number, requests: (AnyRequest<TOutgoing, TPrivateOutgoing, TService>)[]): void;
77
- protected sendResponse(responses: (AnyResponse<TOutgoing, TPrivateOutgoing, TService>)[]): void;
78
- protected sendResponse(index: number, responses: (AnyResponse<TOutgoing, TPrivateOutgoing, TService>)[]): void;
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(): Socket<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>;
83
- set socket(value: Socket<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>);
89
+ get socket(): BaseSocket<TState>;
90
+ set socket(value: BaseSocket<TState>);
84
91
  get status(): SocketStatus;
85
- transmit<TMethod extends keyof TOutgoing>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<void>;
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;
@@ -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 SocketTransport {
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
- if (err.name === 'Error') {
84
- err.name = 'InvalidMessageError';
96
+ const error = toError(err);
97
+ if (error.name === 'Error') {
98
+ error.name = 'InvalidMessageError';
85
99
  }
86
- this.onError(err);
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: ((typeof methodOptions === 'object') ? methodOptions.method : methodOptions)
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 handler = this._handlers[packet.method];
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.toString(),
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(packet) {
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, err);
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 response of responses) {
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 { HandlerMap } from './maps/handler-map.js';
6
- import { FunctionReturnType, MethodMap, PrivateMethodMap, PublicMethodMap, ServiceMap } from './maps/method-map.js';
7
- import { AnyPacket } from './packet.js';
8
- import { Plugin } from './plugins/plugin.js';
9
- import { AuthenticateEvent, AuthStateChangeEvent, BadAuthTokenEvent, CloseEvent, ConnectEvent, ConnectingEvent, DeauthenticateEvent, DisconnectEvent, ErrorEvent, MessageEvent, PingEvent, PongEvent, RemoveAuthTokenEvent, RequestEvent, ResponseEvent, SocketEvent } from './socket-event.js';
10
- import { CallIdGenerator, InvokeMethodOptions, InvokeServiceOptions, SocketTransport } from './socket-transport.js';
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?: HandlerMap<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>;
14
+ handlers?: LooseHandlerMap;
16
15
  isPingTimeoutDisabled?: boolean;
17
- onUnhandledRequest?: (socket: TSocket, packet: AnyPacket<TIncoming, TService>) => boolean;
18
- plugins?: Plugin<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>[];
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 Socket<TIncoming extends MethodMap, TOutgoing extends PublicMethodMap, TPrivateOutgoing extends PrivateMethodMap, TService extends ServiceMap, TState extends object> extends AsyncStreamEmitter<SocketEvent<TIncoming, TOutgoing, TPrivateOutgoing, TService> | undefined> {
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: SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>, options?: SocketOptions<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>);
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<TIncoming, TService>): void;
47
- emit(event: 'response', data: ResponseEvent<TOutgoing, TPrivateOutgoing, TService>): void;
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<TMethod extends keyof TOutgoing>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TOutgoing[TMethod]>>;
53
- 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]>>;
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<AuthenticateEvent>;
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<TIncoming, TService>>;
73
- listen(event: 'response'): DemuxedConsumableStream<ResponseEvent<TOutgoing, TPrivateOutgoing, TService>>;
74
- listen<U extends SocketEvent<TIncoming, TOutgoing, TPrivateOutgoing, TService>, V = U>(event: string): DemuxedConsumableStream<V>;
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<TMethod extends keyof TOutgoing>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<void>;
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
@@ -1,5 +1,5 @@
1
1
  import { AsyncStreamEmitter } from '@socket-mesh/async-stream-emitter';
2
- export class Socket extends AsyncStreamEmitter {
2
+ export class BaseSocket extends AsyncStreamEmitter {
3
3
  _transport;
4
4
  state;
5
5
  constructor(transport, options) {
package/dist/utils.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export declare function toArray<T>(arr: T | T[]): T[];
2
+ export declare function toError(err: unknown): Error;
2
3
  export declare function wait(duration: number): Promise<void>;
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(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@socket-mesh/core",
3
- "version": "1.0.4",
3
+ "version": "2.1.0",
4
4
  "description": "Core module for SocketMesh Server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",