UNPKG

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
"use strict"; 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