UNPKG

cs2-gsi-z

Version:

A modular, event-driven Game State Integration (GSI) handler for Counter-Strike 2 built with Node.js.

55 lines (41 loc) 1.74 kB
import { GsiParser } from "../parser/GsiParser.js"; import { applyDelta } from '../../utils/applyDelta.js'; export class GsiUpdateHandler { constructor({ logger, stateManager, differManager, emitter }) { this.logger = (logger ?? { child: () => console }).child('GsiupdateHandler'); this.stateManager = stateManager; this.differManager = differManager; this.emitter = emitter; this.logger.log('⚙️ instantiated correctly.'); } handle(rawJson) { if (!rawJson) { this.logger.warn('⚠️ Empty GSI payload received.'); return; } this.logger.log('🔔 GSI update received.'); try { const parsedState = new GsiParser(rawJson).parse(); this.logger.log('🧩 State parsed.'); const previousState = this.stateManager.getFullState(); if (previousState?.player) { this.logger.verbose('🔄 Previous complete state:'); this.logger.verbose(JSON.stringify(previousState, null, 2)); applyDelta(parsedState, rawJson.previously); this.logger.verbose('🔁 State after applying delta:'); this.logger.verbose(JSON.stringify(parsedState, null, 2)); this.logger.log('🔀 Delta applied.'); this.differManager.diff(previousState, parsedState, { emit: (event, payload) => { this.logger.log(`🛎️ Event detected: ${event}`, payload); this.emitter.emit(event, payload); } }); } this.stateManager.setFullState(parsedState); this.logger.log('📦 Snapshot updated in GameStateManager.'); } catch (error) { this.logger.error('❌ Error processing GSI update:', error); } } }