@logic-pad/core
Version:
42 lines (41 loc) • 1.69 kB
JavaScript
import CompressorBase from './compressorBase.js';
function ensureCompressionStream() {
if (!globalThis.CompressionStream || !globalThis.DecompressionStream) {
console.log('CompressionStream not supported. Loading polyfill.');
return import('../../../polyfill/streamPolyfill.js');
}
return Promise.resolve();
}
const encoder = new TextEncoder();
const decoder = new TextDecoder();
export default class StreamCompressor extends CompressorBase {
async compress(input) {
await ensureCompressionStream();
const blobToBase64 = (blob) => new Promise(resolve => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.readAsDataURL(blob);
});
const byteArray = encoder.encode(input);
const cs = new CompressionStream(this.algorithm);
const writer = cs.writable.getWriter();
writer.ready
.then(() => writer.write(byteArray))
.then(() => writer.close())
.catch(console.log);
return new Response(cs.readable).blob().then(blobToBase64);
}
async decompress(input) {
await ensureCompressionStream();
const bytes = Uint8Array.from(atob(input), c => c.charCodeAt(0));
const cs = new DecompressionStream(this.algorithm);
const writer = cs.writable.getWriter();
writer.ready
.then(() => writer.write(bytes))
.then(() => writer.close())
.catch(console.log);
return new Response(cs.readable).arrayBuffer().then(arrayBuffer => {
return decoder.decode(arrayBuffer);
});
}
}