@axinom/mosaic-transactional-inbox-outbox
Version:
This library encapsulates the Mosaic based transactional inbox and outbox pattern
97 lines (91 loc) • 3.13 kB
text/typescript
/* 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;
};