@lagless/core 0.0.33
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 +970 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/di/di-container.d.ts +7 -0
- package/dist/lib/di/di-container.d.ts.map +1 -0
- package/dist/lib/di/di-container.js +25 -0
- package/dist/lib/di/di-container.js.map +1 -0
- package/dist/lib/di/di-decorators.d.ts +4 -0
- package/dist/lib/di/di-decorators.d.ts.map +1 -0
- package/dist/lib/di/di-decorators.js +96 -0
- package/dist/lib/di/di-decorators.js.map +1 -0
- package/dist/lib/di/index.d.ts +3 -0
- package/dist/lib/di/index.d.ts.map +1 -0
- package/dist/lib/di/index.js +4 -0
- package/dist/lib/di/index.js.map +1 -0
- package/dist/lib/ecs-config.d.ts +16 -0
- package/dist/lib/ecs-config.d.ts.map +1 -0
- package/dist/lib/ecs-config.js +28 -0
- package/dist/lib/ecs-config.js.map +1 -0
- package/dist/lib/ecs-runner.d.ts +20 -0
- package/dist/lib/ecs-runner.d.ts.map +1 -0
- package/dist/lib/ecs-runner.js +60 -0
- package/dist/lib/ecs-runner.js.map +1 -0
- package/dist/lib/ecs-simulation.d.ts +44 -0
- package/dist/lib/ecs-simulation.d.ts.map +1 -0
- package/dist/lib/ecs-simulation.js +138 -0
- package/dist/lib/ecs-simulation.js.map +1 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts +32 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts.map +1 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.js +49 -0
- package/dist/lib/hash-verification/abstract-hash-verification.system.js.map +1 -0
- package/dist/lib/hash-verification/create-hash-reporter.d.ts +16 -0
- package/dist/lib/hash-verification/create-hash-reporter.d.ts.map +1 -0
- package/dist/lib/hash-verification/create-hash-reporter.js +21 -0
- package/dist/lib/hash-verification/create-hash-reporter.js.map +1 -0
- package/dist/lib/hash-verification/divergence.signal.d.ts +11 -0
- package/dist/lib/hash-verification/divergence.signal.d.ts.map +1 -0
- package/dist/lib/hash-verification/divergence.signal.js +5 -0
- package/dist/lib/hash-verification/divergence.signal.js.map +1 -0
- package/dist/lib/hash-verification/index.d.ts +4 -0
- package/dist/lib/hash-verification/index.d.ts.map +1 -0
- package/dist/lib/hash-verification/index.js +5 -0
- package/dist/lib/hash-verification/index.js.map +1 -0
- package/dist/lib/input/abstract-input-provider.d.ts +61 -0
- package/dist/lib/input/abstract-input-provider.d.ts.map +1 -0
- package/dist/lib/input/abstract-input-provider.js +110 -0
- package/dist/lib/input/abstract-input-provider.js.map +1 -0
- package/dist/lib/input/index.d.ts +8 -0
- package/dist/lib/input/index.d.ts.map +1 -0
- package/dist/lib/input/index.js +9 -0
- package/dist/lib/input/index.js.map +1 -0
- package/dist/lib/input/input-provider-di-token.d.ts +6 -0
- package/dist/lib/input/input-provider-di-token.d.ts.map +1 -0
- package/dist/lib/input/input-provider-di-token.js +12 -0
- package/dist/lib/input/input-provider-di-token.js.map +1 -0
- package/dist/lib/input/input-registry.d.ts +8 -0
- package/dist/lib/input/input-registry.d.ts.map +1 -0
- package/dist/lib/input/input-registry.js +21 -0
- package/dist/lib/input/input-registry.js.map +1 -0
- package/dist/lib/input/local-input-provider.d.ts +6 -0
- package/dist/lib/input/local-input-provider.d.ts.map +1 -0
- package/dist/lib/input/local-input-provider.js +12 -0
- package/dist/lib/input/local-input-provider.js.map +1 -0
- package/dist/lib/input/replay-input-provider.d.ts +12 -0
- package/dist/lib/input/replay-input-provider.d.ts.map +1 -0
- package/dist/lib/input/replay-input-provider.js +46 -0
- package/dist/lib/input/replay-input-provider.js.map +1 -0
- package/dist/lib/input/rpc-history.d.ts +40 -0
- package/dist/lib/input/rpc-history.d.ts.map +1 -0
- package/dist/lib/input/rpc-history.js +308 -0
- package/dist/lib/input/rpc-history.js.map +1 -0
- package/dist/lib/input/rpc.d.ts +8 -0
- package/dist/lib/input/rpc.d.ts.map +1 -0
- package/dist/lib/input/rpc.js +9 -0
- package/dist/lib/input/rpc.js.map +1 -0
- package/dist/lib/mem/abstract-memory.interface.d.ts +6 -0
- package/dist/lib/mem/abstract-memory.interface.d.ts.map +1 -0
- package/dist/lib/mem/abstract-memory.interface.js +3 -0
- package/dist/lib/mem/abstract-memory.interface.js.map +1 -0
- package/dist/lib/mem/index.d.ts +5 -0
- package/dist/lib/mem/index.d.ts.map +1 -0
- package/dist/lib/mem/index.js +6 -0
- package/dist/lib/mem/index.js.map +1 -0
- package/dist/lib/mem/managers/components-manager.d.ts +15 -0
- package/dist/lib/mem/managers/components-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/components-manager.js +30 -0
- package/dist/lib/mem/managers/components-manager.js.map +1 -0
- package/dist/lib/mem/managers/entities-manager.d.ts +31 -0
- package/dist/lib/mem/managers/entities-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/entities-manager.js +106 -0
- package/dist/lib/mem/managers/entities-manager.js.map +1 -0
- package/dist/lib/mem/managers/filters-manager.d.ts +17 -0
- package/dist/lib/mem/managers/filters-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/filters-manager.js +46 -0
- package/dist/lib/mem/managers/filters-manager.js.map +1 -0
- package/dist/lib/mem/managers/player-resources-manager.d.ts +21 -0
- package/dist/lib/mem/managers/player-resources-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/player-resources-manager.js +52 -0
- package/dist/lib/mem/managers/player-resources-manager.js.map +1 -0
- package/dist/lib/mem/managers/prng-manager.d.ts +36 -0
- package/dist/lib/mem/managers/prng-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/prng-manager.js +126 -0
- package/dist/lib/mem/managers/prng-manager.js.map +1 -0
- package/dist/lib/mem/managers/singletons-manager.d.ts +13 -0
- package/dist/lib/mem/managers/singletons-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/singletons-manager.js +29 -0
- package/dist/lib/mem/managers/singletons-manager.js.map +1 -0
- package/dist/lib/mem/managers/tick-manager.d.ts +10 -0
- package/dist/lib/mem/managers/tick-manager.d.ts.map +1 -0
- package/dist/lib/mem/managers/tick-manager.js +18 -0
- package/dist/lib/mem/managers/tick-manager.js.map +1 -0
- package/dist/lib/mem/mem.d.ts +28 -0
- package/dist/lib/mem/mem.d.ts.map +1 -0
- package/dist/lib/mem/mem.js +63 -0
- package/dist/lib/mem/mem.js.map +1 -0
- package/dist/lib/prefab.d.ts +16 -0
- package/dist/lib/prefab.d.ts.map +1 -0
- package/dist/lib/prefab.js +17 -0
- package/dist/lib/prefab.js.map +1 -0
- package/dist/lib/signals/event-emitter.d.ts +9 -0
- package/dist/lib/signals/event-emitter.d.ts.map +1 -0
- package/dist/lib/signals/event-emitter.js +22 -0
- package/dist/lib/signals/event-emitter.js.map +1 -0
- package/dist/lib/signals/signal.d.ts +40 -0
- package/dist/lib/signals/signal.d.ts.map +1 -0
- package/dist/lib/signals/signal.js +133 -0
- package/dist/lib/signals/signal.js.map +1 -0
- package/dist/lib/signals/signals.registry.d.ts +9 -0
- package/dist/lib/signals/signals.registry.d.ts.map +1 -0
- package/dist/lib/signals/signals.registry.js +31 -0
- package/dist/lib/signals/signals.registry.js.map +1 -0
- package/dist/lib/types/abstract-filter.d.ts +16 -0
- package/dist/lib/types/abstract-filter.d.ts.map +1 -0
- package/dist/lib/types/abstract-filter.js +53 -0
- package/dist/lib/types/abstract-filter.js.map +1 -0
- package/dist/lib/types/ecs-types.d.ts +109 -0
- package/dist/lib/types/ecs-types.d.ts.map +1 -0
- package/dist/lib/types/ecs-types.js +3 -0
- package/dist/lib/types/ecs-types.js.map +1 -0
- package/dist/lib/types/index.d.ts +3 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +4 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { RPC } from './rpc.js';
|
|
2
|
+
import { IAbstractInputConstructor } from '../types/index.js';
|
|
3
|
+
import { InputRegistry } from './input-registry.js';
|
|
4
|
+
export declare class RPCHistory {
|
|
5
|
+
private readonly _history;
|
|
6
|
+
static excludeLocalRPCs(rpcs: ReadonlyArray<RPC>, localPlayerSlot: number): RPC[];
|
|
7
|
+
addRPC(rpc: RPC): void;
|
|
8
|
+
addBatch(rpcs: ReadonlyArray<RPC>): void;
|
|
9
|
+
/**
|
|
10
|
+
* Returns a new array of RPCs matching the given input type at the specified tick.
|
|
11
|
+
* Each call allocates a fresh array — safe to store and use across multiple calls.
|
|
12
|
+
*/
|
|
13
|
+
collectTickRPCs<TInputCtor extends IAbstractInputConstructor>(tick: number, InputCtor: TInputCtor): ReadonlyArray<RPC<InstanceType<TInputCtor>>>;
|
|
14
|
+
removePlayerInputsAtTick(playerSlot: number, tick: number, seq: number): void;
|
|
15
|
+
clear(): void;
|
|
16
|
+
get size(): number;
|
|
17
|
+
get totalRPCCount(): number;
|
|
18
|
+
debugExportAsJSON(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Exports entire history to a compact binary format.
|
|
21
|
+
* @param registry - InputRegistry for serializing input data
|
|
22
|
+
* @returns ArrayBuffer containing serialized history
|
|
23
|
+
*/
|
|
24
|
+
export(registry: InputRegistry): ArrayBuffer;
|
|
25
|
+
/**
|
|
26
|
+
* Imports history from binary format, replacing current content.
|
|
27
|
+
* @param registry - InputRegistry for deserializing input data
|
|
28
|
+
* @param buffer - ArrayBuffer containing serialized history
|
|
29
|
+
*/
|
|
30
|
+
import(registry: InputRegistry, buffer: ArrayBuffer): void;
|
|
31
|
+
private prepareExportData;
|
|
32
|
+
private calculateExportSize;
|
|
33
|
+
private writeHeader;
|
|
34
|
+
private writeTickEntries;
|
|
35
|
+
private readHeader;
|
|
36
|
+
private readTickEntry;
|
|
37
|
+
/** Insert rpc into arr maintaining sorted order by (playerSlot, ordinal). */
|
|
38
|
+
private insertSorted;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=rpc-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-history.d.ts","sourceRoot":"","sources":["../../../src/lib/input/rpc-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiDpD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;WAM5C,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,eAAe,EAAE,MAAM,GAAG,GAAG,EAAE;IAQjF,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAStB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;IA6B/C;;;OAGG;IACI,eAAe,CAAC,UAAU,SAAS,yBAAyB,EACjE,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,UAAU,GACpB,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;IAaxC,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAmB7E,KAAK,IAAI,IAAI;IAIpB,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,aAAa,IAAI,MAAM,CAMjC;IAMM,iBAAiB,IAAI,MAAM;IAsBlC;;;;OAIG;IACI,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW;IAgBnD;;;;OAIG;IACI,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAgCjE,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,aAAa;IAmDrB,6EAA6E;IAC7E,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { RPC } from './rpc.js';
|
|
2
|
+
import { InputBinarySchema, FieldType, fieldTypeSizeBytes, LE } from '@lagless/binary';
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
// Constants
|
|
5
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
const RPC_HISTORY_FORMAT_VERSION = 1;
|
|
7
|
+
/**
|
|
8
|
+
* Binary format layout:
|
|
9
|
+
*
|
|
10
|
+
* [Header]
|
|
11
|
+
* version: Uint8 (format version for forward compatibility)
|
|
12
|
+
* tickCount: Uint32 (number of unique ticks)
|
|
13
|
+
*
|
|
14
|
+
* [Per Tick Block] × tickCount
|
|
15
|
+
* tick: Uint32 (tick number)
|
|
16
|
+
* rpcCount: Uint16 (number of RPCs for this tick)
|
|
17
|
+
*
|
|
18
|
+
* [Per RPC Entry] × rpcCount
|
|
19
|
+
* seq: Uint32 (sequence number)
|
|
20
|
+
* playerSlot: Uint8 (player slot)
|
|
21
|
+
* dataLength: Uint16 (byte length of packed input data)
|
|
22
|
+
* data: Uint8[] (InputBinarySchema packed data including inputId & ordinal)
|
|
23
|
+
*/ const HEADER_SIZE = fieldTypeSizeBytes[FieldType.Uint8] + // version
|
|
24
|
+
fieldTypeSizeBytes[FieldType.Uint32]; // tickCount
|
|
25
|
+
const TICK_HEADER_SIZE = fieldTypeSizeBytes[FieldType.Uint32] + // tick
|
|
26
|
+
fieldTypeSizeBytes[FieldType.Uint16]; // rpcCount
|
|
27
|
+
const RPC_HEADER_SIZE = fieldTypeSizeBytes[FieldType.Uint32] + // seq
|
|
28
|
+
fieldTypeSizeBytes[FieldType.Uint8] + // playerSlot
|
|
29
|
+
fieldTypeSizeBytes[FieldType.Uint16]; // dataLength
|
|
30
|
+
const compareRPCs = (a, b)=>a.meta.playerSlot - b.meta.playerSlot || a.meta.ordinal - b.meta.ordinal || a.meta.seq - b.meta.seq;
|
|
31
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
32
|
+
// RPCHistory
|
|
33
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
34
|
+
export class RPCHistory {
|
|
35
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
36
|
+
// Static utilities
|
|
37
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
38
|
+
static excludeLocalRPCs(rpcs, localPlayerSlot) {
|
|
39
|
+
return rpcs.filter((rpc)=>rpc.meta.playerSlot !== localPlayerSlot);
|
|
40
|
+
}
|
|
41
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
42
|
+
// Public read/write methods
|
|
43
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
44
|
+
addRPC(rpc) {
|
|
45
|
+
let tickRPCs = this._history.get(rpc.meta.tick);
|
|
46
|
+
if (!tickRPCs) {
|
|
47
|
+
tickRPCs = [];
|
|
48
|
+
this._history.set(rpc.meta.tick, tickRPCs);
|
|
49
|
+
}
|
|
50
|
+
this.insertSorted(tickRPCs, rpc);
|
|
51
|
+
}
|
|
52
|
+
addBatch(rpcs) {
|
|
53
|
+
if (rpcs.length === 0) return;
|
|
54
|
+
// Group incoming RPCs by tick to minimize Map lookups and sorts
|
|
55
|
+
const perTick = new Map();
|
|
56
|
+
for (const rpc of rpcs){
|
|
57
|
+
let group = perTick.get(rpc.meta.tick);
|
|
58
|
+
if (!group) {
|
|
59
|
+
group = [];
|
|
60
|
+
perTick.set(rpc.meta.tick, group);
|
|
61
|
+
}
|
|
62
|
+
group.push(rpc);
|
|
63
|
+
}
|
|
64
|
+
// Merge per-tick groups into history and sort once per tick
|
|
65
|
+
for (const [tick, newRPCs] of perTick){
|
|
66
|
+
const existing = this._history.get(tick);
|
|
67
|
+
if (!existing) {
|
|
68
|
+
newRPCs.sort(compareRPCs);
|
|
69
|
+
this._history.set(tick, newRPCs);
|
|
70
|
+
} else {
|
|
71
|
+
existing.push(...newRPCs);
|
|
72
|
+
existing.sort(compareRPCs);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns a new array of RPCs matching the given input type at the specified tick.
|
|
78
|
+
* Each call allocates a fresh array — safe to store and use across multiple calls.
|
|
79
|
+
*/ collectTickRPCs(tick, InputCtor) {
|
|
80
|
+
const rpcs = this._history.get(tick);
|
|
81
|
+
if (!rpcs) return [];
|
|
82
|
+
const result = [];
|
|
83
|
+
for (const rpc of rpcs){
|
|
84
|
+
if (rpc.inputId === InputCtor.id) {
|
|
85
|
+
result.push(rpc);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
removePlayerInputsAtTick(playerSlot, tick, seq) {
|
|
91
|
+
const tickRPCs = this._history.get(tick);
|
|
92
|
+
if (!tickRPCs || tickRPCs.length === 0) return;
|
|
93
|
+
let writeIndex = 0;
|
|
94
|
+
for(let readIndex = 0; readIndex < tickRPCs.length; readIndex++){
|
|
95
|
+
const rpc = tickRPCs[readIndex];
|
|
96
|
+
if (!(rpc.meta.playerSlot === playerSlot && rpc.meta.seq === seq)) {
|
|
97
|
+
tickRPCs[writeIndex++] = rpc;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
tickRPCs.length = writeIndex;
|
|
101
|
+
if (writeIndex === 0) {
|
|
102
|
+
this._history.delete(tick);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
clear() {
|
|
106
|
+
this._history.clear();
|
|
107
|
+
}
|
|
108
|
+
get size() {
|
|
109
|
+
return this._history.size;
|
|
110
|
+
}
|
|
111
|
+
get totalRPCCount() {
|
|
112
|
+
let count = 0;
|
|
113
|
+
for (const rpcs of this._history.values()){
|
|
114
|
+
count += rpcs.length;
|
|
115
|
+
}
|
|
116
|
+
return count;
|
|
117
|
+
}
|
|
118
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
119
|
+
// Serialization
|
|
120
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
121
|
+
debugExportAsJSON() {
|
|
122
|
+
const exportObj = {};
|
|
123
|
+
for (const [tick, rpcs] of this._history){
|
|
124
|
+
exportObj[tick] = rpcs.map((rpc)=>({
|
|
125
|
+
inputId: rpc.inputId,
|
|
126
|
+
seq: rpc.meta.seq,
|
|
127
|
+
playerSlot: rpc.meta.playerSlot,
|
|
128
|
+
ordinal: rpc.meta.ordinal,
|
|
129
|
+
data: rpc.data
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
return JSON.stringify(exportObj, null, 2);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Exports entire history to a compact binary format.
|
|
136
|
+
* @param registry - InputRegistry for serializing input data
|
|
137
|
+
* @returns ArrayBuffer containing serialized history
|
|
138
|
+
*/ export(registry) {
|
|
139
|
+
// First pass: pack all RPC data and calculate total size
|
|
140
|
+
const tickEntries = this.prepareExportData(registry);
|
|
141
|
+
const totalSize = this.calculateExportSize(tickEntries);
|
|
142
|
+
// Second pass: write to buffer
|
|
143
|
+
const buffer = new ArrayBuffer(totalSize);
|
|
144
|
+
const view = new DataView(buffer);
|
|
145
|
+
const uint8View = new Uint8Array(buffer);
|
|
146
|
+
const offset = this.writeHeader(view, tickEntries.length);
|
|
147
|
+
this.writeTickEntries(view, uint8View, offset, tickEntries);
|
|
148
|
+
return buffer;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Imports history from binary format, replacing current content.
|
|
152
|
+
* @param registry - InputRegistry for deserializing input data
|
|
153
|
+
* @param buffer - ArrayBuffer containing serialized history
|
|
154
|
+
*/ import(registry, buffer) {
|
|
155
|
+
const view = new DataView(buffer);
|
|
156
|
+
let offset = 0;
|
|
157
|
+
// Validate and read header
|
|
158
|
+
const { version, tickCount } = this.readHeader(view, offset);
|
|
159
|
+
offset += HEADER_SIZE;
|
|
160
|
+
if (version !== RPC_HISTORY_FORMAT_VERSION) {
|
|
161
|
+
throw new Error(`Unsupported RPCHistory format version: ${version} (expected ${RPC_HISTORY_FORMAT_VERSION})`);
|
|
162
|
+
}
|
|
163
|
+
// Clear existing data and read all ticks
|
|
164
|
+
this._history.clear();
|
|
165
|
+
for(let i = 0; i < tickCount; i++){
|
|
166
|
+
const result = this.readTickEntry(view, buffer, offset, registry);
|
|
167
|
+
offset = result.nextOffset;
|
|
168
|
+
if (result.rpcs.length > 0) {
|
|
169
|
+
result.rpcs.sort(compareRPCs);
|
|
170
|
+
this._history.set(result.tick, result.rpcs);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
175
|
+
// Private: Export helpers
|
|
176
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
177
|
+
prepareExportData(registry) {
|
|
178
|
+
const entries = [];
|
|
179
|
+
for (const [tick, rpcs] of this._history){
|
|
180
|
+
const rpcEntries = [];
|
|
181
|
+
for (const rpc of rpcs){
|
|
182
|
+
const packedData = InputBinarySchema.packBatch(registry, [
|
|
183
|
+
{
|
|
184
|
+
inputId: rpc.inputId,
|
|
185
|
+
ordinal: rpc.meta.ordinal,
|
|
186
|
+
values: rpc.data
|
|
187
|
+
}
|
|
188
|
+
]);
|
|
189
|
+
rpcEntries.push({
|
|
190
|
+
seq: rpc.meta.seq,
|
|
191
|
+
playerSlot: rpc.meta.playerSlot,
|
|
192
|
+
packedData
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
entries.push({
|
|
196
|
+
tick,
|
|
197
|
+
rpcs: rpcEntries
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// Sort by tick for deterministic output
|
|
201
|
+
entries.sort((a, b)=>a.tick - b.tick);
|
|
202
|
+
return entries;
|
|
203
|
+
}
|
|
204
|
+
calculateExportSize(tickEntries) {
|
|
205
|
+
let size = HEADER_SIZE;
|
|
206
|
+
for (const entry of tickEntries){
|
|
207
|
+
size += TICK_HEADER_SIZE;
|
|
208
|
+
for (const rpc of entry.rpcs){
|
|
209
|
+
size += RPC_HEADER_SIZE + rpc.packedData.byteLength;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return size;
|
|
213
|
+
}
|
|
214
|
+
writeHeader(view, tickCount) {
|
|
215
|
+
let offset = 0;
|
|
216
|
+
view.setUint8(offset, RPC_HISTORY_FORMAT_VERSION);
|
|
217
|
+
offset += fieldTypeSizeBytes[FieldType.Uint8];
|
|
218
|
+
view.setUint32(offset, tickCount, LE);
|
|
219
|
+
offset += fieldTypeSizeBytes[FieldType.Uint32];
|
|
220
|
+
return offset;
|
|
221
|
+
}
|
|
222
|
+
writeTickEntries(view, uint8View, startOffset, tickEntries) {
|
|
223
|
+
let offset = startOffset;
|
|
224
|
+
for (const entry of tickEntries){
|
|
225
|
+
// Write tick header
|
|
226
|
+
view.setUint32(offset, entry.tick, LE);
|
|
227
|
+
offset += fieldTypeSizeBytes[FieldType.Uint32];
|
|
228
|
+
view.setUint16(offset, entry.rpcs.length, LE);
|
|
229
|
+
offset += fieldTypeSizeBytes[FieldType.Uint16];
|
|
230
|
+
// Write RPC entries
|
|
231
|
+
for (const rpc of entry.rpcs){
|
|
232
|
+
view.setUint32(offset, rpc.seq, LE);
|
|
233
|
+
offset += fieldTypeSizeBytes[FieldType.Uint32];
|
|
234
|
+
view.setUint8(offset, rpc.playerSlot);
|
|
235
|
+
offset += fieldTypeSizeBytes[FieldType.Uint8];
|
|
236
|
+
view.setUint16(offset, rpc.packedData.byteLength, LE);
|
|
237
|
+
offset += fieldTypeSizeBytes[FieldType.Uint16];
|
|
238
|
+
// Copy packed data
|
|
239
|
+
uint8View.set(new Uint8Array(rpc.packedData), offset);
|
|
240
|
+
offset += rpc.packedData.byteLength;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return offset;
|
|
244
|
+
}
|
|
245
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
246
|
+
// Private: Import helpers
|
|
247
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
248
|
+
readHeader(view, offset) {
|
|
249
|
+
const version = view.getUint8(offset);
|
|
250
|
+
const tickCount = view.getUint32(offset + fieldTypeSizeBytes[FieldType.Uint8], LE);
|
|
251
|
+
return {
|
|
252
|
+
version,
|
|
253
|
+
tickCount
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
readTickEntry(view, buffer, startOffset, registry) {
|
|
257
|
+
let offset = startOffset;
|
|
258
|
+
// Read tick header
|
|
259
|
+
const tick = view.getUint32(offset, LE);
|
|
260
|
+
offset += fieldTypeSizeBytes[FieldType.Uint32];
|
|
261
|
+
const rpcCount = view.getUint16(offset, LE);
|
|
262
|
+
offset += fieldTypeSizeBytes[FieldType.Uint16];
|
|
263
|
+
const rpcs = [];
|
|
264
|
+
// Read RPC entries
|
|
265
|
+
for(let j = 0; j < rpcCount; j++){
|
|
266
|
+
const seq = view.getUint32(offset, LE);
|
|
267
|
+
offset += fieldTypeSizeBytes[FieldType.Uint32];
|
|
268
|
+
const playerSlot = view.getUint8(offset);
|
|
269
|
+
offset += fieldTypeSizeBytes[FieldType.Uint8];
|
|
270
|
+
const dataLength = view.getUint16(offset, LE);
|
|
271
|
+
offset += fieldTypeSizeBytes[FieldType.Uint16];
|
|
272
|
+
// Extract and unpack input data
|
|
273
|
+
const dataSlice = buffer.slice(offset, offset + dataLength);
|
|
274
|
+
offset += dataLength;
|
|
275
|
+
const unpacked = InputBinarySchema.unpackBatch(registry, dataSlice);
|
|
276
|
+
if (unpacked.length !== 1) {
|
|
277
|
+
throw new Error(`Invalid RPC data: expected 1 input, got ${unpacked.length} at tick ${tick}`);
|
|
278
|
+
}
|
|
279
|
+
const { inputId, ordinal, values } = unpacked[0];
|
|
280
|
+
rpcs.push(new RPC(inputId, {
|
|
281
|
+
tick,
|
|
282
|
+
seq,
|
|
283
|
+
ordinal,
|
|
284
|
+
playerSlot
|
|
285
|
+
}, values));
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
tick,
|
|
289
|
+
rpcs,
|
|
290
|
+
nextOffset: offset
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
294
|
+
// Private: Sorting
|
|
295
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
296
|
+
/** Insert rpc into arr maintaining sorted order by (playerSlot, ordinal). */ insertSorted(arr, rpc) {
|
|
297
|
+
let i = arr.length;
|
|
298
|
+
while(i > 0 && compareRPCs(arr[i - 1], rpc) > 0){
|
|
299
|
+
i--;
|
|
300
|
+
}
|
|
301
|
+
arr.splice(i, 0, rpc);
|
|
302
|
+
}
|
|
303
|
+
constructor(){
|
|
304
|
+
this._history = new Map();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
//# sourceMappingURL=rpc-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/input/rpc-history.ts"],"sourcesContent":["import { RPC } from './rpc.js';\nimport { IAbstractInputConstructor } from '../types/index.js';\nimport { InputRegistry } from './input-registry.js';\nimport { InputBinarySchema, FieldType, fieldTypeSizeBytes, LE } from '@lagless/binary';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst RPC_HISTORY_FORMAT_VERSION = 1;\n\n/**\n * Binary format layout:\n *\n * [Header]\n * version: Uint8 (format version for forward compatibility)\n * tickCount: Uint32 (number of unique ticks)\n *\n * [Per Tick Block] × tickCount\n * tick: Uint32 (tick number)\n * rpcCount: Uint16 (number of RPCs for this tick)\n *\n * [Per RPC Entry] × rpcCount\n * seq: Uint32 (sequence number)\n * playerSlot: Uint8 (player slot)\n * dataLength: Uint16 (byte length of packed input data)\n * data: Uint8[] (InputBinarySchema packed data including inputId & ordinal)\n */\n\nconst HEADER_SIZE =\n fieldTypeSizeBytes[FieldType.Uint8] + // version\n fieldTypeSizeBytes[FieldType.Uint32]; // tickCount\n\nconst TICK_HEADER_SIZE =\n fieldTypeSizeBytes[FieldType.Uint32] + // tick\n fieldTypeSizeBytes[FieldType.Uint16]; // rpcCount\n\nconst RPC_HEADER_SIZE =\n fieldTypeSizeBytes[FieldType.Uint32] + // seq\n fieldTypeSizeBytes[FieldType.Uint8] + // playerSlot\n fieldTypeSizeBytes[FieldType.Uint16]; // dataLength\n\nconst compareRPCs = (a: RPC, b: RPC): number =>\n a.meta.playerSlot - b.meta.playerSlot\n || a.meta.ordinal - b.meta.ordinal\n || a.meta.seq - b.meta.seq;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// RPCHistory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class RPCHistory {\n private readonly _history: Map<number, RPC[]> = new Map();\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static utilities\n // ─────────────────────────────────────────────────────────────────────────\n\n public static excludeLocalRPCs(rpcs: ReadonlyArray<RPC>, localPlayerSlot: number): RPC[] {\n return rpcs.filter((rpc) => rpc.meta.playerSlot !== localPlayerSlot);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Public read/write methods\n // ─────────────────────────────────────────────────────────────────────────\n\n public addRPC(rpc: RPC): void {\n let tickRPCs = this._history.get(rpc.meta.tick);\n if (!tickRPCs) {\n tickRPCs = [];\n this._history.set(rpc.meta.tick, tickRPCs);\n }\n this.insertSorted(tickRPCs, rpc);\n }\n\n public addBatch(rpcs: ReadonlyArray<RPC>): void {\n if (rpcs.length === 0) return;\n\n // Group incoming RPCs by tick to minimize Map lookups and sorts\n const perTick = new Map<number, RPC[]>();\n\n for (const rpc of rpcs) {\n let group = perTick.get(rpc.meta.tick);\n if (!group) {\n group = [];\n perTick.set(rpc.meta.tick, group);\n }\n group.push(rpc);\n }\n\n // Merge per-tick groups into history and sort once per tick\n for (const [tick, newRPCs] of perTick) {\n const existing = this._history.get(tick);\n\n if (!existing) {\n newRPCs.sort(compareRPCs);\n this._history.set(tick, newRPCs);\n } else {\n existing.push(...newRPCs);\n existing.sort(compareRPCs);\n }\n }\n }\n\n /**\n * Returns a new array of RPCs matching the given input type at the specified tick.\n * Each call allocates a fresh array — safe to store and use across multiple calls.\n */\n public collectTickRPCs<TInputCtor extends IAbstractInputConstructor>(\n tick: number,\n InputCtor: TInputCtor\n ): ReadonlyArray<RPC<InstanceType<TInputCtor>>> {\n const rpcs = this._history.get(tick);\n if (!rpcs) return [];\n\n const result: RPC<InstanceType<TInputCtor>>[] = [];\n for (const rpc of rpcs) {\n if (rpc.inputId === InputCtor.id) {\n result.push(rpc as RPC<InstanceType<TInputCtor>>);\n }\n }\n return result;\n }\n\n public removePlayerInputsAtTick(playerSlot: number, tick: number, seq: number): void {\n const tickRPCs = this._history.get(tick);\n if (!tickRPCs || tickRPCs.length === 0) return;\n\n let writeIndex = 0;\n for (let readIndex = 0; readIndex < tickRPCs.length; readIndex++) {\n const rpc = tickRPCs[readIndex];\n if (!(rpc.meta.playerSlot === playerSlot && rpc.meta.seq === seq)) {\n tickRPCs[writeIndex++] = rpc;\n }\n }\n\n tickRPCs.length = writeIndex;\n\n if (writeIndex === 0) {\n this._history.delete(tick);\n }\n }\n\n public clear(): void {\n this._history.clear();\n }\n\n public get size(): number {\n return this._history.size;\n }\n\n public get totalRPCCount(): number {\n let count = 0;\n for (const rpcs of this._history.values()) {\n count += rpcs.length;\n }\n return count;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Serialization\n // ─────────────────────────────────────────────────────────────────────────\n\n public debugExportAsJSON(): string {\n const exportObj: Record<number, Array<{\n inputId: number;\n seq: number;\n playerSlot: number;\n ordinal: number;\n data: unknown;\n }>> = {};\n\n for (const [tick, rpcs] of this._history) {\n exportObj[tick] = rpcs.map((rpc) => ({\n inputId: rpc.inputId,\n seq: rpc.meta.seq,\n playerSlot: rpc.meta.playerSlot,\n ordinal: rpc.meta.ordinal,\n data: rpc.data,\n }));\n }\n\n return JSON.stringify(exportObj, null, 2);\n }\n\n /**\n * Exports entire history to a compact binary format.\n * @param registry - InputRegistry for serializing input data\n * @returns ArrayBuffer containing serialized history\n */\n public export(registry: InputRegistry): ArrayBuffer {\n // First pass: pack all RPC data and calculate total size\n const tickEntries = this.prepareExportData(registry);\n const totalSize = this.calculateExportSize(tickEntries);\n\n // Second pass: write to buffer\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const uint8View = new Uint8Array(buffer);\n\n const offset = this.writeHeader(view, tickEntries.length);\n this.writeTickEntries(view, uint8View, offset, tickEntries);\n\n return buffer;\n }\n\n /**\n * Imports history from binary format, replacing current content.\n * @param registry - InputRegistry for deserializing input data\n * @param buffer - ArrayBuffer containing serialized history\n */\n public import(registry: InputRegistry, buffer: ArrayBuffer): void {\n const view = new DataView(buffer);\n let offset = 0;\n\n // Validate and read header\n const { version, tickCount } = this.readHeader(view, offset);\n offset += HEADER_SIZE;\n\n if (version !== RPC_HISTORY_FORMAT_VERSION) {\n throw new Error(\n `Unsupported RPCHistory format version: ${version} (expected ${RPC_HISTORY_FORMAT_VERSION})`\n );\n }\n\n // Clear existing data and read all ticks\n this._history.clear();\n\n for (let i = 0; i < tickCount; i++) {\n const result = this.readTickEntry(view, buffer, offset, registry);\n offset = result.nextOffset;\n\n if (result.rpcs.length > 0) {\n result.rpcs.sort(compareRPCs);\n this._history.set(result.tick, result.rpcs);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private: Export helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n private prepareExportData(registry: InputRegistry): ExportTickEntry[] {\n const entries: ExportTickEntry[] = [];\n\n for (const [tick, rpcs] of this._history) {\n const rpcEntries: ExportRPCEntry[] = [];\n\n for (const rpc of rpcs) {\n const packedData = InputBinarySchema.packBatch(registry, [{\n inputId: rpc.inputId,\n ordinal: rpc.meta.ordinal,\n values: rpc.data,\n }]);\n\n rpcEntries.push({\n seq: rpc.meta.seq,\n playerSlot: rpc.meta.playerSlot,\n packedData,\n });\n }\n\n entries.push({ tick, rpcs: rpcEntries });\n }\n\n // Sort by tick for deterministic output\n entries.sort((a, b) => a.tick - b.tick);\n\n return entries;\n }\n\n private calculateExportSize(tickEntries: ExportTickEntry[]): number {\n let size = HEADER_SIZE;\n\n for (const entry of tickEntries) {\n size += TICK_HEADER_SIZE;\n for (const rpc of entry.rpcs) {\n size += RPC_HEADER_SIZE + rpc.packedData.byteLength;\n }\n }\n\n return size;\n }\n\n private writeHeader(view: DataView, tickCount: number): number {\n let offset = 0;\n\n view.setUint8(offset, RPC_HISTORY_FORMAT_VERSION);\n offset += fieldTypeSizeBytes[FieldType.Uint8];\n\n view.setUint32(offset, tickCount, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint32];\n\n return offset;\n }\n\n private writeTickEntries(\n view: DataView,\n uint8View: Uint8Array,\n startOffset: number,\n tickEntries: ExportTickEntry[]\n ): number {\n let offset = startOffset;\n\n for (const entry of tickEntries) {\n // Write tick header\n view.setUint32(offset, entry.tick, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint32];\n\n view.setUint16(offset, entry.rpcs.length, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint16];\n\n // Write RPC entries\n for (const rpc of entry.rpcs) {\n view.setUint32(offset, rpc.seq, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint32];\n\n view.setUint8(offset, rpc.playerSlot);\n offset += fieldTypeSizeBytes[FieldType.Uint8];\n\n view.setUint16(offset, rpc.packedData.byteLength, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint16];\n\n // Copy packed data\n uint8View.set(new Uint8Array(rpc.packedData), offset);\n offset += rpc.packedData.byteLength;\n }\n }\n\n return offset;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private: Import helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n private readHeader(view: DataView, offset: number): { version: number; tickCount: number } {\n const version = view.getUint8(offset);\n const tickCount = view.getUint32(offset + fieldTypeSizeBytes[FieldType.Uint8], LE);\n return { version, tickCount };\n }\n\n private readTickEntry(\n view: DataView,\n buffer: ArrayBuffer,\n startOffset: number,\n registry: InputRegistry\n ): { tick: number; rpcs: RPC[]; nextOffset: number } {\n let offset = startOffset;\n\n // Read tick header\n const tick = view.getUint32(offset, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint32];\n\n const rpcCount = view.getUint16(offset, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint16];\n\n const rpcs: RPC[] = [];\n\n // Read RPC entries\n for (let j = 0; j < rpcCount; j++) {\n const seq = view.getUint32(offset, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint32];\n\n const playerSlot = view.getUint8(offset);\n offset += fieldTypeSizeBytes[FieldType.Uint8];\n\n const dataLength = view.getUint16(offset, LE);\n offset += fieldTypeSizeBytes[FieldType.Uint16];\n\n // Extract and unpack input data\n const dataSlice = buffer.slice(offset, offset + dataLength);\n offset += dataLength;\n\n const unpacked = InputBinarySchema.unpackBatch(registry, dataSlice);\n\n if (unpacked.length !== 1) {\n throw new Error(\n `Invalid RPC data: expected 1 input, got ${unpacked.length} at tick ${tick}`\n );\n }\n\n const { inputId, ordinal, values } = unpacked[0];\n rpcs.push(new RPC(inputId, { tick, seq, ordinal, playerSlot }, values));\n }\n\n return { tick, rpcs, nextOffset: offset };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private: Sorting\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Insert rpc into arr maintaining sorted order by (playerSlot, ordinal). */\n private insertSorted(arr: RPC[], rpc: RPC): void {\n let i = arr.length;\n while (i > 0 && compareRPCs(arr[i - 1], rpc) > 0) {\n i--;\n }\n arr.splice(i, 0, rpc);\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ExportRPCEntry {\n readonly seq: number;\n readonly playerSlot: number;\n readonly packedData: ArrayBuffer;\n}\n\ninterface ExportTickEntry {\n readonly tick: number;\n readonly rpcs: ExportRPCEntry[];\n}\n"],"names":["RPC","InputBinarySchema","FieldType","fieldTypeSizeBytes","LE","RPC_HISTORY_FORMAT_VERSION","HEADER_SIZE","Uint8","Uint32","TICK_HEADER_SIZE","Uint16","RPC_HEADER_SIZE","compareRPCs","a","b","meta","playerSlot","ordinal","seq","RPCHistory","excludeLocalRPCs","rpcs","localPlayerSlot","filter","rpc","addRPC","tickRPCs","_history","get","tick","set","insertSorted","addBatch","length","perTick","Map","group","push","newRPCs","existing","sort","collectTickRPCs","InputCtor","result","inputId","id","removePlayerInputsAtTick","writeIndex","readIndex","delete","clear","size","totalRPCCount","count","values","debugExportAsJSON","exportObj","map","data","JSON","stringify","export","registry","tickEntries","prepareExportData","totalSize","calculateExportSize","buffer","ArrayBuffer","view","DataView","uint8View","Uint8Array","offset","writeHeader","writeTickEntries","import","version","tickCount","readHeader","Error","i","readTickEntry","nextOffset","entries","rpcEntries","packedData","packBatch","entry","byteLength","setUint8","setUint32","startOffset","setUint16","getUint8","getUint32","rpcCount","getUint16","j","dataLength","dataSlice","slice","unpacked","unpackBatch","arr","splice"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IAbstractInput, InputData, InputMeta } from '../types/index.js';
|
|
2
|
+
export declare class RPC<TInput extends IAbstractInput = IAbstractInput> {
|
|
3
|
+
readonly inputId: IAbstractInput['id'];
|
|
4
|
+
readonly meta: InputMeta;
|
|
5
|
+
readonly data: InputData<TInput>;
|
|
6
|
+
constructor(inputId: IAbstractInput['id'], meta: InputMeta, data: InputData<TInput>);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/lib/input/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEzE,qBAAa,GAAG,CAAC,MAAM,SAAS,cAAc,GAAG,cAAc;aAE3C,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;aAC7B,IAAI,EAAE,SAAS;aACf,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC;gBAFvB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,EAC7B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC;CAG1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/input/rpc.ts"],"sourcesContent":["import { IAbstractInput, InputData, InputMeta } from '../types/index.js';\n\nexport class RPC<TInput extends IAbstractInput = IAbstractInput> {\n constructor(\n public readonly inputId: IAbstractInput['id'],\n public readonly meta: InputMeta,\n public readonly data: InputData<TInput>,\n ) {\n }\n}\n"],"names":["RPC","constructor","inputId","meta","data"],"rangeMappings":";;;;;;","mappings":"AAEA,OAAO,MAAMA;IACXC,YACE,AAAgBC,OAA6B,EAC7C,AAAgBC,IAAe,EAC/B,AAAgBC,IAAuB,CACvC;aAHgBF,UAAAA;aACAC,OAAAA;aACAC,OAAAA;IAElB;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-memory.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/mem/abstract-memory.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/mem/abstract-memory.interface.ts"],"sourcesContent":["import { MemoryTracker } from '@lagless/binary';\n\nexport interface IAbstractMemory {\n init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;\n calculateSize(tracker: MemoryTracker): void;\n}\n"],"names":[],"rangeMappings":"","mappings":"AAEA,WAGC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/mem/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/mem/index.ts"],"sourcesContent":["export * from './mem.js';\nexport * from './managers/prng-manager.js';\nexport * from './managers/entities-manager.js';\nexport * from './managers/player-resources-manager.js';\n"],"names":[],"rangeMappings":";;;","mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,6BAA6B;AAC3C,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IAbstractMemory } from '../abstract-memory.interface.js';
|
|
2
|
+
import { ECSConfig } from '../../ecs-config.js';
|
|
3
|
+
import { ECSDeps, IComponentConstructor, IComponentInstance } from '../../types/index.js';
|
|
4
|
+
import { MemoryTracker } from '@lagless/binary';
|
|
5
|
+
export declare class ComponentsManager implements IAbstractMemory {
|
|
6
|
+
private readonly _ECSConfig;
|
|
7
|
+
private readonly _ECSDeps;
|
|
8
|
+
private readonly _componentsInstances;
|
|
9
|
+
constructor(_ECSConfig: ECSConfig, _ECSDeps: ECSDeps);
|
|
10
|
+
init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
|
|
11
|
+
calculateSize(tracker: MemoryTracker): void;
|
|
12
|
+
get<Ctor extends IComponentConstructor>(ComponentConstructor: Ctor): InstanceType<Ctor>;
|
|
13
|
+
[Symbol.iterator](): MapIterator<[IComponentConstructor, IComponentInstance]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=components-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components-manager.d.ts","sourceRoot":"","sources":["../../../../src/lib/mem/managers/components-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,iBAAkB,YAAW,eAAe;IAG3C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAa,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAF7E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwD;gBAEhE,UAAU,EAAE,SAAS,EAAmB,QAAQ,EAAE,OAAO;IAE/E,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAO5D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAM3C,GAAG,CAAC,IAAI,SAAS,qBAAqB,EAAE,oBAAoB,EAAE,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAQvF,CAAC,MAAM,CAAC,QAAQ,CAAC;CAGzB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class ComponentsManager {
|
|
2
|
+
init(arrayBuffer, tracker) {
|
|
3
|
+
for (const ComponentConstructor of this._ECSDeps.components){
|
|
4
|
+
const componentInstance = new ComponentConstructor(this._ECSConfig.maxEntities, arrayBuffer, tracker);
|
|
5
|
+
this._componentsInstances.set(ComponentConstructor, componentInstance);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
calculateSize(tracker) {
|
|
9
|
+
for (const ComponentDefinition of this._ECSDeps.components){
|
|
10
|
+
ComponentDefinition.calculateSize(this._ECSConfig.maxEntities, tracker);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
get(ComponentConstructor) {
|
|
14
|
+
const componentInstance = this._componentsInstances.get(ComponentConstructor);
|
|
15
|
+
if (!componentInstance) {
|
|
16
|
+
throw new Error(`Component ${ComponentConstructor.name} not found`);
|
|
17
|
+
}
|
|
18
|
+
return componentInstance;
|
|
19
|
+
}
|
|
20
|
+
[Symbol.iterator]() {
|
|
21
|
+
return this._componentsInstances.entries();
|
|
22
|
+
}
|
|
23
|
+
constructor(_ECSConfig, _ECSDeps){
|
|
24
|
+
this._ECSConfig = _ECSConfig;
|
|
25
|
+
this._ECSDeps = _ECSDeps;
|
|
26
|
+
this._componentsInstances = new Map();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=components-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/mem/managers/components-manager.ts"],"sourcesContent":["import { IAbstractMemory } from '../abstract-memory.interface.js';\nimport { ECSConfig } from '../../ecs-config.js';\nimport { ECSDeps, IComponentConstructor, IComponentInstance } from '../../types/index.js';\nimport { MemoryTracker } from '@lagless/binary';\n\nexport class ComponentsManager implements IAbstractMemory {\n private readonly _componentsInstances = new Map<IComponentConstructor, IComponentInstance>();\n\n constructor(private readonly _ECSConfig: ECSConfig, private readonly _ECSDeps: ECSDeps) {}\n\n public init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void {\n for (const ComponentConstructor of this._ECSDeps.components) {\n const componentInstance = new ComponentConstructor(this._ECSConfig.maxEntities, arrayBuffer, tracker);\n this._componentsInstances.set(ComponentConstructor, componentInstance);\n }\n }\n\n public calculateSize(tracker: MemoryTracker): void {\n for (const ComponentDefinition of this._ECSDeps.components) {\n ComponentDefinition.calculateSize(this._ECSConfig.maxEntities, tracker);\n }\n }\n\n public get<Ctor extends IComponentConstructor>(ComponentConstructor: Ctor): InstanceType<Ctor> {\n const componentInstance = this._componentsInstances.get(ComponentConstructor);\n if (!componentInstance) {\n throw new Error(`Component ${ComponentConstructor.name} not found`);\n }\n return componentInstance as InstanceType<Ctor>;\n }\n\n public [Symbol.iterator]() {\n return this._componentsInstances.entries();\n }\n}\n"],"names":["ComponentsManager","init","arrayBuffer","tracker","ComponentConstructor","_ECSDeps","components","componentInstance","_ECSConfig","maxEntities","_componentsInstances","set","calculateSize","ComponentDefinition","get","Error","name","Symbol","iterator","entries","constructor","Map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAKA,OAAO,MAAMA;IAKJC,KAAKC,WAAwB,EAAEC,OAAsB,EAAQ;QAClE,KAAK,MAAMC,wBAAwB,IAAI,CAACC,QAAQ,CAACC,UAAU,CAAE;YAC3D,MAAMC,oBAAoB,IAAIH,qBAAqB,IAAI,CAACI,UAAU,CAACC,WAAW,EAAEP,aAAaC;YAC7F,IAAI,CAACO,oBAAoB,CAACC,GAAG,CAACP,sBAAsBG;QACtD;IACF;IAEOK,cAAcT,OAAsB,EAAQ;QACjD,KAAK,MAAMU,uBAAuB,IAAI,CAACR,QAAQ,CAACC,UAAU,CAAE;YAC1DO,oBAAoBD,aAAa,CAAC,IAAI,CAACJ,UAAU,CAACC,WAAW,EAAEN;QACjE;IACF;IAEOW,IAAwCV,oBAA0B,EAAsB;QAC7F,MAAMG,oBAAoB,IAAI,CAACG,oBAAoB,CAACI,GAAG,CAACV;QACxD,IAAI,CAACG,mBAAmB;YACtB,MAAM,IAAIQ,MAAM,CAAC,UAAU,EAAEX,qBAAqBY,IAAI,CAAC,UAAU,CAAC;QACpE;QACA,OAAOT;IACT;IAEO,CAACU,OAAOC,QAAQ,CAAC,GAAG;QACzB,OAAO,IAAI,CAACR,oBAAoB,CAACS,OAAO;IAC1C;IAzBAC,YAAY,AAAiBZ,UAAqB,EAAE,AAAiBH,QAAiB,CAAE;aAA3DG,aAAAA;aAAwCH,WAAAA;aAFpDK,uBAAuB,IAAIW;IAE6C;AA0B3F"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FiltersManager } from './filters-manager.js';
|
|
2
|
+
import { ComponentsManager } from './components-manager.js';
|
|
3
|
+
import { IAbstractMemory } from '../abstract-memory.interface.js';
|
|
4
|
+
import { ECSConfig } from '../../ecs-config.js';
|
|
5
|
+
import { Prefab } from '../../prefab.js';
|
|
6
|
+
import { IComponentConstructor } from '../../types/index.js';
|
|
7
|
+
import { MemoryTracker } from '@lagless/binary';
|
|
8
|
+
/** Sentinel value indicating an entity slot is unused / removed. */
|
|
9
|
+
export declare const ENTITY_REMOVED_MASK = 4294967295;
|
|
10
|
+
export declare class EntitiesManager implements IAbstractMemory {
|
|
11
|
+
private readonly _ECSConfig;
|
|
12
|
+
private readonly _ComponentsMemory;
|
|
13
|
+
private readonly _FiltersMemory;
|
|
14
|
+
private _nextEntityId;
|
|
15
|
+
private _removedEntitiesLength;
|
|
16
|
+
private _removedEntities;
|
|
17
|
+
private _entitiesComponentsMasks;
|
|
18
|
+
constructor(_ECSConfig: ECSConfig, _ComponentsMemory: ComponentsManager, _FiltersMemory: FiltersManager);
|
|
19
|
+
createEntity(prefab?: Prefab): number;
|
|
20
|
+
removeEntity(entity: number): void;
|
|
21
|
+
isEntityAlive(entity: number): boolean;
|
|
22
|
+
addComponent(entity: number, ComponentConstructor: IComponentConstructor): void;
|
|
23
|
+
removeComponent(entity: number, ComponentConstructor: IComponentConstructor): void;
|
|
24
|
+
hasComponent(entity: number, ComponentConstructor: IComponentConstructor): boolean;
|
|
25
|
+
hasPrefab(entity: number, prefab: Prefab): boolean;
|
|
26
|
+
private updateFilters;
|
|
27
|
+
private popRemovedEntities;
|
|
28
|
+
init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
|
|
29
|
+
calculateSize(tracker: MemoryTracker): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=entities-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities-manager.d.ts","sourceRoot":"","sources":["../../../../src/lib/mem/managers/entities-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAE9C,qBAAa,eAAgB,YAAW,eAAe;IAOnD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;IARjC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,sBAAsB,CAAe;IAC7C,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,wBAAwB,CAAe;gBAG5B,UAAU,EAAE,SAAS,EACrB,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc;IAG1C,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IA6BrC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAmBlC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKtC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,qBAAqB,GAAG,IAAI;IAK/E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,qBAAqB,GAAG,IAAI;IAKlF,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,qBAAqB,GAAG,OAAO;IAOlF,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAUzD,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,kBAAkB;IAWnB,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAe5D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;CAMnD"}
|