import { JetStreamClient, JsMsg } from 'nats';
import { Types } from 'mongoose';
import { Event } from '../backend';
export interface EventConfig {
    clientGroup: string;
    js: JetStreamClient;
    parentIds: Types.ObjectId[];
    durableName?: string;
}
export interface SubscriberConfig {
    clientGroup: string;
    js: JetStreamClient;
    batch: number;
    expires: number;
}
interface ConvertedMsg<ParentEvent extends Event<string>> {
    jsMsg: JsMsg;
    parentId: Types.ObjectId;
    msgData: ParentEvent['data'];
    retryingDurableName: string | undefined;
}
export declare const getDurableName: (clientGroup: string, subject: string, i: number, type: 'PULL' | 'GROUP') => string;
export declare const convertJsMsg: <ParentEvent extends Event<string>>(jsMsg: JsMsg) => ConvertedMsg<ParentEvent>;
export declare const filterConvertedMsgs: (clientGroup: string, subject: string, eventHandlerOrder: number, showError: boolean, durableName: string, maxRetryCount: number) => <ParentEvent extends Event<string>>(args: ConvertedMsg<ParentEvent>) => boolean;
export declare const groupByFn: <T, K extends string | number | symbol>(list: T[], getKey: (item: T) => K) => T[][];
export interface SubscriberEvent<ParentEvent extends Event<string>> {
    input: ParentEvent['data'];
    ack: () => void;
    fail: (error: Error) => Promise<void>;
    config: EventConfig;
}
export interface SubscriberGroupedEvent<ParentEvent extends Event<string>> {
    inputs: ParentEvent['data'][];
    ack: () => void;
    fail: (error: Error) => Promise<void>;
    config: EventConfig;
}
export declare const autoAckOrFail: <T extends SubscriberEvent<Event<string>>>(fn: (args: {
    config: EventConfig;
    input: T["input"];
}) => any) => (events: T[]) => Promise<void[]>;
export declare const autoGroupAckOrFail: <T extends SubscriberGroupedEvent<Event<string>>>(fn: (args: {
    config: EventConfig;
    inputs: T["inputs"];
}) => any) => (events: T[]) => Promise<void[]>;
export {};
