@nsshunt/stssocketioutils 1.1.39 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,10 @@
1
1
  import { io } from "socket.io-client";
2
+ import { Sleep } from "@nsshunt/stsutils";
3
+ import { Server } from "socket.io";
4
+ import { Redis } from "ioredis";
5
+ import require$$0 from "node:cluster";
6
+ import require$$1 from "socket.io-adapter";
7
+ import { createAdapter } from "@socket.io/redis-streams-adapter";
2
8
  var STSNamespace = /* @__PURE__ */ ((STSNamespace2) => {
3
9
  STSNamespace2["STSMonitor"] = "stsinstrumentmanager/stsmonitor";
4
10
  STSNamespace2["STSControl"] = "stsinstrumentmanager/stscontrol";
@@ -113,15 +119,6 @@ class SocketIoClient {
113
119
  throw new Error("SocketIoClient:emit(): Error: [socket instance not defined.]");
114
120
  }
115
121
  }
116
- /*
117
- SetupClientSideSocket(name: string, address: string, socketIoCustomPath: string): SocketIoClient<ServerToClientEvents, ClientToServerEvents> {
118
- this.#name = name;
119
- this.#address = address;
120
- this.#socketIoCustomPath = socketIoCustomPath;
121
- this.#EstablishSocketConnect(name, socketIoCustomPath);
122
- return this;
123
- }
124
- */
125
122
  #EstablishSocketConnect() {
126
123
  if (this.#socket !== void 0) {
127
124
  if (this.#socket.connected === true) {
@@ -233,132 +230,823 @@ class SocketIoClient {
233
230
  });
234
231
  }
235
232
  }
