'use strict'; import {parentPort} from 'node:worker_threads'; import {decompress as lzmaDecompress} from 'lzma1'; import {ZstdCodec} from 'zstd-codec'; let zstdStreamingPromise = null; function getZstd() { if (!zstdStreamingPromise) { zstdStreamingPromise = new Promise(resolve => ZstdCodec.run(zstd => resolve(new zstd.Streaming()))); } return zstdStreamingPromise; } /** Rebuilds a full 13-byte "alone" LZMA header from libzim's truncated 5-byte one (unknown size). */ function toLzmaAloneStream(body) { const header = Buffer.concat([body.subarray(0, 5), Buffer.alloc(8, 0xff)]); return Buffer.concat([header, body.subarray(5)]); } parentPort.on('message', async ({id, compType, body}) => { try { const buf = Buffer.from(body); const data = compType === 4 ? Buffer.from(lzmaDecompress(toLzmaAloneStream(buf))) : Buffer.from((await getZstd()).decompress(new Uint8Array(buf))); parentPort.postMessage({id, data}, [data.buffer]); } catch (e) { parentPort.postMessage({id, error: e.message}); } });