UNPKG

deadem

Version:

JavaScript (Node.js & Browsers) parser for Deadlock (Valve Source 2 Engine) demo/replay files

95 lines (67 loc) 2.08 kB
import Assert from '#core/Assert.js'; import DemoPacketRaw from '#data/DemoPacketRaw.js'; import VarInt32 from '#data/VarInt32.js'; import DemoSource from '#data/enums/DemoSource.js'; class DemoPacketRawBroadcastExtractor { /** * @public * @constructor * @param {Buffer} buffer */ constructor(buffer) { this._buffer = buffer; this._tail = buffer; } /** * @public * @returns {Buffer} */ get tail() { return this._tail; } /** * @public * @param {number} sequenceStart * @returns {Generator<DemoPacketRaw|null, void, *>} */ *retrieve(sequenceStart) { Assert.isTrue(Number.isInteger(sequenceStart)); this._tail = this._buffer; for (let sequence = sequenceStart; true; sequence++) { let offset = 0; const type = VarInt32.parse(this._tail.subarray(offset)); if (type === null) { yield null; break; } offset += type.size; let tick; try { tick = new VarInt32(this._tail.readUInt32LE(offset), 4); } catch { yield null; break; } offset += tick.size; // 1 byte ignored offset += 1; let frame; try { frame = new VarInt32(this._tail.readUInt32LE(offset), 4); } catch { yield null; break; } offset += frame.size; if (this._tail.byteLength - offset >= frame.value) { yield new DemoPacketRaw(sequence, type, DemoSource.HTTP_BROADCAST, tick, frame, new Uint8Array(this._tail.subarray(offset, offset + frame.value))); offset += frame.value; this._tail = this._tail.subarray(offset); } else { yield null; break; } } } } export default DemoPacketRawBroadcastExtractor;