import * as _ from 'lodash';
import * as EventEmitter from 'events';
import * as Docker from 'dockerode';
import * as streamModule from 'stream';
import type { Application, BalenaSDK, DeviceType } from 'balena-sdk';
declare class BufferBackedWritableStream extends streamModule.Writable {
    chunks: Buffer[];
    _write(chunk: any, _enc: any, next: any): void;
    getData(): Buffer<ArrayBuffer>;
}
type Layer = {
    digest: any;
    size: number;
};
type Manifest = {
    manifest: {
        layers: Layer[];
    };
    imageLocation: string;
};
type Image = {
    is_stored_at__image_location: string;
    image_size: string;
};
interface ImageInfo {
    preloaded_builds: string[];
    supervisor_version: string;
    free_space: number;
    config: {
        deviceType: string;
    };
    balena_os_version: string;
}
export declare const CONTAINER_NAME = "balena-image-preloader";
export declare const applicationExpandOptions: {
    owns__release: {
        $select: ("id" | "commit" | "composition" | "end_timestamp")[];
        $expand: {
            release_image: {
                $select: "image"[];
                $expand: {
                    image: {
                        $select: ("is_stored_at__image_location" | "image_size")[];
                    };
                };
            };
        };
        $filter: {
            status: "success";
        };
        $orderby: ({
            end_timestamp: "desc";
            id?: undefined;
        } | {
            id: "desc";
            end_timestamp?: undefined;
        })[];
    };
};
declare const createContainer: (docker: Docker, image: string, splashImage: string | undefined, dockerPort: number, proxy: string) => Promise<Docker.Container>;
export declare class Preloader extends EventEmitter {
    docker: Docker;
    appId: number | string | undefined;
    commit: string | undefined;
    image: string;
    splashImage: string | undefined;
    proxy: any;
    dontCheckArch: boolean;
    pinDevice: boolean;
    certificates: string[];
    additionalSpace: number | null;
    application: any;
    stdin: any;
    stdout: streamModule.PassThrough;
    stderr: streamModule.PassThrough;
    bufferedStderr: BufferBackedWritableStream;
    dockerPort: any;
    container: Awaited<ReturnType<typeof createContainer>> | undefined;
    state: any;
    freeSpace: number | undefined;
    preloadedBuilds: string[] | undefined;
    supervisorVersion: string | undefined;
    balenaOSVersion: string | undefined;
    config: ImageInfo['config'] | undefined;
    deviceTypes: DeviceType[] | undefined;
    balena: BalenaSDK;
    constructor(balena: BalenaSDK | undefined, docker: Docker, appId: number | string | undefined, commit: string | undefined, image: string, splashImage: string | undefined, proxy: any, dontCheckArch: boolean, pinDevice?: boolean, certificates?: string[], additionalSpace?: number | null);
    _build(): Promise<void>;
    _fetchDeviceTypes(): Promise<void>;
    _runWithSpinner<T>(name: string, fn: () => T | Promise<T>): Promise<T>;
    _prepareErrorHandler(): void;
    _runCommand(command: string, parameters: {
        [name: string]: any;
    }): Promise<unknown>;
    _startSpinner(name: any): void;
    _stopSpinner(name: any): void;
    _progress(name: any, percentage: any): void;
    _getStateVersion(): 1 | 2 | 3;
    _getStateWithRegistration(stateVersion: number): Promise<void>;
    _getStateFromTargetEndpoint(stateVersion: number): Promise<void>;
    _getState(): Promise<void>;
    _getImageInfo(): Promise<void>;
    _getCommit(): any;
    _getRelease(): any;
    _getServicesFromApps(apps: any): any;
    _getImages(): Image[];
    _getImagesToPreload(): Image[];
    registryRequest<RF extends 'json' | 'blob'>(url: {
        registryUrl: string;
        layerUrl: string;
    } | string, registryToken: string | null, headers: Record<string, string>, responseFormat: RF, followRedirect: boolean): ReturnType<typeof this.balena.request.send<RF extends 'blob' ? Blob : RF extends 'json' ? Record<string, unknown> : never>>;
    _getLayerSize(registryToken: any, registryUrl: any, layerUrl: any): Promise<number>;
    _registryUrl(imageLocation: any): string;
    _imageManifestUrl(imageLocation: any): string;
    _layerUrl(imageLocation: any, layerDigest: any): string;
    _getApplicationImagesManifests(imagesLocations: string[], registryToken: string): Promise<{
        manifest: Manifest["manifest"];
        imageLocation: string;
    }[]>;
    _getLayersSizes(manifests: Manifest[], registryToken: string): Promise<Map<any, any>>;
    _getApplicationSize(): Promise<number>;
    _getSize(): Promise<number>;
    _getRequiredAdditionalSpace(): Promise<number>;
    _supervisorLT7(): boolean;
    _supervisorLT13(): boolean;
    _getRegistryToken(images: string[]): Promise<string>;
    _fetchApplication(): Promise<void>;
    _checkImage(image: string): Promise<void>;
    _pluralize(count: number, thing: string): string;
    _deviceTypeArch(slug: string): any;
    prepare(): Promise<void>;
    cleanup(): Promise<void>;
    kill(): Promise<any>;
    _ensureCanPreload(): void;
    _getAppData(): (_.Omit<any, "image" | "environment" | "serviceId"> & {
        appId: never;
        env: any;
        imageId: any;
    })[] | (Pick<any, string | number | symbol> & {
        pinDevice: boolean;
    });
    _getSplashImagePath(): "/splash/balena-logo.png" | "/splash/resin-logo.png";
    preload(): Promise<void>;
    setApplication(application: Application): void;
    setAppIdAndCommit(appIdOrSlug: string | number, commit: string): Promise<void>;
}
export {};
