@21jumpclick/service-messenger
Version:
Amqp lib to send and receive messages from different applications
90 lines • 3.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MetadataManager = void 0;
const event_1 = require("../event");
const helpers_1 = require("./helpers");
class MetadataManager {
constructor() {
this.metadata = new Map();
this.paramMetadata = new Map();
}
serializeParamMetadata(target, listener) {
return `${target.name}->${listener}`;
}
static instance() {
return metadataManager;
}
static registerEvent(event, target, listener) {
MetadataManager.instance().registerEvent(event, target, listener);
}
static registerParam(target, listener, index, param, options) {
MetadataManager.instance().registerParam(target, listener, index, param, options);
}
static trigger(eventName, args, options) {
MetadataManager.instance().trigger(eventName, args, options);
}
registerParam(target, listener, index, param, options) {
var _a;
const key = this.serializeParamMetadata(target, listener);
if (!this.paramMetadata.has(key)) {
this.paramMetadata.set(key, []);
}
(_a = this.paramMetadata.get(key)) === null || _a === void 0 ? void 0 : _a.push({ index, param, options });
}
registerEvent(event, target, listener) {
var _a;
if (!this.metadata.has(event)) {
this.metadata.set(event, []);
}
(_a = this.metadata.get(event)) === null || _a === void 0 ? void 0 : _a.push({ target, listener });
}
async trigger(eventName, args, options) {
const eventMetadata = this.metadata.get(eventName);
if (!eventMetadata) {
return;
}
const instances = eventMetadata.map(({ target, listener }) => {
var _a;
const instance = event_1.Messenger.getInstance().config.di.get(target);
const paramsOptions = this.paramMetadata.get(this.serializeParamMetadata(target, listener));
const params = [];
if (typeof paramsOptions === 'undefined') {
params.push(args);
}
else {
for (let o of paramsOptions.sort((a, b) => a.index - b.index)) {
switch (o.param) {
case 'message':
params.push((0, helpers_1.valueFromPath)(args, (_a = o.options) === null || _a === void 0 ? void 0 : _a.path));
break;
case 'origin':
params.push(options.origin);
break;
}
}
}
return {
instance,
listener,
params
};
});
const events = instances
.filter((meta) => !!meta.instance)
.map(async ({ instance, listener, params }) => await instance[listener].bind(instance, ...params).call());
try {
return await Promise.any(events);
}
catch (error) {
if (error instanceof AggregateError) {
throw error.errors.length === 1 ? error.errors[0] : error.errors;
}
else {
throw error;
}
}
}
}
exports.MetadataManager = MetadataManager;
const metadataManager = new MetadataManager();
//# sourceMappingURL=metadata.js.map