array-buffer-transfer.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 'use strict';
  2. var globalThis = require('../internals/global-this');
  3. var uncurryThis = require('../internals/function-uncurry-this');
  4. var uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');
  5. var toIndex = require('../internals/to-index');
  6. var notDetached = require('../internals/array-buffer-not-detached');
  7. var arrayBufferByteLength = require('../internals/array-buffer-byte-length');
  8. var detachTransferable = require('../internals/detach-transferable');
  9. var PROPER_STRUCTURED_CLONE_TRANSFER = require('../internals/structured-clone-proper-transfer');
  10. var structuredClone = globalThis.structuredClone;
  11. var ArrayBuffer = globalThis.ArrayBuffer;
  12. var DataView = globalThis.DataView;
  13. var max = Math.max;
  14. var min = Math.min;
  15. var ArrayBufferPrototype = ArrayBuffer.prototype;
  16. var DataViewPrototype = DataView.prototype;
  17. var slice = uncurryThis(ArrayBufferPrototype.slice);
  18. var isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get');
  19. var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get');
  20. var getInt8 = uncurryThis(DataViewPrototype.getInt8);
  21. var setInt8 = uncurryThis(DataViewPrototype.setInt8);
  22. module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) {
  23. var byteLength = arrayBufferByteLength(arrayBuffer);
  24. var newByteLength = newLength === undefined ? byteLength : toIndex(newLength);
  25. var fixedLength = !isResizable || !isResizable(arrayBuffer);
  26. var newBuffer;
  27. notDetached(arrayBuffer);
  28. if (PROPER_STRUCTURED_CLONE_TRANSFER) {
  29. arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] });
  30. if (byteLength === newByteLength && (preserveResizability || fixedLength)) return arrayBuffer;
  31. }
  32. if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) {
  33. newBuffer = slice(arrayBuffer, 0, newByteLength);
  34. } else {
  35. var options = preserveResizability && !fixedLength && maxByteLength
  36. ? { maxByteLength: max(newByteLength, maxByteLength(arrayBuffer)) }
  37. : undefined;
  38. newBuffer = new ArrayBuffer(newByteLength, options);
  39. var a = new DataView(arrayBuffer);
  40. var b = new DataView(newBuffer);
  41. var copyLength = min(newByteLength, byteLength);
  42. for (var i = 0; i < copyLength; i++) setInt8(b, i, getInt8(a, i));
  43. }
  44. if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachTransferable(arrayBuffer);
  45. return newBuffer;
  46. };