diff --git a/src/common/fetch/lens-fetch.injectable.ts b/src/common/fetch/lens-fetch.injectable.ts new file mode 100644 index 0000000000..db0fdd5e15 --- /dev/null +++ b/src/common/fetch/lens-fetch.injectable.ts @@ -0,0 +1,33 @@ +/** + * 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 { Agent } from "https"; +import type { RequestInit, Response } from "node-fetch"; +import lensProxyPortInjectable from "../../main/lens-proxy/lens-proxy-port.injectable"; +import lensProxyCertificateInjectable from "../certificate/lens-proxy-certificate.injectable"; +import nodeFetchModuleInjectable from "./fetch-module.injectable"; + +export type LensFetch = (pathnameAndOrQuery: string, init?: Omit) => Promise; + +/** + * This fetch is for requesting items from the Lens Proxy and thus does not cause side effects + */ +const lensFetchInjectable = getInjectable({ + id: "lens-fetch", + instantiate: (di): LensFetch => { + const { default: fetch } = di.inject(nodeFetchModuleInjectable); + const lensProxyPort = di.inject(lensProxyPortInjectable); + const lensProxyCertificate = di.inject(lensProxyCertificateInjectable); + + return async (pathnameAndOrQuery, init) => fetch(`https://127.0.0.1:${lensProxyPort.get()}${pathnameAndOrQuery}`, { + ...init, + agent: new Agent({ + ca: lensProxyCertificate.get().cert, + }), + }); + }, +}); + +export default lensFetchInjectable; diff --git a/src/common/vars/build-semantic-version.injectable.ts b/src/common/vars/build-semantic-version.injectable.ts index 2a49327480..ec86cca9c0 100644 --- a/src/common/vars/build-semantic-version.injectable.ts +++ b/src/common/vars/build-semantic-version.injectable.ts @@ -7,7 +7,7 @@ import { getInjectionToken } from "@ogre-tools/injectable"; import { SemVer } from "semver"; import type { InitializableState } from "../initializable-state/create"; import { createInitializableState } from "../initializable-state/create"; -import type { RequestChannel } from "../utils/channel/request-channel-listener-injection-token"; +import type { RequestChannel } from "../utils/channel/request-channel"; export const buildVersionInjectionToken = getInjectionToken>({ id: "build-version-token", diff --git a/src/main/start-main-application/runnables/lens-proxy/request-app-version.injectable.ts b/src/main/start-main-application/runnables/lens-proxy/request-app-version.injectable.ts new file mode 100644 index 0000000000..5de79196fb --- /dev/null +++ b/src/main/start-main-application/runnables/lens-proxy/request-app-version.injectable.ts @@ -0,0 +1,21 @@ +/** + * 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 lensFetchInjectable from "../../../../common/fetch/lens-fetch.injectable"; + +const requestAppVersionViaProxyInjectable = getInjectable({ + id: "request-app-version-via-proxy", + instantiate: (di) => { + const lensFetch = di.inject(lensFetchInjectable); + + return async () => { + const response = await lensFetch("/version"); + + return (await response.json() as { version: string }).version; + }; + }, +}); + +export default requestAppVersionViaProxyInjectable; diff --git a/src/main/start-main-application/runnables/setup-lens-proxy.injectable.ts b/src/main/start-main-application/runnables/lens-proxy/setup.injectable.ts similarity index 59% rename from src/main/start-main-application/runnables/setup-lens-proxy.injectable.ts rename to src/main/start-main-application/runnables/lens-proxy/setup.injectable.ts index 333e3aed08..137bdaebda 100644 --- a/src/main/start-main-application/runnables/setup-lens-proxy.injectable.ts +++ b/src/main/start-main-application/runnables/lens-proxy/setup.injectable.ts @@ -3,18 +3,14 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import exitAppInjectable from "../../electron-app/features/exit-app.injectable"; -import lensProxyInjectable from "../../lens-proxy/lens-proxy.injectable"; -import loggerInjectable from "../../../common/logger.injectable"; -import lensProxyPortInjectable from "../../lens-proxy/lens-proxy-port.injectable"; -import isWindowsInjectable from "../../../common/vars/is-windows.injectable"; -import showErrorPopupInjectable from "../../electron-app/features/show-error-popup.injectable"; -import { beforeApplicationIsLoadingInjectionToken } from "../runnable-tokens/before-application-is-loading-injection-token"; -import buildVersionInjectable from "../../vars/build-version/build-version.injectable"; -import initializeBuildVersionInjectable from "../../vars/build-version/init.injectable"; -import lensProxyCertificateInjectable from "../../../common/certificate/lens-proxy-certificate.injectable"; -import fetchInjectable from "../../../common/fetch/fetch.injectable"; -import { Agent } from "https"; +import exitAppInjectable from "../../../electron-app/features/exit-app.injectable"; +import lensProxyInjectable from "../../../lens-proxy/lens-proxy.injectable"; +import loggerInjectable from "../../../../common/logger.injectable"; +import isWindowsInjectable from "../../../../common/vars/is-windows.injectable"; +import showErrorPopupInjectable from "../../../electron-app/features/show-error-popup.injectable"; +import { beforeApplicationIsLoadingInjectionToken } from "../../runnable-tokens/before-application-is-loading-injection-token"; +import buildVersionInjectable from "../../../vars/build-version/build-version.injectable"; +import requestAppVersionViaProxyInjectable from "./request-app-version.injectable"; const setupLensProxyInjectable = getInjectable({ id: "setup-lens-proxy", @@ -23,12 +19,10 @@ const setupLensProxyInjectable = getInjectable({ const lensProxy = di.inject(lensProxyInjectable); const exitApp = di.inject(exitAppInjectable); const logger = di.inject(loggerInjectable); - const lensProxyPort = di.inject(lensProxyPortInjectable); + const requestAppVersionViaProxy = di.inject(requestAppVersionViaProxyInjectable); const isWindows = di.inject(isWindowsInjectable); const showErrorPopup = di.inject(showErrorPopupInjectable); const buildVersion = di.inject(buildVersionInjectable); - const lensProxyCertificate = di.inject(lensProxyCertificateInjectable); - const fetch = di.inject(fetchInjectable); return { id: "setup-lens-proxy", @@ -45,13 +39,7 @@ const setupLensProxyInjectable = getInjectable({ // test proxy connection try { logger.info("🔎 Testing LensProxy connection ..."); - const versionResponse = await fetch(`https://127.0.0.1:${lensProxyPort.get()}/version`, { - agent: new Agent({ - ca: lensProxyCertificate.get()?.cert, - }), - }); - - const { version: versionFromProxy } = await versionResponse.json() as { version: string }; + const versionFromProxy = await requestAppVersionViaProxy(); if (buildVersion.get() !== versionFromProxy) { logger.error("Proxy server responded with invalid response"); @@ -78,7 +66,6 @@ const setupLensProxyInjectable = getInjectable({ return exitApp(); } }, - runAfter: di.inject(initializeBuildVersionInjectable), }; },