122 lines
2.9 KiB
JavaScript
122 lines
2.9 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.readBits = exports.readArray = exports.readUnsigned = exports.readString = exports.peekBytes = exports.readBytes = exports.peekByte = exports.readByte = exports.buildStream = void 0;
|
|
|
|
// Default stream and parsers for Uint8TypedArray data type
|
|
var buildStream = function buildStream(uint8Data) {
|
|
return {
|
|
data: uint8Data,
|
|
pos: 0
|
|
};
|
|
};
|
|
|
|
exports.buildStream = buildStream;
|
|
|
|
var readByte = function readByte() {
|
|
return function (stream) {
|
|
return stream.data[stream.pos++];
|
|
};
|
|
};
|
|
|
|
exports.readByte = readByte;
|
|
|
|
var peekByte = function peekByte() {
|
|
var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
return function (stream) {
|
|
return stream.data[stream.pos + offset];
|
|
};
|
|
};
|
|
|
|
exports.peekByte = peekByte;
|
|
|
|
var readBytes = function readBytes(length) {
|
|
return function (stream) {
|
|
return stream.data.subarray(stream.pos, stream.pos += length);
|
|
};
|
|
};
|
|
|
|
exports.readBytes = readBytes;
|
|
|
|
var peekBytes = function peekBytes(length) {
|
|
return function (stream) {
|
|
return stream.data.subarray(stream.pos, stream.pos + length);
|
|
};
|
|
};
|
|
|
|
exports.peekBytes = peekBytes;
|
|
|
|
var readString = function readString(length) {
|
|
return function (stream) {
|
|
return Array.from(readBytes(length)(stream)).map(function (value) {
|
|
return String.fromCharCode(value);
|
|
}).join('');
|
|
};
|
|
};
|
|
|
|
exports.readString = readString;
|
|
|
|
var readUnsigned = function readUnsigned(littleEndian) {
|
|
return function (stream) {
|
|
var bytes = readBytes(2)(stream);
|
|
return littleEndian ? (bytes[1] << 8) + bytes[0] : (bytes[0] << 8) + bytes[1];
|
|
};
|
|
};
|
|
|
|
exports.readUnsigned = readUnsigned;
|
|
|
|
var readArray = function readArray(byteSize, totalOrFunc) {
|
|
return function (stream, result, parent) {
|
|
var total = typeof totalOrFunc === 'function' ? totalOrFunc(stream, result, parent) : totalOrFunc;
|
|
var parser = readBytes(byteSize);
|
|
var arr = new Array(total);
|
|
|
|
for (var i = 0; i < total; i++) {
|
|
arr[i] = parser(stream);
|
|
}
|
|
|
|
return arr;
|
|
};
|
|
};
|
|
|
|
exports.readArray = readArray;
|
|
|
|
var subBitsTotal = function subBitsTotal(bits, startIndex, length) {
|
|
var result = 0;
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
result += bits[startIndex + i] && Math.pow(2, length - i - 1);
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
var readBits = function readBits(schema) {
|
|
return function (stream) {
|
|
var _byte = readByte()(stream); // convert the byte to bit array
|
|
|
|
|
|
var bits = new Array(8);
|
|
|
|
for (var i = 0; i < 8; i++) {
|
|
bits[7 - i] = !!(_byte & 1 << i);
|
|
} // convert the bit array to values based on the schema
|
|
|
|
|
|
return Object.keys(schema).reduce(function (res, key) {
|
|
var def = schema[key];
|
|
|
|
if (def.length) {
|
|
res[key] = subBitsTotal(bits, def.index, def.length);
|
|
} else {
|
|
res[key] = bits[def.index];
|
|
}
|
|
|
|
return res;
|
|
}, {});
|
|
};
|
|
};
|
|
|
|
exports.readBits = readBits; |