docs/src/LogStore.js

68 lines
1.7 KiB
JavaScript

var EventEmitter = require('events').EventEmitter;
var assign = require('object-assign');
var Convert = require('ansi-to-html');
var docker = require('./Docker');
var _convert = new Convert();
var _logs = {};
var _streams = {};
var LogStore = assign(Object.create(EventEmitter.prototype), {
SERVER_LOGS_EVENT: 'server_logs_event',
_escapeHTML: function (html) {
var text = document.createTextNode(html);
var div = document.createElement('div');
div.appendChild(text);
return div.innerHTML;
},
fetchLogs: function (name) {
if (!name || !docker.client()) {
return;
}
var index = 0;
var self = this;
docker.client().getContainer(name).logs({
follow: true,
stdout: true,
stderr: true,
timestamps: true
}, function (err, stream) {
if (_streams[name]) {
return;
}
_streams[name] = stream;
if (err) {
return;
}
_logs[name] = [];
stream.setEncoding('utf8');
stream.on('data', function (buf) {
// Every other message is a header
if (index % 2 === 1) {
//var time = buf.substr(0,buf.indexOf(' '));
var msg = buf.substr(buf.indexOf(' ')+1);
_logs[name].push(_convert.toHtml(self._escapeHTML(msg)));
self.emit(self.SERVER_LOGS_EVENT);
}
index += 1;
});
stream.on('end', function () {
delete _streams[name];
});
});
},
logs: function (name) {
if (!_streams[name]) {
this.fetchLogs(name);
}
return _logs[name] || [];
},
rename: function (name, newName) {
if (_logs[name]) {
_logs[newName] = _logs[name];
}
}
});
module.exports = LogStore;