Compare commits

..
Author SHA1 Message Date
ajnart b650bffaa8 fix(request-handler): restore cacheTtlMs values lost in v1.69.0 refactor
The v1.69.0 caching refactor (f19033e0d) replaced the old Redis-backed
cached request handler with a simpler in-memory handler but dropped
all per-handler cacheDuration values, defaulting everything to 10s.
This caused widgets that previously had short cache durations (e.g.
health-monitoring at 5s, dns-hole at 5s) to refresh much less
frequently since the client polls every 30s.

Restores cacheTtlMs for all affected request handlers to match their
pre-v1.69.0 values. Also adds cacheTtlMs support to
createWidgetRequestHandler which was missing it.

Beszel handlers are intentionally left untouched as they have their
own cache handling.

Fixes #6268
2026-07-15 10:53:36 +02:00
3 changed files with 9 additions and 45 deletions

No files matched your search

@@ -29,7 +29,6 @@ import {
queryCacheDefaultGcTimeMs,
queryCacheDefaultRefetchIntervalMs,
queryCacheDefaultStaleTimeMs,
widgetRefetchIntervalOverrides,
} from "@homarr/api/query-cache";
import { createHeadersCallbackForSource, getTrpcUrl } from "@homarr/api/shared";
import { env } from "@homarr/common/env";
@@ -91,9 +90,6 @@ export function TRPCReactProvider(props: PropsWithChildren) {
},
});
client.setQueryDefaults([["widget"]], { refetchInterval: queryCacheDefaultRefetchIntervalMs });
for (const [path, interval] of Object.entries(widgetRefetchIntervalOverrides)) {
client.setQueryDefaults([path.split(".")], { refetchInterval: interval });
}
return client;
});
-38
View File
@@ -7,44 +7,6 @@ export const queryCacheMaxValueBytes = 1024 * 1024;
export const queryCacheStoragePrefix = "homarr-widget-query";
export const queryCacheBuster = "v2-superjson";
export const widgetRefetchIntervalOverrides: Record<string, number> = {
"widget.healthMonitoring": 5_000,
"widget.dnsHole": 5_000,
"widget.downloads": 5_000,
"widget.mediaServer": 5_000,
"widget.tracearr": 5_000,
"widget.firewall.getFirewallCpuStatus": 5_000,
"widget.firewall.getFirewallMemoryStatus": 15_000,
"widget.firewall.getFirewallInterfacesStatus": 30_000,
"widget.firewall.getFirewallVersionStatus": 3_600_000,
"widget.anchorNotes": 15_000,
"widget.coolify": 30_000,
"widget.umami.getActiveVisitors": 30_000,
"widget.umami": 300_000,
"widget.calendar": 60_000,
"widget.mediaRequests": 60_000,
"widget.smartHome": 60_000,
"widget.ups": 60_000,
"widget.uptimeKuma": 60_000,
"widget.weather": 60_000,
"widget.timetable": 60_000,
"widget.indexerManager": 300_000,
"widget.mediaRelease": 300_000,
"widget.mediaTranscoding": 300_000,
"widget.networkController": 300_000,
"widget.notifications": 300_000,
"widget.rssFeed": 300_000,
"widget.stockPrice": 300_000,
"widget.minecraft": 300_000,
"widget.vpn": 300_000,
"widget.archiveTeamWarrior": 300_000,
"widget.audiobookshelf": 600_000,
"widget.navidrome": 600_000,
"widget.speedtestTracker": 600_000,
"widget.immich": 900_000,
"widget.paperlessNgx": 900_000,
};
let activeQueryCacheBoardId: string | null = null;
export const setActiveQueryCacheBoardId = (boardId: string | null) => {
+9 -3
View File
@@ -184,8 +184,12 @@ export default function DockerWidget({ options, width, isEditMode }: WidgetCompo
const t = useScopedI18n("docker");
const isTiny = width <= 256;
const { data, refetch, isFetching } = clientApi.docker.getContainers.useQuery(undefined, {
refetchInterval: 20_000,
const {
data,
refetch,
isFetching,
} = clientApi.docker.getContainers.useQuery(undefined, {
refetchInterval: 30_000,
});
const containers = data?.containers ?? [];
const timestamp = useMemo(() => data?.timestamp ?? new Date(), [data?.timestamp]);
@@ -300,7 +304,9 @@ export default function DockerWidget({ options, width, isEditMode }: WidgetCompo
{t("table.totalMemory", { memory: formatBytes(totals.memory) })}
</Text>
<Tooltip label={t("table.refresh.lastUpdated", { when: relativeTime })}>
<Tooltip
label={t("table.refresh.lastUpdated", { when: relativeTime })}
>
<ActionIcon
size="sm"
variant="transparent"