@arturwojnar/hermes-postgresql
Version:
Production-Ready TypeScript Outbox Pattern for PostgreSQL
47 lines (46 loc) • 1.94 kB
TypeScript
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, };