"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Adapter = void 0; const events_1 = require("events"); class Adapter extends events_1.EventEmitter { /** * In-memory adapter constructor. * * @param {Namespace} nsp */ constructor(nsp) { super(); this.nsp = nsp; this.rooms = new Map(); this.sids = new Map(); this.encoder = nsp.server.encoder; } /** * To be overridden */ init() { } /** * To be overridden */ close() { } /** * Adds a socket to a list of room. * * @param {SocketId} id the socket id * @param {Set} rooms a set of rooms * @public */ addAll(id, rooms) { if (!this.sids.has(id)) { this.sids.set(id, new Set()); } for (const room of rooms) { this.sids.get(id).add(room); if (!this.rooms.has(room)) { this.rooms.set(room, new Set()); this.emit("create-room", room); } if (!this.rooms.get(room).has(id)) { this.rooms.get(room).add(id); this.emit("join-room", room, id); } } } /** * Removes a socket from a room. * * @param {SocketId} id the socket id * @param {Room} room the room name */ del(id, room) { if (this.sids.has(id)) { this.sids.get(id).delete(room); } this._del(room, id); } _del(room, id) { if (this.rooms.has(room)) { const deleted = this.rooms.get(room).delete(id); if (deleted) { this.emit("leave-room", room, id); } if (this.rooms.get(room).size === 0) { this.rooms.delete(room); this.emit("delete-room", room); } } } /** * Removes a socket from all rooms it's joined. * * @param {SocketId} id the socket id */ delAll(id) { if (!this.sids.has(id)) { return; } for (const room of this.sids.get(id)) { this._del(room, id); } this.sids.delete(id); } /** * Broadcasts a packet. * * Options: * - `flags` {Object} flags for this packet * - `except` {Array} sids that should be excluded * - `rooms` {Array} list of rooms to broadcast to * * @param {Object} packet the packet object * @param {Object} opts the options * @public */ broadcast(packet, opts) { const rooms = opts.rooms; const except = opts.except || new Set(); const flags = opts.flags || {}; const packetOpts = { preEncoded: true, volatile: flags.volatile, compress: flags.compress }; const ids = new Set(); packet.nsp = this.nsp.name; const encodedPackets = this.encoder.encode(packet); if (rooms.size) { for (const room of rooms) { if (!this.rooms.has(room)) continue; for (const id of this.rooms.get(room)) { if (ids.has(id) || except.has(id)) continue; const socket = this.nsp.sockets.get(id); if (socket) { socket.packet(encodedPackets, packetOpts); ids.add(id); } } } } else { for (const [id] of this.sids) { if (except.has(id)) continue; const socket = this.nsp.sockets.get(id); if (socket) socket.packet(encodedPackets, packetOpts); } } } /** * Gets a list of sockets by sid. * * @param {Set} rooms the explicit set of rooms to check. */ sockets(rooms) { const sids = new Set(); if (rooms.size) { for (const room of rooms) { if (!this.rooms.has(room)) continue; for (const id of this.rooms.get(room)) { if (this.nsp.sockets.has(id)) { sids.add(id); } } } } else { for (const [id] of this.sids) { if (this.nsp.sockets.has(id)) sids.add(id); } } return Promise.resolve(sids); } /** * Gets the list of rooms a given socket has joined. * * @param {SocketId} id the socket id */ socketRooms(id) { return this.sids.get(id); } } exports.Adapter = Adapter;