From e626cc91d4c739621f5d33e460b2a9dd87a7773f Mon Sep 17 00:00:00 2001 From: Panu Horsmalahti Date: Fri, 11 Feb 2022 16:13:34 +0200 Subject: [PATCH] Don't block other extensions from loading if one activation fails (#4805) * Don't block other extensions from loading if one activation fails. Signed-off-by: Panu Horsmalahti * Handle synchronous errors in onActivate Signed-off-by: Panu Horsmalahti * Keep extensions that can't be activated in this.intances Signed-off-by: Panu Horsmalahti * Return extensions that failed to be activated from loadExtensions to match old behavior. Signed-off-by: Panu Horsmalahti * Simplify style. Signed-off-by: Panu Horsmalahti * Simplify object. Remove unnecessary action. Signed-off-by: Panu Horsmalahti --- .../extension-loader/extension-loader.ts | 18 ++++++++++++------ src/extensions/lens-extension.ts | 3 +-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/extensions/extension-loader/extension-loader.ts b/src/extensions/extension-loader/extension-loader.ts index e954a1f460..56aa0cc03c 100644 --- a/src/extensions/extension-loader/extension-loader.ts +++ b/src/extensions/extension-loader/extension-loader.ts @@ -322,13 +322,12 @@ export class ExtensionLoader { this.instances.set(extId, instance); return { - extId, instance, - isBundled: extension.isBundled, + installedExtension: extension, activated: instance.activate(), }; } catch (err) { - logger.error(`${logModule}: activation extension error`, { ext: extension, err }); + logger.error(`${logModule}: error loading extension`, { ext: extension, err }); } } else if (!extension.isEnabled && alreadyInit) { this.removeInstance(extId); @@ -339,9 +338,16 @@ export class ExtensionLoader { // Remove null values .filter(extension => Boolean(extension)); - // We first need to wait until each extension's `onActivate` is resolved, + // We first need to wait until each extension's `onActivate` is resolved or rejected, // as this might register new catalog categories. Afterwards we can safely .enable the extension. - await Promise.all(extensions.map(extension => extension.activated)); + await Promise.all( + extensions.map(extension => + // If extension activation fails, log error + extension.activated.catch((error) => { + logger.error(`${logModule}: activation extension error`, { ext: extension.installedExtension, error }); + }), + ), + ); // Return ExtensionLoading[] return extensions.map(extension => { @@ -350,7 +356,7 @@ export class ExtensionLoader { }); return { - isBundled: extension.isBundled, + isBundled: extension.installedExtension.isBundled, loaded, }; }); diff --git a/src/extensions/lens-extension.ts b/src/extensions/lens-extension.ts index c892464ab8..bdfb4578e5 100644 --- a/src/extensions/lens-extension.ts +++ b/src/extensions/lens-extension.ts @@ -112,8 +112,7 @@ export class LensExtension { } } - @action - activate() { + async activate(): Promise { return this.onActivate(); }