redis-smq-common
Version:
Provides essential components and utilities shared across RedisSMQ packages.
58 lines • 2.34 kB
JavaScript
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