| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 | "use strict";var __importDefault = (this && this.__importDefault) || function (mod) {    return (mod && mod.__esModule) ? mod : { "default": mod };};Object.defineProperty(exports, "__esModule", { value: true });exports.Namespace = exports.RESERVED_EVENTS = void 0;const socket_1 = require("./socket");const typed_events_1 = require("./typed-events");const debug_1 = __importDefault(require("debug"));const broadcast_operator_1 = require("./broadcast-operator");const debug = (0, debug_1.default)("socket.io:namespace");exports.RESERVED_EVENTS = new Set(["connect", "connection", "new_namespace"]);class Namespace extends typed_events_1.StrictEventEmitter {    /**     * Namespace constructor.     *     * @param server instance     * @param name     */    constructor(server, name) {        super();        this.sockets = new Map();        /** @private */        this._fns = [];        /** @private */        this._ids = 0;        this.server = server;        this.name = name;        this._initAdapter();    }    /**     * Initializes the `Adapter` for this nsp.     * Run upon changing adapter by `Server#adapter`     * in addition to the constructor.     *     * @private     */    _initAdapter() {        // @ts-ignore        this.adapter = new (this.server.adapter())(this);    }    /**     * Sets up namespace middleware.     *     * @return self     * @public     */    use(fn) {        this._fns.push(fn);        return this;    }    /**     * Executes the middleware for an incoming client.     *     * @param socket - the socket that will get added     * @param fn - last fn call in the middleware     * @private     */    run(socket, fn) {        const fns = this._fns.slice(0);        if (!fns.length)            return fn(null);        function run(i) {            fns[i](socket, function (err) {                // upon error, short-circuit                if (err)                    return fn(err);                // if no middleware left, summon callback                if (!fns[i + 1])                    return fn(null);                // go on to next                run(i + 1);            });        }        run(0);    }    /**     * Targets a room when emitting.     *     * @param room     * @return self     * @public     */    to(room) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).to(room);    }    /**     * Targets a room when emitting.     *     * @param room     * @return self     * @public     */    in(room) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).in(room);    }    /**     * Excludes a room when emitting.     *     * @param room     * @return self     * @public     */    except(room) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).except(room);    }    /**     * Adds a new client.     *     * @return {Socket}     * @private     */    _add(client, query, fn) {        debug("adding socket to nsp %s", this.name);        const socket = new socket_1.Socket(this, client, query);        this.run(socket, (err) => {            process.nextTick(() => {                if ("open" == client.conn.readyState) {                    if (err) {                        if (client.conn.protocol === 3) {                            return socket._error(err.data || err.message);                        }                        else {                            return socket._error({                                message: err.message,                                data: err.data,                            });                        }                    }                    // track socket                    this.sockets.set(socket.id, socket);                    // it's paramount that the internal `onconnect` logic                    // fires before user-set events to prevent state order                    // violations (such as a disconnection before the connection                    // logic is complete)                    socket._onconnect();                    if (fn)                        fn();                    // fire user-set events                    this.emitReserved("connect", socket);                    this.emitReserved("connection", socket);                }                else {                    debug("next called after client was closed - ignoring socket");                }            });        });        return socket;    }    /**     * Removes a client. Called by each `Socket`.     *     * @private     */    _remove(socket) {        if (this.sockets.has(socket.id)) {            this.sockets.delete(socket.id);        }        else {            debug("ignoring remove for %s", socket.id);        }    }    /**     * Emits to all clients.     *     * @return Always true     * @public     */    emit(ev, ...args) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).emit(ev, ...args);    }    /**     * Sends a `message` event to all clients.     *     * @return self     * @public     */    send(...args) {        this.emit("message", ...args);        return this;    }    /**     * Sends a `message` event to all clients.     *     * @return self     * @public     */    write(...args) {        this.emit("message", ...args);        return this;    }    /**     * Emit a packet to other Socket.IO servers     *     * @param ev - the event name     * @param args - an array of arguments, which may include an acknowledgement callback at the end     * @public     */    serverSideEmit(ev, ...args) {        if (exports.RESERVED_EVENTS.has(ev)) {            throw new Error(`"${ev}" is a reserved event name`);        }        args.unshift(ev);        this.adapter.serverSideEmit(args);        return true;    }    /**     * Called when a packet is received from another Socket.IO server     *     * @param args - an array of arguments, which may include an acknowledgement callback at the end     *     * @private     */    _onServerSideEmit(args) {        super.emitUntyped.apply(this, args);    }    /**     * Gets a list of clients.     *     * @return self     * @public     */    allSockets() {        return new broadcast_operator_1.BroadcastOperator(this.adapter).allSockets();    }    /**     * Sets the compress flag.     *     * @param compress - if `true`, compresses the sending data     * @return self     * @public     */    compress(compress) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).compress(compress);    }    /**     * Sets a modifier for a subsequent event emission that the event data may be lost if the client is not ready to     * receive messages (because of network slowness or other issues, or because they’re connected through long polling     * and is in the middle of a request-response cycle).     *     * @return self     * @public     */    get volatile() {        return new broadcast_operator_1.BroadcastOperator(this.adapter).volatile;    }    /**     * Sets a modifier for a subsequent event emission that the event data will only be broadcast to the current node.     *     * @return self     * @public     */    get local() {        return new broadcast_operator_1.BroadcastOperator(this.adapter).local;    }    /**     * Adds a timeout in milliseconds for the next operation     *     * <pre><code>     *     * io.timeout(1000).emit("some-event", (err, responses) => {     *   // ...     * });     *     * </pre></code>     *     * @param timeout     */    timeout(timeout) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).timeout(timeout);    }    /**     * Returns the matching socket instances     *     * @public     */    fetchSockets() {        return new broadcast_operator_1.BroadcastOperator(this.adapter).fetchSockets();    }    /**     * Makes the matching socket instances join the specified rooms     *     * @param room     * @public     */    socketsJoin(room) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).socketsJoin(room);    }    /**     * Makes the matching socket instances leave the specified rooms     *     * @param room     * @public     */    socketsLeave(room) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).socketsLeave(room);    }    /**     * Makes the matching socket instances disconnect     *     * @param close - whether to close the underlying connection     * @public     */    disconnectSockets(close = false) {        return new broadcast_operator_1.BroadcastOperator(this.adapter).disconnectSockets(close);    }}exports.Namespace = Namespace;
 |