@nsshunt/stssocketioutils 2.0.14 → 2.0.16

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/dist/node.mjs CHANGED
@@ -17,27 +17,53 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
17
17
  ioRedisMessageProcessorUrl;
18
18
  serverClusterMode;
19
19
  rooms;
20
- constructor() {
20
+ serverName;
21
+ draining = false;
22
+ attached = false;
23
+ constructor(serverName) {
21
24
  super();
25
+ this.serverName = serverName;
26
+ }
27
+ get logPrefix() {
28
+ if (this.namespace) {
29
+ return `SocketIoServer[${this.serverName}:${this.namespace}]: `;
30
+ } else {
31
+ return `SocketIoServer[${this.serverName}:<No Namespace>]: `;
32
+ }
22
33
  }
23
34
  LogErrorMessage(message) {
24
35
  if (this.logger) {
25
- this.logger.error(`${this.namespace}: ${message}`);
36
+ this.logger.error(`${this.logPrefix}${message}`);
26
37
  }
27
38
  }
28
39
  LogDebugMessage(message) {
29
40
  if (this.logger) {
30
- this.logger.debug(`${this.namespace}: ${message}`);
41
+ this.logger.debug(`${this.logPrefix}${message}`);
31
42
  }
32
43
  }
33
44
  LogInfoMessage(message) {
34
45
  if (this.logger) {
35
- this.logger.info(`${this.namespace}: ${message}`);
46
+ this.logger.info(`${this.logPrefix}${message}`);
36
47
  }
37
48
  }
38
49
  LogWarnMessage(message) {
39
50
  if (this.logger) {
40
- this.logger.warn(`${this.namespace}: ${message}`);
51
+ this.logger.warn(`${this.logPrefix}${message}`);
52
+ }
53
+ }
54
+ LogSillyMessage(message) {
55
+ if (this.logger) {
56
+ this.logger.silly(`${this.logPrefix}${message}`);
57
+ }
58
+ }
59
+ LogVerboseMessage(message) {
60
+ if (this.logger) {
61
+ this.logger.verbose(`${this.logPrefix}${message}`);
62
+ }
63
+ }
64
+ LogHttpMessage(message) {
65
+ if (this.logger) {
66
+ this.logger.http(`${this.logPrefix}${message}`);
41
67
  }
42
68
  }
43
69
  // https://socket.io/docs/v4/middlewares/
@@ -53,29 +79,40 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
53
79
  };
54
80
  SocketEventsCallBack = (socket) => {
55
81
  };
56
- GetConfig = (socketIoServeroptions) => {
57
- const options = {
58
- transports: ["websocket"]
59
- // or [ "websocket", "polling" ] (to use long-poolling. Note that the order matters)
60
- };
61
- if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== "") {
62
- this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);
63
- options.adapter = createAdapter(this.redisClient);
64
- } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {
65
- options.adapter = createAdapter$1();
66
- }
67
- if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare("") !== 0) {
68
- options.path = socketIoServeroptions.wssCustomPath;
69
- }
70
- return options;
71
- };
82
+ /*
83
+ protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {
84
+ //this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});
85
+ //await this.#redisClient.connect();
86
+ this.LogDebugMessage(`GetConfig() transports: [ [websocket] ]`);
87
+ const options: Partial<ServerOptions> = {
88
+ transports: [ "websocket" ], // or [ "websocket", "polling" ] (to use long-poolling. Note that the order matters)
89
+ }
90
+
91
+ if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {
92
+ this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);
93
+ this.LogDebugMessage(`GetConfig() createAdapter(redis): redis url: [${socketIoServeroptions.ioRedisMessageProcessorUrl}]`);
94
+ options.adapter = createAdapter(this.redisClient) as any;
95
+ } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {
96
+ this.LogDebugMessage(`GetConfig() createAdapter(cluster)`);
97
+ options.adapter = clusterCreateAdapter() as any;
98
+ }
99
+
100
+ if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {
101
+ this.LogDebugMessage(`GetConfig() wssCustomPath: [${socketIoServeroptions.wssCustomPath}]`);
102
+ options.path = socketIoServeroptions.wssCustomPath;
103
+ }
104
+
105
+ return options;
106
+ }
107
+ */
72
108
  SetEngineEvents = () => {
73
109
  if (this.io) {
74
110
  this.io.engine.on("connection_error", (err) => {
75
- this.LogInfoMessage(err.req);
76
- this.LogInfoMessage(err.code);
77
- this.LogInfoMessage(err.message);
78
- this.LogInfoMessage(err.context);
111
+ this.LogWarnMessage(`SetEngineEvents(): connection_error`);
112
+ this.LogWarnMessage(err.req);
113
+ this.LogWarnMessage(err.code);
114
+ this.LogWarnMessage(err.message);
115
+ this.LogWarnMessage(err.context);
79
116
  });
80
117
  }
81
118
  };
@@ -83,13 +120,6 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
83
120
  this.logger = logger;
84
121
  return this;
85
122
  };
86
- WithExistingServer = (server) => {
87
- if (this.io) {
88
- throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);
89
- }
90
- this.io = server;
91
- return this;
92
- };
93
123
  WithListenPort = (listenPort) => {
94
124
  this.listenPort = listenPort;
95
125
  return this;
@@ -114,107 +144,176 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
114
144
  this.namespace = namespace;
115
145
  return this;
116
146
  };
117
- StartServer = async () => {
147
+ AttachSocketIoServer = async (server) => {
148
+ if (!this.io) {
149
+ this.LogInfoMessage(`AttachServer(): io = server`);
150
+ this.io = server;
151
+ this.LogInfoMessage(`AttachServer(): attached = true`);
152
+ this.attached = true;
153
+ this.LogInfoMessage(`AttachServer(): SetupNamespace()`);
154
+ this.SetupNamespace();
155
+ } else {
156
+ const errorMessage = this.attached === true ? `AttachServer(): Server already exists (from AttachServer())` : `AttachServer(): Server already exists (from StartServer())`;
157
+ this.LogErrorMessage(errorMessage);
158
+ throw new Error(errorMessage);
159
+ }
160
+ return this;
161
+ };
162
+ StartSocketIoServer = async () => {
118
163
  if (!this.namespace) {
119
- throw new Error(`SocketIoServer:StartServer(): Error: [namespace not specified]`);
164
+ const errorMessage = `StartServer(): Error: [namespace not specified]`;
165
+ this.LogErrorMessage(errorMessage);
166
+ throw new Error(errorMessage);
120
167
  }
121
168
  if (!this.io) {
122
169
  if (!this.listenPort) {
123
- throw new Error(`SocketIoServer:StartServer(): Error: [listenPort not specified]`);
170
+ const errorMessage = `StartServer(): Error: [listenPort not specified]`;
171
+ this.LogErrorMessage(errorMessage);
172
+ throw new Error(errorMessage);
124
173
  }
174
+ this.LogDebugMessage(`StartServer(): draining = false`);
175
+ this.draining = false;
176
+ this.LogDebugMessage(`StartServer(): transports: [ [websocket] ]`);
125
177
  const options = {
126
178
  transports: ["websocket"]
127
179
  // or [ "websocket", "polling" ] (to use long-poolling. Note that the order matters)
128
180
  };
129
181
  if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== "") {
130
182
  this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);
183
+ this.LogDebugMessage(`StartServer(): createAdapter(redis): redis url: [${this.ioRedisMessageProcessorUrl}]`);
131
184
  options.adapter = createAdapter(this.redisClient);
132
185
  } else if (this.serverClusterMode && this.serverClusterMode === true) {
186
+ this.LogDebugMessage(`StartServer(): createAdapter(cluster)`);
133
187
  options.adapter = createAdapter$1();
134
188
  }
135
189
  if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare("") !== 0) {
190
+ this.LogDebugMessage(`StartServer(): socketIoCustomPath: [${this.socketIoCustomPath}]`);
136
191
  options.path = this.socketIoCustomPath;
137
192
  }
193
+ this.LogDebugMessage(`StartServer(): new Server(): listenPort: [${this.listenPort}]`);
138
194
  this.io = new Server(this.listenPort, options);
195
+ this.LogDebugMessage(`StartServer(): SetEngineEvents()`);
139
196
  this.SetEngineEvents();
