From fdf616d5e8e87368e265771b98bf39c71794f317 Mon Sep 17 00:00:00 2001 From: Syco21 Date: Sat, 16 May 2026 17:22:36 +0200 Subject: [PATCH] Fix Vaultwarden 429: add 5min server cache, slow widget poll --- server/routes/vaultwarden.ts | 15 +++++++++++++-- src/components/widgets/VaultwardenWidget.tsx | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/server/routes/vaultwarden.ts b/server/routes/vaultwarden.ts index 2f3170c..d98f3d8 100644 --- a/server/routes/vaultwarden.ts +++ b/server/routes/vaultwarden.ts @@ -6,6 +6,10 @@ const router = Router() let vwCookie: string | null = null let vwCookieExpiry = 0 +interface CacheEntry { data: unknown; ts: number } +let statsCache: CacheEntry | null = null +const CACHE_TTL = 5 * 60 * 1000 // 5 minutes + async function getCookie(): Promise { if (vwCookie && Date.now() < vwCookieExpiry) return vwCookie @@ -38,6 +42,11 @@ router.get('/stats', async (_req, res) => { const host = process.env.VAULTWARDEN_HOST if (!host) { res.status(503).json({ error: 'VAULTWARDEN_HOST not configured' }); return } + if (statsCache && Date.now() - statsCache.ts < CACHE_TTL) { + res.json(statsCache.data) + return + } + const cookie = await getCookie() const [usersRes, diagRes] = await Promise.all([ @@ -59,7 +68,7 @@ router.get('/stats', async (_req, res) => { const users: any[] = usersRes.data ?? [] const diag = diagRes.data ?? {} - res.json({ + const result = { version: diag.version ?? null, signupsAllowed: diag.config?.signups_allowed ?? null, userCount: users.length, @@ -73,7 +82,9 @@ router.get('/stats', async (_req, res) => { cipherCount: u.cipherCount ?? u.cipher_count ?? null, attachCount: u.attachmentCount ?? u.attachment_count ?? null, })), - }) + } + statsCache = { data: result, ts: Date.now() } + res.json(result) } catch (err: unknown) { if (err instanceof Error && err.message.includes('login failed')) vwCookie = null const msg = err instanceof Error ? err.message : 'Unknown error' diff --git a/src/components/widgets/VaultwardenWidget.tsx b/src/components/widgets/VaultwardenWidget.tsx index 9fb5c04..748034a 100644 --- a/src/components/widgets/VaultwardenWidget.tsx +++ b/src/components/widgets/VaultwardenWidget.tsx @@ -18,7 +18,7 @@ function formatDate(iso: string | null): string { } export function VaultwardenWidget() { - const { data, loading, error } = useApi('/api/vaultwarden/stats') + const { data, loading, error } = useApi('/api/vaultwarden/stats', 5 * 60_000) return (