@socket-mesh/core 1.0.4 → 2.0.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,27 +1,39 @@
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;
@@ -38,9 +50,9 @@ export declare class SocketTransport<TIncoming extends MethodMap, TOutgoing exte
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,8 +6,8 @@ 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;
@@ -28,8 +28,10 @@ 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++;
@@ -80,10 +82,11 @@ export class SocketTransport {
80
82
  return this.codecEngine.decode(data);
81
83
  }
82
84
  catch (err) {
83
- if (err.name === 'Error') {
84
- err.name = 'InvalidMessageError';
85
+ const error = toError(err);
86
+ if (error.name === 'Error') {
87
+ error.name = 'InvalidMessageError';
85
88
  }
86
- this.onError(err);
89
+ this.onError(error);
87
90
  return null;
88
91
  }
89
92
  }
@@ -117,7 +120,7 @@ export class SocketTransport {
117
120
  }
118
121
  }
119
122
  catch (err) {
120
- pluginError = err;
123
+ pluginError = toError(err);
121
124
  }
122
125
  // Check to see if it is a request or response packet.
123
126
  if (isResponsePacket(curPacket)) {
@@ -156,7 +159,7 @@ export class SocketTransport {
156
159
  cid: this._callIdGenerator(),
157
160
  data: arg,
158
161
  method: serviceMethod,
159
- service
162
+ service: service
160
163
  };
161
164
  }
162
165
  else {
@@ -165,7 +168,7 @@ export class SocketTransport {
165
168
  callback: null,
166
169
  cid: this._callIdGenerator(),
167
170
  data: arg,
168
- method: ((typeof methodOptions === 'object') ? methodOptions.method : methodOptions)
171
+ method: (typeof methodOptions === 'object') ? methodOptions.method : methodOptions
169
172
  };
170
173
  }
171
174
  const callbackMap = this._callbackMap;