197
+ this.LogDebugMessage(`StartServer(): Sleeping ...`);
140
198
  await Sleep(500);
141
- }
142
- let autoJoinRooms;
143
- let rooms;
144
- if (this.rooms && this.rooms.length > 0) {
145
- autoJoinRooms = true;
146
- rooms = [...this.rooms];
199
+ this.LogDebugMessage(`StartServer(): Done Sleeping`);
200
+ this.LogInfoMessage(`AttachServer(): attached = false`);
201
+ this.attached = false;
202
+ this.LogInfoMessage(`StartServer(): SetupNamespace()`);
203
+ this.SetupNamespace();
147
204
  } else {
148
- autoJoinRooms = false;
149
- rooms = [];
205
+ const errorMessage = this.attached === true ? `StartServer(): Server already exists (from AttachServer())` : `StartServer(): Server already exists (from StartServer())`;
206
+ this.LogErrorMessage(errorMessage);
207
+ throw new Error(errorMessage);
150
208
  }
151
- this.SetupNamespace(rooms, autoJoinRooms);
152
209
  return this;
153
210
  };
154
- AttachServer = async (server) => {
211
+ DetachSockerIoServer = async () => {
155
212
  if (this.io) {
156
- throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);
213
+ if (this.attached === true) {
214
+ this.LogInfoMessage(`DetachServer(): StopNamespace()`);
215
+ await this.StopNamespace();
216
+ this.io = void 0;
217
+ this.LogInfoMessage(`DetachServer(): attached = false`);
218
+ this.attached = false;
219
+ } else {
220
+ const errorMessage = `DetachServer(): Error: [Server has not been attached. Use StopServer() to stop the socker.io server.]`;
221
+ this.LogErrorMessage(errorMessage);
222
+ throw new Error(errorMessage);
223
+ }
224
+ } else {
225
+ const errorMessage = `DetachServer(): Error: [no server exists to DetachServer()]`;
226
+ this.LogErrorMessage(errorMessage);
227
+ throw new Error(errorMessage);
157
228
  }
158
- this.io = server;
159
229
  };
160
- StopServer = async () => {
230
+ StopSocketIoServer = async () => {
161
231
  if (this.io) {
162
- await this.CloseNamespaceAdaptors();
163
- this.DisconnectNamespaceSockets();
164
- await this.io.of("/").adapter.close();
165
- if (this.redisClient) {
166
- await this.redisClient.disconnect();
167
- await Sleep(50);
232
+ if (this.attached === false) {
233
+ this.LogInfoMessage(`StopServer(): draining = true`);
234
+ this.draining = true;
235
+ this.LogInfoMessage(`StopServer(): StopNamespace()`);
236
+ await this.StopNamespace();
237
+ this.LogInfoMessage(`StopServer(): io.of('/').adapter.close()`);
238
+ await this.io.of("/").adapter.close();
239
+ if (this.redisClient) {
240
+ this.LogInfoMessage(`StopServer(): redisClient.disconnect()`);
241
+ await this.redisClient.disconnect();
242
+ this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Sleeping...)`);
243
+ await Sleep(50);
244
+ this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Done Sleeping)`);
245
+ }
246
+ this.LogInfoMessage(`StopServer(): io.disconnectSockets()`);
247
+ this.io.disconnectSockets();
248
+ this.LogInfoMessage(`StopServer(): io.close()`);
249
+ this.io.close();
250
+ this.LogInfoMessage(`StopServer(): io = undefined`);
251
+ this.io = void 0;
252
+ } else {
253
+ const errorMessage = `StopServer(): Cannot stop an attached server. The server created must handle stop/disconnections. Use StopNamespace() instead.`;
254
+ this.LogErrorMessage(errorMessage);
255
+ throw new Error(errorMessage);
168
256
  }
169
- this.io.disconnectSockets();
170
- this.io = void 0;
257
+ } else {
258
+ const errorMessage = `StopServer(): Error: [no server exists to StopServer()]`;
259
+ this.LogErrorMessage(errorMessage);
260
+ throw new Error(errorMessage);
171
261
  }
172
262
  };
173
263
  LeaveRoom = (socket, room) => {
174
- this.LogDebugMessage(`Leaving room [${room}]`);
264
+ this.LogDebugMessage(`LeaveRoom(): Leaving room [${room}]`);
175
265
  socket.leave(room);
176
266
  };
177
267
  JoinRoom = (socket, room) => {
178
- this.LogDebugMessage(`Socket joining room [${room}], ID: [${socket.id}]`);
268
+ this.LogDebugMessage(`JoinRoom(): Socket joining room [${room}], ID: [${socket.id}]`);
179
269
  socket.join(room);
180
270
  };
271
+ StopNamespace = async () => {
272
+ this.LogInfoMessage(`StopServer(): CloseNamespaceAdaptors()`);
273
+ await this.CloseNamespaceAdaptors();
274
+ this.LogInfoMessage(`StopServer(): DisconnectNamespaceSockets()`);
275
+ this.DisconnectNamespaceSockets();
276
+ };
181
277
  SetupStandardEvents = (socket) => {
182
278
  socket.on("disconnect", (reason) => {
183
- this.LogDebugMessage(`socket disconnect, ID: [${socket.id}] [${reason}]`);
279
+ this.LogDebugMessage(`SetupStandardEvents(): socket disconnect, ID: [${socket.id}], reason: [${reason}]`);
184
280
  });
185
281
  socket.on("disconnecting", (reason) => {
186
- this.LogDebugMessage(`socket disconnecting, ID: [${socket.id}] [${reason}]`);
282
+ this.LogDebugMessage(`SetupStandardEvents(): socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);
187
283
  });
188
284
  socket.on("error", (error) => {
189
- this.LogDebugMessage(`socket error, ID: [${socket.id}] [${error}]`);
285
+ this.LogDebugMessage(`SetupStandardEvents(): socket error, ID: [${socket.id}], Error: [${error}]`);
190
286
  });
191
287
  socket.on("__STSdisconnect", (reason) => {
192
- this.LogDebugMessage(`__STSdisconnect: socket disconnect, ID: [${socket.id}] [${reason}]`);
288
+ this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnect: socket disconnect, ID: [${socket.id}], reason: [${reason}]`);
193
289
  });
194
290
  socket.on("__STSdisconnecting", (reason, callBackResult) => {
195
- this.LogDebugMessage(`__STSdisconnecting: socket disconnecting, ID: [${socket.id}] [${reason}]`);
291
+ this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnecting: socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);
196
292
  callBackResult("__STSdisconnecting accepted by server.");
197
293
  });
198
294
  socket.on("__STSjoinRoom", (rooms) => {
199
295
  rooms.forEach((room) => {
296
+ this.LogDebugMessage(`SetupStandardEvents(): __STSjoinRoom: room: [${room}], socket: [${socket.id}]`);
200
297
  this.JoinRoom(socket, room);
201
298
  });
202
299
  });
203
300
  socket.on("__STSleaveRoom", (rooms) => {
204
301
  rooms.forEach((room) => {
302
+ this.LogDebugMessage(`SetupStandardEvents(): __STSleaveRoom: room: [${room}], socket: [${socket.id}]`);
205
303
  this.LeaveRoom(socket, room);
206
304
  });
207
305
  });
