UNPKG

@whook/whook

Version:

Build strong and efficient REST web services.

69 lines (60 loc) 2.05 kB
import { service, location } from 'knifecycle'; import { noop } from '../libs/utils.js'; import { type LogService } from 'common-services'; import { type WhookCronHandlerWrapper, type WhookCronHandler, } from '../types/crons.js'; import { type JsonValue } from 'type-fest'; import { applyHandlerWrappers } from '../libs/wrappers.js'; export type WhookCronsHandlersService = Record< string, WhookCronHandler<JsonValue> >; export type WhookCronsHandlersDependencies = { CRONS_WRAPPERS: WhookCronHandlerWrapper[]; log?: LogService; } & WhookCronsHandlersService; export default location( service(initCronsHandlers, 'CRONS_HANDLERS', ['CRONS_WRAPPERS', 'log']), import.meta.url, ); /** * Initialize the Whook cron handlers used to know which * cron to run for a given cron name. * @param {Object} services * The service dependencies * @param {Array} services.CRONS_WRAPPERS * An optional list of wrappers to inject * @param {Object} [services.log=noop] * An optional logging service * @param {Object} services.CRONS_HANDLERS * The rest is a hash of crons handlers mapped by name * @return {Promise<Function>} * A promise of the `CRONS_HANDLERS` hash. */ async function initCronsHandlers({ CRONS_WRAPPERS, log = noop, ...CRONS_HANDLERS }: WhookCronsHandlersDependencies): Promise<WhookCronsHandlersService> { const cronsHandlersCount = Object.keys(CRONS_HANDLERS).length; log( 'warning', `🏭 - Initializing the CRONS_HANDLERS service with ${cronsHandlersCount} handlers wrapped by ${CRONS_WRAPPERS.length} wrappers.`, ); if (!cronsHandlersCount) { log('warning', `🤷 - No crons handlers at all.`); } if (!CRONS_WRAPPERS.length) { return CRONS_HANDLERS; } const WRAPPED_CRONS_HANDLERS: WhookCronsHandlersService = {}; for (const cronHandlerName of Object.keys(CRONS_HANDLERS)) { WRAPPED_CRONS_HANDLERS[cronHandlerName] = await applyHandlerWrappers( CRONS_WRAPPERS, CRONS_HANDLERS[cronHandlerName], ); } return WRAPPED_CRONS_HANDLERS; }