@pandorajs/hub
Version:
pandora.js messenge hub
93 lines • 2.98 kB
JavaScript
;
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