From e15be515578acaa2f4655290c32e5784c58c518e Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Wed, 27 Apr 2022 11:30:05 +0300 Subject: [PATCH] Reimplement setup for deep linking using runnables instead of non-OCP in index.ts Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- .../setup-protocol-router-main.injectable.ts | 53 +++++++++++++++++++ ...en-url-using-protocol-router.injectable.ts | 27 ++++++++++ ...l-router-for-second-instance.injectable.ts | 37 +++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 src/main/start-main-application/on-application-is-ready/implementations/setup-protocol-router-main.injectable.ts create mode 100644 src/main/start-main-application/on-open-of-url/implementations/open-url-using-protocol-router.injectable.ts create mode 100644 src/main/start-main-application/on-second-application-instance/implementations/setup-protocol-router-for-second-instance.injectable.ts diff --git a/src/main/start-main-application/on-application-is-ready/implementations/setup-protocol-router-main.injectable.ts b/src/main/start-main-application/on-application-is-ready/implementations/setup-protocol-router-main.injectable.ts new file mode 100644 index 0000000000..5355a9eb26 --- /dev/null +++ b/src/main/start-main-application/on-application-is-ready/implementations/setup-protocol-router-main.injectable.ts @@ -0,0 +1,53 @@ +/** + * 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 { onApplicationIsReadyInjectionToken } from "../on-application-is-ready-injection-token"; +import { productName } from "../../../../common/vars"; +import loggerInjectable from "../../../../common/logger.injectable"; +import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; +import lensProtocolRouterMainInjectable from "../../../protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable"; +import exitAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/exit-app.injectable"; + +const setupProtocolRouterMainInjectable = getInjectable({ + id: "setup-protocol-router-main", + + instantiate: (di) => { + const logger = di.inject(loggerInjectable); + const app = di.inject(electronAppInjectable); + const exitApp = di.inject(exitAppInjectable); + + return { + run: () => { + logger.info(`📟 Setting ${productName} as protocol client for lens://`); + + if (app.setAsDefaultProtocolClient("lens")) { + logger.info("📟 Protocol client register succeeded ✅"); + } else { + logger.info("📟 Protocol client register failed ❗"); + } + + logger.debug("[APP-MAIN] Lens protocol routing main"); + + const lensProtocolRouterMain = di.inject( + lensProtocolRouterMainInjectable, + ); + + if (!app.requestSingleInstanceLock()) { + exitApp(); + } else { + for (const arg of process.argv) { + if (arg.toLowerCase().startsWith("lens://")) { + lensProtocolRouterMain.route(arg); + } + } + } + }, + }; + }, + + injectionToken: onApplicationIsReadyInjectionToken, +}); + +export default setupProtocolRouterMainInjectable; diff --git a/src/main/start-main-application/on-open-of-url/implementations/open-url-using-protocol-router.injectable.ts b/src/main/start-main-application/on-open-of-url/implementations/open-url-using-protocol-router.injectable.ts new file mode 100644 index 0000000000..71b44c4bfc --- /dev/null +++ b/src/main/start-main-application/on-open-of-url/implementations/open-url-using-protocol-router.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 lensProtocolRouterMainInjectable from "../../../protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable"; +import { onOpenOfUrlInjectionToken } from "../on-open-of-url-injection-token"; + +const openUrlUsingProtocolRouterInjectable = getInjectable({ + id: "open-url-using-protocol-router", + + instantiate: (di) => { + const lensProtocolRouterMain = di.inject(lensProtocolRouterMainInjectable); + + return { + run: ({ event, url }) => { + event.preventDefault(); + + lensProtocolRouterMain.route(url); + }, + }; + }, + + injectionToken: onOpenOfUrlInjectionToken, +}); + +export default openUrlUsingProtocolRouterInjectable; diff --git a/src/main/start-main-application/on-second-application-instance/implementations/setup-protocol-router-for-second-instance.injectable.ts b/src/main/start-main-application/on-second-application-instance/implementations/setup-protocol-router-for-second-instance.injectable.ts new file mode 100644 index 0000000000..4009a4630a --- /dev/null +++ b/src/main/start-main-application/on-second-application-instance/implementations/setup-protocol-router-for-second-instance.injectable.ts @@ -0,0 +1,37 @@ +/** + * 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 loggerInjectable from "../../../../common/logger.injectable"; +import lensProtocolRouterMainInjectable from "../../../protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable"; +import windowManagerInjectable from "../../../window-manager.injectable"; +import { onSecondApplicationInstanceInjectionToken } from "../on-second-application-instance-injection-token"; + +const setupProtocolRouterForSecondInstanceInjectable = getInjectable({ + id: "setup-protocol-router-for-second-instance", + + instantiate: (di) => { + const logger = di.inject(loggerInjectable); + const lensProtocolRouterMain = di.inject(lensProtocolRouterMainInjectable); + const windowManager = di.inject(windowManagerInjectable); + + return { + run: async ({ commandLineArguments }) => { + logger.debug("second-instance message"); + + for (const arg of commandLineArguments) { + if (arg.toLowerCase().startsWith("lens://")) { + lensProtocolRouterMain.route(arg); + } + } + + await windowManager.ensureMainWindow(); + }, + }; + }, + + injectionToken: onSecondApplicationInstanceInjectionToken, +}); + +export default setupProtocolRouterForSecondInstanceInjectable;