const { LZMA } = require('lzma-native');
function decompressValveLZMA(buffer) {
if (buffer.length < 13) {
throw new Error("Buffer too short to be Valve LZMA");
}
const magic = buffer.readUInt32BE(0); // Big-Endian
if (magic !== 0x4C5A4D41) { // 'LZMA'
throw new Error("Not a Valve LZMA container (magic mismatch)");
}
const uncompressedLength = buffer.readUInt32LE(4);
const compressedLength = buffer.readUInt32LE(8);
const expectedTotal = 12 + 5 + compressedLength; // header (12) + props(5) + data
if (buffer.length < expectedTotal) {
throw new Error(`Buffer too short: expected ${expectedTotal}, have ${buffer.length}`);
}
const props = buffer.slice(12, 12 + 5);
const lzmaData = buffer.slice(12 + 5, 12 + 5 + compressedLength);
return new Promise((resolve, reject) => {
const lzma = new LZMA();
const lzmaHeader = Buffer.alloc(5 + 8);
props.copy(lzmaHeader, 0); // копируем 5 байт props
lzmaHeader.writeUInt32LE(uncompressedLength, 5);
const fullLzmaStream = Buffer.concat([lzmaHeader, lzmaData]);
lzma.decompress(fullLzmaStream, (result, error) => {
if (error) {
reject(error);
} else {
resolve(Buffer.from(result));
}
});
});
}