@mbc-cqrs-serverless/core
Version:
CQRS and event base core
78 lines • 3.28 kB
JavaScript
;
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 EventBus_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventBus = void 0;
const common_1 = require("@nestjs/common");
const core_1 = require("@nestjs/core");
const decorators_1 = require("../decorators");
const exceptions_1 = require("../exceptions");
let EventBus = EventBus_1 = class EventBus {
constructor(moduleRef) {
this.moduleRef = moduleRef;
this.logger = new common_1.Logger(EventBus_1.name);
this.handlers = new Map();
}
execute(event) {
const eventId = this.getEventId(event);
const handlers = this.handlers.get(eventId);
if (!handlers || !handlers.length) {
throw new exceptions_1.EventHandlerNotFoundException(eventId);
}
return Promise.all(handlers.map((handler) => handler.execute(event)));
}
bind(handler, id) {
const handlers = this.handlers.get(id) || [];
handlers.push(handler);
this.handlers.set(id, handlers);
// this.logger.debug(
// 'bound handler for ' +
// id +
// ' => handlers size: ' +
// handlers.length +
// ' => total event size: ' +
// this.handlers.size,
// )
}
register(handlers = []) {
handlers.forEach((handler) => this.registerHandler(handler));
}
registerHandler(handler) {
const instance = this.moduleRef.get(handler, { strict: false });
if (!instance) {
return;
}
const target = this.reflectEventId(handler);
if (!target) {
throw new exceptions_1.InvalidEventHandlerException();
}
this.bind(instance, target);
}
getEventId(event) {
const { constructor: eventType } = Object.getPrototypeOf(event);
const eventMetadata = Reflect.getMetadata(decorators_1.EVENT_METADATA, eventType);
if (!eventMetadata) {
throw new exceptions_1.EventHandlerNotFoundException(eventType.name);
}
return eventMetadata.id;
}
reflectEventId(handler) {
const event = Reflect.getMetadata(decorators_1.EVENT_HANDLER_METADATA, handler);
const eventMetadata = Reflect.getMetadata(decorators_1.EVENT_METADATA, event);
return eventMetadata.id;
}
};
exports.EventBus = EventBus;
exports.EventBus = EventBus = EventBus_1 = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [core_1.ModuleRef])
], EventBus);
//# sourceMappingURL=event-bus.js.map