From 6fe0c2fce57c0ca2d98d5ee291f771066b3bce2c Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Wed, 27 Apr 2022 11:07:16 +0300 Subject: [PATCH] Introduce tokens for runnables of specific application events for Open Closed Principle Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- ...re-application-is-ready-injection-token.ts | 11 +++ ...-application-activation-injection-token.ts | 12 +++ .../on-application-quit-injection-token.ts | 13 ++++ .../on-application-close-injection-token.ts | 13 ++++ ...n-application-is-ready-injection-token.ts} | 9 +-- .../on-open-of-url-injection-token.ts | 16 ++++ .../on-root-frame-render-injection-token.ts | 10 +++ ...nd-application-instance-injection-token.ts | 12 +++ .../start-main-application.injectable.ts | 76 +++++++++++++++++++ 9 files changed, 166 insertions(+), 6 deletions(-) create mode 100644 src/main/start-main-application/before-application-is-ready/before-application-is-ready-injection-token.ts create mode 100644 src/main/start-main-application/on-application-activation/on-application-activation-injection-token.ts create mode 100644 src/main/start-main-application/on-application-close/implementations/quit-application/on-application-quit/on-application-quit-injection-token.ts create mode 100644 src/main/start-main-application/on-application-close/on-application-close-injection-token.ts rename src/{common/setupable-injection-token/setupable-injection-token.ts => main/start-main-application/on-application-is-ready/on-application-is-ready-injection-token.ts} (54%) create mode 100644 src/main/start-main-application/on-open-of-url/on-open-of-url-injection-token.ts create mode 100644 src/main/start-main-application/on-root-frame-render/on-root-frame-render-injection-token.ts create mode 100644 src/main/start-main-application/on-second-application-instance/on-second-application-instance-injection-token.ts create mode 100644 src/main/start-main-application/start-main-application.injectable.ts diff --git a/src/main/start-main-application/before-application-is-ready/before-application-is-ready-injection-token.ts b/src/main/start-main-application/before-application-is-ready/before-application-is-ready-injection-token.ts new file mode 100644 index 0000000000..e4e099a42c --- /dev/null +++ b/src/main/start-main-application/before-application-is-ready/before-application-is-ready-injection-token.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../run-many-for"; + +export const beforeApplicationIsReadyInjectionToken = + getInjectionToken({ + id: "before-application-is-ready", + }); diff --git a/src/main/start-main-application/on-application-activation/on-application-activation-injection-token.ts b/src/main/start-main-application/on-application-activation/on-application-activation-injection-token.ts new file mode 100644 index 0000000000..50280daa86 --- /dev/null +++ b/src/main/start-main-application/on-application-activation/on-application-activation-injection-token.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../run-many-for"; + +export const onApplicationActivationInjectionToken = getInjectionToken< + Runnable<{ hasVisibleWindows: boolean }> +>({ + id: "on-application-activation", +}); diff --git a/src/main/start-main-application/on-application-close/implementations/quit-application/on-application-quit/on-application-quit-injection-token.ts b/src/main/start-main-application/on-application-close/implementations/quit-application/on-application-quit/on-application-quit-injection-token.ts new file mode 100644 index 0000000000..fde10ee2b4 --- /dev/null +++ b/src/main/start-main-application/on-application-close/implementations/quit-application/on-application-quit/on-application-quit-injection-token.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../../../../run-many-for"; +import type { Event } from "electron"; + +export const onApplicationQuitInjectionToken = getInjectionToken< + Runnable<{ event: Event }> +>({ + id: "on-application-quit", +}); diff --git a/src/main/start-main-application/on-application-close/on-application-close-injection-token.ts b/src/main/start-main-application/on-application-close/on-application-close-injection-token.ts new file mode 100644 index 0000000000..3d0b8950fe --- /dev/null +++ b/src/main/start-main-application/on-application-close/on-application-close-injection-token.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../run-many-for"; +import type { Event } from "electron"; + +export const onApplicationCloseInjectionToken = getInjectionToken< + Runnable<{ event: Event }> +>({ + id: "on-application-close", +}); diff --git a/src/common/setupable-injection-token/setupable-injection-token.ts b/src/main/start-main-application/on-application-is-ready/on-application-is-ready-injection-token.ts similarity index 54% rename from src/common/setupable-injection-token/setupable-injection-token.ts rename to src/main/start-main-application/on-application-is-ready/on-application-is-ready-injection-token.ts index 7dff975ba9..5d4e7e20ce 100644 --- a/src/common/setupable-injection-token/setupable-injection-token.ts +++ b/src/main/start-main-application/on-application-is-ready/on-application-is-ready-injection-token.ts @@ -3,11 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../run-many-for"; -export interface Setupable { - runSetup: () => Promise | void; -} - -export const setupableInjectionToken = getInjectionToken({ - id: "setupable-injection-token", +export const onApplicationIsReadyInjectionToken = getInjectionToken({ + id: "on-application-is-ready", }); diff --git a/src/main/start-main-application/on-open-of-url/on-open-of-url-injection-token.ts b/src/main/start-main-application/on-open-of-url/on-open-of-url-injection-token.ts new file mode 100644 index 0000000000..59ffe315b9 --- /dev/null +++ b/src/main/start-main-application/on-open-of-url/on-open-of-url-injection-token.ts @@ -0,0 +1,16 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../run-many-for"; +import type { Event } from "electron"; + +export const onOpenOfUrlInjectionToken = getInjectionToken< + Runnable<{ + event: Event; + url: string; + }> +>({ + id: "on-open-of-url", +}); diff --git a/src/main/start-main-application/on-root-frame-render/on-root-frame-render-injection-token.ts b/src/main/start-main-application/on-root-frame-render/on-root-frame-render-injection-token.ts new file mode 100644 index 0000000000..4b0f80062d --- /dev/null +++ b/src/main/start-main-application/on-root-frame-render/on-root-frame-render-injection-token.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../run-many-for"; + +export const onRootFrameRenderInjectionToken = getInjectionToken({ + id: "on-root-frame-render", +}); diff --git a/src/main/start-main-application/on-second-application-instance/on-second-application-instance-injection-token.ts b/src/main/start-main-application/on-second-application-instance/on-second-application-instance-injection-token.ts new file mode 100644 index 0000000000..12085b63bc --- /dev/null +++ b/src/main/start-main-application/on-second-application-instance/on-second-application-instance-injection-token.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Runnable } from "../run-many-for"; + +export const onSecondApplicationInstanceInjectionToken = getInjectionToken< + Runnable<{ commandLineArguments: string[] }> +>({ + id: "on-second-application-instance", +}); diff --git a/src/main/start-main-application/start-main-application.injectable.ts b/src/main/start-main-application/start-main-application.injectable.ts new file mode 100644 index 0000000000..f2dd8fde50 --- /dev/null +++ b/src/main/start-main-application/start-main-application.injectable.ts @@ -0,0 +1,76 @@ +/** + * 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 electronAppInjectable from "../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; +import { beforeApplicationIsReadyInjectionToken } from "./before-application-is-ready/before-application-is-ready-injection-token"; +import { onApplicationIsReadyInjectionToken } from "./on-application-is-ready/on-application-is-ready-injection-token"; +import { onSecondApplicationInstanceInjectionToken } from "./on-second-application-instance/on-second-application-instance-injection-token"; +import { onApplicationActivationInjectionToken } from "./on-application-activation/on-application-activation-injection-token"; +import { onOpenOfUrlInjectionToken } from "./on-open-of-url/on-open-of-url-injection-token"; +import { runManyFor } from "./run-many-for"; +import { + onApplicationCloseInjectionToken, +} from "./on-application-close/on-application-close-injection-token"; + +const startMainApplicationInjectable = getInjectable({ + id: "start-main-application", + + instantiate: (di) => { + const runMany = runManyFor(di); + const app = di.inject(electronAppInjectable); + + const runManyBeforeApplicationIsReady = runMany( + beforeApplicationIsReadyInjectionToken, + ); + + const runManyAfterApplicationIsReady = runMany( + onApplicationIsReadyInjectionToken, + ); + + const runManyForSecondApplicationInstance = runMany( + onSecondApplicationInstanceInjectionToken, + ); + + const runManyForApplicationActivation = runMany( + onApplicationActivationInjectionToken, + ); + + const runManyForApplicationClose = runMany(onApplicationCloseInjectionToken); + + const runManyForOpenOfUrl = runMany(onOpenOfUrlInjectionToken); + + return async () => { + app.on("second-instance", async (_, commandLineArguments) => { + await runManyForSecondApplicationInstance({ commandLineArguments }); + }); + + app.on("activate", async (_, hasVisibleWindows) => { + await runManyForApplicationActivation({ hasVisibleWindows }); + }); + + app.on("will-quit", async (event) => { + await runManyForApplicationClose({ event }); + }); + + app.on("open-url", async (event, url) => { + await runManyForOpenOfUrl({ event, url }); + }); + + await runManyBeforeApplicationIsReady(); + + await app.whenReady(); + + await runManyAfterApplicationIsReady(); + }; + }, +}); + +export default startMainApplicationInjectable; + + +