/** @param {string} input */ export async function compress_and_encode_text(input) { const reader = new Blob([input]).stream().pipeThrough(new CompressionStream('gzip')).getReader(); let buffer = ''; for (;;) { const { done, value } = await reader.read(); if (done) { reader.releaseLock(); return btoa(buffer).replaceAll('+', '-').replaceAll('/', '_'); } else { for (let i = 0; i < value.length; i++) { // decoding as utf-8 will make btoa reject the string buffer += String.fromCharCode(value[i]); } } } } /** @param {string} input */ export async function decode_and_decompress_text(input) { const decoded = atob(input.replaceAll('-', '+').replaceAll('_', '/')); // putting it directly into the blob gives a corrupted file const u8 = new Uint8Array(decoded.length); for (let i = 0; i < decoded.length; i++) { u8[i] = decoded.charCodeAt(i); } const stream = new Blob([u8]).stream().pipeThrough(new DecompressionStream('gzip')); return new Response(stream).text(); }