@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.
Files changed (147) hide show
  1. package/README.md +970 -0
  2. package/dist/index.d.ts +11 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +12 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/di/di-container.d.ts +7 -0
  7. package/dist/lib/di/di-container.d.ts.map +1 -0
  8. package/dist/lib/di/di-container.js +25 -0
  9. package/dist/lib/di/di-container.js.map +1 -0
  10. package/dist/lib/di/di-decorators.d.ts +4 -0
  11. package/dist/lib/di/di-decorators.d.ts.map +1 -0
  12. package/dist/lib/di/di-decorators.js +96 -0
  13. package/dist/lib/di/di-decorators.js.map +1 -0
  14. package/dist/lib/di/index.d.ts +3 -0
  15. package/dist/lib/di/index.d.ts.map +1 -0
  16. package/dist/lib/di/index.js +4 -0
  17. package/dist/lib/di/index.js.map +1 -0
  18. package/dist/lib/ecs-config.d.ts +16 -0
  19. package/dist/lib/ecs-config.d.ts.map +1 -0
  20. package/dist/lib/ecs-config.js +28 -0
  21. package/dist/lib/ecs-config.js.map +1 -0
  22. package/dist/lib/ecs-runner.d.ts +20 -0
  23. package/dist/lib/ecs-runner.d.ts.map +1 -0
  24. package/dist/lib/ecs-runner.js +60 -0
  25. package/dist/lib/ecs-runner.js.map +1 -0
  26. package/dist/lib/ecs-simulation.d.ts +44 -0
  27. package/dist/lib/ecs-simulation.d.ts.map +1 -0
  28. package/dist/lib/ecs-simulation.js +138 -0
  29. package/dist/lib/ecs-simulation.js.map +1 -0
  30. package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts +32 -0
  31. package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts.map +1 -0
  32. package/dist/lib/hash-verification/abstract-hash-verification.system.js +49 -0
  33. package/dist/lib/hash-verification/abstract-hash-verification.system.js.map +1 -0
  34. package/dist/lib/hash-verification/create-hash-reporter.d.ts +16 -0
  35. package/dist/lib/hash-verification/create-hash-reporter.d.ts.map +1 -0
  36. package/dist/lib/hash-verification/create-hash-reporter.js +21 -0
  37. package/dist/lib/hash-verification/create-hash-reporter.js.map +1 -0
  38. package/dist/lib/hash-verification/divergence.signal.d.ts +11 -0
  39. package/dist/lib/hash-verification/divergence.signal.d.ts.map +1 -0
  40. package/dist/lib/hash-verification/divergence.signal.js +5 -0
  41. package/dist/lib/hash-verification/divergence.signal.js.map +1 -0
  42. package/dist/lib/hash-verification/index.d.ts +4 -0
  43. package/dist/lib/hash-verification/index.d.ts.map +1 -0
  44. package/dist/lib/hash-verification/index.js +5 -0
  45. package/dist/lib/hash-verification/index.js.map +1 -0
  46. package/dist/lib/input/abstract-input-provider.d.ts +61 -0
  47. package/dist/lib/input/abstract-input-provider.d.ts.map +1 -0
  48. package/dist/lib/input/abstract-input-provider.js +110 -0
  49. package/dist/lib/input/abstract-input-provider.js.map +1 -0
  50. package/dist/lib/input/index.d.ts +8 -0
  51. package/dist/lib/input/index.d.ts.map +1 -0
  52. package/dist/lib/input/index.js +9 -0
  53. package/dist/lib/input/index.js.map +1 -0
  54. package/dist/lib/input/input-provider-di-token.d.ts +6 -0
  55. package/dist/lib/input/input-provider-di-token.d.ts.map +1 -0
  56. package/dist/lib/input/input-provider-di-token.js +12 -0
  57. package/dist/lib/input/input-provider-di-token.js.map +1 -0
  58. package/dist/lib/input/input-registry.d.ts +8 -0
  59. package/dist/lib/input/input-registry.d.ts.map +1 -0
  60. package/dist/lib/input/input-registry.js +21 -0
  61. package/dist/lib/input/input-registry.js.map +1 -0
  62. package/dist/lib/input/local-input-provider.d.ts +6 -0
  63. package/dist/lib/input/local-input-provider.d.ts.map +1 -0
  64. package/dist/lib/input/local-input-provider.js +12 -0
  65. package/dist/lib/input/local-input-provider.js.map +1 -0
  66. package/dist/lib/input/replay-input-provider.d.ts +12 -0
  67. package/dist/lib/input/replay-input-provider.d.ts.map +1 -0
  68. package/dist/lib/input/replay-input-provider.js +46 -0
  69. package/dist/lib/input/replay-input-provider.js.map +1 -0
  70. package/dist/lib/input/rpc-history.d.ts +40 -0
  71. package/dist/lib/input/rpc-history.d.ts.map +1 -0
  72. package/dist/lib/input/rpc-history.js +308 -0
  73. package/dist/lib/input/rpc-history.js.map +1 -0
  74. package/dist/lib/input/rpc.d.ts +8 -0
  75. package/dist/lib/input/rpc.d.ts.map +1 -0
  76. package/dist/lib/input/rpc.js +9 -0
  77. package/dist/lib/input/rpc.js.map +1 -0
  78. package/dist/lib/mem/abstract-memory.interface.d.ts +6 -0
  79. package/dist/lib/mem/abstract-memory.interface.d.ts.map +1 -0
  80. package/dist/lib/mem/abstract-memory.interface.js +3 -0
  81. package/dist/lib/mem/abstract-memory.interface.js.map +1 -0
  82. package/dist/lib/mem/index.d.ts +5 -0
  83. package/dist/lib/mem/index.d.ts.map +1 -0
  84. package/dist/lib/mem/index.js +6 -0
  85. package/dist/lib/mem/index.js.map +1 -0
  86. package/dist/lib/mem/managers/components-manager.d.ts +15 -0
  87. package/dist/lib/mem/managers/components-manager.d.ts.map +1 -0
  88. package/dist/lib/mem/managers/components-manager.js +30 -0
  89. package/dist/lib/mem/managers/components-manager.js.map +1 -0
  90. package/dist/lib/mem/managers/entities-manager.d.ts +31 -0
  91. package/dist/lib/mem/managers/entities-manager.d.ts.map +1 -0
  92. package/dist/lib/mem/managers/entities-manager.js +106 -0
  93. package/dist/lib/mem/managers/entities-manager.js.map +1 -0
  94. package/dist/lib/mem/managers/filters-manager.d.ts +17 -0
  95. package/dist/lib/mem/managers/filters-manager.d.ts.map +1 -0
  96. package/dist/lib/mem/managers/filters-manager.js +46 -0
  97. package/dist/lib/mem/managers/filters-manager.js.map +1 -0
  98. package/dist/lib/mem/managers/player-resources-manager.d.ts +21 -0
  99. package/dist/lib/mem/managers/player-resources-manager.d.ts.map +1 -0
  100. package/dist/lib/mem/managers/player-resources-manager.js +52 -0
  101. package/dist/lib/mem/managers/player-resources-manager.js.map +1 -0
  102. package/dist/lib/mem/managers/prng-manager.d.ts +36 -0
  103. package/dist/lib/mem/managers/prng-manager.d.ts.map +1 -0
  104. package/dist/lib/mem/managers/prng-manager.js +126 -0
  105. package/dist/lib/mem/managers/prng-manager.js.map +1 -0
  106. package/dist/lib/mem/managers/singletons-manager.d.ts +13 -0
  107. package/dist/lib/mem/managers/singletons-manager.d.ts.map +1 -0
  108. package/dist/lib/mem/managers/singletons-manager.js +29 -0
  109. package/dist/lib/mem/managers/singletons-manager.js.map +1 -0
  110. package/dist/lib/mem/managers/tick-manager.d.ts +10 -0
  111. package/dist/lib/mem/managers/tick-manager.d.ts.map +1 -0
  112. package/dist/lib/mem/managers/tick-manager.js +18 -0
  113. package/dist/lib/mem/managers/tick-manager.js.map +1 -0
  114. package/dist/lib/mem/mem.d.ts +28 -0
  115. package/dist/lib/mem/mem.d.ts.map +1 -0
  116. package/dist/lib/mem/mem.js +63 -0
  117. package/dist/lib/mem/mem.js.map +1 -0
  118. package/dist/lib/prefab.d.ts +16 -0
  119. package/dist/lib/prefab.d.ts.map +1 -0
  120. package/dist/lib/prefab.js +17 -0
  121. package/dist/lib/prefab.js.map +1 -0
  122. package/dist/lib/signals/event-emitter.d.ts +9 -0
  123. package/dist/lib/signals/event-emitter.d.ts.map +1 -0
  124. package/dist/lib/signals/event-emitter.js +22 -0
  125. package/dist/lib/signals/event-emitter.js.map +1 -0
  126. package/dist/lib/signals/signal.d.ts +40 -0
  127. package/dist/lib/signals/signal.d.ts.map +1 -0
  128. package/dist/lib/signals/signal.js +133 -0
  129. package/dist/lib/signals/signal.js.map +1 -0
  130. package/dist/lib/signals/signals.registry.d.ts +9 -0
  131. package/dist/lib/signals/signals.registry.d.ts.map +1 -0
  132. package/dist/lib/signals/signals.registry.js +31 -0
  133. package/dist/lib/signals/signals.registry.js.map +1 -0
  134. package/dist/lib/types/abstract-filter.d.ts +16 -0
  135. package/dist/lib/types/abstract-filter.d.ts.map +1 -0
  136. package/dist/lib/types/abstract-filter.js +53 -0
  137. package/dist/lib/types/abstract-filter.js.map +1 -0
  138. package/dist/lib/types/ecs-types.d.ts +109 -0
  139. package/dist/lib/types/ecs-types.d.ts.map +1 -0
  140. package/dist/lib/types/ecs-types.js +3 -0
  141. package/dist/lib/types/ecs-types.js.map +1 -0
  142. package/dist/lib/types/index.d.ts +3 -0
  143. package/dist/lib/types/index.d.ts.map +1 -0
  144. package/dist/lib/types/index.js +4 -0
  145. package/dist/lib/types/index.js.map +1 -0
  146. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  147. 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,9 @@
1
+ export class RPC {
2
+ constructor(inputId, meta, data){
3
+ this.inputId = inputId;
4
+ this.meta = meta;
5
+ this.data = data;
6
+ }
7
+ }
8
+
9
+ //# sourceMappingURL=rpc.js.map
@@ -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,6 @@
1
+ import { MemoryTracker } from '@lagless/binary';
2
+ export interface IAbstractMemory {
3
+ init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
4
+ calculateSize(tracker: MemoryTracker): void;
5
+ }
6
+ //# sourceMappingURL=abstract-memory.interface.d.ts.map
@@ -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,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=abstract-memory.interface.js.map
@@ -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,5 @@
1
+ export * from './mem.js';
2
+ export * from './managers/prng-manager.js';
3
+ export * from './managers/entities-manager.js';
4
+ export * from './managers/player-resources-manager.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ export * from './mem.js';
2
+ export * from './managers/prng-manager.js';
3
+ export * from './managers/entities-manager.js';
4
+ export * from './managers/player-resources-manager.js';
5
+
6
+ //# sourceMappingURL=index.js.map
@@ -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"}