You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.5 KiB
61 lines
1.5 KiB
/**
|
|
* @module to-array-buffer
|
|
*/
|
|
|
|
'use strict'
|
|
|
|
var str2ab = require('string-to-arraybuffer')
|
|
var flat = require('flatten-vertex-data')
|
|
// var isBlob = require('is-blob')
|
|
|
|
|
|
module.exports = function toArrayBuffer (arg) {
|
|
//zero-length or undefined-like
|
|
if (!arg) return null
|
|
|
|
//array buffer
|
|
if (arg instanceof ArrayBuffer) return arg
|
|
|
|
//try to decode data-uri
|
|
if (typeof arg === 'string') {
|
|
return str2ab(arg)
|
|
}
|
|
|
|
// File & Blob
|
|
// if (isBlob(src) || (src instanceof global.File)) {
|
|
// FIXME: we cannot use it here bc FileReader is async
|
|
// }
|
|
|
|
//array buffer view: TypedArray, DataView, Buffer etc
|
|
if (ArrayBuffer.isView(arg)) {
|
|
// if byteOffset is not 0, return sub-reference (slice is the only way)
|
|
if (arg.byteOffset) {
|
|
return arg.buffer.slice(arg.byteOffset, arg.byteOffset + arg.byteLength)
|
|
}
|
|
return arg.buffer
|
|
}
|
|
|
|
//buffer/data nested: NDArray, ImageData etc.
|
|
//FIXME: NDArrays with custom data type may be invalid for this procedure
|
|
if (arg.buffer || arg.data || arg._data) {
|
|
var result = toArrayBuffer(arg.buffer || arg.data || arg._data)
|
|
return result
|
|
}
|
|
|
|
// detect if flat
|
|
if (Array.isArray(arg)) {
|
|
for (var i = 0; i < arg.length; i++) {
|
|
if (arg[i].length != null) {
|
|
arg = flat(arg)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
//array-like or unknown
|
|
//consider Uint8Array knows how to treat the input
|
|
var result = new Uint8Array(arg)
|
|
|
|
if (!result.length) return null
|
|
return result.buffer
|
|
}
|
|
|