import axios from 'axios'; import { Logger } from '../../common/util/logger.class'; import { Database } from './database.class'; import { Timer } from './timer.class'; export class ServerConnector { private subscriptions: Array<{ id: number; interval: number; server: Server }> = []; constructor(private db: Database) { (async () => { try { const serverList = await db.getAllServerConfigs(); serverList.forEach(server => { const interval = Number(server.config['syncInterval'] ?? '300'); Logger.info('[INFO] Starting Server Sync Connector for', server.title, 'with interval', interval, 'seconds ...'); const id = Timer.instance.subscribe(interval, () => this.timerTick(server)); this.subscriptions.push({ id, interval, server }); process.nextTick(async () => { Logger.info('[INFO] Initial Sync for', server.title, '...'); await this.timerTick(server); Logger.info('[SUCCESS] Initial Sync for', server.title, 'succeeded.'); }); }); } catch (err) { Logger.error('[FATAL] Initializing ServerConnector failed:', err); Logger.error('[EXITING]'); process.exit(1); } })(); } private async timerTick(server: Server) { Logger.debug('[DEBUG] TICK', new Date(), JSON.stringify(server)); let trxHdl: number | undefined = undefined; try { // Start Transaction, receiving Data and a Transaction Handle let response = await axios.get(`http://${server.fqdn}:8890/`, { responseType: 'json' }); trxHdl = response.data.hdl; if (!trxHdl) return; // No data const data: ReducedData[] = response.data.data.map((entry: any) => ({ ...entry, time: new Date(entry.time) })); // Process data in DB await this.db.insertServerData(server.id, data); // Commit Transaction await axios.patch(`http://${server.fqdn}:8890/${trxHdl}`, null, { responseType: 'json' }); } catch (err) { Logger.error('[ERROR] Server data sync failed:', err); if (!!trxHdl) { Logger.error(`[WARN] Rolling back transaction #${trxHdl} ... `); const response = await axios.delete(`http://${server.fqdn}:8890/${trxHdl}`, { responseType: 'json' }); if (response.data.ok) { Logger.error(`[WARN] Rollback succeeded.`); } } } } }