87 lines
2.6 KiB
JavaScript
87 lines
2.6 KiB
JavaScript
(function() {
|
|
var Binary, Entry, Parser, Priority,
|
|
extend = 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; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
Parser = require('../parser');
|
|
|
|
Entry = require('../entry');
|
|
|
|
Priority = require('../priority');
|
|
|
|
Binary = (function(superClass) {
|
|
var HEADER_SIZE_MAX, HEADER_SIZE_V1;
|
|
|
|
extend(Binary, superClass);
|
|
|
|
HEADER_SIZE_V1 = 20;
|
|
|
|
HEADER_SIZE_MAX = 100;
|
|
|
|
function Binary() {
|
|
this.buffer = new Buffer('');
|
|
}
|
|
|
|
Binary.prototype.parse = function(chunk) {
|
|
var cursor, data, entry, headerSize, length, nsec, sec;
|
|
this.buffer = Buffer.concat([this.buffer, chunk]);
|
|
while (this.buffer.length > 4) {
|
|
cursor = 0;
|
|
length = this.buffer.readUInt16LE(cursor);
|
|
cursor += 2;
|
|
headerSize = this.buffer.readUInt16LE(cursor);
|
|
if (headerSize < HEADER_SIZE_V1 || headerSize > HEADER_SIZE_MAX) {
|
|
headerSize = HEADER_SIZE_V1;
|
|
}
|
|
cursor += 2;
|
|
if (this.buffer.length < headerSize + length) {
|
|
break;
|
|
}
|
|
entry = new Entry;
|
|
entry.setPid(this.buffer.readInt32LE(cursor));
|
|
cursor += 4;
|
|
entry.setTid(this.buffer.readInt32LE(cursor));
|
|
cursor += 4;
|
|
sec = this.buffer.readInt32LE(cursor);
|
|
cursor += 4;
|
|
nsec = this.buffer.readInt32LE(cursor);
|
|
entry.setDate(new Date(sec * 1000 + nsec / 1000000));
|
|
cursor += 4;
|
|
cursor = headerSize;
|
|
data = this.buffer.slice(cursor, cursor + length);
|
|
cursor += length;
|
|
this.buffer = this.buffer.slice(cursor);
|
|
this._processEntry(entry, data);
|
|
}
|
|
if (this.buffer.length) {
|
|
this.emit('wait');
|
|
} else {
|
|
this.emit('drain');
|
|
}
|
|
};
|
|
|
|
Binary.prototype._processEntry = function(entry, data) {
|
|
var cursor, length;
|
|
entry.setPriority(data[0]);
|
|
cursor = 1;
|
|
length = data.length;
|
|
while (cursor < length) {
|
|
if (data[cursor] === 0) {
|
|
entry.setTag(data.slice(1, cursor).toString());
|
|
entry.setMessage(data.slice(cursor + 1, length - 1).toString());
|
|
this.emit('entry', entry);
|
|
return;
|
|
}
|
|
cursor += 1;
|
|
}
|
|
this.emit('error', new Error("Unprocessable entry data '" + data + "'"));
|
|
};
|
|
|
|
return Binary;
|
|
|
|
})(Parser);
|
|
|
|
module.exports = Binary;
|
|
|
|
}).call(this);
|