UNPKG

@pandorajs/hub

Version:

pandora.js messenge hub

93 lines 2.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RouteTable = void 0; const SelectorUtils_1 = require("./SelectorUtils"); const util_1 = require("util"); // TODO: Increase performance /** * RouteTable */ class RouteTable { constructor() { this.mapClientToSelector = new Map(); } /** * Save a relation between Client and Selector * @param {MessengerClient} client * @param {Selector} selector */ setRelation(client, selector) { if (!selector) { throw new Error(util_1.format('Selector is required, but got %j', selector)); } if (!this.mapClientToSelector.has(client)) { this.mapClientToSelector.set(client, []); } const selectors = this.mapClientToSelector.get(client); selectors.push(selector); } /** * Forget a relation between Client and Selector * @param {MessengerClient} client * @param {Selector} selector */ forgetRelation(client, selector) { if (!this.mapClientToSelector.has(client)) { throw new Error('Can not found client when forgetRelation()'); } const targetSelectors = this.mapClientToSelector.get(client); const filteredSelectors = []; for (const targetSelector of targetSelectors) { if (!SelectorUtils_1.SelectorUtils.match(selector, targetSelector)) { filteredSelectors.push(targetSelector); } } if (!filteredSelectors.length) { this.mapClientToSelector.delete(client); return; } this.mapClientToSelector.set(client, filteredSelectors); } /** * Forget a Client and all Selectors belong with it * @param {MessengerClient} client */ forgetClient(client) { this.mapClientToSelector.delete(client); } /** * Select clients by Selector * @param {Selector} selector * @return {Array<SelectedInfo>} */ selectClients(selector) { const selectedClients = []; for (const [client, targetSelectors] of this.mapClientToSelector) { for (const targetSelector of targetSelectors) { const found = SelectorUtils_1.SelectorUtils.match(selector, targetSelector); if (found) { selectedClients.push({ client: client, targetSelectors }); break; } } } return selectedClients; } /** * Get all Clients * @return {MessengerClient[]} */ getAllClients() { return Array.from(this.mapClientToSelector.keys()); } /** * Get all Selectors of a certain Client * @param {MessengerClient} client * @return {Selector[]} */ getSelectorsByClient(client) { return this.mapClientToSelector.get(client); } } exports.RouteTable = RouteTable; //# sourceMappingURL=RouteTable.js.map