import { createReadStream, createWriteStream, existsSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { basename, join } from 'node:path'; import { extract } from 'tar-fs'; import { createBrotliDecompress, createUnzip } from 'node:zlib'; class LambdaFS { /** * Decompresses a (tarballed) Brotli or Gzip compressed file and returns the path to the decompressed file/folder. * * @param filePath Path of the file to decompress. */ static inflate(filePath: string): Promise { const output = filePath.includes("swiftshader") ? tmpdir() : join(tmpdir(), basename(filePath).replace(/[.](?:t(?:ar(?:[.](?:br|gz))?|br|gz)|br|gz)$/i, '')); return new Promise((resolve, reject) => { if (filePath.includes("swiftshader")) { if (existsSync(`${output}/libGLESv2.so`)) { return resolve(output); } } else { if (existsSync(output) === true) { return resolve(output); } } let source = createReadStream(filePath, { highWaterMark: 2 ** 23 }); let target = null; if (/[.](?:t(?:ar(?:[.](?:br|gz))?|br|gz))$/i.test(filePath) === true) { target = extract(output); target.once('finish', () => { return resolve(output); }); } else { target = createWriteStream(output, { mode: 0o700 }); } source.once('error', (error: Error) => { return reject(error); }); target.once('error', (error: Error) => { return reject(error); }); target.once('close', () => { return resolve(output); }); if (/(?:br|gz)$/i.test(filePath) === true) { source.pipe(/br$/i.test(filePath) ? createBrotliDecompress({ chunkSize: 2 ** 21 }) : createUnzip({ chunkSize: 2 ** 21 })).pipe(target); } else { source.pipe(target); } }); } } export = LambdaFS;