236
- class SocketIoServerHelper {
237
- #socketIoServerHelperOptions;
238
- #namespace = {};
239
- constructor(options) {
240
- this.#socketIoServerHelperOptions = options;
241
- }
242
- LogMessage(namespace, message) {
243
- if (namespace) {
244
- this.#socketIoServerHelperOptions.logger.debug(`${namespace.namespace}: ${message}`);
245
- } else {
246
- this.#socketIoServerHelperOptions.logger.debug(`${message}`);
233
+ var dist = {};
234
+ var browser = { exports: {} };
235
+ var ms;
236
+ var hasRequiredMs;
237
+ function requireMs() {
238
+ if (hasRequiredMs) return ms;
239
+ hasRequiredMs = 1;
240
+ var s = 1e3;
241
+ var m = s * 60;
242
+ var h = m * 60;
243
+ var d = h * 24;
244
+ var w = d * 7;
245
+ var y = d * 365.25;
246
+ ms = function(val, options) {
247
+ options = options || {};
248
+ var type = typeof val;
249
+ if (type === "string" && val.length > 0) {
250
+ return parse(val);
251
+ } else if (type === "number" && isFinite(val)) {
252
+ return options.long ? fmtLong(val) : fmtShort(val);
253
+ }
254
+ throw new Error(
255
+ "val is not a non-empty string or a valid number. val=" + JSON.stringify(val)
256
+ );
257
+ };
258
+ function parse(str) {
259
+ str = String(str);
260
+ if (str.length > 100) {
261
+ return;
262
+ }
263
+ var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
264
+ str
265
+ );
266
+ if (!match) {
267
+ return;
268
+ }
269
+ var n = parseFloat(match[1]);
270
+ var type = (match[2] || "ms").toLowerCase();
271
+ switch (type) {
272
+ case "years":
273
+ case "year":
274
+ case "yrs":
275
+ case "yr":
276
+ case "y":
277
+ return n * y;
278
+ case "weeks":
279
+ case "week":
280
+ case "w":
281
+ return n * w;
282
+ case "days":
283
+ case "day":
284
+ case "d":
285
+ return n * d;
286
+ case "hours":
287
+ case "hour":
288
+ case "hrs":
289
+ case "hr":
290
+ case "h":
291
+ return n * h;
292
+ case "minutes":
293
+ case "minute":
294
+ case "mins":
295
+ case "min":
296
+ case "m":
297
+ return n * m;
298
+ case "seconds":
299
+ case "second":
300
+ case "secs":
301
+ case "sec":
302
+ case "s":
303
+ return n * s;
304
+ case "milliseconds":
305
+ case "millisecond":
306
+ case "msecs":
307
+ case "msec":
308
+ case "ms":
309
+ return n;
310
+ default:
311
+ return void 0;
312
+ }
313
+ }
314
+ function fmtShort(ms2) {
315
+ var msAbs = Math.abs(ms2);
316
+ if (msAbs >= d) {
317
+ return Math.round(ms2 / d) + "d";
318
+ }
319
+ if (msAbs >= h) {
320
+ return Math.round(ms2 / h) + "h";
321
+ }
322
+ if (msAbs >= m) {
323
+ return Math.round(ms2 / m) + "m";
324
+ }
325
+ if (msAbs >= s) {
326
+ return Math.round(ms2 / s) + "s";
327
+ }
328
+ return ms2 + "ms";
329
+ }
330
+ function fmtLong(ms2) {
331
+ var msAbs = Math.abs(ms2);
332
+ if (msAbs >= d) {
333
+ return plural(ms2, msAbs, d, "day");
334
+ }
335
+ if (msAbs >= h) {
336
+ return plural(ms2, msAbs, h, "hour");
337
+ }
338
+ if (msAbs >= m) {
339
+ return plural(ms2, msAbs, m, "minute");
340
+ }
341
+ if (msAbs >= s) {
342
+ return plural(ms2, msAbs, s, "second");
343
+ }
344
+ return ms2 + " ms";
345
+ }
346
+ function plural(ms2, msAbs, n, name) {
347
+ var isPlural = msAbs >= n * 1.5;
348
+ return Math.round(ms2 / n) + " " + name + (isPlural ? "s" : "");
349
+ }
350
+ return ms;
351
+ }
352
+ var common;
353
+ var hasRequiredCommon;
354
+ function requireCommon() {
355
+ if (hasRequiredCommon) return common;
356
+ hasRequiredCommon = 1;
357
+ function setup(env) {
358
+ createDebug.debug = createDebug;
359
+ createDebug.default = createDebug;
360
+ createDebug.coerce = coerce;
361
+ createDebug.disable = disable;
362
+ createDebug.enable = enable;
363
+ createDebug.enabled = enabled;
364
+ createDebug.humanize = requireMs();
365
+ createDebug.destroy = destroy;
366
+ Object.keys(env).forEach((key) => {
367
+ createDebug[key] = env[key];
368
+ });
369
+ createDebug.names = [];
370
+ createDebug.skips = [];
371
+ createDebug.formatters = {};
372
+ function selectColor(namespace) {
373
+ let hash = 0;
374
+ for (let i = 0; i < namespace.length; i++) {
375
+ hash = (hash << 5) - hash + namespace.charCodeAt(i);
376
+ hash |= 0;
377
+ }
378
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
379
+ }
380
+ createDebug.selectColor = selectColor;
381
+ function createDebug(namespace) {
382
+ let prevTime;
383
+ let enableOverride = null;
384
+ let namespacesCache;
385
+ let enabledCache;
386
+ function debug(...args) {
387
+ if (!debug.enabled) {
388
+ return;
389
+ }
390
+ const self = debug;
391
+ const curr = Number(/* @__PURE__ */ new Date());
392
+ const ms2 = curr - (prevTime || curr);
393
+ self.diff = ms2;
394
+ self.prev = prevTime;
395
+ self.curr = curr;
396
+ prevTime = curr;
397
+ args[0] = createDebug.coerce(args[0]);
398
+ if (typeof args[0] !== "string") {
399
+ args.unshift("%O");
400
+ }
401
+ let index = 0;
402
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
403
+ if (match === "%%") {
404
+ return "%";
405
+ }
406
+ index++;
407
+ const formatter = createDebug.formatters[format];
408
+ if (typeof formatter === "function") {
409
+ const val = args[index];
410
+ match = formatter.call(self, val);
411
+ args.splice(index, 1);
412
+ index--;
413
+ }
414
+ return match;
415
+ });
416
+ createDebug.formatArgs.call(self, args);
417
+ const logFn = self.log || createDebug.log;
418
+ logFn.apply(self, args);
419
+ }
420
+ debug.namespace = namespace;
421
+ debug.useColors = createDebug.useColors();
422
+ debug.color = createDebug.selectColor(namespace);
423
+ debug.extend = extend;
424
+ debug.destroy = createDebug.destroy;
425
+ Object.defineProperty(debug, "enabled", {
426
+ enumerable: true,
427
+ configurable: false,
428
+ get: () => {
429
+ if (enableOverride !== null) {
430
+ return enableOverride;
431
+ }
432
+ if (namespacesCache !== createDebug.namespaces) {
433
+ namespacesCache = createDebug.namespaces;
434
+ enabledCache = createDebug.enabled(namespace);
435
+ }
436
+ return enabledCache;
437
+ },
438
+ set: (v) => {
439
+ enableOverride = v;
440
+ }
441
+ });
442
+ if (typeof createDebug.init === "function") {
443
+ createDebug.init(debug);
444
+ }
445
+ return debug;
446
+ }
447
+ function extend(namespace, delimiter) {
448
+ const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
449
+ newDebug.log = this.log;
450
+ return newDebug;
451
+ }
452
+ function enable(namespaces) {
453
+ createDebug.save(namespaces);
454
+ createDebug.namespaces = namespaces;
455
+ createDebug.names = [];
456
+ createDebug.skips = [];
457
+ const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(/\s+/g, ",").split(",").filter(Boolean);
458
+ for (const ns of split) {
459
+ if (ns[0] === "-") {
460
+ createDebug.skips.push(ns.slice(1));
461
+ } else {
462
+ createDebug.names.push(ns);
463
+ }
464
+ }
465
+ }
466
+ function matchesTemplate(search, template) {
467
+ let searchIndex = 0;
468
+ let templateIndex = 0;
469
+ let starIndex = -1;
470
+ let matchIndex = 0;
471
+ while (searchIndex < search.length) {
472
+ if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*")) {
473
+ if (template[templateIndex] === "*") {
474
+ starIndex = templateIndex;
475
+ matchIndex = searchIndex;
476
+ templateIndex++;
477
+ } else {
478
+ searchIndex++;
479
+ templateIndex++;
480
+ }
481
+ } else if (starIndex !== -1) {
482
+ templateIndex = starIndex + 1;
483
+ matchIndex++;
484
+ searchIndex = matchIndex;
485
+ } else {
486
+ return false;
487
+ }
488
+ }
489
+ while (templateIndex < template.length && template[templateIndex] === "*") {
490
+ templateIndex++;
491
+ }
492
+ return templateIndex === template.length;
493
+ }
494
+ function disable() {
495
+ const namespaces = [
496
+ ...createDebug.names,
497
+ ...createDebug.skips.map((namespace) => "-" + namespace)
498
+ ].join(",");
499
+ createDebug.enable("");
500
+ return namespaces;
501
+ }
502
+ function enabled(name) {
503
+ for (const skip of createDebug.skips) {
504
+ if (matchesTemplate(name, skip)) {
505
+ return false;
506
+ }
507
+ }
508
+ for (const ns of createDebug.names) {
509
+ if (matchesTemplate(name, ns)) {
510
+ return true;
511
+ }
512
+ }
513
+ return false;
514
+ }
515
+ function coerce(val) {
516
+ if (val instanceof Error) {
517
+ return val.stack || val.message;
518
+ }
519
+ return val;
520
+ }
521
+ function destroy() {
522
+ console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
523
+ }
524
+ createDebug.enable(createDebug.load());
525
+ return createDebug;
526
+ }
527
+ common = setup;
528
+ return common;
529
+ }
530
+ var hasRequiredBrowser;
531
+ function requireBrowser() {
532
+ if (hasRequiredBrowser) return browser.exports;
533
+ hasRequiredBrowser = 1;
534
+ (function(module, exports) {
535
+ exports.formatArgs = formatArgs;
536
+ exports.save = save;
537
+ exports.load = load;
538
+ exports.useColors = useColors;
539
+ exports.storage = localstorage();
540
+ exports.destroy = /* @__PURE__ */ (() => {
541
+ let warned = false;
542
+ return () => {
543
+ if (!warned) {
544
+ warned = true;
545
+ console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
546
+ }
547
+ };
548
+ })();
549
+ exports.colors = [
550
+ "#0000CC",
551
+ "#0000FF",
552
+ "#0033CC",
553
+ "#0033FF",
554
+ "#0066CC",
555
+ "#0066FF",
556
+ "#0099CC",
557
+ "#0099FF",
558
+ "#00CC00",
559
+ "#00CC33",
560
+ "#00CC66",
561
+ "#00CC99",
562
+ "#00CCCC",
563
+ "#00CCFF",
564
+ "#3300CC",
565
+ "#3300FF",
566
+ "#3333CC",
567
+ "#3333FF",
568
+ "#3366CC",
569
+ "#3366FF",
570
+ "#3399CC",
571
+ "#3399FF",
572
+ "#33CC00",
573
+ "#33CC33",
574
+ "#33CC66",
575
+ "#33CC99",
576
+ "#33CCCC",
577
+ "#33CCFF",
578
+ "#6600CC",
579
+ "#6600FF",
580
+ "#6633CC",
581
+ "#6633FF",
582
+ "#66CC00",
583
+ "#66CC33",
584
+ "#9900CC",
585
+ "#9900FF",
586
+ "#9933CC",
587
+ "#9933FF",
588
+ "#99CC00",
589
+ "#99CC33",
590
+ "#CC0000",
591
+ "#CC0033",
592
+ "#CC0066",
593
+ "#CC0099",
594
+ "#CC00CC",
595
+ "#CC00FF",
596
+ "#CC3300",
597
+ "#CC3333",
598
+ "#CC3366",
599
+ "#CC3399",
600
+ "#CC33CC",
601
+ "#CC33FF",
602
+ "#CC6600",
603
+ "#CC6633",
604
+ "#CC9900",
605
+ "#CC9933",
606
+ "#CCCC00",
607
+ "#CCCC33",
608
+ "#FF0000",
609
+ "#FF0033",
610
+ "#FF0066",
611
+ "#FF0099",
612
+ "#FF00CC",
613
+ "#FF00FF",
614
+ "#FF3300",
615
+ "#FF3333",
616
+ "#FF3366",
617
+ "#FF3399",
618
+ "#FF33CC",
619
+ "#FF33FF",
620
+ "#FF6600",
621
+ "#FF6633",
622
+ "#FF9900",
623
+ "#FF9933",
624
+ "#FFCC00",
625
+ "#FFCC33"
626
+ ];
627
+ function useColors() {
628
+ if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) {
629
+ return true;
630
+ }
631
+ if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
632
+ return false;
633
+ }
634
+ let m;
635
+ return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
636
+ typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
637
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
638
+ typeof navigator !== "undefined" && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
639
+ typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
640
+ }
641
+ function formatArgs(args) {
642
+ args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module.exports.humanize(this.diff);
643
+ if (!this.useColors) {
644
+ return;
645
+ }
646
+ const c = "color: " + this.color;
647
+ args.splice(1, 0, c, "color: inherit");
648
+ let index = 0;
649
+ let lastC = 0;
650
+ args[0].replace(/%[a-zA-Z%]/g, (match) => {
651
+ if (match === "%%") {
652
+ return;
653
+ }
654
+ index++;
655
+ if (match === "%c") {
656
+ lastC = index;
657
+ }
658
+ });
659
+ args.splice(lastC, 0, c);
247
660
  }
661
+ exports.log = console.debug || console.log || (() => {
662
+ });
663
+ function save(namespaces) {
664
+ try {
665
+ if (namespaces) {
666
+ exports.storage.setItem("debug", namespaces);
667
+ } else {
668
+ exports.storage.removeItem("debug");
669
+ }
670
+ } catch (error) {
671
+ }
672
+ }
673
+ function load() {
674
+ let r;
675
+ try {
676
+ r = exports.storage.getItem("debug") || exports.storage.getItem("DEBUG");
677
+ } catch (error) {
678
+ }
679
+ if (!r && typeof process !== "undefined" && "env" in process) {
680
+ r = process.env.DEBUG;
681
+ }
682
+ return r;
683
+ }
684
+ function localstorage() {
685
+ try {
686
+ return localStorage;
687
+ } catch (error) {
688
+ }
689
+ }
690
+ module.exports = requireCommon()(exports);
691
+ const { formatters } = module.exports;
692
+ formatters.j = function(v) {
693
+ try {
694
+ return JSON.stringify(v);
695
+ } catch (error) {
696
+ return "[UnexpectedJSONParseError]: " + error.message;
697
+ }
698
+ };
699
+ })(browser, browser.exports);
700
+ return browser.exports;
701
+ }
702
+ var hasRequiredDist;
703
+ function requireDist() {
704
+ if (hasRequiredDist) return dist;
705
+ hasRequiredDist = 1;
706
+ var __importDefault = dist && dist.__importDefault || function(mod) {
707
+ return mod && mod.__esModule ? mod : { "default": mod };
708
+ };
709
+ Object.defineProperty(dist, "__esModule", { value: true });
710
+ dist.NodeClusterAdapter = void 0;
711
+ dist.createAdapter = createAdapter2;
712
+ dist.setupPrimary = setupPrimary;
713
+ const node_cluster_1 = __importDefault(require$$0);
714
+ const socket_io_adapter_1 = require$$1;
715
+ const debug_1 = __importDefault(requireBrowser());
716
+ const debug = (0, debug_1.default)("socket.io-cluster-adapter");
717
+ const MESSAGE_SOURCE = "_sio_adapter";
718
+ const hasOwnProperty = Object.prototype.hasOwnProperty;
719
+ function ignoreError() {
248
720
  }
249
- LeaveRoom = (namespace, socket, room) => {
250
- this.LogMessage(namespace, `${namespace.socketionamespace.name}: Leaving room [${room}]`);
721
+ function createAdapter2(opts = {}) {
722
+ return function(nsp) {
723
+ return new NodeClusterAdapter(nsp, opts);
724
+ };
725
+ }
726
+ class NodeClusterAdapter extends socket_io_adapter_1.ClusterAdapterWithHeartbeat {
727
+ constructor(nsp, opts = {}) {
728
+ super(nsp, opts);
729
+ process.on("message", (message) => {
730
+ const isValidSource = (message === null || message === void 0 ? void 0 : message.source) === MESSAGE_SOURCE;
731
+ if (!isValidSource) {
732
+ debug("[%s] ignore unknown source", this.uid);
733
+ return;
734
+ }
735
+ if (message.nsp !== this.nsp.name) {
736
+ debug("[%s] ignore other namespace", this.uid);
737
+ return;
738
+ }
739
+ this.onMessage(message);
740
+ });
741
+ this.init();
742
+ }
743
+ doPublish(message) {
744
+ message.source = MESSAGE_SOURCE;
745
+ process.send(message, null, {}, ignoreError);
746
+ return Promise.resolve("");
747
+ }
748
+ doPublishResponse(requesterUid, response) {
749
+ response.source = MESSAGE_SOURCE;
750
+ response.requesterUid = requesterUid;
751
+ process.send(response, null, {}, ignoreError);
752
+ return Promise.resolve();
753
+ }
754
+ }
755
+ dist.NodeClusterAdapter = NodeClusterAdapter;
756
+ const UIDS = /* @__PURE__ */ Symbol("uids");
757
+ function setupPrimary() {
758
+ node_cluster_1.default.on("message", (worker, message) => {
759
+ var _a;
760
+ const isValidSource = (message === null || message === void 0 ? void 0 : message.source) === MESSAGE_SOURCE;
761
+ if (!isValidSource) {
762
+ return;
763
+ }
764
+ worker[UIDS] = worker[UIDS] || /* @__PURE__ */ new Set();
765
+ worker[UIDS].add(message.uid);
766
+ switch (message.type) {
767
+ case socket_io_adapter_1.MessageType.FETCH_SOCKETS_RESPONSE:
768
+ case socket_io_adapter_1.MessageType.SERVER_SIDE_EMIT_RESPONSE:
769
+ const requesterUid = message.requesterUid;
770
+ for (const workerId in node_cluster_1.default.workers) {
771
+ if (hasOwnProperty.call(node_cluster_1.default.workers, workerId) && ((_a = node_cluster_1.default.workers[workerId][UIDS]) === null || _a === void 0 ? void 0 : _a.has(requesterUid))) {
772
+ node_cluster_1.default.workers[workerId].send(message, null, ignoreError);
773
+ break;
774
+ }
775
+ }
776
+ break;
777
+ default:
778
+ const emitterIdAsString = String(worker.id);
779
+ for (const workerId in node_cluster_1.default.workers) {
780
+ if (hasOwnProperty.call(node_cluster_1.default.workers, workerId) && workerId !== emitterIdAsString) {
781
+ node_cluster_1.default.workers[workerId].send(message, null, ignoreError);
782
+ }
783
+ }
784
+ }
785
+ });
786
+ }
787
+ return dist;
788
+ }
789
+ var distExports = requireDist();
790
+ class SocketIoServer {
791
+ namespace;
792
+ socketionamespace;
793
+ //protected socketionamespace?: Namespace<ClientToServerEvents, ServerToClientEvents, InterServerEvents>
794
+ logger;
795
+ io;
796
+ //#redisClient: RedisClientType | Redis | null = null;
797
+ redisClient;
798
+ constructor(namespace, logger) {
799
+ this.namespace = namespace;
800
+ this.logger = logger;
801
+ }
802
+ LogErrorMessage(message) {
803
+ if (this.logger) {
804
+ this.logger.error(`${this.namespace}: ${message}`);
805
+ }
806
+ }
807
+ LogDebugMessage(message) {
808
+ if (this.logger) {
809
+ this.logger.debug(`${this.namespace}: ${message}`);
810
+ }
811
+ }
812
+ LogInfoMessage(message) {
813
+ if (this.logger) {
814
+ this.logger.info(`${this.namespace}: ${message}`);
815
+ }
816
+ }
817
+ LogWarnMessage(message) {
818
+ if (this.logger) {
819
+ this.logger.warn(`${this.namespace}: ${message}`);
820
+ }
821
+ }
822
+ // https://socket.io/docs/v4/middlewares/
823
+ // https://socket.io/docs/v4/server-socket-instance/#sockethandshake
824
+ // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares
825
+ // Use this middleward to check every incomming connection
826
+ SetupConnectionMiddleware = () => {
827
+ };
828
+ // Use this middleware to check every packet being received
829
+ SetupMessageMiddleware = (socket) => {
830
+ };
831
+ SocketConnectCallBack = (socket) => {
832
+ };
833
+ SocketEventsCallBack = (socket) => {
834
+ };
835
+ GetConfig = (socketIoServeroptions) => {
836
+ const options = {
837
+ transports: ["websocket"]
838
+ // or [ "websocket", "polling" ] (to use long-poolling. Note that the order matters)
839
+ };
840
+ if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== "") {
841
+ this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);
842
+ options.adapter = createAdapter(this.redisClient);
843
+ } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {
844
+ options.adapter = distExports.createAdapter();
845
+ }
846
+ if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare("") !== 0) {
847
+ options.path = socketIoServeroptions.wssCustomPath;
848
+ }
849
+ return options;
850
+ };
851
+ SetEngineEvents = () => {
852
+ if (this.io) {
853
+ this.io.engine.on("connection_error", (err) => {
854
+ this.LogInfoMessage(err.req);
855
+ this.LogInfoMessage(err.code);
856
+ this.LogInfoMessage(err.message);
857
+ this.LogInfoMessage(err.context);
858
+ });
859
+ }
860
+ };
861
+ StartServer = async (socketIoServeroptions) => {
862
+ if (this.io) {
863
+ throw new Error(`SocketIoServer:StartServer(): Error: [Server already exists]`);
864
+ }
865
+ if (!socketIoServeroptions.listenPort) {
866
+ throw new Error(`SocketIoServer:StartServer(): Error: [listenPort not specified]`);
867
+ }
868
+ this.io = new Server(socketIoServeroptions.listenPort, this.GetConfig(socketIoServeroptions));
869
+ this.SetEngineEvents();
870
+ await Sleep(500);
871
+ };
872
+ AttachServer = async (server, socketIoServeroptions) => {
873
+ if (this.io) {
874
+ throw new Error(`SocketIoServer:AttachServer(): Error: [Server already attached]`);
875
+ }
876
+ if (socketIoServeroptions.listenPort) {
877
+ this.LogWarnMessage(`SocketIoServer:AttachServer(): Warning: [listenPort: [${socketIoServeroptions.listenPort}] has been specified, but ignored as attaching to existing server]`);
878
+ }
879
+ this.io = new Server(server, this.GetConfig(socketIoServeroptions));
880
+ this.SetEngineEvents();
881
+ await Sleep(500);
882
+ };
883
+ StopServer = async () => {
884
+ if (this.io) {
885
+ await this.CloseNamespaceAdaptors();
886
+ this.DisconnectNamespaceSockets();
887
+ await this.io.of("/").adapter.close();
888
+ if (this.redisClient) {
889
+ await this.redisClient.disconnect();
890
+ await Sleep(50);
891
+ }
892
+ this.io.disconnectSockets();
893
+ this.io = void 0;
894
+ }
895
+ };
896
+ LeaveRoom = (socket, room) => {
897
+ this.LogDebugMessage(`Leaving room [${room}]`);
251
898
  socket.leave(room);
252
899
  };
