From 34adfcd20b4d3cd9f928862c95732b6bcf544a62 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 30 May 2023 11:37:01 -0400 Subject: [PATCH] fix: Retrieve projectVersion from main for 'extensions-persistent-storage' - Prevent the version being changed by the renderer Signed-off-by: Sebastian Malton --- .../src/common/initializable-state/create.ts | 5 ++-- .../enabled/common/storage-version.ts | 15 +++++++++++ .../enabled/common/storage.injectable.ts | 24 +++++++++++++++-- .../storage-version-handler.injectable.ts | 19 ++++++++++++++ .../main/storage-version.injectable.ts | 17 ++++++++++++ .../renderer/load-storage.injectable.ts | 2 ++ .../renderer/storage-version.injectable.ts | 26 +++++++++++++++++++ 7 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 packages/core/src/features/extensions/enabled/common/storage-version.ts create mode 100644 packages/core/src/features/extensions/enabled/main/storage-version-handler.injectable.ts create mode 100644 packages/core/src/features/extensions/enabled/main/storage-version.injectable.ts create mode 100644 packages/core/src/features/extensions/enabled/renderer/storage-version.injectable.ts diff --git a/packages/core/src/common/initializable-state/create.ts b/packages/core/src/common/initializable-state/create.ts index 760a97e907..51e0d8ed25 100644 --- a/packages/core/src/common/initializable-state/create.ts +++ b/packages/core/src/common/initializable-state/create.ts @@ -26,12 +26,11 @@ export type ImplInitializableInjectionTokensArgs = { token: Initializable; init: (di: DiContainerForInjection) => T | Promise; } & ( - { + | { phase: InjectionToken, void>; runAfter?: Injectable, Runnable, void>[]; } - | - { + | { runAfter: Injectable, Runnable, void>; phase?: undefined; } diff --git a/packages/core/src/features/extensions/enabled/common/storage-version.ts b/packages/core/src/features/extensions/enabled/common/storage-version.ts new file mode 100644 index 0000000000..5f46b4ae8b --- /dev/null +++ b/packages/core/src/features/extensions/enabled/common/storage-version.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getRequestChannel } from "@k8slens/messaging"; +import { getInitializable } from "../../../../common/initializable-state/create"; + +export const enabledExtensionsPersistentStorageVersionInitializable = getInitializable( + "enabled-extensions-persistent-storage-version", +); + +export const enabledExtensionsPersistentStorageVersionChannel = getRequestChannel( + "enabled-extensions-persistent-storage-version", +); diff --git a/packages/core/src/features/extensions/enabled/common/storage.injectable.ts b/packages/core/src/features/extensions/enabled/common/storage.injectable.ts index d2bd14ee15..d3d5b36565 100644 --- a/packages/core/src/features/extensions/enabled/common/storage.injectable.ts +++ b/packages/core/src/features/extensions/enabled/common/storage.injectable.ts @@ -3,6 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { LensExtensionId } from "@k8slens/legacy-extensions"; +import { isDefined } from "@k8slens/utilities"; import { getInjectable } from "@ogre-tools/injectable"; import { action, toJS } from "mobx"; import createPersistentStorageInjectable from "../../../../common/persistent-storage/create.injectable"; @@ -10,6 +11,13 @@ import persistentStorageMigrationsInjectable from "../../../../common/persistent import { enabledExtensionsMigrationDeclarationInjectionToken } from "./migrations"; import type { LensExtensionState } from "./state.injectable"; import enabledExtensionsStateInjectable from "./state.injectable"; +import { enabledExtensionsPersistentStorageVersionInitializable } from "./storage-version"; +import z from "zod"; + +const stateModel = z.object({ + enabled: z.boolean(), + name: z.string(), +}); interface EnabledExtensionsStorageModal { extensions: [LensExtensionId, LensExtensionState][]; @@ -23,13 +31,25 @@ const enabledExtensionsPersistentStorageInjectable = getInjectable({ return createPersistentStorage({ configName: "lens-extensions", - fromStore: action(({ extensions = [] }) => { + fromStore: action(({ extensions: rawExtensions = [] }) => { + const extensions = rawExtensions + .map(([key, value]) => { + const verification = stateModel.safeParse(value); + + if (!verification.success) { + return undefined; + } + + return [key, verification.data] as const; + }) + .filter(isDefined); + state.replace(extensions); }), toJSON: () => ({ extensions: [...toJS(state)], }), - projectVersion: "6.5.0", // temporary fix for #7784, otherwise calculated wrong on the renderer process + projectVersion: di.inject(enabledExtensionsPersistentStorageVersionInitializable.stateToken), migrations: di.inject(persistentStorageMigrationsInjectable, enabledExtensionsMigrationDeclarationInjectionToken), }); }, diff --git a/packages/core/src/features/extensions/enabled/main/storage-version-handler.injectable.ts b/packages/core/src/features/extensions/enabled/main/storage-version-handler.injectable.ts new file mode 100644 index 0000000000..a0889bf905 --- /dev/null +++ b/packages/core/src/features/extensions/enabled/main/storage-version-handler.injectable.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getRequestChannelListenerInjectable } from "@k8slens/messaging"; +import { enabledExtensionsPersistentStorageVersionChannel, enabledExtensionsPersistentStorageVersionInitializable } from "../common/storage-version"; + +const enabledExtensionsPersistentStorageVersionChannelHandler = getRequestChannelListenerInjectable({ + id: "enabled-extensions-persistent-storage-version-handler", + channel: enabledExtensionsPersistentStorageVersionChannel, + getHandler: (di) => { + const version = di.inject(enabledExtensionsPersistentStorageVersionInitializable.stateToken); + + return () => version; + }, +}); + +export default enabledExtensionsPersistentStorageVersionChannelHandler; diff --git a/packages/core/src/features/extensions/enabled/main/storage-version.injectable.ts b/packages/core/src/features/extensions/enabled/main/storage-version.injectable.ts new file mode 100644 index 0000000000..dacbb52011 --- /dev/null +++ b/packages/core/src/features/extensions/enabled/main/storage-version.injectable.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import storageMigrationVersionInjectable from "../../../../common/persistent-storage/storage-migration-version.injectable"; +import { enabledExtensionsMigrationDeclarationInjectionToken } from "../common/migrations"; +import { enabledExtensionsPersistentStorageVersionInitializable } from "../common/storage-version"; +import { getInjectable } from "@ogre-tools/injectable"; + +const enabledExtensionsPersistentStorageVersionStateInjectable = getInjectable({ + id: "enabled-extensions-persistent-storage-version-state", + instantiate: (di) => di.inject(storageMigrationVersionInjectable, enabledExtensionsMigrationDeclarationInjectionToken), + injectionToken: enabledExtensionsPersistentStorageVersionInitializable.stateToken, +}); + +export default enabledExtensionsPersistentStorageVersionStateInjectable; + diff --git a/packages/core/src/features/extensions/enabled/renderer/load-storage.injectable.ts b/packages/core/src/features/extensions/enabled/renderer/load-storage.injectable.ts index 50be3cd88d..3a0a11c368 100644 --- a/packages/core/src/features/extensions/enabled/renderer/load-storage.injectable.ts +++ b/packages/core/src/features/extensions/enabled/renderer/load-storage.injectable.ts @@ -5,6 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { beforeFrameStartsSecondInjectionToken } from "../../../../renderer/before-frame-starts/tokens"; import enabledExtensionsPersistentStorageInjectable from "../common/storage.injectable"; +import { enabledExtensionsPersistentStorageVersionInitializationInjectable } from "./storage-version.injectable"; const loadEnabledExtensionsStorageInjectable = getInjectable({ id: "load-enabled-extensions-storage", @@ -14,6 +15,7 @@ const loadEnabledExtensionsStorageInjectable = getInjectable({ storage.loadAndStartSyncing(); }, + runAfter: enabledExtensionsPersistentStorageVersionInitializationInjectable, }), injectionToken: beforeFrameStartsSecondInjectionToken, }); diff --git a/packages/core/src/features/extensions/enabled/renderer/storage-version.injectable.ts b/packages/core/src/features/extensions/enabled/renderer/storage-version.injectable.ts new file mode 100644 index 0000000000..9d82987fd5 --- /dev/null +++ b/packages/core/src/features/extensions/enabled/renderer/storage-version.injectable.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { requestFromChannelInjectionToken } from "@k8slens/messaging"; +import { getInjectablesForInitializable } from "../../../../common/initializable-state/create"; +import { beforeFrameStartsSecondInjectionToken } from "../../../../renderer/before-frame-starts/tokens"; +import { enabledExtensionsPersistentStorageVersionChannel, enabledExtensionsPersistentStorageVersionInitializable } from "../common/storage-version"; + +const { + initializationInjectable: enabledExtensionsPersistentStorageVersionInitializationInjectable, + stateInjectable: enabledExtensionsPersistentStorageVersionStateInjectable, +} = getInjectablesForInitializable({ + token: enabledExtensionsPersistentStorageVersionInitializable, + init: (di) => { + const requestFromChannel = di.inject(requestFromChannelInjectionToken); + + return requestFromChannel(enabledExtensionsPersistentStorageVersionChannel); + }, + phase: beforeFrameStartsSecondInjectionToken, +}); + +export { + enabledExtensionsPersistentStorageVersionInitializationInjectable, + enabledExtensionsPersistentStorageVersionStateInjectable, +};