@socket-mesh/server 18.0.6 → 18.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/broker/broker-events.d.ts +16 -0
- package/dist/broker/broker.d.ts +28 -0
- package/dist/broker/broker.js +17 -0
- package/dist/broker/exchange-client.d.ts +5 -0
- package/dist/broker/exchange.d.ts +4 -0
- package/dist/broker/exchange.js +3 -0
- package/dist/broker/simple-broker.d.ts +16 -0
- package/dist/broker/simple-broker.js +65 -0
- package/dist/broker/simple-exchange.d.ts +13 -0
- package/dist/broker/simple-exchange.js +33 -0
- package/dist/handlers/authenticate.d.ts +20 -0
- package/dist/handlers/authenticate.js +67 -0
- package/dist/handlers/handshake.d.ts +7 -0
- package/dist/handlers/handshake.js +61 -0
- package/dist/handlers/publish.d.ts +9 -0
- package/dist/handlers/publish.js +21 -0
- package/dist/handlers/remove-auth-token.d.ts +3 -0
- package/dist/handlers/remove-auth-token.js +7 -0
- package/dist/handlers/subscribe.d.ts +7 -0
- package/dist/handlers/subscribe.js +43 -0
- package/dist/handlers/unsubscribe.d.ts +6 -0
- package/dist/handlers/unsubscribe.js +9 -0
- package/dist/index.d.ts +30 -0
- package/{index.js → dist/index.js} +6 -6
- package/dist/maps/client-map.d.ts +10 -0
- package/dist/maps/client-map.js +1 -0
- package/dist/maps/server-map.d.ts +24 -0
- package/dist/maps/server-map.js +1 -0
- package/dist/maps/socket-map.d.ts +19 -0
- package/dist/maps/socket-map.js +1 -0
- package/dist/plugin/server-plugin.d.ts +33 -0
- package/dist/plugin/server-plugin.js +2 -0
- package/dist/server-event.d.ts +54 -0
- package/dist/server-event.js +1 -0
- package/dist/server-options.d.ts +25 -0
- package/dist/server-options.js +1 -0
- package/dist/server-socket-state.d.ts +6 -0
- package/dist/server-socket-state.js +1 -0
- package/dist/server-socket.d.ts +27 -0
- package/dist/server-socket.js +47 -0
- package/dist/server-transport.d.ts +39 -0
- package/dist/server-transport.js +246 -0
- package/dist/server.d.ts +125 -0
- package/dist/server.js +266 -0
- package/package.json +33 -47
- package/action.d.ts +0 -106
- package/action.js +0 -141
- package/auth-engine.d.ts +0 -13
- package/auth-engine.js +0 -32
- package/events.d.ts +0 -54
- package/inbound-packet.d.ts +0 -48
- package/inbound-packet.js +0 -18
- package/index.d.ts +0 -32
- package/middleware-stream.d.ts +0 -7
- package/middleware-stream.js +0 -8
- package/middleware-type.d.ts +0 -6
- package/middleware-type.js +0 -7
- package/outbound-packet.d.ts +0 -25
- package/outbound-packet.js +0 -3
- package/remote-procedure.d.ts +0 -13
- package/remote-procedure.js +0 -9
- package/request.d.ts +0 -24
- package/request.js +0 -16
- package/server-options.d.ts +0 -38
- package/server.d.ts +0 -113
- package/server.js +0 -361
- package/serversocket.d.ts +0 -182
- package/serversocket.js +0 -1262
- package/socket-state.d.ts +0 -5
- package/socket-state.js +0 -6
- /package/{events.js → dist/broker/broker-events.js} +0 -0
- /package/{server-options.js → dist/broker/exchange-client.js} +0 -0
package/server.js
DELETED
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
import { AuthEngine } from "./auth-engine.js";
|
|
2
|
-
import formatter from "@socket-mesh/formatter";
|
|
3
|
-
import { SimpleBroker } from "@socket-mesh/simple-broker";
|
|
4
|
-
import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
|
|
5
|
-
import { InvalidArgumentsError, InvalidOptionsError, InvalidActionError, ServerProtocolError, SilentMiddlewareBlockedError } from "@socket-mesh/errors";
|
|
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';
|
|
10
|
-
import base64id from 'base64id';
|
|
11
|
-
import { ServerSocket } from "./serversocket.js";
|
|
12
|
-
import url from "url";
|
|
13
|
-
import crypto from "crypto";
|
|
14
|
-
export class Server extends AsyncStreamEmitter {
|
|
15
|
-
allowClientPublish;
|
|
16
|
-
auth;
|
|
17
|
-
clientsCount;
|
|
18
|
-
codec;
|
|
19
|
-
defaultVerificationOptions;
|
|
20
|
-
defaultSignatureOptions;
|
|
21
|
-
isReady;
|
|
22
|
-
httpServer;
|
|
23
|
-
middlewareEmitFailures;
|
|
24
|
-
pendingClientsCount;
|
|
25
|
-
ackTimeout;
|
|
26
|
-
handshakeTimeout;
|
|
27
|
-
options;
|
|
28
|
-
path;
|
|
29
|
-
perMessageDeflate;
|
|
30
|
-
pingInterval;
|
|
31
|
-
pingTimeout;
|
|
32
|
-
pingTimeoutDisabled;
|
|
33
|
-
protocolVersion;
|
|
34
|
-
origins;
|
|
35
|
-
signatureKey;
|
|
36
|
-
strictHandshake;
|
|
37
|
-
socketChannelLimit;
|
|
38
|
-
verificationKey;
|
|
39
|
-
clients;
|
|
40
|
-
pendingClients;
|
|
41
|
-
brokerEngine;
|
|
42
|
-
exchange;
|
|
43
|
-
wsServer;
|
|
44
|
-
_allowAllOrigins;
|
|
45
|
-
_path;
|
|
46
|
-
_middleware;
|
|
47
|
-
constructor(options) {
|
|
48
|
-
super();
|
|
49
|
-
let opts = {
|
|
50
|
-
brokerEngine: new SimpleBroker(),
|
|
51
|
-
wsEngine: 'ws',
|
|
52
|
-
wsEngineServerOptions: {},
|
|
53
|
-
maxPayload: null,
|
|
54
|
-
allowClientPublish: true,
|
|
55
|
-
ackTimeout: 10000,
|
|
56
|
-
handshakeTimeout: 10000,
|
|
57
|
-
strictHandshake: true,
|
|
58
|
-
pingTimeout: 20000,
|
|
59
|
-
pingTimeoutDisabled: false,
|
|
60
|
-
pingInterval: 8000,
|
|
61
|
-
origins: '*:*',
|
|
62
|
-
path: '/socketcluster/',
|
|
63
|
-
protocolVersion: 2,
|
|
64
|
-
authDefaultExpiry: 86400,
|
|
65
|
-
batchOnHandshake: false,
|
|
66
|
-
batchOnHandshakeDuration: 400,
|
|
67
|
-
batchInterval: 50,
|
|
68
|
-
middlewareEmitFailures: true,
|
|
69
|
-
socketStreamCleanupMode: 'kill',
|
|
70
|
-
cloneData: false
|
|
71
|
-
};
|
|
72
|
-
this.options = Object.assign(opts, options);
|
|
73
|
-
this._middleware = {};
|
|
74
|
-
this.origins = opts.origins;
|
|
75
|
-
this._allowAllOrigins = this.origins.indexOf('*:*') !== -1;
|
|
76
|
-
this.ackTimeout = opts.ackTimeout;
|
|
77
|
-
this.handshakeTimeout = opts.handshakeTimeout;
|
|
78
|
-
this.pingInterval = opts.pingInterval;
|
|
79
|
-
this.pingTimeout = opts.pingTimeout;
|
|
80
|
-
this.pingTimeoutDisabled = opts.pingTimeoutDisabled;
|
|
81
|
-
this.allowClientPublish = opts.allowClientPublish;
|
|
82
|
-
this.perMessageDeflate = opts.perMessageDeflate;
|
|
83
|
-
this.httpServer = opts.httpServer;
|
|
84
|
-
this.socketChannelLimit = opts.socketChannelLimit;
|
|
85
|
-
this.protocolVersion = opts.protocolVersion;
|
|
86
|
-
this.strictHandshake = opts.strictHandshake;
|
|
87
|
-
this.brokerEngine = opts.brokerEngine;
|
|
88
|
-
this.middlewareEmitFailures = opts.middlewareEmitFailures;
|
|
89
|
-
this._path = opts.path;
|
|
90
|
-
(async () => {
|
|
91
|
-
for await (let { error } of this.brokerEngine.listen('error')) {
|
|
92
|
-
this.emitWarning(error);
|
|
93
|
-
}
|
|
94
|
-
})();
|
|
95
|
-
if (this.brokerEngine.isReady) {
|
|
96
|
-
this.isReady = true;
|
|
97
|
-
this.emit('ready', {});
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
this.isReady = false;
|
|
101
|
-
(async () => {
|
|
102
|
-
await this.brokerEngine.listen('ready').once();
|
|
103
|
-
this.isReady = true;
|
|
104
|
-
this.emit('ready', {});
|
|
105
|
-
})();
|
|
106
|
-
}
|
|
107
|
-
// let wsEngine = typeof opts.wsEngine === 'string' ? require(opts.wsEngine) : opts.wsEngine;
|
|
108
|
-
// if (!wsEngine || !wsEngine.Server) {
|
|
109
|
-
// throw new InvalidOptionsError(
|
|
110
|
-
// 'The wsEngine option must be a path or module name which points ' +
|
|
111
|
-
// 'to a valid WebSocket engine module with a compatible interface'
|
|
112
|
-
// );
|
|
113
|
-
// }
|
|
114
|
-
// let WSServer = wsEngine.Server;
|
|
115
|
-
if (opts.authPrivateKey != null || opts.authPublicKey != null) {
|
|
116
|
-
if (opts.authPrivateKey == null) {
|
|
117
|
-
throw new InvalidOptionsError('The authPrivateKey option must be specified if authPublicKey is specified');
|
|
118
|
-
}
|
|
119
|
-
else if (opts.authPublicKey == null) {
|
|
120
|
-
throw new InvalidOptionsError('The authPublicKey option must be specified if authPrivateKey is specified');
|
|
121
|
-
}
|
|
122
|
-
this.signatureKey = opts.authPrivateKey;
|
|
123
|
-
this.verificationKey = opts.authPublicKey;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
if (opts.authKey == null) {
|
|
127
|
-
opts.authKey = crypto.randomBytes(32).toString('hex');
|
|
128
|
-
}
|
|
129
|
-
this.signatureKey = opts.authKey;
|
|
130
|
-
this.verificationKey = opts.authKey;
|
|
131
|
-
}
|
|
132
|
-
this.defaultVerificationOptions = {};
|
|
133
|
-
if (opts.authVerifyAlgorithms != null) {
|
|
134
|
-
this.defaultVerificationOptions.algorithms = opts.authVerifyAlgorithms;
|
|
135
|
-
}
|
|
136
|
-
else if (opts.authAlgorithm != null) {
|
|
137
|
-
this.defaultVerificationOptions.algorithms = [opts.authAlgorithm];
|
|
138
|
-
}
|
|
139
|
-
this.defaultSignatureOptions = {
|
|
140
|
-
expiresIn: opts.authDefaultExpiry
|
|
141
|
-
};
|
|
142
|
-
if (opts.authAlgorithm != null) {
|
|
143
|
-
this.defaultSignatureOptions.algorithm = opts.authAlgorithm;
|
|
144
|
-
}
|
|
145
|
-
if (opts.authEngine) {
|
|
146
|
-
this.auth = opts.authEngine;
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
// Default authentication engine
|
|
150
|
-
this.auth = new AuthEngine();
|
|
151
|
-
}
|
|
152
|
-
if (opts.codecEngine) {
|
|
153
|
-
this.codec = opts.codecEngine;
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
// Default codec engine
|
|
157
|
-
this.codec = formatter;
|
|
158
|
-
}
|
|
159
|
-
this.brokerEngine.setCodecEngine(this.codec);
|
|
160
|
-
this.exchange = this.brokerEngine.exchange();
|
|
161
|
-
this.clients = {};
|
|
162
|
-
this.clientsCount = 0;
|
|
163
|
-
this.pendingClients = {};
|
|
164
|
-
this.pendingClientsCount = 0;
|
|
165
|
-
const wsServerOptions = opts.wsEngineServerOptions || {};
|
|
166
|
-
wsServerOptions.server = this.httpServer;
|
|
167
|
-
wsServerOptions.verifyClient = this._verifyHandshake.bind(this);
|
|
168
|
-
if (wsServerOptions.path == null && this._path != null) {
|
|
169
|
-
wsServerOptions.path = this._path;
|
|
170
|
-
}
|
|
171
|
-
if (wsServerOptions.perMessageDeflate == null && this.perMessageDeflate != null) {
|
|
172
|
-
wsServerOptions.perMessageDeflate = this.perMessageDeflate;
|
|
173
|
-
}
|
|
174
|
-
if (wsServerOptions.handleProtocols == null && opts.handleProtocols != null) {
|
|
175
|
-
wsServerOptions.handleProtocols = opts.handleProtocols;
|
|
176
|
-
}
|
|
177
|
-
if (wsServerOptions.maxPayload == null && opts.maxPayload != null) {
|
|
178
|
-
wsServerOptions.maxPayload = opts.maxPayload;
|
|
179
|
-
}
|
|
180
|
-
if (wsServerOptions.clientTracking == null) {
|
|
181
|
-
wsServerOptions.clientTracking = false;
|
|
182
|
-
}
|
|
183
|
-
this.wsServer = new WebSocketServer(wsServerOptions);
|
|
184
|
-
this.wsServer.on('error', this._handleServerError.bind(this));
|
|
185
|
-
this.wsServer.on('connection', this._handleSocketConnection.bind(this));
|
|
186
|
-
}
|
|
187
|
-
setAuthEngine(authEngine) {
|
|
188
|
-
this.auth = authEngine;
|
|
189
|
-
}
|
|
190
|
-
setCodecEngine(codecEngine) {
|
|
191
|
-
this.codec = codecEngine;
|
|
192
|
-
this.brokerEngine.setCodecEngine(codecEngine);
|
|
193
|
-
}
|
|
194
|
-
emitError(error) {
|
|
195
|
-
this.emit('error', { error });
|
|
196
|
-
}
|
|
197
|
-
emitWarning(warning) {
|
|
198
|
-
this.emit('warning', { warning });
|
|
199
|
-
}
|
|
200
|
-
_handleServerError(error) {
|
|
201
|
-
if (typeof error === 'string') {
|
|
202
|
-
error = new ServerProtocolError(error);
|
|
203
|
-
}
|
|
204
|
-
this.emitError(error);
|
|
205
|
-
}
|
|
206
|
-
_handleSocketConnection(wsSocket, upgradeReq) {
|
|
207
|
-
if (!wsSocket.upgradeReq) {
|
|
208
|
-
// Normalize ws modules to match.
|
|
209
|
-
wsSocket.upgradeReq = upgradeReq;
|
|
210
|
-
}
|
|
211
|
-
let socketId = this.generateId();
|
|
212
|
-
let agSocket = new ServerSocket(socketId, this, wsSocket, this.protocolVersion);
|
|
213
|
-
//agSocket.exchange = this.exchange;
|
|
214
|
-
const inboundRawMiddleware = this._middleware[MiddlewareType.MIDDLEWARE_INBOUND_RAW];
|
|
215
|
-
if (inboundRawMiddleware) {
|
|
216
|
-
inboundRawMiddleware(agSocket.middlewareInboundRawStream);
|
|
217
|
-
}
|
|
218
|
-
const inboundMiddleware = this._middleware[MiddlewareType.MIDDLEWARE_INBOUND];
|
|
219
|
-
if (inboundMiddleware) {
|
|
220
|
-
inboundMiddleware(agSocket.middlewareInboundStream);
|
|
221
|
-
}
|
|
222
|
-
const outboundMiddleware = this._middleware[MiddlewareType.MIDDLEWARE_OUTBOUND];
|
|
223
|
-
if (outboundMiddleware) {
|
|
224
|
-
outboundMiddleware(agSocket.middlewareOutboundStream);
|
|
225
|
-
}
|
|
226
|
-
// Emit event to signal that a socket handshake has been initiated.
|
|
227
|
-
this.emit('handshake', { socket: agSocket });
|
|
228
|
-
}
|
|
229
|
-
emit(eventName, data) {
|
|
230
|
-
super.emit(eventName, data);
|
|
231
|
-
}
|
|
232
|
-
listen(eventName) {
|
|
233
|
-
return super.listen(eventName);
|
|
234
|
-
}
|
|
235
|
-
close(keepSocketsOpen) {
|
|
236
|
-
this.isReady = false;
|
|
237
|
-
return new Promise((resolve, reject) => {
|
|
238
|
-
this.wsServer.close((err) => {
|
|
239
|
-
if (err) {
|
|
240
|
-
reject(err);
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
resolve();
|
|
244
|
-
});
|
|
245
|
-
if (!keepSocketsOpen) {
|
|
246
|
-
for (let socket of Object.values(this.clients)) {
|
|
247
|
-
socket.terminate();
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
getPath() {
|
|
253
|
-
return this._path;
|
|
254
|
-
}
|
|
255
|
-
generateId() {
|
|
256
|
-
return base64id.generateId();
|
|
257
|
-
}
|
|
258
|
-
setMiddleware(type, middleware) {
|
|
259
|
-
if (type !== MiddlewareType.MIDDLEWARE_HANDSHAKE &&
|
|
260
|
-
type !== MiddlewareType.MIDDLEWARE_INBOUND_RAW &&
|
|
261
|
-
type !== MiddlewareType.MIDDLEWARE_INBOUND &&
|
|
262
|
-
type !== MiddlewareType.MIDDLEWARE_OUTBOUND) {
|
|
263
|
-
throw new InvalidArgumentsError(`Middleware ${type} type is not supported`);
|
|
264
|
-
}
|
|
265
|
-
if (this._middleware[type]) {
|
|
266
|
-
throw new InvalidActionError(`Middleware ${type} type has already been set`);
|
|
267
|
-
}
|
|
268
|
-
this._middleware[type] = middleware;
|
|
269
|
-
}
|
|
270
|
-
removeMiddleware(type) {
|
|
271
|
-
delete this._middleware[type];
|
|
272
|
-
}
|
|
273
|
-
hasMiddleware(type) {
|
|
274
|
-
return !!this._middleware[type];
|
|
275
|
-
}
|
|
276
|
-
async _processMiddlewareAction(middlewareStream, action, socket) {
|
|
277
|
-
if (!this.hasMiddleware(middlewareStream.type)) {
|
|
278
|
-
return { data: 'data' in action ? action.data : undefined };
|
|
279
|
-
}
|
|
280
|
-
middlewareStream.write(action);
|
|
281
|
-
let newData;
|
|
282
|
-
let options;
|
|
283
|
-
try {
|
|
284
|
-
const result = await action.promise;
|
|
285
|
-
if (result) {
|
|
286
|
-
newData = result.data;
|
|
287
|
-
options = result.options;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
catch (error) {
|
|
291
|
-
let clientError;
|
|
292
|
-
if (!error) {
|
|
293
|
-
error = new SilentMiddlewareBlockedError(`The ${action.type} Action was blocked by ${middlewareStream.type} middleware`, middlewareStream.type);
|
|
294
|
-
clientError = error;
|
|
295
|
-
}
|
|
296
|
-
else if (error.silent) {
|
|
297
|
-
clientError = new SilentMiddlewareBlockedError(`The ${action.type} Action was blocked by ${middlewareStream.type} middleware`, middlewareStream.type);
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
clientError = error;
|
|
301
|
-
}
|
|
302
|
-
if (this.middlewareEmitFailures) {
|
|
303
|
-
if (socket) {
|
|
304
|
-
socket.emitError(error);
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
this.emitWarning(error);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
throw clientError;
|
|
311
|
-
}
|
|
312
|
-
if (newData === undefined && 'data' in action) {
|
|
313
|
-
newData = action.data;
|
|
314
|
-
}
|
|
315
|
-
return { data: newData, options };
|
|
316
|
-
}
|
|
317
|
-
_verifyHandshake = async function (info, callback) {
|
|
318
|
-
let req = info.req;
|
|
319
|
-
let origin = info.origin;
|
|
320
|
-
if (typeof origin !== 'string' || origin === 'null') {
|
|
321
|
-
origin = '*';
|
|
322
|
-
}
|
|
323
|
-
let ok = false;
|
|
324
|
-
if (this._allowAllOrigins) {
|
|
325
|
-
ok = true;
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
try {
|
|
329
|
-
let parts = url.parse(origin);
|
|
330
|
-
parts.port = parts.port || (parts.protocol === 'https:' ? '443' : '80');
|
|
331
|
-
ok = !!(~this.origins.indexOf(parts.hostname + ':' + parts.port) ||
|
|
332
|
-
~this.origins.indexOf(parts.hostname + ':*') ||
|
|
333
|
-
~this.origins.indexOf('*:' + parts.port));
|
|
334
|
-
}
|
|
335
|
-
catch (e) { }
|
|
336
|
-
}
|
|
337
|
-
const middlewareHandshakeStream = new MiddlewareStream(MiddlewareType.MIDDLEWARE_HANDSHAKE);
|
|
338
|
-
req['handshakeStream'] = middlewareHandshakeStream;
|
|
339
|
-
const handshakeMiddleware = this._middleware[MiddlewareType.MIDDLEWARE_HANDSHAKE];
|
|
340
|
-
if (handshakeMiddleware) {
|
|
341
|
-
handshakeMiddleware(middlewareHandshakeStream);
|
|
342
|
-
}
|
|
343
|
-
const action = new ActionHandshakeWS(req);
|
|
344
|
-
try {
|
|
345
|
-
await this._processMiddlewareAction(middlewareHandshakeStream, action);
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
middlewareHandshakeStream.close();
|
|
349
|
-
callback(false, 401, typeof error === 'string' ? error : error.message);
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
if (ok) {
|
|
353
|
-
callback(true);
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
const error = new ServerProtocolError(`Failed to authorize socket handshake - Invalid origin: ${origin}`);
|
|
357
|
-
this.emitWarning(error);
|
|
358
|
-
middlewareHandshakeStream.close();
|
|
359
|
-
callback(false, 403, error.message);
|
|
360
|
-
};
|
|
361
|
-
}
|
package/serversocket.d.ts
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import { AuthState, AuthToken, SignedAuthToken } from "@socket-mesh/auth";
|
|
4
|
-
import { AuthTokenOptions } from "./auth-engine.js";
|
|
5
|
-
import { WritableConsumableStream } from "@socket-mesh/writable-consumable-stream";
|
|
6
|
-
import { AsyncStreamEmitter } from "@socket-mesh/async-stream-emitter";
|
|
7
|
-
import { DemuxedConsumableStream, StreamDemuxWrapper } from "@socket-mesh/stream-demux";
|
|
8
|
-
import { ResponsePacketError } from "@socket-mesh/request";
|
|
9
|
-
import { IncomingMessage } from 'http';
|
|
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
|
-
import ws from "ws";
|
|
16
|
-
import { Server } from "./server.js";
|
|
17
|
-
import { OutboundPacket, OutboundPacketOptions } from './outbound-packet.js';
|
|
18
|
-
import { RemoteProcedure } from './remote-procedure.js';
|
|
19
|
-
export type WebSocket = ws.WebSocket & {
|
|
20
|
-
bytesReceived: number;
|
|
21
|
-
upgradeReq: IncomingMessage;
|
|
22
|
-
};
|
|
23
|
-
interface SendOptions {
|
|
24
|
-
mask?: boolean;
|
|
25
|
-
binary?: boolean;
|
|
26
|
-
compress?: boolean;
|
|
27
|
-
fin?: boolean;
|
|
28
|
-
}
|
|
29
|
-
interface EventObject {
|
|
30
|
-
event: string;
|
|
31
|
-
data?: any;
|
|
32
|
-
cid?: number;
|
|
33
|
-
}
|
|
34
|
-
export declare class ServerSocket extends AsyncStreamEmitter<ServerSocketEvents> {
|
|
35
|
-
authState: AuthState;
|
|
36
|
-
authToken: AuthToken | null;
|
|
37
|
-
batchInterval: number;
|
|
38
|
-
batchOnHandshake: boolean;
|
|
39
|
-
batchOnHandshakeDuration: number;
|
|
40
|
-
cloneData: boolean;
|
|
41
|
-
channelSubscriptionsCount: number;
|
|
42
|
-
inboundReceivedMessageCount: number;
|
|
43
|
-
inboundProcessedMessageCount: number;
|
|
44
|
-
isBatching: boolean;
|
|
45
|
-
isBufferingBatch: boolean;
|
|
46
|
-
request: IncomingMessage;
|
|
47
|
-
readonly id: string;
|
|
48
|
-
readonly socket: WebSocket;
|
|
49
|
-
readonly protocolVersion: ProtocolVersions;
|
|
50
|
-
readonly channelSubscriptions: {
|
|
51
|
-
[channel: string]: boolean;
|
|
52
|
-
};
|
|
53
|
-
readonly inboundMessageStream: WritableConsumableStream<string | ArrayBuffer | Buffer[]>;
|
|
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
|
-
readonly remoteAddress?: string;
|
|
61
|
-
readonly remoteFamily?: string;
|
|
62
|
-
readonly remotePort?: number;
|
|
63
|
-
outboundPreparedMessageCount: number;
|
|
64
|
-
outboundSentMessageCount: number;
|
|
65
|
-
signedAuthToken: SignedAuthToken | null;
|
|
66
|
-
state: SocketState;
|
|
67
|
-
readonly receiver: StreamDemuxWrapper<any>;
|
|
68
|
-
readonly procedure: RemoteProcedure;
|
|
69
|
-
private _cid;
|
|
70
|
-
private _handshakeTimeoutRef;
|
|
71
|
-
private _pingIntervalTicker;
|
|
72
|
-
private _pingTimeoutTicker;
|
|
73
|
-
private _batchBuffer;
|
|
74
|
-
private _batchingIntervalId;
|
|
75
|
-
private _callbackMap;
|
|
76
|
-
private readonly _receiverDemux;
|
|
77
|
-
private readonly _procedureDemux;
|
|
78
|
-
private readonly _sendPing;
|
|
79
|
-
constructor(id: string, server: Server, socket: WebSocket, protocolVersion: ProtocolVersions);
|
|
80
|
-
getBackpressure(): number;
|
|
81
|
-
get exchange(): import("@socket-mesh/channel").Client<import("@socket-mesh/broker/packet").Packet<any>>;
|
|
82
|
-
getInboundBackpressure(): number;
|
|
83
|
-
getOutboundBackpressure(): number;
|
|
84
|
-
private _startBatchOnHandshake;
|
|
85
|
-
private _handleInboundMessageStream;
|
|
86
|
-
private _handleHandshakeTimeout;
|
|
87
|
-
private _processHandshakeRequest;
|
|
88
|
-
private _processAuthenticateRequest;
|
|
89
|
-
private _subscribeSocket;
|
|
90
|
-
private _processSubscribeRequest;
|
|
91
|
-
private _unsubscribeFromAllChannels;
|
|
92
|
-
private _unsubscribe;
|
|
93
|
-
private _processUnsubscribePacket;
|
|
94
|
-
private _processUnsubscribeRequest;
|
|
95
|
-
private _processInboundPublishPacket;
|
|
96
|
-
private _processInboundPublishRequest;
|
|
97
|
-
private _processInboundPacket;
|
|
98
|
-
private _resetPongTimeout;
|
|
99
|
-
private _nextCallId;
|
|
100
|
-
getState(): SocketState;
|
|
101
|
-
getBytesReceived(): number;
|
|
102
|
-
emitError(error: Error): void;
|
|
103
|
-
private _abortAllPendingEventsDueToBadConnection;
|
|
104
|
-
closeAllMiddlewares(): void;
|
|
105
|
-
closeInput(): void;
|
|
106
|
-
closeOutput(): void;
|
|
107
|
-
closeIO(): void;
|
|
108
|
-
closeAllStreams(): void;
|
|
109
|
-
killAllMiddlewares(): void;
|
|
110
|
-
killInput(): void;
|
|
111
|
-
killOutput(): void;
|
|
112
|
-
killIO(): void;
|
|
113
|
-
killAllStreams(): void;
|
|
114
|
-
private _destroy;
|
|
115
|
-
disconnect(code?: number, reason?: string): void;
|
|
116
|
-
terminate(): void;
|
|
117
|
-
send(data: string, options?: SendOptions): void;
|
|
118
|
-
decode(message: string): any;
|
|
119
|
-
encode(object: any): string;
|
|
120
|
-
startBatch(): void;
|
|
121
|
-
flushBatch(): void;
|
|
122
|
-
cancelBatch(): void;
|
|
123
|
-
private _startBatching;
|
|
124
|
-
startBatching(): void;
|
|
125
|
-
private _stopBatching;
|
|
126
|
-
stopBatching(): void;
|
|
127
|
-
private _cancelBatching;
|
|
128
|
-
cancelBatching(): void;
|
|
129
|
-
serializeObject(object: any): string | null;
|
|
130
|
-
sendObject(object: EventObject | ResponsePacketError): void;
|
|
131
|
-
private _handleOutboundPacketStream;
|
|
132
|
-
private _transmit;
|
|
133
|
-
transmit(event: string, data: any, options?: OutboundPacketOptions): void;
|
|
134
|
-
invoke(event: string, data?: any, options?: OutboundPacketOptions): Promise<unknown>;
|
|
135
|
-
emit(eventName: 'message' | 'raw', data: RawMessage): void;
|
|
136
|
-
emit(eventName: 'error', data: ErrorOccurred): void;
|
|
137
|
-
emit(eventName: 'authStateChange', data: AuthStateChanged): void;
|
|
138
|
-
emit(eventName: 'authenticate', data: Authenticated): void;
|
|
139
|
-
emit(eventName: 'authTokenSigned', data: AuthTokenSigned): void;
|
|
140
|
-
emit(eventName: 'deauthenticate', data: Deauthenticated): void;
|
|
141
|
-
emit(eventName: 'badAuthToken', data: BadAuthToken): void;
|
|
142
|
-
emit(eventName: 'connect', data: Connected): void;
|
|
143
|
-
emit(eventName: 'subscribe', data: Subscribed): void;
|
|
144
|
-
emit(eventName: 'unsubscribe', data: Unsubscribed): void;
|
|
145
|
-
emit(eventName: 'connectAbort', data: ConnectAborted): void;
|
|
146
|
-
emit(eventName: 'disconnect', data: Disconnected): void;
|
|
147
|
-
emit(eventName: 'close', data: Closed): void;
|
|
148
|
-
emit(eventName: 'end'): void;
|
|
149
|
-
listen(eventName: 'message' | 'raw'): DemuxedConsumableStream<RawMessage>;
|
|
150
|
-
listen(eventName: 'error'): DemuxedConsumableStream<ErrorOccurred>;
|
|
151
|
-
listen(eventName: 'authStateChange'): DemuxedConsumableStream<AuthStateChanged>;
|
|
152
|
-
listen(eventName: 'authenticate'): DemuxedConsumableStream<Authenticated>;
|
|
153
|
-
listen(eventName: 'authTokenSigned'): DemuxedConsumableStream<AuthTokenSigned>;
|
|
154
|
-
listen(eventName: 'deauthenticate'): DemuxedConsumableStream<Deauthenticated>;
|
|
155
|
-
listen(eventName: 'badAuthToken'): DemuxedConsumableStream<BadAuthToken>;
|
|
156
|
-
listen(eventName: 'connect'): DemuxedConsumableStream<Connected>;
|
|
157
|
-
listen(eventName: 'subscribe'): DemuxedConsumableStream<Subscribed>;
|
|
158
|
-
listen(eventName: 'unsubscribe'): DemuxedConsumableStream<Unsubscribed>;
|
|
159
|
-
listen(eventName: 'connectAbort'): DemuxedConsumableStream<ConnectAborted>;
|
|
160
|
-
listen(eventName: 'disconnect'): DemuxedConsumableStream<Disconnected>;
|
|
161
|
-
listen(eventName: 'close'): DemuxedConsumableStream<Closed>;
|
|
162
|
-
listen(event: 'end'): DemuxedConsumableStream<void>;
|
|
163
|
-
private _processTransmit;
|
|
164
|
-
private _invoke;
|
|
165
|
-
triggerAuthenticationEvents(oldAuthState: AuthState): void;
|
|
166
|
-
setAuthToken(data: AuthToken, options?: AuthTokenOptions): Promise<void>;
|
|
167
|
-
getAuthToken(): AuthToken | null;
|
|
168
|
-
deauthenticateSelf(): void;
|
|
169
|
-
deauthenticate(options?: {
|
|
170
|
-
rejectOnFailedDelivery: boolean;
|
|
171
|
-
}): Promise<void>;
|
|
172
|
-
kickOut(channel: string, message: string): Promise<void[]>;
|
|
173
|
-
subscriptions(): string[];
|
|
174
|
-
isSubscribed(channel: string): boolean;
|
|
175
|
-
private _processAuthTokenExpiry;
|
|
176
|
-
isAuthTokenExpired(token: AuthToken | null): boolean;
|
|
177
|
-
private _processTokenError;
|
|
178
|
-
private _emitBadAuthTokenError;
|
|
179
|
-
private _validateAuthToken;
|
|
180
|
-
private _processAuthentication;
|
|
181
|
-
}
|
|
182
|
-
export {};
|