From 30796eccffe0c809eac15367bf19f4d7470440b9 Mon Sep 17 00:00:00 2001 From: Jim Ehrismann Date: Wed, 5 Apr 2023 14:30:25 -0400 Subject: [PATCH] close watch for user resource templates on quit Signed-off-by: Jim Ehrismann --- .../create-resource-templates.injectable.ts | 2 +- ...ching-user-templates-on-quit.injectable.ts | 28 +++++++++++++++++++ .../user-templates.injectable.ts | 19 +++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 packages/core/src/renderer/components/dock/create-resource/stop-watching-user-templates-on-quit.injectable.ts diff --git a/packages/core/src/renderer/components/dock/create-resource/create-resource-templates.injectable.ts b/packages/core/src/renderer/components/dock/create-resource/create-resource-templates.injectable.ts index ecb00e5efb..31bd27685b 100644 --- a/packages/core/src/renderer/components/dock/create-resource/create-resource-templates.injectable.ts +++ b/packages/core/src/renderer/components/dock/create-resource/create-resource-templates.injectable.ts @@ -15,7 +15,7 @@ const createResourceTemplatesInjectable = getInjectable({ instantiate: async (di) => { const lensResourceTemplates = await di.inject(lensCreateResourceTemplatesInjectable); - const userResourceTemplates = di.inject(userCreateResourceTemplatesInjectable); + const [ userResourceTemplates, ] = di.inject(userCreateResourceTemplatesInjectable); return computed((): GroupBase<{ label: string; value: string }>[] => { const res = [ diff --git a/packages/core/src/renderer/components/dock/create-resource/stop-watching-user-templates-on-quit.injectable.ts b/packages/core/src/renderer/components/dock/create-resource/stop-watching-user-templates-on-quit.injectable.ts new file mode 100644 index 0000000000..ce87e4c5fe --- /dev/null +++ b/packages/core/src/renderer/components/dock/create-resource/stop-watching-user-templates-on-quit.injectable.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { beforeQuitOfBackEndInjectionToken } from "../../../../main/start-main-application/runnable-tokens/before-quit-of-back-end-injection-token"; +import userTemplatesInjectable from "./user-templates.injectable"; + +const stopWatchingUserTemplatesOnQuitInjectable = getInjectable({ + id: "stop-watching-user-templates-on-quit", + + instantiate: (di) => { + + return { + id: "stop-watching-user-templates-on-quit", + + run: () => { + const [, disposer] = di.inject(userTemplatesInjectable); + + disposer(); + }, + }; + }, + + injectionToken: beforeQuitOfBackEndInjectionToken, +}); + +export default stopWatchingUserTemplatesOnQuitInjectable; diff --git a/packages/core/src/renderer/components/dock/create-resource/user-templates.injectable.ts b/packages/core/src/renderer/components/dock/create-resource/user-templates.injectable.ts index 65b896f95d..21b6671fe5 100644 --- a/packages/core/src/renderer/components/dock/create-resource/user-templates.injectable.ts +++ b/packages/core/src/renderer/components/dock/create-resource/user-templates.injectable.ts @@ -3,6 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import type { IComputedValue } from "mobx"; import { computed, observable } from "mobx"; import { delay, getOrInsert, isErrnoException, waitForPath } from "../../../utils"; import { readFile } from "fs/promises"; @@ -10,15 +11,19 @@ import { hasCorrectExtension } from "./has-correct-extension"; import type { RawTemplates } from "./create-resource-templates.injectable"; import joinPathsInjectable from "../../../../common/path/join-paths.injectable"; import watchInjectable from "../../../../common/fs/watch/watch.injectable"; +import type { Watcher } from "../../../../common/fs/watch/watch.injectable"; import getRelativePathInjectable from "../../../../common/path/get-relative-path.injectable"; import homeDirectoryPathInjectable from "../../../../common/os/home-directory-path.injectable"; import getDirnameOfPathInjectable from "../../../../common/path/get-dirname.injectable"; import loggerInjectable from "../../../../common/logger.injectable"; import parsePathInjectable from "../../../../common/path/parse.injectable"; +import type { Disposer } from "../../../../common/utils"; + +export type ResourceTemplates = [IComputedValue, Disposer]; const userCreateResourceTemplatesInjectable = getInjectable({ id: "user-create-resource-templates", - instantiate: (di) => { + instantiate: (di): ResourceTemplates => { const joinPaths = di.inject(joinPathsInjectable); const watch = di.inject(watchInjectable); const getRelativePath = di.inject(getRelativePathInjectable); @@ -70,6 +75,8 @@ const userCreateResourceTemplatesInjectable = getInjectable({ templates.delete(filePath); }; + let watcher: Watcher|undefined; + (async () => { for (let i = 1;; i *= 2) { try { @@ -84,7 +91,7 @@ const userCreateResourceTemplatesInjectable = getInjectable({ /** * NOTE: There is technically a race condition here of the form "time-of-check to time-of-use" */ - watch(userTemplatesFolder, { + watcher = watch(userTemplatesFolder, { disableGlobbing: true, ignorePermissionErrors: true, usePolling: false, @@ -95,6 +102,8 @@ const userCreateResourceTemplatesInjectable = getInjectable({ ignoreInitial: false, atomic: 150, // for "atomic writes" }) + + watcher .on("add", onAddOrChange) .on("change", onAddOrChange) .on("unlink", onUnlink) @@ -103,7 +112,11 @@ const userCreateResourceTemplatesInjectable = getInjectable({ }); })(); - return computed(() => groupTemplates(templates)); + return [computed(() => groupTemplates(templates)), () => { + logger.info("[USER-CREATE-RESOURCE-TEMPLATES]: stopping watch"); + + watcher?.close() + }]; }, });