30 lines
725 B
JavaScript
30 lines
725 B
JavaScript
|
/**
|
||
|
* An abstraction for slicing an arraybuffer even when
|
||
|
* ArrayBuffer.prototype.slice is not supported
|
||
|
*
|
||
|
* @api public
|
||
|
*/
|
||
|
|
||
|
module.exports = function(arraybuffer, start, end) {
|
||
|
var bytes = arraybuffer.byteLength;
|
||
|
start = start || 0;
|
||
|
end = end || bytes;
|
||
|
|
||
|
if (arraybuffer.slice) { return arraybuffer.slice(start, end); }
|
||
|
|
||
|
if (start < 0) { start += bytes; }
|
||
|
if (end < 0) { end += bytes; }
|
||
|
if (end > bytes) { end = bytes; }
|
||
|
|
||
|
if (start >= bytes || start >= end || bytes === 0) {
|
||
|
return new ArrayBuffer(0);
|
||
|
}
|
||
|
|
||
|
var abv = new Uint8Array(arraybuffer);
|
||
|
var result = new Uint8Array(end - start);
|
||
|
for (var i = start, ii = 0; i < end; i++, ii++) {
|
||
|
result[ii] = abv[i];
|
||
|
}
|
||
|
return result.buffer;
|
||
|
};
|