@@ -328,7 +331,7 @@ export class SocketTransport {
328
331
  try {
329
332
  const data = await handler(new RequestHandlerArgs({
330
333
  isRpc: !!packet.cid,
331
- method: packet.method.toString(),
334
+ method: packet.method,
332
335
  options: packet.data,
333
336
  socket: this._socket,
334
337
  timeoutMs: packet.ackTimeoutMs,
@@ -339,7 +342,7 @@ export class SocketTransport {
339
342
  }
340
343
  }
341
344
  catch (err) {
342
- error = err;
345
+ error = toError(err);
343
346
  if (packet.cid) {
344
347
  response = { error, rid: packet.cid, timeoutAt };
345
348
  }
@@ -393,7 +396,7 @@ export class SocketTransport {
393
396
  onTransmit(request) {
394
397
  this.sendRequest([request]);
395
398
  }
396
- onUnhandledRequest(packet) {
399
+ onUnhandledRequest(_) {
397
400
  return false;
398
401
  }
399
402
  resetPingTimeout(timeoutMs, code) {
@@ -456,8 +459,9 @@ export class SocketTransport {
456
459
  });
457
460
  }
458
461
  catch (err) {
462
+ const error = toError(err);
459
463
  for (const req of requests) {
460
- abortRequest(req, err);
464
+ abortRequest(req, error);
461
465
  }
462
466
  }
463
467
  return;
@@ -537,7 +541,7 @@ export class SocketTransport {
537
541
  }
538
542
  // If the socket is closed we need to call them back with an error.
539
543
  if (this.status === 'closed') {
540
- for (const response of responses) {
544
+ for (const _ of responses) {
541
545
  this.onError(new Error(`WebSocket is not open: readyState 3 (CLOSED)`));
542
546
  }
543
547
  return;
package/dist/socket.d.ts CHANGED
@@ -2,29 +2,39 @@ 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[];
19
17
  state?: Partial<TState>;
20
18
  streamCleanupMode?: StreamCleanupMode;
21
19
  }
20
+ 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'> & {
21
+ invoke<TMethod extends keyof TOutgoing & string>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TOutgoing[TMethod]>>;
22
+ invoke<TMethod extends keyof TOutgoing & string>(options: InvokeMethodOptions<TOutgoing, TMethod>, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TOutgoing[TMethod]>>;
23
+ 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]>>;
24
+ 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]>>;
25
+ invoke<TMethod extends keyof TPrivateOutgoing & string>(method: TMethod, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): Promise<FunctionReturnType<TPrivateOutgoing[TMethod]>>;
26
+ listen(event: 'request'): DemuxedConsumableStream<TypedRequestEvent<TIncoming & TPrivateIncoming, TService>>;
27
+ listen(event: 'response'): DemuxedConsumableStream<TypedResponseEvent<TOutgoing, TPrivateOutgoing, TService>>;
28
+ transmit<TMethod extends keyof TOutgoing & string>(method: TMethod, arg?: Parameters<TOutgoing[TMethod]>[0]): Promise<void>;
29
+ transmit<TServiceName extends ServiceName<TService>, TMethod extends ServiceMethodName<TService, TServiceName>>(options: [TServiceName, TMethod], arg?: Parameters<TService[TServiceName][TMethod]>[0]): Promise<void>;
30
+ transmit<TMethod extends keyof TPrivateOutgoing & string>(method: TMethod, arg?: Parameters<TPrivateOutgoing[TMethod]>[0]): Promise<void>;
31
+ };
22
32
  export type SocketStatus = 'closed' | 'closing' | 'connecting' | 'ready';
23
33
  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> {
34
+ export declare class BaseSocket<TState extends object = {}> extends AsyncStreamEmitter<SocketEvent | undefined> {
25
35
  private readonly _transport;
26
36
  readonly state: Partial<TState>;
27
- protected constructor(transport: SocketTransport<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>, options?: SocketOptions<TIncoming, TOutgoing, TPrivateOutgoing, TService, TState>);
37
+ protected constructor(transport: BaseSocketTransport<TState>, options?: BaseSocketOptions<TState>);
28
38
  get authToken(): AuthToken | null;
29
39
  deauthenticate(): Promise<boolean>;
30
40
  disconnect(code?: number, reason?: string): void;
@@ -43,17 +53,14 @@ export declare class Socket<TIncoming extends MethodMap, TOutgoing extends Publi
43
53
  emit(event: 'ping', data: PingEvent): void;
44
54
  emit(event: 'pong', data: PongEvent): void;
45
55
  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;
56
+ emit(event: 'request', data: RequestEvent): void;
57
+ emit(event: 'response', data: ResponseEvent): void;
48
58
  getBackpressure(): number;
49
59
  getInboundBackpressure(): number;
50
60
  getOutboundBackpressure(): number;
51
61
  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>>>;
62
+ invoke(methodOptions: [string, string, (false | number)?] | InvokeMethodOptions | InvokeServiceOptions | string, arg?: unknown): Promise<unknown>;
63
+ listen(): DemuxedConsumableStream<StreamEvent<SocketEvent>>;
57
64
  listen(event: 'authStateChange'): DemuxedConsumableStream<AuthStateChangeEvent>;
58
65
  listen(event: 'authenticate'): DemuxedConsumableStream<AuthenticateEvent>;
59
66
  listen(event: 'badAuthToken'): DemuxedConsumableStream<BadAuthTokenEvent>;
@@ -61,7 +68,7 @@ export declare class Socket<TIncoming extends MethodMap, TOutgoing extends Publi
61
68
  listen(event: 'connect'): DemuxedConsumableStream<ConnectEvent>;
62
69
  listen(event: 'connectAbort'): DemuxedConsumableStream<DisconnectEvent>;
63
70
  listen(event: 'connecting'): DemuxedConsumableStream<ConnectingEvent>;
64
- listen(event: 'deauthenticate'): DemuxedConsumableStream<AuthenticateEvent>;
71
+ listen(event: 'deauthenticate'): DemuxedConsumableStream<DeauthenticateEvent>;
65
72
  listen(event: 'disconnect'): DemuxedConsumableStream<DisconnectEvent>;
66
73
  listen(event: 'end'): DemuxedConsumableStream<void>;
67
74
  listen(event: 'error'): DemuxedConsumableStream<ErrorEvent>;
@@ -69,12 +76,11 @@ export declare class Socket<TIncoming extends MethodMap, TOutgoing extends Publi
69
76
  listen(event: 'ping'): DemuxedConsumableStream<PingEvent>;
70
77
  listen(event: 'pong'): DemuxedConsumableStream<PongEvent>;
71
78
  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>;
79
+ listen(event: 'request'): DemuxedConsumableStream<RequestEvent>;
80
+ listen(event: 'response'): DemuxedConsumableStream<ResponseEvent>;
81
+ listen<U extends SocketEvent, V = U>(event: string): DemuxedConsumableStream<V>;
75
82
  get signedAuthToken(): null | SignedAuthToken;
76
83
  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>;
84
+ transmit(serviceAndMethod: [string, string] | string, arg?: unknown): Promise<void>;
79
85
  get url(): string;
80
86
  }
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.0.0",
4
4
  "description": "Core module for SocketMesh Server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",