Repository Public
1/** Entry point: load `AOS_ENV_FILE`, validate config, migrate (kernel), build, listen, shut down gracefully. */2import { buildServer } from './app.js';3import { loadConfig } from './config.js';4import { loadEnvFile } from './env-file.js';5import { kernelMigrate, loadKernel } from './kernel-adapter.js';6import { loadProviders } from './providers-adapter.js';78async function main(): Promise<void> {9 loadEnvFile();10 const config = loadConfig();11 await kernelMigrate(config.databaseUrl);12 const kernel = loadKernel({ databaseUrl: config.databaseUrl, dataDir: config.dataDir });13 const server = await buildServer(config, { kernel: kernel.port, providers: loadProviders() });14 await server.app.listen({ port: config.port, host: config.host });15 await server.startBackground();1617 let closing = false;18 const shutdown = (signal: string): void => {19 if (closing) return;20 closing = true;21 server.app.log.info({ signal }, 'shutting down');22 const force = setTimeout(() => process.exit(1), 10_000);23 force.unref();24 // Stop accepting, close WebSockets with 1001, end the pool.25 server26 .close()27 .then(() => kernel.close())28 .then(29 () => process.exit(0),30 () => process.exit(1),31 );32 };33 process.on('SIGTERM', () => shutdown('SIGTERM'));34 process.on('SIGINT', () => shutdown('SIGINT'));35}3637main().catch((err: unknown) => {38 // Configuration / startup errors only: messages never contain secret values.39 console.error((err as Error).message);40 process.exit(1);41});42