array-buffer-transfer.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435
  1. var global = require('../internals/global');
  2. var uncurryThis = require('../internals/function-uncurry-this');
  3. var uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');
  4. var toIndex = require('../internals/to-index');
  5. var isDetached = require('../internals/array-buffer-is-detached');
  6. var arrayBufferByteLength = require('../internals/array-buffer-byte-length');
  7. var PROPER_TRANSFER = require('../internals/structured-clone-proper-transfer');
  8. var TypeError = global.TypeError;
  9. var structuredClone = global.structuredClone;
  10. var ArrayBuffer = global.ArrayBuffer;
  11. var DataView = global.DataView;
  12. var min = Math.min;
  13. var ArrayBufferPrototype = ArrayBuffer.prototype;
  14. var DataViewPrototype = DataView.prototype;
  15. var slice = uncurryThis(ArrayBufferPrototype.slice);
  16. var isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get');
  17. var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get');
  18. var getInt8 = uncurryThis(DataViewPrototype.getInt8);
  19. var setInt8 = uncurryThis(DataViewPrototype.setInt8);
  20. module.exports = PROPER_TRANSFER && function (arrayBuffer, newLength, preserveResizability) {
  21. var byteLength = arrayBufferByteLength(arrayBuffer);
  22. var newByteLength = newLength === undefined ? byteLength : min(toIndex(newLength), byteLength);
  23. var fixedLength = !isResizable || !isResizable(arrayBuffer);
  24. if (isDetached(arrayBuffer)) throw TypeError('ArrayBuffer is detached');
  25. var newBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] });
  26. if (byteLength == newByteLength && (preserveResizability || fixedLength)) return newBuffer;
  27. if (!preserveResizability || fixedLength) return slice(newBuffer, 0, newByteLength);
  28. var newNewBuffer = new ArrayBuffer(newByteLength, maxByteLength && { maxByteLength: maxByteLength(newBuffer) });
  29. var a = new DataView(newBuffer);
  30. var b = new DataView(newNewBuffer);
  31. for (var i = 0; i < newByteLength; i++) setInt8(b, i, getInt8(a, i));
  32. return newNewBuffer;
  33. };