@socket-mesh/server 17.3.6 → 18.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.
- package/action.d.ts +38 -41
- package/action.js +18 -22
- package/auth-engine.d.ts +13 -0
- package/auth-engine.js +32 -0
- package/events.d.ts +3 -3
- package/inbound-packet.d.ts +11 -11
- package/index.d.ts +11 -11
- package/index.js +4 -4
- package/middleware-stream.d.ts +3 -3
- package/outbound-packet.d.ts +8 -8
- package/package.json +56 -58
- package/request.d.ts +9 -11
- package/request.js +3 -9
- package/server-options.d.ts +2 -2
- package/server.d.ts +53 -53
- package/server.js +90 -128
- package/serversocket-procedure.d.ts +13 -0
- package/serversocket-procedure.js +9 -0
- package/serversocket.d.ts +23 -22
- package/serversocket.js +663 -737
package/server.d.ts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { AuthEngine } from "
|
|
3
|
+
import { AuthEngine } from "./auth-engine.js";
|
|
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
|
-
import { MiddlewareType } from "./middleware-type";
|
|
8
|
-
import { MiddlewareStream } from "./middleware-stream";
|
|
9
|
-
import { ActionAuthenticate, ActionHandshakeSC, ActionHandshakeWS,
|
|
10
|
-
import { ProtocolVersions, ServerOptions } from "./server-options";
|
|
11
|
-
import
|
|
7
|
+
import { MiddlewareType } from "./middleware-type.js";
|
|
8
|
+
import { MiddlewareStream } from "./middleware-stream.js";
|
|
9
|
+
import { ActionAuthenticate, ActionHandshakeSC, ActionHandshakeWS, ActionMessage, ActionPublishOut, ActionResult, ActionSubscribe, AuthInfo, HandshakeAction, InboundAction, MiddlewareAction } from "./action.js";
|
|
10
|
+
import { ProtocolVersions, ServerOptions } from "./server-options.js";
|
|
11
|
+
import { PerMessageDeflateOptions, WebSocketServer } from 'ws';
|
|
12
12
|
import jwt from "jsonwebtoken";
|
|
13
13
|
import { Server as HttpServer } from 'http';
|
|
14
|
-
import { ServerSocket } from "./serversocket";
|
|
14
|
+
import { ServerSocket } from "./serversocket.js";
|
|
15
15
|
import { ChannelOptions, Client } from "@socket-mesh/channel";
|
|
16
|
-
import { AuthStateChanged, Authenticated, BadAuthToken, Closed, ConnectAborted, Connected, Deauthenticated, Disconnected, ErrorOccurred, ServerSocketEvents, Subscribed, Unsubscribed, WarningOccurred } from "./events";
|
|
16
|
+
import { AuthStateChanged, Authenticated, BadAuthToken, Closed, ConnectAborted, Connected, Deauthenticated, Disconnected, ErrorOccurred, ServerSocketEvents, Subscribed, Unsubscribed, WarningOccurred } from "./events.js";
|
|
17
17
|
import { DemuxedConsumableStream } from "@socket-mesh/stream-demux";
|
|
18
|
-
export type ServerEvent<T
|
|
19
|
-
socket: ServerSocket
|
|
20
|
-
} &
|
|
21
|
-
type ServerEvents
|
|
22
|
-
export declare class Server
|
|
18
|
+
export type ServerEvent<T extends ServerSocketEvents | {}> = {
|
|
19
|
+
socket: ServerSocket;
|
|
20
|
+
} & T;
|
|
21
|
+
type ServerEvents = ServerEvent<Connected> | ServerEvent<ConnectAborted> | ServerEvent<Disconnected> | ServerEvent<Closed> | {} | ServerEvent<BadAuthToken> | ServerEvent<Authenticated> | ServerEvent<AuthStateChanged> | ServerEvent<Deauthenticated> | ServerEvent<{}> | ErrorOccurred | WarningOccurred | ServerEvent<Subscribed> | ServerEvent<Unsubscribed>;
|
|
22
|
+
export declare class Server extends AsyncStreamEmitter<ServerEvents> {
|
|
23
23
|
allowClientPublish: boolean;
|
|
24
24
|
auth: AuthEngine;
|
|
25
25
|
clientsCount: number;
|
|
@@ -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;
|
|
@@ -45,14 +45,14 @@ export declare class Server<T> extends AsyncStreamEmitter<ServerEvents<T>> {
|
|
|
45
45
|
socketChannelLimit?: number;
|
|
46
46
|
verificationKey: jwt.Secret;
|
|
47
47
|
readonly clients: {
|
|
48
|
-
[id: string]: ServerSocket
|
|
48
|
+
[id: string]: ServerSocket;
|
|
49
49
|
};
|
|
50
50
|
readonly pendingClients: {
|
|
51
|
-
[id: string]: ServerSocket
|
|
51
|
+
[id: string]: ServerSocket;
|
|
52
52
|
};
|
|
53
|
-
readonly brokerEngine: Broker<
|
|
54
|
-
readonly exchange: Client<Packet<
|
|
55
|
-
readonly wsServer:
|
|
53
|
+
readonly brokerEngine: Broker<any>;
|
|
54
|
+
readonly exchange: Client<Packet<any>>;
|
|
55
|
+
readonly wsServer: WebSocketServer;
|
|
56
56
|
private readonly _allowAllOrigins;
|
|
57
57
|
private readonly _path;
|
|
58
58
|
private readonly _middleware;
|
|
@@ -63,51 +63,51 @@ export declare class Server<T> extends AsyncStreamEmitter<ServerEvents<T>> {
|
|
|
63
63
|
emitWarning(warning: Error): void;
|
|
64
64
|
private _handleServerError;
|
|
65
65
|
private _handleSocketConnection;
|
|
66
|
-
emit(eventName: 'connection', data: ServerEvent<
|
|
67
|
-
emit(eventName: 'connectionAbort', data: ServerEvent<
|
|
68
|
-
emit(eventName: 'disconnection', data: ServerEvent<
|
|
69
|
-
emit(eventName: 'closure', data: ServerEvent<
|
|
66
|
+
emit(eventName: 'connection', data: ServerEvent<Connected>): void;
|
|
67
|
+
emit(eventName: 'connectionAbort', data: ServerEvent<ConnectAborted>): void;
|
|
68
|
+
emit(eventName: 'disconnection', data: ServerEvent<Disconnected>): void;
|
|
69
|
+
emit(eventName: 'closure', data: ServerEvent<Closed>): void;
|
|
70
70
|
emit(eventName: 'ready', data: {}): void;
|
|
71
|
-
emit(eventName: 'authentication', data: ServerEvent<
|
|
72
|
-
emit(eventName: 'badSocketAuthToken', data: ServerEvent<
|
|
71
|
+
emit(eventName: 'authentication', data: ServerEvent<Authenticated>): void;
|
|
72
|
+
emit(eventName: 'badSocketAuthToken', data: ServerEvent<BadAuthToken>): void;
|
|
73
73
|
emit(eventName: 'error', data: ErrorOccurred): void;
|
|
74
|
-
emit(eventName: 'handshake', data: ServerEvent<
|
|
74
|
+
emit(eventName: 'handshake', data: ServerEvent<{}>): void;
|
|
75
75
|
emit(eventName: 'warning', data: WarningOccurred): void;
|
|
76
|
-
emit(eventName: 'subscription', data: ServerEvent<
|
|
77
|
-
emit(eventName: 'unsubscription', data: ServerEvent<
|
|
78
|
-
emit(eventName: 'authenticationStateChange', data: ServerEvent<
|
|
79
|
-
emit(eventName: 'deauthentication', data: ServerEvent<
|
|
80
|
-
listen(eventName: 'connection'): DemuxedConsumableStream<ServerEvent<
|
|
81
|
-
listen(eventName: 'connectionAbort'): DemuxedConsumableStream<ServerEvent<
|
|
82
|
-
listen(eventName: 'disconnection'): DemuxedConsumableStream<ServerEvent<
|
|
83
|
-
listen(eventName: 'closure'): DemuxedConsumableStream<ServerEvent<
|
|
76
|
+
emit(eventName: 'subscription', data: ServerEvent<Subscribed>): void;
|
|
77
|
+
emit(eventName: 'unsubscription', data: ServerEvent<Unsubscribed>): void;
|
|
78
|
+
emit(eventName: 'authenticationStateChange', data: ServerEvent<AuthStateChanged>): void;
|
|
79
|
+
emit(eventName: 'deauthentication', data: ServerEvent<Deauthenticated>): void;
|
|
80
|
+
listen(eventName: 'connection'): DemuxedConsumableStream<ServerEvent<Connected>>;
|
|
81
|
+
listen(eventName: 'connectionAbort'): DemuxedConsumableStream<ServerEvent<ConnectAborted>>;
|
|
82
|
+
listen(eventName: 'disconnection'): DemuxedConsumableStream<ServerEvent<Disconnected>>;
|
|
83
|
+
listen(eventName: 'closure'): DemuxedConsumableStream<ServerEvent<Closed>>;
|
|
84
84
|
listen(eventName: 'ready'): DemuxedConsumableStream<{}>;
|
|
85
|
-
listen(eventName: 'authentication'): DemuxedConsumableStream<ServerEvent<
|
|
86
|
-
listen(eventName: 'badSocketAuthToken'): DemuxedConsumableStream<ServerEvent<
|
|
85
|
+
listen(eventName: 'authentication'): DemuxedConsumableStream<ServerEvent<Authenticated>>;
|
|
86
|
+
listen(eventName: 'badSocketAuthToken'): DemuxedConsumableStream<ServerEvent<BadAuthToken>>;
|
|
87
87
|
listen(eventName: 'error'): DemuxedConsumableStream<ErrorOccurred>;
|
|
88
|
-
listen(eventName: 'handshake'): DemuxedConsumableStream<ServerEvent<
|
|
88
|
+
listen(eventName: 'handshake'): DemuxedConsumableStream<ServerEvent<{}>>;
|
|
89
89
|
listen(eventName: 'warning'): DemuxedConsumableStream<WarningOccurred>;
|
|
90
|
-
listen(eventName: 'subscription'): DemuxedConsumableStream<ServerEvent<
|
|
91
|
-
listen(eventName: 'unsubscription'): DemuxedConsumableStream<ServerEvent<
|
|
92
|
-
listen(eventName: 'authenticationStateChange'): DemuxedConsumableStream<ServerEvent<
|
|
93
|
-
listen(eventName: 'deauthentication'): DemuxedConsumableStream<ServerEvent<
|
|
90
|
+
listen(eventName: 'subscription'): DemuxedConsumableStream<ServerEvent<Subscribed>>;
|
|
91
|
+
listen(eventName: 'unsubscription'): DemuxedConsumableStream<ServerEvent<Unsubscribed>>;
|
|
92
|
+
listen(eventName: 'authenticationStateChange'): DemuxedConsumableStream<ServerEvent<AuthStateChanged>>;
|
|
93
|
+
listen(eventName: 'deauthentication'): DemuxedConsumableStream<ServerEvent<Deauthenticated>>;
|
|
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<
|
|
97
|
+
setMiddleware(type: MiddlewareType.MIDDLEWARE_HANDSHAKE, middleware: (stream: MiddlewareStream<HandshakeAction>) => void): void;
|
|
98
|
+
setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND_RAW, middleware: (stream: MiddlewareStream<ActionMessage>) => void): void;
|
|
99
|
+
setMiddleware(type: MiddlewareType.MIDDLEWARE_INBOUND, middleware: (stream: MiddlewareStream<InboundAction>) => void): void;
|
|
100
|
+
setMiddleware(type: MiddlewareType.MIDDLEWARE_OUTBOUND, middleware: (stream: MiddlewareStream<ActionPublishOut>) => 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<
|
|
106
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
107
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
108
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
109
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
110
|
-
_processMiddlewareAction(middlewareStream: MiddlewareStream<
|
|
103
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<InboundAction>, action: InboundAction, socket?: ServerSocket): Promise<ActionResult<any>>;
|
|
104
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<ActionAuthenticate>, action: ActionAuthenticate, socket?: ServerSocket): Promise<ActionResult<void>>;
|
|
105
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<ActionPublishOut>, action: ActionPublishOut, socket?: ServerSocket): Promise<ActionResult<any>>;
|
|
106
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<ActionSubscribe>, action: ActionSubscribe, socket?: ServerSocket): Promise<ActionResult<ChannelOptions>>;
|
|
107
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<ActionHandshakeWS>, action: ActionHandshakeWS, socket?: ServerSocket): Promise<ActionResult<void>>;
|
|
108
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<ActionHandshakeSC>, action: ActionHandshakeSC, socket?: ServerSocket): Promise<ActionResult<void>>;
|
|
109
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<ActionMessage>, action: ActionMessage, socket?: ServerSocket): Promise<ActionResult<string | ArrayBuffer | Buffer[]>>;
|
|
110
|
+
_processMiddlewareAction(middlewareStream: MiddlewareStream<MiddlewareAction>, action: MiddlewareAction, socket?: ServerSocket): Promise<ActionResult<any | ChannelOptions | AuthInfo | string | ArrayBuffer | Buffer[] | void>>;
|
|
111
111
|
private _verifyHandshake;
|
|
112
112
|
}
|
|
113
113
|
export {};
|
package/server.js
CHANGED
|
@@ -1,80 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
11
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
12
|
-
var m = o[Symbol.asyncIterator], i;
|
|
13
|
-
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
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
|
-
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
16
|
-
};
|
|
17
|
-
import { AuthEngine } from "@socket-mesh/server-auth";
|
|
1
|
+
import { AuthEngine } from "./auth-engine.js";
|
|
18
2
|
import formatter from "@socket-mesh/formatter";
|
|
19
3
|
import { SimpleBroker } from "@socket-mesh/simple-broker";
|
|
20
4
|
import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
|
|
21
5
|
import { InvalidArgumentsError, InvalidOptionsError, InvalidActionError, ServerProtocolError, SilentMiddlewareBlockedError } from "@socket-mesh/errors";
|
|
22
|
-
import { MiddlewareType } from "./middleware-type";
|
|
23
|
-
import { MiddlewareStream } from "./middleware-stream";
|
|
24
|
-
import { ActionHandshakeWS } from "./action";
|
|
25
|
-
import
|
|
6
|
+
import { MiddlewareType } from "./middleware-type.js";
|
|
7
|
+
import { MiddlewareStream } from "./middleware-stream.js";
|
|
8
|
+
import { ActionHandshakeWS } from "./action.js";
|
|
9
|
+
import { WebSocketServer } from 'ws';
|
|
26
10
|
import base64id from 'base64id';
|
|
27
|
-
import { ServerSocket } from "./serversocket";
|
|
11
|
+
import { ServerSocket } from "./serversocket.js";
|
|
28
12
|
import url from "url";
|
|
29
13
|
import crypto from "crypto";
|
|
30
14
|
export class Server extends AsyncStreamEmitter {
|
|
31
15
|
constructor(options) {
|
|
32
16
|
super();
|
|
33
|
-
this._verifyHandshake = function (info, callback) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
else {
|
|
45
|
-
try {
|
|
46
|
-
let parts = url.parse(origin);
|
|
47
|
-
parts.port = parts.port || (parts.protocol === 'https:' ? '443' : '80');
|
|
48
|
-
ok = !!(~this.origins.indexOf(parts.hostname + ':' + parts.port) ||
|
|
49
|
-
~this.origins.indexOf(parts.hostname + ':*') ||
|
|
50
|
-
~this.origins.indexOf('*:' + parts.port));
|
|
51
|
-
}
|
|
52
|
-
catch (e) { }
|
|
53
|
-
}
|
|
54
|
-
const middlewareHandshakeStream = new MiddlewareStream(MiddlewareType.MIDDLEWARE_HANDSHAKE);
|
|
55
|
-
req['handshakeStream'] = middlewareHandshakeStream;
|
|
56
|
-
const handshakeMiddleware = this._middleware[MiddlewareType.MIDDLEWARE_HANDSHAKE];
|
|
57
|
-
if (handshakeMiddleware) {
|
|
58
|
-
handshakeMiddleware(middlewareHandshakeStream);
|
|
59
|
-
}
|
|
60
|
-
const action = new ActionHandshakeWS(req);
|
|
17
|
+
this._verifyHandshake = async function (info, callback) {
|
|
18
|
+
let req = info.req;
|
|
19
|
+
let origin = info.origin;
|
|
20
|
+
if (typeof origin !== 'string' || origin === 'null') {
|
|
21
|
+
origin = '*';
|
|
22
|
+
}
|
|
23
|
+
let ok = false;
|
|
24
|
+
if (this._allowAllOrigins) {
|
|
25
|
+
ok = true;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
61
28
|
try {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (ok) {
|
|
70
|
-
callback(true);
|
|
71
|
-
return;
|
|
29
|
+
let parts = url.parse(origin);
|
|
30
|
+
parts.port = parts.port || (parts.protocol === 'https:' ? '443' : '80');
|
|
31
|
+
ok = !!(~this.origins.indexOf(parts.hostname + ':' + parts.port) ||
|
|
32
|
+
~this.origins.indexOf(parts.hostname + ':*') ||
|
|
33
|
+
~this.origins.indexOf('*:' + parts.port));
|
|
72
34
|
}
|
|
73
|
-
|
|
74
|
-
|
|
35
|
+
catch (e) { }
|
|
36
|
+
}
|
|
37
|
+
const middlewareHandshakeStream = new MiddlewareStream(MiddlewareType.MIDDLEWARE_HANDSHAKE);
|
|
38
|
+
req['handshakeStream'] = middlewareHandshakeStream;
|
|
39
|
+
const handshakeMiddleware = this._middleware[MiddlewareType.MIDDLEWARE_HANDSHAKE];
|
|
40
|
+
if (handshakeMiddleware) {
|
|
41
|
+
handshakeMiddleware(middlewareHandshakeStream);
|
|
42
|
+
}
|
|
43
|
+
const action = new ActionHandshakeWS(req);
|
|
44
|
+
try {
|
|
45
|
+
await this._processMiddlewareAction(middlewareHandshakeStream, action);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
75
48
|
middlewareHandshakeStream.close();
|
|
76
|
-
callback(false,
|
|
77
|
-
|
|
49
|
+
callback(false, 401, typeof error === 'string' ? error : error.message);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (ok) {
|
|
53
|
+
callback(true);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const error = new ServerProtocolError(`Failed to authorize socket handshake - Invalid origin: ${origin}`);
|
|
57
|
+
this.emitWarning(error);
|
|
58
|
+
middlewareHandshakeStream.close();
|
|
59
|
+
callback(false, 403, error.message);
|
|
78
60
|
};
|
|
79
61
|
let opts = {
|
|
80
62
|
brokerEngine: new SimpleBroker(),
|
|
@@ -117,40 +99,22 @@ export class Server extends AsyncStreamEmitter {
|
|
|
117
99
|
this.brokerEngine = opts.brokerEngine;
|
|
118
100
|
this.middlewareEmitFailures = opts.middlewareEmitFailures;
|
|
119
101
|
this._path = opts.path;
|
|
120
|
-
(() =>
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
for (var _d = true, _e = __asyncValues(this.brokerEngine.listen('error')), _f; _f = yield _e.next(), _a = _f.done, !_a;) {
|
|
124
|
-
_c = _f.value;
|
|
125
|
-
_d = false;
|
|
126
|
-
try {
|
|
127
|
-
let { error } = _c;
|
|
128
|
-
this.emitWarning(error);
|
|
129
|
-
}
|
|
130
|
-
finally {
|
|
131
|
-
_d = true;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
136
|
-
finally {
|
|
137
|
-
try {
|
|
138
|
-
if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
|
|
139
|
-
}
|
|
140
|
-
finally { if (e_1) throw e_1.error; }
|
|
102
|
+
(async () => {
|
|
103
|
+
for await (let { error } of this.brokerEngine.listen('error')) {
|
|
104
|
+
this.emitWarning(error);
|
|
141
105
|
}
|
|
142
|
-
})
|
|
106
|
+
})();
|
|
143
107
|
if (this.brokerEngine.isReady) {
|
|
144
108
|
this.isReady = true;
|
|
145
109
|
this.emit('ready', {});
|
|
146
110
|
}
|
|
147
111
|
else {
|
|
148
112
|
this.isReady = false;
|
|
149
|
-
(() =>
|
|
150
|
-
|
|
113
|
+
(async () => {
|
|
114
|
+
await this.brokerEngine.listen('ready').once();
|
|
151
115
|
this.isReady = true;
|
|
152
116
|
this.emit('ready', {});
|
|
153
|
-
})
|
|
117
|
+
})();
|
|
154
118
|
}
|
|
155
119
|
// let wsEngine = typeof opts.wsEngine === 'string' ? require(opts.wsEngine) : opts.wsEngine;
|
|
156
120
|
// if (!wsEngine || !wsEngine.Server) {
|
|
@@ -228,7 +192,7 @@ export class Server extends AsyncStreamEmitter {
|
|
|
228
192
|
if (wsServerOptions.clientTracking == null) {
|
|
229
193
|
wsServerOptions.clientTracking = false;
|
|
230
194
|
}
|
|
231
|
-
this.wsServer = new
|
|
195
|
+
this.wsServer = new WebSocketServer(wsServerOptions);
|
|
232
196
|
this.wsServer.on('error', this._handleServerError.bind(this));
|
|
233
197
|
this.wsServer.on('connection', this._handleSocketConnection.bind(this));
|
|
234
198
|
}
|
|
@@ -308,10 +272,10 @@ export class Server extends AsyncStreamEmitter {
|
|
|
308
272
|
type !== MiddlewareType.MIDDLEWARE_INBOUND_RAW &&
|
|
309
273
|
type !== MiddlewareType.MIDDLEWARE_INBOUND &&
|
|
310
274
|
type !== MiddlewareType.MIDDLEWARE_OUTBOUND) {
|
|
311
|
-
throw new InvalidArgumentsError(`Middleware
|
|
275
|
+
throw new InvalidArgumentsError(`Middleware ${type} type is not supported`);
|
|
312
276
|
}
|
|
313
277
|
if (this._middleware[type]) {
|
|
314
|
-
throw new InvalidActionError(`Middleware
|
|
278
|
+
throw new InvalidActionError(`Middleware ${type} type has already been set`);
|
|
315
279
|
}
|
|
316
280
|
this._middleware[type] = middleware;
|
|
317
281
|
}
|
|
@@ -321,47 +285,45 @@ export class Server extends AsyncStreamEmitter {
|
|
|
321
285
|
hasMiddleware(type) {
|
|
322
286
|
return !!this._middleware[type];
|
|
323
287
|
}
|
|
324
|
-
_processMiddlewareAction(middlewareStream, action, socket) {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
288
|
+
async _processMiddlewareAction(middlewareStream, action, socket) {
|
|
289
|
+
if (!this.hasMiddleware(middlewareStream.type)) {
|
|
290
|
+
return { data: 'data' in action ? action.data : undefined };
|
|
291
|
+
}
|
|
292
|
+
middlewareStream.write(action);
|
|
293
|
+
let newData;
|
|
294
|
+
let options;
|
|
295
|
+
try {
|
|
296
|
+
const result = await action.promise;
|
|
297
|
+
if (result) {
|
|
298
|
+
newData = result.data;
|
|
299
|
+
options = result.options;
|
|
328
300
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
let
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
newData = result.data;
|
|
336
|
-
options = result.options;
|
|
337
|
-
}
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
let clientError;
|
|
304
|
+
if (!error) {
|
|
305
|
+
error = new SilentMiddlewareBlockedError(`The ${action.type} Action was blocked by ${middlewareStream.type} middleware`, middlewareStream.type);
|
|
306
|
+
clientError = error;
|
|
338
307
|
}
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
308
|
+
else if (error.silent) {
|
|
309
|
+
clientError = new SilentMiddlewareBlockedError(`The ${action.type} Action was blocked by ${middlewareStream.type} middleware`, middlewareStream.type);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
clientError = error;
|
|
313
|
+
}
|
|
314
|
+
if (this.middlewareEmitFailures) {
|
|
315
|
+
if (socket) {
|
|
316
|
+
socket.emitError(error);
|
|
347
317
|
}
|
|
348
318
|
else {
|
|
349
|
-
|
|
350
|
-
}
|
|
351
|
-
if (this.middlewareEmitFailures) {
|
|
352
|
-
if (socket) {
|
|
353
|
-
socket.emitError(error);
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
this.emitWarning(error);
|
|
357
|
-
}
|
|
319
|
+
this.emitWarning(error);
|
|
358
320
|
}
|
|
359
|
-
throw clientError;
|
|
360
321
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
}
|
|
322
|
+
throw clientError;
|
|
323
|
+
}
|
|
324
|
+
if (newData === undefined && 'data' in action) {
|
|
325
|
+
newData = action.data;
|
|
326
|
+
}
|
|
327
|
+
return { data: newData, options };
|
|
366
328
|
}
|
|
367
329
|
}
|
|
@@ -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.js";
|
|
3
|
+
import { Request } from "@socket-mesh/request";
|
|
4
|
+
export declare class ServerSocketProcedure extends StreamDemuxWrapper<InboundRequest> {
|
|
5
|
+
constructor(stream: StreamDemux<InboundRequest>);
|
|
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>;
|
|
11
|
+
listen<U>(name: string): DemuxedConsumableStream<Request<U>>;
|
|
12
|
+
listen<U, V>(name: string): DemuxedConsumableStream<InvokeRequest<U, V>>;
|
|
13
|
+
}
|
package/serversocket.d.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import { ChannelOptions } from "@socket-mesh/channel";
|
|
4
3
|
import { AuthState, AuthToken, SignedAuthToken } from "@socket-mesh/auth";
|
|
5
|
-
import { AuthTokenOptions } from "
|
|
4
|
+
import { AuthTokenOptions } from "./auth-engine.js";
|
|
6
5
|
import { WritableConsumableStream } from "@socket-mesh/writable-consumable-stream";
|
|
7
6
|
import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
|
|
8
7
|
import { DemuxedConsumableStream, StreamDemuxWrapper } from "@socket-mesh/stream-demux";
|
|
8
|
+
import { ResponsePacketError } from "@socket-mesh/request";
|
|
9
9
|
import { IncomingMessage } from 'http';
|
|
10
|
-
import { SocketState } from "./socket-state";
|
|
11
|
-
import {
|
|
12
|
-
import { AuthStateChanged, AuthTokenSigned, Authenticated, BadAuthToken, Closed, ConnectAborted, Connected, Deauthenticated, Disconnected, ErrorOccurred, RawMessage, ServerSocketEvents, Subscribed, Unsubscribed } from './events';
|
|
13
|
-
import { MiddlewareStream } from './middleware-stream';
|
|
14
|
-
import { ProtocolVersions } from './server-options';
|
|
10
|
+
import { SocketState } from "./socket-state.js";
|
|
11
|
+
import { ActionMessage, ActionPublishOut, HandshakeAction, InboundAction } from "./action.js";
|
|
12
|
+
import { AuthStateChanged, AuthTokenSigned, Authenticated, BadAuthToken, Closed, ConnectAborted, Connected, Deauthenticated, Disconnected, ErrorOccurred, RawMessage, ServerSocketEvents, Subscribed, Unsubscribed } from './events.js';
|
|
13
|
+
import { MiddlewareStream } from './middleware-stream.js';
|
|
14
|
+
import { ProtocolVersions } from './server-options.js';
|
|
15
15
|
import ws from "ws";
|
|
16
|
-
import { Server } from "./server";
|
|
17
|
-
import { OutboundPacket, OutboundPacketOptions } from './outbound-packet';
|
|
18
|
-
import {
|
|
16
|
+
import { Server } from "./server.js";
|
|
17
|
+
import { OutboundPacket, OutboundPacketOptions } from './outbound-packet.js';
|
|
18
|
+
import { ServerSocketProcedure } from './serversocket-procedure.js';
|
|
19
19
|
export type WebSocket = ws.WebSocket & {
|
|
20
20
|
bytesReceived: number;
|
|
21
21
|
upgradeReq: IncomingMessage;
|
|
@@ -31,7 +31,7 @@ interface EventObject {
|
|
|
31
31
|
data?: any;
|
|
32
32
|
cid?: number;
|
|
33
33
|
}
|
|
34
|
-
export declare class ServerSocket
|
|
34
|
+
export declare class ServerSocket extends AsyncStreamEmitter<ServerSocketEvents> {
|
|
35
35
|
authState: AuthState;
|
|
36
36
|
authToken: AuthToken | null;
|
|
37
37
|
batchInterval: number;
|
|
@@ -51,12 +51,12 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
|
|
|
51
51
|
[channel: string]: boolean;
|
|
52
52
|
};
|
|
53
53
|
readonly inboundMessageStream: WritableConsumableStream<string | ArrayBuffer | Buffer[]>;
|
|
54
|
-
readonly outboundPacketStream: WritableConsumableStream<OutboundPacket
|
|
55
|
-
readonly server: Server
|
|
56
|
-
readonly middlewareHandshakeStream: MiddlewareStream<
|
|
57
|
-
readonly middlewareInboundRawStream: MiddlewareStream<
|
|
58
|
-
readonly middlewareInboundStream: MiddlewareStream<
|
|
59
|
-
readonly middlewareOutboundStream: MiddlewareStream<
|
|
54
|
+
readonly outboundPacketStream: WritableConsumableStream<OutboundPacket>;
|
|
55
|
+
readonly server: Server;
|
|
56
|
+
readonly middlewareHandshakeStream: MiddlewareStream<HandshakeAction>;
|
|
57
|
+
readonly middlewareInboundRawStream: MiddlewareStream<ActionMessage>;
|
|
58
|
+
readonly middlewareInboundStream: MiddlewareStream<InboundAction>;
|
|
59
|
+
readonly middlewareOutboundStream: MiddlewareStream<ActionPublishOut>;
|
|
60
60
|
readonly remoteAddress?: string;
|
|
61
61
|
readonly remoteFamily?: string;
|
|
62
62
|
readonly remotePort?: number;
|
|
@@ -64,8 +64,8 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
|
|
|
64
64
|
outboundSentMessageCount: number;
|
|
65
65
|
signedAuthToken: SignedAuthToken | null;
|
|
66
66
|
state: SocketState;
|
|
67
|
-
readonly receiver: StreamDemuxWrapper<
|
|
68
|
-
readonly procedure:
|
|
67
|
+
readonly receiver: StreamDemuxWrapper<any>;
|
|
68
|
+
readonly procedure: ServerSocketProcedure;
|
|
69
69
|
private _cid;
|
|
70
70
|
private _handshakeTimeoutRef;
|
|
71
71
|
private _pingIntervalTicker;
|
|
@@ -76,8 +76,9 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
|
|
|
76
76
|
private readonly _receiverDemux;
|
|
77
77
|
private readonly _procedureDemux;
|
|
78
78
|
private readonly _sendPing;
|
|
79
|
-
constructor(id: string, server: Server
|
|
79
|
+
constructor(id: string, server: Server, socket: WebSocket, protocolVersion: ProtocolVersions);
|
|
80
80
|
getBackpressure(): number;
|
|
81
|
+
get exchange(): import("@socket-mesh/channel").Client<import("@socket-mesh/simple-broker/packet").Packet<any>>;
|
|
81
82
|
getInboundBackpressure(): number;
|
|
82
83
|
getOutboundBackpressure(): number;
|
|
83
84
|
private _startBatchOnHandshake;
|
|
@@ -111,7 +112,7 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
|
|
|
111
112
|
killIO(): void;
|
|
112
113
|
killAllStreams(): void;
|
|
113
114
|
private _destroy;
|
|
114
|
-
disconnect(code
|
|
115
|
+
disconnect(code?: number, reason?: string): void;
|
|
115
116
|
terminate(): void;
|
|
116
117
|
send(data: string, options?: SendOptions): void;
|
|
117
118
|
decode(message: string): any;
|
|
@@ -126,7 +127,7 @@ export declare class ServerSocket<T> extends AsyncStreamEmitter<ServerSocketEven
|
|
|
126
127
|
private _cancelBatching;
|
|
127
128
|
cancelBatching(): void;
|
|
128
129
|
serializeObject(object: any): string | null;
|
|
129
|
-
sendObject(object: EventObject): void;
|
|
130
|
+
sendObject(object: EventObject | ResponsePacketError): void;
|
|
130
131
|
private _handleOutboundPacketStream;
|
|
131
132
|
private _transmit;
|
|
132
133
|
transmit(event: string, data: any, options?: OutboundPacketOptions): void;
|