pg-transactional-outbox
Version:
A PostgreSQL based transactional outbox and inbox pattern implementation to support exactly once message processing (with at least once message delivery).
40 lines • 1.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.messageHandlerSelector = void 0;
const error_1 = require("../common/error");
const messageHandlerSelector = (messageHandlers) => {
const handlerSelector = Array.isArray(messageHandlers)
? createMessageHandlerDict(messageHandlers)
: messageHandlers;
return (message) => {
return selectMessageHandler(message, handlerSelector);
};
};
exports.messageHandlerSelector = messageHandlerSelector;
const createMessageHandlerDict = (messageHandlers) => {
const handlers = {};
for (const handler of messageHandlers) {
const key = getMessageHandlerKey(handler);
if (key in handlers) {
throw new error_1.TransactionalOutboxInboxError(`Only one message handler can handle one aggregate and message type. Multiple message handlers try to handle the aggregate type "${handler.aggregateType}" with the message type "${handler.messageType}".`, 'CONFLICTING_MESSAGE_HANDLERS');
}
handlers[key] = handler;
}
if (Object.keys(handlers).length === 0) {
throw new error_1.TransactionalOutboxInboxError('At least one message handler must be provided.', 'NO_MESSAGE_HANDLER_REGISTERED');
}
return handlers;
};
const selectMessageHandler = (message, handlerSelector) => {
if (isGeneralMessageHandler(handlerSelector)) {
return handlerSelector;
}
else {
return handlerSelector[getMessageHandlerKey(message)];
}
};
const getMessageHandlerKey = (h) => `${h.aggregateType}@${h.messageType}`;
function isGeneralMessageHandler(handlerSelector) {
return !!handlerSelector.handle;
}
//# sourceMappingURL=message-handler-selector.js.map