import { MaybePromise } from '../utils/prioritizeable';
import { Deferred } from '../utils/promise-util';
import { Event } from '../utils/event';
import { Emitter } from '../utils/emitter';
import { Logger } from '../logger/logger-protocol';
export declare const ApplicationLifecycle: unique symbol;
export declare const Application: unique symbol;
export declare const ApplicationStateService: unique symbol;
export declare const ApplicationProps: unique symbol;
export interface ApplicationProps extends Record<string, any> {
}
export interface ApplicationLifecycle<T extends Application> {
    initialize?(): void;
    onStart?(app: T): MaybePromise<void>;
    onStop?(app: T): void;
}
export interface Application {
    start(): Promise<void>;
    stop(): Promise<void>;
}
export declare abstract class AbstractApplication implements Application {
    protected readonly lifecycles: ApplicationLifecycle<Application>[];
    abstract start(): Promise<void>;
    abstract stop(): Promise<void>;
    protected readonly logger: Logger;
    /**
     * Initialize and start the frontend application.
     */
    protected doStart(): Promise<void>;
    /**
     * Stop the frontend application lifecycle.
     */
    protected doStop(): void;
}
export declare type ApplicationState = 'init' | 'started' | 'ready' | 'stoped';
export interface ApplicationStateService<T extends string> {
    state: T;
    readonly onStateChanged: Event<T>;
    reachedState(state: T): Promise<void>;
    reachedAnyState(...states: T[]): Promise<void>;
}
export declare abstract class AbstractApplicationStateService<T extends string> implements ApplicationStateService<T> {
    private _state;
    protected deferred: {
        [state: string]: Deferred<void>;
    };
    protected readonly stateChanged: Emitter<T>;
    get state(): T;
    set state(state: T);
    get onStateChanged(): Event<T>;
    reachedState(state: T): Promise<void>;
    reachedAnyState(...states: T[]): Promise<void>;
}
//# sourceMappingURL=application-protocol.d.ts.map