ttyrec
Version:
Native javascript Ttyrec file encoder/decoder using streams
105 lines (76 loc) • 1.91 kB
JavaScript
'use strict';
function parseBuffer(chunk) {
var records = [];
var rest ;
var buffer = chunk.slice(0);
var hasRecords = true;
while (hasRecords) {
var recordResult = parseRecord(buffer);
var record = recordResult[0];
rest = recordResult[1];
if (record === null) {
// no more records
hasRecords = false;
} else {
records.push(record);
buffer = rest.slice(0);
}
}
return [ records, rest ];
}
function parseHeader(chunk) {
var result = {};
if (chunk.length >= 12) {
// 32Bit (= 4 Bytes) Little Endian
var sec = chunk.readUInt32LE(0);
var usec = chunk.readUInt32LE(4);
var length = chunk.readUInt32LE(8);
var header = {
sec: sec,
usec: usec,
length: length
};
var rest = chunk.slice(12);
return [ header, rest ];
} else {
return [ null, chunk ];
}
}
function parsePacket(chunk, length) {
if (chunk.length >= length) {
// Note: slice second param is not the end position but the length to slice
var packet = chunk.slice(0,length);
var rest = chunk.slice(length);
return [ packet , rest ];
} else {
return [ null , chunk ];
}
}
function parseRecord(chunk) {
var headerResult = parseHeader(chunk);
var header = headerResult[0];
var headerRest = headerResult[1];
if ( header === null) {
return [ null, headerRest ];
} else {
var packetResult = parsePacket(headerRest , header.length);
var packet = packetResult[0];
var packetRest = packetResult[1];
if (packet === null) {
return [ null , chunk ];
} else {
var record = {
header: header,
packet: packet
};
return [ record, packetRest ];
}
}
}
module.exports = {
parseBuffer: parseBuffer,
decode: parseBuffer,
parseRecord: parseRecord,
parseHeader: parseHeader,
parsePacket: parsePacket
};