UNPKG

@logic-pad/core

Version:
42 lines (41 loc) 1.69 kB
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); }); } }