diff --git a/src/renderer/port-forward/port-forward-dialog.tsx b/src/renderer/port-forward/port-forward-dialog.tsx index 6ba05ec1c4..f23a065f7c 100644 --- a/src/renderer/port-forward/port-forward-dialog.tsx +++ b/src/renderer/port-forward/port-forward-dialog.tsx @@ -29,9 +29,8 @@ import { Wizard, WizardStep } from "../components/wizard"; import { Input } from "../components/input"; import { Notifications } from "../components/notifications"; import { cssNames } from "../utils"; -import { addPortForward, modifyPortForward } from "./port-forward.store"; +import { addPortForward, modifyPortForward, openPortForward } from "./port-forward.store"; import type { ForwardedPort } from "./port-forward-item"; -import { openPortForward } from "."; interface Props extends Partial { } diff --git a/src/renderer/port-forward/port-forward.store.ts b/src/renderer/port-forward/port-forward.store.ts index 49ebee61d4..5c351d1ae0 100644 --- a/src/renderer/port-forward/port-forward.store.ts +++ b/src/renderer/port-forward/port-forward.store.ts @@ -28,6 +28,7 @@ import { apiBase } from "../api"; import { waitUntilFree } from "tcp-port-used"; import { Notifications } from "../components/notifications"; import logger from "../../common/logger"; +import { podsApi, serviceApi } from "../../common/k8s-api/endpoints"; export class PortForwardStore extends ItemStore { private storage = createStorage("port_forwards", undefined); @@ -56,9 +57,16 @@ export class PortForwardStore extends ItemStore { watch() { return disposer( reaction(() => this.portForwards, () => this.loadAll()), + this.reaper(), ); } + reaper() { + const interval = setInterval(async () => await Promise.all(this.portForwards.map(reapPortForward)), 30 * 1000); // every 30 seconds + + return () => clearInterval(interval); + } + loadAll() { return this.loadItems(async () => { let portForwards = await getPortForwards(); @@ -146,7 +154,7 @@ export async function removePortForward(portForward: ForwardedPort) { portForwardStore.reset(); } -export async function getPortForwards(): Promise { +async function getPortForwards(): Promise { try { const response = await apiBase.get(`/pods/port-forwards`); @@ -158,6 +166,20 @@ export async function getPortForwards(): Promise { } } +async function reapPortForward(portForward: ForwardedPort): Promise { + const api = { + "service": serviceApi, + "pod": podsApi + }[portForward.kind]; + + try { + await api.get({name: portForward.name, namespace: portForward.namespace}); + } catch(error) { + logger.debug(`port-forward resource ${portForward.name} not found, removing`, portForward); + removePortForward(portForward); + } +} + export function openPortForward(portForward: ForwardedPort) { const browseTo = `http://localhost:${portForward.forwardPort}`;