import { pathToFileURL } from 'node:url'; import { readConfig } from './config.mjs'; import { openStore } from './db.mjs'; import { buildApp } from './app.mjs'; export async function startServer(env = process.env) { const config = readConfig(env); const store = openStore({ dbPath: config.dbPath }); let app; let stopping; const shutdown = () => { stopping ??= app.close().catch(() => { process.stderr.write('Server shutdown failed\n'); process.exitCode = 1; }); return stopping; }; try { app = await buildApp({ store, distRoot: config.distRoot, publicOrigin: config.publicOrigin }); app.addHook('onClose', async () => { process.removeListener('SIGTERM', shutdown); process.removeListener('SIGINT', shutdown); }); await app.listen({ host: config.host, port: config.port }); process.once('SIGTERM', shutdown); process.once('SIGINT', shutdown); } catch (error) { if (app) await app.close(); else store.close(); throw error; } return app; } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { startServer().catch(() => { process.stderr.write('Server startup failed; check configuration, private storage and build\n'); process.exitCode = 1; }); }