Skip to content

Instantly share code, notes, and snippets.

@asidko
Created April 20, 2022 14:00
Show Gist options
  • Save asidko/9c7064027039411a11323eaf7d8ea2a4 to your computer and use it in GitHub Desktop.
Save asidko/9c7064027039411a11323eaf7d8ea2a4 to your computer and use it in GitHub Desktop.
Encode and decode base64 GZIP with pure JavaScript. Works in all modern browsers.
// Paste the following example to browser console
// Comppreses string to GZIP. Retruns a Promise with Base64 string
const compress = string => {
const blobToBase64 = blob => new Promise((resolve, _) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.readAsDataURL(blob);
});
const byteArray = new TextEncoder().encode(string);
const cs = new CompressionStream('gzip');
const writer = cs.writable.getWriter();
writer.write(byteArray);
writer.close();
return new Response(cs.readable).blob().then(blobToBase64);
};
// Decompresses base64 encoded GZIP string. Retruns a string with original text.
const decompress = base64string => {
const bytes = Uint8Array.from(atob(base64string), c => c.charCodeAt(0));
const cs = new DecompressionStream('gzip');
const writer = cs.writable.getWriter();
writer.write(bytes);
writer.close();
return new Response(cs.readable).arrayBuffer().then(function (arrayBuffer) {
return new TextDecoder().decode(arrayBuffer);
});
}
/////////////////////
// Checking
/////////////////////
Promise.resolve("Hello GZIP!")
.then(v => {
console.log("Original value: %s", v);
return v;
})
.then(v => compress(v))
.then(v => {
console.log("Compressed value: %s", v);
return v;
})
.then(v => decompress(v))
.then(v => console.log("Decomporessed value: %s", v));
@davidnormo
Copy link

Thanks @asidko I was trying to roll my own version of this but ran into an error from the Response: "TypeError: Failed to fetch". I believe it was something to do with my approach to base64 encoding. Your implementation worked a treat 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment