balena-preload
Version:
Preload balena OS images with a user application container
148 lines (147 loc) • 5.6 kB
TypeScript
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 {};