var SCWorker = require("socketcluster/scworker"); var express = require('express'); var app = express(); var routes = require('./routes'); var createStore = require('./store'); class Worker extends SCWorker { run() { var httpServer = this.httpServer; var scServer = this.scServer; var options = this.options; var store = createStore(options); httpServer.on('request', app); app.use(routes(options, store, scServer)); scServer.addMiddleware(scServer.MIDDLEWARE_EMIT, function (req, next) { var channel = req.event; var data = req.data; if (channel.substr(0, 3) === 'sc-' || channel === 'respond' || channel === 'log') { scServer.exchange.publish(channel, data); } else if (channel === 'log-noid') { scServer.exchange.publish('log', {id: req.socket.id, data: data}); } next(); }); scServer.addMiddleware(scServer.MIDDLEWARE_SUBSCRIBE, function (req, next) { next(); if (req.channel === 'report') { store.list().then(function (data) { req.socket.emit(req.channel, {type: 'list', data: data}); }).catch(function (error) { console.error(error); }); } }); scServer.on('connection', function (socket) { var channelToWatch, channelToEmit; socket.on('login', function (credentials, respond) { if (credentials === 'master') { channelToWatch = 'respond'; channelToEmit = 'log'; } else { channelToWatch = 'log'; channelToEmit = 'respond'; } this.exchange.subscribe('sc-' + socket.id).watch(function (msg) { socket.emit(channelToWatch, msg); }); respond(null, channelToWatch); }); socket.on('getReport', function (id, respond) { store.get(id).then(function (data) { respond(null, data); }).catch(function (error) { console.error(error); }); }); socket.on('disconnect', function () { var channel = this.exchange.channel('sc-' + socket.id); channel.unsubscribe(); channel.destroy(); scServer.exchange.publish( channelToEmit, {id: socket.id, type: 'DISCONNECTED'} ); }); }); }; } new Worker();