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:
parent
18883e65a9
commit
5aa5fe95fd
5 changed files with 36 additions and 16 deletions
|
|
@ -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
2
package-lock.json
generated
|
|
@ -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": {
|
||||||
|
|
|
||||||
36
src/Demo.ts
36
src/Demo.ts
|
|
@ -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 [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue