| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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.`);
- }
- }
- }
- }
- }
|