/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import { Event } from "../../../base/common/event.mjs";
export interface IUpdate {
    version: string;
    productVersion: string;
    supportsFastUpdate?: boolean;
    url?: string;
    hash?: string;
}
/**
 * Updates are run as a state machine:
 *
 *      Uninitialized
 *           ↓
 *          Idle
 *          ↓  ↑
 *   Checking for Updates  →  Available for Download
 *         ↓
 *     Downloading  →   Ready
 *         ↓               ↑
 *     Downloaded   →  Updating
 *
 * Available: There is an update available for download (linux).
 * Ready: Code will be updated as soon as it restarts (win32, darwin).
 * Downloaded: There is an update ready to be installed in the background (win32).
 */
export declare const enum StateType {
    Uninitialized = "uninitialized",
    Idle = "idle",
    CheckingForUpdates = "checking for updates",
    AvailableForDownload = "available for download",
    Downloading = "downloading",
    Downloaded = "downloaded",
    Updating = "updating",
    Ready = "ready"
}
export declare const enum UpdateType {
    Setup = 0,
    Archive = 1,
    Snap = 2
}
export type Uninitialized = {
    type: StateType.Uninitialized;
};
export type Idle = {
    type: StateType.Idle;
    updateType: UpdateType;
    error?: string;
};
export type CheckingForUpdates = {
    type: StateType.CheckingForUpdates;
    explicit: boolean;
};
export type AvailableForDownload = {
    type: StateType.AvailableForDownload;
    update: IUpdate;
};
export type Downloading = {
    type: StateType.Downloading;
    update: IUpdate;
};
export type Downloaded = {
    type: StateType.Downloaded;
    update: IUpdate;
};
export type Updating = {
    type: StateType.Updating;
    update: IUpdate;
};
export type Ready = {
    type: StateType.Ready;
    update: IUpdate;
};
export type State = Uninitialized | Idle | CheckingForUpdates | AvailableForDownload | Downloading | Downloaded | Updating | Ready;
export declare const State: {
    Uninitialized: Uninitialized;
    Idle: (updateType: UpdateType, error?: string) => Idle;
    CheckingForUpdates: (explicit: boolean) => CheckingForUpdates;
    AvailableForDownload: (update: IUpdate) => AvailableForDownload;
    Downloading: (update: IUpdate) => Downloading;
    Downloaded: (update: IUpdate) => Downloaded;
    Updating: (update: IUpdate) => Updating;
    Ready: (update: IUpdate) => Ready;
};
export interface IAutoUpdater extends Event.NodeEventEmitter {
    setFeedURL(url: string): void;
    checkForUpdates(): void;
    applyUpdate?(): Promise<void>;
    quitAndInstall(): void;
}
export declare const IUpdateService: import("../../instantiation/common/instantiation.mjs").ServiceIdentifier<IUpdateService>;
export interface IUpdateService {
    readonly _serviceBrand: undefined;
    readonly onStateChange: Event<State>;
    readonly state: State;
    checkForUpdates(explicit: boolean): Promise<void>;
    downloadUpdate(): Promise<void>;
    applyUpdate(): Promise<void>;
    quitAndInstall(): Promise<void>;
    isLatestVersion(): Promise<boolean | undefined>;
    _applySpecificUpdate(packagePath: string): Promise<void>;
}
