t2-demo-parser 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +170 -7
- package/dist/BitStream.d.ts +14 -3
- package/dist/BitStream.d.ts.map +1 -1
- package/dist/BitStream.js +28 -6
- package/dist/BitStream.js.map +1 -1
- package/dist/BitWriter.d.ts +29 -0
- package/dist/BitWriter.d.ts.map +1 -0
- package/dist/BitWriter.js +76 -0
- package/dist/BitWriter.js.map +1 -0
- package/dist/ClassRegistry.d.ts +23 -28
- package/dist/ClassRegistry.d.ts.map +1 -1
- package/dist/ClassRegistry.js +75 -84
- package/dist/ClassRegistry.js.map +1 -1
- package/dist/DataBlockParsers.d.ts.map +1 -1
- package/dist/DataBlockParsers.js +51 -76
- package/dist/DataBlockParsers.js.map +1 -1
- package/dist/DemoParser.d.ts +86 -23
- package/dist/DemoParser.d.ts.map +1 -1
- package/dist/DemoParser.js +409 -264
- package/dist/DemoParser.js.map +1 -1
- package/dist/EventParsers.d.ts.map +1 -1
- package/dist/EventParsers.js +87 -58
- package/dist/EventParsers.js.map +1 -1
- package/dist/GhostManager.d.ts +7 -1
- package/dist/GhostManager.d.ts.map +1 -1
- package/dist/GhostManager.js +231 -146
- package/dist/GhostManager.js.map +1 -1
- package/dist/HuffmanProcessor.d.ts +15 -0
- package/dist/HuffmanProcessor.d.ts.map +1 -1
- package/dist/HuffmanProcessor.js +45 -0
- package/dist/HuffmanProcessor.js.map +1 -1
- package/dist/LiveParser.d.ts +20 -1
- package/dist/LiveParser.d.ts.map +1 -1
- package/dist/LiveParser.js +31 -12
- package/dist/LiveParser.js.map +1 -1
- package/dist/PacketParser.d.ts +22 -2
- package/dist/PacketParser.d.ts.map +1 -1
- package/dist/PacketParser.js +111 -48
- package/dist/PacketParser.js.map +1 -1
- package/dist/Timeline.d.ts +5 -2
- package/dist/Timeline.d.ts.map +1 -1
- package/dist/Timeline.js +25 -12
- package/dist/Timeline.js.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/dataBlockDataTypes.d.ts +111 -112
- package/dist/dataBlockDataTypes.d.ts.map +1 -1
- package/dist/dataBlockDataTypes.js.map +1 -1
- package/dist/defaultRegistry.d.ts +9 -0
- package/dist/defaultRegistry.d.ts.map +1 -0
- package/dist/defaultRegistry.js +43 -0
- package/dist/defaultRegistry.js.map +1 -0
- package/dist/eventDataTypes.d.ts +74 -72
- package/dist/eventDataTypes.d.ts.map +1 -1
- package/dist/eventDataTypes.js.map +1 -1
- package/dist/ghostDataTypes.d.ts +125 -131
- package/dist/ghostDataTypes.d.ts.map +1 -1
- package/dist/ghostDataTypes.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +51 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/package.json +4 -1
- package/dist/BitStream.test.d.ts +0 -2
- package/dist/BitStream.test.d.ts.map +0 -1
- package/dist/BitStream.test.js +0 -419
- package/dist/BitStream.test.js.map +0 -1
- package/dist/ClassRegistry.test.d.ts +0 -2
- package/dist/ClassRegistry.test.d.ts.map +0 -1
- package/dist/ClassRegistry.test.js +0 -83
- package/dist/ClassRegistry.test.js.map +0 -1
- package/dist/DataBlockParsers.test.d.ts +0 -2
- package/dist/DataBlockParsers.test.d.ts.map +0 -1
- package/dist/DataBlockParsers.test.js +0 -294
- package/dist/DataBlockParsers.test.js.map +0 -1
- package/dist/DemoParser.test.d.ts +0 -2
- package/dist/DemoParser.test.d.ts.map +0 -1
- package/dist/DemoParser.test.js +0 -472
- package/dist/DemoParser.test.js.map +0 -1
- package/dist/GhostStateAccumulator.test.d.ts +0 -2
- package/dist/GhostStateAccumulator.test.d.ts.map +0 -1
- package/dist/GhostStateAccumulator.test.js +0 -201
- package/dist/GhostStateAccumulator.test.js.map +0 -1
- package/dist/GhostTracker.test.d.ts +0 -2
- package/dist/GhostTracker.test.d.ts.map +0 -1
- package/dist/GhostTracker.test.js +0 -64
- package/dist/GhostTracker.test.js.map +0 -1
package/dist/DemoParser.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PacketParser } from "./PacketParser.js";
|
|
2
|
-
import { ClassRegistry } from "./ClassRegistry.js";
|
|
2
|
+
import type { ClassRegistry } from "./ClassRegistry.js";
|
|
3
3
|
import { GhostTracker } from "./GhostManager.js";
|
|
4
4
|
import type { DemoHeader, DemoFile, DemoBlock, InitialBlockData, LoadResult } from "./types.js";
|
|
5
5
|
export declare class DemoParser {
|
|
@@ -17,7 +17,33 @@ export declare class DemoParser {
|
|
|
17
17
|
private _blockStreamOffset;
|
|
18
18
|
private _blockCount?;
|
|
19
19
|
private _blockCursor;
|
|
20
|
-
|
|
20
|
+
private readonly _incremental;
|
|
21
|
+
private _complete;
|
|
22
|
+
private _inflator?;
|
|
23
|
+
/** The zlib stream announced its own end (final deflate block seen) —
|
|
24
|
+
* later bytes are trailing garbage and further pushes would throw. */
|
|
25
|
+
private _streamEnded;
|
|
26
|
+
/** Backing store for the growing decompressed stream (incremental
|
|
27
|
+
* mode). `_decompressedData` is always a length-exact subarray of
|
|
28
|
+
* this, so every existing `.length`-based read stays correct. */
|
|
29
|
+
private _backing?;
|
|
30
|
+
private _decompressedLength;
|
|
31
|
+
private _scanOffset;
|
|
32
|
+
private _bufferedMoveTicks;
|
|
33
|
+
private readonly _ignoreProtocolVersion;
|
|
34
|
+
private readonly _haltOnFault;
|
|
35
|
+
constructor(buffer: Uint8Array, options?: {
|
|
36
|
+
/** Feed the compressed block stream in chunks via push()/finish(). */
|
|
37
|
+
incremental?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Parse demos whose protocol version differs from build 25034's
|
|
40
|
+
* (0x330004). The game itself refuses to play them, and the block
|
|
41
|
+
* formats are not guaranteed to match, so expect faults.
|
|
42
|
+
*/
|
|
43
|
+
ignoreProtocolVersion?: boolean;
|
|
44
|
+
/** Passed to PacketParser; see its `haltOnFault` option. */
|
|
45
|
+
haltOnFault?: boolean;
|
|
46
|
+
});
|
|
21
47
|
getRegistry(): ClassRegistry;
|
|
22
48
|
getGhostTracker(): GhostTracker;
|
|
23
49
|
getPacketParser(): PacketParser;
|
|
@@ -25,6 +51,12 @@ export declare class DemoParser {
|
|
|
25
51
|
get header(): DemoHeader;
|
|
26
52
|
get initialBlock(): InitialBlockData;
|
|
27
53
|
get blockCount(): number;
|
|
54
|
+
/**
|
|
55
|
+
* Walk complete block headers from byte offset `from`, calling `visit`
|
|
56
|
+
* for each; returns the offset of the first incomplete block (or the
|
|
57
|
+
* end of the data).
|
|
58
|
+
*/
|
|
59
|
+
private _walkBlockHeaders;
|
|
28
60
|
get blockCursor(): number;
|
|
29
61
|
/**
|
|
30
62
|
* Async load: parses header, initial block (DataBlocks, events,
|
|
@@ -34,6 +66,53 @@ export declare class DemoParser {
|
|
|
34
66
|
* Idempotent — second call returns cached result.
|
|
35
67
|
*/
|
|
36
68
|
load(): Promise<LoadResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Parse just the fixed-size demo header from a byte prefix, without
|
|
71
|
+
* constructing a parser. Throws RangeError when `bytes` is too short —
|
|
72
|
+
* callers streaming a download retry as more data arrives. The
|
|
73
|
+
* returned `byteLength` is where the initial block begins; the block
|
|
74
|
+
* stream begins at `byteLength + header.initialBlockSize`.
|
|
75
|
+
*/
|
|
76
|
+
static peekHeader(bytes: Uint8Array): {
|
|
77
|
+
header: DemoHeader;
|
|
78
|
+
byteLength: number;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Incremental mode only: feed the next chunk of raw (compressed) block
|
|
82
|
+
* stream bytes as they arrive. Inflation happens synchronously; any
|
|
83
|
+
* blocks completed by this chunk become readable via nextBlock().
|
|
84
|
+
* The chunk is not retained.
|
|
85
|
+
*/
|
|
86
|
+
push(chunk: Uint8Array): void;
|
|
87
|
+
/**
|
|
88
|
+
* Incremental mode only: signal that the download is complete. Flushes
|
|
89
|
+
* the inflator; after this, running out of blocks means the true end
|
|
90
|
+
* of the demo rather than the frontier.
|
|
91
|
+
*/
|
|
92
|
+
finish(): void;
|
|
93
|
+
/**
|
|
94
|
+
* False only in incremental mode before finish(): nextBlock()
|
|
95
|
+
* returning undefined then means "frontier — more data may arrive",
|
|
96
|
+
* not the end of the demo.
|
|
97
|
+
*/
|
|
98
|
+
get isComplete(): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Bytes of decompressed block stream available so far. Grows during
|
|
101
|
+
* an incremental feed; consumers that latched an "out of blocks"
|
|
102
|
+
* state can compare against it to know new data has arrived.
|
|
103
|
+
*/
|
|
104
|
+
get decompressedByteLength(): number;
|
|
105
|
+
/**
|
|
106
|
+
* Move-tick blocks in the decompressed stream so far — each is one
|
|
107
|
+
* fixed 32ms simulation tick, so this measures buffered DEMO TIME
|
|
108
|
+
* exactly (compressed bytes don't: quiet stretches pack far denser).
|
|
109
|
+
* Independent of the read cursor; unaffected by reset(). Maintained
|
|
110
|
+
* incrementally as data arrives; a full lazy scan on first access
|
|
111
|
+
* covers the one-shot mode.
|
|
112
|
+
*/
|
|
113
|
+
get bufferedMoveTicks(): number;
|
|
114
|
+
private _scanBufferedTicks;
|
|
115
|
+
private _appendDecompressed;
|
|
37
116
|
/**
|
|
38
117
|
* Read and parse the next block from the decompressed buffer.
|
|
39
118
|
* Returns the parsed block, or undefined when all blocks are exhausted.
|
|
@@ -65,6 +144,11 @@ export declare class DemoParser {
|
|
|
65
144
|
* Full parse: async load + drain all blocks.
|
|
66
145
|
*/
|
|
67
146
|
parseFullDemo(): Promise<DemoFile>;
|
|
147
|
+
/**
|
|
148
|
+
* Read and validate the header the way GameConnection's demo playback
|
|
149
|
+
* does: the ident string must match and the protocol version must be
|
|
150
|
+
* the one this build speaks (unless `ignoreProtocolVersion` is set).
|
|
151
|
+
*/
|
|
68
152
|
private readHeader;
|
|
69
153
|
/** Parse the initial block: DataBlocks, scores, targets, connection state,
|
|
70
154
|
* events, ghosts, control object, and mission name. */
|
|
@@ -110,27 +194,6 @@ export declare class DemoParser {
|
|
|
110
194
|
private readConnectionProtocol;
|
|
111
195
|
private readEventStartBlock;
|
|
112
196
|
private readGhostStartBlock;
|
|
113
|
-
/**
|
|
114
|
-
* Try parsing a ghost with a given parser and validate alignment.
|
|
115
|
-
* Returns true if parsing succeeded and alignment is valid.
|
|
116
|
-
* On success, the BitStream is positioned after the parsed ghost data.
|
|
117
|
-
* On failure, the BitStream is restored to updateBitsStart.
|
|
118
|
-
*/
|
|
119
|
-
private tryGhostParser;
|
|
120
|
-
/**
|
|
121
|
-
* Peek at the GameBase DataBlock prefix to identify a ghost's parser.
|
|
122
|
-
* GameBase subclass ghost creates always start with:
|
|
123
|
-
* flag(1b) + if flag: DataBlockId(11b)
|
|
124
|
-
* The DataBlock type (e.g., "PlayerData") maps to the ghost parser
|
|
125
|
-
* (e.g., "Player") by stripping the "Data" suffix.
|
|
126
|
-
*
|
|
127
|
-
* Returns { entry, dbFlag } where entry is the parser (if found) and
|
|
128
|
-
* dbFlag indicates whether the first bit was 1 (DataBlock flag set).
|
|
129
|
-
* In the initial block (mask=0xFFFFFFFF), dbFlag=false means the ghost
|
|
130
|
-
* is definitely NOT a GameBase subclass.
|
|
131
|
-
* The BitStream position is always restored after peeking.
|
|
132
|
-
*/
|
|
133
|
-
private identifyGhostViaDataBlock;
|
|
134
197
|
/**
|
|
135
198
|
* Parse a raw 64-byte Move struct from a type 2 block.
|
|
136
199
|
*
|
package/dist/DemoParser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DemoParser.d.ts","sourceRoot":"","sources":["../src/DemoParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"DemoParser.d.ts","sourceRoot":"","sources":["../src/DemoParser.ts"],"names":[],"mappings":"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"}
|