mirror of
https://github.com/nasa/openmct.git
synced 2025-06-17 06:38:17 +00:00
2.0.5 Backmerge (#5505)
* Bump d3-selection from 1.3.2 to 3.0.0 Bumps [d3-selection](https://github.com/d3/d3-selection) from 1.3.2 to 3.0.0. - [Release notes](https://github.com/d3/d3-selection/releases) - [Commits](https://github.com/d3/d3-selection/compare/v1.3.2...v3.0.0) --- updated-dependencies: - dependency-name: d3-selection dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> * Remove snapshot * Fix imagery filter slider drag in flexible layouts (#5326) (#5350) * Dont' mutate a stacked plot unless its user initiated (#5357) * Port grid icons and imagery test to release 2.0.5 from master (#5360) * Port grid icons to release 2.0.5 from master * Port imagery test to release/2.0.5 * Restrict timestrip composition to time based plots, plans and imagery (#5161) * Restrict timestrip composition to time based plots, plans and imagery * Adds unit tests for timeline composition policy * Addresses review comments Improves tests * Reuse test objects Co-authored-by: Jamie V <jamie.j.vigliotta@nasa.gov> * Include objectStyles reference to conditionSetIdentifier in imports (#5354) * Include objectStyles reference to conditionSetIdentifier in imports * Add tests for export * Refactored some code and removed console log * Remove workarounds for chrome 'scrollTop' issue (#5375) * Fix naming of method (#5368) * Imagery View does not discard old images when they fall out of bounds (#5351) * change to using telemetry collection * fix tests * added more unit tests * Cherrypicked commits (#5390) Co-authored-by: unlikelyzero <jchill2@gmail.com> * [Timer] Update 3dot menu actions appropriately (#5387) * Call `removeAllListeners()` after emit * Manually show/hide actions if within a view * remove sneaky `console.log()` * Add Timer e2e test * Add to comments * Avoid hard waits in Timer e2e test - Assert against timer view state instead of menu options * Let's also test actions from the Timer view * 5391 Add preview and drag support to Grand Search (#5394) * add preview and drag actions * added unit test, simplified remove action * do not hide search results in preview mode when clicking outside search results * add semantic aria labels to enable e2e tests * readd preview * add e2e test * remove commented out url * add percy snapshot and add search to ci * make percy stuff work * linting * fix percy again * move percy snapshots to a visual test * added separate visual test and changed test to fixtures * fix fixtures path * addressing review comments * 5361 tags not persisting locally (#5408) * fixed typo * remove unneeded lookup * fix tags adding and deleting * more reliable way to remove tags * break tests up for parallel execution * fixed notebook tagging test * enable e2e tests * made schedule index comment more clear and fix uppercase/lowercase issue * address e2e changes * add unit test to bump coverage * fix typo * need to check on annotation creation if provider exists or not * added fixtures * undo silly couchdb commit * Plot progress bar fix for 2.0.5 (#5386) * Add .bind(this) to stopLoading() in loadMoreData() * Replace load spinner with progress bar for plots * Add loading delay prop to swg * fix linting errors * match load order * Update accessibility * Add Math.max to timeout to handle negative inputs * Moved math.max to load delay variable * Add loading fix for stacked plots * Move loadingUpdate func into plot item for update * Merge conflict resolve * Check if delay is 0 and send, put post in a func * Put obj directly to model, removed computed prop * Lint fix * Fix template where legend was not displayed * Remove commented out template * Fixed failing test Co-authored-by: unlikelyzero <jchill2@gmail.com> * Make plans non editable. (#5377) * Make plans non editable. * Add unit test for fix * [CouchDB] Better determination of indicator status (#5415) * Add unknown state, remove maintenance state * Handle all CouchDB status codes - Set unknown status if we receive an unhandled code * Include status code in error messages * SharedWorker can send unknown status * Add test for unknown status * Gauge fixes for Firefox and units display (#5369) * Closes #5323, #5325. Parent branch is release/2.0.5. - Significant work refactoring SVG markup and CSS for dial gauge; - Fixed missing `v-if` to control display of units for #5325; - Fixed bad `.length` test for limit properties; * Closes #5323, #5325 - Add 'value out of range' indicator * Closes #5323, #5325 - More accurate element naming; - Fix cross-browser problems with current value display in dial gauge; - Refinements to "out of range" indicator approach; - Fixed size of "Amplitude" input in Sine Wave Generator; * Closes #5323, #5325 - Styles and stubbed in code to support needle meter type; * Closes #5323, #5325 - Stubbed in markup and CSS for needle-style meter; * Closes #5323, #5325 - Fixed missing `js-*` classes that were failing npm run test; * Closes #5323, #5325 - Fix to not display meter value bar unless a data value is expected; * Addressing PR comments - Renamed method for clarity; - Added null value check in method `valueExpected`; * [Static Root] Return leafValue if null/undefined/false (#5416) * Return leafValue if null/undefined/false * Added a null to the test json * Show a better default poll question (#5425) * 5361 Tags not persisting when several notebook entries are created at once (#5428) * add end to end test to catch multiple entry errors * click expansion triangle instead * fix race condition between annotation creation and mutation * make sure notebook tags run in e2e * address PR comments * Handle missing objects gracefully (#5399) * Handle missing object errors for display layouts * Handle missing object errors for Overlay Plots * Add check for this.config * Add try/catch statement & check if obj is missing * Changed console.error to console.warn * Lint fix * Fix for this.metadata.value is undefined * Add e2e test * Update comment text * Add reload check and @private, verify console.warn * Redid assignment and metadata check * Fix typo * Changed assignment and metadata check * Redid checks for isMissing(object) * Lint fix * Backmerge e2e code coverage changes and fixes into release/2.0.5 (#5431) * [Telemetry Collections] Respect "Latest" Strategy Option (#5421) * Respect latest strategy in Telemetry Collections to limit potential memory growth. * fix sourcemaps (#5373) Co-authored-by: John Hill <john.c.hill@nasa.gov> * Debounce status summary (#5448) Co-authored-by: John Hill <john.c.hill@nasa.gov> * No gauge (#5451) * Installed gauge plugin by default * Make gauge part of standard install in e2e suite and add restrictednotebook Co-authored-by: Andrew Henry <akhenry@gmail.com> * [CouchDB] Always subscribe to the CouchDB changes feed (#5434) * Add unknown state, remove maintenance state * Handle all CouchDB status codes - Set unknown status if we receive an unhandled code * Include status code in error messages * SharedWorker can send unknown status * Add test for unknown status * Always subscribe to CouchDB changes feed - Always subscribe to the CouchDB changes feed, even if there are no observable objects, since we are also checking the status of CouchDB via this feed. * Update indicator status if not using SharedWorker * Start listening to changes feed on first request * fix test * adjust test to hopefully avoid race condition * lint Co-authored-by: John Hill <john.c.hill@nasa.gov> Co-authored-by: Andrew Henry <akhenry@gmail.com> Co-authored-by: Scott Bell <scott@traclabs.com> * Fix for Fault Management Visual Bugs (#5376) * Closes #5365 * General visual improvements Co-authored-by: Charles Hacskaylo <charlesh88@gmail.com> Co-authored-by: Andrew Henry <akhenry@gmail.com> * fix pathing (#5452) Co-authored-by: Jesse Mazzella <ozyx@users.noreply.github.com> * [Static Root] Static Root Plugin not loading (#5455) * Log if hitting falsy leafValue * Add some logging * Remove logs and specify null/undefined Co-authored-by: Jesse Mazzella <ozyx@users.noreply.github.com> * Allow endpoints with a single enum metadata value in Bar/Line graphs (#5443) * If there is only 1 metadata value, set yKey to none. Also, fix bug for determining the name of a metadata value * Update tests for enum metadata values Co-authored-by: John Hill <john.c.hill@nasa.gov> Co-authored-by: Andrew Henry <akhenry@gmail.com> * [Remote Clock] Wait for first tick and recalculate historical request bounds (#5433) * Updated to ES6 class * added request intercept functionality to telemetry api, added a request interceptor for remote clock * add remoteClock e2e test stub Co-authored-by: Jamie V <jamie.j.vigliotta@nasa.gov> Co-authored-by: Andrew Henry <akhenry@gmail.com> * Fix for missing object for LADTableSet (#5458) * Handle missing object errors for display layouts Co-authored-by: Andrew Henry <akhenry@gmail.com> * removing the call for default import now that TelemetryAPI is an ES6 class (#5461) * [Remote Clock] Fix requestInterceptor typo (#5462) * Fix typo in telemetry request interceptor Co-authored-by: Jamie V <jamie.j.vigliotta@nasa.gov> Co-authored-by: Andrew Henry <akhenry@gmail.com> * Lock model (#5457) * Lock event Model to prevent reactification * de-reactify all the things * Make API properties writable to allow test mocks to override them * Fix merge conflict * Added plot interceptor for missing series config (#5422) Co-authored-by: Andrew Henry <akhenry@gmail.com> Co-authored-by: Shefali Joshi <simplyrender@gmail.com> * Remove performance marks (#5465) * Remove performance marks * Retain performance mark in view large. It doesn't happen very often and it's needed for an automated performance test * Use timeKey for time comparison (#5471) * Fix couchdb no response (#5474) * Update the creation date only when the document is created for the first time * If there is no response from a bulk get, couch db has issues * Check the response - if it's null, don't apply interceptors * Fix shelved alarms (#5479) * Fix the logic around shelved alarms * Remove application router listener * Release 2.0.5 UI and Gauge fixes (#5470) * Various UI fixes - Tweak to Gauge properties form for clarity and usability. - Fix Gauge 'dial' type not obeying "Show units" property setting, closes #5325. - Tweaks to Operator Status UI label and layout for clarity. - Changed name and description of Graph object for clarity and consistency. - Fixed CSS classing that was coloring Export menu items text incorrectly. - Fixed icon-to-text vertical alignment in `.c-object-label`. - Fix for broken layout in imagery local controls (brightness, layers, magnification). Co-authored-by: Andrew Henry <akhenry@gmail.com> * Stacked plot interceptor rename (#5468) * Rename stacked plot interceptor and move to folder Co-authored-by: Andrew Henry <akhenry@gmail.com> * Clear data when time bounds are changed (#5482) * Clear data when time bounds are changed Also react to clear data action Ensure that the yKey is set to 'none' if there is no range with array Values * Refactor trace updates to a method * get rid of root (#5483) * Do not pass onPartialResponse option on to upstream telemetry (#5486) * Fix all of the e2e tests (#5477) * Fix timer test * be explicit about the warnings text * add full suite to CI to enable CircleCI Checks * add back in devtool=false for CI env so firefox tests run * add framework suite * Don't install webpack HMR in CI * Fix playwright version installs * exclude HMR if running tests in any environment - use NODE_ENV=TEST to exclude webpack HMR - deparameterize some of the playwright configs * use lower-case 'test' * timer hover fix * conditionally skip for firefox due to missing console events * increase timeouts to give time for mutation * no need to close save banner * remove devtool setting * revert * update snapshots * disable video to save some resources * use one worker * more timeouts :) * Remove `browser.close()` and `page.close()` as it was breaking other tests * Remove unnecessary awaits and fix func call syntax * Fix image reset test * fix restrictedNotebook tests * revert playwright-ci.config settings * increase timeout for polling imagery test * remove unnecessary waits * disable notebook lock test for chrome-beta as its unreliable - remove some unnecessary 'wait for save banner' logic - remove unused await - mark imagery test as slow in chrome-beta * LINT!! *shakes fist* * don't run full e2e suite per commit * disable video in all configs * add flakey zoom comment * exclude webpack HMR in non-development modes Co-authored-by: Jesse Mazzella <jesse.d.mazzella@nasa.gov> Co-authored-by: Jesse Mazzella <ozyx@users.noreply.github.com> * lint fix Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Joshi <simplyrender@gmail.com> Co-authored-by: Jesse Mazzella <ozyx@users.noreply.github.com> Co-authored-by: Jamie V <jamie.j.vigliotta@nasa.gov> Co-authored-by: Andrew Henry <akhenry@gmail.com> Co-authored-by: Scott Bell <scott@traclabs.com> Co-authored-by: unlikelyzero <jchill2@gmail.com> Co-authored-by: Alize Nguyen <alizenguyen@gmail.com> Co-authored-by: Charles Hacskaylo <charlesh88@gmail.com> Co-authored-by: Khalid Adil <khalidadil29@gmail.com> Co-authored-by: rukmini-bose <48999852+rukmini-bose@users.noreply.github.com> Co-authored-by: Jesse Mazzella <jesse.d.mazzella@nasa.gov>
This commit is contained in:
@ -20,122 +20,18 @@
|
||||
* at runtime from the About dialog for additional information.
|
||||
*****************************************************************************/
|
||||
|
||||
const { TelemetryCollection } = require("./TelemetryCollection");
|
||||
import TelemetryCollection from './TelemetryCollection';
|
||||
import TelemetryRequestInterceptorRegistry from './TelemetryRequestInterceptor';
|
||||
import CustomStringFormatter from '../../plugins/displayLayout/CustomStringFormatter';
|
||||
import TelemetryMetadataManager from './TelemetryMetadataManager';
|
||||
import TelemetryValueFormatter from './TelemetryValueFormatter';
|
||||
import DefaultMetadataProvider from './DefaultMetadataProvider';
|
||||
import objectUtils from 'objectUtils';
|
||||
import _ from 'lodash';
|
||||
|
||||
define([
|
||||
'../../plugins/displayLayout/CustomStringFormatter',
|
||||
'./TelemetryMetadataManager',
|
||||
'./TelemetryValueFormatter',
|
||||
'./DefaultMetadataProvider',
|
||||
'objectUtils',
|
||||
'lodash'
|
||||
], function (
|
||||
CustomStringFormatter,
|
||||
TelemetryMetadataManager,
|
||||
TelemetryValueFormatter,
|
||||
DefaultMetadataProvider,
|
||||
objectUtils,
|
||||
_
|
||||
) {
|
||||
/**
|
||||
* A LimitEvaluator may be used to detect when telemetry values
|
||||
* have exceeded nominal conditions.
|
||||
*
|
||||
* @interface LimitEvaluator
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
*/
|
||||
export default class TelemetryAPI {
|
||||
|
||||
/**
|
||||
* Check for any limit violations associated with a telemetry datum.
|
||||
* @method evaluate
|
||||
* @param {*} datum the telemetry datum to evaluate
|
||||
* @param {TelemetryProperty} the property to check for limit violations
|
||||
* @memberof module:openmct.TelemetryAPI~LimitEvaluator
|
||||
* @returns {module:openmct.TelemetryAPI~LimitViolation} metadata about
|
||||
* the limit violation, or undefined if a value is within limits
|
||||
*/
|
||||
|
||||
/**
|
||||
* A violation of limits defined for a telemetry property.
|
||||
* @typedef LimitViolation
|
||||
* @memberof {module:openmct.TelemetryAPI~}
|
||||
* @property {string} cssClass the class (or space-separated classes) to
|
||||
* apply to display elements for values which violate this limit
|
||||
* @property {string} name the human-readable name for the limit violation
|
||||
*/
|
||||
|
||||
/**
|
||||
* A TelemetryFormatter converts telemetry values for purposes of
|
||||
* display as text.
|
||||
*
|
||||
* @interface TelemetryFormatter
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
*/
|
||||
|
||||
/**
|
||||
* Retrieve the 'key' from the datum and format it accordingly to
|
||||
* telemetry metadata in domain object.
|
||||
*
|
||||
* @method format
|
||||
* @memberof module:openmct.TelemetryAPI~TelemetryFormatter#
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes a property which would be found in a datum of telemetry
|
||||
* associated with a particular domain object.
|
||||
*
|
||||
* @typedef TelemetryProperty
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
* @property {string} key the name of the property in the datum which
|
||||
* contains this telemetry value
|
||||
* @property {string} name the human-readable name for this property
|
||||
* @property {string} [units] the units associated with this property
|
||||
* @property {boolean} [temporal] true if this property is a timestamp, or
|
||||
* may be otherwise used to order telemetry in a time-like
|
||||
* fashion; default is false
|
||||
* @property {boolean} [numeric] true if the values for this property
|
||||
* can be interpreted plainly as numbers; default is true
|
||||
* @property {boolean} [enumerated] true if this property may have only
|
||||
* certain specific values; default is false
|
||||
* @property {string} [values] for enumerated states, an ordered list
|
||||
* of possible values
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes and bounds requests for telemetry data.
|
||||
*
|
||||
* @typedef TelemetryRequest
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
* @property {string} sort the key of the property to sort by. This may
|
||||
* be prefixed with a "+" or a "-" sign to sort in ascending
|
||||
* or descending order respectively. If no prefix is present,
|
||||
* ascending order will be used.
|
||||
* @property {*} start the lower bound for values of the sorting property
|
||||
* @property {*} end the upper bound for values of the sorting property
|
||||
* @property {string[]} strategies symbolic identifiers for strategies
|
||||
* (such as `minmax`) which may be recognized by providers;
|
||||
* these will be tried in order until an appropriate provider
|
||||
* is found
|
||||
*/
|
||||
|
||||
/**
|
||||
* Provides telemetry data. To connect to new data sources, new
|
||||
* TelemetryProvider implementations should be
|
||||
* [registered]{@link module:openmct.TelemetryAPI#addProvider}.
|
||||
*
|
||||
* @interface TelemetryProvider
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
*/
|
||||
|
||||
/**
|
||||
* An interface for retrieving telemetry data associated with a domain
|
||||
* object.
|
||||
*
|
||||
* @interface TelemetryAPI
|
||||
* @augments module:openmct.TelemetryAPI~TelemetryProvider
|
||||
* @memberof module:openmct
|
||||
*/
|
||||
function TelemetryAPI(openmct) {
|
||||
constructor(openmct) {
|
||||
this.openmct = openmct;
|
||||
|
||||
this.formatMapCache = new WeakMap();
|
||||
@ -148,12 +44,14 @@ define([
|
||||
this.requestProviders = [];
|
||||
this.subscriptionProviders = [];
|
||||
this.valueFormatterCache = new WeakMap();
|
||||
|
||||
this.requestInterceptorRegistry = new TelemetryRequestInterceptorRegistry();
|
||||
}
|
||||
|
||||
TelemetryAPI.prototype.abortAllRequests = function () {
|
||||
abortAllRequests() {
|
||||
this.requestAbortControllers.forEach((controller) => controller.abort());
|
||||
this.requestAbortControllers.clear();
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Return Custom String Formatter
|
||||
@ -162,9 +60,9 @@ define([
|
||||
* @param {string} format custom formatter string (eg: %.4f, <s etc.)
|
||||
* @returns {CustomStringFormatter}
|
||||
*/
|
||||
TelemetryAPI.prototype.customStringFormatter = function (valueMetadata, format) {
|
||||
return new CustomStringFormatter.default(this.openmct, valueMetadata, format);
|
||||
};
|
||||
customStringFormatter(valueMetadata, format) {
|
||||
return new CustomStringFormatter(this.openmct, valueMetadata, format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the given domainObject is a telemetry object. A telemetry
|
||||
@ -174,9 +72,9 @@ define([
|
||||
* @param {module:openmct.DomainObject} domainObject
|
||||
* @returns {boolean} true if the object is a telemetry object.
|
||||
*/
|
||||
TelemetryAPI.prototype.isTelemetryObject = function (domainObject) {
|
||||
isTelemetryObject(domainObject) {
|
||||
return Boolean(this.findMetadataProvider(domainObject));
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this provider can supply telemetry data associated with
|
||||
@ -188,10 +86,10 @@ define([
|
||||
* @returns {boolean} true if telemetry can be provided
|
||||
* @memberof module:openmct.TelemetryAPI~TelemetryProvider#
|
||||
*/
|
||||
TelemetryAPI.prototype.canProvideTelemetry = function (domainObject) {
|
||||
canProvideTelemetry(domainObject) {
|
||||
return Boolean(this.findSubscriptionProvider(domainObject))
|
||||
|| Boolean(this.findRequestProvider(domainObject));
|
||||
};
|
||||
|| Boolean(this.findRequestProvider(domainObject));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a telemetry provider with the telemetry service. This
|
||||
@ -201,7 +99,7 @@ define([
|
||||
* @param {module:openmct.TelemetryAPI~TelemetryProvider} provider the new
|
||||
* telemetry provider
|
||||
*/
|
||||
TelemetryAPI.prototype.addProvider = function (provider) {
|
||||
addProvider(provider) {
|
||||
if (provider.supportsRequest) {
|
||||
this.requestProviders.unshift(provider);
|
||||
}
|
||||
@ -217,54 +115,54 @@ define([
|
||||
if (provider.supportsLimits) {
|
||||
this.limitProviders.unshift(provider);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
TelemetryAPI.prototype.findSubscriptionProvider = function () {
|
||||
findSubscriptionProvider() {
|
||||
const args = Array.prototype.slice.apply(arguments);
|
||||
function supportsDomainObject(provider) {
|
||||
return provider.supportsSubscribe.apply(provider, args);
|
||||
}
|
||||
|
||||
return this.subscriptionProviders.filter(supportsDomainObject)[0];
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
TelemetryAPI.prototype.findRequestProvider = function (domainObject) {
|
||||
findRequestProvider(domainObject) {
|
||||
const args = Array.prototype.slice.apply(arguments);
|
||||
function supportsDomainObject(provider) {
|
||||
return provider.supportsRequest.apply(provider, args);
|
||||
}
|
||||
|
||||
return this.requestProviders.filter(supportsDomainObject)[0];
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
TelemetryAPI.prototype.findMetadataProvider = function (domainObject) {
|
||||
findMetadataProvider(domainObject) {
|
||||
return this.metadataProviders.filter(function (p) {
|
||||
return p.supportsMetadata(domainObject);
|
||||
})[0];
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
TelemetryAPI.prototype.findLimitEvaluator = function (domainObject) {
|
||||
findLimitEvaluator(domainObject) {
|
||||
return this.limitProviders.filter(function (p) {
|
||||
return p.supportsLimits(domainObject);
|
||||
})[0];
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
TelemetryAPI.prototype.standardizeRequestOptions = function (options) {
|
||||
standardizeRequestOptions(options) {
|
||||
if (!Object.prototype.hasOwnProperty.call(options, 'start')) {
|
||||
options.start = this.openmct.time.bounds().start;
|
||||
}
|
||||
@ -276,7 +174,47 @@ define([
|
||||
if (!Object.prototype.hasOwnProperty.call(options, 'domain')) {
|
||||
options.domain = this.openmct.time.timeSystem().key;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a request interceptor that transforms a request via module:openmct.TelemetryAPI.request
|
||||
* The request will be modifyed when it is received and will be returned in it's modified state
|
||||
* The request will be transformed only if the interceptor is applicable to that domain object as defined by the RequestInterceptorDef
|
||||
*
|
||||
* @param {module:openmct.RequestInterceptorDef} requestInterceptorDef the request interceptor definition to add
|
||||
* @method addRequestInterceptor
|
||||
* @memberof module:openmct.TelemetryRequestInterceptorRegistry#
|
||||
*/
|
||||
addRequestInterceptor(requestInterceptorDef) {
|
||||
this.requestInterceptorRegistry.addInterceptor(requestInterceptorDef);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the request interceptors for a given domain object.
|
||||
* @private
|
||||
*/
|
||||
#getInterceptorsForRequest(identifier, request) {
|
||||
return this.requestInterceptorRegistry.getInterceptors(identifier, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke interceptors if applicable for a given domain object.
|
||||
*/
|
||||
async applyRequestInterceptors(domainObject, request) {
|
||||
const interceptors = this.#getInterceptorsForRequest(domainObject.identifier, request);
|
||||
|
||||
if (interceptors.length === 0) {
|
||||
return request;
|
||||
}
|
||||
|
||||
let modifiedRequest = { ...request };
|
||||
|
||||
for (let interceptor of interceptors) {
|
||||
modifiedRequest = await interceptor.invoke(modifiedRequest);
|
||||
}
|
||||
|
||||
return modifiedRequest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Request telemetry collection for a domain object.
|
||||
@ -292,13 +230,13 @@ define([
|
||||
* options for this telemetry collection request
|
||||
* @returns {TelemetryCollection} a TelemetryCollection instance
|
||||
*/
|
||||
TelemetryAPI.prototype.requestCollection = function (domainObject, options = {}) {
|
||||
requestCollection(domainObject, options = {}) {
|
||||
return new TelemetryCollection(
|
||||
this.openmct,
|
||||
domainObject,
|
||||
options
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Request historical telemetry for a domain object.
|
||||
@ -315,7 +253,7 @@ define([
|
||||
* @returns {Promise.<object[]>} a promise for an array of
|
||||
* telemetry data
|
||||
*/
|
||||
TelemetryAPI.prototype.request = function (domainObject) {
|
||||
async request(domainObject) {
|
||||
if (this.noRequestProviderForAllObjects) {
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
@ -330,6 +268,7 @@ define([
|
||||
this.requestAbortControllers.add(abortController);
|
||||
|
||||
this.standardizeRequestOptions(arguments[1]);
|
||||
|
||||
const provider = this.findRequestProvider.apply(this, arguments);
|
||||
if (!provider) {
|
||||
this.requestAbortControllers.delete(abortController);
|
||||
@ -337,6 +276,8 @@ define([
|
||||
return this.handleMissingRequestProvider(domainObject);
|
||||
}
|
||||
|
||||
arguments[1] = await this.applyRequestInterceptors(domainObject, arguments[1]);
|
||||
|
||||
return provider.request.apply(provider, arguments)
|
||||
.catch((rejected) => {
|
||||
if (rejected.name !== 'AbortError') {
|
||||
@ -348,7 +289,7 @@ define([
|
||||
}).finally(() => {
|
||||
this.requestAbortControllers.delete(abortController);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribe to realtime telemetry for a specific domain object.
|
||||
@ -364,7 +305,7 @@ define([
|
||||
* @returns {Function} a function which may be called to terminate
|
||||
* the subscription
|
||||
*/
|
||||
TelemetryAPI.prototype.subscribe = function (domainObject, callback, options) {
|
||||
subscribe(domainObject, callback, options) {
|
||||
const provider = this.findSubscriptionProvider(domainObject);
|
||||
|
||||
if (!this.subscribeCache) {
|
||||
@ -401,7 +342,7 @@ define([
|
||||
delete this.subscribeCache[keyString];
|
||||
}
|
||||
}.bind(this);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get telemetry metadata for a given domain object. Returns a telemetry
|
||||
@ -410,7 +351,7 @@ define([
|
||||
*
|
||||
* @returns {TelemetryMetadataManager}
|
||||
*/
|
||||
TelemetryAPI.prototype.getMetadata = function (domainObject) {
|
||||
getMetadata(domainObject) {
|
||||
if (!this.metadataCache.has(domainObject)) {
|
||||
const metadataProvider = this.findMetadataProvider(domainObject);
|
||||
if (!metadataProvider) {
|
||||
@ -426,14 +367,14 @@ define([
|
||||
}
|
||||
|
||||
return this.metadataCache.get(domainObject);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of valueMetadatas that are common to all supplied
|
||||
* telemetry objects and match the requested hints.
|
||||
*
|
||||
*/
|
||||
TelemetryAPI.prototype.commonValuesForHints = function (metadatas, hints) {
|
||||
commonValuesForHints(metadatas, hints) {
|
||||
const options = metadatas.map(function (metadata) {
|
||||
const values = metadata.valuesForHints(hints);
|
||||
|
||||
@ -453,14 +394,14 @@ define([
|
||||
});
|
||||
|
||||
return _.sortBy(options, sortKeys);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a value formatter for a given valueMetadata.
|
||||
*
|
||||
* @returns {TelemetryValueFormatter}
|
||||
*/
|
||||
TelemetryAPI.prototype.getValueFormatter = function (valueMetadata) {
|
||||
getValueFormatter(valueMetadata) {
|
||||
if (!this.valueFormatterCache.has(valueMetadata)) {
|
||||
this.valueFormatterCache.set(
|
||||
valueMetadata,
|
||||
@ -469,7 +410,7 @@ define([
|
||||
}
|
||||
|
||||
return this.valueFormatterCache.get(valueMetadata);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a value formatter for a given key.
|
||||
@ -477,9 +418,9 @@ define([
|
||||
*
|
||||
* @returns {Format}
|
||||
*/
|
||||
TelemetryAPI.prototype.getFormatter = function (key) {
|
||||
getFormatter(key) {
|
||||
return this.formatters.get(key);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a format map of all value formatters for a given piece of telemetry
|
||||
@ -487,7 +428,7 @@ define([
|
||||
*
|
||||
* @returns {Object<String, {TelemetryValueFormatter}>}
|
||||
*/
|
||||
TelemetryAPI.prototype.getFormatMap = function (metadata) {
|
||||
getFormatMap(metadata) {
|
||||
if (!metadata) {
|
||||
return {};
|
||||
}
|
||||
@ -502,14 +443,14 @@ define([
|
||||
}
|
||||
|
||||
return this.formatMapCache.get(metadata);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Error Handling: Missing Request provider
|
||||
*
|
||||
* @returns Promise
|
||||
*/
|
||||
TelemetryAPI.prototype.handleMissingRequestProvider = function (domainObject) {
|
||||
handleMissingRequestProvider(domainObject) {
|
||||
this.noRequestProviderForAllObjects = this.requestProviders.every(requestProvider => {
|
||||
const supportsRequest = requestProvider.supportsRequest.apply(requestProvider, arguments);
|
||||
const hasRequestProvider = Object.prototype.hasOwnProperty.call(requestProvider, 'request') && typeof requestProvider.request === 'function';
|
||||
@ -529,18 +470,18 @@ define([
|
||||
}
|
||||
|
||||
this.openmct.notifications.error(message);
|
||||
console.error(detailMessage);
|
||||
console.warn(detailMessage);
|
||||
|
||||
return Promise.resolve([]);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new telemetry data formatter.
|
||||
* @param {Format} format the
|
||||
*/
|
||||
TelemetryAPI.prototype.addFormat = function (format) {
|
||||
addFormat(format) {
|
||||
this.formatters.set(format.key, format);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a limit evaluator for this domain object.
|
||||
@ -558,9 +499,9 @@ define([
|
||||
* @method limitEvaluator
|
||||
* @memberof module:openmct.TelemetryAPI~TelemetryProvider#
|
||||
*/
|
||||
TelemetryAPI.prototype.limitEvaluator = function (domainObject) {
|
||||
limitEvaluator(domainObject) {
|
||||
return this.getLimitEvaluator(domainObject);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a limits for this domain object.
|
||||
@ -578,9 +519,9 @@ define([
|
||||
* @method limits
|
||||
* @memberof module:openmct.TelemetryAPI~TelemetryProvider#
|
||||
*/
|
||||
TelemetryAPI.prototype.limitDefinition = function (domainObject) {
|
||||
limitDefinition(domainObject) {
|
||||
return this.getLimits(domainObject);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a limit evaluator for this domain object.
|
||||
@ -598,7 +539,7 @@ define([
|
||||
* @method limitEvaluator
|
||||
* @memberof module:openmct.TelemetryAPI~TelemetryProvider#
|
||||
*/
|
||||
TelemetryAPI.prototype.getLimitEvaluator = function (domainObject) {
|
||||
getLimitEvaluator(domainObject) {
|
||||
const provider = this.findLimitEvaluator(domainObject);
|
||||
if (!provider) {
|
||||
return {
|
||||
@ -607,7 +548,7 @@ define([
|
||||
}
|
||||
|
||||
return provider.getLimitEvaluator(domainObject);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a limit definitions for this domain object.
|
||||
@ -636,7 +577,7 @@ define([
|
||||
* supported colors are purple, red, orange, yellow and cyan
|
||||
* @memberof module:openmct.TelemetryAPI~TelemetryProvider#
|
||||
*/
|
||||
TelemetryAPI.prototype.getLimits = function (domainObject) {
|
||||
getLimits(domainObject) {
|
||||
const provider = this.findLimitEvaluator(domainObject);
|
||||
if (!provider || !provider.getLimits) {
|
||||
return {
|
||||
@ -647,7 +588,104 @@ define([
|
||||
}
|
||||
|
||||
return provider.getLimits(domainObject);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return TelemetryAPI;
|
||||
});
|
||||
/**
|
||||
* A LimitEvaluator may be used to detect when telemetry values
|
||||
* have exceeded nominal conditions.
|
||||
*
|
||||
* @interface LimitEvaluator
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
*/
|
||||
|
||||
/**
|
||||
* Check for any limit violations associated with a telemetry datum.
|
||||
* @method evaluate
|
||||
* @param {*} datum the telemetry datum to evaluate
|
||||
* @param {TelemetryProperty} the property to check for limit violations
|
||||
* @memberof module:openmct.TelemetryAPI~LimitEvaluator
|
||||
* @returns {module:openmct.TelemetryAPI~LimitViolation} metadata about
|
||||
* the limit violation, or undefined if a value is within limits
|
||||
*/
|
||||
|
||||
/**
|
||||
* A violation of limits defined for a telemetry property.
|
||||
* @typedef LimitViolation
|
||||
* @memberof {module:openmct.TelemetryAPI~}
|
||||
* @property {string} cssClass the class (or space-separated classes) to
|
||||
* apply to display elements for values which violate this limit
|
||||
* @property {string} name the human-readable name for the limit violation
|
||||
*/
|
||||
|
||||
/**
|
||||
* A TelemetryFormatter converts telemetry values for purposes of
|
||||
* display as text.
|
||||
*
|
||||
* @interface TelemetryFormatter
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
*/
|
||||
|
||||
/**
|
||||
* Retrieve the 'key' from the datum and format it accordingly to
|
||||
* telemetry metadata in domain object.
|
||||
*
|
||||
* @method format
|
||||
* @memberof module:openmct.TelemetryAPI~TelemetryFormatter#
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes a property which would be found in a datum of telemetry
|
||||
* associated with a particular domain object.
|
||||
*
|
||||
* @typedef TelemetryProperty
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
* @property {string} key the name of the property in the datum which
|
||||
* contains this telemetry value
|
||||
* @property {string} name the human-readable name for this property
|
||||
* @property {string} [units] the units associated with this property
|
||||
* @property {boolean} [temporal] true if this property is a timestamp, or
|
||||
* may be otherwise used to order telemetry in a time-like
|
||||
* fashion; default is false
|
||||
* @property {boolean} [numeric] true if the values for this property
|
||||
* can be interpreted plainly as numbers; default is true
|
||||
* @property {boolean} [enumerated] true if this property may have only
|
||||
* certain specific values; default is false
|
||||
* @property {string} [values] for enumerated states, an ordered list
|
||||
* of possible values
|
||||
*/
|
||||
|
||||
/**
|
||||
* Describes and bounds requests for telemetry data.
|
||||
*
|
||||
* @typedef TelemetryRequest
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
* @property {string} sort the key of the property to sort by. This may
|
||||
* be prefixed with a "+" or a "-" sign to sort in ascending
|
||||
* or descending order respectively. If no prefix is present,
|
||||
* ascending order will be used.
|
||||
* @property {*} start the lower bound for values of the sorting property
|
||||
* @property {*} end the upper bound for values of the sorting property
|
||||
* @property {string[]} strategies symbolic identifiers for strategies
|
||||
* (such as `minmax`) which may be recognized by providers;
|
||||
* these will be tried in order until an appropriate provider
|
||||
* is found
|
||||
*/
|
||||
|
||||
/**
|
||||
* Provides telemetry data. To connect to new data sources, new
|
||||
* TelemetryProvider implementations should be
|
||||
* [registered]{@link module:openmct.TelemetryAPI#addProvider}.
|
||||
*
|
||||
* @interface TelemetryProvider
|
||||
* @memberof module:openmct.TelemetryAPI~
|
||||
*/
|
||||
|
||||
/**
|
||||
* An interface for retrieving telemetry data associated with a domain
|
||||
* object.
|
||||
*
|
||||
* @interface TelemetryAPI
|
||||
* @augments module:openmct.TelemetryAPI~TelemetryProvider
|
||||
* @memberof module:openmct
|
||||
*/
|
||||
|
Reference in New Issue
Block a user