253
- JoinRoom = (namespace, socket, room) => {
254
- this.LogMessage(namespace, `${namespace.socketionamespace.name}: Socket joining room [${room}], ID: [${socket.id}]`);
900
+ JoinRoom = (socket, room) => {
901
+ this.LogDebugMessage(`Socket joining room [${room}], ID: [${socket.id}]`);
255
902
  socket.join(room);
256
903
  };
257
- #SetupStandardEvents = (namespace, socket) => {
904
+ SetupStandardEvents = (socket) => {
258
905
  socket.on("disconnect", (reason) => {
259
- this.LogMessage(namespace, `${namespace.socketionamespace.name}: socket disconnect, ID: [${socket.id}] [${reason}]`);
906
+ this.LogDebugMessage(`socket disconnect, ID: [${socket.id}] [${reason}]`);
260
907
  });
261
908
  socket.on("disconnecting", (reason) => {
262
- this.LogMessage(namespace, `${namespace.socketionamespace.name}: socket disconnecting, ID: [${socket.id}] [${reason}]`);
909
+ this.LogDebugMessage(`socket disconnecting, ID: [${socket.id}] [${reason}]`);
263
910
  });
264
911
  socket.on("error", (error) => {
265
- this.LogMessage(namespace, `${namespace.socketionamespace.name}: socket error, ID: [${socket.id}] [${error}]`);
912
+ this.LogDebugMessage(`socket error, ID: [${socket.id}] [${error}]`);
266
913
  });
267
914
  socket.on("__STSdisconnect", (reason) => {
268
- this.LogMessage(namespace, `${namespace.socketionamespace.name}: __STSdisconnect: socket disconnect, ID: [${socket.id}] [${reason}]`);
915
+ this.LogDebugMessage(`__STSdisconnect: socket disconnect, ID: [${socket.id}] [${reason}]`);
269
916
  });
270
917
  socket.on("__STSdisconnecting", (reason, callBackResult) => {
271
- this.LogMessage(namespace, `${namespace.socketionamespace.name}: __STSdisconnecting: socket disconnecting, ID: [${socket.id}] [${reason}]`);
918
+ this.LogDebugMessage(`__STSdisconnecting: socket disconnecting, ID: [${socket.id}] [${reason}]`);
272
919
  callBackResult("__STSdisconnecting accepted by server.");
273
920
  });
274
921
  socket.on("__STSjoinRoom", (rooms) => {
275
922
  rooms.forEach((room) => {
276
- this.JoinRoom(namespace, socket, room);
923
+ this.JoinRoom(socket, room);
277
924
  });
278
925
  });
279
926
  socket.on("__STSleaveRoom", (rooms) => {
280
927
  rooms.forEach((room) => {
281
- this.LeaveRoom(namespace, socket, room);
928
+ this.LeaveRoom(socket, room);
282
929
  });
283
930
  });
284
931
  socket.on("__STSsendToRoom", (rooms, payload) => {
285
932
  rooms.forEach((room) => {
286
- this.LogMessage(namespace, `${namespace.socketionamespace.name}:socket.on:sendToRoom: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}]`);
287
- namespace.socketionamespace.to(room).emit(payload.command, payload);
933
+ if (this.socketionamespace) {
934
+ this.LogDebugMessage(`socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}]`);
935
+ this.socketionamespace.to(room).emit(payload.command, payload);
936
+ }
288
937
  });
289
938
  });
290
- };
291
- // https://socket.io/docs/v4/middlewares/
292
- // https://socket.io/docs/v4/server-socket-instance/#sockethandshake
293
- // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares
294
- // Use this middleward to check every incomming connection
295
- #SetupConnectionMiddleware = (nameSpace) => {
296
- nameSpace.socketionamespace.use((socket, next) => {
297
- {
298
- next();
939
+ socket.on("__STSsendToRoomWithCallback", (room, timeout, payload, cb) => {
940
+ if (this.socketionamespace) {
941
+ this.socketionamespace.to(room).timeout(timeout).emit(payload.command, payload, (err, dataResponse) => {
942
+ if (err) {
943
+ console.error(err);
944
+ const errorResponse = {
945
+ error: true,
946
+ errorName: err.name,
947
+ errorMessage: err.message
948
+ //errorCause: err.cause,
949
+ //errorStack: err.stack
950
+ };
951
+ this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
952
+ cb(errorResponse);
953
+ } else {
954
+ this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
955
+ cb(dataResponse);
956
+ }
957
+ });
299
958
  }
300
959
  });
301
- };
302
- // Use this middleware to check every packet being received
303
- #SetupMessageMiddleware = (socket) => {
304
- socket.use(([event, ...args], next) => {
305
- next();
960
+ socket.on("__STSsendToRoomsWithCallback", (rooms, timeout, payload, cb) => {
961
+ const responses = [];
962
+ const timeoutForComplete = setTimeout(() => {
963
+ responses.push({
964
+ room: "",
965
+ responses: {
966
+ error: true,
967
+ errorName: "timeout",
968
+ errorMessage: `__STSsendToRoomsWithCallback timeout: [${timeout}] before all responses received`
969
+ }
970
+ });
971
+ cb(responses);
972
+ }, timeout).unref();
973
+ rooms.forEach((room) => {
974
+ if (this.socketionamespace) {
975
+ this.socketionamespace.to(room).timeout(timeout).emit(payload.command, payload, (err, dataResponse) => {
976
+ if (err) {
977
+ console.error(err);
978
+ const errorResponse = {
979
+ error: true,
980
+ errorName: err.name,
981
+ errorMessage: err.message
982
+ //errorCause: err.cause,
983
+ //errorStack: err.stack
984
+ };
985
+ this.LogErrorMessage(`__STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`);
986
+ responses.push({
987
+ room,
988
+ responses: errorResponse
989
+ });
990
+ } else {
991
+ this.LogDebugMessage(`__STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`);
992
+ responses.push({
993
+ room,
994
+ responses: dataResponse
995
+ });
996
+ }
997
+ if (responses.length === rooms.length) {
998
+ clearTimeout(timeoutForComplete);
999
+ cb(responses);
1000
+ }
1001
+ });
1002
+ }
1003
+ });
306
1004
  });
307
1005
  };
308
- SetupNamespace = (io2, namespace, rooms, autoJoinRooms, socketConnectCallBack, socketEventsCallBack) => {
309
- this.#namespace[namespace] = {
310
- namespace,
311
- pid: process.pid,
312
- socketionamespace: io2.of(`/${namespace}/`)
313
- };
314
- this.#SetupConnectionMiddleware(this.#namespace[namespace]);
315
- this.#namespace[namespace].socketionamespace.on("connection", (socket) => {
316
- this.LogMessage(this.#namespace[namespace], `${namespace}: Socket connected, ID: [${socket.id}]`);
317
- this.LogMessage(this.#namespace[namespace], `${namespace}: Authentication Handshake: [${JSON.stringify(socket.handshake.auth)}]`);
318
- this.#SetupMessageMiddleware(socket);
319
- if (autoJoinRooms) {
320
- rooms.map((room) => {
321
- this.JoinRoom(this.#namespace[namespace], socket, room);
322
- });
323
- }
324
- this.#SetupStandardEvents(this.#namespace[namespace], socket);
325
- if (socketConnectCallBack) {
1006
+ SetupNamespace = (rooms, autoJoinRooms) => {
1007
+ if (this.io) {
1008
+ this.socketionamespace = this.io.of(`/${this.namespace}/`);
1009
+ this.SetupConnectionMiddleware();
1010
+ this.socketionamespace.on("connection", (socket) => {
1011
+ this.LogDebugMessage(`Socket connected, ID: [${socket.id}]`);
1012
+ this.LogDebugMessage(`Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);
1013
+ this.LogDebugMessage(`Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);
1014
+ this.LogDebugMessage(`Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);
1015
+ this.LogDebugMessage(`Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);
1016
+ this.SetupMessageMiddleware(socket);
1017
+ if (autoJoinRooms) {
1018
+ rooms.map((room) => {
1019
+ this.JoinRoom(socket, room);
1020
+ });
1021
+ }
1022
+ this.SetupStandardEvents(socket);
326
1023
  setTimeout(() => {
327
- socketConnectCallBack(socket);
1024
+ this.SocketConnectCallBack(socket);
328
1025
  }, 0);
329
- }
330
- if (socketEventsCallBack) {
331
- socketEventsCallBack(socket);
332
- }
333
- });
334
- return this.#namespace[namespace].socketionamespace;
335
- };
336
- GetSTSSocketIONamespace = (namespace) => {
337
- return this.#namespace[namespace];
338
- };
339
- GetSTSSocketIONamespaces = () => {
340
- return this.#namespace;
1026
+ this.SocketEventsCallBack(socket);
1027
+ });
1028
+ } else {
1029
+ throw new Error("SocketIoServer:SetupNamespace(): Error: [No server attached");
1030
+ }
1031
+ return this;
341
1032
  };
342
- CloseAdaptors = async () => {
343
- for (const [, namespace] of Object.entries(this.#namespace)) {
344
- await namespace.socketionamespace.adapter.close();
1033
+ CloseNamespaceAdaptors = async () => {
1034
+ if (this.socketionamespace) {
1035
+ await this.socketionamespace.adapter.close();
345
1036
  }
346
1037
  };
347
- DisconnectSockets = () => {
348
- for (const [, namespace] of Object.entries(this.#namespace)) {
349
- namespace.socketionamespace.disconnectSockets();
1038
+ DisconnectNamespaceSockets = () => {
1039
+ if (this.socketionamespace) {
1040
+ this.socketionamespace.disconnectSockets();
1041
+ this.socketionamespace = void 0;
350
1042
  }
351
- this.#namespace = {};
352
1043
  };
353
- SetupEvent(event, eventCb) {
354
- return this;
355
- }
356
1044
  }
357
1045
  export {
358
1046
  STSEvent,
359
1047
  STSNamespace,
360
1048
  STSRoom,
361
1049
  SocketIoClient,
362
- SocketIoServerHelper
1050
+ SocketIoServer
363
1051
  };
364
1052
  //# sourceMappingURL=stssocketioutils.mjs.map