mirror of https://github.com/jumpserver/jumpserver
148 lines
4.1 KiB
JavaScript
148 lines
4.1 KiB
JavaScript
// Generated by CoffeeScript 1.6.2
|
|
var Tail, environment, events, fs,
|
|
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
|
__hasProp = {}.hasOwnProperty,
|
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
|
|
|
events = require("events");
|
|
|
|
fs = require('fs');
|
|
|
|
environment = process.env['NODE_ENV'] || 'development';
|
|
|
|
Tail = (function(_super) {
|
|
__extends(Tail, _super);
|
|
|
|
Tail.prototype.readBlock = function() {
|
|
var block, stream,
|
|
_this = this;
|
|
|
|
if (this.queue.length >= 1) {
|
|
block = this.queue.shift();
|
|
if (block.end > block.start) {
|
|
stream = fs.createReadStream(this.filename, {
|
|
start: block.start,
|
|
end: block.end - 1,
|
|
encoding: "utf-8"
|
|
});
|
|
stream.on('error', function(error) {
|
|
console.log("Tail error:" + error);
|
|
return _this.emit('error', error);
|
|
});
|
|
stream.on('end', function() {
|
|
if (_this.queue.length >= 1) {
|
|
return _this.internalDispatcher.emit("next");
|
|
}
|
|
});
|
|
return stream.on('data', function(data) {
|
|
var chunk, parts, _i, _len, _results;
|
|
|
|
_this.buffer += data;
|
|
parts = _this.buffer.split(_this.separator);
|
|
_this.buffer = parts.pop();
|
|
_results = [];
|
|
for (_i = 0, _len = parts.length; _i < _len; _i++) {
|
|
chunk = parts[_i];
|
|
_results.push(_this.emit("line", chunk));
|
|
}
|
|
return _results;
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
function Tail(filename, separator, fsWatchOptions, frombeginning) {
|
|
var stats,
|
|
_this = this;
|
|
|
|
this.filename = filename;
|
|
this.separator = separator != null ? separator : '\n';
|
|
this.fsWatchOptions = fsWatchOptions != null ? fsWatchOptions : {};
|
|
this.frombeginning = frombeginning != null ? frombeginning : false;
|
|
this.readBlock = __bind(this.readBlock, this);
|
|
this.buffer = '';
|
|
this.internalDispatcher = new events.EventEmitter();
|
|
this.queue = [];
|
|
this.isWatching = false;
|
|
stats = fs.statSync(this.filename);
|
|
this.internalDispatcher.on('next', function() {
|
|
return _this.readBlock();
|
|
});
|
|
this.pos = this.frombeginning ? 0 : stats.size;
|
|
this.watch();
|
|
}
|
|
|
|
Tail.prototype.watch = function() {
|
|
var _this = this;
|
|
|
|
if (this.isWatching) {
|
|
return;
|
|
}
|
|
this.isWatching = true;
|
|
if (fs.watch) {
|
|
return this.watcher = fs.watch(this.filename, this.fsWatchOptions, function(e) {
|
|
return _this.watchEvent(e);
|
|
});
|
|
} else {
|
|
return fs.watchFile(this.filename, this.fsWatchOptions, function(curr, prev) {
|
|
return _this.watchFileEvent(curr, prev);
|
|
});
|
|
}
|
|
};
|
|
|
|
Tail.prototype.watchEvent = function(e) {
|
|
var stats,
|
|
_this = this;
|
|
|
|
if (e === 'change') {
|
|
stats = fs.statSync(this.filename);
|
|
if (stats.size < this.pos) {
|
|
this.pos = stats.size;
|
|
}
|
|
if (stats.size > this.pos) {
|
|
this.queue.push({
|
|
start: this.pos,
|
|
end: stats.size
|
|
});
|
|
this.pos = stats.size;
|
|
if (this.queue.length === 1) {
|
|
return this.internalDispatcher.emit("next");
|
|
}
|
|
}
|
|
} else if (e === 'rename') {
|
|
this.unwatch();
|
|
return setTimeout((function() {
|
|
return _this.watch();
|
|
}), 1000);
|
|
}
|
|
};
|
|
|
|
Tail.prototype.watchFileEvent = function(curr, prev) {
|
|
if (curr.size > prev.size) {
|
|
this.queue.push({
|
|
start: prev.size,
|
|
end: curr.size
|
|
});
|
|
if (this.queue.length === 1) {
|
|
return this.internalDispatcher.emit("next");
|
|
}
|
|
}
|
|
};
|
|
|
|
Tail.prototype.unwatch = function() {
|
|
if (fs.watch && this.watcher) {
|
|
this.watcher.close();
|
|
this.pos = 0;
|
|
} else {
|
|
fs.unwatchFile(this.filename);
|
|
}
|
|
this.isWatching = false;
|
|
return this.queue = [];
|
|
};
|
|
|
|
return Tail;
|
|
|
|
})(events.EventEmitter);
|
|
|
|
exports.Tail = Tail;
|