From a06bd637010a3e9154c7401833edcd23caa07dd5 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 1 Nov 2022 10:21:36 -0400 Subject: [PATCH] Fix runnables to be sync if init is sync Signed-off-by: Sebastian Malton --- .../directory-for-binaries.injectable.ts | 9 +++---- .../initializable-state/create-dependent.ts | 24 ++++++++++++++----- src/common/initializable-state/create.ts | 20 ++++++++++++---- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/common/app-paths/directory-for-binaries.injectable.ts b/src/common/app-paths/directory-for-binaries.injectable.ts index 21b8c1250d..ebba8a29e7 100644 --- a/src/common/app-paths/directory-for-binaries.injectable.ts +++ b/src/common/app-paths/directory-for-binaries.injectable.ts @@ -2,9 +2,7 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { initAppPathsOnMainInjectable } from "../../main/app-paths/impl.injectable"; -import { initAppPathsOnRendererInjectable } from "../../renderer/app-paths/impl.injectable"; -import directoryForUserDataInjectable from "./directory-for-user-data.injectable"; +import directoryForUserDataInjectable, { initDirectoryForUserDataOnMainInjectable, initDirectoryForUserDataOnRendererInjectable } from "./directory-for-user-data.injectable"; import joinPathsInjectable from "../path/join-paths.injectable"; import { createDependentInitializableState } from "../initializable-state/create-dependent"; @@ -22,7 +20,10 @@ const { return joinPaths(directoryForUserData.get(), "binaries"); }, - initAfter: [initAppPathsOnMainInjectable, initAppPathsOnRendererInjectable], + initAfter: [ + initDirectoryForUserDataOnMainInjectable, + initDirectoryForUserDataOnRendererInjectable, + ], }); export { diff --git a/src/common/initializable-state/create-dependent.ts b/src/common/initializable-state/create-dependent.ts index 4c682b4500..23ab184019 100644 --- a/src/common/initializable-state/create-dependent.ts +++ b/src/common/initializable-state/create-dependent.ts @@ -47,19 +47,31 @@ export function createDependentInitializableState(args: CreateDependentInitia }); const initializers = initAfter.map(runnableInjectable => getInjectable({ - id: `initialize-${id}`, + id: `initialize-${id}-during-${runnableInjectable.injectionToken?.id}`, instantiate: (di) => ({ id: `initialize-${id}`, - run: async () => { + run: (): void | Promise => { if (initCalled) { throw new Error(`Cannot initialize InitializableState(${id}) more than once`); } initCalled = true; - box = { - set: true, - value: await init(di), - }; + const potentialValue = init(di); + + if (potentialValue instanceof Promise) { + // This is done because we have to run syncronously if `init` is syncronous to prevent ordering issues + return (async () => { + box = { + set: true, + value: await potentialValue, + }; + })(); + } else { + box = { + set: true, + value: potentialValue, + }; + } }, runAfter: di.inject(runnableInjectable), }), diff --git a/src/common/initializable-state/create.ts b/src/common/initializable-state/create.ts index 9226b2b121..5ef928c791 100644 --- a/src/common/initializable-state/create.ts +++ b/src/common/initializable-state/create.ts @@ -63,10 +63,22 @@ export function createInitializableState(args: CreateInitializableStateArgs { + box = { + set: true, + value: await potentialValue, + }; + })(); + } else { + box = { + set: true, + value: potentialValue, + }; + } }, }), injectionToken: when,