import { InjectionToken } from '@awesome-nodes/injection-factory';
import { EventArgs, IEvent, IEventDelegate } from '@awesome-nodes/object';
import { IDelegate } from '@awesome-nodes/object/model';
import { ObjectModel } from "./ObjectModel";
import { Subscription } from 'rxjs';
export interface IEventObserver<TSender extends ObjectModel, TEventArgs extends EventArgs = EventArgs> {
    next: IEvent<TSender, TEventArgs>;
    error?: (err: unknown) => void;
    complete?: () => void;
}
export interface IEventEmitter<TSender extends ObjectModel = ObjectModel, TEventArgs extends EventArgs = EventArgs> {
    new (async?: boolean): this;
    emit(delegate: IEventDelegate<TSender, TEventArgs>): void;
    subscribe(next?: (value: IEventDelegate<TSender, TEventArgs>) => void, error?: (error: unknown) => void, complete?: () => void): Subscription;
}
/**
 * Represents a simple event delegate used to encapsulate any web frontend framework event emitter object.
 * @template TSender, TEventArgs
 */
export declare class EventDelegate<TSender extends ObjectModel, TEventArgs extends EventArgs = EventArgs> implements IDelegate<TSender, TEventArgs> {
    protected _producer: TSender;
    private readonly _subscriptions;
    protected readonly _eventEmitter: IEventEmitter<TSender, TEventArgs>;
    /**
     * Returns the wen framework EventEmitter used only within angular components.
     * @access Any access from a view-model, model or service is not
     * permitted because it couples angular code to the object model.
     */
    get eventEmitter(): IEventEmitter<TSender, TEventArgs>;
    /**
     * Initializes this instance
     * @param {TSender} _producer The event producer to be used as `thisArg` for the command handler invocation.
     */
    constructor(_producer: TSender);
    /**
     * Subscribes to the underlying EventEmitter observable and delegates event
     * subscription to commend pattern style handler functions.
     * @param observer The next observer function or an event observer instance.
     * @param thisArg If provided, all observer functions are invoked on except the error observer.
     */
    subscribe(observer: IEvent<TSender, TEventArgs> | IEventObserver<TSender, TEventArgs>, thisArg?: object): Subscription;
    unsubscribe(observer: IEvent<TSender, TEventArgs> | IEventObserver<TSender, TEventArgs>): void;
    invoke(ea?: TEventArgs): void;
}
export declare const EVENT_EMITTER_TOKEN: InjectionToken<IEventEmitter>;
