multi-buffer-data-view
Version:
A wrapper around the native DataView which can handle multiple ArrayBuffers.
248 lines (244 loc) • 13.4 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass')) :
typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.multiBufferDataView = {}, global._slicedToArray, global._classCallCheck, global._createClass));
})(this, (function (exports, _slicedToArray, _classCallCheck, _createClass) { 'use strict';
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: true } : { done: false, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = true, u = false; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = true, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
var MultiBufferDataView = /*#__PURE__*/function () {
function MultiBufferDataView(buffers) {
var byteOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var byteLength = arguments.length > 2 ? arguments[2] : undefined;
_classCallCheck(this, MultiBufferDataView);
if (byteOffset < 0 || byteLength !== undefined && byteLength < 0) {
throw new RangeError();
}
var availableBytes = buffers.reduce(function (length, buffer) {
return length + buffer.byteLength;
}, 0);
if (byteOffset > availableBytes || byteLength !== undefined && byteOffset + byteLength > availableBytes) {
throw new RangeError();
}
var dataViews = [];
var effectiveByteLength = byteLength === undefined ? availableBytes - byteOffset : byteLength;
var truncatedBuffers = [];
var consumedByteLength = 0;
var truncatedByteOffset = byteOffset;
var _iterator = _createForOfIteratorHelper(buffers),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var buffer = _step.value;
if (truncatedBuffers.length === 0) {
if (buffer.byteLength > truncatedByteOffset) {
consumedByteLength = buffer.byteLength - truncatedByteOffset;
var byteLengthOfDataView = consumedByteLength > effectiveByteLength ? effectiveByteLength : consumedByteLength;
dataViews.push(new DataView(buffer, truncatedByteOffset, byteLengthOfDataView));
truncatedBuffers.push(buffer);
} else {
truncatedByteOffset -= buffer.byteLength;
}
} else if (consumedByteLength < effectiveByteLength) {
consumedByteLength += buffer.byteLength;
var _byteLengthOfDataView = consumedByteLength > effectiveByteLength ? buffer.byteLength - consumedByteLength + effectiveByteLength : buffer.byteLength;
dataViews.push(new DataView(buffer, 0, _byteLengthOfDataView));
truncatedBuffers.push(buffer);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
this._buffers = truncatedBuffers;
this._byteLength = effectiveByteLength;
this._byteOffset = truncatedByteOffset;
this._dataViews = dataViews;
this._internalBuffer = new DataView(new ArrayBuffer(8));
}
return _createClass(MultiBufferDataView, [{
key: "buffers",
get: function get() {
return this._buffers;
}
}, {
key: "byteLength",
get: function get() {
return this._byteLength;
}
}, {
key: "byteOffset",
get: function get() {
return this._byteOffset;
}
}, {
key: "getFloat32",
value: function getFloat32(byteOffset, littleEndian) {
this._internalBuffer.setUint8(0, this.getUint8(byteOffset + 0));
this._internalBuffer.setUint8(1, this.getUint8(byteOffset + 1));
this._internalBuffer.setUint8(2, this.getUint8(byteOffset + 2));
this._internalBuffer.setUint8(3, this.getUint8(byteOffset + 3));
return this._internalBuffer.getFloat32(0, littleEndian);
}
}, {
key: "getFloat64",
value: function getFloat64(byteOffset, littleEndian) {
this._internalBuffer.setUint8(0, this.getUint8(byteOffset + 0));
this._internalBuffer.setUint8(1, this.getUint8(byteOffset + 1));
this._internalBuffer.setUint8(2, this.getUint8(byteOffset + 2));
this._internalBuffer.setUint8(3, this.getUint8(byteOffset + 3));
this._internalBuffer.setUint8(4, this.getUint8(byteOffset + 4));
this._internalBuffer.setUint8(5, this.getUint8(byteOffset + 5));
this._internalBuffer.setUint8(6, this.getUint8(byteOffset + 6));
this._internalBuffer.setUint8(7, this.getUint8(byteOffset + 7));
return this._internalBuffer.getFloat64(0, littleEndian);
}
}, {
key: "getInt16",
value: function getInt16(byteOffset, littleEndian) {
this._internalBuffer.setUint8(0, this.getUint8(byteOffset + 0));
this._internalBuffer.setUint8(1, this.getUint8(byteOffset + 1));
return this._internalBuffer.getInt16(0, littleEndian);
}
}, {
key: "getInt32",
value: function getInt32(byteOffset, littleEndian) {
this._internalBuffer.setUint8(0, this.getUint8(byteOffset + 0));
this._internalBuffer.setUint8(1, this.getUint8(byteOffset + 1));
this._internalBuffer.setUint8(2, this.getUint8(byteOffset + 2));
this._internalBuffer.setUint8(3, this.getUint8(byteOffset + 3));
return this._internalBuffer.getInt32(0, littleEndian);
}
}, {
key: "getInt8",
value: function getInt8(byteOffset) {
var _this$_findDataViewWi = this._findDataViewWithOffset(byteOffset),
_this$_findDataViewWi2 = _slicedToArray(_this$_findDataViewWi, 2),
dataView = _this$_findDataViewWi2[0],
byteOffsetOfDataView = _this$_findDataViewWi2[1];
return dataView.getInt8(byteOffset - byteOffsetOfDataView);
}
}, {
key: "getUint16",
value: function getUint16(byteOffset, littleEndian) {
this._internalBuffer.setUint8(0, this.getUint8(byteOffset + 0));
this._internalBuffer.setUint8(1, this.getUint8(byteOffset + 1));
return this._internalBuffer.getUint16(0, littleEndian);
}
}, {
key: "getUint32",
value: function getUint32(byteOffset, littleEndian) {
this._internalBuffer.setUint8(0, this.getUint8(byteOffset + 0));
this._internalBuffer.setUint8(1, this.getUint8(byteOffset + 1));
this._internalBuffer.setUint8(2, this.getUint8(byteOffset + 2));
this._internalBuffer.setUint8(3, this.getUint8(byteOffset + 3));
return this._internalBuffer.getUint32(0, littleEndian);
}
}, {
key: "getUint8",
value: function getUint8(byteOffset) {
var _this$_findDataViewWi3 = this._findDataViewWithOffset(byteOffset),
_this$_findDataViewWi4 = _slicedToArray(_this$_findDataViewWi3, 2),
dataView = _this$_findDataViewWi4[0],
byteOffsetOfDataView = _this$_findDataViewWi4[1];
return dataView.getUint8(byteOffset - byteOffsetOfDataView);
}
}, {
key: "setFloat32",
value: function setFloat32(byteOffset, value, littleEndian) {
this._internalBuffer.setFloat32(0, value, littleEndian);
this.setUint8(byteOffset, this._internalBuffer.getUint8(0));
this.setUint8(byteOffset + 1, this._internalBuffer.getUint8(1));
this.setUint8(byteOffset + 2, this._internalBuffer.getUint8(2));
this.setUint8(byteOffset + 3, this._internalBuffer.getUint8(3));
}
}, {
key: "setFloat64",
value: function setFloat64(byteOffset, value, littleEndian) {
this._internalBuffer.setFloat64(0, value, littleEndian);
this.setUint8(byteOffset, this._internalBuffer.getUint8(0));
this.setUint8(byteOffset + 1, this._internalBuffer.getUint8(1));
this.setUint8(byteOffset + 2, this._internalBuffer.getUint8(2));
this.setUint8(byteOffset + 3, this._internalBuffer.getUint8(3));
this.setUint8(byteOffset + 4, this._internalBuffer.getUint8(4));
this.setUint8(byteOffset + 5, this._internalBuffer.getUint8(5));
this.setUint8(byteOffset + 6, this._internalBuffer.getUint8(6));
this.setUint8(byteOffset + 7, this._internalBuffer.getUint8(7));
}
}, {
key: "setInt16",
value: function setInt16(byteOffset, value, littleEndian) {
this._internalBuffer.setInt16(0, value, littleEndian);
this.setUint8(byteOffset, this._internalBuffer.getUint8(0));
this.setUint8(byteOffset + 1, this._internalBuffer.getUint8(1));
}
}, {
key: "setInt32",
value: function setInt32(byteOffset, value, littleEndian) {
this._internalBuffer.setInt32(0, value, littleEndian);
this.setUint8(byteOffset, this._internalBuffer.getUint8(0));
this.setUint8(byteOffset + 1, this._internalBuffer.getUint8(1));
this.setUint8(byteOffset + 2, this._internalBuffer.getUint8(2));
this.setUint8(byteOffset + 3, this._internalBuffer.getUint8(3));
}
}, {
key: "setInt8",
value: function setInt8(byteOffset, value) {
var _this$_findDataViewWi5 = this._findDataViewWithOffset(byteOffset),
_this$_findDataViewWi6 = _slicedToArray(_this$_findDataViewWi5, 2),
dataView = _this$_findDataViewWi6[0],
byteOffsetOfDataView = _this$_findDataViewWi6[1];
dataView.setInt8(byteOffset - byteOffsetOfDataView, value);
}
}, {
key: "setUint16",
value: function setUint16(byteOffset, value, littleEndian) {
this._internalBuffer.setUint16(0, value, littleEndian);
this.setUint8(byteOffset, this._internalBuffer.getUint8(0));
this.setUint8(byteOffset + 1, this._internalBuffer.getUint8(1));
}
}, {
key: "setUint32",
value: function setUint32(byteOffset, value, littleEndian) {
this._internalBuffer.setUint32(0, value, littleEndian);
this.setUint8(byteOffset, this._internalBuffer.getUint8(0));
this.setUint8(byteOffset + 1, this._internalBuffer.getUint8(1));
this.setUint8(byteOffset + 2, this._internalBuffer.getUint8(2));
this.setUint8(byteOffset + 3, this._internalBuffer.getUint8(3));
}
}, {
key: "setUint8",
value: function setUint8(byteOffset, value) {
var _this$_findDataViewWi7 = this._findDataViewWithOffset(byteOffset),
_this$_findDataViewWi8 = _slicedToArray(_this$_findDataViewWi7, 2),
dataView = _this$_findDataViewWi8[0],
byteOffsetOfDataView = _this$_findDataViewWi8[1];
dataView.setUint8(byteOffset - byteOffsetOfDataView, value);
}
}, {
key: "_findDataViewWithOffset",
value: function _findDataViewWithOffset(byteOffset) {
var byteOffsetOfDataView = 0;
var _iterator2 = _createForOfIteratorHelper(this._dataViews),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var dataView = _step2.value;
var byteOffsetOfNextDataView = byteOffsetOfDataView + dataView.byteLength;
if (byteOffset >= byteOffsetOfDataView && byteOffset < byteOffsetOfNextDataView) {
return [dataView, byteOffsetOfDataView];
}
byteOffsetOfDataView = byteOffsetOfNextDataView;
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
throw new RangeError();
}
}]);
}();
exports.MultiBufferDataView = MultiBufferDataView;
}));