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'); | var url = require('url'); | ||||
JX.install('AphlictAdminServer', { | JX.install('AphlictAdminServer', { | ||||
construct: function() { | construct: function(server) { | ||||
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); | server.on('request', JX.bind(this, this._onrequest)); | ||||
this._server = http.createServer(handler); | this._server = server; | ||||
this._clientServers = []; | |||||
}, | |||||
properties: { | |||||
clientServers: null, | |||||
logger: null, | |||||
}, | }, | ||||
members: { | members: { | ||||
_messagesIn: null, | _messagesIn: null, | ||||
_messagesOut: null, | _messagesOut: null, | ||||
_server: null, | _server: null, | ||||
_startTime: null, | _startTime: null, | ||||
getListenerList: function(instance) { | getListenerLists: function(instance) { | ||||
return this.getClientServer().getListenerList(instance); | var clients = this.getClientServers(); | ||||
var lists = []; | |||||
for (var ii = 0; ii < clients.length; ii++) { | |||||
lists.push(clients[ii].getListenerList(instance)); | |||||
} | |||||
return lists; | |||||
}, | |||||
log: function() { | |||||
var logger = this.getLogger(); | |||||
if (!logger) { | |||||
return; | |||||
} | |||||
logger.log.apply(logger, arguments); | |||||
return this; | |||||
}, | }, | ||||
listen: function() { | listen: function() { | ||||
return this._server.listen.apply(this._server, arguments); | return this._server.listen.apply(this._server, arguments); | ||||
}, | }, | ||||
_handler: function(request, response) { | _onrequest: function(request, response) { | ||||
var self = this; | var self = this; | ||||
var u = url.parse(request.url, true); | var u = url.parse(request.url, true); | ||||
var instance = u.query.instance || '/'; | var instance = u.query.instance || '/'; | ||||
// Publishing a notification. | // Publishing a notification. | ||||
if (u.pathname == '/') { | 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.log( | ||||
'Received notification (' + instance + '): ' + | 'Received notification (' + instance + '): ' + | ||||
JSON.stringify(msg)); | JSON.stringify(msg)); | ||||
++self._messagesIn; | ++self._messagesIn; | ||||
try { | try { | ||||
self._transmit(instance, 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.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.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 (u.pathname == '/status/') { | } else if (u.pathname == '/status/') { | ||||
var status = { | this._handleStatusRequest(request, response, instance); | ||||
} else { | |||||
response.writeHead(404, 'Not Found'); | |||||
response.end(); | |||||
} | |||||
}, | |||||
_handleStatusRequest: function(request, response, instance) { | |||||
var active_count = 0; | |||||
var total_count = 0; | |||||
var lists = this.getListenerLists(instance); | |||||
for (var ii = 0; ii < lists.length; ii++) { | |||||
var list = lists[ii]; | |||||
active_count += list.getActiveListenerCount(); | |||||
total_count += list.getTotalListenerCount(); | |||||
} | |||||
var server_status = { | |||||
'instance': instance, | 'instance': instance, | ||||
'uptime': (new Date().getTime() - this._startTime), | 'uptime': (new Date().getTime() - this._startTime), | ||||
'clients.active': this.getListenerList(instance) | 'clients.active': active_count, | ||||
.getActiveListenerCount(), | 'clients.total': total_count, | ||||
'clients.total': this.getListenerList(instance) | |||||
.getTotalListenerCount(), | |||||
'messages.in': this._messagesIn, | 'messages.in': this._messagesIn, | ||||
'messages.out': this._messagesOut, | 'messages.out': this._messagesOut, | ||||
'version': 7 | '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(server_status)); | ||||
response.end(); | response.end(); | ||||
} else { | |||||
response.writeHead(404, 'Not Found'); | |||||
response.end(); | |||||
} | |||||
}, | }, | ||||
/** | /** | ||||
* Transmits a message to all subscribed listeners. | * Transmits a message to all subscribed listeners. | ||||
*/ | */ | ||||
_transmit: function(instance, message) { | _transmit: function(instance, message) { | ||||
var listeners = this.getListenerList(instance) | var lists = this.getListenerLists(instance); | ||||
.getListeners() | |||||
.filter(function(client) { | for (var ii = 0; ii < lists.length; ii++) { | ||||
return client.isSubscribedToAny(message.subscribers); | var list = lists[ii]; | ||||
}); | var listeners = list.getListeners(); | ||||
this._transmitToListeners(list, listeners, message); | |||||
} | |||||
}, | |||||
for (var i = 0; i < listeners.length; i++) { | _transmitToListeners: function(list, listeners, message) { | ||||
var listener = listeners[i]; | for (var ii = 0; ii < listeners.length; ii++) { | ||||
var listener = listeners[ii]; | |||||
if (!listener.isSubscribedToAny(message.subscribers)) { | |||||
continue; | |||||
} | |||||
try { | try { | ||||
listener.writeMessage(message); | listener.writeMessage(message); | ||||
++this._messagesOut; | ++this._messagesOut; | ||||
this.getLogger().log( | this.log( | ||||
'<%s> Wrote Message', | '<%s> Wrote Message', | ||||
listener.getDescription()); | listener.getDescription()); | ||||
} catch (error) { | } catch (error) { | ||||
this.getListenerList(instance).removeListener(listener); | list.removeListener(listener); | ||||
this.getLogger().log( | |||||
this.log( | |||||
'<%s> Write Error: %s', | '<%s> Write Error: %s', | ||||
listener.getDescription(), | listener.getDescription(), | ||||
error); | error); | ||||
} | } | ||||
} | } | ||||
}, | } | ||||
}, | |||||
properties: { | |||||
clientServer: null, | |||||
logger: null, | |||||
} | } | ||||
}); | }); |