| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | import pako from 'pako';import * as UZIP from 'uzip';import JSZip from 'jszip';const wk = self as unknown as {  postMessage(b: unknown, bufs: ArrayBuffer[]): void;};const dcmp = ['inflate', 'gunzip', 'unzlib'];const concat = (chunks: Uint8Array[]) => {  const out = new Uint8Array(    chunks.reduce((a, v) => v.length + a, 0)  );  let loc = 0;  for (const chunk of chunks) {    out.set(chunk, loc);    loc += chunk.length;  }  return out;}// CRC32 tableconst crct = new Uint32Array(256);for (let i = 0; i < 256; ++i) {  let c = i, k = 9;  while (--k) c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);  crct[i] = c;}// CRC32const crc = (d: Uint8Array) => {  let c = 0xFFFFFFFF;  for (let i = 0; i < d.length; ++i) c = crct[(c & 255) ^ d[i]] ^ (c >>> 8);  return c ^ 0xFFFFFFFF;}const uzGzip = (d: Uint8Array) => {  const raw = UZIP.deflateRaw(d);  const head = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 0]);  const c = crc(d);  const l = raw.length;  const tail = new Uint8Array([    c & 255, (c >>> 8) & 255, (c >>> 16) & 255, (c >>> 32) & 255,    l & 255, (l >>> 8) & 255, (l >>> 16) & 255, (l >>> 32) & 255,  ]);  return concat([head, raw, tail]);}onmessage = (ev: MessageEvent<[string, string]>) => {  const [lib, type] = ev.data;  if (lib == 'pako') {    if (type == 'zip') {      const zip = new JSZip();      onmessage = (ev: MessageEvent<null | [string, Uint8Array]>) => {        if (ev.data) {          zip.file(ev.data[0], ev.data[1]);        } else zip.generateAsync({          type: 'uint8array',          compressionOptions: { level: 6 }        }).then(buf => {          wk.postMessage([buf, true], [buf.buffer]);        })      };    } else if (type == 'unzip') {      onmessage = (ev: MessageEvent<Uint8Array>) => {        JSZip.loadAsync(ev.data).then(zip => {          const out: Record<string, Uint8Array> = {};          const bufs: Promise<ArrayBuffer>[] = [];          for (const k in zip.files) {            const file = zip.files[k];            bufs.push(file.async('uint8array').then(v => {              out[file.name] = v;              return v.buffer;            }));          }          Promise.all(bufs).then(res => {            wk.postMessage([out, true], res);          });        })      }    } else {      const strm = dcmp.indexOf(type) == -1      ? new pako.Deflate(type == 'gzip' ? {          gzip: true        } : {          raw: type == 'inflate'        }      ) : new pako.Inflate({        raw: type == 'deflate'      });      let chk: Uint8Array;      strm.onData = (chunk: Uint8Array) => {        if (chk) wk.postMessage([chk, false], [chk.buffer]);        chk = chunk;      };      onmessage = (ev: MessageEvent<[Uint8Array, boolean]>) => {        strm.push(ev.data[0], ev.data[1]);        if (ev.data[1]) wk.postMessage([chk, true], [chk.buffer]);      };    }  } else if (lib == 'uzip') {    if (type == 'zip') {      const zip: Record<string, Uint8Array> = {};      onmessage = (ev: MessageEvent<null | [string, Uint8Array]>) => {        if (ev.data) {          zip[ev.data[0]] = ev.data[1];        } else {          console.log(zip);          const buf = UZIP.encode(zip);          wk.postMessage([new Uint8Array(buf), true], [buf]);        }      };    } else if (type == 'unzip') {      onmessage = (ev: MessageEvent<Uint8Array>) => {        const bufs = UZIP.parse(ev.data.buffer);        const outBufs: ArrayBuffer[] = [];        for (const k in bufs) {          outBufs.push(bufs[k]);          bufs[k] = new Uint8Array(bufs[k]);        }        wk.postMessage([bufs, true], outBufs);      }    } else {      const chunks: Uint8Array[] = [];      onmessage = (ev: MessageEvent<[Uint8Array, boolean]>) => {        chunks.push(ev.data[0]);        if (ev.data[1]) {          const out = concat(chunks);          const buf = type == 'inflate'            ? UZIP.inflateRaw(out)            : type == 'deflate'              ? UZIP.deflateRaw(out)              : type == 'zlib'                ? UZIP.deflate(out)                : type == 'unzlib'                  ? UZIP.inflate(out)                  : type == 'gzip'                    ? uzGzip(out)                    // we can pray that there's no special header                    : UZIP.inflateRaw(out.subarray(10, -8));          wk.postMessage([buf, true], [buf.buffer]);        }      }    }  }}
 |