server-connector.class.ts 2.3 KB

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