UNPKG

@shockpkg/core

Version:
1 lines 50.8 kB
{"version":3,"file":"manager.mjs","names":["createReadStream","access","lstat","mkdir","open","readdir","readFile","rename","rm","writeFile","join","pathJoin","Readable","pipeline","createHash","MAIN_DIR","META_DIR","PACKAGE_FILE","PACKAGES_FILE","PACKAGES_URL","PACKAGES_URL_ENV","TEMP_EXT","PATH_ENV","TEMP_DIR","Dispatcher","EmptyStream","SliceStream","WriterStream","Packages","NAME","VERSION","retry","f","catch","Manager","headers","fetch","eventPackageInstallBefore","eventPackageInstallAfter","eventPackageInstallCurrent","eventPackageDownloadBefore","eventPackageDownloadAfter","eventPackageDownloadProgress","eventPackageCleanupBefore","eventPackageCleanupAfter","constructor","path","_createPath","_packages","_createPackages","packagesUrl","process","env","packagesFile","packageFile","metaDir","loaded","assertLoaded","Error","ensureLoad","load","ensureLoaded","readIfExists","packages","entry","packageByName","name","byName","packageBySha256","sha256","bySha256","packageBySha1","sha1","bySha1","packageByMd5","md5","byMd5","packageByUnique","unique","byUnique","receipt","pkg","_asName","pkgf","pathToPackageMeta","r","then","s","JSON","parse","file","_asPackage","data","pathToPackage","packageInstallVerify","size","filePath","stat","fSize","stream","hashsum","hash","setEncoding","on","read","update","_requestPackages","report","write","isInstalled","isCurrent","installed","list","_packageDirectories","push","outdated","upgrade","package","install","_ensureFetch","trigger","p","parent","reverse","srcPkg","slice","transforms","i","length","ss","sl","getZippedSlice","d","getZippedDecompressor","outFile","tmpDir","tmpFile","metaFile","recursive","force","fd","output","total","amount","bytesWritten","input","url","source","start","init","Range","res","err","_fetchErrorMessage","status","cl","get","body","fromWeb","lastData","hashed","digest","toString","_packageDirsEnsure","_packageMetaReceiptWrite","close","remove","dir","dirMeta","isObsolete","startsWith","obsolete","cleanup","removed","pathTo","parts","pathToMeta","pkgfTmp","_packageMetaReceiptFromPackage","stringify","flag","error","message","cause","msg","code","info","filter","Boolean","withFileTypes","e","isDirectory","map","sort","Pragma","text","_ensureDirs"],"sources":["../src/manager.ts"],"sourcesContent":["import {createReadStream} from 'node:fs';\nimport {\n\taccess,\n\tlstat,\n\tmkdir,\n\topen,\n\treaddir,\n\treadFile,\n\trename,\n\trm,\n\twriteFile\n} from 'node:fs/promises';\nimport {join as pathJoin} from 'node:path';\nimport {Readable, Transform} from 'node:stream';\nimport {ReadableStream} from 'node:stream/web';\nimport {pipeline} from 'node:stream/promises';\nimport {createHash} from 'node:crypto';\n\nimport {\n\tMAIN_DIR,\n\tMETA_DIR,\n\tPACKAGE_FILE,\n\tPACKAGES_FILE,\n\tPACKAGES_URL,\n\tPACKAGES_URL_ENV,\n\tTEMP_EXT,\n\tPATH_ENV,\n\tTEMP_DIR\n} from './constants.ts';\nimport {Dispatcher} from './dispatcher.ts';\nimport {EmptyStream, SliceStream, WriterStream} from './stream.ts';\nimport {Package} from './package.ts';\nimport {Packages} from './packages.ts';\nimport {IFetch} from './types.ts';\nimport {NAME, VERSION} from './meta.ts';\n\n/**\n * Retry once on error.\n *\n * @param f The function to try.\n * @returns The result.\n */\nasync function retry<T>(f: () => Promise<T>) {\n\treturn f().catch(async () => f());\n}\n\nexport type PackageLike = Package | string;\n\nexport interface IPackageReceipt {\n\t/**\n\t * Package name.\n\t */\n\tname: string;\n\n\t/**\n\t * File name.\n\t */\n\tfile: string;\n\n\t/**\n\t * File size.\n\t */\n\tsize: number;\n\n\t/**\n\t * SHA256 hash of the file contents.\n\t */\n\tsha256: string;\n\n\t/**\n\t * Source, URL for root or file path for children.\n\t */\n\tsource: string;\n}\n\nexport interface IPackageInstallBefore {\n\t/**\n\t * Package instance.\n\t */\n\tpackage: Package;\n}\n\nexport interface IPackageInstallAfter {\n\t/**\n\t * Package instance.\n\t */\n\tpackage: Package;\n}\n\nexport interface IPackageInstallCurrent {\n\t/**\n\t * Package instance.\n\t */\n\tpackage: Package;\n}\n\nexport interface IPackageDownloadBefore {\n\t/**\n\t * Package instance.\n\t */\n\tpackage: Package;\n}\n\nexport interface IPackageDownloadAfter {\n\t/**\n\t * Package instance.\n\t */\n\tpackage: Package;\n}\n\nexport interface IPackageDownloadProgress {\n\t/**\n\t * Package instance.\n\t */\n\tpackage: Package;\n\n\t/**\n\t * Progress total.\n\t */\n\ttotal: number;\n\n\t/**\n\t * Progress amount.\n\t */\n\tamount: number;\n}\n\nexport interface IPackageCleanupBefore {\n\t/**\n\t * Package name.\n\t */\n\tpackage: string;\n}\n\nexport interface IPackageCleanupAfter {\n\t/**\n\t * Package name.\n\t */\n\tpackage: string;\n\n\t/**\n\t * Package removed.\n\t */\n\tremoved: boolean;\n}\n\nexport interface IPackageInstalled {\n\t/**\n\t * Package installed.\n\t */\n\tpackage: Package;\n\n\t/**\n\t * List of packages used in install, empty if already installed.\n\t */\n\tinstall: Package[];\n}\n\nexport interface IPackageRemovedObsolete {\n\t/**\n\t * Package removed.\n\t */\n\tpackage: string;\n\n\t/**\n\t * Removed or already removed.\n\t */\n\tremoved: boolean;\n}\n\n/**\n * Package manager.\n */\nexport class Manager {\n\t/**\n\t * Root path.\n\t */\n\tpublic readonly path: string;\n\n\t/**\n\t * The default headers for HTTP requests.\n\t */\n\tpublic headers: {[header: string]: string} = {\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\t'User-Agent': `${NAME}/${VERSION}`\n\t};\n\n\t/**\n\t * A fetch-like interface requiring only a sebset of features.\n\t */\n\tpublic fetch: IFetch | null =\n\t\ttypeof fetch === 'undefined' ? null : (fetch as unknown as IFetch);\n\n\t/**\n\t * Package install before events.\n\t */\n\tpublic readonly eventPackageInstallBefore =\n\t\tnew Dispatcher<IPackageInstallBefore>(this);\n\n\t/**\n\t * Package install after events.\n\t */\n\tpublic readonly eventPackageInstallAfter =\n\t\tnew Dispatcher<IPackageInstallAfter>(this);\n\n\t/**\n\t * Package install current events.\n\t */\n\tpublic readonly eventPackageInstallCurrent =\n\t\tnew Dispatcher<IPackageInstallCurrent>(this);\n\n\t/**\n\t * Package download before events.\n\t */\n\tpublic readonly eventPackageDownloadBefore =\n\t\tnew Dispatcher<IPackageDownloadBefore>(this);\n\n\t/**\n\t * Package download after events.\n\t */\n\tpublic readonly eventPackageDownloadAfter =\n\t\tnew Dispatcher<IPackageDownloadAfter>(this);\n\n\t/**\n\t * Package download progress events.\n\t */\n\tpublic readonly eventPackageDownloadProgress =\n\t\tnew Dispatcher<IPackageDownloadProgress>(this);\n\n\t/**\n\t * Package cleanup before events.\n\t */\n\tpublic readonly eventPackageCleanupBefore =\n\t\tnew Dispatcher<IPackageCleanupBefore>(this);\n\n\t/**\n\t * Package cleanup after events.\n\t */\n\tpublic readonly eventPackageCleanupAfter =\n\t\tnew Dispatcher<IPackageCleanupAfter>(this);\n\n\t/**\n\t * Packages instance.\n\t */\n\tprotected readonly _packages: Packages;\n\n\t/**\n\t * Manager constructor.\n\t *\n\t * @param path The path, defaults to environment variable or relative.\n\t */\n\tconstructor(path: string | null = null) {\n\t\tthis.path = this._createPath(path);\n\t\tthis._packages = this._createPackages();\n\t}\n\n\t/**\n\t * Packages URL.\n\t *\n\t * @returns The URL.\n\t */\n\tpublic get packagesUrl() {\n\t\t// eslint-disable-next-line no-process-env\n\t\treturn process.env[PACKAGES_URL_ENV] || PACKAGES_URL;\n\t}\n\n\t/**\n\t * Packages file.\n\t *\n\t * @returns The file.\n\t */\n\tpublic get packagesFile() {\n\t\treturn PACKAGES_FILE;\n\t}\n\n\t/**\n\t * Package file.\n\t *\n\t * @returns The path.\n\t */\n\tpublic get packageFile() {\n\t\treturn PACKAGE_FILE;\n\t}\n\n\t/**\n\t * Meta directory.\n\t *\n\t * @returns The directory.\n\t */\n\tpublic get metaDir() {\n\t\treturn META_DIR;\n\t}\n\n\t/**\n\t * Packages loaded.\n\t *\n\t * @returns Is loaded.\n\t */\n\tpublic get loaded() {\n\t\treturn this._packages.loaded;\n\t}\n\n\t/**\n\t * Assert instance all loaded, including the packages list.\n\t * Implies all active assertions.\n\t */\n\tpublic assertLoaded() {\n\t\tif (!this.loaded) {\n\t\t\tthrow new Error('Packages list not loaded');\n\t\t}\n\t}\n\n\t/**\n\t * Ensure load if exists.\n\t */\n\tpublic async ensureLoad() {\n\t\tif (!this.loaded) {\n\t\t\tawait this.load();\n\t\t}\n\t}\n\n\t/**\n\t * Ensure loaded.\n\t */\n\tpublic async ensureLoaded() {\n\t\tawait this.ensureLoad();\n\t\tthis.assertLoaded();\n\t}\n\n\t/**\n\t * Load packages if exist.\n\t */\n\tpublic async load() {\n\t\tawait this._packages.readIfExists();\n\t}\n\n\t/**\n\t * Iterate over the packages.\n\t *\n\t * @yields Package object.\n\t */\n\tpublic async *packages() {\n\t\tawait this.ensureLoaded();\n\n\t\tfor (const entry of this._packages.packages()) {\n\t\t\tyield entry;\n\t\t}\n\t}\n\n\t/**\n\t * Get package by the unique name.\n\t *\n\t * @param name Package name.\n\t * @returns The package or null.\n\t */\n\tpublic async packageByName(name: string) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn this._packages.byName(name);\n\t}\n\n\t/**\n\t * Get package by the sha256 hash.\n\t *\n\t * @param sha256 Package sha256.\n\t * @returns The package or null.\n\t */\n\tpublic async packageBySha256(sha256: string) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn this._packages.bySha256(sha256);\n\t}\n\n\t/**\n\t * Get package by the sha1 hash.\n\t *\n\t * @param sha1 Package sha1.\n\t * @returns The package or null.\n\t */\n\tpublic async packageBySha1(sha1: string) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn this._packages.bySha1(sha1);\n\t}\n\n\t/**\n\t * Get package by the md5 hash.\n\t *\n\t * @param md5 Package md5.\n\t * @returns The package or null.\n\t */\n\tpublic async packageByMd5(md5: string) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn this._packages.byMd5(md5);\n\t}\n\n\t/**\n\t * Get package by the unique value.\n\t *\n\t * @param unique Package unique.\n\t * @returns The package or null.\n\t */\n\tpublic async packageByUnique(unique: string) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn this._packages.byUnique(unique);\n\t}\n\n\t/**\n\t * Read package install receipt.\n\t *\n\t * @param pkg The package.\n\t * @returns Install receipt.\n\t */\n\tpublic async receipt(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\n\t\tconst name = await this._asName(pkg);\n\t\tconst pkgf = await this.pathToPackageMeta(name, this.packageFile);\n\n\t\tconst r = await readFile(pkgf, 'utf8')\n\t\t\t.then(s => JSON.parse(s) as IPackageReceipt)\n\t\t\t.catch(() => null);\n\t\tif (!r) {\n\t\t\tthrow new Error(`Package is not installed: ${name}`);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get package install file.\n\t *\n\t * @param pkg The package.\n\t * @returns Path to install file.\n\t */\n\tpublic async file(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\n\t\tconst data = await this.receipt(pkg);\n\t\treturn this.pathToPackage(pkg, data.file);\n\t}\n\n\t/**\n\t * Verify package install file, using size and hash.\n\t *\n\t * @param pkg The package.\n\t */\n\tpublic async packageInstallVerify(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\n\t\tconst data = await this.receipt(pkg);\n\t\tconst {sha256, file, size} = data;\n\t\tconst filePath = await this.pathToPackage(pkg, file);\n\n\t\tconst stat = await lstat(filePath);\n\t\tconst fSize = stat.size;\n\t\tif (fSize !== size) {\n\t\t\tthrow new Error(`Invalid file size: ${fSize}`);\n\t\t}\n\n\t\tconst stream = createReadStream(filePath);\n\t\tlet hashsum = '';\n\t\tconst hash = createHash('sha256');\n\t\thash.setEncoding('hex');\n\t\thash.on('finish', () => {\n\t\t\thashsum = hash.read() as string;\n\t\t});\n\t\tawait pipeline(stream, hash);\n\n\t\tif (hashsum !== sha256) {\n\t\t\tthrow new Error(`Invalid sha256 hash: ${hashsum}`);\n\t\t}\n\t}\n\n\t/**\n\t * Update the package manager installed data.\n\t * Updates the packages list.\n\t *\n\t * @returns Update report.\n\t */\n\tpublic async update() {\n\t\t// Read data, update list, write list to file, return report.\n\t\tconst data = await this._requestPackages();\n\n\t\t// Try to determined what gets updated.\n\t\ttry {\n\t\t\tawait this.ensureLoad();\n\t\t} catch {\n\t\t\t// Ignore errors like outdated format version.\n\t\t}\n\n\t\tconst report = this._packages.update(data);\n\t\tawait this._packages.write();\n\t\treturn report;\n\t}\n\n\t/**\n\t * Check if a package is installed.\n\t *\n\t * @param pkg The package.\n\t * @returns True if already installed, else false.\n\t */\n\tpublic async isInstalled(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\n\t\ttry {\n\t\t\tawait this.receipt(pkg);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check if a package is installed and up-to-date.\n\t *\n\t * @param pkg The package.\n\t * @returns True if already up-to-date, else false.\n\t */\n\tpublic async isCurrent(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\n\t\tlet data: IPackageReceipt | null = null;\n\t\ttry {\n\t\t\tdata = await this.receipt(pkg);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t\treturn !!(\n\t\t\tdata.sha256 === pkg.sha256 &&\n\t\t\tdata.size === pkg.size &&\n\t\t\tdata.file === pkg.file &&\n\t\t\tdata.name === pkg.name\n\t\t);\n\t}\n\n\t/**\n\t * List all installed packages.\n\t *\n\t * @returns A list of installed package objects.\n\t */\n\tpublic async installed() {\n\t\tawait this.ensureLoaded();\n\n\t\tconst list: Package[] = [];\n\t\tfor (const entry of await this._packageDirectories()) {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tconst pkg = await this.packageByName(entry);\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tif (pkg && (await this.isInstalled(pkg))) {\n\t\t\t\tlist.push(pkg);\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * List all outdated packages.\n\t *\n\t * @returns The list of outdated package objects.\n\t */\n\tpublic async outdated() {\n\t\tawait this.ensureLoaded();\n\n\t\tconst list: Package[] = [];\n\t\tfor (const entry of await this._packageDirectories()) {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tconst pkg = await this.packageByName(entry);\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tif (pkg && !(await this.isCurrent(pkg))) {\n\t\t\t\tlist.push(pkg);\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * Upgrade any outdated packages.\n\t *\n\t * @returns List of packages upgraded.\n\t */\n\tpublic async upgrade() {\n\t\tawait this.ensureLoaded();\n\n\t\tconst outdated = await this.outdated();\n\t\tconst list: IPackageInstalled[] = [];\n\t\tfor (const pkg of outdated) {\n\t\t\tlist.push({\n\t\t\t\tpackage: pkg,\n\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\tinstall: await this.install(pkg)\n\t\t\t});\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * Install package.\n\t * Returns the list of packages processed to install.\n\t * Returns empty array if current version is already installed.\n\t *\n\t * @param pkg The package.\n\t * @returns List of packages processed to complete the install.\n\t */\n\tpublic async install(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\t\tconst fetch = this._ensureFetch();\n\n\t\t// If current version is installed, skip.\n\t\tconst installed = await this.isCurrent(pkg);\n\t\tif (installed) {\n\t\t\tthis.eventPackageInstallCurrent.trigger({\n\t\t\t\tpackage: pkg\n\t\t\t});\n\t\t\treturn [];\n\t\t}\n\n\t\t// Find the closest current installed parent, if any.\n\t\tconst packages: Package[] = [pkg];\n\t\tfor (let p = pkg.parent; p; p = p.parent) {\n\t\t\tpackages.push(p);\n\t\t}\n\t\tpackages.reverse();\n\t\tconst [srcPkg] = packages;\n\n\t\t// Find the lowest slice to read before compression.\n\t\t// Build transforms to pipe the source slice through.\n\t\tlet slice: [number, number] | null = null;\n\t\tconst transforms: Transform[] = [];\n\t\t{\n\t\t\tlet i = 1;\n\t\t\twhile (i < packages.length) {\n\t\t\t\tconst p = packages[i++];\n\t\t\t\tconst [ss, sl] = p.getZippedSlice();\n\t\t\t\tif (slice) {\n\t\t\t\t\tslice[0] += ss;\n\t\t\t\t\tslice[1] = sl;\n\t\t\t\t} else {\n\t\t\t\t\tslice = [ss, sl];\n\t\t\t\t}\n\t\t\t\tconst d = p.getZippedDecompressor();\n\t\t\t\tif (d) {\n\t\t\t\t\ttransforms.push(d);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (i < packages.length) {\n\t\t\t\tconst p = packages[i++];\n\t\t\t\tconst [ss, sl] = p.getZippedSlice();\n\t\t\t\ttransforms.push(new SliceStream(ss, sl));\n\t\t\t\tconst d = p.getZippedDecompressor();\n\t\t\t\tif (d) {\n\t\t\t\t\ttransforms.push(d);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.eventPackageInstallBefore.trigger({\n\t\t\tpackage: pkg\n\t\t});\n\n\t\tconst outFile = await this.pathToPackage(pkg, pkg.file);\n\t\tconst tmpDir = await this.pathToPackageMeta(pkg, TEMP_DIR);\n\t\tconst tmpFile = pathJoin(tmpDir, `${pkg.sha256}${TEMP_EXT}`);\n\t\tconst metaFile = await this.pathToPackageMeta(pkg, this.packageFile);\n\n\t\t// Create temporary directory, cleanup on failure.\n\t\tawait rm(tmpDir, {recursive: true, force: true});\n\t\tawait mkdir(tmpDir, {recursive: true});\n\t\tconst fd = await open(tmpFile, 'wx');\n\t\ttry {\n\t\t\tconst output = new WriterStream(tmpFile, {\n\t\t\t\tfd\n\t\t\t});\n\n\t\t\tthis.eventPackageDownloadBefore.trigger({\n\t\t\t\tpackage: pkg\n\t\t\t});\n\n\t\t\tthis.eventPackageDownloadProgress.trigger({\n\t\t\t\tpackage: pkg,\n\t\t\t\ttotal: pkg.size,\n\t\t\t\tamount: 0\n\t\t\t});\n\n\t\t\t// Create output file, monitoring write progress.\n\t\t\toutput.on('wrote', () => {\n\t\t\t\tthis.eventPackageDownloadProgress.trigger({\n\t\t\t\t\tpackage: pkg,\n\t\t\t\t\ttotal: pkg.size,\n\t\t\t\t\tamount: output.bytesWritten\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tlet input: NodeJS.ReadableStream;\n\t\t\tconst url = srcPkg.source;\n\t\t\tif (slice) {\n\t\t\t\tconst [start, size] = slice;\n\t\t\t\tif (size > 0) {\n\t\t\t\t\tconst init = {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t...this.headers,\n\t\t\t\t\t\t\tRange: `bytes=${start}-${start + size - 1}`\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tconst res = await retry(async () => fetch(url, init)).catch(\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\tthis._fetchErrorMessage(err as Error)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\tconst {status} = res;\n\t\t\t\t\tif (status !== 206) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Invalid resume status: ${status}: ${url}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst cl = res.headers.get('content-length');\n\t\t\t\t\tif (cl && +cl !== size) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Invalid resume content-length: ${cl}: ${url}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst {body} = res;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinput = Readable.fromWeb(body as ReadableStream);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tinput = body as NodeJS.ReadableStream;\n\t\t\t\t\t}\n\t\t\t\t} else if (size === 0) {\n\t\t\t\t\tinput = new EmptyStream();\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Cannot download negative size: ${size}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst init = {\n\t\t\t\t\theaders: this.headers\n\t\t\t\t};\n\t\t\t\tconst res = await retry(async () => fetch(url, init)).catch(\n\t\t\t\t\terr => {\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\tthis._fetchErrorMessage(err as Error)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tconst {status} = res;\n\t\t\t\tif (status !== 200) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid download status: ${status}: ${url}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst cl = res.headers.get('content-length');\n\t\t\t\tif (cl && +cl !== srcPkg.size) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid download content-length: ${cl}: ${url}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst {body} = res;\n\t\t\t\ttry {\n\t\t\t\t\tinput = Readable.fromWeb(body as ReadableStream);\n\t\t\t\t} catch {\n\t\t\t\t\tinput = body as NodeJS.ReadableStream;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Hash the last readable stream to verify package.\n\t\t\tconst hash = createHash('sha256');\n\t\t\tconst {length} = transforms;\n\t\t\tconst lastData = length ? transforms[length - 1] : input;\n\t\t\tlastData.on('data', (data: Buffer) => {\n\t\t\t\thash.update(data);\n\t\t\t});\n\n\t\t\t// Pipe all the streams through the pipeline.\n\t\t\t// Work around types failing on variable args.\n\t\t\tawait (pipeline as (...args: unknown[]) => Promise<void>)(\n\t\t\t\tinput,\n\t\t\t\t...transforms,\n\t\t\t\toutput\n\t\t\t);\n\n\t\t\t// Verify the write size.\n\t\t\tif (output.bytesWritten !== pkg.size) {\n\t\t\t\tthrow new Error(`Invalid extract size: ${output.bytesWritten}`);\n\t\t\t}\n\n\t\t\t// Verify the file hash.\n\t\t\tconst hashed = hash.digest().toString('hex');\n\t\t\tif (hashed !== pkg.sha256) {\n\t\t\t\tthrow new Error(`Invalid sha256 hash: ${hashed}`);\n\t\t\t}\n\n\t\t\tthis.eventPackageDownloadAfter.trigger({\n\t\t\t\tpackage: pkg\n\t\t\t});\n\n\t\t\t// Move the final file into place and write package file.\n\t\t\t// Write the package receipt last, means successful install.\n\t\t\tawait this._packageDirsEnsure(pkg);\n\t\t\tawait rm(metaFile, {force: true});\n\t\t\tawait rm(outFile, {force: true});\n\t\t\tawait rename(tmpFile, outFile);\n\t\t\tawait this._packageMetaReceiptWrite(pkg);\n\t\t} finally {\n\t\t\t// Should normally closed when stream ends.\n\t\t\tawait fd.close();\n\t\t\tawait rm(tmpDir, {recursive: true, force: true});\n\t\t}\n\n\t\tthis.eventPackageInstallAfter.trigger({\n\t\t\tpackage: pkg\n\t\t});\n\n\t\treturn packages;\n\t}\n\n\t/**\n\t * Remove package.\n\t *\n\t * @param pkg The package.\n\t * @returns True if removed, false if nothing to remove.\n\t */\n\tpublic async remove(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\n\t\tconst dir = await this.pathToPackage(pkg);\n\t\tconst stat = await lstat(dir).catch(() => null);\n\t\tif (!stat) {\n\t\t\treturn false;\n\t\t}\n\t\tconst dirMeta = await this.pathToPackageMeta(pkg);\n\n\t\t// Remove meta directory first, avoid partial installed state.\n\t\tawait rm(dirMeta, {recursive: true, force: true});\n\t\tawait rm(dir, {recursive: true, force: true});\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check if package name is obsolete.\n\t *\n\t * @param pkg The package.\n\t * @returns True if package obslete, else false.\n\t */\n\tpublic async isObsolete(pkg: string) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn (\n\t\t\t!pkg.startsWith('.') &&\n\t\t\t!(await this.packageByName(pkg)) &&\n\t\t\taccess(await this.pathToPackageMeta(pkg)).then(\n\t\t\t\t() => true,\n\t\t\t\t() => false\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * List obsolete package names.\n\t *\n\t * @returns A list of obsolete package names.\n\t */\n\tpublic async obsolete() {\n\t\tawait this.ensureLoaded();\n\n\t\tconst list: string[] = [];\n\t\tfor (const entry of await this._packageDirectories()) {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tif (await this.isObsolete(entry)) {\n\t\t\t\tlist.push(entry);\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * Cleanup all obsolete and outdated packages.\n\t *\n\t * @returns Lists of removed packages.\n\t */\n\tpublic async cleanup() {\n\t\tawait this.ensureLoaded();\n\n\t\tconst list: IPackageRemovedObsolete[] = [];\n\t\tfor (const pkg of await this._packageDirectories()) {\n\t\t\t// Remove any temporary directory if present.\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tconst tmpDir = await this.pathToPackageMeta(pkg, TEMP_DIR);\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tawait rm(tmpDir, {recursive: true, force: true});\n\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tif (await this.isObsolete(pkg)) {\n\t\t\t\tthis.eventPackageCleanupBefore.trigger({\n\t\t\t\t\tpackage: pkg\n\t\t\t\t});\n\n\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\tconst removed = await this.remove(pkg);\n\n\t\t\t\tthis.eventPackageCleanupAfter.trigger({\n\t\t\t\t\tpackage: pkg,\n\t\t\t\t\tremoved\n\t\t\t\t});\n\t\t\t\tlist.push({\n\t\t\t\t\tpackage: pkg,\n\t\t\t\t\tremoved\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * Join path on the base path.\n\t *\n\t * @param parts Path parts.\n\t * @returns Joined path.\n\t */\n\tpublic pathTo(...parts: string[]) {\n\t\treturn pathJoin(this.path, ...parts);\n\t}\n\n\t/**\n\t * Join path on the meta path.\n\t *\n\t * @param parts Path parts.\n\t * @returns Joined path.\n\t */\n\tpublic pathToMeta(...parts: string[]) {\n\t\treturn this.pathTo(this.metaDir, ...parts);\n\t}\n\n\t/**\n\t * Join path on package base path.\n\t *\n\t * @param pkg The package.\n\t * @param parts Path parts.\n\t * @returns Joined path.\n\t */\n\tpublic async pathToPackage(pkg: PackageLike, ...parts: string[]) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn this.pathTo(await this._asName(pkg), ...parts);\n\t}\n\n\t/**\n\t * Join path on package meta path.\n\t *\n\t * @param pkg The package.\n\t * @param parts Path parts.\n\t * @returns Joined path.\n\t */\n\tpublic async pathToPackageMeta(pkg: PackageLike, ...parts: string[]) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn this.pathTo(await this._asName(pkg), this.metaDir, ...parts);\n\t}\n\n\t/**\n\t * Get package object by object, name, or hash.\n\t * Throw error if package is unknown.\n\t *\n\t * @param pkg The package.\n\t * @returns Package object.\n\t */\n\tprotected async _asPackage(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\n\t\tif (typeof pkg === 'string') {\n\t\t\tconst p = await this.packageByUnique(pkg);\n\t\t\tif (!p) {\n\t\t\t\tthrow new Error(`Unknown package: ${pkg}`);\n\t\t\t}\n\t\t\treturn p;\n\t\t}\n\t\treturn pkg;\n\t}\n\n\t/**\n\t * Get package name by object, name, or hash.\n\t * If package object is passed, uses name from the object.\n\t * If string is passed and unknown, returns that same string.\n\t *\n\t * @param pkg The package.\n\t * @returns Package object.\n\t */\n\tprotected async _asName(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\n\t\treturn typeof pkg === 'string'\n\t\t\t? ((await this.packageByUnique(pkg))?.name ?? pkg)\n\t\t\t: pkg.name;\n\t}\n\n\t/**\n\t * Write package installed receipt.\n\t *\n\t * @param pkg The package.\n\t */\n\tprotected async _packageMetaReceiptWrite(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\n\t\tconst pkgf = await this.pathToPackageMeta(pkg, this.packageFile);\n\t\tconst pkgfTmp = `${pkgf}${TEMP_EXT}`;\n\n\t\tconst receipt = await this._packageMetaReceiptFromPackage(pkg);\n\t\tawait rm(pkgfTmp, {force: true});\n\t\tawait writeFile(pkgfTmp, JSON.stringify(receipt, null, '\\t'), {\n\t\t\tflag: 'wx'\n\t\t});\n\t\tawait rename(pkgfTmp, pkgf);\n\t}\n\n\t/**\n\t * Create package installed receipt object from a package.\n\t *\n\t * @param pkg The package.\n\t * @returns Receipt object.\n\t */\n\tprotected async _packageMetaReceiptFromPackage(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\n\t\tconst r: IPackageReceipt = {\n\t\t\tname: pkg.name,\n\t\t\tfile: pkg.file,\n\t\t\tsize: pkg.size,\n\t\t\tsha256: pkg.sha256,\n\t\t\tsource: pkg.source\n\t\t};\n\t\treturn r;\n\t}\n\n\t/**\n\t * Ensure package directory exists.\n\t *\n\t * @param pkg The package.\n\t */\n\tprotected async _packageDirsEnsure(pkg: PackageLike) {\n\t\tawait this.ensureLoaded();\n\t\tpkg = await this._asPackage(pkg);\n\n\t\tconst dir = await this.pathToPackage(pkg);\n\t\tconst dirMeta = await this.pathToPackageMeta(pkg);\n\t\tawait mkdir(dir, {recursive: true});\n\t\tawait mkdir(dirMeta, {recursive: true});\n\t}\n\n\t/**\n\t * Ensure fetch-like function is set.\n\t *\n\t * @returns The fetch-like function.\n\t */\n\tprotected _ensureFetch(): IFetch {\n\t\tconst {fetch} = this;\n\t\tif (!fetch) {\n\t\t\tthrow new Error('Default fetch not available');\n\t\t}\n\t\treturn fetch;\n\t}\n\n\t/**\n\t * Get fetch error messsage.\n\t *\n\t * @param error Error object.\n\t * @returns Error message.\n\t */\n\tprotected _fetchErrorMessage(error: Error) {\n\t\tconst {message, cause} = error;\n\t\tlet msg = message;\n\t\tif (cause) {\n\t\t\tconst {name, code} = cause as {name: unknown; code: unknown};\n\t\t\tconst info = [name, code].filter(Boolean).join(' ');\n\t\t\tif (info) {\n\t\t\t\tmsg += ` (${info})`;\n\t\t\t}\n\t\t}\n\t\treturn msg;\n\t}\n\n\t/**\n\t * List directories under package manger control.\n\t *\n\t * @returns The recognized package directories.\n\t */\n\tprotected async _packageDirectories() {\n\t\treturn (await readdir(this.path, {withFileTypes: true}))\n\t\t\t.filter(e => !e.name.startsWith('.') && e.isDirectory())\n\t\t\t.map(e => e.name)\n\t\t\t.sort();\n\t}\n\n\t/**\n\t * Request the packages file.\n\t *\n\t * @returns File contents as string.\n\t */\n\tprotected async _requestPackages() {\n\t\tconst fetch = this._ensureFetch();\n\n\t\tconst url = this.packagesUrl;\n\t\tconst init = {\n\t\t\theaders: {\n\t\t\t\t...this.headers,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\t\t\t'Cache-Control': 'max-age=0',\n\t\t\t\tPragma: 'no-cache'\n\t\t\t}\n\t\t};\n\t\tconst res = await retry(async () => fetch(url, init)).catch(err => {\n\t\t\tif (err) {\n\t\t\t\tthrow new Error(this._fetchErrorMessage(err as Error));\n\t\t\t}\n\t\t\tthrow err;\n\t\t});\n\t\tconst {status} = res;\n\t\tif (status !== 200) {\n\t\t\tthrow new Error(`Invalid response status: ${status}: ${url}`);\n\t\t}\n\t\treturn res.text();\n\t}\n\n\t/**\n\t * Ensure base directories exists.\n\t */\n\tprotected async _ensureDirs() {\n\t\tawait mkdir(this.path, {recursive: true});\n\t\tawait mkdir(this.pathToMeta(), {recursive: true});\n\t}\n\n\t/**\n\t * Create the main path.\n\t *\n\t * @param path The path, defaults to environment variable or relative.\n\t * @returns Main path.\n\t */\n\tprotected _createPath(path: string | null) {\n\t\t// Use specified, or environment variable, or relative default.\n\t\t// eslint-disable-next-line no-process-env\n\t\treturn path || process.env[PATH_ENV] || MAIN_DIR;\n\t}\n\n\t/**\n\t * Create the Packages instance.\n\t *\n\t * @returns Packages instance.\n\t */\n\tprotected _createPackages() {\n\t\treturn new Packages(this.pathToMeta(this.packagesFile));\n\t}\n}\n"],"mappings":"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