From e8519b6ac3465738cb7a09059d095fbdab94d36c Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Tue, 3 Mar 2026 23:02:38 +0700 Subject: [PATCH] fix(web-server): run usage cleanup during dashboard shutdown - pass server cleanup callback into graceful shutdown wiring - stop usage aggregator background sync when config server exits - prevent orphaned sync intervals across dashboard restarts --- src/commands/config-command.ts | 4 ++-- src/web-server/index.ts | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/commands/config-command.ts b/src/commands/config-command.ts index 28bb0dfa..611b553c 100644 --- a/src/commands/config-command.ts +++ b/src/commands/config-command.ts @@ -160,10 +160,10 @@ export async function handleConfigCommand(args: string[]): Promise { try { // Start server - const { server, wss } = await startServer({ port, dev: options.dev }); + const { server, wss, cleanup } = await startServer({ port, dev: options.dev }); // Setup graceful shutdown - setupGracefulShutdown(server, wss); + setupGracefulShutdown(server, wss, cleanup); const url = `http://localhost:${port}`; diff --git a/src/web-server/index.ts b/src/web-server/index.ts index fd64547c..61dd2941 100644 --- a/src/web-server/index.ts +++ b/src/web-server/index.ts @@ -13,6 +13,7 @@ import { WebSocketServer } from 'ws'; import { setupWebSocket } from './websocket'; import { createSessionMiddleware, authMiddleware } from './middleware/auth-middleware'; import { startAutoSyncWatcher, stopAutoSyncWatcher } from '../cliproxy/sync'; +import { shutdownUsageAggregator } from './usage/aggregator'; export interface ServerOptions { port: number; @@ -107,6 +108,7 @@ export async function startServer(options: ServerOptions): Promise { wsCleanup(); stopAutoSyncWatcher().catch(() => {}); + shutdownUsageAggregator(); }; // Start listening