UNPKG

bb-inspired

Version:

Core library for BB-inspired NestJS backend

150 lines 6.11 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var HookService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.HookService = void 0; const common_1 = require("@nestjs/common"); const logger_1 = require("../../utils/logger"); let HookService = HookService_1 = class HookService { constructor() { this.logger = new logger_1.AppLogger(HookService_1.name); this.hooks = new Map(); this.hookPoints = new Set(); this.registerCoreHookPoints(); } registerCoreHookPoints() { const coreHooks = [ 'onServerStart', 'onServerShutdown', 'onRequest', 'onResponse', 'onError', 'onAuthenticate', 'onAuthorize', 'beforeCrudOperation', 'afterCrudOperation', ]; for (const hook of coreHooks) { this.registerHookPoint(hook); } this.logger.verbose(`Registered ${coreHooks.length} core hook points`); } registerHookPoint(name) { if (this.hookPoints.has(name)) { return; } this.hookPoints.add(name); this.hooks.set(name, new Set()); this.logger.verbose(`Registered hook point: ${name}`); } hasHookPoint(name) { return this.hookPoints.has(name); } getHookPoints() { return Array.from(this.hookPoints); } registerHandler(hookName, handler) { if (!this.hookPoints.has(hookName)) { this.registerHookPoint(hookName); } this.hooks.get(hookName).add(handler); this.logger.verbose(`Registered handler for hook: ${hookName}`); } unregisterHandler(hookName, handler) { if (!this.hooks.has(hookName)) { return false; } const result = this.hooks.get(hookName).delete(handler); if (result) { this.logger.verbose(`Unregistered handler from hook: ${hookName}`); } return result; } async executeHook(hookName, data) { if (!this.hooks.has(hookName) || this.hooks.get(hookName).size === 0) { return []; } const handlers = Array.from(this.hooks.get(hookName)); const results = []; this.logger.verbose(`Executing hook: ${hookName} with ${handlers.length} handlers`, { metadata: { hookName, handlerCount: handlers.length } }); const context = { name: hookName, version: '1.0.0', config: {}, logger: this.logger, get: () => null, log: (message) => this.logger.log(message), error: (message, trace) => this.logger.error(message, trace), warn: (message) => this.logger.warn(message), debug: (message) => this.logger.debug(message), verbose: (message) => this.logger.verbose(message), emit: async () => Promise.resolve() }; for (const handler of handlers) { try { const result = await handler(data, context); if (result !== undefined && result !== null) { results.push(result); } } catch (error) { this.logger.error(`Error executing handler for hook ${hookName}: ${error.message}`, error.stack); } } return results; } async executeHookChain(hookName, initialData, initialResult) { if (!this.hooks.has(hookName) || this.hooks.get(hookName).size === 0) { return initialResult; } const handlers = Array.from(this.hooks.get(hookName)); let currentResult = initialResult; this.logger.verbose(`Executing hook chain: ${hookName} with ${handlers.length} handlers`, { metadata: { hookName, handlerCount: handlers.length } }); const context = { name: hookName, version: '1.0.0', config: {}, logger: this.logger, get: () => null, log: (message) => this.logger.log(message), error: (message, trace) => this.logger.error(message, trace), warn: (message) => this.logger.warn(message), debug: (message) => this.logger.debug(message), verbose: (message) => this.logger.verbose(message), emit: async () => Promise.resolve() }; for (const handler of handlers) { try { const hookResult = await handler({ data: initialData, result: currentResult, }, context); if (hookResult && hookResult.result !== undefined) { currentResult = hookResult.result; } if (hookResult && hookResult.break === true) { this.logger.verbose(`Hook chain ${hookName} broken by handler`); break; } } catch (error) { this.logger.error(`Error executing handler for hook chain ${hookName}: ${error.message}`, error.stack); } } return currentResult; } }; exports.HookService = HookService; exports.HookService = HookService = HookService_1 = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", []) ], HookService); //# sourceMappingURL=hook.service.js.map