From aa8750eb97012fe188373b7623f63b99aee2adbc Mon Sep 17 00:00:00 2001 From: Scott Bell Date: Thu, 15 Aug 2024 16:39:29 -0500 Subject: [PATCH] memory conserved --- src/api/telemetry/TelemetryCollection.js | 8 +++-- src/plugins/comps/CompsManager.js | 37 ++++++++++++++++++---- src/plugins/comps/CompsMetadataProvider.js | 1 - src/plugins/comps/components/CompsView.vue | 14 ++++---- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/api/telemetry/TelemetryCollection.js b/src/api/telemetry/TelemetryCollection.js index 87d70a7920..0b1887f3cc 100644 --- a/src/api/telemetry/TelemetryCollection.js +++ b/src/api/telemetry/TelemetryCollection.js @@ -115,6 +115,8 @@ export default class TelemetryCollection extends EventEmitter { } this.removeAllListeners(); + console.debug('🔥 Telemetry Collection destroyed', this.domainObject?.identifier?.key); + this.loaded = false; } /** @@ -157,7 +159,6 @@ export default class TelemetryCollection extends EventEmitter { options ); historicalData = await historicalProvider.request(this.domainObject, modifiedOptions); - console.debug('👴 Requesting historical telemetry data...', historicalData); } catch (error) { if (error.name !== 'AbortError') { console.error('Error requesting telemetry data...'); @@ -186,7 +187,10 @@ export default class TelemetryCollection extends EventEmitter { const options = { ...this.options }; //We always want to receive all available values in telemetry tables. options.strategy = this.openmct.telemetry.SUBSCRIBE_STRATEGY.BATCH; - + console.debug( + '🔊 Telemetry Collection Subscribing to telemetry data...', + this.domainObject?.identifier?.key + ); this.unsubscribe = this.openmct.telemetry.subscribe( this.domainObject, (datum) => this._processNewTelemetry(datum), diff --git a/src/plugins/comps/CompsManager.js b/src/plugins/comps/CompsManager.js index 16e5ad216d..8239aea345 100644 --- a/src/plugins/comps/CompsManager.js +++ b/src/plugins/comps/CompsManager.js @@ -8,6 +8,8 @@ export default class CompsManager extends EventEmitter { #telemetryCollections = {}; #dataFrame = {}; #telemetryLoadedPromises = []; + #loaded = false; + #telemetryProcessors = {}; constructor(openmct, domainObject) { super(); @@ -83,21 +85,33 @@ export default class CompsManager extends EventEmitter { } async load() { - await this.#loadComposition(); - await Promise.all(this.#telemetryLoadedPromises); - this.#telemetryLoadedPromises = []; + if (!this.#loaded) { + await this.#loadComposition(); + await Promise.all(this.#telemetryLoadedPromises); + this.#telemetryLoadedPromises = []; + this.#loaded = true; + } } startListeningToUnderlyingTelemetry() { + console.debug('🎉 CompsManager: startListeningToUnderlyingTelemetry'); Object.keys(this.#telemetryCollections).forEach((keyString) => { if (!this.#telemetryCollections[keyString].loaded) { + const specificTelemetryProcessor = this.#getTelemetryProcessor(keyString); + this.#telemetryCollections[keyString].on('add', specificTelemetryProcessor); + this.#telemetryCollections[keyString].on('clear', this.#clearData); this.#telemetryCollections[keyString].load(); } }); } stopListeningToUnderlyingTelemetry() { + console.debug('🔇 CompsManager: stopListeningToUnderlyingTelemetry'); Object.keys(this.#telemetryCollections).forEach((keyString) => { + const specificTelemetryProcessor = this.#telemetryProcessors[keyString]; + delete this.#telemetryProcessors[keyString]; + this.#telemetryCollections[keyString].off('add', specificTelemetryProcessor); + this.#telemetryCollections[keyString].off('clear', this.#clearData); this.#telemetryCollections[keyString].destroy(); }); } @@ -112,7 +126,6 @@ export default class CompsManager extends EventEmitter { this.#composition.on('add', this.#addTelemetryObject); this.#composition.on('remove', this.#removeTelemetryObject); await this.#composition.load(); - console.debug('📚 Composition loaded'); } } @@ -169,6 +182,18 @@ export default class CompsManager extends EventEmitter { return underlyingTelemetry; } + #getTelemetryProcessor(keyString) { + if (this.#telemetryProcessors[keyString]) { + return this.#telemetryProcessors[keyString]; + } + + const telemetryProcessor = (newTelemetry) => { + this.emit('underlyingTelemetryUpdated', { [keyString]: newTelemetry }); + }; + this.#telemetryProcessors[keyString] = telemetryProcessor; + return telemetryProcessor; + } + #telemetryProcessor = (newTelemetry, keyString) => { this.emit('underlyingTelemetryUpdated', { [keyString]: newTelemetry }); }; @@ -187,9 +212,7 @@ export default class CompsManager extends EventEmitter { this.#telemetryCollections[keyString] = this.#openmct.telemetry.requestCollection(telemetryObject); - this.#telemetryCollections[keyString].on('add', (data) => { - this.#telemetryProcessor(data, keyString); - }); + this.#telemetryCollections[keyString].on('add', this.#getTelemetryProcessor(keyString)); this.#telemetryCollections[keyString].on('clear', this.#clearData); const telemetryLoadedPromise = this.#telemetryCollections[keyString].load(); this.#telemetryLoadedPromises.push(telemetryLoadedPromise); diff --git a/src/plugins/comps/CompsMetadataProvider.js b/src/plugins/comps/CompsMetadataProvider.js index acb7f3e079..0b68511c15 100644 --- a/src/plugins/comps/CompsMetadataProvider.js +++ b/src/plugins/comps/CompsMetadataProvider.js @@ -53,7 +53,6 @@ export default class CompsMetadataProvider { this.#openmct, this.#compsManagerPool ); - console.debug('📦 CompsMetadataProvider: getMetadata', specificCompsManager); // if there are any parameters, grab the first one's timeMetaData const timeMetaData = specificCompsManager?.getParameters()[0]?.timeMetaData; const metaDataToReturn = { diff --git a/src/plugins/comps/components/CompsView.vue b/src/plugins/comps/components/CompsView.vue index 8d03860b5c..5c9a55e183 100644 --- a/src/plugins/comps/components/CompsView.vue +++ b/src/plugins/comps/components/CompsView.vue @@ -123,9 +123,7 @@ defineProps({ onBeforeMount(async () => { console.debug('🚀 CompsView: onMounted with compsManager', compsManager); outputTelemetryCollection = openmct.telemetry.requestCollection(domainObject); - outputTelemetryCollection.on('add', (data) => { - telemetryProcessor(data); - }); + outputTelemetryCollection.on('add', telemetryProcessor); outputTelemetryCollection.on('clear', clearData); await compsManager.load(); parameters.value = compsManager.getParameters(); @@ -133,6 +131,12 @@ onBeforeMount(async () => { outputTelemetryCollection.load(); }); +onBeforeUnmount(() => { + outputTelemetryCollection.off('add', telemetryProcessor); + outputTelemetryCollection.off('clear', clearData); + outputTelemetryCollection.destroy(); +}); + function persistParameters() { domainObject.configuration.comps.parameters = parameters.value; compsManager.persist(domainObject); @@ -153,8 +157,4 @@ function telemetryProcessor(data) { function clearData() { currentCompOutput.value = null; } - -onBeforeUnmount(() => { - outputTelemetryCollection.destroy(); -});