UNPKG

@piggly/fastify-chassis

Version:

An ESM/CommonJS toolkit to help you to do common operations in your back-end applications with Fastify and NodeJS.

137 lines 3.69 kB
/* eslint-disable no-console */ import { ServiceProvider } from '@piggly/ddd-toolkit'; import debug from 'debug'; /** * @file Handle clean up check services. * @copyright Piggly Lab 2024 */ export class StartupService { /** * Handlers to check. * * @type {Map<string, () => Promise<boolean>>} * @protected * @memberof StartupService * @since 5.3.0 * @author Caique Araujo <caique@piggly.com.br> */ handlers; /** * Constructor. * * @public * @constructor * @memberof StartupService * @since 5.3.0 * @author Caique Araujo <caique@piggly.com.br> */ constructor() { this.handlers = new Map(); } /** * Register a new handler. * * @param {string} name * @param {() => Promise<boolean>} handler * @public * @memberof StartupService * @since 5.3.0 * @author Caique Araujo <caique@piggly.com.br> */ register(name, handler) { this.handlers.set(name, handler); } /** * Check all handlers. It will not throw any error. * * @returns {Promise<{ * success: boolean; * services: Record<string, boolean>; * }>} * @public * @memberof StartupService * @since 5.3.0 * @author Caique Araujo <caique@piggly.com.br> */ async softStart() { let success = true; const services = {}; for (const [name, handler] of this.handlers) { debug('app:startup:handler')(`starting ${name}...`); try { services[name] = await handler(); } catch (error) { services[name] = false; console.error(error); debug('app:startup:error')(`${name} failed to start`, error); } finally { success = success && services[name]; debug('app:startup:handler')(`${name} responded with ${services[name]}`); } } return { services, success, }; } /** * Check all handlers. * * @returns {Promise<{ * success: boolean; * services: Record<string, boolean>; * }>} * @public * @memberof StartupService * @since 5.3.0 * @throws {Error} If any handler fails. * @author Caique Araujo <caique@piggly.com.br> */ async start() { let success = true; const services = {}; for (const [name, handler] of this.handlers) { debug('app:startup:handler')(`starting ${name}...`); services[name] = await handler(); success = success && services[name]; debug('app:startup:handler')(`${name} responded with ${services[name]}`); } return { services, success, }; } /** * Register application service. * * @param {StartupService} service * @public * @static * @memberof StartupService * @since 5.3.0 * @author Caique Araujo <caique@piggly.com.br> */ static register(service) { if (ServiceProvider.has('StartupService')) { return; } ServiceProvider.register('StartupService', service); } /** * Resolve application service. * * @returns {StartupService} * @throws {Error} If service is not registered. * @public * @static * @memberof StartupService * @since 5.3.0 * @author Caique Araujo <caique@piggly.com.br> */ static resolve() { return ServiceProvider.resolve('StartupService'); } } //# sourceMappingURL=StartupService.js.map