1 | 'use strict';
|
2 | var global = require('../internals/global');
|
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 isDetached = require('../internals/array-buffer-is-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 |
|
11 | var structuredClone = global.structuredClone;
|
12 | var ArrayBuffer = global.ArrayBuffer;
|
13 | var DataView = global.DataView;
|
14 | var TypeError = global.TypeError;
|
15 | var min = Math.min;
|
16 | var ArrayBufferPrototype = ArrayBuffer.prototype;
|
17 | var DataViewPrototype = DataView.prototype;
|
18 | var slice = uncurryThis(ArrayBufferPrototype.slice);
|
19 | var isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get');
|
20 | var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get');
|
21 | var getInt8 = uncurryThis(DataViewPrototype.getInt8);
|
22 | var setInt8 = uncurryThis(DataViewPrototype.setInt8);
|
23 |
|
24 | module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) {
|
25 | var byteLength = arrayBufferByteLength(arrayBuffer);
|
26 | var newByteLength = newLength === undefined ? byteLength : toIndex(newLength);
|
27 | var fixedLength = !isResizable || !isResizable(arrayBuffer);
|
28 | var newBuffer;
|
29 | if (isDetached(arrayBuffer)) throw new TypeError('ArrayBuffer is detached');
|
30 | if (PROPER_STRUCTURED_CLONE_TRANSFER) {
|
31 | arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] });
|
32 | if (byteLength === newByteLength && (preserveResizability || fixedLength)) return arrayBuffer;
|
33 | }
|
34 | if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) {
|
35 | newBuffer = slice(arrayBuffer, 0, newByteLength);
|
36 | } else {
|
37 | var options = preserveResizability && !fixedLength && maxByteLength ? { maxByteLength: maxByteLength(arrayBuffer) } : 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 | };
|