UNPKG

@arturwojnar/hermes-postgresql

Version:

Production-Ready TypeScript Outbox Pattern for PostgreSQL

47 lines (46 loc) 1.94 kB
import { Duration } from '@arturwojnar/hermes'; import { JSONValue, TransactionSql } from 'postgres'; import { AsyncOrSync } from 'ts-essentials'; import { HermesSql, MessageEnvelope, Stop } from '../common/types.js'; type HermesAsyncMessageEnvelope<Message> = { position: number; messageId: string; messageType: string; redeliveryCount: number; message: Message; }; type PublishOptions = { tx?: TransactionSql; }; type ConsumerCreationParams<Message> = { getSql: () => HermesSql; publish: (message: HermesAsyncMessageEnvelope<Message> | HermesAsyncMessageEnvelope<Message>[]) => AsyncOrSync<void> | never; consumerName: string; checkInterval?: Duration; waitAfterFailedPublish?: Duration; shouldDisposeOnSigterm?: boolean; onFailedPublish?: ErrorCallback; onDbError?: ErrorCallback; }; interface IAsyncOutboxConsumer<Message extends JSONValue> { send(message: MessageEnvelope<Message> | MessageEnvelope<Message>[], options: PublishOptions): Promise<void>; start(): Stop; stop(): Promise<void>; } declare class AsyncOutboxConsumer<Message extends JSONValue> implements IAsyncOutboxConsumer<Message> { private readonly _params; private readonly _checkInterval; private readonly _getSql; private _started; private _isProcessing; private _intervalId; constructor(_params: ConsumerCreationParams<Message>); send(message: MessageEnvelope<Message> | MessageEnvelope<Message>[], options?: PublishOptions): Promise<void>; start(): Stop; stop(): Promise<void>; private _publishOne; private _startPolling; private _processUndeliveredMessages; } declare const createAsyncOutboxConsumer: <Message extends JSONValue>(params: ConsumerCreationParams<Message>) => AsyncOutboxConsumer<Message>; export { AsyncOutboxConsumer, createAsyncOutboxConsumer, IAsyncOutboxConsumer, type ConsumerCreationParams, type HermesAsyncMessageEnvelope, };