diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts index b67fe38d2f..dda534e77f 100644 --- a/src/extensions/extension-loader.ts +++ b/src/extensions/extension-loader.ts @@ -48,7 +48,6 @@ const logModule = "[EXTENSIONS-LOADER]"; export class ExtensionLoader extends Singleton { protected extensions = observable.map(); protected instances = observable.map(); - /** * This is the set of extensions that don't come with either * - Main.LensExtension when running in the main process @@ -273,9 +272,9 @@ export class ExtensionLoader extends Singleton { }); } - loadOnClusterManagerRenderer() { + async loadOnClusterManagerRenderer() { logger.debug(`${logModule}: load on main renderer (cluster manager)`); - this.autoInitExtensions(async (extension: LensRendererExtension) => { + await this.autoInitExtensions(async (extension: LensRendererExtension) => { const removeItems = [ registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension), registries.AppPreferenceRegistry.getInstance().add(extension.appPreferences), @@ -298,6 +297,7 @@ export class ExtensionLoader extends Singleton { return removeItems; }); + console.log(`STARTUP ExtensionLoader:loadOnClusterManagerRenderer done ${new Date()} ${new Date().getTime()}`); } loadOnClusterRenderer() { @@ -331,8 +331,11 @@ export class ExtensionLoader extends Singleton { }); } - protected autoInitExtensions(register: (ext: LensExtension) => Promise) { - return reaction(() => this.toJSON(), async installedExtensions => { + protected async autoInitExtensions(register: (ext: LensExtension) => Promise) { + console.log(`STARTUP ${new Date()} ExtensionLoader::autoInitExtensions`); + const enablePromises: Promise[] = []; + + reaction(() => this.toJSON(), async installedExtensions => { for (const [extId, extension] of installedExtensions) { const alreadyInit = this.instances.has(extId) || this.nonInstancesByName.has(extension.manifest.name); @@ -347,9 +350,10 @@ export class ExtensionLoader extends Singleton { const instance = new LensExtensionClass(extension); - await instance.enable(register); - console.log("STARTUP await instance.enable(register) returned"); this.instances.set(extId, instance); + enablePromises.push(instance.enable(register).catch((err) => { + logger.error(`${logModule}: failed to enable`, { ext: extension, err }); + })); } catch (err) { logger.error(`${logModule}: activation extension error`, { ext: extension, err }); } @@ -360,6 +364,8 @@ export class ExtensionLoader extends Singleton { }, { fireImmediately: true, }); + + return Promise.all(enablePromises); } protected requireExtension(extension: InstalledExtension): LensExtensionConstructor | null { diff --git a/src/extensions/lens-extension.ts b/src/extensions/lens-extension.ts index 93296e65d5..2a6bc87e44 100644 --- a/src/extensions/lens-extension.ts +++ b/src/extensions/lens-extension.ts @@ -88,13 +88,13 @@ export class LensExtension { } try { - logger.info(`STARTUP LENS Extension enable ${new Date()}`); + logger.info(`STARTUP LENS ${this.name} Extension enable ${new Date()} ${new Date().getTime()}`); await this.onActivate(); this.isEnabled = true; this[Disposers].push(...await register(this)); logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`); - logger.info(`STARTUP LENS Extension enabled ${new Date()}`); + logger.info(`STARTUP LENS Extension ${this.name} enabled ${new Date()} ${new Date().getTime()}`); } catch (error) { logger.error(`[EXTENSION]: failed to activate ${this.name}@${this.version}: ${error}`); } diff --git a/src/main/index.ts b/src/main/index.ts index ce91df04f9..3a0877b852 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -42,7 +42,7 @@ import type { LensExtensionId } from "../extensions/lens-extension"; import { installDeveloperTools } from "./developer-tools"; import { LensProtocolRouterMain } from "./protocol-handler"; import { disposer, getAppVersion, getAppVersionFromProxyServer, storedKubeConfigFolder } from "../common/utils"; -import { bindBroadcastHandlers, broadcastMessage, ipcMainOn } from "../common/ipc"; +import { bindBroadcastHandlers, ipcMainOn } from "../common/ipc"; import { startUpdateChecking } from "./app-updater"; import { IpcRendererNavigationEvents } from "../renderer/navigation/events"; import { pushCatalogToRenderer } from "./catalog-pusher"; @@ -284,15 +284,15 @@ app.on("ready", async () => { onCloseCleanup.push(pushCatalogToRenderer(catalogEntityRegistry)); await ensureDir(storedKubeConfigFolder()); KubeconfigSyncManager.getInstance().startSync(); - logger.info(`STARTUP LENS Init extensions start ${new Date()}`); - await initExtensions(); - logger.info(`STARTUP LENS Init extensions end ${new Date()}`); startUpdateChecking(); LensProtocolRouterMain.getInstance().rendererLoaded = true; console.log(`STARTUP LENS EXTENSIONS:LOADED ${new Date()}`); - broadcastMessage("EXTENSIONS:LOADED"); }); + logger.info(`STARTUP LENS Init extensions start ${new Date()}`); + await initExtensions(); + logger.info(`STARTUP LENS Init extensions end ${new Date()}`); + setTimeout(() => { appEventBus.emit({ name: "service", action: "start" }); }, 1000); diff --git a/src/main/window-manager.ts b/src/main/window-manager.ts index 2813766438..ae53ee8e73 100644 --- a/src/main/window-manager.ts +++ b/src/main/window-manager.ts @@ -177,7 +177,7 @@ export class WindowManager extends Singleton { if (!this.mainWindow) { viewHasLoaded = new Promise(resolve => { ipcMain.once("EXTENSIONS:LOADED", () => { - logger.info(`STARTUP LENS EXTENSIONS:LOADED: ${showSplash} ${new Date()}`); + console.log(`STARTUP GOT EXTENSIONS:LOADED ${new Date()} ${new Date().getTime()}`); resolve(); } ); }); @@ -186,11 +186,9 @@ export class WindowManager extends Singleton { try { await viewHasLoaded; - await delay(50); // wait just a bit longer to let the first round of rendering happen - logger.info("[WINDOW-MANAGER]: Main window has reported that it has loaded"); - logger.info(`STARTUP LENS view has loaded let's show mainWindow ${new Date()}`); + await delay(100); // wait just a bit longer to let the first round of rendering happen + console.log(`STARTUP this.mainWindow.show ${new Date()} ${new Date().getTime()}`); this.mainWindow.show(); - logger.info(`STARTUP LENS let's close the splashWindow ${new Date()}`); this.splashWindow?.close(); this.splashWindow = undefined; setTimeout(() => { diff --git a/src/renderer/root-frame.tsx b/src/renderer/root-frame.tsx index 5fd3051b64..5605c8b33d 100644 --- a/src/renderer/root-frame.tsx +++ b/src/renderer/root-frame.tsx @@ -49,7 +49,10 @@ export class RootFrame extends React.Component { static async init(rootElem: HTMLElement) { catalogEntityRegistry.init(); - ExtensionLoader.getInstance().loadOnClusterManagerRenderer(); + console.log(`STARTUP ExtensionLoader::init::loadOnClusterManagerRenderer ${new Date()} ${new Date().getTime()}`); + await ExtensionLoader.getInstance().loadOnClusterManagerRenderer(); + console.log(`STARTUP ExtensionLoader::init::loadOnClusterManagerRenderer done ${new Date()} ${new Date().getTime()}`); + ipcRenderer.send("EXTENSIONS:LOADED"); LensProtocolRouterRenderer.createInstance().init(); bindProtocolAddRouteHandlers();