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(); }); } function urlIsBlobUrl(url) { return /^blob:/.test(url); } // This is not perfect, but... meh: https://stackoverflow.com/a/36756650/1263117 export function filenameFromUrl(url) { if (urlIsBlobUrl(url)) { return null; } return url .split("/") .pop() .split("#")[0] .split("?")[0]; }