UNPKG

redis-smq-common

Version:

Provides essential components and utilities shared across RedisSMQ packages.

58 lines 2.34 kB
import fs from 'fs'; import { exec } from 'node:child_process'; import { promisify } from 'node:util'; const execAsync = promisify(exec); async function readChunkFromFile(filePath, offset, blockSize = 1, blockCount = 1) { const stream = fs.createReadStream(filePath, { start: offset, end: offset + blockSize * blockCount - 1, }); const buffers = []; let data; for await (data of stream) { buffers.push(data); } return Buffer.concat(buffers); } async function calculateRpmHeaderSize(filePath, headerOffset) { const magic = (await readChunkFromFile(filePath, headerOffset, 3, 1)).toString('hex'); if (magic !== '8eade8') { throw new Error(`File doesn't look like rpm`); } let offset = headerOffset + 8; const bytes = Array.from(await readChunkFromFile(filePath, offset, 8, 1)); const size = 8 + ((bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3]) * 16 + (bytes[4] << 24) + (bytes[5] << 16) + (bytes[6] << 8) + bytes[7]; offset += size; return { size, offset }; } function getPayloadDecompressionCommand(payloadMagic) { const decompressCommands = { '425a': 'bunzip2', '1f8b': 'gunzip', fd37: 'xzcat', '5d00': 'unlzma', '28b5': 'unzstd', }; const command = decompressCommands[payloadMagic]; if (!command) { throw new Error(`Unrecognized payload compression format: ${payloadMagic}`); } return command; } export async function extractRpm(filePath, destinationDirectory) { const rpmMagic = (await readChunkFromFile(filePath, 0, 4, 1)).toString('hex'); if (rpmMagic !== 'edabeedb') { throw new Error(`File doesn't look like rpm: ${filePath}`); } const { size, offset } = await calculateRpmHeaderSize(filePath, 96); const { offset: payloadOffset } = await calculateRpmHeaderSize(filePath, offset + ((8 - (size % 8)) % 8)); const payloadMagic = (await readChunkFromFile(filePath, payloadOffset, 2, 1)).toString('hex'); const decompressCommand = getPayloadDecompressionCommand(payloadMagic); await execAsync(`dd if="${filePath}" skip="${payloadOffset}" iflag=skip_bytes status=none | ${decompressCommand} | cpio -idmv`, { cwd: destinationDirectory }); } //# sourceMappingURL=extract-rpm.js.map