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
JavaScript
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();