'use strict'; const websocketDeduplicator = require("./deduplicator"); const findAndSplice = require("../find-and-splice"); module.exports = function(options) { let deduplicator, externalDeduplicatorProvided; if (options.deduplicator != null) { deduplicator = options.deduplicator; externalDeduplicatorProvided = true; } else { deduplicator = websocketDeduplicator(); externalDeduplicatorProvided = false; } if (options.namespaced) { let clients = {}; return { add: function addClient(namespace, client) { if (clients[namespace] == null) { clients[namespace] = []; } clients[namespace].push(client); }, remove: function removeClient(client) { Object.keys(clients).forEach((namespace) => { this.removeFromNamespace(namespace, client); }); if (externalDeduplicatorProvided === false) { deduplicator.forgetClient(client); } }, removeFromNamespace: function removeClientFromNamespace(namespace, client) { findAndSplice(clients[namespace], client); }, emit: function emit(namespace, data) { let namespacedClients = clients[namespace]; if (namespacedClients != null) { namespacedClients.forEach((client) => { deduplicator(client, data, () => { client.send(JSON.stringify(data)); }); }); } } } } else { let clients = []; return { add: function addClient(client) { clients.push(client); }, remove: function removeClient(client) { findAndSplice(clients, client); }, emit: function emit(data) { clients.forEach((client) => { deduplicator(client, data, () => { client.send(JSON.stringify(data)); }); }); } } } }