"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ParentNamespace = void 0; const namespace_1 = require("./namespace"); const debug_1 = __importDefault(require("debug")); const debug = (0, debug_1.default)("socket.io:parent-namespace"); /** * A parent namespace is a special {@link Namespace} that holds a list of child namespaces which were created either * with a regular expression or with a function. * * @example * const parentNamespace = io.of(/\/dynamic-\d+/); * * parentNamespace.on("connection", (socket) => { * const childNamespace = socket.nsp; * } * * // will reach all the clients that are in one of the child namespaces, like "/dynamic-101" * parentNamespace.emit("hello", "world"); * */ class ParentNamespace extends namespace_1.Namespace { constructor(server) { super(server, "/_" + ParentNamespace.count++); this.children = new Set(); } /** * @private */ _initAdapter() { const broadcast = (packet, opts) => { this.children.forEach((nsp) => { nsp.adapter.broadcast(packet, opts); }); }; // @ts-ignore FIXME is there a way to declare an inner class in TypeScript? this.adapter = { broadcast }; } emit(ev, ...args) { this.children.forEach((nsp) => { nsp.emit(ev, ...args); }); return true; } createChild(name) { debug("creating child namespace %s", name); const namespace = new namespace_1.Namespace(this.server, name); namespace._fns = this._fns.slice(0); this.listeners("connect").forEach((listener) => namespace.on("connect", listener)); this.listeners("connection").forEach((listener) => namespace.on("connection", listener)); this.children.add(namespace); if (this.server._opts.cleanupEmptyChildNamespaces) { const remove = namespace._remove; namespace._remove = (socket) => { remove.call(namespace, socket); if (namespace.sockets.size === 0) { debug("closing child namespace %s", name); namespace.adapter.close(); this.server._nsps.delete(namespace.name); this.children.delete(namespace); } }; } this.server._nsps.set(name, namespace); // @ts-ignore this.server.sockets.emitReserved("new_namespace", namespace); return namespace; } fetchSockets() { // note: we could make the fetchSockets() method work for dynamic namespaces created with a regex (by sending the // regex to the other Socket.IO servers, and returning the sockets of each matching namespace for example), but // the behavior for namespaces created with a function is less clear // noteĀ²: we cannot loop over each children namespace, because with multiple Socket.IO servers, a given namespace // may exist on one node but not exist on another (since it is created upon client connection) throw new Error("fetchSockets() is not supported on parent namespaces"); } } exports.ParentNamespace = ParentNamespace; ParentNamespace.count = 0;