UNPKG

11.6 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/DownloadedUpdateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { UpdateInfo } from \"builder-util-runtime\"\nimport { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\nimport isEqual from \"lodash.isequal\"\nimport { Logger, ResolvedUpdateFileInfo } from \"./main\"\nimport { pathExists, readJson, emptyDir, outputJson, unlink, pathExistsSync } from \"fs-extra\"\nimport * as path from \"path\"\n\n/** @private **/\nexport class DownloadedUpdateHelper {\n private _file: string | null = null\n private _packageFile: string | null = null\n\n private versionInfo: UpdateInfo | null = null\n private fileInfo: ResolvedUpdateFileInfo | null = null\n\n constructor(readonly cacheDir: string) {\n }\n\n private _downloadedFileInfo: CachedUpdateInfo | null = null\n get downloadedFileInfo(): CachedUpdateInfo | null {\n return this._downloadedFileInfo\n }\n\n get file(): string | null {\n return this._file\n }\n\n get packageFile(): string | null {\n return this._packageFile\n }\n\n get cacheDirForPendingUpdate(): string {\n return path.join(this.cacheDir, \"pending\")\n }\n\n async validateDownloadedPath(updateFile: string, updateInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {\n // update has already been downloaded from this running instance\n // check here only existence, not checksum\n if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await pathExists(updateFile))) {\n return updateFile\n }\n else {\n return null\n }\n }\n\n // update has already been downloaded from some previous app launch\n const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger)\n if (cachedUpdateFile === null) {\n return null\n }\n logger.info(`Update has already been downloaded to ${updateFile}).`)\n this._file = cachedUpdateFile\n return cachedUpdateFile\n }\n\n async setDownloadedFile(downloadedFile: string, packageFile: string | null, versionInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, updateFileName: string, isSaveCache: boolean): Promise<void> {\n this._file = downloadedFile\n this._packageFile = packageFile\n this.versionInfo = versionInfo\n this.fileInfo = fileInfo\n this._downloadedFileInfo = {\n fileName: updateFileName,\n sha512: fileInfo.info.sha512,\n isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true,\n }\n\n if (isSaveCache) {\n await outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo)\n }\n }\n\n async clear(): Promise<void> {\n this._file = null\n this._packageFile = null\n this.versionInfo = null\n this.fileInfo = null\n await this.cleanCacheDirForPendingUpdate()\n }\n\n private async cleanCacheDirForPendingUpdate(): Promise<void> {\n try {\n // remove stale data\n await emptyDir(this.cacheDirForPendingUpdate)\n }\n catch (ignore) {\n // ignore\n }\n }\n\n /**\n * Returns \"update-info.json\" which is created in the update cache directory's \"pending\" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.\n * @param fileInfo\n * @param logger\n */\n private async getValidCachedUpdateFile(fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n const updateInfoFilePath: string = this.getUpdateInfoFile()\n\n const doesUpdateInfoFileExist = await pathExistsSync(updateInfoFilePath);\n if(!doesUpdateInfoFileExist) {\n return null;\n }\n\n\n let cachedInfo: CachedUpdateInfo\n try {\n cachedInfo = await readJson(updateInfoFilePath)\n }\n catch (error) {\n let message = `No cached update info available`\n if (error.code !== \"ENOENT\") {\n await this.cleanCacheDirForPendingUpdate()\n message += ` (error on read: ${error.message})`\n }\n logger.info(message)\n return null\n }\n\n const isCachedInfoFileNameValid = cachedInfo?.fileName !== null ?? false\n if (!isCachedInfoFileNameValid) {\n logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n if (fileInfo.info.sha512 !== cachedInfo.sha512) {\n logger.info(`Cached update sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${cachedInfo.sha512}, expected: ${fileInfo.info.sha512}. Directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName)\n if (!(await pathExists(updateFile))) {\n logger.info(\"Cached update file doesn't exist\")\n return null\n }\n\n const sha512 = await hashFile(updateFile)\n if (fileInfo.info.sha512 !== sha512) {\n logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n this._downloadedFileInfo = cachedInfo\n return updateFile\n }\n\n private getUpdateInfoFile(): string {\n return path.join(this.cacheDirForPendingUpdate, \"update-info.json\")\n }\n}\n\ninterface CachedUpdateInfo {\n fileName: string\n sha512: string\n readonly isAdminRightsRequired: boolean\n}\n\nfunction hashFile(file: string, algorithm = \"sha512\", encoding: \"base64\" | \"hex\" = \"base64\", options?: any): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const hash = createHash(algorithm)\n hash\n .on(\"error\", reject)\n .setEncoding(encoding)\n\n createReadStream(file, {...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */})\n .on(\"error\", reject)\n .on(\"end\", () => {\n hash.end()\n resolve(hash.read() as string)\n })\n .pipe(hash, {end: false})\n })\n}\n\nexport async function createTempUpdateFile(name: string, cacheDir: string, log: Logger): Promise<string> {\n // https://github.com/electron-userland/electron-builder/pull/2474#issuecomment-366481912\n let nameCounter = 0\n let result = path.join(cacheDir, name)\n for (let i = 0; i < 3; i++) {\n try {\n await unlink(result)\n return result\n }\n catch (e) {\n if (e.code === \"ENOENT\") {\n return result\n }\n\n log.warn(`Error on remove temp update file: ${e}`)\n result = path.join(cacheDir, `${nameCounter++}-${name}`)\n }\n }\n return result\n}\n"],"sourceRoot":""}