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;