@piggly/fastify-chassis
Version:
An ESM/CommonJS toolkit to help you to do common operations in your back-end applications with Fastify and NodeJS.
141 lines • 3.96 kB
JavaScript
import { ServiceProvider } from '@piggly/ddd-toolkit';
import debug from 'debug';
/**
* @file Handle clean up check services.
* @copyright Piggly Lab 2024
*/
export class CleanUpService {
/**
* Handlers to check.
*
* @type {Map<string, () => Promise<boolean>>}
* @protected
* @memberof CleanUpService
* @since 5.2.0
* @author Caique Araujo <caique@piggly.com.br>
*/
handlers;
/**
* Constructor.
*
* @public
* @constructor
* @memberof CleanUpService
* @since 5.2.0
* @author Caique Araujo <caique@piggly.com.br>
*/
constructor() {
this.handlers = new Map();
}
/**
* Check all handlers.
*
* Handlers are executed in registration order by default, which allows
* controlling shutdown dependencies (e.g., stop workers before closing DB).
*
* @returns {Promise<{
* success: boolean;
* services: Record<string, boolean>;
* }>}
* @public
* @memberof CleanUpService
* @since 5.3.0
* @throws {Error} If any handler fails.
* @author Caique Araujo <caique@piggly.com.br>
*/
async clean() {
let success = true;
const services = {};
for (const [name, handler] of this.handlers) {
debug('app:cleanup:handler')(`cleaning up ${name}...`);
services[name] = await handler();
success = success && services[name];
debug('app:cleanup:handler')(`${name} responded with ${services[name]}`);
}
return {
services,
success,
};
}
/**
* Register a new handler.
*
* @param {string} name
* @param {() => Promise<boolean>} handler
* @public
* @memberof CleanUpService
* @since 5.2.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.
*
* Handlers are executed in registration order by default, which allows
* controlling shutdown dependencies (e.g., stop workers before closing DB).
*
* @returns {Promise<{
* success: boolean;
* services: Record<string, boolean>;
* }>}
* @public
* @memberof CleanUpService
* @since 5.3.0
* @author Caique Araujo <caique@piggly.com.br>
*/
async softClean() {
let success = true;
const services = {};
for (const [name, handler] of this.handlers) {
debug('app:cleanup:handler')(`cleaning up ${name}...`);
try {
services[name] = await handler();
}
catch (error) {
services[name] = false;
debug('app:cleanup:error')(`${name} failed to clean up`, error);
}
finally {
success = success && services[name];
debug('app:cleanup:handler')(`${name} responded with ${services[name]}`);
}
}
return {
services,
success,
};
}
/**
* Register application service.
*
* @param {CleanUpService} service
* @public
* @static
* @memberof CleanUpService
* @since 5.2.0
* @author Caique Araujo <caique@piggly.com.br>
*/
static register(service) {
if (ServiceProvider.has('CleanUpService')) {
return;
}
ServiceProvider.register('CleanUpService', service);
}
/**
* Resolve application service.
*
* @returns {CleanUpService}
* @throws {Error} If service is not registered.
* @public
* @static
* @memberof CleanUpService
* @since 5.2.0
* @author Caique Araujo <caique@piggly.com.br>
*/
static resolve() {
return ServiceProvider.resolve('CleanUpService');
}
}
//# sourceMappingURL=CleanUpService.js.map