alpha-command-bus
Version:
Very simple command bus implementation
41 lines (40 loc) • 1.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCommandHandlersFromObject = exports.CommandHandler = void 0;
require("reflect-metadata");
const CommandHandlerDescriptor_1 = require("./CommandHandlerDescriptor");
const is = require("predicates");
const COMMAND_METADATA = Symbol('alpha-command-bus');
// eslint-disable-next-line @typescript-eslint/naming-convention
function CommandHandler(filter) {
return (target, methodName, descriptor) => {
ensureMetadata(target).push({
predicate: CommandHandlerDescriptor_1.CommandHandlerDescriptor.filterToPredicate(filter),
methodName
});
};
}
exports.CommandHandler = CommandHandler;
function ensureMetadata(target) {
if (Reflect.hasMetadata(COMMAND_METADATA, target)) {
return Reflect.getMetadata(COMMAND_METADATA, target);
}
const metadata = [];
Reflect.defineMetadata(COMMAND_METADATA, metadata, target);
return metadata;
}
/**
* Returns command handlers registered with decorator in given object
*/
function getCommandHandlersFromObject(object) {
const references = Reflect.getMetadata(COMMAND_METADATA, object);
if (!references || references.length === 0) {
return [];
}
return references.map(entry => {
const method = object[entry.methodName];
is.assert(Function, `Property "${entry.methodName}" has to be a method`)(method);
return new CommandHandlerDescriptor_1.CommandHandlerDescriptor(entry.predicate, method.bind(object));
});
}
exports.getCommandHandlersFromObject = getCommandHandlersFromObject;