server-connector.class.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import axios from 'axios';
  2. import { Logger } from '../../common/util/logger.class';
  3. import { Database } from './database.class';
  4. import { Timer } from './timer.class';
  5. export class ServerConnector {
  6. private subscriptions: Array<{ id: number; interval: number; server: Server }> = [];
  7. constructor(db: Database) {
  8. (async () => {
  9. try {
  10. const serverList = await db.getAllServerConfigs();
  11. serverList.forEach(async server => {
  12. const serverDB = new Database();
  13. await serverDB.open();
  14. const interval = Number(server.config['syncInterval'] ?? '300');
  15. Logger.info('[INFO] Starting Server Sync Connector for', server.title, 'with interval', interval, 'seconds ...');
  16. const id = Timer.instance.subscribe(interval, () => this.timerTick(server, serverDB));
  17. this.subscriptions.push({ id, interval, server });
  18. process.nextTick(async () => {
  19. Logger.info('[INFO] Initial Sync for', server.title, '...');
  20. await this.timerTick(server, serverDB);
  21. Logger.info('[SUCCESS] Initial Sync for', server.title, 'succeeded.');
  22. });
  23. });
  24. } catch (err) {
  25. Logger.error('[FATAL] Initializing ServerConnector failed:', err);
  26. Logger.error('[EXITING]');
  27. process.exit(1);
  28. }
  29. })();
  30. }
  31. private async timerTick(server: Server, db: Database) {
  32. Logger.debug('[DEBUG] TICK', new Date(), JSON.stringify(server));
  33. let trxHdl: number | undefined = undefined;
  34. try {
  35. // Start Transaction, receiving Data and a Transaction Handle
  36. let response = await axios.get(`http://${server.fqdn}:8890/`, { responseType: 'json' });
  37. trxHdl = response.data.hdl;
  38. if (!trxHdl) return; // No data
  39. const data: ReducedData[] = response.data.data.map((entry: any) => ({ ...entry, time: new Date(entry.time) }));
  40. // Process data in DB
  41. await db.insertServerData(server.id, data);
  42. // Commit Transaction
  43. await axios.patch(`http://${server.fqdn}:8890/${trxHdl}`, null, { responseType: 'json' });
  44. } catch (err) {
  45. Logger.error('[ERROR] Server data sync failed:', err);
  46. if (!!trxHdl) {
  47. Logger.error(`[WARN] Rolling back transaction #${trxHdl} ... `);
  48. const response = await axios.delete(`http://${server.fqdn}:8890/${trxHdl}`, { responseType: 'json' });
  49. if (response.data.ok) {
  50. Logger.error(`[WARN] Rollback succeeded.`);
  51. }
  52. }
  53. // if (!!db) await db.close();
  54. }
  55. }
  56. }