@arkts/sdk-downloader
Version:
Download and extract the ArkTS SDK.
1 lines • 32.6 kB
Source Map (JSON)
{"version":3,"file":"download-CUyFpN2j.cjs","names":["code: DownloadError.Code","options?: DownloadErrorOptions","urls: SdkUrlStorage","version: SdkVersion","arch: SdkArch","os: SdkOS","options: DownloadOptions","http","https","resolvedOptions: ResolvedDownloadOptions","startByte?: number","extraOptions?: http.RequestOptions","chunks: Buffer[]","_value: unknown","speedHistory: number[]","progress: progress.Progress","progress","increment: number","network: number","unit: 'KB' | 'MB'","writeStream: fs.WriteStream","res: import('node:http').IncomingMessage","error: unknown","filePath: string","sha256: string","resolvedOptions: ResolvedDownloadOptions","extractedDir: string","emitter: Emitter<DownloadEventMap>","process","writePromises: Promise<void>[]","options: DownloadOptions","requestOptions?: import('node:https').RequestOptions","progressEvent: DownloadProgressEvent"],"sources":["../src/errors/download.ts","../src/enums/sdk.ts","../src/options.ts","../src/request.ts","../src/download.ts"],"sourcesContent":["export interface DownloadErrorOptions {\n message?: string\n cause?: unknown\n}\n\nexport class DownloadError extends Error {\n constructor(public code: DownloadError.Code, options?: DownloadErrorOptions) {\n super(options?.message)\n this.cause = options?.cause\n }\n}\n\nexport namespace DownloadError {\n export enum Code {\n DownloadFailed = 'DOWNLOAD_FAILED',\n ZipExtractionFailed = 'ZIP_EXTRACTION_FAILED',\n InvalidUrl = 'INVALID_URL',\n Sha256Mismatch = 'SHA256_MISMATCH',\n FileNotFound = 'FILE_NOT_FOUND',\n InvalidSha256 = 'INVALID_SHA256',\n FileReadError = 'FILE_READ_ERROR',\n }\n}\n","export enum SdkVersion {\n API10 = '4.0.0',\n API11 = '4.1.0',\n API12 = '5.0.0',\n API13 = '5.0.1',\n API14 = '5.0.2',\n API15 = '5.0.3',\n API18 = '5.1.0',\n API20 = '6.0.0-Beta1',\n}\n\nexport enum SdkArch {\n X86,\n ARM,\n}\n\nexport enum SdkOS {\n MacOS,\n Windows,\n Linux,\n}\n\nexport type SdkUrlStorage = Record<SdkVersion, Record<SdkArch, Record<SdkOS, string | null>>>\n\nconst urls: SdkUrlStorage = {\n [SdkVersion.API10]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.0-Release/ohos-sdk-mac-public.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.0-Release/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n [SdkVersion.API11]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.1-Release/ohos-sdk-mac-public-signed.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.1-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.1-Release/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.1-Release/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/4.1-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n [SdkVersion.API12]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.0-Release/ohos-sdk-mac-public.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.0-Release/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n [SdkVersion.API13]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.1-Release/ohos-sdk-mac-public.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.1-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.1-Release/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.1-Release/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.1-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n [SdkVersion.API14]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.2-Release/ohos-sdk-mac-public.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.2-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.2-Release/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.2-Release/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.2-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n [SdkVersion.API15]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.3-Release/ohos-sdk-mac-public.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.3-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.3-Release/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.3-Release/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.0.3-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n [SdkVersion.API18]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.1.0-Release/ohos-sdk-mac-public.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.1.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.1.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.1.0-Release/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/5.1.0-Release/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n [SdkVersion.API20]: {\n [SdkArch.X86]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/6.0-Beta1/ohos-sdk-mac-public.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/6.0-Beta1/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: 'https://mirrors.huaweicloud.com/harmonyos/os/6.0-Beta1/ohos-sdk-windows_linux-public.tar.gz',\n },\n [SdkArch.ARM]: {\n [SdkOS.MacOS]: 'https://mirrors.huaweicloud.com/harmonyos/os/6.0-Beta1/L2-SDK-MAC-M1-PUBLIC.tar.gz',\n [SdkOS.Windows]: 'https://mirrors.huaweicloud.com/harmonyos/os/6.0-Beta1/ohos-sdk-windows_linux-public.tar.gz',\n [SdkOS.Linux]: null,\n },\n },\n}\n\n/**\n * Get the SDK URL for a given version, architecture, and operating system.\n * @param version - The version of the SDK.\n * @param arch - The architecture of the SDK.\n * @param os - The operating system of the SDK.\n * @returns The URL of the SDK.\n */\nexport function getSdkUrl(version: SdkVersion, arch: SdkArch, os: SdkOS): string | null {\n return urls?.[version]?.[arch]?.[os] ?? null\n}\n\n/**\n * Get all the SDK URLs.\n * @returns The SDK URLs.\n */\nexport function getSdkUrls(): SdkUrlStorage {\n return urls\n}\n","import type { Emitter } from 'mitt'\nimport type progress from 'progress-stream'\nimport type * as tar from 'tar'\nimport fs from 'node:fs'\nimport http from 'node:http'\nimport https from 'node:https'\nimport path from 'node:path'\nimport { getSdkUrl, type SdkArch, type SdkOS, type SdkVersion } from './enums/sdk'\nimport { DownloadError } from './errors/download'\n\nexport interface UrlOptions {\n /**\n * The version of the SDK.\n */\n version: SdkVersion\n /**\n * The architecture of the SDK.\n */\n arch: SdkArch\n /**\n * The operating system of the SDK.\n */\n os: SdkOS\n}\n\nexport interface DownloadProgressEvent extends progress.Progress {\n /**\n * The network speed of the download.\n */\n network: number\n /**\n * The unit of the network speed.\n */\n unit: 'KB' | 'MB'\n /**\n * The increment of the {@linkcode DownloadProgressEvent.percentage}.\n */\n increment: number\n}\n\nexport interface DownloadOptions {\n /**\n * The URL of the SDK.\n */\n url: string | UrlOptions\n /**\n * The cache directory of the tar file.\n */\n cacheDir: string\n /**\n * The target directory of the SDK.\n */\n targetDir: string\n /**\n * Whether to clean the cache directory after the download is complete.\n *\n * @default true\n */\n clean?: boolean\n /**\n * The type of request to use.\n */\n requestType?: 'http' | 'https'\n /**\n * The signal to abort the download.\n */\n signal?: AbortSignal\n /**\n * The extra options to pass to the request.\n */\n requestOptions?: import('node:https').RequestOptions\n /**\n * Whether to enable resume download. If enabled, the download will automatically resume from where it left off.\n *\n * @default true\n */\n resumeDownload?: boolean\n /**\n * The temporary file path for storing partial downloads. If not specified, will use tarCacheDir + 'download.tmp.tar.gz'.\n */\n tempFilePath?: string\n /**\n * The callback function to be called when the download progress changes.\n *\n * @param e - The progress event.\n */\n onDownloadProgress?(e: DownloadProgressEvent): void | Promise<void>\n /**\n * The callback function to be called when the tar file is extracted.\n *\n * @param entry - The entry of the tar file.\n */\n onTarExtracted?(entry: tar.ReadEntry): void | Promise<void>\n /**\n * The callback function to be called when the zip file is extracted.\n *\n * @param entry - The entry of the zip file.\n */\n onZipExtracted?(entry: import('unzipper').Entry): void | Promise<void>\n}\n\nexport interface DownloadExecutor extends Emitter<DownloadEventMap> {\n startDownload(requestOptions?: import('node:https').RequestOptions): Promise<void>\n checkSha256(): Promise<void>\n extractTar(): Promise<void>\n extractZip(): Promise<void>\n clean(): Promise<void>\n}\n\n// eslint-disable-next-line ts/consistent-type-definitions\nexport type DownloadEventMap = {\n 'download-progress': DownloadProgressEvent\n 'tar-extracted': tar.ReadEntry\n 'zip-extracted': import('unzipper').Entry\n}\n\nexport type ResolvedDownloadOptions = Omit<DownloadOptions, 'url'> & {\n url: string\n requester: typeof import('node:http') | typeof import('node:https')\n tempFilePath: string\n}\n\nexport function resolveDownloadOptions(options: DownloadOptions): ResolvedDownloadOptions {\n const url = typeof options.url === 'string' ? options.url : getSdkUrl(options.url.version, options.url.arch, options.url.os)\n if (!url)\n throw new DownloadError(DownloadError.Code.InvalidUrl)\n\n if (!fs.existsSync(options.cacheDir))\n fs.mkdirSync(options.cacheDir, { recursive: true })\n\n options.tempFilePath = options.tempFilePath ? path.resolve(options.tempFilePath) : path.resolve(path.join(options.cacheDir, 'download.tmp.tar.gz'))\n\n if (!fs.existsSync(path.dirname(options.tempFilePath)))\n fs.mkdirSync(path.dirname(options.tempFilePath), { recursive: true })\n\n return {\n ...options,\n url,\n requester: options.requestType === 'http' ? http : https,\n tempFilePath: options.tempFilePath,\n targetDir: path.resolve(options.targetDir),\n resumeDownload: typeof options.resumeDownload === 'boolean' ? options.resumeDownload : true,\n }\n}\n","import type http from 'node:http'\nimport type { ResolvedDownloadOptions } from './options'\nimport { Buffer } from 'node:buffer'\nimport { DownloadError } from './errors/download'\n\nexport function makeRequest(resolvedOptions: ResolvedDownloadOptions, startByte?: number, extraOptions?: http.RequestOptions): Promise<http.IncomingMessage> {\n return new Promise<http.IncomingMessage>((resolve, reject) => {\n resolvedOptions.requester.get(resolvedOptions.url, {\n method: 'GET',\n headers: startByte\n ? {\n Range: `bytes=${startByte}-`,\n }\n : undefined,\n ...extraOptions,\n }, (res) => {\n if (res.statusCode === 416 || res.statusCode === 206) {\n resolve(res)\n }\n else if (res.statusCode !== 200) {\n reject(new DownloadError(DownloadError.Code.DownloadFailed, { cause: res }))\n }\n else {\n resolve(res)\n }\n }).on('error', err => reject(err))\n })\n}\n\nexport function makeSha256Request(resolvedOptions: ResolvedDownloadOptions): Promise<string> {\n return new Promise((resolve, reject) => {\n resolvedOptions.requester.get(`${resolvedOptions.url}.sha256`, (res) => {\n if (res.statusCode !== 200 && res.statusCode !== 201)\n reject(new DownloadError(DownloadError.Code.DownloadFailed, { cause: res.statusCode }))\n\n const chunks: Buffer[] = []\n res.on('data', (chunk) => {\n chunks.push(chunk)\n })\n res.on('end', () => {\n resolve(Buffer.concat(chunks).toString('utf-8'))\n })\n })\n })\n}\n","import type { Emitter } from 'mitt'\nimport type { DownloadEventMap, DownloadExecutor, DownloadProgressEvent, ResolvedDownloadOptions } from './options'\nimport crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { computed } from 'alien-signals'\nimport fg from 'fast-glob'\nimport mitt from 'mitt'\nimport progress from 'progress-stream'\nimport * as tar from 'tar'\nimport * as unzipper from 'unzipper'\nimport { DownloadError } from './errors/download'\nimport { type DownloadOptions, resolveDownloadOptions } from './options'\nimport { makeRequest, makeSha256Request } from './request'\n\nfunction typeAssert<T>(_value: unknown): asserts _value is T {}\n\nfunction useDownloadProgress() {\n let lastTime = Date.now()\n let lastTransferred = 0\n let lastPercentage = 0\n const speedHistory: number[] = [] // 存储最近几次的速度计算\n const maxHistorySize = 5 // 最多保存5次历史记录\n const minTimeInterval = 100 // 最小时间间隔100ms,避免计算过于频繁\n\n return (progress: progress.Progress): { network: number, unit: 'KB' | 'MB', increment: number } => {\n const currentTime = Date.now()\n const timeDifference = currentTime - lastTime\n const transferredDifference = progress.transferred - lastTransferred\n\n // 当前下载进度(百分比)与上一次下载进度(百分比)的差值,用于适配vscode.withProgress的increment参数\n const increment: number = progress.percentage - lastPercentage\n\n let network: number\n let unit: 'KB' | 'MB'\n\n // 只有当时间间隔足够大且有数据传输时才计算新的速度\n if (timeDifference >= minTimeInterval && transferredDifference > 0) {\n const currentSpeed = (transferredDifference / timeDifference) * 1000\n speedHistory.push(currentSpeed)\n\n // 保持历史记录数量在限制内\n if (speedHistory.length > maxHistorySize) {\n speedHistory.shift()\n }\n\n lastTime = currentTime\n lastTransferred = progress.transferred\n }\n\n // 计算平均速度,如果没有历史记录则使用0\n const avgSpeedBytesPerSecond = speedHistory.length > 0\n ? speedHistory.reduce((sum, speed) => sum + speed, 0) / speedHistory.length\n : 0\n\n if (avgSpeedBytesPerSecond >= 1024 * 1024) {\n network = Math.round(avgSpeedBytesPerSecond / (1024 * 1024) * 100) / 100\n unit = 'MB'\n }\n else {\n network = Math.round((avgSpeedBytesPerSecond / 1024) * 100) / 100\n unit = 'KB'\n }\n\n lastPercentage = progress.percentage\n\n return {\n network,\n unit,\n increment,\n }\n }\n}\n\nasync function onDownloaded(writeStream: fs.WriteStream, res: import('node:http').IncomingMessage): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let isResolved = false\n\n function cleanup(): void {\n isResolved = true\n if (!res.destroyed) {\n res.destroy()\n }\n if (!writeStream.destroyed) {\n writeStream.destroy()\n }\n }\n\n function handleError(error: unknown): void {\n if (!isResolved) {\n cleanup()\n const errorMessage = error instanceof Error ? error.message : String(error)\n reject(new DownloadError(DownloadError.Code.DownloadFailed, {\n message: `Download failed: ${errorMessage}`,\n cause: error,\n }))\n }\n }\n\n writeStream.on('error', handleError)\n writeStream.on('finish', () => {\n if (!isResolved) {\n isResolved = true\n if (!res.destroyed) {\n res.destroy()\n }\n resolve()\n }\n })\n\n res.on('error', handleError)\n })\n}\n\nasync function _checkSha256(filePath: string, sha256: string): Promise<void> {\n if (!fs.existsSync(filePath)) {\n throw new DownloadError(DownloadError.Code.FileNotFound, {\n message: `File not found: ${filePath}`,\n })\n }\n\n if (!sha256 || typeof sha256 !== 'string' || !/^[a-f0-9]{64}$/i.test(sha256.trim())) {\n throw new DownloadError(DownloadError.Code.InvalidSha256, {\n message: 'Invalid SHA256 format',\n })\n }\n\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha256')\n const stream = fs.createReadStream(filePath)\n\n stream.on('error', (error) => {\n reject(new DownloadError(DownloadError.Code.FileReadError, {\n message: `Failed to read file: ${error.message}`,\n }))\n })\n\n stream.on('data', (chunk) => {\n hash.update(chunk)\n })\n\n stream.on('end', () => {\n const calculatedHash = hash.digest('hex').trim()\n const expectedHash = sha256.trim()\n\n if (calculatedHash !== expectedHash) {\n const error = new DownloadError(DownloadError.Code.Sha256Mismatch, {\n message: `SHA256 checksum mismatch, expected: ${expectedHash}, actual: ${calculatedHash}`,\n })\n reject(error)\n }\n else {\n resolve()\n }\n })\n })\n}\n\nasync function _extractTar(resolvedOptions: ResolvedDownloadOptions, extractedDir: string, emitter: Emitter<DownloadEventMap>): Promise<void> {\n await tar.extract({\n file: resolvedOptions.tempFilePath,\n cwd: extractedDir,\n onReadEntry: (entry) => {\n resolvedOptions.onTarExtracted?.(entry)\n emitter.emit('tar-extracted', entry)\n },\n })\n}\n\nasync function _extractZip(resolvedOptions: ResolvedDownloadOptions, extractedDir: string, emitter: Emitter<DownloadEventMap>): Promise<void> {\n // 在MacOS上解压直接解压到目标目录即可,linux和windows则需要找到对应的目录再解压\n const currentOS = process.platform === 'win32' ? 'windows' : process.platform === 'linux' ? 'linux' : undefined\n\n let files = fg.sync(path.join(extractedDir, '**', '*.zip'), {\n onlyFiles: true,\n absolute: true,\n }).filter(file => file.endsWith('.zip'))\n\n if (currentOS === 'linux' || currentOS === 'windows') {\n files = files.filter(filePath => filePath.includes(currentOS))\n }\n\n async function extractSingleZip(filePath: string): Promise<void> {\n const fileReadStream = fs.createReadStream(filePath).pipe(unzipper.Parse({ forceStream: true }))\n const writePromises: Promise<void>[] = []\n\n for await (const entry of fileReadStream) {\n typeAssert<unzipper.Entry>(entry)\n const currentFilePath = path.join(resolvedOptions.targetDir, entry.path)\n\n if (entry.type === 'File') {\n if (!fs.existsSync(path.dirname(currentFilePath)))\n fs.mkdirSync(path.dirname(currentFilePath), { recursive: true })\n\n const writePromise = new Promise<void>((resolve, reject) => {\n const writeStream = fs.createWriteStream(currentFilePath)\n writeStream.on('error', reject)\n writeStream.on('finish', resolve)\n entry.pipe(writeStream)\n })\n writePromises.push(writePromise)\n\n await resolvedOptions.onZipExtracted?.(entry)\n emitter.emit('zip-extracted', entry)\n }\n else if (entry.type === 'Directory') {\n if (!fs.existsSync(currentFilePath))\n fs.mkdirSync(currentFilePath, { recursive: true })\n }\n }\n\n // 等待所有文件写入完成\n await Promise.all(writePromises)\n }\n\n // 确保目标目录存在\n if (!fs.existsSync(resolvedOptions.targetDir)) {\n fs.mkdirSync(resolvedOptions.targetDir, { recursive: true })\n }\n\n await Promise.all(files.map(extractSingleZip))\n}\n\n/**\n * Download the ArkTS SDK.\n *\n * @param options - The options for the download.\n */\nexport async function createDownloader(options: DownloadOptions): Promise<DownloadExecutor> {\n const resolvedOptions = resolveDownloadOptions(options)\n const emitter = mitt<DownloadEventMap>()\n\n async function startDownload(requestOptions?: import('node:https').RequestOptions): Promise<void> {\n const startByte = computed<number>(() => fs.existsSync(resolvedOptions.tempFilePath) ? fs.statSync(resolvedOptions.tempFilePath).size : 0)\n const res = await makeRequest(resolvedOptions, startByte(), {\n signal: resolvedOptions.signal,\n ...resolvedOptions.requestOptions,\n ...requestOptions,\n })\n const totalLength = computed<number>(() => (Number(res.headers['content-length']) || 0) + startByte())\n const downloadProgressStream = progress({ length: totalLength(), transferred: startByte() })\n const progressHandler = useDownloadProgress()\n downloadProgressStream.on('progress', (progress) => {\n const progressEvent: DownloadProgressEvent = {\n ...progress,\n ...progressHandler(progress),\n }\n options.onDownloadProgress?.(progressEvent)\n emitter.emit('download-progress', progressEvent)\n })\n\n if (res.statusCode === 200 || res.statusCode === 206) {\n const writeStream = fs.createWriteStream(resolvedOptions.tempFilePath, {\n flags: startByte() > 0 ? 'a' : 'w',\n start: startByte(),\n })\n res.pipe(downloadProgressStream).pipe(writeStream)\n await onDownloaded(writeStream, res)\n }\n }\n\n async function checkSha256(): Promise<void> {\n const sha256 = await makeSha256Request(resolvedOptions)\n await _checkSha256(resolvedOptions.tempFilePath, sha256)\n }\n\n const extractedDir = path.join(resolvedOptions.cacheDir, '.tar-extracted')\n\n async function extractTar(): Promise<void> {\n if (!fs.existsSync(extractedDir))\n fs.mkdirSync(extractedDir, { recursive: true })\n await _extractTar(resolvedOptions, extractedDir, emitter)\n }\n\n async function extractZip(): Promise<void> {\n await _extractZip(resolvedOptions, extractedDir, emitter)\n }\n\n async function clean(): Promise<void> {\n if (resolvedOptions.clean !== false) {\n fs.rmSync(resolvedOptions.tempFilePath, { recursive: true })\n fs.rmSync(resolvedOptions.cacheDir, { recursive: true })\n }\n }\n\n return {\n startDownload,\n checkSha256,\n extractTar,\n extractZip,\n clean,\n emit: emitter.emit,\n on: emitter.on,\n off: emitter.off,\n all: emitter.all,\n }\n}\n\n/**\n * Download the ArkTS SDK.\n *\n * @deprecated Deprecate this entry in newer version.\n * @param options - The options for the download.\n */\nexport async function download(options: DownloadOptions): Promise<DownloadExecutor> {\n return await createDownloader(options)\n}\n"],"mappings":"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"}