generated from ztimson/template
33 lines
1.0 KiB
JavaScript
33 lines
1.0 KiB
JavaScript
'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});
|
|
}
|
|
});
|