import { Observable } from 'rxjs';
import { Logger } from '@util';
import { EventEmitter } from 'stream';
export type Streamed<T, TMarker> = T & {
    __marker__?: TMarker;
};
export interface ICloudProvider<TEvent, TMarker> {
    get id(): string;
    get signal(): AbortSignal;
    get logger(): Logger;
    init(): Observable<this>;
    all(): Observable<TEvent>;
    stream(): Observable<TEvent>;
    store<T>(item: T): Observable<T>;
    unmarshall<T>(event: TEvent): Streamed<T, TMarker>;
}
export type CloudOptions = {
    signal?: AbortSignal;
    logger?: Logger;
};
export type Matcher<TEvent> = (event: TEvent) => boolean;
export declare class Abort extends AbortController {
    constructor(signal?: AbortSignal);
    abort(reason?: unknown): void;
}
export declare class StreamEvent extends EventEmitter<{
    start: [];
    end: [];
}> {
}
export declare abstract class CloudProvider<TEvent, TMarker> implements ICloudProvider<TEvent, TMarker> {
    readonly id: string;
    private static instances;
    private _events;
    private _init$?;
    private _stream$?;
    private _logger;
    private _signal;
    static from<Options extends CloudOptions, Provider extends ICloudProvider<unknown, unknown>>(this: new (id: string, options?: Options) => Provider, id: string, opts?: Options): Observable<Provider>;
    protected constructor(id: string, opts?: CloudOptions);
    get logger(): Logger;
    get signal(): AbortSignal;
    protected abstract _init(): Observable<this>;
    protected abstract _stream(all: boolean): Observable<TEvent[]>;
    protected abstract _store<T>(item: T): Observable<Matcher<TEvent>>;
    protected abstract _unmarshall<T>(event: TEvent): Streamed<T, unknown>;
    init(): Observable<this>;
    all(): Observable<TEvent>;
    stream(): Observable<TEvent>;
    store<T>(item: T): Observable<T>;
    unmarshall<T>(event: TEvent): Streamed<T, TMarker>;
}
export declare class RetryError extends Error {
    constructor(message: string);
}
export declare class FatalError extends Error {
    constructor(message: string);
}
//# sourceMappingURL=base.d.ts.map