UNPKG

iagate-querykit

Version:

QueryKit: lightweight TypeScript query toolkit with models, views, triggers, events, scheduler and adapters (better-sqlite3).

60 lines (59 loc) 2.03 kB
import { QueryKitConfig } from './config'; class SimulationManager { static instance; active = false; virtualState = new Map(); constructor() { } static getInstance() { if (!SimulationManager.instance) { SimulationManager.instance = new SimulationManager(); } return SimulationManager.instance; } isActive() { return QueryKitConfig.simulation?.isActive() ?? this.active; } async start(initialState) { if (QueryKitConfig.simulation) return QueryKitConfig.simulation.start(initialState); this.active = true; this.virtualState.clear(); for (const key in initialState) { const value = initialState[key]; if (Array.isArray(value)) { this.virtualState.set(key, JSON.parse(JSON.stringify(value))); } else { const { sql, bindings } = value.toSql(); const exec = QueryKitConfig.defaultExecutor; if (!exec) { this.virtualState.set(key, []); continue; } const result = await exec.executeQuery(sql, bindings); const data = result.data; this.virtualState.set(key, data); } } } stop() { if (QueryKitConfig.simulation) { QueryKitConfig.simulation.stop(); } this.active = false; this.virtualState.clear(); } getStateFor(tableName) { if (QueryKitConfig.simulation) return QueryKitConfig.simulation.getStateFor(tableName); return this.virtualState.get(tableName); } updateStateFor(tableName, data) { if (this.isActive()) { if (QueryKitConfig.simulation) return QueryKitConfig.simulation.updateStateFor(tableName, data); this.virtualState.set(tableName, data); } } } export const simulationManager = SimulationManager.getInstance();