@socket-mesh/server 17.3.6 → 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 +7 -10
- package/action.js +14 -14
- package/auth-engine.d.ts +13 -0
- package/auth-engine.js +32 -0
- package/events.d.ts +3 -3
- package/middleware-stream.d.ts +2 -2
- package/package.json +7 -7
- package/request.d.ts +8 -10
- package/request.js +3 -9
- package/server-options.d.ts +3 -3
- package/server.d.ts +19 -19
- package/server.js +3 -3
- package/serversocket-procedure.d.ts +13 -0
- package/serversocket-procedure.js +9 -0
- package/serversocket.d.ts +12 -10
- package/serversocket.js +18 -28
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>)
|
|
36
|
-
block(error: Error)
|
|
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:
|
|
57
|
-
|
|
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
|
|
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) {
|
package/auth-engine.d.ts
ADDED
|
@@ -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
|
|
9
|
+
authToken?: AuthToken;
|
|
10
10
|
}
|
|
11
11
|
export interface AuthTokenSigned {
|
|
12
12
|
signedAuthToken: SignedAuthToken;
|
|
13
13
|
}
|
|
14
14
|
export interface Authenticated {
|
|
15
|
-
authToken
|
|
15
|
+
authToken: AuthToken;
|
|
16
16
|
}
|
|
17
17
|
export interface Deauthenticated {
|
|
18
|
-
oldAuthToken
|
|
18
|
+
oldAuthToken: AuthToken;
|
|
19
19
|
}
|
|
20
20
|
export interface BadAuthToken {
|
|
21
21
|
authError: Error;
|
package/middleware-stream.d.ts
CHANGED
|
@@ -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
|
|
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.
|
|
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.
|
|
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.
|
|
18
|
-
"@socket-mesh/
|
|
19
|
-
"@socket-mesh/
|
|
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.
|
|
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
|
|
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
|
|
14
|
-
export type
|
|
15
|
-
export
|
|
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
|
|
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
|
|
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
|
|
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
|
-
}
|
package/server-options.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ 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 "
|
|
6
|
+
import { AuthEngine } from "./auth-engine";
|
|
7
7
|
export type ProtocolVersions = 1 | 2;
|
|
8
8
|
export interface ServerOptions {
|
|
9
9
|
httpServer?: HttpServer;
|
|
@@ -28,9 +28,9 @@ export interface ServerOptions {
|
|
|
28
28
|
batchOnHandshake?: boolean;
|
|
29
29
|
batchOnHandshakeDuration?: number;
|
|
30
30
|
batchInterval?: number;
|
|
31
|
-
socketStreamCleanupMode?: 'kill' | 'close';
|
|
31
|
+
socketStreamCleanupMode?: 'kill' | 'close' | 'none';
|
|
32
32
|
authVerifyAlgorithms?: jwt.Algorithm[];
|
|
33
|
-
authEngine?: AuthEngine
|
|
33
|
+
authEngine?: AuthEngine<any>;
|
|
34
34
|
codecEngine?: CodecEngine;
|
|
35
35
|
cloneData?: boolean;
|
|
36
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 "
|
|
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,
|
|
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
|
|
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 |
|
|
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:
|
|
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<
|
|
98
|
-
setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND_RAW, middleware: (stream: MiddlewareStream<
|
|
99
|
-
setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND, middleware: (stream: MiddlewareStream<
|
|
100
|
-
setMiddleware(type: MiddlewareType.MIDDLEWARE_OUTBOUND, middleware: (stream: MiddlewareStream<T
|
|
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<
|
|
104
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
105
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<T
|
|
106
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
107
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
108
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
109
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
110
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<T
|
|
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 "
|
|
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,7 +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
|
|
25
|
+
import { WebSocketServer } from 'ws';
|
|
26
26
|
import base64id from 'base64id';
|
|
27
27
|
import { ServerSocket } from "./serversocket";
|
|
28
28
|
import url from "url";
|
|
@@ -228,7 +228,7 @@ export class Server extends AsyncStreamEmitter {
|
|
|
228
228
|
if (wsServerOptions.clientTracking == null) {
|
|
229
229
|
wsServerOptions.clientTracking = false;
|
|
230
230
|
}
|
|
231
|
-
this.wsServer = new
|
|
231
|
+
this.wsServer = new WebSocketServer(wsServerOptions);
|
|
232
232
|
this.wsServer.on('error', this._handleServerError.bind(this));
|
|
233
233
|
this.wsServer.on('connection', this._handleSocketConnection.bind(this));
|
|
234
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
|
+
}
|
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 "
|
|
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 {
|
|
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<
|
|
57
|
-
readonly middlewareInboundRawStream: MiddlewareStream<
|
|
58
|
-
readonly middlewareInboundStream: MiddlewareStream<
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
550
|
+
this.sendObject(createErrorResponse(packet.cid, error));
|
|
558
551
|
return;
|
|
559
552
|
}
|
|
560
|
-
|
|
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
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
request
|
|
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
|
|
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);
|