import * as node_https0 from "node:https";
import * as unzipper1 from "unzipper";
import { Emitter } from "mitt";
import progress from "progress-stream";
import * as tar from "tar";

//#region src/enums/sdk.d.ts
declare enum SdkVersion {
  API10 = "4.0.0",
  API11 = "4.1.0",
  API12 = "5.0.0",
  API13 = "5.0.1",
  API14 = "5.0.2",
  API15 = "5.0.3",
  API18 = "5.1.0",
  API20 = "6.0.0-Beta1",
}
declare enum SdkArch {
  X86 = 0,
  ARM = 1,
}
declare enum SdkOS {
  MacOS = 0,
  Windows = 1,
  Linux = 2,
}
type SdkUrlStorage = Record<SdkVersion, Record<SdkArch, Record<SdkOS, string | null>>>;
/**
* Get the SDK URL for a given version, architecture, and operating system.
* @param version - The version of the SDK.
* @param arch - The architecture of the SDK.
* @param os - The operating system of the SDK.
* @returns The URL of the SDK.
*/
declare function getSdkUrl(version: SdkVersion, arch: SdkArch, os: SdkOS): string | null;
/**
* Get all the SDK URLs.
* @returns The SDK URLs.
*/
declare function getSdkUrls(): SdkUrlStorage;
//#endregion
//#region src/options.d.ts
interface UrlOptions {
  /**
  * The version of the SDK.
  */
  version: SdkVersion;
  /**
  * The architecture of the SDK.
  */
  arch: SdkArch;
  /**
  * The operating system of the SDK.
  */
  os: SdkOS;
}
interface DownloadProgressEvent extends progress.Progress {
  /**
  * The network speed of the download.
  */
  network: number;
  /**
  * The unit of the network speed.
  */
  unit: "KB" | "MB";
  /**
  * The increment of the {@linkcode DownloadProgressEvent.percentage}.
  */
  increment: number;
}
interface DownloadOptions {
  /**
  * The URL of the SDK.
  */
  url: string | UrlOptions;
  /**
  * The cache directory of the tar file.
  */
  cacheDir: string;
  /**
  * The target directory of the SDK.
  */
  targetDir: string;
  /**
  * Whether to clean the cache directory after the download is complete.
  *
  * @default true
  */
  clean?: boolean;
  /**
  * The type of request to use.
  */
  requestType?: "http" | "https";
  /**
  * The signal to abort the download.
  */
  signal?: AbortSignal;
  /**
  * The extra options to pass to the request.
  */
  requestOptions?: node_https0.RequestOptions;
  /**
  * Whether to enable resume download. If enabled, the download will automatically resume from where it left off.
  *
  * @default true
  */
  resumeDownload?: boolean;
  /**
  * The temporary file path for storing partial downloads. If not specified, will use tarCacheDir + 'download.tmp.tar.gz'.
  */
  tempFilePath?: string;
  /**
  * The callback function to be called when the download progress changes.
  *
  * @param e - The progress event.
  */
  onDownloadProgress?(e: DownloadProgressEvent): void | Promise<void>;
  /**
  * The callback function to be called when the tar file is extracted.
  *
  * @param entry - The entry of the tar file.
  */
  onTarExtracted?(entry: tar.ReadEntry): void | Promise<void>;
  /**
  * The callback function to be called when the zip file is extracted.
  *
  * @param entry - The entry of the zip file.
  */
  onZipExtracted?(entry: unzipper1.Entry): void | Promise<void>;
}
interface DownloadExecutor extends Emitter<DownloadEventMap> {
  startDownload(requestOptions?: node_https0.RequestOptions): Promise<void>;
  checkSha256(): Promise<void>;
  extractTar(): Promise<void>;
  extractZip(): Promise<void>;
  clean(): Promise<void>;
}
// eslint-disable-next-line ts/consistent-type-definitions
type DownloadEventMap = {
  "download-progress": DownloadProgressEvent;
  "tar-extracted": tar.ReadEntry;
  "zip-extracted": unzipper1.Entry;
};
//#endregion
//#region src/download.d.ts
/**
* Download the ArkTS SDK.
*
* @param options - The options for the download.
*/
declare function createDownloader(options: DownloadOptions): Promise<DownloadExecutor>;
/**
* Download the ArkTS SDK.
*
* @deprecated Deprecate this entry in newer version.
* @param options - The options for the download.
*/
declare function download(options: DownloadOptions): Promise<DownloadExecutor>;
//#endregion
//#region src/errors/download.d.ts
interface DownloadErrorOptions {
  message?: string;
  cause?: unknown;
}
declare class DownloadError extends Error {
  code: DownloadError.Code;
  constructor(code: DownloadError.Code, options?: DownloadErrorOptions);
}
declare namespace DownloadError {
  enum Code {
    DownloadFailed = "DOWNLOAD_FAILED",
    ZipExtractionFailed = "ZIP_EXTRACTION_FAILED",
    InvalidUrl = "INVALID_URL",
    Sha256Mismatch = "SHA256_MISMATCH",
    FileNotFound = "FILE_NOT_FOUND",
    InvalidSha256 = "INVALID_SHA256",
    FileReadError = "FILE_READ_ERROR",
  }
}
//#endregion
export { DownloadError, DownloadOptions, DownloadProgressEvent, SdkArch, SdkOS, SdkVersion, createDownloader, download, getSdkUrl, getSdkUrls };
//# sourceMappingURL=index.d.cts.map