export async function genArrayBufferFromFileReference(fileReference) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = function(e) { resolve(e.target.result); }; reader.onerror = function(e) { reject(e); }; reader.readAsArrayBuffer(fileReference); }); } export async function genArrayBufferFromUrl(url) { return new Promise((resolve, reject) => { const oReq = new XMLHttpRequest(); oReq.open("GET", url, true); oReq.responseType = "arraybuffer"; oReq.onload = () => { const arrayBuffer = oReq.response; // Note: not oReq.responseText resolve(arrayBuffer); }; oReq.onerror = reject; oReq.send(null); }); } export async function promptForFileReferences(accept) { return new Promise(resolve => { // Does this represent a memory leak somehow? // Can this fail? Do we ever reject? const fileInput = document.createElement("input"); if (accept) fileInput.setAttribute("accept", accept); fileInput.type = "file"; fileInput.multiple = true; // Not entirely sure why this is needed, since the input // was just created, but somehow this helps prevent change // events from getting swallowed. // https://stackoverflow.com/a/12102992/1263117 fileInput.value = null; fileInput.addEventListener("change", e => { resolve(e.target.files); }); fileInput.click(); }); }