From 690a711c7e48a98800a252b5ea395466c4704f94 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Wed, 28 May 2025 16:01:57 -0700 Subject: [PATCH 01/25] throw error for network errors that arent 404s --- src/persistence/BaseMCWSPersistenceProvider.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index 017661a..2aec0c5 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -202,6 +202,8 @@ export default class BaseMCWSPersistenceProvider { return; } + } else { + throw readError; } } From 9c1366641e0578994119ceababcd73fbff9d1391 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Wed, 28 May 2025 16:04:18 -0700 Subject: [PATCH 02/25] debug --- .webpack/webpack.prod.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.webpack/webpack.prod.js b/.webpack/webpack.prod.js index 9a2e87f..0f416d3 100644 --- a/.webpack/webpack.prod.js +++ b/.webpack/webpack.prod.js @@ -8,5 +8,6 @@ const common = require('./webpack.common'); /** @type {import('webpack').Configuration} */ module.exports = merge(common, { - mode: 'production' + mode: 'production', + devtool: 'source-map' }); From 3a0b7b0ac689cc991fb462356b621f91afad55e1 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 29 May 2025 14:20:38 -0700 Subject: [PATCH 03/25] throw error when non 404, return something so legacy persistence interceptor isnt triggered --- src/persistence/BaseMCWSPersistenceProvider.js | 14 ++++++++++---- src/persistence/MCWSPersistenceProvider.js | 8 +++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index 2aec0c5..3b369a5 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -177,6 +177,7 @@ export default class BaseMCWSPersistenceProvider { */ async createIfMissing(namespaceDefinition, userId) { const namespace = mcws.namespace(namespaceDefinition.url); + let non404Error; try { await namespace.read(); @@ -198,15 +199,20 @@ export default class BaseMCWSPersistenceProvider { return namespaceDefinition; } catch (e) { - console.error('Error creating namespace:', e); - - return; + non404Error = e; } } else { - throw readError; + non404Error = readError; } } + if (non404Error) { + console.error('Error creating namespace:', non404Error); + this.openmct.notify.error( + `Error creating namespace: ${non404Error.message ?? 'Unknown error'}. Check network connection and try again.` + ); + } + return; } diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index d43d7ff..772e300 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -27,9 +27,15 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider return result; } catch (error) { + // we handle 404 errors and they don't propagate up to the user + // anything else we want to warn the user about and not return undefined + // so the old persistence interceptor isn't triggered erasing the object console.warn('MCWSPersistenceProvider:get', error); - return; + return { + identifier, + name: 'Error Reading Object' + }; } } From 13b10ffb8ec300fe07abf9828bb62f0a7fd2a3e8 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 29 May 2025 14:34:09 -0700 Subject: [PATCH 04/25] return empty object to not trigger interceptor --- src/persistence/MCWSPersistenceProvider.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 772e300..89c92bf 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -32,10 +32,7 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider // so the old persistence interceptor isn't triggered erasing the object console.warn('MCWSPersistenceProvider:get', error); - return { - identifier, - name: 'Error Reading Object' - }; + return {}; } } From 559b2e53ea2ccf3c60cc34ae8489ceba9391e0e8 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 29 May 2025 14:43:49 -0700 Subject: [PATCH 05/25] mimic missiong object return --- src/persistence/MCWSPersistenceProvider.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 89c92bf..0e26695 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -32,7 +32,11 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider // so the old persistence interceptor isn't triggered erasing the object console.warn('MCWSPersistenceProvider:get', error); - return {}; + return { + identifier, + type: 'unknown', + name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) + }; } } From ba43a8ef4d565d3a6d894f420aef17ac9eff805a Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 29 May 2025 15:20:00 -0700 Subject: [PATCH 06/25] revert base persistence provider changes as they are not necessary --- src/persistence/BaseMCWSPersistenceProvider.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index 3b369a5..017661a 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -177,7 +177,6 @@ export default class BaseMCWSPersistenceProvider { */ async createIfMissing(namespaceDefinition, userId) { const namespace = mcws.namespace(namespaceDefinition.url); - let non404Error; try { await namespace.read(); @@ -199,20 +198,13 @@ export default class BaseMCWSPersistenceProvider { return namespaceDefinition; } catch (e) { - non404Error = e; + console.error('Error creating namespace:', e); + + return; } - } else { - non404Error = readError; } } - if (non404Error) { - console.error('Error creating namespace:', non404Error); - this.openmct.notify.error( - `Error creating namespace: ${non404Error.message ?? 'Unknown error'}. Check network connection and try again.` - ); - } - return; } From e1ea5c2e88b8fd859f9d8c4f769d9f40edc05539 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 29 May 2025 15:37:17 -0700 Subject: [PATCH 07/25] changes in base are actually need when creating missing --- src/persistence/BaseMCWSPersistenceProvider.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index 017661a..3b369a5 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -177,6 +177,7 @@ export default class BaseMCWSPersistenceProvider { */ async createIfMissing(namespaceDefinition, userId) { const namespace = mcws.namespace(namespaceDefinition.url); + let non404Error; try { await namespace.read(); @@ -198,13 +199,20 @@ export default class BaseMCWSPersistenceProvider { return namespaceDefinition; } catch (e) { - console.error('Error creating namespace:', e); - - return; + non404Error = e; } + } else { + non404Error = readError; } } + if (non404Error) { + console.error('Error creating namespace:', non404Error); + this.openmct.notify.error( + `Error creating namespace: ${non404Error.message ?? 'Unknown error'}. Check network connection and try again.` + ); + } + return; } From 89ac1c6ff08b9de8221ba4455422e397dd53bf4b Mon Sep 17 00:00:00 2001 From: Jamie V Date: Tue, 3 Jun 2025 13:39:32 -0700 Subject: [PATCH 08/25] revert to see if there is a more logical way to do this --- src/persistence/BaseMCWSPersistenceProvider.js | 14 +++----------- src/persistence/MCWSPersistenceProvider.js | 9 +-------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index 3b369a5..017661a 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -177,7 +177,6 @@ export default class BaseMCWSPersistenceProvider { */ async createIfMissing(namespaceDefinition, userId) { const namespace = mcws.namespace(namespaceDefinition.url); - let non404Error; try { await namespace.read(); @@ -199,20 +198,13 @@ export default class BaseMCWSPersistenceProvider { return namespaceDefinition; } catch (e) { - non404Error = e; + console.error('Error creating namespace:', e); + + return; } - } else { - non404Error = readError; } } - if (non404Error) { - console.error('Error creating namespace:', non404Error); - this.openmct.notify.error( - `Error creating namespace: ${non404Error.message ?? 'Unknown error'}. Check network connection and try again.` - ); - } - return; } diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 0e26695..d43d7ff 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -27,16 +27,9 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider return result; } catch (error) { - // we handle 404 errors and they don't propagate up to the user - // anything else we want to warn the user about and not return undefined - // so the old persistence interceptor isn't triggered erasing the object console.warn('MCWSPersistenceProvider:get', error); - return { - identifier, - type: 'unknown', - name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) - }; + return; } } From 0c16c55402593a4ab7d84241d9901327e89c80a4 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Tue, 3 Jun 2025 15:33:42 -0700 Subject: [PATCH 09/25] debug --- src/persistence/BaseMCWSPersistenceProvider.js | 3 +++ src/persistence/oldPersistenceFolderInterceptor.js | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index 017661a..e546dfd 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -176,6 +176,7 @@ export default class BaseMCWSPersistenceProvider { * @returns {Promise.|Promise.} */ async createIfMissing(namespaceDefinition, userId) { + console.log('createIfMissing', namespaceDefinition, userId); const namespace = mcws.namespace(namespaceDefinition.url); try { @@ -183,7 +184,9 @@ export default class BaseMCWSPersistenceProvider { return namespaceDefinition; } catch (readError) { + console.log('readError', readError); if (readError.status === 404) { + console.log('404'); try { await namespace.create(); diff --git a/src/persistence/oldPersistenceFolderInterceptor.js b/src/persistence/oldPersistenceFolderInterceptor.js index 3339e42..2e0bc24 100644 --- a/src/persistence/oldPersistenceFolderInterceptor.js +++ b/src/persistence/oldPersistenceFolderInterceptor.js @@ -33,6 +33,8 @@ export default async function oldPersistenceFolderInterceptor( return isMissing && isNotUserRoot && (isUserFolderIdentifier || isRootFolder); }, invoke: (identifier, object) => { + console.log('oldPersistenceFolderInterceptor', identifier, object); + console.log('namespaces', namespaces); let userId = 'system'; let namespaceDefinition; From 497d8de9e4f18c3d2876d1414abe4942ca973f3b Mon Sep 17 00:00:00 2001 From: Jamie V Date: Tue, 3 Jun 2025 15:54:44 -0700 Subject: [PATCH 10/25] revert some things add back in error object to check in old persistence interceptor --- src/persistence/BaseMCWSPersistenceProvider.js | 3 --- src/persistence/MCWSPersistenceProvider.js | 6 +++++- src/persistence/oldPersistenceFolderInterceptor.js | 2 -- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index e546dfd..017661a 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -176,7 +176,6 @@ export default class BaseMCWSPersistenceProvider { * @returns {Promise.|Promise.} */ async createIfMissing(namespaceDefinition, userId) { - console.log('createIfMissing', namespaceDefinition, userId); const namespace = mcws.namespace(namespaceDefinition.url); try { @@ -184,9 +183,7 @@ export default class BaseMCWSPersistenceProvider { return namespaceDefinition; } catch (readError) { - console.log('readError', readError); if (readError.status === 404) { - console.log('404'); try { await namespace.create(); diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index d43d7ff..8e9a808 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -29,7 +29,11 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider } catch (error) { console.warn('MCWSPersistenceProvider:get', error); - return; + return { + identifier, + type: 'unknown', + name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) + }; } } diff --git a/src/persistence/oldPersistenceFolderInterceptor.js b/src/persistence/oldPersistenceFolderInterceptor.js index 2e0bc24..3339e42 100644 --- a/src/persistence/oldPersistenceFolderInterceptor.js +++ b/src/persistence/oldPersistenceFolderInterceptor.js @@ -33,8 +33,6 @@ export default async function oldPersistenceFolderInterceptor( return isMissing && isNotUserRoot && (isUserFolderIdentifier || isRootFolder); }, invoke: (identifier, object) => { - console.log('oldPersistenceFolderInterceptor', identifier, object); - console.log('namespaces', namespaces); let userId = 'system'; let namespaceDefinition; From 4c7bd1520fa1965a43acc31254aa3aef5f661aec Mon Sep 17 00:00:00 2001 From: Jamie V Date: Tue, 3 Jun 2025 16:03:01 -0700 Subject: [PATCH 11/25] add check for error object in old persistence interceptor if so, dont save it --- src/persistence/oldPersistenceFolderInterceptor.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/persistence/oldPersistenceFolderInterceptor.js b/src/persistence/oldPersistenceFolderInterceptor.js index 3339e42..cf8f985 100644 --- a/src/persistence/oldPersistenceFolderInterceptor.js +++ b/src/persistence/oldPersistenceFolderInterceptor.js @@ -36,6 +36,15 @@ export default async function oldPersistenceFolderInterceptor( let userId = 'system'; let namespaceDefinition; + // if the object is unknown and the name is an error message, + // we don't want to create a new object, this is a network error + if ( + object.type === 'unknown' && + object.name === 'Error: ' + openmct.objects.makeKeyString(identifier) + ) { + return object; + } + if ( isUserNamespace(usersNamespace, userKeyRegex, identifier) && !identifier.namespace.includes('shared') From 89929bb679e55ccc7c1e6835ab90eb4f457f927e Mon Sep 17 00:00:00 2001 From: Jamie V Date: Tue, 3 Jun 2025 16:23:21 -0700 Subject: [PATCH 12/25] only return error object for non 404 network errors --- src/persistence/MCWSPersistenceProvider.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 8e9a808..29a1603 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -29,11 +29,16 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider } catch (error) { console.warn('MCWSPersistenceProvider:get', error); - return { - identifier, - type: 'unknown', - name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) - }; + // it's a network error, we don't want to create a new object + if (error.status !== 404) { + return { + identifier, + type: 'unknown', + name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) + }; + } + + return; } } From 97189dfc108eba96222bd6744122d1951cd90a8f Mon Sep 17 00:00:00 2001 From: Jamie V Date: Tue, 3 Jun 2025 17:02:34 -0700 Subject: [PATCH 13/25] remove debug --- .webpack/webpack.prod.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.webpack/webpack.prod.js b/.webpack/webpack.prod.js index 0f416d3..9a2e87f 100644 --- a/.webpack/webpack.prod.js +++ b/.webpack/webpack.prod.js @@ -8,6 +8,5 @@ const common = require('./webpack.common'); /** @type {import('webpack').Configuration} */ module.exports = merge(common, { - mode: 'production', - devtool: 'source-map' + mode: 'production' }); From b2cbbf4f888f9238b9425831882cfb37afb487a8 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Wed, 4 Jun 2025 16:19:22 -0700 Subject: [PATCH 14/25] add retry on network errors for get --- src/persistence/MCWSPersistenceProvider.js | 53 ++++++++++++++-------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 29a1603..1c491e3 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -1,6 +1,9 @@ import BaseMCWSPersistenceProvider from './BaseMCWSPersistenceProvider'; import mcws from '../services/mcws/mcws'; +const MAX_RETRIES = 3; +const INITIAL_RETRY_DELAY = 1000; // 1 second + export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider { /** * Read an existing object back from persistence. @@ -19,26 +22,38 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider } const persistenceNamespace = await this.#getNamespace(namespace, options); - - try { - let result = await persistenceNamespace.opaqueFile(key).read(); - - result = await this.#fromPersistableModel(result, identifier); - - return result; - } catch (error) { - console.warn('MCWSPersistenceProvider:get', error); - - // it's a network error, we don't want to create a new object - if (error.status !== 404) { - return { - identifier, - type: 'unknown', - name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) - }; + let retryCount = 0; + + while (retryCount <= MAX_RETRIES) { + try { + let result = await persistenceNamespace.opaqueFile(key).read(); + result = await this.#fromPersistableModel(result, identifier); + return result; + } catch (error) { + console.warn( + `MCWSPersistenceProvider:get attempt ${retryCount + 1}/${MAX_RETRIES + 1}`, + error + ); + + // Don't retry 404s - they mean the object doesn't exist + if (error.status === 404) { + return; + } + + // If we've hit max retries, return the error object + if (retryCount === MAX_RETRIES) { + return { + identifier, + type: 'unknown', + name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) + }; + } + + // Wait with exponential backoff before retrying + const delay = INITIAL_RETRY_DELAY * Math.pow(2, retryCount); + await new Promise((resolve) => setTimeout(resolve, delay)); + retryCount++; } - - return; } } From 3af93e124b7fa890200694cdfc7f1617660e205c Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 5 Jun 2025 12:32:06 -0700 Subject: [PATCH 15/25] revert retry logic --- src/persistence/MCWSPersistenceProvider.js | 53 ++++++++-------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 1c491e3..29a1603 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -1,9 +1,6 @@ import BaseMCWSPersistenceProvider from './BaseMCWSPersistenceProvider'; import mcws from '../services/mcws/mcws'; -const MAX_RETRIES = 3; -const INITIAL_RETRY_DELAY = 1000; // 1 second - export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider { /** * Read an existing object back from persistence. @@ -22,38 +19,26 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider } const persistenceNamespace = await this.#getNamespace(namespace, options); - let retryCount = 0; - - while (retryCount <= MAX_RETRIES) { - try { - let result = await persistenceNamespace.opaqueFile(key).read(); - result = await this.#fromPersistableModel(result, identifier); - return result; - } catch (error) { - console.warn( - `MCWSPersistenceProvider:get attempt ${retryCount + 1}/${MAX_RETRIES + 1}`, - error - ); - - // Don't retry 404s - they mean the object doesn't exist - if (error.status === 404) { - return; - } - - // If we've hit max retries, return the error object - if (retryCount === MAX_RETRIES) { - return { - identifier, - type: 'unknown', - name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) - }; - } - - // Wait with exponential backoff before retrying - const delay = INITIAL_RETRY_DELAY * Math.pow(2, retryCount); - await new Promise((resolve) => setTimeout(resolve, delay)); - retryCount++; + + try { + let result = await persistenceNamespace.opaqueFile(key).read(); + + result = await this.#fromPersistableModel(result, identifier); + + return result; + } catch (error) { + console.warn('MCWSPersistenceProvider:get', error); + + // it's a network error, we don't want to create a new object + if (error.status !== 404) { + return { + identifier, + type: 'unknown', + name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) + }; } + + return; } } From 32a4024029b7cc362578fd677a0f19a1c2ab590b Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 5 Jun 2025 12:34:50 -0700 Subject: [PATCH 16/25] quick debug to test --- .webpack/webpack.prod.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.webpack/webpack.prod.js b/.webpack/webpack.prod.js index 9a2e87f..0f416d3 100644 --- a/.webpack/webpack.prod.js +++ b/.webpack/webpack.prod.js @@ -8,5 +8,6 @@ const common = require('./webpack.common'); /** @type {import('webpack').Configuration} */ module.exports = merge(common, { - mode: 'production' + mode: 'production', + devtool: 'source-map' }); From f549c35cd5b62d4ea0d3ec89d0a83032ef51a668 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 5 Jun 2025 13:42:38 -0700 Subject: [PATCH 17/25] add openmct error notif --- src/persistence/MCWSPersistenceProvider.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 29a1603..5803c70 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -31,6 +31,10 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider // it's a network error, we don't want to create a new object if (error.status !== 404) { + this.openmct.notify.error( + `Error: ${error.message ?? 'Unknown error'}. Check network connection and try again.` + ); + return { identifier, type: 'unknown', From 1e20c9f2de619fdc556b9ad3919edcc44dd29723 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 5 Jun 2025 14:01:11 -0700 Subject: [PATCH 18/25] throw error from base persistence so mcws persistence provider can handle it --- src/persistence/BaseMCWSPersistenceProvider.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/persistence/BaseMCWSPersistenceProvider.js b/src/persistence/BaseMCWSPersistenceProvider.js index 017661a..8e02d65 100644 --- a/src/persistence/BaseMCWSPersistenceProvider.js +++ b/src/persistence/BaseMCWSPersistenceProvider.js @@ -202,10 +202,10 @@ export default class BaseMCWSPersistenceProvider { return; } + } else { + throw readError; } } - - return; } /** From 2c600bd7a22ab5d96b85ef7f86ec79e415874f73 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 5 Jun 2025 14:20:05 -0700 Subject: [PATCH 19/25] add the getNamespace call to the try catch so any errors from that are handled correctly --- src/persistence/MCWSPersistenceProvider.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 5803c70..a9b3932 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -18,9 +18,8 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider options.signal = abortSignal; } - const persistenceNamespace = await this.#getNamespace(namespace, options); - try { + const persistenceNamespace = await this.#getNamespace(namespace, options); let result = await persistenceNamespace.opaqueFile(key).read(); result = await this.#fromPersistableModel(result, identifier); From 4ed3c8cc1aaedece20971936bbc8dbe4d56f8c4f Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 5 Jun 2025 14:33:39 -0700 Subject: [PATCH 20/25] use correct notification api --- src/persistence/MCWSPersistenceProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index a9b3932..0a781c3 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -30,7 +30,7 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider // it's a network error, we don't want to create a new object if (error.status !== 404) { - this.openmct.notify.error( + this.openmct.notifications.error( `Error: ${error.message ?? 'Unknown error'}. Check network connection and try again.` ); From ee12839c89de2c802bca3b1cbd14110074e40176 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Thu, 5 Jun 2025 14:47:12 -0700 Subject: [PATCH 21/25] remove debug --- .webpack/webpack.prod.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.webpack/webpack.prod.js b/.webpack/webpack.prod.js index 0f416d3..9a2e87f 100644 --- a/.webpack/webpack.prod.js +++ b/.webpack/webpack.prod.js @@ -8,6 +8,5 @@ const common = require('./webpack.common'); /** @type {import('webpack').Configuration} */ module.exports = merge(common, { - mode: 'production', - devtool: 'source-map' + mode: 'production' }); From e3e7a0d542544f9cb7fbc385eb148bfec8edda97 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Mon, 9 Jun 2025 14:33:51 -0700 Subject: [PATCH 22/25] update error message --- src/persistence/MCWSPersistenceProvider.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 0a781c3..22a2adc 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -30,8 +30,9 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider // it's a network error, we don't want to create a new object if (error.status !== 404) { + const userFolder = namespace.split(':')[0].split('-').pop(); this.openmct.notifications.error( - `Error: ${error.message ?? 'Unknown error'}. Check network connection and try again.` + `Unable to open ${userFolder} folder. Error: ${error.message ?? 'Unknown error'}. Open and close the folder to try again. If issue persists, check network connection and try again.` ); return { From b082adb9cb38a7556a02e2e52e645f58c01c2685 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Mon, 9 Jun 2025 15:20:43 -0700 Subject: [PATCH 23/25] remove clutter from notification message, correct wording --- src/persistence/MCWSPersistenceProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 22a2adc..6afd1c0 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -32,7 +32,7 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider if (error.status !== 404) { const userFolder = namespace.split(':')[0].split('-').pop(); this.openmct.notifications.error( - `Unable to open ${userFolder} folder. Error: ${error.message ?? 'Unknown error'}. Open and close the folder to try again. If issue persists, check network connection and try again.` + `Unable to open ${userFolder} folder. Close and open the folder to try again. If issue persists, check network connection and try again.` ); return { From 3793e3fd3fdecb71cedf475aaaba331bc708cecc Mon Sep 17 00:00:00 2001 From: Jamie V Date: Mon, 9 Jun 2025 15:43:16 -0700 Subject: [PATCH 24/25] ; --- src/persistence/MCWSPersistenceProvider.js | 3 ++- src/persistence/oldPersistenceFolderInterceptor.js | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/persistence/MCWSPersistenceProvider.js b/src/persistence/MCWSPersistenceProvider.js index 6afd1c0..750d914 100644 --- a/src/persistence/MCWSPersistenceProvider.js +++ b/src/persistence/MCWSPersistenceProvider.js @@ -38,7 +38,8 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider return { identifier, type: 'unknown', - name: 'Error: ' + this.openmct.objects.makeKeyString(identifier) + name: 'Error: ' + this.openmct.objects.makeKeyString(identifier), + networkError: true }; } diff --git a/src/persistence/oldPersistenceFolderInterceptor.js b/src/persistence/oldPersistenceFolderInterceptor.js index cf8f985..0dae6b2 100644 --- a/src/persistence/oldPersistenceFolderInterceptor.js +++ b/src/persistence/oldPersistenceFolderInterceptor.js @@ -38,10 +38,7 @@ export default async function oldPersistenceFolderInterceptor( // if the object is unknown and the name is an error message, // we don't want to create a new object, this is a network error - if ( - object.type === 'unknown' && - object.name === 'Error: ' + openmct.objects.makeKeyString(identifier) - ) { + if (object.networkError === true) { return object; } From 2b125b2d1cb661e7ff2a6c8a70ccbc8838cd8a21 Mon Sep 17 00:00:00 2001 From: Jamie V Date: Mon, 9 Jun 2025 16:24:47 -0700 Subject: [PATCH 25/25] update comment --- src/persistence/oldPersistenceFolderInterceptor.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/persistence/oldPersistenceFolderInterceptor.js b/src/persistence/oldPersistenceFolderInterceptor.js index 0dae6b2..8110a16 100644 --- a/src/persistence/oldPersistenceFolderInterceptor.js +++ b/src/persistence/oldPersistenceFolderInterceptor.js @@ -36,8 +36,7 @@ export default async function oldPersistenceFolderInterceptor( let userId = 'system'; let namespaceDefinition; - // if the object is unknown and the name is an error message, - // we don't want to create a new object, this is a network error + // if the object is a network error object, we don't want to create a new object if (object.networkError === true) { return object; }