diffusion
Version:
Diffusion JavaScript client
89 lines (73 loc) • 2.32 kB
JavaScript
var RECORD_DELIMITER = 0x1;
var FIELD_DELIMITER = 0x2;
var RECORD_MU = 0x4;
var FIELD_MU = 0x5;
module.exports.parse = function(bytes, offset, length) {
offset = offset || 0;
length = length || bytes.length;
// Empty butes returns empty record list
if (length === 0) {
return [];
}
// Record MU returns single empty record
if (length === 1 && bytes[offset] === RECORD_MU) {
return [[]];
}
// Process all records
var records = [];
var fields = [];
var pos = offset;
for (var i = offset; i < length; ++i) {
if (bytes[i] === RECORD_DELIMITER) {
processRecordDelimiter(bytes, records, pos, i, fields);
pos = i + 1;
} else if (bytes[i] === FIELD_DELIMITER) {
addField(bytes, records, pos, i, fields);
pos = i + 1;
}
}
processEnd(bytes, records, pos, length, fields);
return records;
};
function processRecordDelimiter(bytes, records, startPos, endPos, fields) {
var written = false;
// If we have a field add it to list
if (startPos < endPos) {
written = addField(bytes, records, startPos, endPos, fields);
} else {
// Buf if we're not at the start of content && the last delimiter was for a field
// it implies an empty field
if (startPos > 0 && bytes[startPos - 1] === FIELD_DELIMITER) {
fields.push("");
}
}
if (!written) {
records.push([].concat(fields));
}
// Clear fields array
fields.length = 0;
}
function processEnd(bytes, records, startPos, endPos, fields) {
if (endPos > startPos) {
addField(bytes, records, startPos, endPos, fields);
} else {
var endByte = bytes[endPos - 1];
if (endByte === RECORD_DELIMITER) {
records.push([]);
} else if (endByte === FIELD_DELIMITER) {
fields.push("");
}
}
if (fields.length) {
records.push([].concat(fields));
}
}
function addField(bytes, records, startPos, endPos, fields) {
var len = endPos - startPos;
if (fields.length === 0 && len === 1 && bytes[startPos] === FIELD_MU) {
records.push([""]);
return true;
} else {
fields.push(bytes.toString("utf8", startPos, endPos));
}
}