/** * Encodes a gzipped binary blob to a base64 string. * * Note that the string is url-compatible base64, * meaning some chars are swapped for compatibility */ export async function toBase64(blob: Blob): Promise { return new Promise(async (resolve) => { const reader = new FileReader(); reader.onloadend = function () { resolve( `${(reader.result as string) .replace(/^data:application\/octet-stream;base64,/, "") .replaceAll("+", ".") .replaceAll("/", "_") .replaceAll("=", "-")}`, ); }; reader.readAsDataURL(blob); }); } export async function fromBase64( base64: string, fetch = window.fetch, ): Promise { return fetch( `data:application/octet-stream;base64,${base64 .replaceAll(".", "+") .replaceAll("_", "/") .replaceAll("-", "=")}`, ).then((it) => it.blob()); }