1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-04 00:54:14 +02:00

more granular parse modes

This commit is contained in:
Robin Appelman 2018-03-06 00:09:31 +01:00
commit 5aa5fe95fd
5 changed files with 36 additions and 16 deletions

View file

@ -1,3 +1,5 @@
import {ParseMode} from "../src/Demo";
const Demo = require('../index'); const Demo = require('../index');
const fs = require('fs'); const fs = require('fs');
const argv = require('minimist')(process.argv.slice(2), {boolean: true}); const argv = require('minimist')(process.argv.slice(2), {boolean: true});
@ -15,7 +17,7 @@ const echo = function (data) {
fs.readFile(argv._[0], function (err, data) { fs.readFile(argv._[0], function (err, data) {
if (err) throw err; if (err) throw err;
const demo = Demo.fromNodeBuffer(data); const demo = Demo.fromNodeBuffer(data);
const analyser = demo.getAnalyser(!argv.slow); const analyser = demo.getAnalyser(argv.slow ? ParseMode.ENTITIES : ParseMode.MINIMAL);
const head = analyser.getHeader(); const head = analyser.getHeader();
if (argv.head) { if (argv.head) {
echo(head); echo(head);

2
package-lock.json generated
View file

@ -1,6 +1,6 @@
{ {
"name": "@demostf/demo.js", "name": "@demostf/demo.js",
"version": "2.0.2", "version": "2.0.3",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

View file

@ -3,6 +3,12 @@ import {Analyser} from './Analyser';
import {PacketTypeId} from './Data/Packet'; import {PacketTypeId} from './Data/Packet';
import {Parser} from './Parser'; import {Parser} from './Parser';
export enum ParseMode {
MINIMAL,
ENTITIES,
COMPLETE
}
export class Demo { export class Demo {
public static fromNodeBuffer(nodeBuffer: Buffer) { public static fromNodeBuffer(nodeBuffer: Buffer) {
return new Demo(nodeBuffer.buffer as ArrayBuffer); return new Demo(nodeBuffer.buffer as ArrayBuffer);
@ -16,19 +22,31 @@ export class Demo {
this.stream = new BitStream(arrayBuffer); this.stream = new BitStream(arrayBuffer);
} }
public getParser(fastMode: boolean = false) { public getParser(mode: ParseMode = ParseMode.ENTITIES) {
if (!this.parser) { if (!this.parser) {
const skippedPackets = fastMode ? [ this.parser = new Parser(this.stream, this.getSkippedPackets(mode));
PacketTypeId.packetEntities,
PacketTypeId.tempEntities,
PacketTypeId.entityMessage
] : [];
this.parser = new Parser(this.stream, skippedPackets);
} }
return this.parser; return this.parser;
} }
public getAnalyser(fastMode: boolean = false) { public getAnalyser(mode: ParseMode = ParseMode.ENTITIES) {
return new Analyser(this.getParser(fastMode)); return new Analyser(this.getParser(mode));
}
private getSkippedPackets(mode: ParseMode) {
switch (mode) {
case ParseMode.MINIMAL:
return [
PacketTypeId.packetEntities,
PacketTypeId.tempEntities,
PacketTypeId.entityMessage
];
case ParseMode.ENTITIES:
return [
PacketTypeId.tempEntities
];
case ParseMode.COMPLETE:
return [];
}
} }
} }

View file

@ -7,7 +7,7 @@ import {createGunzip, createUnzip} from 'zlib';
import {Packet} from '../../Data/Packet'; import {Packet} from '../../Data/Packet';
import {EntityId, PVS} from '../../Data/PacketEntity'; import {EntityId, PVS} from '../../Data/PacketEntity';
import {SendPropValue} from '../../Data/SendProp'; import {SendPropValue} from '../../Data/SendProp';
import {Demo} from '../../Demo'; import {Demo, ParseMode} from '../../Demo';
interface ResultData { interface ResultData {
tick: number; tick: number;
@ -21,7 +21,7 @@ function writeEntities(name: string) {
const targetFile = `${__dirname}/../data/${name}_entities.json`; const targetFile = `${__dirname}/../data/${name}_entities.json`;
const source = readFileSync(`${__dirname}/../data/${name}.dem`); const source = readFileSync(`${__dirname}/../data/${name}.dem`);
const demo = Demo.fromNodeBuffer(source); const demo = Demo.fromNodeBuffer(source);
const parser = demo.getParser(false); const parser = demo.getParser(ParseMode.COMPLETE);
const resultData = getResultData(parser.getPackets()); const resultData = getResultData(parser.getPackets());
@ -64,7 +64,7 @@ function testEntities(name: string, entityCount: number) {
const targetFile = `${__dirname}/../data/${name}_entities.json.gz`; const targetFile = `${__dirname}/../data/${name}_entities.json.gz`;
const source = readFileSync(`${__dirname}/../data/${name}.dem`); const source = readFileSync(`${__dirname}/../data/${name}.dem`);
const demo = Demo.fromNodeBuffer(source); const demo = Demo.fromNodeBuffer(source);
const parser = demo.getParser(false); const parser = demo.getParser(ParseMode.COMPLETE);
const resultData = getResultData(parser.getPackets()); const resultData = getResultData(parser.getPackets());

View file

@ -1,13 +1,13 @@
import * as assert from 'assert'; import * as assert from 'assert';
import {BitStream} from 'bit-buffer'; import {BitStream} from 'bit-buffer';
import {readFileSync} from 'fs'; import {readFileSync} from 'fs';
import {Demo} from '../../Demo'; import {Demo, ParseMode} from '../../Demo';
function testDemo(name: string, fastMode: boolean = false) { function testDemo(name: string, fastMode: boolean = false) {
const target = JSON.parse(readFileSync(`${__dirname}/../data/${name}.json`, 'utf8')); const target = JSON.parse(readFileSync(`${__dirname}/../data/${name}.json`, 'utf8'));
const source = readFileSync(`${__dirname}/../data/${name}.dem`); const source = readFileSync(`${__dirname}/../data/${name}.dem`);
const demo = Demo.fromNodeBuffer(source); const demo = Demo.fromNodeBuffer(source);
const analyser = demo.getAnalyser(fastMode); const analyser = demo.getAnalyser(fastMode ? ParseMode.MINIMAL : ParseMode.COMPLETE);
const parsed = analyser.getBody().getState(); const parsed = analyser.getBody().getState();
assert.deepEqual(JSON.parse(JSON.stringify(parsed)), target); assert.deepEqual(JSON.parse(JSON.stringify(parsed)), target);
} }