Add new injectable for create KubeJsonApi and JsonApi instances

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton committed 2022-10-04 17:55:30 -04:00
1 parent 5f612dd595
commit 4bef236f8c
7 files changed
+96 -51

No files matched your search

@@ -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 = <Data = JsonApiData, Params extends JsonApiParams<Data> = JsonApiParams<Data>>(config: JsonApiConfig, reqInit?: RequestInit) => JsonApi<Data, Params>;
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;
@@ -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<KubeObject, KubeJsonApiDataFor<KubeObject>>, apiClass = KubeApi) => {
const url = new URL(apiBase.config.serverAddress);
const request = new KubeJsonApi(dependencies, {
return (
cluster: CreateKubeApiForLocalClusterConfig,
kubeClass: KubeObjectConstructor<KubeObject, KubeJsonApiDataFor<KubeObject>>,
apiClass = KubeApi,
) => (
new apiClass({
objectConstructor: kubeClass,
request: createKubeJsonApi(
{
serverAddress: apiBase.config.serverAddress,
apiBase: apiKubePrefix,
debug: isDevelopment,
}, {
headers: {
"Host": `${cluster.metadata.uid}.localhost:${url.port}`,
"Host": `${cluster.metadata.uid}.localhost:${new URL(apiBase.config.serverAddress).port}`,
},
});
return new apiClass({
objectConstructor: kubeClass,
request,
});
};
},
),
})
);
},
});
@@ -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<KubeObject, KubeJsonApiDataFor<KubeObject>>, 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,
@@ -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}`,
},
});
};
{
headers: {
"Host": `${clusterId}.localhost:${new URL(apiBase.config.serverAddress).port}`,
},
},
);
},
});
@@ -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;
+3 -2
View File
@@ -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,
+11 -4
View File
@@ -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({
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,
});