UNPKG

@axinom/mosaic-transactional-inbox-outbox

Version:

This library encapsulates the Mosaic based transactional inbox and outbox pattern

97 lines (91 loc) 3.13 kB
/* eslint-disable @typescript-eslint/explicit-function-return-type */ import { Broker } from '@axinom/mosaic-message-bus'; import { GeneralMessageHandler, PollingListenerConfig, PollingMessageStrategies, ReplicationListenerConfig, ReplicationMessageStrategies, StoredTransactionalMessage, initializePollingMessageListener, initializeReplicationMessageListener, } from 'pg-transactional-outbox'; import { InboxOutboxLogger } from '../common'; import { TransactionalLogMapper } from '../transactional-log-mapper'; import { RabbitMqOutboxMetadata } from './setup-outbox-storage'; const setupRabbitMqPublisher = (broker: Broker): GeneralMessageHandler => { return { handle: async (message: StoredTransactionalMessage): Promise<void> => { // Publish a message const { envelopeOverrides, options, action } = message.metadata as RabbitMqOutboxMetadata; (action === 'command' ? broker.publishCommand : broker.publishEvent).call( broker, message.aggregateId, { aggregateType: message.aggregateType, messageType: message.messageType, }, message.payload, envelopeOverrides, options, ); }, }; }; /** * Setup the transactional outbox listener to send messages. * @param listenerConfig The service configurations * @param broker RabbitMQ based messaging broker * @param logger A service-common library based logger instance * @param config A service-common library based config object * @param strategies Optional strategies to customize the outbox message processing * @returns shutdown action to stop the outbox listener */ export const setupReplicationOutboxListener = ( listenerConfig: ReplicationListenerConfig, broker: Broker, logger: InboxOutboxLogger, config: { logLevel: string }, strategies?: ReplicationMessageStrategies, ): (() => Promise<void>) => { const transactionalLogger = new TransactionalLogMapper( logger, config.logLevel, ); const [shutdown] = initializeReplicationMessageListener( listenerConfig, setupRabbitMqPublisher(broker), transactionalLogger, strategies, ); return shutdown; }; /** * Setup the transactional outbox listener to send messages. * @param listenerConfig The service configurations * @param broker RabbitMQ based messaging broker * @param logger A service-common library based logger instance * @param config A service-common library based config object * @param strategies Optional strategies to customize the outbox message processing * @returns shutdown action to stop the outbox listener */ export const setupPollingOutboxListener = ( listenerConfig: PollingListenerConfig, broker: Broker, logger: InboxOutboxLogger, config: { logLevel: string }, strategies?: PollingMessageStrategies, ): (() => Promise<void>) => { const transactionalLogger = new TransactionalLogMapper( logger, config.logLevel, ); const [shutdown] = initializePollingMessageListener( listenerConfig, setupRabbitMqPublisher(broker), transactionalLogger, strategies, ); return shutdown; };