From fa31c471d24532c3acd55e1a8f2fc411e7e09ec0 Mon Sep 17 00:00:00 2001 From: Matthias Mohr Date: Thu, 3 Sep 2020 12:29:50 +0200 Subject: [PATCH] Run monitorFn if data is outdated #26 + bugfix --- src/baseentity.js | 11 +++++++++++ src/job.js | 8 +++++--- src/service.js | 8 +++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/baseentity.js b/src/baseentity.js index 6d0e8e90..94de4cef 100644 --- a/src/baseentity.js +++ b/src/baseentity.js @@ -17,6 +17,7 @@ class BaseEntity { this.connection = connection; this.apiToClientNames = {}; this.clientToApiNames = {}; + this.lastRefreshTime = 0; this.extra = {}; for(let i in properties) { let backend, client; @@ -59,9 +60,19 @@ class BaseEntity { this[this.apiToClientNames[name]] = metadata[name]; } } + this.lastRefreshTime = Date.now(); return this; } + /** + * Returns the age of the data in seconds. + * + * @returns {integer} + */ + getDataAge() { + return (Date.now() - this.lastRefreshTime) / 1000; + } + /** * Returns all data in the model. * diff --git a/src/job.js b/src/job.js index b0f7d55d..adae1625 100644 --- a/src/job.js +++ b/src/job.js @@ -95,7 +95,7 @@ class Job extends BaseEntity { * Checks for status changes and new log entries every x seconds. * * On every status change observed or on new log entries (if supported by the back-end), - * the callback is executed. It is also executed once at the beginning. + * the callback is executed. It may also be executed once at the beginning. * The callback receives the updated job (this object) and the logs (array) passed. * * The monitoring stops once the job has finished, was canceled or errored out. @@ -118,14 +118,16 @@ class Job extends BaseEntity { throw new Error('Monitoring Jobs not supported by the back-end.'); } - let lastStatus = null; + let lastStatus = this.status; let intervalId = null; let logIterator = null; if (capabilities.hasFeature('debugJob')) { logIterator = this.debugJob(); } let monitorFn = async () => { - await this.describeJob(); + if (this.getDataAge() >= interval-1) { + await this.describeJob(); + } let logs = logIterator ? await logIterator.nextLogs() : []; if (lastStatus !== this.status || logs.length > 0) { callback(this, logs); diff --git a/src/service.js b/src/service.js index b72462ee..446817e6 100644 --- a/src/service.js +++ b/src/service.js @@ -81,7 +81,7 @@ class Service extends BaseEntity { * Checks for new log entries every x seconds. * * On every status change (enabled/disabled) observed or on new log entries (if supported by the back-end), - * the callback is executed. It is also executed once at the beginning. + * the callback is executed. It may also be executed once at the beginning. * The callback receives the updated service (this object) and the logs (array) passed. * * Returns a function that can be called to stop monitoring the service manually. @@ -103,14 +103,16 @@ class Service extends BaseEntity { throw new Error('Monitoring Services not supported by the back-end.'); } - let wasEnabled = null; + let wasEnabled = this.enabled; let intervalId = null; let logIterator = null; if (capabilities.hasFeature('debugService')) { logIterator = this.debugService(); } let monitorFn = async () => { - await this.describeService(); + if (this.getDataAge() >= interval-1) { + await this.describeService(); + } let logs = logIterator ? await logIterator.nextLogs() : []; if (wasEnabled !== this.enabled || logs.length > 0) { callback(this, logs);