pandora-hub
Version:
pandora.js messenge hub
102 lines (88 loc) • 2.74 kB
text/typescript
import {SelectedInfo, Selector} from '../domain';
import {MessengerClient} from 'pandora-messenger';
import {SelectorUtils} from './SelectorUtils';
import {format} from 'util';
// TODO: Increase performance
/**
* RouteTable
*/
export class RouteTable {
mapClientToSelector: Map<MessengerClient, Selector[]> = new Map;
/**
* Save a relation between Client and Selector
* @param {MessengerClient} client
* @param {Selector} selector
*/
setRelation(client: MessengerClient, selector: Selector) {
if(!selector) {
throw new Error(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: MessengerClient, selector: Selector) {
if(!this.mapClientToSelector.has(client)) {
throw new Error('Can not found client when forgetRelation()');
}
const targetSelectors = this.mapClientToSelector.get(client);
const filteredSelectors: Array<Selector> = [];
for(const targetSelector of targetSelectors) {
if(!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: MessengerClient) {
this.mapClientToSelector.delete(client);
}
/**
* Select clients by Selector
* @param {Selector} selector
* @return {Array<SelectedInfo>}
*/
selectClients(selector?: Selector): Array<SelectedInfo> {
const selectedClients = [];
for(const [client, targetSelectors] of this.mapClientToSelector) {
for(const targetSelector of targetSelectors) {
const found = SelectorUtils.match(selector, targetSelector);
if(found) {
selectedClients.push({client: client, targetSelectors});
break;
}
}
}
return selectedClients;
}
/**
* Get all Clients
* @return {MessengerClient[]}
*/
getAllClients(): MessengerClient[] {
return Array.from(this.mapClientToSelector.keys());
}
/**
* Get all Selectors of a certain Client
* @param {MessengerClient} client
* @return {Selector[]}
*/
getSelectorsByClient(client: MessengerClient) {
return this.mapClientToSelector.get(client);
}
}