import EventEmitter from 'node:events';
import type { IMastraLogger } from '../../logger/index.js';
import { PubSub } from '../pubsub.js';
import type { LeaseProvider, PubSubDeliveryMode } from '../pubsub.js';
import type { Event, EventCallback, SubscribeOptions } from '../types.js';
export interface EventEmitterPubSubOptions {
    /**
     * Optional logger for surfacing batched-delivery errors. Falls back to
     * `console.error` when not provided.
     */
    logger?: IMastraLogger;
}
export declare class EventEmitterPubSub extends PubSub implements LeaseProvider {
    get supportedModes(): ReadonlyArray<PubSubDeliveryMode>;
    /**
     * `EventEmitterPubSub` is strictly in-process, so the `AckHandleBuffer`
     * queue it uses for batching shares the same lifetime as everything
     * else here. Nothing more durable is promised, and nothing less is
     * needed.
     */
    get supportsNativeBatching(): boolean;
    private emitter;
    private groups;
    private groupCounters;
    private groupListeners;
    private pendingNacks;
    private deliveryAttempts;
    private fanoutWrappers;
    private batchBuffers;
    private readonly logger?;
    constructor(existingEmitter?: EventEmitter, options?: EventEmitterPubSubOptions);
    /**
     * Debug-hostile silent failures are the default for emitter listeners.
     * Surface buffer-side errors on a single channel so they're at least visible.
     */
    private logBufferError;
    publish(topic: string, event: Omit<Event, 'id' | 'createdAt'>, _options?: {
        localOnly?: boolean;
    }): Promise<void>;
    subscribe(topic: string, cb: EventCallback, options?: SubscribeOptions): Promise<void>;
    unsubscribe(topic: string, cb: EventCallback): Promise<void>;
    flush(): Promise<void>;
    /**
     * Clean up all listeners during graceful shutdown.
     */
    close(): Promise<void>;
    private subscribeWithGroup;
    private deliverToGroup;
    private leases;
    acquireLease(key: string, owner: string, ttlMs: number): Promise<{
        acquired: boolean;
        owner?: string;
    }>;
    getLeaseOwner(key: string): Promise<string | undefined>;
    releaseLease(key: string, owner: string): Promise<void>;
    renewLease(key: string, owner: string, ttlMs: number): Promise<boolean>;
    transferLease(key: string, fromOwner: string, toOwner: string, ttlMs: number): Promise<boolean>;
}
//# sourceMappingURL=index.d.ts.map