diff --git a/src/common/k8s-api/create-json-api.injectable.ts b/src/common/k8s-api/create-json-api.injectable.ts new file mode 100644 index 0000000000..aa05a5c157 --- /dev/null +++ b/src/common/k8s-api/create-json-api.injectable.ts @@ -0,0 +1,26 @@ +/** + * 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 type { RequestInit } from "node-fetch"; +import fetchInjectable from "../fetch/fetch.injectable"; +import loggerInjectable from "../logger.injectable"; +import type { JsonApiConfig, JsonApiData, JsonApiDependencies, JsonApiParams } from "./json-api"; +import { JsonApi } from "./json-api"; + +export type CreateJsonApi = = JsonApiParams>(config: JsonApiConfig, reqInit?: RequestInit) => JsonApi; + +const createJsonApiInjectable = getInjectable({ + id: "create-json-api", + instantiate: (di): CreateJsonApi => { + const deps: JsonApiDependencies = { + fetch: di.inject(fetchInjectable), + logger: di.inject(loggerInjectable), + }; + + return (config, reqInit) => new JsonApi(deps, config, reqInit); + }, +}); + +export default createJsonApiInjectable; diff --git a/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts b/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts index 761c2b3661..e7509dcbc7 100644 --- a/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts +++ b/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts @@ -3,15 +3,12 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import fetchInjectable from "../fetch/fetch.injectable"; -import loggerInjectable from "../logger.injectable"; import { apiKubePrefix } from "../vars"; import isDevelopmentInjectable from "../vars/is-development.injectable"; import { apiBaseInjectionToken } from "./api-base"; -import type { JsonApiDependencies } from "./json-api"; +import createKubeJsonApiInjectable from "./create-kube-json-api.injectable"; import type { KubeApiOptions } from "./kube-api"; import { KubeApi } from "./kube-api"; -import { KubeJsonApi } from "./kube-json-api"; import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "./kube-object"; export interface CreateKubeApiForLocalClusterConfig { @@ -38,28 +35,28 @@ const createKubeApiForClusterInjectable = getInjectable({ instantiate: (di): CreateKubeApiForCluster => { const apiBase = di.inject(apiBaseInjectionToken); const isDevelopment = di.inject(isDevelopmentInjectable); - const dependencies: JsonApiDependencies = { - fetch: di.inject(fetchInjectable), - logger: di.inject(loggerInjectable), - }; + const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - return (cluster: CreateKubeApiForLocalClusterConfig, kubeClass: KubeObjectConstructor>, apiClass = KubeApi) => { - const url = new URL(apiBase.config.serverAddress); - const request = new KubeJsonApi(dependencies, { - serverAddress: apiBase.config.serverAddress, - apiBase: apiKubePrefix, - debug: isDevelopment, - }, { - headers: { - "Host": `${cluster.metadata.uid}.localhost:${url.port}`, - }, - }); - - return new apiClass({ + return ( + cluster: CreateKubeApiForLocalClusterConfig, + kubeClass: KubeObjectConstructor>, + apiClass = KubeApi, + ) => ( + new apiClass({ objectConstructor: kubeClass, - request, - }); - }; + request: createKubeJsonApi( + { + serverAddress: apiBase.config.serverAddress, + apiBase: apiKubePrefix, + debug: isDevelopment, + }, { + headers: { + "Host": `${cluster.metadata.uid}.localhost:${new URL(apiBase.config.serverAddress).port}`, + }, + }, + ), + }) + ); }, }); diff --git a/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts b/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts index 3a3d2204d3..d11b7ae34b 100644 --- a/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts +++ b/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts @@ -6,13 +6,10 @@ import { getInjectable } from "@ogre-tools/injectable"; import type { AgentOptions } from "https"; import { Agent } from "https"; import type { RequestInit } from "node-fetch"; -import fetchInjectable from "../fetch/fetch.injectable"; -import loggerInjectable from "../logger.injectable"; import isDevelopmentInjectable from "../vars/is-development.injectable"; -import type { JsonApiDependencies } from "./json-api"; +import createKubeJsonApiInjectable from "./create-kube-json-api.injectable"; import type { KubeApiOptions } from "./kube-api"; import { KubeApi } from "./kube-api"; -import { KubeJsonApi } from "./kube-json-api"; import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "./kube-object"; export interface CreateKubeApiForRemoteClusterConfig { @@ -52,10 +49,7 @@ const createKubeApiForRemoteClusterInjectable = getInjectable({ id: "create-kube-api-for-remote-cluster", instantiate: (di): CreateKubeApiForRemoteCluster => { const isDevelopment = di.inject(isDevelopmentInjectable); - const dependencies: JsonApiDependencies = { - fetch: di.inject(fetchInjectable), - logger: di.inject(loggerInjectable), - }; + const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); return (config: CreateKubeApiForRemoteClusterConfig, kubeClass: KubeObjectConstructor>, apiClass = KubeApi) => { const reqInit: RequestInit = {}; @@ -86,7 +80,7 @@ const createKubeApiForRemoteClusterInjectable = getInjectable({ } const token = config.user.token; - const request = new KubeJsonApi(dependencies, { + const request = createKubeJsonApi({ serverAddress: config.cluster.server, apiBase: "", debug: isDevelopment, diff --git a/src/common/k8s-api/create-kube-json-api-for-cluster.injectable.ts b/src/common/k8s-api/create-kube-json-api-for-cluster.injectable.ts index dd4a25be5b..c74a5a491d 100644 --- a/src/common/k8s-api/create-kube-json-api-for-cluster.injectable.ts +++ b/src/common/k8s-api/create-kube-json-api-for-cluster.injectable.ts @@ -3,12 +3,10 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import fetchInjectable from "../fetch/fetch.injectable"; -import loggerInjectable from "../logger.injectable"; import { apiKubePrefix, isDebugging } from "../vars"; import { apiBaseInjectionToken } from "./api-base"; -import type { JsonApiDependencies } from "./json-api"; -import { KubeJsonApi } from "./kube-json-api"; +import createKubeJsonApiInjectable from "./create-kube-json-api.injectable"; +import type { KubeJsonApi } from "./kube-json-api"; export type CreateKubeJsonApiForCluster = (clusterId: string) => KubeJsonApi; @@ -16,24 +14,20 @@ const createKubeJsonApiForClusterInjectable = getInjectable({ id: "create-kube-json-api-for-cluster", instantiate: (di): CreateKubeJsonApiForCluster => { const apiBase = di.inject(apiBaseInjectionToken); - const dependencies: JsonApiDependencies = { - fetch: di.inject(fetchInjectable), - logger: di.inject(loggerInjectable), - }; + const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - return (clusterId) => { - const url = new URL(apiBase.config.serverAddress); - - return new KubeJsonApi(dependencies, { + return (clusterId) => createKubeJsonApi( + { serverAddress: apiBase.config.serverAddress, apiBase: apiKubePrefix, debug: isDebugging, - }, { + }, + { headers: { - "Host": `${clusterId}.localhost:${url.port}`, + "Host": `${clusterId}.localhost:${new URL(apiBase.config.serverAddress).port}`, }, - }); - }; + }, + ); }, }); diff --git a/src/common/k8s-api/create-kube-json-api.injectable.ts b/src/common/k8s-api/create-kube-json-api.injectable.ts new file mode 100644 index 0000000000..93de5a0d21 --- /dev/null +++ b/src/common/k8s-api/create-kube-json-api.injectable.ts @@ -0,0 +1,26 @@ +/** + * 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 type { RequestInit } from "node-fetch"; +import fetchInjectable from "../fetch/fetch.injectable"; +import loggerInjectable from "../logger.injectable"; +import type { JsonApiConfig, JsonApiDependencies } from "./json-api"; +import { KubeJsonApi } from "./kube-json-api"; + +export type CreateKubeJsonApi = (config: JsonApiConfig, reqInit?: RequestInit) => KubeJsonApi; + +const createKubeJsonApiInjectable = getInjectable({ + id: "create-kube-json-api", + instantiate: (di): CreateKubeJsonApi => { + const dependencies: JsonApiDependencies = { + fetch: di.inject(fetchInjectable), + logger: di.inject(loggerInjectable), + }; + + return (config, reqInit) => new KubeJsonApi(dependencies, config, reqInit); + }, +}); + +export default createKubeJsonApiInjectable; diff --git a/src/main/k8s/api-base.injectable.ts b/src/main/k8s/api-base.injectable.ts index 99b4cb9729..8761223cc6 100644 --- a/src/main/k8s/api-base.injectable.ts +++ b/src/main/k8s/api-base.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { apiBaseInjectionToken } from "../../common/k8s-api/api-base"; -import { JsonApi } from "../../common/k8s-api/json-api"; +import createJsonApiInjectable from "../../common/k8s-api/create-json-api.injectable"; import { apiPrefix, isDebugging } from "../../common/vars"; import isDevelopmentInjectable from "../../common/vars/is-development.injectable"; import lensProxyPortInjectable from "../lens-proxy/lens-proxy-port.injectable"; @@ -13,8 +13,9 @@ const apiBaseInjectable = getInjectable({ id: "api-base", instantiate: (di) => { const proxyPort = di.inject(lensProxyPortInjectable); + const createJsonApi = di.inject(createJsonApiInjectable); - return new JsonApi({ + return createJsonApi({ serverAddress: `http://127.0.0.1:${proxyPort.get()}`, apiBase: apiPrefix, debug: di.inject(isDevelopmentInjectable) || isDebugging, diff --git a/src/renderer/k8s/api-base.injectable.ts b/src/renderer/k8s/api-base.injectable.ts index f48a1d8fa2..55039a7b61 100644 --- a/src/renderer/k8s/api-base.injectable.ts +++ b/src/renderer/k8s/api-base.injectable.ts @@ -4,21 +4,28 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { apiBaseInjectionToken } from "../../common/k8s-api/api-base"; -import { JsonApi } from "../../common/k8s-api/json-api"; +import createJsonApiInjectable from "../../common/k8s-api/create-json-api.injectable"; import { apiPrefix, isDebugging } from "../../common/vars"; import isDevelopmentInjectable from "../../common/vars/is-development.injectable"; const apiBaseInjectable = getInjectable({ id: "api-base", - instantiate: (di) => new JsonApi({ - serverAddress: `http://127.0.0.1:${window.location.port}`, - apiBase: apiPrefix, - debug: di.inject(isDevelopmentInjectable) || isDebugging, - }, { - headers: { - "Host": window.location.host, - }, - }), + instantiate: (di) => { + const createJsonApi = di.inject(createJsonApiInjectable); + + return createJsonApi( + { + serverAddress: `http://127.0.0.1:${window.location.port}`, + apiBase: apiPrefix, + debug: di.inject(isDevelopmentInjectable) || isDebugging, + }, + { + headers: { + "Host": window.location.host, + }, + }, + ); + }, injectionToken: apiBaseInjectionToken, });