@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
74 lines (60 loc) • 1.77 kB
text/typescript
import { startCore } from './startCore';
import { IServiceConfig, BasicLogger } from './shared';
import { initializeLoggerOrFallback } from './setup/initializeLogger';
export function start(config: IServiceConfig) {
initializeLoggerOrFallback(config)
.then((logger) => {
startWithLoggerAndConfig(config, logger);
})
.catch(() => {
// logger initialization cannot throw
// this handler here is to supress warning
return;
});
}
let shutdownRequests = 0;
function startWithLoggerAndConfig(config: IServiceConfig, logger: BasicLogger) {
function handleError(exc: unknown) {
logger.error('💥 ', exc);
process.exit(1);
}
function finish() {
process.exitCode = 0;
}
async function run() {
process.setUncaughtExceptionCaptureCallback(handleError);
process.on('SIGINT', () => {
logger.log('\nShutting down due to SIGINT...\n');
shutdown().then(finish).catch(handleError);
shutdownRequests += 1;
if (shutdownRequests > 1) {
import('wtfnode')
.then((mod) => {
console.log('== Open Handles ==');
mod.dump();
console.log(' ');
})
.catch((err) => {
console.log(err);
});
}
if (shutdownRequests > 5) {
process.exit(1);
}
});
process.on('SIGTERM', () => {
logger.log('\nShutting down due to SIGTERM...\n');
shutdown().then(finish).catch(handleError);
});
const teardown = await startCore(config, undefined, logger);
let isShuttingDown = false;
const shutdown = async () => {
if (isShuttingDown) {
return;
}
isShuttingDown = true;
await teardown();
};
}
run().catch(handleError);
}