mirror of
https://github.com/nasa/openmct.git
synced 2025-06-22 17:08:57 +00:00
[Telemetry] Implement Abort Request (#4504)
* Add a requestAbortController for the telemetryAPI and trigger an abort of all requests on navigation via the router. * Check for the rejection and make sure it's not an abort error to show the error
This commit is contained in:
@ -144,8 +144,14 @@ define([
|
||||
this.metadataCache = new WeakMap();
|
||||
this.formatMapCache = new WeakMap();
|
||||
this.valueFormatterCache = new WeakMap();
|
||||
this.requestAbortControllers = new Set();
|
||||
}
|
||||
|
||||
TelemetryAPI.prototype.abortAllRequests = function () {
|
||||
this.requestAbortControllers.forEach((controller) => controller.abort());
|
||||
this.requestAbortControllers.clear();
|
||||
};
|
||||
|
||||
/**
|
||||
* Return Custom String Formatter
|
||||
*
|
||||
@ -312,6 +318,10 @@ define([
|
||||
arguments[1] = {};
|
||||
}
|
||||
|
||||
const abortController = new AbortController();
|
||||
arguments[1].signal = abortController.signal;
|
||||
this.requestAbortControllers.add(abortController);
|
||||
|
||||
this.standardizeRequestOptions(arguments[1]);
|
||||
const provider = this.findRequestProvider.apply(this, arguments);
|
||||
if (!provider) {
|
||||
@ -319,10 +329,14 @@ define([
|
||||
}
|
||||
|
||||
return provider.request.apply(provider, arguments).catch((rejected) => {
|
||||
this.openmct.notifications.error('Error requesting telemetry data, see console for details');
|
||||
console.error(rejected);
|
||||
if (rejected.name !== 'AbortError') {
|
||||
this.openmct.notifications.error('Error requesting telemetry data, see console for details');
|
||||
console.error(rejected);
|
||||
}
|
||||
|
||||
return Promise.reject(rejected);
|
||||
}).finally(() => {
|
||||
this.requestAbortControllers.delete(abortController);
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
* this source code distribution or the Licensing information page available
|
||||
* at runtime from the About dialog for additional information.
|
||||
*****************************************************************************/
|
||||
import { createOpenMct, resetApplicationState } from 'utils/testing';
|
||||
import TelemetryAPI from './TelemetryAPI';
|
||||
const { TelemetryCollection } = require("./TelemetryCollection");
|
||||
|
||||
@ -268,9 +269,11 @@ describe('Telemetry API', function () {
|
||||
telemetryAPI.addProvider(telemetryProvider);
|
||||
|
||||
telemetryAPI.request(domainObject).then(() => {
|
||||
const { signal } = new AbortController();
|
||||
expect(telemetryProvider.supportsRequest).toHaveBeenCalledWith(
|
||||
jasmine.any(Object),
|
||||
{
|
||||
signal,
|
||||
start: 0,
|
||||
end: 1,
|
||||
domain: 'system'
|
||||
@ -280,6 +283,7 @@ describe('Telemetry API', function () {
|
||||
expect(telemetryProvider.request).toHaveBeenCalledWith(
|
||||
jasmine.any(Object),
|
||||
{
|
||||
signal,
|
||||
start: 0,
|
||||
end: 1,
|
||||
domain: 'system'
|
||||
@ -293,6 +297,7 @@ describe('Telemetry API', function () {
|
||||
expect(telemetryProvider.supportsRequest).toHaveBeenCalledWith(
|
||||
jasmine.any(Object),
|
||||
{
|
||||
signal,
|
||||
start: 0,
|
||||
end: 1,
|
||||
domain: 'system'
|
||||
@ -302,6 +307,7 @@ describe('Telemetry API', function () {
|
||||
expect(telemetryProvider.request).toHaveBeenCalledWith(
|
||||
jasmine.any(Object),
|
||||
{
|
||||
signal,
|
||||
start: 0,
|
||||
end: 1,
|
||||
domain: 'system'
|
||||
@ -322,12 +328,14 @@ describe('Telemetry API', function () {
|
||||
end: 30,
|
||||
domain: 'someDomain'
|
||||
}).then(() => {
|
||||
const { signal } = new AbortController();
|
||||
expect(telemetryProvider.supportsRequest).toHaveBeenCalledWith(
|
||||
jasmine.any(Object),
|
||||
{
|
||||
start: 20,
|
||||
end: 30,
|
||||
domain: 'someDomain'
|
||||
domain: 'someDomain',
|
||||
signal
|
||||
}
|
||||
);
|
||||
|
||||
@ -336,7 +344,8 @@ describe('Telemetry API', function () {
|
||||
{
|
||||
start: 20,
|
||||
end: 30,
|
||||
domain: 'someDomain'
|
||||
domain: 'someDomain',
|
||||
signal
|
||||
}
|
||||
);
|
||||
|
||||
@ -611,3 +620,48 @@ describe('Telemetry API', function () {
|
||||
});
|
||||
});
|
||||
|
||||
describe('Telemetery', () => {
|
||||
let openmct;
|
||||
let telemetryProvider;
|
||||
let telemetryAPI;
|
||||
let watchedSignal;
|
||||
|
||||
beforeEach(() => {
|
||||
openmct = createOpenMct();
|
||||
openmct.install(openmct.plugins.MyItems());
|
||||
|
||||
telemetryAPI = openmct.telemetry;
|
||||
|
||||
telemetryProvider = {
|
||||
request: (obj, options) => {
|
||||
watchedSignal = options.signal;
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
};
|
||||
spyOn(telemetryAPI, 'findRequestProvider').and.returnValue(telemetryProvider);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
return resetApplicationState(openmct);
|
||||
});
|
||||
|
||||
it('should not abort request without navigation', function (done) {
|
||||
telemetryAPI.addProvider(telemetryProvider);
|
||||
|
||||
telemetryAPI.request({}).finally(() => {
|
||||
expect(watchedSignal.aborted).toBe(false);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should abort request on navigation', function (done) {
|
||||
telemetryAPI.addProvider(telemetryProvider);
|
||||
|
||||
telemetryAPI.request({}).finally(() => {
|
||||
expect(watchedSignal.aborted).toBe(true);
|
||||
done();
|
||||
});
|
||||
openmct.router.doPathChange('newPath', 'oldPath');
|
||||
});
|
||||
});
|
||||
|
Reference in New Issue
Block a user