@socket-mesh/server 17.3.5 → 17.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/action.d.ts CHANGED
@@ -5,8 +5,8 @@ import { AuthState, AuthToken, SignedAuthToken } from "@socket-mesh/auth";
5
5
  import { IncomingMessage } from 'http';
6
6
  import { DataPacket } from "@socket-mesh/simple-broker";
7
7
  import { ChannelOptions } from "@socket-mesh/channel";
8
- import { Request } from "@socket-mesh/request";
9
8
  import { ServerSocket } from "./serversocket";
9
+ import { HandshakeRequest } from "./request";
10
10
  export declare enum ActionType {
11
11
  HANDSHAKE_WS = "handshakeWS",
12
12
  HANDSHAKE_SC = "handshakeSC",
@@ -32,11 +32,12 @@ export declare abstract class Action<T, U extends ActionType = ActionType> {
32
32
  private _resolve;
33
33
  private _reject;
34
34
  constructor(type: U);
35
- allow(packet?: ActionResult<T>): void;
36
- block(error: Error): void;
35
+ allow: (packet?: ActionResult<T>) => void;
36
+ block: (error: Error) => void;
37
37
  }
38
38
  export type MiddlewareAction<T> = ActionTransmit<T> | ActionInvoke<T> | ActionPublishIn<T> | ActionPublishOut<T> | ActionSubscribe<T> | ActionHandshakeSC<T> | ActionHandshakeWS | ActionAuthenticate<T> | ActionMessage<T>;
39
39
  export type InboundAction<T> = ActionAuthenticate<T> | ActionTransmit<T> | ActionInvoke<T> | ActionPublishIn<T> | ActionSubscribe<T>;
40
+ export type HandshakeAction<T> = ActionHandshakeSC<T> | ActionHandshakeWS;
40
41
  export declare class ActionHandshakeWS extends Action<undefined, ActionType.HANDSHAKE_WS> {
41
42
  constructor(request: IncomingMessage);
42
43
  request: IncomingMessage;
@@ -53,12 +54,8 @@ export type AuthInfo = {
53
54
  authState: AuthState;
54
55
  };
55
56
  export declare class ActionHandshakeSC<T> extends Action<AuthInfo, ActionType.HANDSHAKE_SC> {
56
- constructor(socket: ServerSocket<T>, request: Request<{
57
- authToken: string;
58
- }>, data: AuthInfo);
59
- request: Request<{
60
- authToken: string;
61
- }>;
57
+ constructor(socket: ServerSocket<T>, request: HandshakeRequest, data: AuthInfo);
58
+ request: HandshakeRequest;
62
59
  socket: ServerSocket<T>;
63
60
  data: AuthInfo;
64
61
  }
@@ -85,7 +82,7 @@ export declare class ActionSubscribe<T> extends Action<ChannelOptions, ActionTyp
85
82
  constructor(socket: ServerSocket<T>, packet?: DataPacket<ChannelOptions>);
86
83
  socket: ServerSocket<T>;
87
84
  authTokenExpiredError?: AuthTokenExpiredError;
88
- channel?: string;
85
+ channel: string;
89
86
  data?: ChannelOptions;
90
87
  }
91
88
  export declare class ActionPublishIn<T> extends Action<T, ActionType.PUBLISH_IN> {
package/action.js CHANGED
@@ -13,6 +13,20 @@ export var ActionType;
13
13
  })(ActionType || (ActionType = {}));
