| "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<Room>} 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<Room>} 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; |