UNPKG

diffusion

Version:

Diffusion JavaScript client

89 lines (73 loc) 2.32 kB
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)); } }