98 lines
2.3 KiB
JavaScript
98 lines
2.3 KiB
JavaScript
|
const logger = require('log4js').getLogger('pubsub');
|
||
|
|
||
|
logger.level = 'debug';
|
||
|
|
||
|
class PubSubManager {
|
||
|
constructor() {
|
||
|
this.channels = {
|
||
|
'twitter': {
|
||
|
|
||
|
},
|
||
|
'weather': {
|
||
|
'message': '',
|
||
|
'subscribers': []
|
||
|
},
|
||
|
'sports': {
|
||
|
'message': '',
|
||
|
'subscribers': []
|
||
|
}
|
||
|
};
|
||
|
this.brokerId = setInterval(() => {
|
||
|
this.broker();
|
||
|
}, 1000);
|
||
|
}
|
||
|
subscribe(subscriber, channel) {
|
||
|
const channelSplit = channel.split('-');
|
||
|
|
||
|
if (channelSplit[0] === 't') {
|
||
|
|
||
|
if (!this.channels.twitter.hasOwnProperty(channel))
|
||
|
this.channels.twitter[channel] = {
|
||
|
'message': null,
|
||
|
'subscribers': []
|
||
|
};
|
||
|
|
||
|
logger.info(`subscribing to ${channel}`);
|
||
|
|
||
|
this.channels.twitter[channel].subscribers.push(subscriber);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
removeBroker() {
|
||
|
clearInterval(this.brokerId);
|
||
|
}
|
||
|
|
||
|
publish(publisher, channel, message) {
|
||
|
this.channels[channel].message = message;
|
||
|
}
|
||
|
|
||
|
publishTwitter( channel, message) {
|
||
|
logger.debug('Publish:', channel, message);
|
||
|
|
||
|
if (!this.channels.twitter.hasOwnProperty(channel))
|
||
|
this.channels.twitter[channel] = {
|
||
|
'message': null,
|
||
|
'subscribers': []
|
||
|
};
|
||
|
|
||
|
this.channels.twitter[channel].message = message;
|
||
|
}
|
||
|
|
||
|
broker() {
|
||
|
// logger.debug('Broker...');
|
||
|
for (const channel in this.channels.twitter)
|
||
|
// logger.debug(channel);
|
||
|
if (this.channels.twitter.hasOwnProperty(channel)) {
|
||
|
const channelObj = this.channels.twitter[channel];
|
||
|
if (channelObj.message) {
|
||
|
console.log(`found message: ${channelObj.message} in ${channel}`);
|
||
|
|
||
|
channelObj.subscribers.forEach(subscriber => {
|
||
|
subscriber.send(JSON.stringify({
|
||
|
'message': channelObj.message
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
channelObj.message = '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* for (const channel in this.channels)
|
||
|
if (this.channels.hasOwnProperty(channel)) {
|
||
|
const channelObj = this.channels[channel];
|
||
|
if (channelObj.message) {
|
||
|
console.log(`found message: ${channelObj.message} in ${channel}`);
|
||
|
|
||
|
channelObj.subscribers.forEach(subscriber => {
|
||
|
subscriber.send(JSON.stringify({
|
||
|
'message': channelObj.message
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
channelObj.message = '';
|
||
|
}
|
||
|
}*/
|
||
|
}
|
||
|
}
|
||
|
module.exports = PubSubManager;
|