blob2ab.mjs

import genPm from './genPm.mjs'
import isWindow from './isWindow.mjs'


function coreOthers(bb) {

    //pm
    let pm = genPm()

    //reader
    let reader = new FileReader()

    //onload
    reader.onload = function() {

        //ab
        let ab = reader.result //event.target.result

        //resolve
        pm.resolve(ab)

    }

    //onerror
    reader.onerror = function (err) {
        pm.reject(err)
    }

    //readAsArrayBuffer
    reader.readAsArrayBuffer(bb)

    return pm
}


function coreHTML5(bb) {
    return bb.arrayBuffer()
}


/**
 * 前端Blob或input檔案物件轉ArrayBuffer資料陣列
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/blob2ab.test.mjs Github}
 * @memberOf wsemi
 * @param {Blob|File} bb 輸入Blob或File
 * @returns {Promise} 回傳Promise,resolve回傳Blob或File的ArrayBuffer資料陣列,reject回傳錯誤訊息
 * @example
 * need test in browser
 *
 * let bb = new Blob([new Uint8Array([66, 97, 115])])
 * blob2ab(b)
 *     .then(function(ab){
 *         console.log(ab)
 *         // => ArrayBuffer(3) {
 *         //     [[Int8Array]]: Int8Array(3) [66, 97, 115]
 *         //     [[Uint8Array]]: Uint8Array(3) [66, 97, 115]
 *         //     byteLength: 3
 *         // }
 *     })
 *
 */
function blob2ab(bb) {

    //check
    if (!isWindow()) {
        return Promise.reject('no window')
    }

    try {
        return coreHTML5(bb)
    }
    catch (err) {
        return coreOthers(bb) //IE11, Opera, Safari
    }
}


export default blob2ab