Changeset View
Changeset View
Standalone View
Standalone View
support/aphlict/server/lib/AphlictAdminServer.js
| Show All 11 Lines | JX.install('AphlictAdminServer', { | ||||
| construct: function(server) { | construct: function(server) { | ||||
| this._startTime = new Date().getTime(); | this._startTime = new Date().getTime(); | ||||
| this._messagesIn = 0; | this._messagesIn = 0; | ||||
| this._messagesOut = 0; | this._messagesOut = 0; | ||||
| server.on('request', JX.bind(this, this._onrequest)); | server.on('request', JX.bind(this, this._onrequest)); | ||||
| this._server = server; | this._server = server; | ||||
| this._clientServers = []; | this._clientServers = []; | ||||
| this._messageHistory = []; | |||||
| }, | }, | ||||
| properties: { | properties: { | ||||
| clientServers: null, | clientServers: null, | ||||
| logger: null, | logger: null, | ||||
| peerList: null | peerList: null | ||||
| }, | }, | ||||
| members: { | members: { | ||||
| _messagesIn: null, | _messagesIn: null, | ||||
| _messagesOut: null, | _messagesOut: null, | ||||
| _server: null, | _server: null, | ||||
| _startTime: null, | _startTime: null, | ||||
| _messageHistory: null, | |||||
| getListenerLists: function(instance) { | getListenerLists: function(instance) { | ||||
| var clients = this.getClientServers(); | var clients = this.getClientServers(); | ||||
| var lists = []; | var lists = []; | ||||
| for (var ii = 0; ii < clients.length; ii++) { | for (var ii = 0; ii < clients.length; ii++) { | ||||
| lists.push(clients[ii].getListenerList(instance)); | lists.push(clients[ii].getListenerList(instance)); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | _handleStatusRequest: function(request, response, instance) { | ||||
| var lists = this.getListenerLists(instance); | var lists = this.getListenerLists(instance); | ||||
| for (var ii = 0; ii < lists.length; ii++) { | for (var ii = 0; ii < lists.length; ii++) { | ||||
| var list = lists[ii]; | var list = lists[ii]; | ||||
| active_count += list.getActiveListenerCount(); | active_count += list.getActiveListenerCount(); | ||||
| total_count += list.getTotalListenerCount(); | total_count += list.getTotalListenerCount(); | ||||
| } | } | ||||
| var now = new Date().getTime(); | |||||
| var history_size = this._messageHistory.length; | |||||
| var history_age = null; | |||||
| if (history_size) { | |||||
| history_age = (now - this._messageHistory[0].timestamp); | |||||
| } | |||||
| var server_status = { | var server_status = { | ||||
| 'instance': instance, | 'instance': instance, | ||||
| 'uptime': (new Date().getTime() - this._startTime), | 'uptime': (now - this._startTime), | ||||
| 'clients.active': active_count, | 'clients.active': active_count, | ||||
| 'clients.total': total_count, | 'clients.total': total_count, | ||||
| 'messages.in': this._messagesIn, | 'messages.in': this._messagesIn, | ||||
| 'messages.out': this._messagesOut, | 'messages.out': this._messagesOut, | ||||
| 'version': 7 | 'version': 7, | ||||
| 'history.size': history_size, | |||||
| 'history.age': history_age | |||||
| }; | }; | ||||
| response.writeHead(200, {'Content-Type': 'application/json'}); | response.writeHead(200, {'Content-Type': 'application/json'}); | ||||
| response.write(JSON.stringify(server_status)); | response.write(JSON.stringify(server_status)); | ||||
| response.end(); | response.end(); | ||||
| }, | }, | ||||
| /** | /** | ||||
| * Transmits a message to all subscribed listeners. | * Transmits a message to all subscribed listeners. | ||||
| */ | */ | ||||
| _transmit: function(instance, message, response) { | _transmit: function(instance, message, response) { | ||||
| var now = new Date().getTime(); | |||||
| this._messageHistory.push( | |||||
| { | |||||
| timestamp: now, | |||||
| message: message | |||||
| }); | |||||
| this._purgeHistory(); | |||||
| var peer_list = this.getPeerList(); | var peer_list = this.getPeerList(); | ||||
| message = peer_list.addFingerprint(message); | message = peer_list.addFingerprint(message); | ||||
| if (message) { | if (message) { | ||||
| var lists = this.getListenerLists(instance); | var lists = this.getListenerLists(instance); | ||||
| for (var ii = 0; ii < lists.length; ii++) { | for (var ii = 0; ii < lists.length; ii++) { | ||||
| var list = lists[ii]; | var list = lists[ii]; | ||||
| Show All 35 Lines | _transmitToListeners: function(list, listeners, message) { | ||||
| list.removeListener(listener); | list.removeListener(listener); | ||||
| this.log( | this.log( | ||||
| '<%s> Write Error: %s', | '<%s> Write Error: %s', | ||||
| listener.getDescription(), | listener.getDescription(), | ||||
| error); | error); | ||||
| } | } | ||||
| } | } | ||||
| }, | |||||
| getHistory: function(min_age) { | |||||
| var history = this._messageHistory; | |||||
| var results = []; | |||||
| for (var ii = 0; ii < history.length; ii++) { | |||||
| if (history[ii].timestamp >= min_age) { | |||||
| results.push(history[ii].message); | |||||
| } | |||||
| } | |||||
| return results; | |||||
| }, | |||||
| _purgeHistory: function() { | |||||
| var messages = this._messageHistory; | |||||
| // Maximum number of messages to retain. | |||||
| var size_limit = 4096; | |||||
| // Find the index of the first item we're going to keep. If we have too | |||||
| // many items, this will be somewhere past the beginning of the list. | |||||
| var keep = Math.max(0, messages.length - size_limit); | |||||
| // Maximum number of milliseconds of history to retain. | |||||
| var age_limit = 60000; | |||||
| // Move the index forward until we find an item that is recent enough | |||||
| // to retain. | |||||
| var now = new Date().getTime(); | |||||
| var min_age = (now - age_limit); | |||||
| for (keep; keep < messages.length; keep++) { | |||||
| if (messages[keep].timestamp >= min_age) { | |||||
| break; | |||||
| } | |||||
| } | |||||
| // Throw away extra messages. | |||||
| if (keep) { | |||||
| this._messageHistory.splice(0, keep); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| }); | }); | ||||