Changeset View
Changeset View
Standalone View
Standalone View
support/aphlict/server/lib/AphlictAdminServer.js
| 'use strict'; | 'use strict'; | ||||
| var JX = require('./javelin').JX; | var JX = require('./javelin').JX; | ||||
| require('./AphlictListenerList'); | require('./AphlictListenerList'); | ||||
| var http = require('http'); | var http = require('http'); | ||||
| var url = require('url'); | |||||
| JX.install('AphlictAdminServer', { | JX.install('AphlictAdminServer', { | ||||
| construct: function() { | construct: function() { | ||||
| this.setLogger(new JX.AphlictLog()); | this.setLogger(new JX.AphlictLog()); | ||||
| this._startTime = new Date().getTime(); | this._startTime = new Date().getTime(); | ||||
| this._messagesIn = 0; | this._messagesIn = 0; | ||||
| this._messagesOut = 0; | this._messagesOut = 0; | ||||
| var handler = this._handler.bind(this); | var handler = this._handler.bind(this); | ||||
| this._server = http.createServer(handler); | this._server = http.createServer(handler); | ||||
| }, | }, | ||||
| members: { | members: { | ||||
| _messagesIn: null, | _messagesIn: null, | ||||
| _messagesOut: null, | _messagesOut: null, | ||||
| _server: null, | _server: null, | ||||
| _startTime: null, | _startTime: null, | ||||
| getListeners: function() { | getListenerList: function(instance) { | ||||
| return this.getListenerList().getListeners(); | return this.getClientServer().getListenerList(instance); | ||||
| }, | |||||
| getListenerList: function() { | |||||
| return this.getClientServer().getListenerList(); | |||||
| }, | }, | ||||
| listen: function() { | listen: function() { | ||||
| return this._server.listen.apply(this._server, arguments); | return this._server.listen.apply(this._server, arguments); | ||||
| }, | }, | ||||
| _handler: function(request, response) { | _handler: function(request, response) { | ||||
| var self = this; | var self = this; | ||||
| var u = url.parse(request.url, true); | |||||
| var instance = u.query.instance || '/'; | |||||
| // Publishing a notification. | // Publishing a notification. | ||||
| if (request.url == '/') { | if (u.pathname == '/') { | ||||
| if (request.method == 'POST') { | if (request.method == 'POST') { | ||||
| var body = ''; | var body = ''; | ||||
| request.on('data', function(data) { | request.on('data', function(data) { | ||||
| body += data; | body += data; | ||||
| }); | }); | ||||
| request.on('end', function() { | request.on('end', function() { | ||||
| try { | try { | ||||
| var msg = JSON.parse(body); | var msg = JSON.parse(body); | ||||
| self.getLogger().log( | self.getLogger().log( | ||||
| 'Received notification: ' + JSON.stringify(msg)); | 'Received notification (' + instance + '): ' + | ||||
| JSON.stringify(msg)); | |||||
| ++self._messagesIn; | ++self._messagesIn; | ||||
| try { | try { | ||||
| self._transmit(msg); | self._transmit(instance, msg); | ||||
| response.writeHead(200, {'Content-Type': 'text/plain'}); | response.writeHead(200, {'Content-Type': 'text/plain'}); | ||||
| } catch (err) { | } catch (err) { | ||||
| self.getLogger().log( | self.getLogger().log( | ||||
| '<%s> Internal Server Error! %s', | '<%s> Internal Server Error! %s', | ||||
| request.socket.remoteAddress, | request.socket.remoteAddress, | ||||
| err); | err); | ||||
| response.writeHead(500, 'Internal Server Error'); | response.writeHead(500, 'Internal Server Error'); | ||||
| } | } | ||||
| } catch (err) { | } catch (err) { | ||||
| self.getLogger().log( | self.getLogger().log( | ||||
| '<%s> Bad Request! %s', | '<%s> Bad Request! %s', | ||||
| request.socket.remoteAddress, | request.socket.remoteAddress, | ||||
| err); | err); | ||||
| response.writeHead(400, 'Bad Request'); | response.writeHead(400, 'Bad Request'); | ||||
| } finally { | } finally { | ||||
| response.end(); | response.end(); | ||||
| } | } | ||||
| }); | }); | ||||
| } else { | } else { | ||||
| response.writeHead(405, 'Method Not Allowed'); | response.writeHead(405, 'Method Not Allowed'); | ||||
| response.end(); | response.end(); | ||||
| } | } | ||||
| } else if (request.url == '/status/') { | } else if (u.pathname == '/status/') { | ||||
| var status = { | var status = { | ||||
| 'instance': instance, | |||||
| 'uptime': (new Date().getTime() - this._startTime), | 'uptime': (new Date().getTime() - this._startTime), | ||||
| 'clients.active': this.getListenerList().getActiveListenerCount(), | 'clients.active': this.getListenerList(instance) | ||||
| 'clients.total': this.getListenerList().getTotalListenerCount(), | .getActiveListenerCount(), | ||||
| 'clients.total': this.getListenerList(instance) | |||||
| .getTotalListenerCount(), | |||||
| 'messages.in': this._messagesIn, | 'messages.in': this._messagesIn, | ||||
| 'messages.out': this._messagesOut, | 'messages.out': this._messagesOut, | ||||
| 'version': 6 | 'version': 7 | ||||
| }; | }; | ||||
| response.writeHead(200, {'Content-Type': 'application/json'}); | response.writeHead(200, {'Content-Type': 'application/json'}); | ||||
| response.write(JSON.stringify(status)); | response.write(JSON.stringify(status)); | ||||
| response.end(); | response.end(); | ||||
| } else { | } else { | ||||
| response.writeHead(404, 'Not Found'); | response.writeHead(404, 'Not Found'); | ||||
| response.end(); | response.end(); | ||||
| } | } | ||||
| }, | }, | ||||
| /** | /** | ||||
| * Transmits a message to all subscribed listeners. | * Transmits a message to all subscribed listeners. | ||||
| */ | */ | ||||
| _transmit: function(message) { | _transmit: function(instance, message) { | ||||
| var listeners = this.getListeners().filter(function(client) { | var listeners = this.getListenerList(instance) | ||||
| .getListeners() | |||||
| .filter(function(client) { | |||||
| return client.isSubscribedToAny(message.subscribers); | return client.isSubscribedToAny(message.subscribers); | ||||
| }); | }); | ||||
| for (var i = 0; i < listeners.length; i++) { | for (var i = 0; i < listeners.length; i++) { | ||||
| var listener = listeners[i]; | var listener = listeners[i]; | ||||
| try { | try { | ||||
| listener.writeMessage(message); | listener.writeMessage(message); | ||||
| ++this._messagesOut; | ++this._messagesOut; | ||||
| this.getLogger().log( | this.getLogger().log( | ||||
| '<%s> Wrote Message', | '<%s> Wrote Message', | ||||
| listener.getDescription()); | listener.getDescription()); | ||||
| } catch (error) { | } catch (error) { | ||||
| this.getListenerList().removeListener(listener); | this.getListenerList(instance).removeListener(listener); | ||||
| this.getLogger().log( | this.getLogger().log( | ||||
| '<%s> Write Error: %s', | '<%s> Write Error: %s', | ||||
| listener.getDescription(), | listener.getDescription(), | ||||
| error); | error); | ||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| }, | }, | ||||
| properties: { | properties: { | ||||
| clientServer: null, | clientServer: null, | ||||
| logger: null, | logger: null, | ||||
| } | } | ||||
| }); | }); | ||||