14
14
  export class Action {
15
15
  constructor(type) {
16
+ this.allow = (packet) => {
17
+ if (this.outcome) {
18
+ throw new InvalidActionError(`Action ${this.type} has already been ${this.outcome}; cannot allow`);
19
+ }
20
+ this.outcome = 'allowed';
21
+ this._resolve(packet);
22
+ };
23
+ this.block = (error) => {
24
+ if (this.outcome) {
25
+ throw new InvalidActionError(`Action ${this.type} has already been ${this.outcome}; cannot block`);
26
+ }
27
+ this.outcome = 'blocked';
28
+ this._reject(error);
29
+ };
16
30
  this.type = type;
17
31
  this.outcome = null;
18
32
  this.promise = new Promise((resolve, reject) => {
@@ -20,20 +34,6 @@ export class Action {
20
34
  this._reject = reject;
21
35
  });
22
36
  }
23
- allow(packet) {
24
- if (this.outcome) {
25
- throw new InvalidActionError(`Action ${this.type} has already been ${this.outcome}; cannot allow`);
26
- }
27
- this.outcome = 'allowed';
28
- this._resolve(packet);
29
- }
30
- block(error) {
31
- if (this.outcome) {
32
- throw new InvalidActionError(`Action ${this.type} has already been ${this.outcome}; cannot block`);
33
- }
34
- this.outcome = 'blocked';
35
- this._reject(error);
36
- }
37
37
  }
38
38
  export class ActionHandshakeWS extends Action {
39
39
  constructor(request) {
@@ -0,0 +1,13 @@
1
+ /// <reference types="node" />
2
+ import jwt from 'jsonwebtoken';
3
+ import { ServerSocket } from './serversocket';
4
+ export interface AuthTokenOptions extends jwt.SignOptions {
5
+ rejectOnFailedDelivery?: boolean;
6
+ }
7
+ export interface VerifyOptions<T> extends jwt.VerifyOptions {
8
+ socket: ServerSocket<T>;
9
+ }
10
+ export declare class AuthEngine<T> {
11
+ verifyToken(signedToken: string, key: jwt.Secret | jwt.GetPublicKeyOrSecret, options: VerifyOptions<T>): Promise<jwt.JwtPayload>;
12
+ signToken(token: string | object | Buffer, key: jwt.Secret, options: jwt.SignOptions): Promise<string>;
13
+ }
package/auth-engine.js ADDED
@@ -0,0 +1,32 @@
1
+ import jwt from 'jsonwebtoken';
2
+ import { InvalidArgumentsError } from '@socket-mesh/errors';
3
+ export class AuthEngine {
4
+ verifyToken(signedToken, key, options) {
5
+ const jwtOptions = Object.assign({}, options || {});
6
+ if (typeof signedToken === 'string' || signedToken == null) {
7
+ return new Promise((resolve, reject) => {
8
+ const cb = (err, token) => {
9
+ if (err) {
10
+ reject(err);
11
+ return;
12
+ }
13
+ resolve(token);
14
+ };
15
+ jwt.verify(signedToken || '', key, jwtOptions, cb);
16
+ });
17
+ }
18
+ return Promise.reject(new InvalidArgumentsError('Invalid token format - Token must be a string'));
19
+ }
20
+ signToken(token, key, options) {
21
+ const jwtOptions = Object.assign({}, options || {});
22
+ return new Promise((resolve, reject) => {
23
+ jwt.sign(token, key, jwtOptions, (err, signedToken) => {
24
+ if (err) {
25
+ reject(err);
26
+ return;
27
+ }
28
+ resolve(signedToken);
29
+ });
30
+ });
31
+ }
32
+ }
package/events.d.ts CHANGED
@@ -6,16 +6,16 @@ export type RawMessage = {
6
6
  message: string | ArrayBuffer | Buffer[];
7
7
  };
8
8
  export interface AuthStateChanged extends AuthStateChange {
9
- authToken?: AuthToken | null;
9
+ authToken?: AuthToken;
10
10
  }
11
11
  export interface AuthTokenSigned {
12
12
  signedAuthToken: SignedAuthToken;
13
13
  }
14
14
  export interface Authenticated {
15
- authToken?: AuthToken | null;
15
+ authToken: AuthToken;
16
16
  }
17
17
  export interface Deauthenticated {
18
- oldAuthToken?: AuthToken | null;
18
+ oldAuthToken: AuthToken;
19
19
  }
20
20
  export interface BadAuthToken {
21
21
  authError: Error;
@@ -1,7 +1,7 @@
1
1
  import { WritableConsumableStream } from "@socket-mesh/writable-consumable-stream";
2
2
  import { MiddlewareType } from "./middleware-type";
3
- import { Action } from "./action";
4
- export declare class MiddlewareStream<T> extends WritableConsumableStream<Action<T>> {
3
+ import { Action, ActionType } from "./action";
4
+ export declare class MiddlewareStream<T extends Action<any, ActionType>> extends WritableConsumableStream<T> {
5
5
  readonly type: MiddlewareType;
6
6
  constructor(type: MiddlewareType);
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@socket-mesh/server",
3
- "version": "17.3.5",
3
+ "version": "17.3.7",
4
4
  "description": "Server module for SocketMesh",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -9,23 +9,23 @@
9
9
  "url": "git://github.com/socket-mesh/server.git"
10
10
  },
11
11
  "dependencies": {
12
- "@socket-mesh/async-stream-emitter": "^4.2.4",
12
+ "@socket-mesh/async-stream-emitter": "^4.2.7",
13
13
  "@socket-mesh/consumable-stream": "3.2.0",
14
14
  "@socket-mesh/auth": "^2.1.5",
15
15
  "@socket-mesh/errors": "^3.0.4",
16
16
  "@socket-mesh/formatter": "^4.0.3",
17
- "@socket-mesh/request": "^2.0.3",
18
- "@socket-mesh/server-auth": "^0.0.3",
19
- "@socket-mesh/simple-broker": "^5.1.5",
20
- "@socket-mesh/stream-demux": "^9.0.5",
17
+ "@socket-mesh/request": "^2.0.6",
18
+ "@socket-mesh/simple-broker": "^5.1.6",
19
+ "@socket-mesh/stream-demux": "^9.0.7",
21
20
  "@socket-mesh/writable-consumable-stream": "^4.2.0",
22
- "@socket-mesh/channel": "6.0.15",
21
+ "@socket-mesh/channel": "6.0.18",
23
22
  "base64id": "^2.0.0",
24
23
  "clone-deep": "^4.0.1",
25
24
  "jsonwebtoken": "^9.0.0",
26
25
  "ws": "^8.13.0"
27
26
  },
28
27
  "devDependencies": {
28
+ "@socket-mesh/client": "^17.1.4",
29
29
  "@socket-mesh/local-storage": "^1.0.0",
30
30
  "@types/base64id": "^2.0.0",
31
31
  "@types/clone-deep": "^4.0.1",
package/request.d.ts CHANGED
@@ -1,26 +1,24 @@
1
- import { Request } from "@socket-mesh/request";
2
- import { RequestSocket } from "@socket-mesh/request/request";
1
+ import { Request, RequestSocket, RequestWithResponse } from "@socket-mesh/request";
3
2
  import { Connected } from "./events";
4
3
  import { DataPacket } from "@socket-mesh/simple-broker";
5
4
  import { ChannelOptions } from "@socket-mesh/channel";
6
- export type InboundRequest<T> = HandshakeRequest | SubscribeRequest | UnsubscribeRequest | AuthenticateRequest | PublishRequest<T>;
5
+ export type InboundRequest<T> = HandshakeRequest | SubscribeRequest | UnsubscribeRequest | AuthenticateRequest | PublishRequest<T> | InvokeRequest<T>;
7
6
  export interface HandshakeData {
8
7
  authToken: string;
9
8
  }
10
- export declare class HandshakeRequest extends Request<HandshakeData, Connected> {
9
+ export declare class HandshakeRequest extends RequestWithResponse<HandshakeData, Connected> {
11
10
  constructor(socket: RequestSocket, id: number, procedureName: '#handshake', data: HandshakeData);
12
11
  }
13
- export type SubscribeRequest = Request<Partial<DataPacket<ChannelOptions>>, void>;
14
- export type PublishRequest<T> = Request<Partial<DataPacket<T>>, void>;
15
- export declare class UnsubscribeRequest extends Request<string, void> {
12
+ export type InvokeRequest<T, U = any> = RequestWithResponse<T, U>;
13
+ export type SubscribeRequest = Request<Partial<DataPacket<ChannelOptions>>>;
14
+ export type PublishRequest<T> = Request<Partial<DataPacket<T>>>;
15
+ export declare class UnsubscribeRequest extends Request<string> {
16
16
  constructor(socket: RequestSocket, id: number, procedureName: '#unsubscribe', data: string);
17
17
  }
18
18
  export interface AuthenticateData {
19
19
  isAuthenticated: boolean;
20
20
  authError: Error | null;
21
21
  }
22
- export declare class AuthenticateRequest extends Request<string, AuthenticateData> {
22
+ export declare class AuthenticateRequest extends RequestWithResponse<string, AuthenticateData> {
23
23
  constructor(socket: RequestSocket, id: number, procedureName: '#authenticate', data: string);
24
24
  }
25
- export declare function isSubscribeRequest(request: Request<unknown>): request is SubscribeRequest;
26
- export declare function isPublishRequest<T>(request: Request<unknown>): request is PublishRequest<T>;
package/request.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Request } from "@socket-mesh/request";
2
- export class HandshakeRequest extends Request {
1
+ import { Request, RequestWithResponse } from "@socket-mesh/request";
2
+ export class HandshakeRequest extends RequestWithResponse {
3
3
  constructor(socket, id, procedureName, data) {
4
4
  super(socket, id, procedureName, data);
5
5
  }
@@ -9,14 +9,8 @@ export class UnsubscribeRequest extends Request {
9
9
  super(socket, id, procedureName, data);
10
10
  }
11
11
  }
12
- export class AuthenticateRequest extends Request {
12
+ export class AuthenticateRequest extends RequestWithResponse {
13
13
  constructor(socket, id, procedureName, data) {
14
14
  super(socket, id, procedureName, data);
15
15
  }
16
16
  }
17
- export function isSubscribeRequest(request) {
18
- return request.procedure === '#subscribe';
19
- }
20
- export function isPublishRequest(request) {
21
- return request.procedure === '#publish';
22
- }
@@ -3,13 +3,10 @@ import { CodecEngine } from "@socket-mesh/formatter";
3
3
  import ws from "ws";
4
4
  import jwt from "jsonwebtoken";
5
5
  import { Server as HttpServer } from 'http';
6
- import { AuthEngine } from "@socket-mesh/server-auth";
6
+ import { AuthEngine } from "./auth-engine";
7
7
  export type ProtocolVersions = 1 | 2;
8
8
  export interface ServerOptions {
9
9
  httpServer?: HttpServer;
10
- wsEngine?: string | {
11
- Server: ws.Server;
12
- };
13
10
  wsEngineServerOptions?: ws.ServerOptions;
14
11
  authKey?: jwt.Secret;
15
12
  perMessageDeflate?: boolean | ws.PerMessageDeflateOptions;
@@ -31,9 +28,9 @@ export interface ServerOptions {
31
28
  batchOnHandshake?: boolean;
32
29
  batchOnHandshakeDuration?: number;
33
30
  batchInterval?: number;
34
- socketStreamCleanupMode?: 'kill' | 'close';
31
+ socketStreamCleanupMode?: 'kill' | 'close' | 'none';
35
32
  authVerifyAlgorithms?: jwt.Algorithm[];
36
- authEngine?: AuthEngine;
33
+ authEngine?: AuthEngine<any>;
37
34
  codecEngine?: CodecEngine;
38
35
  cloneData?: boolean;
39
36
  strictHandshake?: boolean;
package/server.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
- import { AuthEngine } from "@socket-mesh/server-auth";
3
+ import { AuthEngine } from "./auth-engine";
4
4
  import { CodecEngine } from "@socket-mesh/formatter";
5
5
  import { Broker, Packet } from "@socket-mesh/simple-broker";
6
6
  import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
7
7
  import { MiddlewareType } from "./middleware-type";
8
8
  import { MiddlewareStream } from "./middleware-stream";
9
- import { ActionAuthenticate, ActionHandshakeSC, ActionHandshakeWS, ActionInvoke, ActionMessage, ActionPublishIn, ActionPublishOut, ActionResult, ActionSubscribe, ActionTransmit, AuthInfo, MiddlewareAction } from "./action";
9
+ import { ActionAuthenticate, ActionHandshakeSC, ActionHandshakeWS, ActionMessage, ActionPublishOut, ActionResult, ActionSubscribe, AuthInfo, HandshakeAction, InboundAction, MiddlewareAction } from "./action";
10
10
  import { ProtocolVersions, ServerOptions } from "./server-options";
11
- import ws from "ws";
11
+ import { PerMessageDeflateOptions, WebSocketServer } from 'ws';
12
12
  import jwt from "jsonwebtoken";
13
13
  import { Server as HttpServer } from 'http';
14
14
  import { ServerSocket } from "./serversocket";
@@ -21,7 +21,7 @@ export type ServerEvent<T, U extends ServerSocketEvents | {}> = {
21
21
  type ServerEvents<T> = ServerEvent<T, Connected> | ServerEvent<T, ConnectAborted> | ServerEvent<T, Disconnected> | ServerEvent<T, Closed> | {} | ServerEvent<T, BadAuthToken> | ServerEvent<T, Authenticated> | ServerEvent<T, AuthStateChanged> | ServerEvent<T, Deauthenticated> | ServerEvent<T, {}> | ErrorOccurred | WarningOccurred | ServerEvent<T, Subscribed> | ServerEvent<T, Unsubscribed>;
22
22
  export declare class Server<T> extends AsyncStreamEmitter<ServerEvents<T>> {
23
23
  allowClientPublish: boolean;
24
- auth: AuthEngine;
24
+ auth: AuthEngine<T>;
25
25
  clientsCount: number;
26
26
  codec: CodecEngine;
27
27
  defaultVerificationOptions: jwt.VerifyOptions;
@@ -34,7 +34,7 @@ export declare class Server<T> extends AsyncStreamEmitter<ServerEvents<T>> {
34
34
  handshakeTimeout: number;
35
35
  options: ServerOptions;
36
36
  path: string;
37
- perMessageDeflate?: boolean | ws.PerMessageDeflateOptions;
37
+ perMessageDeflate?: boolean | PerMessageDeflateOptions;
38
38
  pingInterval: number;
39
39
  pingTimeout: number;
40
40
  pingTimeoutDisabled: boolean;
@@ -52,12 +52,12 @@ export declare class Server<T> extends AsyncStreamEmitter<ServerEvents<T>> {
52
52
  };
53
53
  readonly brokerEngine: Broker<T>;
54
54
  readonly exchange: Client<Packet<T>>;
55
- readonly wsServer: ws.Server;
55
+ readonly wsServer: WebSocketServer;
56
56
  private readonly _allowAllOrigins;
57
57
  private readonly _path;
58
58
  private readonly _middleware;
59
59
  constructor(options: ServerOptions);
60
- setAuthEngine(authEngine: AuthEngine): void;
60
+ setAuthEngine(authEngine: AuthEngine<T>): void;
61
61
  setCodecEngine(codecEngine: CodecEngine): void;
62
62
  emitError(error: Error): void;
63
63
  emitWarning(warning: Error): void;
@@ -94,20 +94,20 @@ export declare class Server<T> extends AsyncStreamEmitter<ServerEvents<T>> {
94
94
  close(keepSocketsOpen?: boolean): Promise<void>;
95
95
  getPath(): string;
96
96
  generateId(): string;
97
- setMiddleware(type: MiddlewareType.MIDDLEWARE_HANDSHAKE, middleware: (stream: MiddlewareStream<void>) => void): void;
98
- setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND_RAW, middleware: (stream: MiddlewareStream<string | ArrayBuffer | Buffer[]>) => void): void;
99
- setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND, middleware: (stream: MiddlewareStream<ChannelOptions | T | void>) => void): void;
100
- setMiddleware(type: MiddlewareType.MIDDLEWARE_OUTBOUND, middleware: (stream: MiddlewareStream<T>) => void): void;
97
+ setMiddleware(type: MiddlewareType.MIDDLEWARE_HANDSHAKE, middleware: (stream: MiddlewareStream<HandshakeAction<T>>) => void): void;
98
+ setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND_RAW, middleware: (stream: MiddlewareStream<ActionMessage<T>>) => void): void;
99
+ setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND, middleware: (stream: MiddlewareStream<InboundAction<T>>) => void): void;
100
+ setMiddleware(type: MiddlewareType.MIDDLEWARE_OUTBOUND, middleware: (stream: MiddlewareStream<ActionPublishOut<T>>) => void): void;
101
101
  removeMiddleware(type: MiddlewareType): void;
102
102
  hasMiddleware(type: MiddlewareType): boolean;
103
- _processMiddlewareAction(middlewareStream: MiddlewareStream<void | T | ChannelOptions>, action: ActionSubscribe<T> | ActionTransmit<T> | ActionInvoke<T> | ActionPublishIn<T>, socket?: ServerSocket<T>): Promise<ActionResult<T>>;
104
- _processMiddlewareAction(middlewareStream: MiddlewareStream<void | T | ChannelOptions>, action: ActionAuthenticate<T>, socket?: ServerSocket<T>): Promise<ActionResult<void>>;
105
- _processMiddlewareAction(middlewareStream: MiddlewareStream<T>, action: ActionPublishOut<T>, socket?: ServerSocket<T>): Promise<ActionResult<T>>;
106
- _processMiddlewareAction(middlewareStream: MiddlewareStream<ChannelOptions>, action: ActionSubscribe<T>, socket?: ServerSocket<T>): Promise<ActionResult<ChannelOptions>>;
107
- _processMiddlewareAction(middlewareStream: MiddlewareStream<void>, action: ActionHandshakeWS, socket?: ServerSocket<T>): Promise<ActionResult<void>>;
108
- _processMiddlewareAction(middlewareStream: MiddlewareStream<void>, action: ActionHandshakeSC<T>, socket?: ServerSocket<T>): Promise<ActionResult<void>>;
109
- _processMiddlewareAction(middlewareStream: MiddlewareStream<string | ArrayBuffer | Buffer[]>, action: ActionMessage<T>, socket?: ServerSocket<T>): Promise<ActionResult<string | ArrayBuffer | Buffer[]>>;
110
- _processMiddlewareAction(middlewareStream: MiddlewareStream<T | ChannelOptions | AuthInfo | string | ArrayBuffer | Buffer[] | void>, action: MiddlewareAction<T>, socket?: ServerSocket<T>): Promise<ActionResult<T | ChannelOptions | AuthInfo | string | ArrayBuffer | Buffer[] | void>>;
103
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<InboundAction<T>>, action: InboundAction<T>, socket?: ServerSocket<T>): Promise<ActionResult<T>>;
104
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<ActionAuthenticate<T>>, action: ActionAuthenticate<T>, socket?: ServerSocket<T>): Promise<ActionResult<void>>;
105
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<ActionPublishOut<T>>, action: ActionPublishOut<T>, socket?: ServerSocket<T>): Promise<ActionResult<T>>;
106
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<ActionSubscribe<T>>, action: ActionSubscribe<T>, socket?: ServerSocket<T>): Promise<ActionResult<ChannelOptions>>;
107
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<ActionHandshakeWS>, action: ActionHandshakeWS, socket?: ServerSocket<T>): Promise<ActionResult<void>>;
108
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<ActionHandshakeSC<T>>, action: ActionHandshakeSC<T>, socket?: ServerSocket<T>): Promise<ActionResult<void>>;
109
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<ActionMessage<T>>, action: ActionMessage<T>, socket?: ServerSocket<T>): Promise<ActionResult<string | ArrayBuffer | Buffer[]>>;
110
+ _processMiddlewareAction(middlewareStream: MiddlewareStream<MiddlewareAction<T>>, action: MiddlewareAction<T>, socket?: ServerSocket<T>): Promise<ActionResult<T | ChannelOptions | AuthInfo | string | ArrayBuffer | Buffer[] | void>>;
111
111
  private _verifyHandshake;
112
112
  }
113
113
  export {};
package/server.js CHANGED
@@ -14,7 +14,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
14
14
  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
15
15
  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
16
16
  };
17
- import { AuthEngine } from "@socket-mesh/server-auth";
17
+ import { AuthEngine } from "./auth-engine";
18
18
  import formatter from "@socket-mesh/formatter";
19
19
  import { SimpleBroker } from "@socket-mesh/simple-broker";
20
20
  import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
@@ -22,6 +22,7 @@ import { InvalidArgumentsError, InvalidOptionsError, InvalidActionError, ServerP
22
22
  import { MiddlewareType } from "./middleware-type";
23
23
  import { MiddlewareStream } from "./middleware-stream";
24
24
  import { ActionHandshakeWS } from "./action";
25
+ import { WebSocketServer } from 'ws';
25
26
  import base64id from 'base64id';
26
27
  import { ServerSocket } from "./serversocket";
27
28
  import url from "url";
@@ -151,12 +152,14 @@ export class Server extends AsyncStreamEmitter {
151
152
  this.emit('ready', {});
152
153
  }))();
153
154
  }
154
- let wsEngine = typeof opts.wsEngine === 'string' ? require(opts.wsEngine) : opts.wsEngine;
155
- if (!wsEngine || !wsEngine.Server) {
156
- throw new InvalidOptionsError('The wsEngine option must be a path or module name which points ' +
157
- 'to a valid WebSocket engine module with a compatible interface');
158
- }
159
- let WSServer = wsEngine.Server;
155
+ // let wsEngine = typeof opts.wsEngine === 'string' ? require(opts.wsEngine) : opts.wsEngine;
156
+ // if (!wsEngine || !wsEngine.Server) {
157
+ // throw new InvalidOptionsError(
158
+ // 'The wsEngine option must be a path or module name which points ' +
159
+ // 'to a valid WebSocket engine module with a compatible interface'
160
+ // );
161
+ // }
162
+ // let WSServer = wsEngine.Server;
160
163
  if (opts.authPrivateKey != null || opts.authPublicKey != null) {
161
164
  if (opts.authPrivateKey == null) {
162
165
  throw new InvalidOptionsError('The authPrivateKey option must be specified if authPublicKey is specified');
@@ -207,7 +210,7 @@ export class Server extends AsyncStreamEmitter {
207
210
  this.clientsCount = 0;
208
211
  this.pendingClients = {};
209
212
  this.pendingClientsCount = 0;
210
- let wsServerOptions = opts.wsEngineServerOptions || {};
213
+ const wsServerOptions = opts.wsEngineServerOptions || {};
211
214
  wsServerOptions.server = this.httpServer;
212
215
  wsServerOptions.verifyClient = this._verifyHandshake.bind(this);
213
216
  if (wsServerOptions.path == null && this._path != null) {
@@ -225,7 +228,7 @@ export class Server extends AsyncStreamEmitter {
225
228
  if (wsServerOptions.clientTracking == null) {
226
229
  wsServerOptions.clientTracking = false;
227
230
  }
228
- this.wsServer = new WSServer(wsServerOptions);
231
+ this.wsServer = new WebSocketServer(wsServerOptions);
229
232
  this.wsServer.on('error', this._handleServerError.bind(this));
230
233
  this.wsServer.on('connection', this._handleSocketConnection.bind(this));
231
234
  }
@@ -0,0 +1,13 @@
1
+ import { DemuxedConsumableStream, StreamDemux, StreamDemuxWrapper } from "@socket-mesh/stream-demux";
2
+ import { AuthenticateRequest, HandshakeRequest, InboundRequest, InvokeRequest, PublishRequest, SubscribeRequest, UnsubscribeRequest } from "./request";
3
+ import { Request } from "@socket-mesh/request";
4
+ export declare class ServerSocketProcedure<T> extends StreamDemuxWrapper<InboundRequest<T>> {
5
+ constructor(stream: StreamDemux<InboundRequest<T>>);
6
+ listen(name: '#handshake'): DemuxedConsumableStream<HandshakeRequest>;
7
+ listen(name: '#authenticate'): DemuxedConsumableStream<AuthenticateRequest>;
8
+ listen(name: '#subscribe'): DemuxedConsumableStream<SubscribeRequest>;
9
+ listen(name: '#unsubscribe'): DemuxedConsumableStream<UnsubscribeRequest>;
10
+ listen(name: '#publish'): DemuxedConsumableStream<PublishRequest<T>>;
11
+ listen<U extends T>(name: string): DemuxedConsumableStream<Request<U>>;
12
+ listen<U extends T, V>(name: string): DemuxedConsumableStream<InvokeRequest<U, V>>;
13
+ }
@@ -0,0 +1,9 @@
1
+ import { StreamDemuxWrapper } from "@socket-mesh/stream-demux";
2
+ export class ServerSocketProcedure extends StreamDemuxWrapper {
3
+ constructor(stream) {
4
+ super(stream);
5
+ }
6
+ listen(name) {
7
+ return super.listen(name);
8
+ }
9
+ }
package/serversocket.d.ts CHANGED
@@ -2,20 +2,21 @@
2
2
  /// <reference types="node" />
3
3
  import { ChannelOptions } from "@socket-mesh/channel";
4
4
  import { AuthState, AuthToken, SignedAuthToken } from "@socket-mesh/auth";
5
- import { AuthTokenOptions } from "@socket-mesh/server-auth";
5
+ import { AuthTokenOptions } from "./auth-engine";
6
6
  import { WritableConsumableStream } from "@socket-mesh/writable-consumable-stream";
7
7
  import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
8
8
  import { DemuxedConsumableStream, StreamDemuxWrapper } from "@socket-mesh/stream-demux";
9
+ import { ResponsePacketError } from "@socket-mesh/request";
9
10
  import { IncomingMessage } from 'http';
10
11
  import { SocketState } from "./socket-state";
11
- import { AuthInfo } from "./action";
12
+ import { ActionMessage, ActionPublishOut, AuthInfo, HandshakeAction, InboundAction } from "./action";
12
13
  import { AuthStateChanged, AuthTokenSigned, Authenticated, BadAuthToken, Closed, ConnectAborted, Connected, Deauthenticated, Disconnected, ErrorOccurred, RawMessage, ServerSocketEvents, Subscribed, Unsubscribed } from './events';
13
14
  import { MiddlewareStream } from './middleware-stream';
14
15
  import { ProtocolVersions } from './server-options';
15
16
  import ws from "ws";
16
17
  import { Server } from "./server";
17
18
  import { OutboundPacket, OutboundPacketOptions } from './outbound-packet';
18
- import { InboundRequest } from './request';
19
+ import { ServerSocketProcedure } from './serversocket-procedure';
19
20
  export type WebSocket = ws.WebSocket & {
20
21
  bytesReceived: number;
21
22
  upgradeReq: IncomingMessage;
@@ -53,10 +54,10 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
53
54
  readonly inboundMessageStream: WritableConsumableStream<string | ArrayBuffer | Buffer[]>;
54
55
  readonly outboundPacketStream: WritableConsumableStream<OutboundPacket<T>>;
55
56
  readonly server: Server<T>;
56
- readonly middlewareHandshakeStream: MiddlewareStream<void>;
57
- readonly middlewareInboundRawStream: MiddlewareStream<string | ArrayBuffer | Buffer[]>;
58
- readonly middlewareInboundStream: MiddlewareStream<ChannelOptions | T | void>;
59
- readonly middlewareOutboundStream: MiddlewareStream<T>;
57
+ readonly middlewareHandshakeStream: MiddlewareStream<HandshakeAction<T>>;
58
+ readonly middlewareInboundRawStream: MiddlewareStream<ActionMessage<T>>;
59
+ readonly middlewareInboundStream: MiddlewareStream<InboundAction<T>>;
60
+ readonly middlewareOutboundStream: MiddlewareStream<ActionPublishOut<T>>;
60
61
  readonly remoteAddress?: string;
61
62
  readonly remoteFamily?: string;
62
63
  readonly remotePort?: number;
@@ -65,7 +66,7 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
65
66
  signedAuthToken: SignedAuthToken | null;
66
67
  state: SocketState;
67
68
  readonly receiver: StreamDemuxWrapper<string | void | T | ArrayBuffer | Buffer[] | AuthInfo | ChannelOptions>;
68
- readonly procedure: StreamDemuxWrapper<InboundRequest<T>>;
69
+ readonly procedure: ServerSocketProcedure<T>;
69
70
  private _cid;
70
71
  private _handshakeTimeoutRef;
71
72
  private _pingIntervalTicker;
@@ -78,6 +79,7 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
78
79
  private readonly _sendPing;
79
80
  constructor(id: string, server: Server<T>, socket: WebSocket, protocolVersion: ProtocolVersions);
80
81
  getBackpressure(): number;
82
+ get exchange(): import("@socket-mesh/channel").Client<import("@socket-mesh/simple-broker/packet").Packet<T>>;
81
83
  getInboundBackpressure(): number;
82
84
  getOutboundBackpressure(): number;
83
85
  private _startBatchOnHandshake;
@@ -111,7 +113,7 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
111
113
  killIO(): void;
112
114
  killAllStreams(): void;
113
115
  private _destroy;
114
- disconnect(code: number, reason?: string): void;
116
+ disconnect(code?: number, reason?: string): void;
115
117
  terminate(): void;
116
118
  send(data: string, options?: SendOptions): void;
117
119
  decode(message: string): any;
@@ -126,7 +128,7 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
126
128
  private _cancelBatching;
127
129
  cancelBatching(): void;
128
130
  serializeObject(object: any): string | null;
129
- sendObject(object: EventObject): void;
131
+ sendObject(object: EventObject | ResponsePacketError): void;
130
132
  private _handleOutboundPacketStream;
131
133
  private _transmit;
132
134
  transmit(event: string, data: any, options?: OutboundPacketOptions): void;
package/serversocket.js CHANGED
@@ -19,7 +19,7 @@ import { AuthState } from "@socket-mesh/auth";
19
19
  import { WritableConsumableStream } from "@socket-mesh/writable-consumable-stream";
20
20
  import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
21
21
  import { StreamDemux, StreamDemuxWrapper } from "@socket-mesh/stream-demux";
22
- import { Request } from "@socket-mesh/request";
22
+ import { Request, RequestWithResponse, createErrorResponse } from "@socket-mesh/request";
23
23
  import { dehydrateError, hydrateError, socketProtocolIgnoreStatuses, socketProtocolErrorStatuses, InvalidArgumentsError, SocketProtocolError, TimeoutError, BadConnectionError, InvalidActionError, AuthError, AuthTokenExpiredError, AuthTokenInvalidError, AuthTokenNotBeforeError, AuthTokenError, BrokerError } from "@socket-mesh/errors";
24
24
  import { SocketState } from "./socket-state";
25
25
  import { MiddlewareType } from "./middleware-type";
@@ -27,7 +27,8 @@ import { ActionAuthenticate, ActionHandshakeSC, ActionInvoke, ActionMessage, Act
27
27
  import { MiddlewareStream } from './middleware-stream';
28
28
  import { isAuthenticatePacket, isHandshakePacket, isPublishPacket, isRemoveAuthTokenPacket, isSubscribePacket, isUnsubscribePacket } from './inbound-packet';
29
29
  import { isPublishOutPacket } from './outbound-packet';
30
- import { AuthenticateRequest, HandshakeRequest, UnsubscribeRequest, isPublishRequest, isSubscribeRequest } from './request';
30
+ import { AuthenticateRequest, HandshakeRequest, UnsubscribeRequest } from './request';
31
+ import { ServerSocketProcedure } from './serversocket-procedure';
31
32
  const HANDSHAKE_REJECTION_STATUS_CODE = 4008;
32
33
  export class ServerSocket extends AsyncStreamEmitter {
33
34
  constructor(id, server, socket, protocolVersion) {
@@ -41,7 +42,7 @@ export class ServerSocket extends AsyncStreamEmitter {
41
42
  this._receiverDemux = new StreamDemux();
42
43
  this.receiver = new StreamDemuxWrapper(this._receiverDemux);
43
44
  this._procedureDemux = new StreamDemux();
44
- this.procedure = new StreamDemuxWrapper(this._procedureDemux);
45
+ this.procedure = new ServerSocketProcedure(this._procedureDemux);
45
46
  this.request = this.socket.upgradeReq;
46
47
  this.inboundReceivedMessageCount = 0;
47
48
  this.inboundProcessedMessageCount = 0;
@@ -141,15 +142,15 @@ export class ServerSocket extends AsyncStreamEmitter {
141
142
  getBackpressure() {
142
143
  return Math.max(this.getInboundBackpressure(), this.getOutboundBackpressure(), this.getListenerBackpressure(), this.receiver.getBackpressure(), this.procedure.getBackpressure());
143
144
  }
144
- ;
145
+ get exchange() {
146
+ return this.server.exchange;
147
+ }
145
148
  getInboundBackpressure() {
146
149
  return this.inboundReceivedMessageCount - this.inboundProcessedMessageCount;
147
150
  }
148
- ;
149
151
  getOutboundBackpressure() {
150
152
  return this.outboundPreparedMessageCount - this.outboundSentMessageCount;
151
153
  }
152
- ;
153
154
  _startBatchOnHandshake() {
154
155
  this._startBatching();
155
156
  setTimeout(() => {
@@ -158,7 +159,6 @@ export class ServerSocket extends AsyncStreamEmitter {
158
159
  }
159
160
  }, this.batchOnHandshakeDuration);
160
161
  }
161
- ;
162
162
  _handleInboundMessageStream(pongMessage) {
163
163
  var _a, e_1, _b, _c;
164
164
  return __awaiter(this, void 0, void 0, function* () {
@@ -221,11 +221,9 @@ export class ServerSocket extends AsyncStreamEmitter {
221
221
  }
222
222
  });
223
223
  }
224
- ;
225
224
  _handleHandshakeTimeout() {
226
225
  this.disconnect(4005);
227
226
  }
228
- ;
229
227
  _processHandshakeRequest(request) {
230
228
  return __awaiter(this, void 0, void 0, function* () {
231
229
  let data = request.data || { authToken: '' };
@@ -363,7 +361,6 @@ export class ServerSocket extends AsyncStreamEmitter {
363
361
  });
364
362
  });
365
363
  }
366
- ;
367
364
  _processSubscribeRequest(request) {
368
365
  return __awaiter(this, void 0, void 0, function* () {
369
366
  let subscriptionOptions = Object.assign({}, request.data);
@@ -393,7 +390,6 @@ export class ServerSocket extends AsyncStreamEmitter {
393
390
  const channels = Object.keys(this.channelSubscriptions);
394
391
  return Promise.all(channels.map((channel) => this._unsubscribe(channel)));
395
392
  }
396
- ;
397
393
  _unsubscribe(channel) {
398
394
  return __awaiter(this, void 0, void 0, function* () {
399
395
  if (typeof channel !== 'string') {
@@ -417,7 +413,6 @@ export class ServerSocket extends AsyncStreamEmitter {
417
413
  }
418
414
  });
419
415
  }
420
- ;
421
416
  _processUnsubscribePacket(packet) {
422
417
  return __awaiter(this, void 0, void 0, function* () {
423
418
  let channel = packet.data;
@@ -430,7 +425,6 @@ export class ServerSocket extends AsyncStreamEmitter {
430
425
  }
431
426
  });
432
427
  }
433
- ;
434
428
  _processUnsubscribeRequest(request) {
435
429
  return __awaiter(this, void 0, void 0, function* () {
436
430
  const channel = request.data;
@@ -548,31 +542,30 @@ export class ServerSocket extends AsyncStreamEmitter {
548
542
  }
549
543
  let newData;
550
544
  if (isRPC) {
551
- let request = new Request(this, packet.cid, packet.event, packet.data);
552
545
  try {
553
546
  let { data } = yield this.server._processMiddlewareAction(this.middlewareInboundStream, action, this);
554
547
  newData = data;
555
548
  }
556
549
  catch (error) {
557
- request.error(error);
550
+ this.sendObject(createErrorResponse(packet.cid, error));
558
551
  return;
559
552
  }
560
- if (isSubscribeRequest(request)) {
553
+ let request;
554
+ if (isSubscribePacket(packet) || isPublishPacket(packet)) {
555
+ request = new Request(this, packet.cid, packet.event, packet.data);
561
556
  if (!request.data) {
562
557
  request.data = {};
563
558
  }
564
559
  request.data.data = newData;
565
- yield this._processSubscribeRequest(request);
566
- }
567
- else if (isPublishRequest(request)) {
568
- if (!request.data) {
569
- request.data = {};
560
+ if (isSubscribePacket(packet)) {
561
+ yield this._processSubscribeRequest(request);
562
+ }
563
+ else {
564
+ yield this._processInboundPublishRequest(request);
570
565
  }
571
- request.data.data = newData;
572
- yield this._processInboundPublishRequest(request);
573
566
  }
574
567
  else {
575
- request.data = newData;
568
+ request = new RequestWithResponse(this, packet.cid, packet.event, newData);
576
569
  }
577
570
  this._procedureDemux.write(request.procedure, request);
578
571
  return;
@@ -614,7 +607,6 @@ export class ServerSocket extends AsyncStreamEmitter {
614
607
  this.emit('raw', { message });
615
608
  });
616
609
  }
617
- ;
618
610
  _resetPongTimeout() {
619
611
  if (this.server.pingTimeoutDisabled) {
620
612
  return;
@@ -850,7 +842,6 @@ export class ServerSocket extends AsyncStreamEmitter {
850
842
  this.isBatching = false;
851
843
  this._cancelBatching();
852
844
  }
853
- ;
854
845
  serializeObject(object) {
855
846
  let str;
856
847
  try {
@@ -862,7 +853,6 @@ export class ServerSocket extends AsyncStreamEmitter {
862
853
  }
863
854
  return str;
864
855
  }
865
- ;
866
856
  sendObject(object) {
867
857
  if (this.isBufferingBatch) {
868
858
  this._batchBuffer.push(object);
@@ -1236,7 +1226,7 @@ export class ServerSocket extends AsyncStreamEmitter {
1236
1226
  }
1237
1227
  _validateAuthToken(signedAuthToken) {
1238
1228
  return __awaiter(this, void 0, void 0, function* () {
1239
- const verificationOptions = Object.assign({}, this.server.defaultVerificationOptions);
1229
+ const verificationOptions = Object.assign({ socket: this }, this.server.defaultVerificationOptions);
1240
1230
  let authToken;
1241
1231
  try {
1242
1232
  authToken = yield this.server.auth.verifyToken(signedAuthToken, this.server.verificationKey, verificationOptions);