UNPKG

multi-buffer-data-view

Version:

A wrapper around the native DataView which can handle multiple ArrayBuffers.

248 lines (244 loc) 13.4 kB
(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; }));