diff --git a/src/common/fetch/create-headers.injectable.ts b/src/common/fetch/create-headers.injectable.ts new file mode 100644 index 0000000000..1947540a85 --- /dev/null +++ b/src/common/fetch/create-headers.injectable.ts @@ -0,0 +1,20 @@ +/** + * 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 { Headers, HeadersInit } from "node-fetch"; +import nodeFetchModuleInjectable from "./fetch-module.injectable"; + +export type CreateHeaders = (init?: HeadersInit) => Headers; + +const createHeadersInjectable = getInjectable({ + id: "create-headers", + instantiate: (di): CreateHeaders => { + const { Headers } = di.inject(nodeFetchModuleInjectable); + + return (init) => new Headers(init); + }, +}); + +export default createHeadersInjectable; diff --git a/src/common/fetch/fetch.injectable.ts b/src/common/fetch/fetch.injectable.ts index d4f51efe0d..e3a8dcacad 100644 --- a/src/common/fetch/fetch.injectable.ts +++ b/src/common/fetch/fetch.injectable.ts @@ -10,11 +10,7 @@ export type Fetch = (url: string, init?: RequestInit) => Promise; const fetchInjectable = getInjectable({ id: "fetch", - instantiate: (di): Fetch => { - const { default: fetch } = di.inject(nodeFetchModuleInjectable); - - return (url, init) => fetch(url, init); - }, + instantiate: (di): Fetch => di.inject(nodeFetchModuleInjectable).default, causesSideEffects: true, }); diff --git a/src/main/get-metrics.injectable.ts b/src/main/get-metrics.injectable.ts index 94eb9223e1..90d46c8371 100644 --- a/src/main/get-metrics.injectable.ts +++ b/src/main/get-metrics.injectable.ts @@ -5,6 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import FormData from "form-data"; import type { Cluster } from "../common/cluster/cluster"; +import { withTimeout } from "../common/fetch/timeout-controller"; import type { RequestMetricsParams } from "../common/k8s-api/endpoints/metrics.api/request-metrics.injectable"; import k8sRequestInjectable from "./k8s-request.injectable"; @@ -29,8 +30,10 @@ const getMetricsInjectable = getInjectable({ body.append(key, value); } + const controller = withTimeout(60 * 1000); // 1 minute timeout + return k8sRequest(cluster, metricsPath, { - timeout: 0, + signal: controller.signal, method: "POST", body, }); diff --git a/src/main/kubectl/kubectl.ts b/src/main/kubectl/kubectl.ts index e3d436c622..0e75a39eac 100644 --- a/src/main/kubectl/kubectl.ts +++ b/src/main/kubectl/kubectl.ts @@ -277,7 +277,7 @@ export class Kubectl { const response = await this.dependencies.fetch(this.url, { compress: true }); - if (!response.body || !response.body.readable) { + if (!response.body || !response.body.readable || response.status !== 200) { throw new Error("Body missing or not readable"); }