208
306
  socket.on("__STSsendToRoom", (rooms, payload) => {
209
307
  rooms.forEach((room) => {
210
308
  if (this.socketionamespace) {
211
- this.LogDebugMessage(`socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}]`);
309
+ this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}], Command: [${payload.command}]`);
212
310
  this.socketionamespace.to(room).emit(payload.command, payload);
213
311
  }
214
312
  });
215
313
  });
216
314
  socket.on("__STSsendToRoomWithCallback", (room, timeout, payload, cb) => {
217
315
  if (this.socketionamespace) {
316
+ this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);
218
317
  this.socketionamespace.to(room).timeout(timeout).emit(payload.command, payload, (err, dataResponse) => {
219
318
  if (err) {
220
319
  console.error(err);
@@ -225,10 +324,10 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
225
324
  //errorCause: err.cause,
226
325
  //errorStack: err.stack
227
326
  };
228
- this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
327
+ this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
229
328
  cb(errorResponse);
230
329
  } else {
231
- this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
330
+ this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
232
331
  cb(dataResponse);
233
332
  }
234
333
  });
@@ -249,6 +348,7 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
249
348
  }, timeout).unref();
250
349
  rooms.forEach((room) => {
251
350
  if (this.socketionamespace) {
351
+ this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);
252
352
  this.socketionamespace.to(room).timeout(timeout).emit(payload.command, payload, (err, dataResponse) => {
253
353
  if (err) {
254
354
  console.error(err);
@@ -259,13 +359,13 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
259
359
  //errorCause: err.cause,
260
360
  //errorStack: err.stack
261
361
  };
262
- this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
362
+ this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
263
363
  responses.push({
264
364
  room,
265
365
  responses: errorResponse
266
366
  });
267
367
  } else {
268
- this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
368
+ this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
269
369
  responses.push({
270
370
  room,
271
371
  responses: dataResponse
@@ -273,6 +373,7 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
273
373
  }
274
374
  if (responses.length === rooms.length) {
275
375
  clearTimeout(timeoutForComplete);
376
+ this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: All complete, Responses Count: [${responses.length}] Invoke call back(responses)`);
276
377
  cb(responses);
277
378
  }
278
379
  });
@@ -280,40 +381,64 @@ class SocketIoServer extends tinyEmitterExports.TinyEmitter {
280
381
  });
281
382
  });
282
383
  };
