mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-08-08 09:54:26 +00:00
e5b1c7b22b
Removes backend/src/entitlements/ (registry, loadProvider, CommunityEntitlementProvider, types, headers, normalize) and the two abstraction-only tests. Relocates headers/normalize/types to services/license-*.ts. Swaps 22 consumer call sites from getEntitlementProvider() to LicenseService.getInstance(). Drops the Dockerfile install step plus PRO_PACKAGE_VERSION build-arg and github_token BuildKit secret in docker-publish.yml. Removes the now stale no-restricted-imports rule in backend/eslint.config.mjs. Net: 37 files changed, ~700 lines removed, no behavior change. Local dev no longer requires GitHub Packages auth to start the backend. Rationale and revisit conditions in docs/internal/adrs/2026-05-02-collapse-entitlement-provider.md.
69 lines
3.3 KiB
TypeScript
69 lines
3.3 KiB
TypeScript
import type { Server } from 'http';
|
|
import { DatabaseService } from '../services/DatabaseService';
|
|
import { LicenseService } from '../services/LicenseService';
|
|
import { MonitorService } from '../services/MonitorService';
|
|
import { AutoHealService } from '../services/AutoHealService';
|
|
import { DockerEventManager } from '../services/DockerEventManager';
|
|
import { ImageUpdateService } from '../services/ImageUpdateService';
|
|
import { SchedulerService } from '../services/SchedulerService';
|
|
import { MfaService } from '../services/MfaService';
|
|
import { MeshService } from '../services/MeshService';
|
|
import { BlueprintReconciler } from '../services/BlueprintReconciler';
|
|
|
|
/**
|
|
* Wire graceful shutdown handlers. Docker sends SIGTERM when the container
|
|
* stops; Ctrl-C sends SIGINT in dev. We allow in-flight requests to finish,
|
|
* then cleanly stop background services and close the SQLite connection
|
|
* before exiting. A 10 s force-exit timer guards against hung connections.
|
|
*/
|
|
export function installShutdownHandlers(server: Server): void {
|
|
const gracefulShutdown = (signal: string): void => {
|
|
console.log(`[Shutdown] ${signal} received - shutting down gracefully…`);
|
|
|
|
server.close(() => {
|
|
console.log('[Shutdown] HTTP server closed');
|
|
try { LicenseService.getInstance().destroy(); } catch (e) {
|
|
console.warn('[Shutdown] LicenseService cleanup failed:', (e as Error).message);
|
|
}
|
|
try { MonitorService.getInstance().stop(); } catch (e) {
|
|
console.warn('[Shutdown] MonitorService cleanup failed:', (e as Error).message);
|
|
}
|
|
try { AutoHealService.getInstance().stop(); } catch (e) { console.warn('[Shutdown] AutoHealService cleanup failed:', (e as Error).message); }
|
|
try { DockerEventManager.getInstance().stop(); } catch (e) {
|
|
console.warn('[Shutdown] DockerEventManager cleanup failed:', (e as Error).message);
|
|
}
|
|
try { ImageUpdateService.getInstance().stop(); } catch (e) {
|
|
console.warn('[Shutdown] ImageUpdateService cleanup failed:', (e as Error).message);
|
|
}
|
|
try { SchedulerService.getInstance().stop(); } catch (e) {
|
|
console.warn('[Shutdown] SchedulerService cleanup failed:', (e as Error).message);
|
|
}
|
|
try { MfaService.getInstance().stop(); } catch (e) {
|
|
console.warn('[Shutdown] MfaService cleanup failed:', (e as Error).message);
|
|
}
|
|
MeshService.getInstance().stop().catch((e) => {
|
|
console.warn('[Shutdown] MeshService cleanup failed:', (e as Error).message);
|
|
});
|
|
try { BlueprintReconciler.getInstance().stop(); } catch (e) {
|
|
console.warn('[Shutdown] BlueprintReconciler cleanup failed:', (e as Error).message);
|
|
}
|
|
try { DatabaseService.getInstance().flushAuditLogBuffer(); } catch (e) {
|
|
console.warn('[Shutdown] Audit log flush failed:', (e as Error).message);
|
|
}
|
|
try { DatabaseService.getInstance().getDb().close(); } catch (e) {
|
|
console.warn('[Shutdown] Database close failed:', (e as Error).message);
|
|
}
|
|
console.log('[Shutdown] Done - exiting');
|
|
process.exit(0);
|
|
});
|
|
|
|
setTimeout(() => {
|
|
console.error('[Shutdown] Timed out waiting for connections - forcing exit');
|
|
process.exit(1);
|
|
}, 10_000).unref();
|
|
};
|
|
|
|
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
}
|