function decompressValveLZMA(buffer) {
if (buffer.length < 13) {
throw new Error("Buffer too short to be Valve LZMA");
}
const magic = buffer.readUInt32BE(0); // 'LZMA' magic
if (magic !== 0x4C5A4D41) {
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;
if (buffer.length < expectedTotal) {
throw new Error(`Buffer too short: expected ${expectedTotal}, have ${buffer.length}`);
}
const props = buffer.slice(12, 17); // 5 байт props
const lzmaData = buffer.slice(17, 17 + compressedLength);
return new Promise((resolve, reject) => {
const lzma = new LZMA();
// Собираем заголовок LZMA: props (5) + uncompressed size (8 байт LE)
const lzmaHeader = Buffer.alloc(13);
props.copy(lzmaHeader, 0);
lzmaHeader.writeBigUInt64LE(BigInt(uncompressedLength), 5);
const fullLzmaStream = Buffer.concat([lzmaHeader, lzmaData]);
lzma.decompress(fullLzmaStream, (result, error) => {
if (error) {
reject(error);
} else {
resolve(result);
}
});
});
}
var BinaryKVParser = require('binarykvparser');
handlers[Language.StoreGetUserDataResponse] = async (body) => {
let proto = decodeProto(Protos.CMsgStoreGetUserDataResponse, body);
const result = await decompressValveLZMA(proto.price_sheet);
const parsed = BinaryKVParser.parse(result);
}
I hope it will save time for someone