bb-inspired
Version:
Core library for BB-inspired NestJS backend
150 lines • 6.11 kB
JavaScript
"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