diff --git a/.eslintrc.js b/.eslintrc.js index 8e32a4dac8..2eef78f911 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -296,5 +296,22 @@ module.exports = { }], }, }, + { + files: [ + "src/**/*.ts", + "src/**/*.tsx", + ], + rules: { + "@typescript-eslint/no-restricted-imports": ["error", { + "paths": [ + { + "name": "node-fetch", + "allowTypeImports": true, + "message": "node-fetch@v3 is an ESM package and there cannot be directly imported.", + }, + ], + }], + }, + }, ], }; diff --git a/scripts/fix-canvas-deps.ts b/scripts/fix-canvas-deps.ts index 521437b37e..72f389d7d0 100644 --- a/scripts/fix-canvas-deps.ts +++ b/scripts/fix-canvas-deps.ts @@ -33,7 +33,7 @@ const canvasPrebuildUrl = canvasPrebuiltUrlBuilder(canvasVersion, nodeModuleVers const canvasPrebuilt = await fetch(canvasPrebuildUrl); -if (canvasPrebuilt.status !== 200) { +if (canvasPrebuilt.status !== 200 || !canvasPrebuilt.body) { throw new Error(`Failed to download prebuilt from ${canvasPrebuildUrl}: ${canvasPrebuilt.statusText}`); } diff --git a/src/main/k8s-request.injectable.ts b/src/main/k8s-request.injectable.ts index 898031850f..d7d7dd39e2 100644 --- a/src/main/k8s-request.injectable.ts +++ b/src/main/k8s-request.injectable.ts @@ -7,8 +7,13 @@ import type { Cluster } from "../common/cluster/cluster"; import { getInjectable } from "@ogre-tools/injectable"; import type { RequestInit } from "node-fetch"; import lensFetchInjectable from "../common/fetch/lens-fetch.injectable"; +import { withTimeout } from "../common/fetch/timeout-controller"; -export type K8sRequest = (cluster: Cluster, path: string, options?: RequestInit) => Promise; +export interface K8sRequestInit extends Omit { + timeout?: number; +} + +export type K8sRequest = (cluster: Cluster, path: string, init?: K8sRequestInit) => Promise; const k8sRequestInjectable = getInjectable({ id: "k8s-request", @@ -16,7 +21,14 @@ const k8sRequestInjectable = getInjectable({ instantiate: (di): K8sRequest => { const lensFetch = di.inject(lensFetchInjectable); - return async (cluster, path, init) => lensFetch(`/${cluster.id}${apiKubePrefix}${path}`, init); + return async (cluster, path, { timeout = 30_000, ...init } = {}) => { + const controller = withTimeout(timeout); + + return lensFetch(`/${cluster.id}${apiKubePrefix}${path}`, { + ...init, + signal: controller.signal, + }); + }; }, });