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).
22 lines (20 loc) • 958 B
text/typescript
import { DatabaseClient } from '../common/database';
import { ListenerConfig } from '../common/listener-config';
import { StoredTransactionalMessage } from './transactional-message';
/**
* Marks the message as handled by setting the processed_at date to the current date and time.
* It also increases the finished_attempts count by one.
* @param message The message to acknowledge.
* @param client The database client. Must be part of the transaction where the message handling changes are done.
* @param config The configuration settings that defines database schema.
*/
export const markMessageCompleted = async (
{ id }: StoredTransactionalMessage,
client: DatabaseClient,
{ settings }: Pick<ListenerConfig, 'settings'>,
): Promise<void> => {
await client.query(
/* sql */ `UPDATE ${settings.dbSchema}.${settings.dbTable} SET processed_at = clock_timestamp(), finished_attempts = finished_attempts + 1 WHERE id = $1`,
[id],
);
};