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; |