283
- SetupNamespace = (rooms, autoJoinRooms) => {
384
+ ConnectionDrainingConnectionMiddleware = () => {
385
+ if (this.socketionamespace) {
386
+ this.socketionamespace.use((socket, next) => {
387
+ if (this.draining === true) {
388
+ next(new Error(`ConnectionDrainingConnectionMiddleware(): Error: [server connections draining (from a server disconnect)]`));
389
+ } else {
390
+ next();
391
+ }
392
+ });
393
+ }
394
+ };
395
+ SetupNamespace = () => {
284
396
  if (this.io) {
397
+ this.LogDebugMessage(`SetupNamespace(): socketionamespace = io.of('/${this.namespace}/'`);
285
398
  this.socketionamespace = this.io.of(`/${this.namespace}/`);
399
+ this.LogDebugMessage(`SetupNamespace(): ConnectionDrainingConnectionMiddleware()`);
400
+ this.ConnectionDrainingConnectionMiddleware();
401
+ this.LogDebugMessage(`SetupNamespace(): SetupConnectionMiddleware()`);
286
402
  this.SetupConnectionMiddleware();
287
403
  this.socketionamespace.on("connection", (socket) => {
288
- this.LogDebugMessage(`Socket connected, ID: [${socket.id}]`);
289
- this.LogDebugMessage(`Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);
290
- this.LogDebugMessage(`Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);
291
- this.LogDebugMessage(`Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);
292
- this.LogDebugMessage(`Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);
404
+ this.LogDebugMessage(`SetupNamespace(): Socket connected, ID: [${socket.id}]`);
405
+ this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);
406
+ this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);
407
+ this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);
408
+ this.LogDebugMessage(`SetupNamespace(): Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);
409
+ this.LogDebugMessage(`SetupNamespace(): SetupMessageMiddleware(): Socket: [${socket.id}]`);
293
410
  this.SetupMessageMiddleware(socket);
294
- if (autoJoinRooms) {
295
- rooms.map((room) => {
411
+ if (this.rooms && this.rooms.length > 0) {
412
+ this.rooms.map((room) => {
413
+ this.LogDebugMessage(`SetupNamespace(): Joining Room: [${room}], Socket: [${socket.id}]`);
296
414
  this.JoinRoom(socket, room);
297
415
  });
298
416
  }
417
+ this.LogDebugMessage(`SetupNamespace(): SetupStandardEvents: Socket: [${socket.id}]`);
299
418
  this.SetupStandardEvents(socket);
300
419
  setTimeout(() => {
420
+ this.LogDebugMessage(`SetupNamespace(): SocketConnectCallBack(): Socket: [${socket.id}]`);
301
421
  this.SocketConnectCallBack(socket);
302
422
  }, 0);
423
+ this.LogDebugMessage(`SetupNamespace(): SocketEventsCallBack(): Socket: [${socket.id}]`);
303
424
  this.SocketEventsCallBack(socket);
304
425
  });
305
426
  } else {
306
- throw new Error("SocketIoServer:SetupNamespace(): Error: [No server attached");
427
+ const errorMessage = `SetupNamespace(): Error: [No server attached]`;
428
+ this.LogErrorMessage(errorMessage);
429
+ throw new Error(errorMessage);
307
430
  }
308
431
  return this;
309
432
  };
310
433
  CloseNamespaceAdaptors = async () => {
311
434
  if (this.socketionamespace) {
435
+ this.LogDebugMessage(`CloseNamespaceAdaptors(): this.socketionamespace.adapter.close()`);
312
436
  await this.socketionamespace.adapter.close();
313
437
  }
314
438
  };
315
439
  DisconnectNamespaceSockets = () => {
316
440
  if (this.socketionamespace) {
441
+ this.LogDebugMessage(`DisconnectNamespaceSockets(): this.socketionamespace.disconnectSockets()`);
317
442
  this.socketionamespace.disconnectSockets();
318
443
  this.socketionamespace = void 0;
319
444
  }
package/dist/node.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.mjs","sources":["../src/socketIoServer.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject, Sleep } from '@nsshunt/stsutils'\n\nimport { Server, Namespace, Socket, ServerOptions } from \"socket.io\";\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, STSServerSocket, \n InterServerEvents } from './commonTypes'\n\n//import { createClient, RedisClientType } from 'redis';\nimport { Redis } from 'ioredis';\n\nimport { createAdapter as clusterCreateAdapter } from '@socket.io/cluster-adapter'\nimport { createAdapter } from \"@socket.io/redis-streams-adapter\";\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport interface ISocketIoServerOpitons {\n listenPort?: number\n ioRedisMessageProcessorUrl?: string\n wssCustomPath?: string\n serverClusterMode?: boolean\n}\n \nexport abstract class SocketIoServer<ClientToServerEvents extends STSDefaultClientToServerEvents, ServerToClientEvents extends STSDefaultServerToClientEvents> extends TinyEmitter {\n protected namespace?: string\n protected socketionamespace?: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n //protected socketionamespace?: Namespace<ClientToServerEvents, ServerToClientEvents, InterServerEvents>\n protected logger?: ISTSLogger\n protected io?: Server<ClientToServerEvents, ServerToClientEvents>;\n //#redisClient: RedisClientType | Redis | null = null;\n protected redisClient?: Redis;\n protected listenPort?: number;\n protected socketIoCustomPath?: string;\n protected ioRedisMessageProcessorUrl?: string;\n protected serverClusterMode?: boolean;\n protected rooms?: string[];\n\n constructor() { // IProcessBase\n super();\n }\n\n protected LogErrorMessage(message: any) {\n if (this.logger) {\n this.logger.error(`${this.namespace}: ${message}`);\n }\n }\n\n protected LogDebugMessage(message: any) {\n if (this.logger) {\n this.logger.debug(`${this.namespace}: ${message}`);\n }\n }\n\n protected LogInfoMessage(message: any) {\n if (this.logger) {\n this.logger.info(`${this.namespace}: ${message}`);\n }\n }\n\n protected LogWarnMessage(message: any) {\n if (this.logger) {\n this.logger.warn(`${this.namespace}: ${message}`);\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // https://socket.io/docs/v4/server-socket-instance/#sockethandshake\n // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares\n // Use this middleward to check every incomming connection\n protected SetupConnectionMiddleware = () => { };\n\n // Use this middleware to check every packet being received\n protected SetupMessageMiddleware = (socket: STSServerSocket) => { };\n\n protected SocketConnectCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n protected SocketEventsCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {\n //this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});\n //await this.#redisClient.connect();\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {\n options.path = socketIoServeroptions.wssCustomPath;\n }\n\n return options;\n }\n\n protected SetEngineEvents = () => {\n if (this.io) {\n this.io.engine.on(\"connection_error\", (err) => {\n this.LogInfoMessage(err.req); // the request object\n this.LogInfoMessage(err.code); // the error code, for example 1\n this.LogInfoMessage(err.message); // the error message, for example \"Session ID unknown\"\n this.LogInfoMessage(err.context); // some additional error context\n });\n }\n }\n\n WithLogger = (logger: ISTSLogger) => {\n this.logger = logger;\n return this;\n }\n\n WithExistingServer = (server: Server) => {\n if (this.io) {\n throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);\n }\n this.io = server;\n return this;\n }\n\n WithListenPort = (listenPort: number) => {\n this.listenPort = listenPort;\n return this;\n }\n\n WithSocketIoCustomPath = (socketIoCustomPath: string) => {\n this.socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithIoRedisMessageProcessorUrl = (ioRedisMessageProcessorUrl: string) => {\n this.ioRedisMessageProcessorUrl = ioRedisMessageProcessorUrl;\n return this;\n }\n\n WithClusterMode = (serverClusterMode: boolean) => {\n this.serverClusterMode = serverClusterMode;\n return this;\n }\n\n WithRooms = (rooms: string[]) => {\n this.rooms = rooms;\n return this;\n }\n\n WithNamespace = (namespace: string) => {\n this.namespace = namespace;\n return this;\n }\n\n StartServer = async (): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n //this.#io = require(\"socket.io\")(this.#httpServer, options);\n if (!this.namespace) {\n throw new Error(`SocketIoServer:StartServer(): Error: [namespace not specified]`);\n }\n\n if (!this.io) {\n if (!this.listenPort) {\n throw new Error(`SocketIoServer:StartServer(): Error: [listenPort not specified]`);\n }\n\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (this.serverClusterMode && this.serverClusterMode === true) {\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare('') !== 0) {\n options.path = this.socketIoCustomPath;\n }\n\n this.io = new Server(this.listenPort, options);\n\n this.SetEngineEvents();\n\n await Sleep(500);\n }\n\n let autoJoinRooms: boolean;\n let rooms: string[];\n if (this.rooms && this.rooms.length > 0) {\n autoJoinRooms = true;\n rooms = [ ...this.rooms ];\n } else {\n autoJoinRooms = false;\n rooms = [ ];\n }\n\n this.SetupNamespace(rooms, autoJoinRooms);\n\n return this;\n }\n\n AttachServer = async (server: Server): Promise<void> => {\n if (this.io) {\n throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);\n }\n this.io = server;\n }\n\n StopServer = async () => {\n if (this.io) {\n await this.CloseNamespaceAdaptors();\n this.DisconnectNamespaceSockets();\n\n await this.io.of('/').adapter.close();\n\n if (this.redisClient) {\n await this.redisClient.disconnect();\n await Sleep(50);\n }\n\n this.io.disconnectSockets();\n this.io = undefined;\n }\n }\n\n LeaveRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`Leaving room [${room}]`);\n socket.leave(room);\n };\n\n JoinRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`Socket joining room [${room}], ID: [${socket.id}]`);\n socket.join(room);\n };\n\n protected SetupStandardEvents = (socket: STSServerSocket): void => {\n socket.on('disconnect', (reason: string) => {\n this.LogDebugMessage(`socket disconnect, ID: [${socket.id}] [${reason}]`);\n });\n\n socket.on('disconnecting', (reason: string) => {\n this.LogDebugMessage(`socket disconnecting, ID: [${socket.id}] [${reason}]`);\n });\n\n socket.on('error', (error: Error) => {\n this.LogDebugMessage(`socket error, ID: [${socket.id}] [${error}]`);\n });\n\n socket.on(\"__STSdisconnect\", (reason: string) => {\n this.LogDebugMessage(`__STSdisconnect: socket disconnect, ID: [${socket.id}] [${reason}]`);\n });\n\n socket.on(\"__STSdisconnecting\", (reason, callBackResult) => {\n this.LogDebugMessage(`__STSdisconnecting: socket disconnecting, ID: [${socket.id}] [${reason}]`);\n callBackResult(\"__STSdisconnecting accepted by server.\");\n });\n\n socket.on('__STSjoinRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.JoinRoom(socket, room)\n });\n });\n\n socket.on('__STSleaveRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LeaveRoom(socket, room);\n });\n });\n\n socket.on('__STSsendToRoom', (rooms: string[], payload: { command: string, payload: JSONObject }): void => {\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}]`);\n this.socketionamespace.to(room).emit(payload.command as any, payload);\n }\n });\n });\n\n socket.on('__STSsendToRoomWithCallback', (room: string, timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n if (this.socketionamespace) {\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n cb(errorResponse);\n } else {\n this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n cb(dataResponse);\n }\n });\n }\n });\n\n socket.on('__STSsendToRoomsWithCallback', (rooms: string[], timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n const responses: any[] = [ ];\n\n const timeoutForComplete = setTimeout(() => {\n // for this timeout case, sent back the error response and the responses we have received so far ...\n responses.push({\n room: '',\n responses: {\n error: true,\n errorName: 'timeout',\n errorMessage: `__STSsendToRoomsWithCallback timeout: [${timeout}] before all responses received`\n }\n });\n cb(responses);\n }, timeout).unref();\n\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n responses.push({\n room,\n responses: errorResponse\n });\n } else {\n this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n responses.push({\n room,\n responses: dataResponse\n });\n }\n if (responses.length === rooms.length) {\n clearTimeout(timeoutForComplete);\n cb(responses);\n }\n });\n }\n });\n });\n }\n \n protected SetupNamespace = (rooms: string[], autoJoinRooms: boolean): SocketIoServer<ClientToServerEvents, ServerToClientEvents> => {\n // Create STS Command Centre Client namespace\n if (this.io) {\n this.socketionamespace = this.io.of(`/${this.namespace}/`);\n\n this.SetupConnectionMiddleware();\n\n this.socketionamespace.on(\"connection\", socket => {\n this.LogDebugMessage(`Socket connected, ID: [${socket.id}]`);\n this.LogDebugMessage(`Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);\n this.LogDebugMessage(`Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);\n this.LogDebugMessage(`Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);\n this.LogDebugMessage(`Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);\n\n this.SetupMessageMiddleware(socket);\n\n if (autoJoinRooms) {\n rooms.map((room) => {\n this.JoinRoom(socket, room);\n });\n }\n\n this.SetupStandardEvents(socket);\n\n setTimeout(() => {\n this.SocketConnectCallBack(socket);\n }, 0);\n\n this.SocketEventsCallBack(socket);\n });\n } else {\n throw new Error('SocketIoServer:SetupNamespace(): Error: [No server attached');\n }\n\n return this;\n }\n\n CloseNamespaceAdaptors = async (): Promise<void> => {\n if (this.socketionamespace) {\n await this.socketionamespace.adapter.close();\n }\n }\n\n DisconnectNamespaceSockets = (): void => {\n if (this.socketionamespace) {\n this.socketionamespace.disconnectSockets();\n this.socketionamespace = undefined;\n }\n }\n}\n"],"names":["TinyEmitter","clusterCreateAdapter"],"mappings":"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"}
1
+ {"version":3,"file":"node.mjs","sources":["../src/socketIoServer.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject, Sleep } from '@nsshunt/stsutils'\n\nimport { Server, Namespace, Socket, ServerOptions } from \"socket.io\";\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, STSServerSocket, \n InterServerEvents } from './commonTypes'\n\n//import { createClient, RedisClientType } from 'redis';\nimport { Redis } from 'ioredis';\n\nimport { createAdapter as clusterCreateAdapter } from '@socket.io/cluster-adapter'\nimport { createAdapter } from \"@socket.io/redis-streams-adapter\";\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport interface ISocketIoServerOpitons {\n listenPort?: number\n ioRedisMessageProcessorUrl?: string\n wssCustomPath?: string\n serverClusterMode?: boolean\n}\n \nexport abstract class SocketIoServer<ClientToServerEvents extends STSDefaultClientToServerEvents, ServerToClientEvents extends STSDefaultServerToClientEvents> extends TinyEmitter {\n protected namespace?: string\n protected socketionamespace?: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n //protected socketionamespace?: Namespace<ClientToServerEvents, ServerToClientEvents, InterServerEvents>\n protected logger?: ISTSLogger\n protected io?: Server<ClientToServerEvents, ServerToClientEvents>;\n //#redisClient: RedisClientType | Redis | null = null;\n protected redisClient?: Redis;\n protected listenPort?: number;\n protected socketIoCustomPath?: string;\n protected ioRedisMessageProcessorUrl?: string;\n protected serverClusterMode?: boolean;\n protected rooms?: string[];\n protected serverName: string\n protected draining: boolean = false;\n protected attached: boolean = false;\n\n constructor(serverName: string) { // IProcessBase\n super();\n this.serverName = serverName;\n }\n\n protected get logPrefix(): string {\n if (this.namespace) {\n return `SocketIoServer[${this.serverName}:${this.namespace}]: `;\n } else {\n return `SocketIoServer[${this.serverName}:<No Namespace>]: `;\n }\n }\n\n protected LogErrorMessage(message: any) {\n if (this.logger) {\n this.logger.error(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogDebugMessage(message: any) {\n if (this.logger) {\n this.logger.debug(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogInfoMessage(message: any) {\n if (this.logger) {\n this.logger.info(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogWarnMessage(message: any) {\n if (this.logger) {\n this.logger.warn(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogSillyMessage(message: any) {\n if (this.logger) {\n this.logger.silly(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogVerboseMessage(message: any) {\n if (this.logger) {\n this.logger.verbose(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogHttpMessage(message: any) {\n if (this.logger) {\n this.logger.http(`${this.logPrefix}${message}`);\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // https://socket.io/docs/v4/server-socket-instance/#sockethandshake\n // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares\n // Use this middleward to check every incomming connection\n protected SetupConnectionMiddleware = () => { };\n\n // Use this middleware to check every packet being received\n protected SetupMessageMiddleware = (socket: STSServerSocket) => { };\n\n protected SocketConnectCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n protected SocketEventsCallBack = (socket: Socket<ClientToServerEvents, ServerToClientEvents>): void => { };\n\n /*\n protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {\n //this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});\n //await this.#redisClient.connect();\n this.LogDebugMessage(`GetConfig() transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`GetConfig() createAdapter(redis): redis url: [${socketIoServeroptions.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {\n this.LogDebugMessage(`GetConfig() createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`GetConfig() wssCustomPath: [${socketIoServeroptions.wssCustomPath}]`);\n options.path = socketIoServeroptions.wssCustomPath;\n }\n\n return options;\n }\n */\n\n protected SetEngineEvents = () => {\n if (this.io) {\n this.io.engine.on(\"connection_error\", (err) => {\n this.LogWarnMessage(`SetEngineEvents(): connection_error`); // the request object\n this.LogWarnMessage(err.req); // the request object\n this.LogWarnMessage(err.code); // the error code, for example 1\n this.LogWarnMessage(err.message); // the error message, for example \"Session ID unknown\"\n this.LogWarnMessage(err.context); // some additional error context\n });\n }\n }\n\n WithLogger = (logger: ISTSLogger) => {\n this.logger = logger;\n return this;\n }\n\n WithListenPort = (listenPort: number) => {\n this.listenPort = listenPort;\n return this;\n }\n\n WithSocketIoCustomPath = (socketIoCustomPath: string) => {\n this.socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithIoRedisMessageProcessorUrl = (ioRedisMessageProcessorUrl: string) => {\n this.ioRedisMessageProcessorUrl = ioRedisMessageProcessorUrl;\n return this;\n }\n\n WithClusterMode = (serverClusterMode: boolean) => {\n this.serverClusterMode = serverClusterMode;\n return this;\n }\n\n WithRooms = (rooms: string[]) => {\n this.rooms = rooms;\n return this;\n }\n\n WithNamespace = (namespace: string) => {\n this.namespace = namespace;\n return this;\n }\n\n AttachSocketIoServer = async (server: Server): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n if (!this.io) {\n this.LogInfoMessage(`AttachServer(): io = server`);\n this.io = server;\n\n this.LogInfoMessage(`AttachServer(): attached = true`);\n this.attached = true;\n\n this.LogInfoMessage(`AttachServer(): SetupNamespace()`);\n this.SetupNamespace();\n } else {\n const errorMessage = (this.attached === true ? `AttachServer(): Server already exists (from AttachServer())` : `AttachServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n StartSocketIoServer = async (): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n //this.#io = require(\"socket.io\")(this.#httpServer, options);\n if (!this.namespace) {\n const errorMessage = `StartServer(): Error: [namespace not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n if (!this.io) {\n if (!this.listenPort) {\n const errorMessage = `StartServer(): Error: [listenPort not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n this.LogDebugMessage(`StartServer(): draining = false`);\n this.draining = false;\n\n this.LogDebugMessage(`StartServer(): transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`StartServer(): createAdapter(redis): redis url: [${this.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (this.serverClusterMode && this.serverClusterMode === true) {\n this.LogDebugMessage(`StartServer(): createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`StartServer(): socketIoCustomPath: [${this.socketIoCustomPath}]`);\n options.path = this.socketIoCustomPath;\n }\n\n this.LogDebugMessage(`StartServer(): new Server(): listenPort: [${this.listenPort}]`);\n this.io = new Server(this.listenPort, options);\n\n this.LogDebugMessage(`StartServer(): SetEngineEvents()`);\n this.SetEngineEvents();\n\n this.LogDebugMessage(`StartServer(): Sleeping ...`);\n await Sleep(500);\n this.LogDebugMessage(`StartServer(): Done Sleeping`);\n\n this.LogInfoMessage(`AttachServer(): attached = false`);\n this.attached = false;\n\n this.LogInfoMessage(`StartServer(): SetupNamespace()`);\n this.SetupNamespace();\n\n } else {\n const errorMessage = (this.attached === true ? `StartServer(): Server already exists (from AttachServer())` : `StartServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n DetachSockerIoServer = async (): Promise<void> => {\n if (this.io) {\n if (this.attached === true) {\n this.LogInfoMessage(`DetachServer(): StopNamespace()`);\n await this.StopNamespace();\n this.io = undefined;\n this.LogInfoMessage(`DetachServer(): attached = false`);\n this.attached = false;\n } else {\n const errorMessage = `DetachServer(): Error: [Server has not been attached. Use StopServer() to stop the socker.io server.]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `DetachServer(): Error: [no server exists to DetachServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n StopSocketIoServer = async () => {\n if (this.io) {\n if (this.attached === false) {\n // We are now draining connections\n this.LogInfoMessage(`StopServer(): draining = true`);\n this.draining = true;\n\n this.LogInfoMessage(`StopServer(): StopNamespace()`);\n await this.StopNamespace();\n\n this.LogInfoMessage(`StopServer(): io.of('/').adapter.close()`);\n await this.io.of('/').adapter.close();\n\n if (this.redisClient) {\n this.LogInfoMessage(`StopServer(): redisClient.disconnect()`);\n await this.redisClient.disconnect();\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Sleeping...)`);\n await Sleep(50);\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Done Sleeping)`);\n }\n\n // boot all current connections\n this.LogInfoMessage(`StopServer(): io.disconnectSockets()`);\n this.io.disconnectSockets();\n\n // Stop any future connections, close this server (does not close the underlying http(s) server if io server via that method\n this.LogInfoMessage(`StopServer(): io.close()`);\n this.io.close();\n\n this.LogInfoMessage(`StopServer(): io = undefined`);\n this.io = undefined;\n } else {\n const errorMessage = `StopServer(): Cannot stop an attached server. The server created must handle stop/disconnections. Use StopNamespace() instead.`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `StopServer(): Error: [no server exists to StopServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n LeaveRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`LeaveRoom(): Leaving room [${room}]`);\n socket.leave(room);\n };\n\n JoinRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`JoinRoom(): Socket joining room [${room}], ID: [${socket.id}]`);\n socket.join(room);\n };\n\n protected StopNamespace = async() => {\n this.LogInfoMessage(`StopServer(): CloseNamespaceAdaptors()`);\n await this.CloseNamespaceAdaptors();\n\n this.LogInfoMessage(`StopServer(): DisconnectNamespaceSockets()`);\n this.DisconnectNamespaceSockets();\n }\n\n protected SetupStandardEvents = (socket: STSServerSocket): void => {\n socket.on('disconnect', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on('disconnecting', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on('error', (error: Error) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket error, ID: [${socket.id}], Error: [${error}]`);\n });\n\n socket.on(\"__STSdisconnect\", (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnect: socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on(\"__STSdisconnecting\", (reason, callBackResult) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnecting: socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n callBackResult(\"__STSdisconnecting accepted by server.\");\n });\n\n socket.on('__STSjoinRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSjoinRoom: room: [${room}], socket: [${socket.id}]`);\n this.JoinRoom(socket, room)\n });\n });\n\n socket.on('__STSleaveRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSleaveRoom: room: [${room}], socket: [${socket.id}]`);\n this.LeaveRoom(socket, room);\n });\n });\n\n socket.on('__STSsendToRoom', (rooms: string[], payload: { command: string, payload: JSONObject }): void => {\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).emit(payload.command as any, payload);\n }\n });\n });\n\n socket.on('__STSsendToRoomWithCallback', (room: string, timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n cb(errorResponse);\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n cb(dataResponse);\n }\n });\n }\n });\n\n socket.on('__STSsendToRoomsWithCallback', (rooms: string[], timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n const responses: any[] = [ ];\n\n const timeoutForComplete = setTimeout(() => {\n // for this timeout case, sent back the error response and the responses we have received so far ...\n responses.push({\n room: '',\n responses: {\n error: true,\n errorName: 'timeout',\n errorMessage: `__STSsendToRoomsWithCallback timeout: [${timeout}] before all responses received`\n }\n });\n cb(responses);\n }, timeout).unref();\n\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n responses.push({\n room,\n responses: errorResponse\n });\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n responses.push({\n room,\n responses: dataResponse\n });\n }\n if (responses.length === rooms.length) {\n clearTimeout(timeoutForComplete);\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: All complete, Responses Count: [${responses.length}] Invoke call back(responses)`);\n cb(responses);\n }\n });\n }\n });\n });\n }\n\n protected ConnectionDrainingConnectionMiddleware = (): void => {\n if (this.socketionamespace) {\n this.socketionamespace.use((socket, next) => {\n if (this.draining === true) {\n next(new Error(`ConnectionDrainingConnectionMiddleware(): Error: [server connections draining (from a server disconnect)]`));\n } else {\n next();\n }\n });\n }\n }\n \n protected SetupNamespace = (): SocketIoServer<ClientToServerEvents, ServerToClientEvents> => {\n // Create STS Command Centre Client namespace\n if (this.io) {\n this.LogDebugMessage(`SetupNamespace(): socketionamespace = io.of('/${this.namespace}/'`);\n this.socketionamespace = this.io.of(`/${this.namespace}/`);\n\n this.LogDebugMessage(`SetupNamespace(): ConnectionDrainingConnectionMiddleware()`);\n this.ConnectionDrainingConnectionMiddleware();\n\n this.LogDebugMessage(`SetupNamespace(): SetupConnectionMiddleware()`);\n this.SetupConnectionMiddleware();\n\n this.socketionamespace.on(\"connection\", socket => {\n this.LogDebugMessage(`SetupNamespace(): Socket connected, ID: [${socket.id}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);\n\n this.LogDebugMessage(`SetupNamespace(): SetupMessageMiddleware(): Socket: [${socket.id}]`);\n this.SetupMessageMiddleware(socket);\n\n if (this.rooms && this.rooms.length > 0) {\n this.rooms.map((room) => {\n this.LogDebugMessage(`SetupNamespace(): Joining Room: [${room}], Socket: [${socket.id}]`);\n this.JoinRoom(socket, room);\n });\n }\n\n this.LogDebugMessage(`SetupNamespace(): SetupStandardEvents: Socket: [${socket.id}]`);\n this.SetupStandardEvents(socket);\n\n setTimeout(() => {\n this.LogDebugMessage(`SetupNamespace(): SocketConnectCallBack(): Socket: [${socket.id}]`);\n this.SocketConnectCallBack(socket);\n }, 0);\n\n this.LogDebugMessage(`SetupNamespace(): SocketEventsCallBack(): Socket: [${socket.id}]`);\n this.SocketEventsCallBack(socket);\n });\n } else {\n const errorMessage = `SetupNamespace(): Error: [No server attached]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n return this;\n }\n\n protected CloseNamespaceAdaptors = async (): Promise<void> => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`CloseNamespaceAdaptors(): this.socketionamespace.adapter.close()`);\n await this.socketionamespace.adapter.close();\n }\n }\n\n protected DisconnectNamespaceSockets = (): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`DisconnectNamespaceSockets(): this.socketionamespace.disconnectSockets()`);\n this.socketionamespace.disconnectSockets();\n this.socketionamespace = undefined;\n }\n }\n}\n"],"names":["TinyEmitter","clusterCreateAdapter"],"mappings":";;;;;;AAuBO,MAAe,uBAAiJA,mBAAAA,YAAY;AAAA,EACrK;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAoB;AAAA,EACpB,WAAoB;AAAA,EAE9B,YAAY,YAAoB;AAC5B,UAAA;AACA,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,IAAc,YAAoB;AAC9B,QAAI,KAAK,WAAW;AAChB,aAAO,kBAAkB,KAAK,UAAU,IAAI,KAAK,SAAS;AAAA,IAC9D,OAAO;AACH,aAAO,kBAAkB,KAAK,UAAU;AAAA,IAC5C;AAAA,EACJ;AAAA,EAEU,gBAAgB,SAAc;AACpC,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,MAAM,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,IACnD;AAAA,EACJ;AAAA,EAEU,gBAAgB,SAAc;AACpC,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,MAAM,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,IACnD;AAAA,EACJ;AAAA,EAEU,eAAe,SAAc;AACnC,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,KAAK,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,IAClD;AAAA,EACJ;AAAA,EAEU,eAAe,SAAc;AACnC,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,KAAK,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,IAClD;AAAA,EACJ;AAAA,EAEU,gBAAgB,SAAc;AACpC,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,MAAM,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,IACnD;AAAA,EACJ;AAAA,EAEU,kBAAkB,SAAc;AACtC,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,QAAQ,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,IACrD;AAAA,EACJ;AAAA,EAEU,eAAe,SAAc;AACnC,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,KAAK,GAAG,KAAK,SAAS,GAAG,OAAO,EAAE;AAAA,IAClD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,4BAA4B,MAAM;AAAA,EAAE;AAAA;AAAA,EAGpC,yBAAyB,CAAC,WAA4B;AAAA,EAAE;AAAA,EAExD,wBAAwB,CAAC,WAAqE;AAAA,EAAE;AAAA,EAEhG,uBAAuB,CAAC,WAAqE;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6B/F,kBAAkB,MAAM;AAC9B,QAAI,KAAK,IAAI;AACT,WAAK,GAAG,OAAO,GAAG,oBAAoB,CAAC,QAAQ;AAC3C,aAAK,eAAe,qCAAqC;AACzD,aAAK,eAAe,IAAI,GAAG;AAC3B,aAAK,eAAe,IAAI,IAAI;AAC5B,aAAK,eAAe,IAAI,OAAO;AAC/B,aAAK,eAAe,IAAI,OAAO;AAAA,MACnC,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,aAAa,CAAC,WAAuB;AACjC,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAEA,iBAAiB,CAAC,eAAuB;AACrC,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,yBAAyB,CAAC,uBAA+B;AACrD,SAAK,qBAAqB;AAC1B,WAAO;AAAA,EACX;AAAA,EAEA,iCAAiC,CAAC,+BAAuC;AACrE,SAAK,6BAA6B;AAClC,WAAO;AAAA,EACX;AAAA,EAEA,kBAAkB,CAAC,sBAA+B;AAC9C,SAAK,oBAAoB;AACzB,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,CAAC,UAAoB;AAC7B,SAAK,QAAQ;AACb,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,CAAC,cAAsB;AACnC,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,uBAAuB,OAAO,WAAwF;AAClH,QAAI,CAAC,KAAK,IAAI;AACV,WAAK,eAAe,6BAA6B;AACjD,WAAK,KAAK;AAEV,WAAK,eAAe,iCAAiC;AACrD,WAAK,WAAW;AAEhB,WAAK,eAAe,kCAAkC;AACtD,WAAK,eAAA;AAAA,IACT,OAAO;AACH,YAAM,eAAgB,KAAK,aAAa,OAAO,gEAAgE;AAC/G,WAAK,gBAAgB,YAAY;AACjC,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,sBAAsB,YAAiF;AAEnG,QAAI,CAAC,KAAK,WAAW;AACjB,YAAM,eAAe;AACrB,WAAK,gBAAgB,YAAY;AACjC,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AAEA,QAAI,CAAC,KAAK,IAAI;AACV,UAAI,CAAC,KAAK,YAAY;AAClB,cAAM,eAAe;AACrB,aAAK,gBAAgB,YAAY;AACjC,cAAM,IAAI,MAAM,YAAY;AAAA,MAChC;AAEA,WAAK,gBAAgB,iCAAiC;AACtD,WAAK,WAAW;AAEhB,WAAK,gBAAgB,4CAA4C;AACjE,YAAM,UAAkC;AAAA,QACpC,YAAY,CAAE,WAAY;AAAA;AAAA,MAAA;AAG9B,UAAI,KAAK,8BAA8B,KAAK,+BAA+B,IAAI;AAC3E,aAAK,cAAc,IAAI,MAAM,KAAK,0BAA0B;AAC5D,aAAK,gBAAgB,oDAAoD,KAAK,0BAA0B,GAAG;AAC3G,gBAAQ,UAAU,cAAc,KAAK,WAAW;AAAA,MACpD,WAAW,KAAK,qBAAqB,KAAK,sBAAsB,MAAM;AAClE,aAAK,gBAAgB,uCAAuC;AAC5D,gBAAQ,UAAUC,gBAAA;AAAA,MACtB;AAEA,UAAI,KAAK,sBAAsB,KAAK,mBAAmB,cAAc,EAAE,MAAM,GAAG;AAC5E,aAAK,gBAAgB,uCAAuC,KAAK,kBAAkB,GAAG;AACtF,gBAAQ,OAAO,KAAK;AAAA,MACxB;AAEA,WAAK,gBAAgB,6CAA6C,KAAK,UAAU,GAAG;AACpF,WAAK,KAAK,IAAI,OAAO,KAAK,YAAY,OAAO;AAE7C,WAAK,gBAAgB,kCAAkC;AACvD,WAAK,gBAAA;AAEL,WAAK,gBAAgB,6BAA6B;AAClD,YAAM,MAAM,GAAG;AACf,WAAK,gBAAgB,8BAA8B;AAEnD,WAAK,eAAe,kCAAkC;AACtD,WAAK,WAAW;AAEhB,WAAK,eAAe,iCAAiC;AACrD,WAAK,eAAA;AAAA,IAET,OAAO;AACH,YAAM,eAAgB,KAAK,aAAa,OAAO,+DAA+D;AAC9G,WAAK,gBAAgB,YAAY;AACjC,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,uBAAuB,YAA2B;AAC9C,QAAI,KAAK,IAAI;AACT,UAAI,KAAK,aAAa,MAAM;AACxB,aAAK,eAAe,iCAAiC;AACrD,cAAM,KAAK,cAAA;AACX,aAAK,KAAK;AACV,aAAK,eAAe,kCAAkC;AACtD,aAAK,WAAW;AAAA,MACpB,OAAO;AACH,cAAM,eAAe;AACrB,aAAK,gBAAgB,YAAY;AACjC,cAAM,IAAI,MAAM,YAAY;AAAA,MAChC;AAAA,IACJ,OAAO;AACH,YAAM,eAAe;AACrB,WAAK,gBAAgB,YAAY;AACjC,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,qBAAqB,YAAY;AAC7B,QAAI,KAAK,IAAI;AACT,UAAI,KAAK,aAAa,OAAO;AAEzB,aAAK,eAAe,+BAA+B;AACnD,aAAK,WAAW;AAEhB,aAAK,eAAe,+BAA+B;AACnD,cAAM,KAAK,cAAA;AAEX,aAAK,eAAe,0CAA0C;AAC9D,cAAM,KAAK,GAAG,GAAG,GAAG,EAAE,QAAQ,MAAA;AAE9B,YAAI,KAAK,aAAa;AAClB,eAAK,eAAe,wCAAwC;AAC5D,gBAAM,KAAK,YAAY,WAAA;AACvB,eAAK,eAAe,sDAAsD;AAC1E,gBAAM,MAAM,EAAE;AACd,eAAK,eAAe,wDAAwD;AAAA,QAChF;AAGA,aAAK,eAAe,sCAAsC;AAC1D,aAAK,GAAG,kBAAA;AAGR,aAAK,eAAe,0BAA0B;AAC9C,aAAK,GAAG,MAAA;AAER,aAAK,eAAe,8BAA8B;AAClD,aAAK,KAAK;AAAA,MACd,OAAO;AACH,cAAM,eAAe;AACrB,aAAK,gBAAgB,YAAY;AACjC,cAAM,IAAI,MAAM,YAAY;AAAA,MAChC;AAAA,IACJ,OAAO;AACH,YAAM,eAAe;AACrB,WAAK,gBAAgB,YAAY;AACjC,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,YAAY,CAAC,QAAyB,SAAuB;AACzD,SAAK,gBAAgB,8BAA8B,IAAI,GAAG;AAC1D,WAAO,MAAM,IAAI;AAAA,EACrB;AAAA,EAEA,WAAW,CAAC,QAAyB,SAAuB;AACxD,SAAK,gBAAgB,oCAAoC,IAAI,WAAW,OAAO,EAAE,GAAG;AACpF,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEU,gBAAgB,YAAW;AACjC,SAAK,eAAe,wCAAwC;AAC5D,UAAM,KAAK,uBAAA;AAEX,SAAK,eAAe,4CAA4C;AAChE,SAAK,2BAAA;AAAA,EACT;AAAA,EAEU,sBAAsB,CAAC,WAAkC;AAC/D,WAAO,GAAG,cAAc,CAAC,WAAmB;AACxC,WAAK,gBAAgB,kDAAkD,OAAO,EAAE,eAAe,MAAM,GAAG;AAAA,IAC5G,CAAC;AAED,WAAO,GAAG,iBAAiB,CAAC,WAAmB;AAC3C,WAAK,gBAAgB,qDAAqD,OAAO,EAAE,eAAe,MAAM,GAAG;AAAA,IAC/G,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,UAAiB;AACjC,WAAK,gBAAgB,6CAA6C,OAAO,EAAE,cAAc,KAAK,GAAG;AAAA,IACrG,CAAC;AAED,WAAO,GAAG,mBAAmB,CAAC,WAAmB;AAC7C,WAAK,gBAAgB,mEAAmE,OAAO,EAAE,eAAe,MAAM,GAAG;AAAA,IAC7H,CAAC;AAED,WAAO,GAAG,sBAAsB,CAAC,QAAQ,mBAAmB;AACxD,WAAK,gBAAgB,yEAAyE,OAAO,EAAE,eAAe,MAAM,GAAG;AAC/H,qBAAe,wCAAwC;AAAA,IAC3D,CAAC;AAED,WAAO,GAAG,iBAAiB,CAAC,UAA0B;AAClD,YAAM,QAAQ,CAAC,SAAS;AACpB,aAAK,gBAAgB,gDAAgD,IAAI,eAAe,OAAO,EAAE,GAAG;AACpG,aAAK,SAAS,QAAQ,IAAI;AAAA,MAC9B,CAAC;AAAA,IACL,CAAC;AAED,WAAO,GAAG,kBAAkB,CAAC,UAA0B;AACnD,YAAM,QAAQ,CAAC,SAAS;AACpB,aAAK,gBAAgB,iDAAiD,IAAI,eAAe,OAAO,EAAE,GAAG;AACrG,aAAK,UAAU,QAAQ,IAAI;AAAA,MAC/B,CAAC;AAAA,IACL,CAAC;AAED,WAAO,GAAG,mBAAmB,CAAC,OAAiB,YAA4D;AACvG,YAAM,QAAQ,CAAC,SAAS;AACpB,YAAI,KAAK,mBAAmB;AACxB,eAAK,gBAAgB,uEAAuE,IAAI,WAAW,OAAO,EAAE,gBAAgB,QAAQ,OAAO,GAAG;AACtJ,eAAK,kBAAkB,GAAG,IAAI,EAAE,KAAK,QAAQ,SAAgB,OAAO;AAAA,QACxE;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAED,WAAO,GAAG,+BAA+B,CAAC,MAAc,SAAiB,SAAmD,OAAyC;AACjK,UAAI,KAAK,mBAAmB;AACxB,aAAK,gBAAgB,mFAAmF,IAAI,WAAW,OAAO,EAAE,gBAAgB,OAAO,gBAAgB,QAAQ,OAAO,GAAG;AACzL,aAAK,kBAAkB,GAAG,IAAI,EAAE,QAAQ,OAAO,EAAE,KAAK,QAAQ,SAAgB,SAAS,CAAC,KAAY,iBAA+B;AAC/H,cAAI,KAAK;AACL,oBAAQ,MAAM,GAAG;AACjB,kBAAM,gBAAgB;AAAA,cAClB,OAAO;AAAA,cACP,WAAW,IAAI;AAAA,cACf,cAAc,IAAI;AAAA;AAAA;AAAA,YAAA;AAItB,iBAAK,gBAAgB,0EAA0E,KAAK,UAAU,aAAa,CAAC,GAAG;AAC/H,eAAG,aAAa;AAAA,UACpB,OAAO;AACH,iBAAK,gBAAgB,kEAAkE,KAAK,UAAU,YAAY,CAAC,GAAG;AACtH,eAAG,YAAY;AAAA,UACnB;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AAED,WAAO,GAAG,gCAAgC,CAAC,OAAiB,SAAiB,SAAmD,OAAyC;AACrK,YAAM,YAAmB,CAAA;AAEzB,YAAM,qBAAqB,WAAW,MAAM;AAExC,kBAAU,KAAK;AAAA,UACX,MAAM;AAAA,UACN,WAAW;AAAA,YACP,OAAO;AAAA,YACP,WAAW;AAAA,YACX,cAAc,0CAA0C,OAAO;AAAA,UAAA;AAAA,QACnE,CACH;AACD,WAAG,SAAS;AAAA,MAChB,GAAG,OAAO,EAAE,MAAA;AAEZ,YAAM,QAAQ,CAAC,SAAS;AACpB,YAAI,KAAK,mBAAmB;AACxB,eAAK,gBAAgB,oFAAoF,IAAI,WAAW,OAAO,EAAE,gBAAgB,OAAO,gBAAgB,QAAQ,OAAO,GAAG;AAC1L,eAAK,kBAAkB,GAAG,IAAI,EAAE,QAAQ,OAAO,EAAE,KAAK,QAAQ,SAAgB,SAAS,CAAC,KAAY,iBAA+B;AAC/H,gBAAI,KAAK;AACL,sBAAQ,MAAM,GAAG;AACjB,oBAAM,gBAAgB;AAAA,gBAClB,OAAO;AAAA,gBACP,WAAW,IAAI;AAAA,gBACf,cAAc,IAAI;AAAA;AAAA;AAAA,cAAA;AAItB,mBAAK,gBAAgB,0EAA0E,KAAK,UAAU,aAAa,CAAC,GAAG;AAC/H,wBAAU,KAAK;AAAA,gBACX;AAAA,gBACA,WAAW;AAAA,cAAA,CACd;AAAA,YACL,OAAO;AACH,mBAAK,gBAAgB,kEAAkE,KAAK,UAAU,YAAY,CAAC,GAAG;AACtH,wBAAU,KAAK;AAAA,gBACX;AAAA,gBACA,WAAW;AAAA,cAAA,CACd;AAAA,YACL;AACA,gBAAI,UAAU,WAAW,MAAM,QAAQ;AACnC,2BAAa,kBAAkB;AAC/B,mBAAK,gBAAgB,mGAAmG,UAAU,MAAM,+BAA+B;AACvK,iBAAG,SAAS;AAAA,YAChB;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA,EAEU,yCAAyC,MAAY;AAC3D,QAAI,KAAK,mBAAmB;AACxB,WAAK,kBAAkB,IAAI,CAAC,QAAQ,SAAS;AACzC,YAAI,KAAK,aAAa,MAAM;AACxB,eAAK,IAAI,MAAM,2GAA2G,CAAC;AAAA,QAC/H,OAAO;AACH,eAAA;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEU,iBAAiB,MAAkE;AAEzF,QAAI,KAAK,IAAI;AACT,WAAK,gBAAgB,iDAAiD,KAAK,SAAS,IAAI;AACxF,WAAK,oBAAoB,KAAK,GAAG,GAAG,IAAI,KAAK,SAAS,GAAG;AAEzD,WAAK,gBAAgB,4DAA4D;AACjF,WAAK,uCAAA;AAEL,WAAK,gBAAgB,+CAA+C;AACpE,WAAK,0BAAA;AAEL,WAAK,kBAAkB,GAAG,cAAc,CAAA,WAAU;AAC9C,aAAK,gBAAgB,4CAA4C,OAAO,EAAE,GAAG;AAC7E,aAAK,gBAAgB,uDAAuD,KAAK,UAAU,OAAO,UAAU,IAAI,CAAC,GAAG;AACpH,aAAK,gBAAgB,uDAAuD,KAAK,UAAU,OAAO,UAAU,QAAQ,IAAI,CAAC,GAAG;AAC5H,aAAK,gBAAgB,sDAAsD,KAAK,UAAU,OAAO,UAAU,GAAG,CAAC,GAAG;AAClH,aAAK,gBAAgB,gDAAgD,KAAK,UAAU,OAAO,SAAS,CAAC,GAAG;AAExG,aAAK,gBAAgB,wDAAwD,OAAO,EAAE,GAAG;AACzF,aAAK,uBAAuB,MAAM;AAElC,YAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACrC,eAAK,MAAM,IAAI,CAAC,SAAS;AACrB,iBAAK,gBAAgB,oCAAoC,IAAI,eAAe,OAAO,EAAE,GAAG;AACxF,iBAAK,SAAS,QAAQ,IAAI;AAAA,UAC9B,CAAC;AAAA,QACL;AAEA,aAAK,gBAAgB,mDAAmD,OAAO,EAAE,GAAG;AACpF,aAAK,oBAAoB,MAAM;AAE/B,mBAAW,MAAM;AACb,eAAK,gBAAgB,uDAAuD,OAAO,EAAE,GAAG;AACxF,eAAK,sBAAsB,MAAM;AAAA,QACrC,GAAG,CAAC;AAEJ,aAAK,gBAAgB,sDAAsD,OAAO,EAAE,GAAG;AACvF,aAAK,qBAAqB,MAAM;AAAA,MACpC,CAAC;AAAA,IACL,OAAO;AACH,YAAM,eAAe;AACrB,WAAK,gBAAgB,YAAY;AACjC,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AAEA,WAAO;AAAA,EACX;AAAA,EAEU,yBAAyB,YAA2B;AAC1D,QAAI,KAAK,mBAAmB;AACxB,WAAK,gBAAgB,kEAAkE;AACvF,YAAM,KAAK,kBAAkB,QAAQ,MAAA;AAAA,IACzC;AAAA,EACJ;AAAA,EAEU,6BAA6B,MAAY;AAC/C,QAAI,KAAK,mBAAmB;AACxB,WAAK,gBAAgB,0EAA0E;AAC/F,WAAK,kBAAkB,kBAAA;AACvB,WAAK,oBAAoB;AAAA,IAC7B;AAAA,EACJ;AACJ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stssocketioutils",
3
- "version": "2.0.14",
3
+ "version": "2.0.16",
4
4
  "description": "STS Socket.IO Utils",
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.cjs",
@@ -48,7 +48,7 @@
48
48
  },
49
49
  "homepage": "https://github.com/nsshunt/stssocketioutils#readme",
50
50
  "devDependencies": {
51
- "@nsshunt/stsconfig": "^1.27.41",
51
+ "@nsshunt/stsconfig": "^1.27.43",
52
52
  "@types/detect-node": "^2.0.2",
53
53
  "@typescript-eslint/eslint-plugin": "^8.54.0",
54
54
  "@typescript-eslint/parser": "^8.54.0",
@@ -60,7 +60,7 @@
60
60
  "vitest": "^4.0.18"
61
61
  },
62
62
  "dependencies": {
63
- "@nsshunt/stsutils": "^1.19.71",
63
+ "@nsshunt/stsutils": "^1.19.73",
64
64
  "@socket.io/cluster-adapter": "^0.3.0",
65
65
  "@socket.io/redis-streams-adapter": "^0.2.3",
66
66
  "chalk": "^4.1.2",