@lagless/core 0.0.57 → 0.0.59
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.
|
@@ -133,7 +133,7 @@ export class ECSSimulation {
|
|
|
133
133
|
if (this._hashTrackingInterval > 0 && currentTick % this._hashTrackingInterval === 0) {
|
|
134
134
|
this._hashHistory.set(currentTick, this.mem.getHash());
|
|
135
135
|
}
|
|
136
|
-
this._signalsRegistry.onTick(this._inputProvider.verifiedTick);
|
|
136
|
+
this._signalsRegistry.onTick(Math.min(this._inputProvider.verifiedTick, currentTick));
|
|
137
137
|
this.storeSnapshotIfNeeded(currentTick);
|
|
138
138
|
for (const handler of this._onTickHandlers)handler(currentTick);
|
|
139
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/ecs-simulation.ts"],"sourcesContent":["import { MathOps } from '@lagless/math';\nimport { Mem } from './mem/index.js';\nimport { ECSConfig } from './ecs-config.js';\nimport { SimulationClock, SnapshotHistory, createLogger } from '@lagless/misc';\nimport { ECSDeps, IECSSystem } from './types/index.js';\nimport { AbstractInputProvider } from './input/index.js';\nimport { SignalsRegistry } from './signals/signals.registry.js';\n\nconst log = createLogger('ECSSimulation');\n\nexport class ECSSimulation {\n public readonly mem: Mem;\n public readonly clock: SimulationClock;\n private readonly _signalsRegistry: SignalsRegistry;\n private readonly _frameLength: number;\n private readonly _snapshotRate: number;\n protected _initialSnapshot!: ArrayBuffer;\n private readonly _systems = new Array<IECSSystem>();\n private readonly _onTickHandlers = new Set<(tick: number) => void>();\n private readonly _onRollbackHandlers = new Set<(tick: number) => void>();\n private readonly _onStateTransferHandlers = new Set<(tick: number) => void>();\n\n private _interpolationFactor = 0;\n protected _snapshotHistory: SnapshotHistory<ArrayBuffer>;\n private _hashTrackingInterval = 0;\n private _hashHistory = new Map<number, number>();\n\n public get tick(): number {\n return this.mem.tickManager.tick;\n }\n\n public get interpolationFactor(): number {\n return this._interpolationFactor;\n }\n\n constructor(\n protected readonly _ECSConfig: ECSConfig,\n private readonly _ECSDeps: ECSDeps,\n private readonly _inputProvider: AbstractInputProvider,\n ) {\n this.mem = new Mem(this._ECSConfig, this._ECSDeps);\n this._frameLength = this._ECSConfig.frameLength;\n this._snapshotRate = this._ECSConfig.snapshotRate;\n this._snapshotHistory = new SnapshotHistory<ArrayBuffer>(this._ECSConfig.snapshotHistorySize);\n this._initialSnapshot = this.mem.exportSnapshot();\n this.clock = new SimulationClock(_ECSConfig.frameLength, _ECSConfig.maxNudgePerFrame);\n this._signalsRegistry = new SignalsRegistry();\n }\n\n public addTickHandler(handler: (tick: number) => void): () => void {\n this._onTickHandlers.add(handler);\n return () => {\n this._onTickHandlers.delete(handler);\n };\n }\n\n public removeTickHandler(handler: (tick: number) => void): void {\n this._onTickHandlers.delete(handler);\n }\n\n public addRollbackHandler(handler: (tick: number) => void): () => void {\n this._onRollbackHandlers.add(handler);\n return () => { this._onRollbackHandlers.delete(handler); };\n }\n\n public addStateTransferHandler(handler: (tick: number) => void): () => void {\n this._onStateTransferHandlers.add(handler);\n return () => { this._onStateTransferHandlers.delete(handler); };\n }\n\n public registerSystems(systems: IECSSystem[]): void {\n if (this._systems.length !== 0) throw new Error('Systems already registered');\n\n for (const system of systems) {\n this._systems.push(system);\n }\n }\n\n public initSignals(signals: import('./signals/signal.js').Signal[]): void {\n this._signalsRegistry.init(signals);\n }\n\n public disposeSignals(): void {\n this._signalsRegistry.dispose();\n }\n\n public throwIfSystemsNotRegistered(): void {\n if (this._systems.length === 0) {\n throw new Error('No systems registered.');\n }\n }\n\n public get registeredSystems(): ReadonlyArray<IECSSystem> {\n return this._systems;\n }\n\n public get frameLength(): number {\n return this._frameLength;\n }\n\n public get inputProvider(): AbstractInputProvider {\n return this._inputProvider;\n }\n\n public enableHashTracking(interval: number): void {\n this._hashTrackingInterval = interval;\n }\n\n public disableHashTracking(): void {\n this._hashTrackingInterval = 0;\n this._hashHistory.clear();\n }\n\n public getHashAtTick(tick: number): number | undefined {\n return this._hashHistory.get(tick);\n }\n\n public start(): void {\n this.clock.start();\n }\n\n /**\n * Apply external state received from another client (late-join / reconnect).\n * Replaces the entire simulation state, sets the tick, and resets history.\n */\n public applyExternalState(state: ArrayBuffer, tick: number): void {\n log.info(`Applying external state at tick ${tick} (${state.byteLength} bytes)`);\n\n // Apply the snapshot to memory\n this.mem.applySnapshot(state);\n\n // Set tick (snapshot may have been taken at a different tick than requested)\n this.mem.tickManager.setTick(tick);\n\n // Reset snapshot history — old snapshots are from a different timeline\n this._snapshotHistory = new SnapshotHistory<ArrayBuffer>(this._ECSConfig.snapshotHistorySize);\n\n // Save the received state as the new baseline snapshot\n this.saveSnapshot(tick);\n\n // Adjust clock to match the new tick\n this.clock.setAccumulatedTime(tick * this._frameLength);\n\n // Reset signals — old predictions are invalid\n this._signalsRegistry.dispose();\n\n // Clear hash history — old hashes are from a different timeline\n this._hashHistory.clear();\n }\n\n /**\n * Export simulation state for network state transfer (late-join / reconnect).\n * Override in subclasses to include additional state (e.g. physics world).\n */\n public exportStateForTransfer(): ArrayBuffer {\n return this.mem.exportSnapshot();\n }\n\n /**\n * Apply state received from network state transfer (late-join / reconnect).\n * Override in subclasses to restore additional state (e.g. physics world).\n */\n public applyStateFromTransfer(blob: ArrayBuffer, tick: number): void {\n this.applyExternalState(blob, tick);\n this.notifyStateTransferHandlers(tick);\n }\n\n protected notifyStateTransferHandlers(tick: number): void {\n for (const handler of this._onStateTransferHandlers) handler(tick);\n }\n\n public update(dt: number) {\n this.clock.update(dt);\n\n const targetTick = Math.floor(this.clock.accumulatedTime / this._frameLength);\n\n this.checkAndRollback(this.mem.tickManager.tick);\n this.simulationTicks(this.mem.tickManager.tick, targetTick);\n\n this._inputProvider.update();\n\n const simTick = this.mem.tickManager.tick;\n const tickTime = simTick * this._frameLength;\n const leftover = this.clock.accumulatedTime - tickTime;\n\n this._interpolationFactor = MathOps.clamp01(leftover / this._frameLength);\n }\n\n private checkAndRollback(currentTick: number) {\n const rollbackTick = this._inputProvider.getInvalidateRollbackTick();\n\n if (rollbackTick === undefined || rollbackTick > currentTick) return;\n\n this.rollback(rollbackTick);\n\n for (const handler of this._onRollbackHandlers) handler(this.tick);\n }\n\n private simulationTicks(currentTick: number, toTick: number): void {\n if (toTick - currentTick > 1) {\n log.warn(`Simulation ticks: ${currentTick} -> ${toTick} (simulate ${toTick - currentTick})`);\n }\n\n while (currentTick < toTick) {\n this.mem.tickManager.setTick(++currentTick);\n this.simulate(currentTick);\n\n if (this._hashTrackingInterval > 0 && currentTick % this._hashTrackingInterval === 0) {\n this._hashHistory.set(currentTick, this.mem.getHash());\n }\n\n this._signalsRegistry.onTick(this._inputProvider.verifiedTick);\n this.storeSnapshotIfNeeded(currentTick);\n for (const handler of this._onTickHandlers) handler(currentTick);\n }\n\n // Prune old hash entries\n if (this._hashHistory.size > 0) {\n const pruneBelow = this._inputProvider.verifiedTick - 600;\n if (pruneBelow > 0) {\n for (const tick of this._hashHistory.keys()) {\n if (tick < pruneBelow) this._hashHistory.delete(tick);\n }\n }\n }\n }\n\n protected rollback(tick: number): void {\n this._signalsRegistry.onBeforeRollback(tick);\n let snapshot: ArrayBuffer;\n\n try {\n snapshot = this._snapshotHistory.getNearest(tick);\n log.warn(`Rollback to tick ${tick} succeeded`);\n } catch {\n snapshot = this._initialSnapshot;\n log.warn(`Rollback to tick ${tick} failed, using initial snapshot`);\n }\n\n this.mem.applySnapshot(snapshot);\n this._snapshotHistory.rollback(this.mem.tickManager.tick);\n }\n\n protected simulate(tick: number): void {\n for (let i = 0; i < this._systems.length; i++) {\n this._systems[i].update(tick);\n }\n }\n\n private storeSnapshotIfNeeded(tick: number): void {\n if (this._snapshotRate === 0) return;\n\n if (tick % this._snapshotRate === 0) {\n this.saveSnapshot(tick);\n }\n\n if (tick % 200 === 0) {\n log.debug(`Mem Hash at tick ${tick}: ${this.mem.getHash()}`);\n }\n }\n\n protected saveSnapshot(tick: number): void {\n this._snapshotHistory.set(tick, this.mem.exportSnapshot());\n }\n}\n"],"names":["MathOps","Mem","SimulationClock","SnapshotHistory","createLogger","SignalsRegistry","log","ECSSimulation","tick","mem","tickManager","interpolationFactor","_interpolationFactor","addTickHandler","handler","_onTickHandlers","add","delete","removeTickHandler","addRollbackHandler","_onRollbackHandlers","addStateTransferHandler","_onStateTransferHandlers","registerSystems","systems","_systems","length","Error","system","push","initSignals","signals","_signalsRegistry","init","disposeSignals","dispose","throwIfSystemsNotRegistered","registeredSystems","frameLength","_frameLength","inputProvider","_inputProvider","enableHashTracking","interval","_hashTrackingInterval","disableHashTracking","_hashHistory","clear","getHashAtTick","get","start","clock","applyExternalState","state","info","byteLength","applySnapshot","setTick","_snapshotHistory","_ECSConfig","snapshotHistorySize","saveSnapshot","setAccumulatedTime","exportStateForTransfer","exportSnapshot","applyStateFromTransfer","blob","notifyStateTransferHandlers","update","dt","targetTick","Math","floor","accumulatedTime","checkAndRollback","simulationTicks","simTick","tickTime","leftover","clamp01","currentTick","rollbackTick","getInvalidateRollbackTick","undefined","rollback","toTick","warn","simulate","set","getHash","onTick","verifiedTick","storeSnapshotIfNeeded","size","pruneBelow","keys","onBeforeRollback","snapshot","getNearest","_initialSnapshot","i","_snapshotRate","debug","constructor","_ECSDeps","Array","Set","Map","snapshotRate","maxNudgePerFrame"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/ecs-simulation.ts"],"sourcesContent":["import { MathOps } from '@lagless/math';\nimport { Mem } from './mem/index.js';\nimport { ECSConfig } from './ecs-config.js';\nimport { SimulationClock, SnapshotHistory, createLogger } from '@lagless/misc';\nimport { ECSDeps, IECSSystem } from './types/index.js';\nimport { AbstractInputProvider } from './input/index.js';\nimport { SignalsRegistry } from './signals/signals.registry.js';\n\nconst log = createLogger('ECSSimulation');\n\nexport class ECSSimulation {\n public readonly mem: Mem;\n public readonly clock: SimulationClock;\n private readonly _signalsRegistry: SignalsRegistry;\n private readonly _frameLength: number;\n private readonly _snapshotRate: number;\n protected _initialSnapshot!: ArrayBuffer;\n private readonly _systems = new Array<IECSSystem>();\n private readonly _onTickHandlers = new Set<(tick: number) => void>();\n private readonly _onRollbackHandlers = new Set<(tick: number) => void>();\n private readonly _onStateTransferHandlers = new Set<(tick: number) => void>();\n\n private _interpolationFactor = 0;\n protected _snapshotHistory: SnapshotHistory<ArrayBuffer>;\n private _hashTrackingInterval = 0;\n private _hashHistory = new Map<number, number>();\n\n public get tick(): number {\n return this.mem.tickManager.tick;\n }\n\n public get interpolationFactor(): number {\n return this._interpolationFactor;\n }\n\n constructor(\n protected readonly _ECSConfig: ECSConfig,\n private readonly _ECSDeps: ECSDeps,\n private readonly _inputProvider: AbstractInputProvider,\n ) {\n this.mem = new Mem(this._ECSConfig, this._ECSDeps);\n this._frameLength = this._ECSConfig.frameLength;\n this._snapshotRate = this._ECSConfig.snapshotRate;\n this._snapshotHistory = new SnapshotHistory<ArrayBuffer>(this._ECSConfig.snapshotHistorySize);\n this._initialSnapshot = this.mem.exportSnapshot();\n this.clock = new SimulationClock(_ECSConfig.frameLength, _ECSConfig.maxNudgePerFrame);\n this._signalsRegistry = new SignalsRegistry();\n }\n\n public addTickHandler(handler: (tick: number) => void): () => void {\n this._onTickHandlers.add(handler);\n return () => {\n this._onTickHandlers.delete(handler);\n };\n }\n\n public removeTickHandler(handler: (tick: number) => void): void {\n this._onTickHandlers.delete(handler);\n }\n\n public addRollbackHandler(handler: (tick: number) => void): () => void {\n this._onRollbackHandlers.add(handler);\n return () => { this._onRollbackHandlers.delete(handler); };\n }\n\n public addStateTransferHandler(handler: (tick: number) => void): () => void {\n this._onStateTransferHandlers.add(handler);\n return () => { this._onStateTransferHandlers.delete(handler); };\n }\n\n public registerSystems(systems: IECSSystem[]): void {\n if (this._systems.length !== 0) throw new Error('Systems already registered');\n\n for (const system of systems) {\n this._systems.push(system);\n }\n }\n\n public initSignals(signals: import('./signals/signal.js').Signal[]): void {\n this._signalsRegistry.init(signals);\n }\n\n public disposeSignals(): void {\n this._signalsRegistry.dispose();\n }\n\n public throwIfSystemsNotRegistered(): void {\n if (this._systems.length === 0) {\n throw new Error('No systems registered.');\n }\n }\n\n public get registeredSystems(): ReadonlyArray<IECSSystem> {\n return this._systems;\n }\n\n public get frameLength(): number {\n return this._frameLength;\n }\n\n public get inputProvider(): AbstractInputProvider {\n return this._inputProvider;\n }\n\n public enableHashTracking(interval: number): void {\n this._hashTrackingInterval = interval;\n }\n\n public disableHashTracking(): void {\n this._hashTrackingInterval = 0;\n this._hashHistory.clear();\n }\n\n public getHashAtTick(tick: number): number | undefined {\n return this._hashHistory.get(tick);\n }\n\n public start(): void {\n this.clock.start();\n }\n\n /**\n * Apply external state received from another client (late-join / reconnect).\n * Replaces the entire simulation state, sets the tick, and resets history.\n */\n public applyExternalState(state: ArrayBuffer, tick: number): void {\n log.info(`Applying external state at tick ${tick} (${state.byteLength} bytes)`);\n\n // Apply the snapshot to memory\n this.mem.applySnapshot(state);\n\n // Set tick (snapshot may have been taken at a different tick than requested)\n this.mem.tickManager.setTick(tick);\n\n // Reset snapshot history — old snapshots are from a different timeline\n this._snapshotHistory = new SnapshotHistory<ArrayBuffer>(this._ECSConfig.snapshotHistorySize);\n\n // Save the received state as the new baseline snapshot\n this.saveSnapshot(tick);\n\n // Adjust clock to match the new tick\n this.clock.setAccumulatedTime(tick * this._frameLength);\n\n // Reset signals — old predictions are invalid\n this._signalsRegistry.dispose();\n\n // Clear hash history — old hashes are from a different timeline\n this._hashHistory.clear();\n }\n\n /**\n * Export simulation state for network state transfer (late-join / reconnect).\n * Override in subclasses to include additional state (e.g. physics world).\n */\n public exportStateForTransfer(): ArrayBuffer {\n return this.mem.exportSnapshot();\n }\n\n /**\n * Apply state received from network state transfer (late-join / reconnect).\n * Override in subclasses to restore additional state (e.g. physics world).\n */\n public applyStateFromTransfer(blob: ArrayBuffer, tick: number): void {\n this.applyExternalState(blob, tick);\n this.notifyStateTransferHandlers(tick);\n }\n\n protected notifyStateTransferHandlers(tick: number): void {\n for (const handler of this._onStateTransferHandlers) handler(tick);\n }\n\n public update(dt: number) {\n this.clock.update(dt);\n\n const targetTick = Math.floor(this.clock.accumulatedTime / this._frameLength);\n\n this.checkAndRollback(this.mem.tickManager.tick);\n this.simulationTicks(this.mem.tickManager.tick, targetTick);\n\n this._inputProvider.update();\n\n const simTick = this.mem.tickManager.tick;\n const tickTime = simTick * this._frameLength;\n const leftover = this.clock.accumulatedTime - tickTime;\n\n this._interpolationFactor = MathOps.clamp01(leftover / this._frameLength);\n }\n\n private checkAndRollback(currentTick: number) {\n const rollbackTick = this._inputProvider.getInvalidateRollbackTick();\n\n if (rollbackTick === undefined || rollbackTick > currentTick) return;\n\n this.rollback(rollbackTick);\n\n for (const handler of this._onRollbackHandlers) handler(this.tick);\n }\n\n private simulationTicks(currentTick: number, toTick: number): void {\n if (toTick - currentTick > 1) {\n log.warn(`Simulation ticks: ${currentTick} -> ${toTick} (simulate ${toTick - currentTick})`);\n }\n\n while (currentTick < toTick) {\n this.mem.tickManager.setTick(++currentTick);\n this.simulate(currentTick);\n\n if (this._hashTrackingInterval > 0 && currentTick % this._hashTrackingInterval === 0) {\n this._hashHistory.set(currentTick, this.mem.getHash());\n }\n\n this._signalsRegistry.onTick(Math.min(this._inputProvider.verifiedTick, currentTick));\n this.storeSnapshotIfNeeded(currentTick);\n for (const handler of this._onTickHandlers) handler(currentTick);\n }\n\n // Prune old hash entries\n if (this._hashHistory.size > 0) {\n const pruneBelow = this._inputProvider.verifiedTick - 600;\n if (pruneBelow > 0) {\n for (const tick of this._hashHistory.keys()) {\n if (tick < pruneBelow) this._hashHistory.delete(tick);\n }\n }\n }\n }\n\n protected rollback(tick: number): void {\n this._signalsRegistry.onBeforeRollback(tick);\n let snapshot: ArrayBuffer;\n\n try {\n snapshot = this._snapshotHistory.getNearest(tick);\n log.warn(`Rollback to tick ${tick} succeeded`);\n } catch {\n snapshot = this._initialSnapshot;\n log.warn(`Rollback to tick ${tick} failed, using initial snapshot`);\n }\n\n this.mem.applySnapshot(snapshot);\n this._snapshotHistory.rollback(this.mem.tickManager.tick);\n }\n\n protected simulate(tick: number): void {\n for (let i = 0; i < this._systems.length; i++) {\n this._systems[i].update(tick);\n }\n }\n\n private storeSnapshotIfNeeded(tick: number): void {\n if (this._snapshotRate === 0) return;\n\n if (tick % this._snapshotRate === 0) {\n this.saveSnapshot(tick);\n }\n\n if (tick % 200 === 0) {\n log.debug(`Mem Hash at tick ${tick}: ${this.mem.getHash()}`);\n }\n }\n\n protected saveSnapshot(tick: number): void {\n this._snapshotHistory.set(tick, this.mem.exportSnapshot());\n }\n}\n"],"names":["MathOps","Mem","SimulationClock","SnapshotHistory","createLogger","SignalsRegistry","log","ECSSimulation","tick","mem","tickManager","interpolationFactor","_interpolationFactor","addTickHandler","handler","_onTickHandlers","add","delete","removeTickHandler","addRollbackHandler","_onRollbackHandlers","addStateTransferHandler","_onStateTransferHandlers","registerSystems","systems","_systems","length","Error","system","push","initSignals","signals","_signalsRegistry","init","disposeSignals","dispose","throwIfSystemsNotRegistered","registeredSystems","frameLength","_frameLength","inputProvider","_inputProvider","enableHashTracking","interval","_hashTrackingInterval","disableHashTracking","_hashHistory","clear","getHashAtTick","get","start","clock","applyExternalState","state","info","byteLength","applySnapshot","setTick","_snapshotHistory","_ECSConfig","snapshotHistorySize","saveSnapshot","setAccumulatedTime","exportStateForTransfer","exportSnapshot","applyStateFromTransfer","blob","notifyStateTransferHandlers","update","dt","targetTick","Math","floor","accumulatedTime","checkAndRollback","simulationTicks","simTick","tickTime","leftover","clamp01","currentTick","rollbackTick","getInvalidateRollbackTick","undefined","rollback","toTick","warn","simulate","set","getHash","onTick","min","verifiedTick","storeSnapshotIfNeeded","size","pruneBelow","keys","onBeforeRollback","snapshot","getNearest","_initialSnapshot","i","_snapshotRate","debug","constructor","_ECSDeps","Array","Set","Map","snapshotRate","maxNudgePerFrame"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lagless/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.59",
|
|
4
4
|
"license": "CC-BY-NC-4.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@swc/helpers": "~0.5.11",
|
|
42
|
-
"@lagless/binary": "0.0.
|
|
43
|
-
"@lagless/
|
|
44
|
-
"@lagless/
|
|
42
|
+
"@lagless/binary": "0.0.59",
|
|
43
|
+
"@lagless/misc": "0.0.59",
|
|
44
|
+
"@lagless/math": "0.0.59"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"unplugin-swc": "^1.5.7"
|