From 0591c27b3cd78b8b7360fdd682459c7c3051517b Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 11 Aug 2022 08:37:43 -0400 Subject: [PATCH] Fix crash on load due to circular dependency Signed-off-by: Sebastian Malton --- .../create-shell-session.injectable.ts | 3 +-- .../node-shell-session/open.injectable.ts | 17 +++++++---------- src/renderer/k8s/api-kube.injectable.ts | 9 ++++++--- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/shell-session/create-shell-session.injectable.ts b/src/main/shell-session/create-shell-session.injectable.ts index 6af65dc908..49ba44cb67 100644 --- a/src/main/shell-session/create-shell-session.injectable.ts +++ b/src/main/shell-session/create-shell-session.injectable.ts @@ -22,11 +22,10 @@ const openShellSessionInjectable = getInjectable({ instantiate: (di): OpenShellSession => { const openLocalShellSession = di.inject(openLocalShellSessionInjectable); - const openNodeShellSession = di.inject(openNodeShellSessionInjectable); return ({ nodeName, ...args }) => ( nodeName - ? openNodeShellSession({ nodeName, ...args }) + ? di.inject(openNodeShellSessionInjectable, { nodeName, ...args }) : openLocalShellSession(args) ); }, diff --git a/src/main/shell-session/node-shell-session/open.injectable.ts b/src/main/shell-session/node-shell-session/open.injectable.ts index e0b5ddb65c..9bc418d812 100644 --- a/src/main/shell-session/node-shell-session/open.injectable.ts +++ b/src/main/shell-session/node-shell-session/open.injectable.ts @@ -2,7 +2,7 @@ * 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 { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; import type { Cluster } from "../../../common/cluster/cluster"; import type WebSocket from "ws"; import createKubectlInjectable from "../../kubectl/create-kubectl.injectable"; @@ -20,11 +20,9 @@ export interface NodeShellSessionArgs { nodeName: string; } -export type OpenNodeShellSession = (args: NodeShellSessionArgs) => Promise; - const openNodeShellSessionInjectable = getInjectable({ id: "open-node-shell-session", - instantiate: (di): OpenNodeShellSession => { + instantiate: (di, params: NodeShellSessionArgs) => { const createKubectl = di.inject(createKubectlInjectable); const dependencies: NodeShellSessionDependencies = { isMac: di.inject(isMacInjectable), @@ -32,14 +30,13 @@ const openNodeShellSessionInjectable = getInjectable({ logger: di.inject(loggerInjectable), createKubeJsonApiForCluster: di.inject(createKubeJsonApiForClusterInjectable), }; + const kubectl = createKubectl(params.cluster.version); + const session = new NodeShellSession(dependencies, { kubectl, ...params }); - return (args) => { - const kubectl = createKubectl(args.cluster.version); - const session = new NodeShellSession(dependencies, { kubectl, ...args }); - - return session.open(); - }; + return session.open(); }, + // NOTE: this must be transient to bypass the circular dependency of `createKubeJsonApiForClusterInjectable` on the lens proxy port + lifecycle: lifecycleEnum.transient, }); export default openNodeShellSessionInjectable; diff --git a/src/renderer/k8s/api-kube.injectable.ts b/src/renderer/k8s/api-kube.injectable.ts index f617a10ce6..e63fcb83ab 100644 --- a/src/renderer/k8s/api-kube.injectable.ts +++ b/src/renderer/k8s/api-kube.injectable.ts @@ -5,17 +5,20 @@ import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { onApiError } from "../api/on-api-error"; -import { apiKubePrefix, isDevelopment } from "../../common/vars"; +import { apiKubePrefix } from "../../common/vars"; import { apiKubeInjectionToken } from "../../common/k8s-api/api-kube"; import { storesAndApisCanBeCreatedInjectionToken } from "../../common/k8s-api/stores-apis-can-be-created.token"; -import { KubeJsonApi } from "../../common/k8s-api/kube-json-api"; +import createKubeJsonApiInjectable from "../../common/k8s-api/create-kube-json-api.injectable"; +import isDevelopmentInjectable from "../../common/vars/is-development.injectable"; const apiKubeInjectable = getInjectable({ id: "api-kube", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "apiKube is only available in certain environments"); + const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); + const isDevelopment = di.inject(isDevelopmentInjectable); - const apiKube = new KubeJsonApi({ + const apiKube = createKubeJsonApi({ serverAddress: `http://127.0.0.1:${window.location.port}`, apiBase: apiKubePrefix, debug: isDevelopment,