@verdaccio/local-storage 11.0.0-6-next.21 → 11.0.0-6-next.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"local-database.js","names":["TOKEN_DB_NAME","DB_NAME","process","env","VERDACCIO_STORAGE_NAME","fileUtils","Files","DatabaseName","debug","buildDebug","ERROR_DB_LOCKED","LocalDatabase","pluginUtils","Plugin","constructor","config","logger","tokenDb","locked","data","undefined","configPath","path","_dbGenPath","storages","_getCustomPackageLocalStorages","info","init","fetchLocalPackages","_sync","getSecret","Error","Promise","resolve","secret","setSecret","add","name","list","indexOf","push","getStoragePath","storage","TypeError","storagePath","isAbsolute","normalize","join","getBaseConfigPath","dirname","filterByQuery","results","query","filter","item","match","text","getScore","_pkg","final","detail","maintenance","popularity","quality","search","packagesOnStorage","searchOnStorage","length","isPrivate","includes","score","package","verdaccioPrivate","verdaccioPkgCached","remove","get","pkgName","splice","err","error","errorUtils","getInternalError","totalItems","getPackageStorage","packageName","packageAccess","getMatchedPackagesSpec","packages","packagePath","_getLocalStoragePath","_","isString","packageStoragePath","config_path","LocalDriver","clean","Map","Object","keys","map","pkg","set","folderName","mkdirPromise","recursive","writeFilePromise","JSON","stringify","globalConfigStorage","isNil","loadPrivatePackages","warn","code","noSuchFile","message","getTokenDb","adapter","NODE_ENV","FileMemory","pathDb","FileAsync","low","saveToken","token","key","db","userData","user","value","write","getState","deleteToken","tokenKey","userTokens","remainingTokens","readTokens","tokens"],"sources":["../src/local-database.ts"],"sourcesContent":["// import LRU from 'lru-cache';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport low from 'lowdb';\nimport FileAsync from 'lowdb/adapters/FileAsync';\nimport FileMemory from 'lowdb/adapters/Memory';\nimport path from 'path';\n\nimport { errorUtils, fileUtils, pluginUtils, searchUtils } from '@verdaccio/core';\nimport { Config, Logger, Token, TokenFilter } from '@verdaccio/types';\nimport { getMatchedPackagesSpec } from '@verdaccio/utils';\n\nimport { searchOnStorage } from './dir-utils';\nimport { mkdirPromise, writeFilePromise } from './fs';\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { LocalStorage, loadPrivatePackages } from './pkg-utils';\nimport { _dbGenPath } from './utils';\n\nconst TOKEN_DB_NAME = '.token-db.json';\nconst DB_NAME = process.env.VERDACCIO_STORAGE_NAME ?? fileUtils.Files.DatabaseName;\n\nconst debug = buildDebug('verdaccio:plugin:local-storage');\n\nexport const ERROR_DB_LOCKED =\n 'Database is locked, please check error message printed during startup to prevent data loss';\n\ntype Storage = pluginUtils.Storage<{}>;\n\nclass LocalDatabase extends pluginUtils.Plugin<{}> implements Storage {\n private readonly path: string;\n private readonly logger: Logger;\n public readonly config: Config;\n public readonly storages: Map<string, string>;\n public data: LocalStorage | undefined;\n public locked: boolean;\n public tokenDb: low.LowdbAsync<any> | null;\n\n public constructor(config: Config, logger: Logger) {\n // TODO: fix double config\n super(config, { config, logger });\n this.tokenDb = null;\n this.config = config;\n this.logger = logger;\n this.locked = false;\n this.data = undefined;\n debug('config path %o', config.configPath);\n this.path = _dbGenPath(DB_NAME, config);\n this.storages = this._getCustomPackageLocalStorages();\n this.logger.info({ path: this.path }, 'local storage path @{path}');\n debug('plugin storage path %o', this.path);\n }\n\n public async init(): Promise<void> {\n debug('plugin init');\n this.data = await this.fetchLocalPackages();\n debug('local packages loaded');\n await this._sync();\n }\n\n public async getSecret(): Promise<string> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n return Promise.resolve(this.data.secret);\n }\n\n public async setSecret(secret: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n } else {\n this.data.secret = secret;\n }\n\n await this._sync();\n }\n\n public async add(name: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n if (this.data.list.indexOf(name) === -1) {\n this.data.list.push(name);\n debug('the private package %s has been added', name);\n await this._sync();\n } else {\n debug('the private package %s already exist on database', name);\n return Promise.resolve();\n }\n }\n\n /**\n * The field storage could be absolute or relative.\n * If relative, it will be resolved against the config path.\n * If absolute, it will be returned as is.\n **/\n private getStoragePath() {\n const { storage } = this.config;\n if (typeof storage !== 'string') {\n throw new TypeError('storage field is mandatory');\n }\n\n const storagePath = path.isAbsolute(storage)\n ? storage\n : path.normalize(path.join(this.getBaseConfigPath(), storage));\n debug('storage path %o', storagePath);\n return storagePath;\n }\n\n private getBaseConfigPath(): string {\n return path.dirname(this.config.configPath);\n }\n\n /**\n * Filter and only match those values that the query define.\n **/\n public async filterByQuery(results: searchUtils.SearchItemPkg[], query: searchUtils.SearchQuery) {\n // FUTURE: apply new filters, keyword, version, ...\n return results.filter((item: searchUtils.SearchItemPkg) => {\n return item?.name?.match(query.text) !== null;\n }) as searchUtils.SearchItemPkg[];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public async getScore(_pkg: searchUtils.SearchItemPkg): Promise<searchUtils.Score> {\n // TODO: there is no particular reason to predefined scores\n // could be improved by using\n return Promise.resolve({\n final: 1,\n detail: {\n maintenance: 0,\n popularity: 1,\n quality: 1,\n },\n });\n }\n\n public async search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]> {\n const results: searchUtils.SearchItem[] = [];\n const storagePath = this.getStoragePath();\n const packagesOnStorage = await this.filterByQuery(\n await searchOnStorage(storagePath, this.storages),\n query\n );\n debug('packages found %o', packagesOnStorage.length);\n for (let storage of packagesOnStorage) {\n // check if package is listed on the cache private database\n const isPrivate = (this.data as LocalStorage).list.includes(storage.name);\n const score = await this.getScore(storage);\n results.push({\n package: storage,\n verdaccioPrivate: isPrivate,\n verdaccioPkgCached: !isPrivate,\n score,\n });\n }\n return results;\n }\n\n public async remove(name: string): Promise<void> {\n try {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const data = await this.get();\n\n const pkgName = data.indexOf(name);\n if (pkgName !== -1) {\n this.data.list.splice(pkgName, 1);\n debug('remove package %o has been removed', name);\n }\n await this._sync();\n } catch (err) {\n this.logger.error({ err }, 'remove the private package has failed @{err}');\n throw errorUtils.getInternalError('error remove private package');\n }\n }\n\n public async get(): Promise<any> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const { list } = this.data;\n const totalItems = list?.length;\n debug('get full list of packages (%o) has been fetched', totalItems);\n return Promise.resolve(list);\n }\n\n public getPackageStorage(packageName: string): pluginUtils.StorageHandler {\n const packageAccess = getMatchedPackagesSpec(packageName, this.config.packages);\n\n const packagePath: string = this._getLocalStoragePath(\n packageAccess ? packageAccess.storage : undefined\n );\n debug('storage path selected: ', packagePath);\n if (_.isString(packagePath) === false) {\n debug('the package %o has no storage defined ', packageName);\n throw errorUtils.getInternalError('storage not found or implemented');\n }\n\n const packageStoragePath: string = path.join(\n // FIXME: use getBaseStoragePath instead\n path.resolve(path.dirname(this.config.config_path || ''), packagePath),\n packageName\n );\n\n debug('storage absolute path: ', packageStoragePath);\n\n return new LocalDriver(packageStoragePath, this.logger);\n }\n\n public async clean(): Promise<void> {\n await this._sync();\n }\n\n private _getCustomPackageLocalStorages(): Map<string, string> {\n const storages = new Map<string, string>();\n const { packages } = this.config;\n\n if (packages) {\n Object.keys(packages || {}).map((pkg) => {\n const { storage } = packages[pkg];\n if (typeof storage === 'string') {\n const storagePath = path.join(this.getStoragePath(), storage);\n debug('add custom storage for %s on %s', storage, storagePath);\n storages.set(storage, storagePath);\n }\n });\n }\n\n return storages;\n }\n\n private async _sync(): Promise<null> {\n debug('sync database started');\n\n if (this.locked) {\n this.logger.error(ERROR_DB_LOCKED);\n throw new Error(ERROR_DB_LOCKED);\n }\n // Uses sync to prevent ugly race condition\n try {\n const folderName = path.dirname(this.path);\n debug('creating folder %o', folderName);\n await mkdirPromise(folderName, { recursive: true });\n debug('creating folder %o created succeed', folderName);\n } catch (err) {\n this.logger.error({ err }, 'sync create folder has failed with error: @{err}');\n throw err;\n }\n\n try {\n await writeFilePromise(this.path, JSON.stringify(this.data));\n debug('sync write succeeded');\n\n return null;\n } catch (err: any) {\n this.logger.error({ err }, 'sync database file failed: @{err}');\n throw err;\n }\n }\n\n private _getLocalStoragePath(storage: string | void): string {\n const globalConfigStorage = this.getStoragePath();\n if (_.isNil(globalConfigStorage)) {\n this.logger.error('property storage in config.yaml is required for using this plugin');\n throw new Error('property storage in config.yaml is required for using this plugin');\n } else {\n if (typeof storage === 'string') {\n return path.join(globalConfigStorage as string, storage as string);\n }\n\n return globalConfigStorage as string;\n }\n }\n\n private async fetchLocalPackages(): Promise<LocalStorage> {\n try {\n return await loadPrivatePackages(this.path, this.logger);\n } catch (err: any) {\n // readFileSync is platform specific, macOS, Linux and Windows thrown an error\n // Only recreate if file not found to prevent data loss\n this.logger.warn(\n { path: this.path },\n 'no private database found, recreating new one on @{path}'\n );\n if (err.code !== noSuchFile) {\n this.locked = true;\n this.logger.error(\n 'Failed to read package database file, please check the error printed below:\\n',\n `File Path: ${this.path}\\n\\n ${err.message}`\n );\n }\n // if no database is found we set empty placeholders\n return { list: [], secret: '' };\n }\n }\n\n private async getTokenDb(): Promise<low.LowdbAsync<any>> {\n if (!this.tokenDb) {\n debug('token database is not defined');\n let adapter;\n if (process.env.NODE_ENV === 'test') {\n debug('token memory adapter');\n adapter = new FileMemory('');\n } else {\n debug('token async adapter');\n const pathDb = _dbGenPath(TOKEN_DB_NAME, this.config);\n adapter = new FileAsync(pathDb);\n }\n debug('token bd generated');\n this.tokenDb = await low(adapter);\n }\n\n return this.tokenDb;\n }\n\n public async saveToken(token: Token): Promise<void> {\n debug('token key %o', token.key);\n const db = await this.getTokenDb();\n const userData = await db.get(token.user).value();\n debug('user data %o', userData);\n if (_.isNil(userData)) {\n await db.set(token.user, [token]).write();\n debug('token user %o new database', token.user);\n } else {\n // types does not match with valid implementation\n // @ts-ignore\n await db.get(token.user).push(token).write();\n }\n debug('data %o', await db.getState());\n debug('token saved %o', token.user);\n }\n\n public async deleteToken(user: string, tokenKey: string): Promise<void> {\n const db = await this.getTokenDb();\n const userTokens = await db.get(user).value();\n if (_.isNil(userTokens)) {\n throw new Error('user not found');\n }\n debug('tokens %o - %o', userTokens, userTokens.length);\n const remainingTokens = userTokens.filter(({ key }) => {\n debug('key %o', key);\n return key !== tokenKey;\n });\n await db.set(user, remainingTokens).write();\n debug('removed tokens key %o', tokenKey);\n }\n\n public async readTokens(filter: TokenFilter): Promise<Token[]> {\n const { user } = filter;\n debug('read tokens with %o', user);\n const db = await this.getTokenDb();\n const tokens = await db.get(user).value();\n return tokens || [];\n }\n}\n\nexport default LocalDatabase;\n"],"mappings":"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"}
1
+ {"version":3,"file":"local-database.js","names":["TOKEN_DB_NAME","DB_NAME","process","env","VERDACCIO_STORAGE_NAME","fileUtils","Files","DatabaseName","debug","buildDebug","ERROR_DB_LOCKED","LocalDatabase","pluginUtils","Plugin","constructor","config","logger","tokenDb","locked","data","undefined","configPath","path","_dbGenPath","storages","_getCustomPackageLocalStorages","info","init","fetchLocalPackages","_sync","getSecret","Error","Promise","resolve","secret","setSecret","add","name","list","indexOf","push","getStoragePath","storage","TypeError","storagePath","isAbsolute","normalize","join","getBaseConfigPath","dirname","filterByQuery","results","query","filter","item","match","text","getScore","_pkg","final","detail","maintenance","popularity","quality","search","packagesOnStorage","searchOnStorage","length","isPrivate","includes","score","package","verdaccioPrivate","verdaccioPkgCached","remove","get","pkgName","splice","err","error","errorUtils","getInternalError","totalItems","getPackageStorage","packageName","packageAccess","getMatchedPackagesSpec","packages","packagePath","_getLocalStoragePath","_","isString","packageStoragePath","config_path","LocalDriver","clean","Map","Object","keys","map","pkg","set","folderName","mkdirPromise","recursive","writeFilePromise","JSON","stringify","globalConfigStorage","isNil","loadPrivatePackages","warn","code","noSuchFile","message","getTokenDb","adapter","NODE_ENV","FileMemory","pathDb","FileAsync","low","saveToken","token","key","db","userData","user","value","write","getState","deleteToken","tokenKey","userTokens","remainingTokens","readTokens","tokens"],"sources":["../src/local-database.ts"],"sourcesContent":["// import LRU from 'lru-cache';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport low from 'lowdb';\nimport FileAsync from 'lowdb/adapters/FileAsync';\nimport FileMemory from 'lowdb/adapters/Memory';\nimport path from 'path';\n\nimport { errorUtils, fileUtils, pluginUtils, searchUtils } from '@verdaccio/core';\nimport { Config, Logger, Token, TokenFilter } from '@verdaccio/types';\nimport { getMatchedPackagesSpec } from '@verdaccio/utils';\n\nimport { searchOnStorage } from './dir-utils';\nimport { mkdirPromise, writeFilePromise } from './fs';\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { LocalStorage, loadPrivatePackages } from './pkg-utils';\nimport { _dbGenPath } from './utils';\n\nconst TOKEN_DB_NAME = '.token-db.json';\nconst DB_NAME = process.env.VERDACCIO_STORAGE_NAME ?? fileUtils.Files.DatabaseName;\n\nconst debug = buildDebug('verdaccio:plugin:local-storage');\n\nexport const ERROR_DB_LOCKED =\n 'Database is locked, please check error message printed during startup to prevent data loss';\n\ntype Storage = pluginUtils.Storage<{}>;\n\nclass LocalDatabase extends pluginUtils.Plugin<{}> implements Storage {\n private readonly path: string;\n private readonly logger: Logger;\n public readonly config: Config;\n public readonly storages: Map<string, string>;\n public data: LocalStorage | undefined;\n public locked: boolean;\n public tokenDb: low.LowdbAsync<any> | null;\n\n public constructor(config: Config, logger: Logger) {\n // TODO: fix double config\n super(config, { config, logger });\n this.tokenDb = null;\n this.config = config;\n this.logger = logger;\n this.locked = false;\n this.data = undefined;\n debug('config path %o', config.configPath);\n this.path = _dbGenPath(DB_NAME, config);\n this.storages = this._getCustomPackageLocalStorages();\n this.logger.info({ path: this.path }, 'local storage path @{path}');\n debug('plugin storage path %o', this.path);\n }\n\n public async init(): Promise<void> {\n debug('plugin init');\n this.data = await this.fetchLocalPackages();\n debug('local packages loaded');\n await this._sync();\n }\n\n public async getSecret(): Promise<string> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n return Promise.resolve(this.data.secret);\n }\n\n public async setSecret(secret: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n } else {\n this.data.secret = secret;\n }\n\n await this._sync();\n }\n\n public async add(name: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n if (this.data.list.indexOf(name) === -1) {\n this.data.list.push(name);\n debug('the private package %s has been added', name);\n await this._sync();\n } else {\n debug('the private package %s already exist on database', name);\n return Promise.resolve();\n }\n }\n\n /**\n * The field storage could be absolute or relative.\n * If relative, it will be resolved against the config path.\n * If absolute, it will be returned as is.\n **/\n private getStoragePath() {\n const { storage } = this.config;\n if (typeof storage !== 'string') {\n throw new TypeError('storage field is mandatory');\n }\n\n const storagePath = path.isAbsolute(storage)\n ? storage\n : path.normalize(path.join(this.getBaseConfigPath(), storage));\n debug('storage path %o', storagePath);\n return storagePath;\n }\n\n private getBaseConfigPath(): string {\n return path.dirname(this.config.configPath);\n }\n\n /**\n * Filter and only match those values that the query define.\n **/\n public async filterByQuery(results: searchUtils.SearchItemPkg[], query: searchUtils.SearchQuery) {\n // FUTURE: apply new filters, keyword, version, ...\n return results.filter((item: searchUtils.SearchItemPkg) => {\n return item?.name?.match(query.text) !== null;\n }) as searchUtils.SearchItemPkg[];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public async getScore(_pkg: searchUtils.SearchItemPkg): Promise<searchUtils.Score> {\n // TODO: there is no particular reason to predefined scores\n // could be improved by using\n return Promise.resolve({\n final: 1,\n detail: {\n maintenance: 0,\n popularity: 1,\n quality: 1,\n },\n });\n }\n\n public async search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]> {\n const results: searchUtils.SearchItem[] = [];\n const storagePath = this.getStoragePath();\n const packagesOnStorage = await this.filterByQuery(\n await searchOnStorage(storagePath, this.storages),\n query\n );\n debug('packages found %o', packagesOnStorage.length);\n for (let storage of packagesOnStorage) {\n // check if package is listed on the cache private database\n const isPrivate = (this.data as LocalStorage).list.includes(storage.name);\n const score = await this.getScore(storage);\n results.push({\n package: storage,\n verdaccioPrivate: isPrivate,\n verdaccioPkgCached: !isPrivate,\n score,\n });\n }\n return results;\n }\n\n public async remove(name: string): Promise<void> {\n try {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const data = await this.get();\n\n const pkgName = data.indexOf(name);\n if (pkgName !== -1) {\n this.data.list.splice(pkgName, 1);\n debug('remove package %o has been removed', name);\n }\n await this._sync();\n } catch (err) {\n this.logger.error({ err }, 'remove the private package has failed @{err}');\n throw errorUtils.getInternalError('error remove private package');\n }\n }\n\n public async get(): Promise<any> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const { list } = this.data;\n const totalItems = list?.length;\n debug('get full list of packages (%o) has been fetched', totalItems);\n return Promise.resolve(list);\n }\n\n public getPackageStorage(packageName: string): pluginUtils.StorageHandler {\n const packageAccess = getMatchedPackagesSpec(packageName, this.config.packages);\n\n const packagePath: string = this._getLocalStoragePath(\n packageAccess ? packageAccess.storage : undefined\n );\n debug('storage path selected: ', packagePath);\n if (_.isString(packagePath) === false) {\n debug('the package %o has no storage defined ', packageName);\n throw errorUtils.getInternalError('storage not found or implemented');\n }\n\n const packageStoragePath: string = path.join(\n // FIXME: use getBaseStoragePath instead\n path.resolve(path.dirname(this.config.config_path || ''), packagePath),\n packageName\n );\n\n debug('storage absolute path: ', packageStoragePath);\n\n return new LocalDriver(packageStoragePath, this.logger);\n }\n\n public async clean(): Promise<void> {\n await this._sync();\n }\n\n private _getCustomPackageLocalStorages(): Map<string, string> {\n const storages = new Map<string, string>();\n const { packages } = this.config;\n\n if (packages) {\n Object.keys(packages || {}).map((pkg) => {\n const { storage } = packages[pkg];\n if (typeof storage === 'string') {\n const storagePath = path.join(this.getStoragePath(), storage);\n debug('add custom storage for %s on %s', storage, storagePath);\n storages.set(storage, storagePath);\n }\n });\n }\n\n return storages;\n }\n\n private async _sync(): Promise<null> {\n debug('sync database started');\n\n if (this.locked) {\n this.logger.error(ERROR_DB_LOCKED);\n throw new Error(ERROR_DB_LOCKED);\n }\n // Uses sync to prevent ugly race condition\n try {\n const folderName = path.dirname(this.path);\n debug('creating folder %o', folderName);\n await mkdirPromise(folderName, { recursive: true });\n debug('creating folder %o created succeed', folderName);\n } catch (err) {\n this.logger.error({ err }, 'sync create folder has failed with error: @{err}');\n throw err;\n }\n\n try {\n await writeFilePromise(this.path, JSON.stringify(this.data));\n debug('sync write succeeded');\n\n return null;\n } catch (err: any) {\n this.logger.error({ err }, 'sync database file failed: @{err}');\n throw err;\n }\n }\n\n private _getLocalStoragePath(storage: string | void): string {\n const globalConfigStorage = this.getStoragePath();\n if (_.isNil(globalConfigStorage)) {\n this.logger.error('property storage in config.yaml is required for using this plugin');\n throw new Error('property storage in config.yaml is required for using this plugin');\n } else {\n if (typeof storage === 'string') {\n return path.join(globalConfigStorage as string, storage as string);\n }\n\n return globalConfigStorage as string;\n }\n }\n\n private async fetchLocalPackages(): Promise<LocalStorage> {\n try {\n return await loadPrivatePackages(this.path, this.logger);\n } catch (err: any) {\n // readFileSync is platform specific, macOS, Linux and Windows thrown an error\n // Only recreate if file not found to prevent data loss\n this.logger.warn(\n { path: this.path },\n 'no private database found, recreating new one on @{path}'\n );\n if (err.code !== noSuchFile) {\n this.locked = true;\n this.logger.error(\n 'Failed to read package database file, please check the error printed below:\\n',\n `File Path: ${this.path}\\n\\n ${err.message}`\n );\n }\n // if no database is found we set empty placeholders\n return { list: [], secret: '' };\n }\n }\n\n private async getTokenDb(): Promise<low.LowdbAsync<any>> {\n if (!this.tokenDb) {\n debug('token database is not defined');\n let adapter;\n if (process.env.NODE_ENV === 'test') {\n debug('token memory adapter');\n adapter = new FileMemory('');\n } else {\n debug('token async adapter');\n const pathDb = _dbGenPath(TOKEN_DB_NAME, this.config);\n adapter = new FileAsync(pathDb);\n }\n debug('token bd generated');\n this.tokenDb = await low(adapter);\n }\n\n return this.tokenDb;\n }\n\n public async saveToken(token: Token): Promise<void> {\n debug('token key %o', token.key);\n const db = await this.getTokenDb();\n const userData = await db.get(token.user).value();\n debug('user data %o', userData);\n if (_.isNil(userData)) {\n await db.set(token.user, [token]).write();\n debug('token user %o new database', token.user);\n } else {\n // types does not match with valid implementation\n // @ts-ignore\n await db.get(token.user).push(token).write();\n }\n debug('data %o', await db.getState());\n debug('token saved %o', token.user);\n }\n\n public async deleteToken(user: string, tokenKey: string): Promise<void> {\n const db = await this.getTokenDb();\n const userTokens = await db.get(user).value();\n if (_.isNil(userTokens)) {\n throw new Error('user not found');\n }\n debug('tokens %o - %o', userTokens, userTokens.length);\n const remainingTokens = userTokens.filter(({ key }) => {\n debug('key %o', key);\n return key !== tokenKey;\n });\n await db.set(user, remainingTokens).write();\n debug('removed tokens key %o', tokenKey);\n }\n\n public async readTokens(filter: TokenFilter): Promise<Token[]> {\n const { user } = filter;\n debug('read tokens with %o', user);\n const db = await this.getTokenDb();\n const tokens = await db.get(user).value();\n return tokens || [];\n }\n}\n\nexport default LocalDatabase;\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ export declare const fileExist = "EEXISTS";
6
6
  export declare const noSuchFile = "ENOENT";
7
7
  export declare const resourceNotAvailable = "EAGAIN";
8
8
  export declare const packageJSONFileName = "package.json";
9
- export declare type ILocalFSPackageManager = pluginUtils.StorageHandler & {
9
+ export type ILocalFSPackageManager = pluginUtils.StorageHandler & {
10
10
  path: string;
11
11
  };
12
12
  export declare const fSError: (message: string, code?: number) => VerdaccioError;
package/build/local-fs.js CHANGED
@@ -6,26 +6,17 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.packageJSONFileName = exports.noSuchFile = exports.fileExist = exports.fSError = exports.default = void 0;
7
7
  exports.renameTmp = renameTmp;
8
8
  exports.resourceNotAvailable = void 0;
9
-
10
9
  var _debug = _interopRequireDefault(require("debug"));
11
-
12
10
  var _fs = _interopRequireDefault(require("fs"));
13
-
14
11
  var _path = _interopRequireDefault(require("path"));
15
-
16
12
  var _sanitizeFilename = _interopRequireDefault(require("sanitize-filename"));
17
-
18
13
  var _stream = require("stream");
19
-
20
14
  var _core = require("@verdaccio/core");
21
-
22
15
  var _fileLocking = require("@verdaccio/file-locking");
23
-
24
16
  var _fs2 = require("./fs");
25
-
26
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
-
28
18
  /* eslint-disable no-undef */
19
+
29
20
  const fileExist = 'EEXISTS';
30
21
  exports.fileExist = fileExist;
31
22
  const noSuchFile = 'ENOENT';
@@ -35,25 +26,19 @@ exports.resourceNotAvailable = resourceNotAvailable;
35
26
  const packageJSONFileName = 'package.json';
36
27
  exports.packageJSONFileName = packageJSONFileName;
37
28
  const debug = (0, _debug.default)('verdaccio:plugin:local-storage:local-fs');
38
-
39
29
  const fSError = function (message, code = 409) {
40
- const err = _core.errorUtils.getCode(code, message); // FIXME: we should return http-status codes here instead, future improvement
30
+ const err = _core.errorUtils.getCode(code, message);
31
+ // FIXME: we should return http-status codes here instead, future improvement
41
32
  // @ts-ignore
42
-
43
-
44
33
  err.code = message;
45
34
  return err;
46
35
  };
47
-
48
36
  exports.fSError = fSError;
49
-
50
37
  const tempFile = function (str) {
51
38
  return `${str}.tmp${String(Math.random()).slice(2)}`;
52
39
  };
53
-
54
40
  async function renameTmp(src, dst) {
55
41
  debug('rename %s to %s', src, dst);
56
-
57
42
  try {
58
43
  await (0, _fs2.renamePromise)(src, dst);
59
44
  } catch (err) {
@@ -61,12 +46,12 @@ async function renameTmp(src, dst) {
61
46
  await (0, _fs2.unlinkPromise)(src);
62
47
  }
63
48
  }
64
-
65
49
  class LocalFS {
66
50
  constructor(path, logger) {
67
51
  this.path = path;
68
52
  this.logger = logger;
69
53
  }
54
+
70
55
  /**
71
56
  * This function allows to update the package
72
57
  * This function handle the update package logic, for this plugin
@@ -87,18 +72,14 @@ class LocalFS {
87
72
  * on the action and handled into the core.
88
73
  * @param {*} handleUpdate
89
74
  */
90
-
91
-
92
75
  async updatePackage(packageName, handleUpdate) {
93
76
  // this plugin lock files on write, we handle all possible scenarios
94
77
  let locked = false;
95
78
  let manifestUpdated;
96
-
97
79
  try {
98
80
  const manifest = await this._lockAndReadJSON(packageJSONFileName);
99
81
  locked = true;
100
82
  manifestUpdated = await handleUpdate(manifest);
101
-
102
83
  if (locked) {
103
84
  debug('unlock %s', packageJSONFileName);
104
85
  await this._unlockJSON(packageJSONFileName);
@@ -118,12 +99,11 @@ class LocalFS {
118
99
  err,
119
100
  packageName
120
101
  }, 'error @{err.message} on update package @{packageName}');
121
-
122
102
  if (locked) {
123
103
  // eslint-disable-next-line no-useless-catch
124
104
  try {
125
- await this._unlockJSON(packageJSONFileName); // after unlock bubble up error.
126
-
105
+ await this._unlockJSON(packageJSONFileName);
106
+ // after unlock bubble up error.
127
107
  throw err;
128
108
  } catch (err) {
129
109
  // unlock could fail, we bubble up error
@@ -140,26 +120,22 @@ class LocalFS {
140
120
  }
141
121
  }
142
122
  }
143
-
144
123
  async deletePackage(packageName) {
145
124
  debug('delete a file/package %o', packageName);
146
125
  return await (0, _fs2.unlinkPromise)(this._getStorage(packageName));
147
126
  }
148
-
149
127
  async removePackage() {
150
128
  debug('remove a package folder %o', this.path);
151
129
  await (0, _fs2.rmdirPromise)(this._getStorage('.'));
152
130
  }
131
+
153
132
  /**
154
133
  * Verify if the package exists already.
155
134
  * @param name package name
156
135
  * @returns
157
136
  */
158
-
159
-
160
137
  async hasPackage() {
161
138
  const pathName = this._getStorage(packageJSONFileName);
162
-
163
139
  try {
164
140
  const stat = await (0, _fs2.statPromise)(pathName);
165
141
  return stat.isFile();
@@ -173,18 +149,15 @@ class LocalFS {
173
149
  }
174
150
  }
175
151
  }
152
+
176
153
  /**
177
154
  * Create a package in the local storage, if package already exist fails.
178
155
  * @param name package name
179
156
  * @param manifest package manifest
180
157
  */
181
-
182
-
183
158
  async createPackage(name, manifest) {
184
159
  debug('create a a new package %o', name);
185
-
186
160
  const pathPackage = this._getStorage(packageJSONFileName);
187
-
188
161
  try {
189
162
  // https://nodejs.org/dist/latest-v17.x/docs/api/fs.html#file-system-flags
190
163
  // 'wx': Like 'w' but fails if the path exists
@@ -195,20 +168,16 @@ class LocalFS {
195
168
  debug('file %o cannot be created, it already exists: %o', name);
196
169
  throw fSError(fileExist);
197
170
  }
198
- } // Create a new file and it´s folder if does not exist previously
199
-
200
-
171
+ }
172
+ // Create a new file and it´s folder if does not exist previously
201
173
  await this.writeFile(pathPackage, this._convertToString(manifest));
202
174
  }
203
-
204
175
  async savePackage(name, value) {
205
176
  debug('save a package %o', name);
206
177
  await this.writeFile(this._getStorage(packageJSONFileName), this._convertToString(value));
207
178
  }
208
-
209
179
  async readPackage(name) {
210
180
  debug('read a package %o', name);
211
-
212
181
  try {
213
182
  const res = await this._readStorageFile(this._getStorage(packageJSONFileName));
214
183
  const data = JSON.parse(res.toString('utf8'));
@@ -222,50 +191,41 @@ class LocalFS {
222
191
  name
223
192
  }, 'error @{err.message} on parse @{name}');
224
193
  }
225
-
226
194
  throw err;
227
195
  }
228
196
  }
229
-
230
197
  async hasTarball(fileName) {
231
198
  const pathName = this._getStorage(fileName);
232
-
233
199
  return new Promise(resolve => {
234
200
  (0, _fs2.accessPromise)(pathName).then(() => {
235
201
  resolve(true);
236
202
  }).catch(() => resolve(false));
237
203
  });
238
- } // remove the temporary file
239
-
204
+ }
240
205
 
206
+ // remove the temporary file
241
207
  async removeTempFile(temporalName) {
242
208
  debug('remove temporal file %o', temporalName);
243
209
  await (0, _fs2.unlinkPromise)(temporalName);
244
210
  debug('removed temporal file %o', temporalName);
245
211
  }
212
+
246
213
  /**
247
214
  * Write a tarball into the storage
248
215
  * @param fileName package name
249
216
  * @param param1
250
217
  * @returns
251
218
  */
252
-
253
-
254
219
  async writeTarball(fileName, {
255
220
  signal
256
221
  }) {
257
222
  debug('write a tarball %o', fileName);
258
-
259
- const pathName = this._getStorage(fileName); // create a temporary file to avoid conflicts or prev corruption files
260
-
261
-
223
+ const pathName = this._getStorage(fileName);
224
+ // create a temporary file to avoid conflicts or prev corruption files
262
225
  const temporalName = _path.default.join(this.path, `${fileName}.tmp-${String(Math.random()).replace(/^0\./, '')}`);
263
-
264
226
  debug('write a temporal name %o', temporalName);
265
227
  let opened = false;
266
-
267
228
  const writeStream = _fs.default.createWriteStream(temporalName);
268
-
269
229
  writeStream.on('open', () => {
270
230
  opened = true;
271
231
  });
@@ -274,8 +234,8 @@ class LocalFS {
274
234
  this.logger.error({
275
235
  err: err.message,
276
236
  fileName
277
- }, 'error on open write tarball for @{pkgName}'); // TODO: maybe add .once
278
-
237
+ }, 'error on open write tarball for @{pkgName}');
238
+ // TODO: maybe add .once
279
239
  writeStream.on('close', async () => {
280
240
  await this.removeTempFile(temporalName);
281
241
  });
@@ -286,10 +246,11 @@ class LocalFS {
286
246
  }, 'error a non open write tarball for @{pkgName}');
287
247
  await this.removeTempFile(temporalName);
288
248
  }
289
- }); // the 'close' event is emitted when the stream and any of its
249
+ });
250
+
251
+ // the 'close' event is emitted when the stream and any of its
290
252
  // underlying resources (a file descriptor, for example) have been closed.
291
253
  // TODO: maybe add .once
292
-
293
254
  writeStream.on('close', async () => {
294
255
  try {
295
256
  await renameTmp(temporalName, pathName);
@@ -298,8 +259,9 @@ class LocalFS {
298
259
  err
299
260
  }, 'error on rename temporal file, please report this is a bug @{err}');
300
261
  }
301
- }); // if upload is aborted, we clean up the temporal file
262
+ });
302
263
 
264
+ // if upload is aborted, we clean up the temporal file
303
265
  signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', async () => {
304
266
  if (opened) {
305
267
  // close always happens, even if error
@@ -314,25 +276,22 @@ class LocalFS {
314
276
  });
315
277
  return writeStream;
316
278
  }
279
+
317
280
  /**
318
281
  * Read a tarball from the storage
319
282
  * @param tarballName tarball name eg: foo-1.0.0.tgz
320
283
  * @param options {signal} abort signal
321
284
  * @returns Readable stream
322
285
  */
323
-
324
-
325
286
  async readTarball(tarballName, {
326
287
  signal
327
288
  }) {
328
289
  const pathName = this._getStorage(tarballName);
329
-
330
290
  debug('read a tarball %o', pathName);
331
291
  const readStream = (0, _stream.addAbortSignal)(signal, _fs.default.createReadStream(pathName));
332
292
  readStream.on('open', async function (fileDescriptorId) {
333
293
  // if abort, the descriptor is null
334
294
  debug('file descriptor id %o', fileDescriptorId);
335
-
336
295
  if (fileDescriptorId) {
337
296
  const stats = await (0, _fs2.fstatPromise)(fileDescriptorId);
338
297
  debug('file size %o', stats.size);
@@ -344,10 +303,8 @@ class LocalFS {
344
303
  });
345
304
  return readStream;
346
305
  }
347
-
348
306
  async _readStorageFile(name) {
349
307
  debug('reading the file: %o', name);
350
-
351
308
  try {
352
309
  debug('reading the file: %o', name);
353
310
  return await (0, _fs2.readFilePromise)(name);
@@ -356,48 +313,41 @@ class LocalFS {
356
313
  throw err;
357
314
  }
358
315
  }
359
-
360
316
  _convertToString(value) {
361
317
  return JSON.stringify(value);
362
318
  }
363
-
364
319
  _getStorage(fileName = '') {
365
320
  const storagePath = _path.default.join(this.path, (0, _sanitizeFilename.default)(fileName));
366
-
367
321
  debug('get storage %s', storagePath);
368
322
  return storagePath;
369
323
  }
370
-
371
324
  async writeTempFileAndRename(dest, fileContent) {
372
325
  const tempFilePath = tempFile(dest);
373
-
374
326
  try {
375
327
  // write file on temp locatio
376
328
  // TODO: we need to handle when directory does not exist
377
329
  await (0, _fs2.writeFilePromise)(tempFilePath, fileContent);
378
- debug('creating a new file:: %o', dest); // rename tmp file to original
379
-
330
+ debug('creating a new file:: %o', dest);
331
+ // rename tmp file to original
380
332
  await renameTmp(tempFilePath, dest);
381
333
  } catch (err) {
382
334
  debug('error on write the file: %o', dest);
383
335
  throw err;
384
336
  }
385
337
  }
386
-
387
338
  async writeFile(destiny, fileContent) {
388
339
  try {
389
340
  await this.writeTempFileAndRename(destiny, fileContent);
390
341
  debug('write file success %s', destiny);
391
342
  } catch (err) {
392
343
  if (err && err.code === noSuchFile) {
393
- const dir = _path.default.dirname(destiny); // if fails, we create the folder for the package
394
-
395
-
344
+ const dir = _path.default.dirname(destiny);
345
+ // if fails, we create the folder for the package
396
346
  debug('write file has failed, creating folder %s', dir);
397
347
  await (0, _fs2.mkdirPromise)(dir, {
398
348
  recursive: true
399
- }); // we try again create the temp file
400
-
349
+ });
350
+ // we try again create the temp file
401
351
  debug('writing a temp file %s', destiny);
402
352
  await this.writeTempFileAndRename(destiny, fileContent);
403
353
  debug('write file success %s', destiny);
@@ -409,12 +359,9 @@ class LocalFS {
409
359
  }
410
360
  }
411
361
  }
412
-
413
362
  async _lockAndReadJSON(name) {
414
363
  const fileName = this._getStorage(name);
415
-
416
364
  debug('lock and read a file %o', fileName);
417
-
418
365
  try {
419
366
  const data = await (0, _fileLocking.readFileNext)(fileName, {
420
367
  lock: true,
@@ -429,12 +376,9 @@ class LocalFS {
429
376
  throw err;
430
377
  }
431
378
  }
432
-
433
379
  async _unlockJSON(name) {
434
380
  await (0, _fileLocking.unlockFileNext)(this._getStorage(name));
435
381
  }
436
-
437
382
  }
438
-
439
383
  exports.default = LocalFS;
440
384
  //# sourceMappingURL=local-fs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-fs.js","names":["fileExist","noSuchFile","resourceNotAvailable","packageJSONFileName","debug","buildDebug","fSError","message","code","err","errorUtils","getCode","tempFile","str","String","Math","random","slice","renameTmp","src","dst","renamePromise","unlinkPromise","LocalFS","constructor","path","logger","updatePackage","packageName","handleUpdate","locked","manifestUpdated","manifest","_lockAndReadJSON","_unlockJSON","error","getInternalError","getNotFound","deletePackage","_getStorage","removePackage","rmdirPromise","hasPackage","pathName","stat","statPromise","isFile","createPackage","name","pathPackage","openPromise","writeFile","_convertToString","savePackage","value","readPackage","res","_readStorageFile","data","JSON","parse","toString","hasTarball","fileName","Promise","resolve","accessPromise","then","catch","removeTempFile","temporalName","writeTarball","signal","join","replace","opened","writeStream","fs","createWriteStream","on","addEventListener","once","readTarball","tarballName","readStream","addAbortSignal","createReadStream","fileDescriptorId","stats","fstatPromise","size","emit","readFilePromise","stringify","storagePath","sanitzers","writeTempFileAndRename","dest","fileContent","tempFilePath","writeFilePromise","destiny","dir","dirname","mkdirPromise","recursive","readFileNext","lock","unlockFileNext"],"sources":["../src/local-fs.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport buildDebug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\nimport sanitzers from 'sanitize-filename';\nimport { Readable, Writable, addAbortSignal } from 'stream';\n\nimport { VerdaccioError, errorUtils, pluginUtils } from '@verdaccio/core';\nimport { readFileNext, unlockFileNext } from '@verdaccio/file-locking';\nimport { Logger, Manifest } from '@verdaccio/types';\n\nimport {\n accessPromise,\n fstatPromise,\n mkdirPromise,\n openPromise,\n readFilePromise,\n renamePromise,\n rmdirPromise,\n statPromise,\n unlinkPromise,\n writeFilePromise,\n} from './fs';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const packageJSONFileName = 'package.json';\n\nexport type ILocalFSPackageManager = pluginUtils.StorageHandler & { path: string };\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:local-fs');\n\nexport const fSError = function (message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = errorUtils.getCode(code, message);\n // FIXME: we should return http-status codes here instead, future improvement\n // @ts-ignore\n err.code = message;\n\n return err;\n};\n\nconst tempFile = function (str): string {\n return `${str}.tmp${String(Math.random()).slice(2)}`;\n};\n\nexport async function renameTmp(src: string, dst: string): Promise<void> {\n debug('rename %s to %s', src, dst);\n try {\n await renamePromise(src, dst);\n } catch (err: any) {\n debug('error rename %s error %s', src, err?.message);\n await unlinkPromise(src);\n }\n}\n\nexport default class LocalFS implements ILocalFSPackageManager {\n public path: string;\n public logger: Logger;\n\n public constructor(path: string, logger: Logger) {\n this.path = path;\n this.logger = logger;\n }\n\n /**\n * This function allows to update the package\n * This function handle the update package logic, for this plugin\n * we need to lock/unlock handlers for thread-safely and then apply\n * the `handleUpdate` and return the result.\n *\n * The lock could fail on several steps so we need to ensure the\n * file does not get locked if the whole process fails.\n *\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. apply external update package handler\n 4. return manifest (write is being hanlded into the core)\n 5. rename package.json.tmp package.json\n * @param {*} packageName\n * The update package handler could be different based\n * on the action and handled into the core.\n * @param {*} handleUpdate\n */\n public async updatePackage(\n packageName: string,\n handleUpdate: (manifest: Manifest) => Promise<Manifest>\n ): Promise<Manifest> {\n // this plugin lock files on write, we handle all possible scenarios\n let locked = false;\n let manifestUpdated: Manifest;\n try {\n const manifest = await this._lockAndReadJSON(packageJSONFileName);\n locked = true;\n manifestUpdated = await handleUpdate(manifest);\n if (locked) {\n debug('unlock %s', packageJSONFileName);\n await this._unlockJSON(packageJSONFileName);\n this.logger.debug({ packageName }, 'the package @{packageName} has been updated');\n return manifestUpdated;\n } else {\n this.logger.debug({ packageName }, 'the package @{packageName} has been updated');\n return manifestUpdated;\n }\n } catch (err: any) {\n // we ensure lock the file\n this.logger.error(\n { err, packageName },\n 'error @{err.message} on update package @{packageName}'\n );\n if (locked) {\n // eslint-disable-next-line no-useless-catch\n try {\n await this._unlockJSON(packageJSONFileName);\n // after unlock bubble up error.\n throw err;\n } catch (err: any) {\n // unlock could fail, we bubble up error\n throw errorUtils.getInternalError('resource temporarily unavailable');\n }\n } else {\n if (err.code === resourceNotAvailable) {\n throw errorUtils.getInternalError('resource temporarily unavailable');\n } else if (err.code === noSuchFile) {\n throw errorUtils.getNotFound();\n } else {\n throw err;\n }\n }\n }\n }\n\n public async deletePackage(packageName: string): Promise<void> {\n debug('delete a file/package %o', packageName);\n\n return await unlinkPromise(this._getStorage(packageName));\n }\n\n public async removePackage(): Promise<void> {\n debug('remove a package folder %o', this.path);\n\n await rmdirPromise(this._getStorage('.'));\n }\n\n /**\n * Verify if the package exists already.\n * @param name package name\n * @returns\n */\n public async hasPackage(): Promise<boolean> {\n const pathName: string = this._getStorage(packageJSONFileName);\n try {\n const stat = await statPromise(pathName);\n return stat.isFile();\n } catch (err: any) {\n if (err.code === noSuchFile) {\n debug('dir: %o does not exist %s', pathName, err?.code);\n return false;\n } else {\n this.logger.error('error on verify a package exist %o', err);\n throw errorUtils.getInternalError('error on verify a package exist');\n }\n }\n }\n\n /**\n * Create a package in the local storage, if package already exist fails.\n * @param name package name\n * @param manifest package manifest\n */\n public async createPackage(name: string, manifest: Manifest): Promise<void> {\n debug('create a a new package %o', name);\n const pathPackage = this._getStorage(packageJSONFileName);\n try {\n // https://nodejs.org/dist/latest-v17.x/docs/api/fs.html#file-system-flags\n // 'wx': Like 'w' but fails if the path exists\n await openPromise(pathPackage, 'wx');\n } catch (err: any) {\n // cannot override a pacakge that already exist\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n throw fSError(fileExist);\n }\n }\n // Create a new file and it´s folder if does not exist previously\n await this.writeFile(pathPackage, this._convertToString(manifest));\n }\n\n public async savePackage(name: string, value: Manifest): Promise<void> {\n debug('save a package %o', name);\n\n await this.writeFile(this._getStorage(packageJSONFileName), this._convertToString(value));\n }\n\n public async readPackage(name: string): Promise<Manifest> {\n debug('read a package %o', name);\n try {\n const res = await this._readStorageFile(this._getStorage(packageJSONFileName));\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeeded', name);\n return data;\n } catch (err: any) {\n if (err.code !== noSuchFile) {\n debug('parse error');\n this.logger.error({ err, name }, 'error @{err.message} on parse @{name}');\n }\n throw err;\n }\n }\n\n public async hasTarball(fileName: string): Promise<boolean> {\n const pathName: string = this._getStorage(fileName);\n return new Promise((resolve) => {\n accessPromise(pathName)\n .then(() => {\n resolve(true);\n })\n .catch(() => resolve(false));\n });\n }\n\n // remove the temporary file\n private async removeTempFile(temporalName): Promise<void> {\n debug('remove temporal file %o', temporalName);\n await unlinkPromise(temporalName);\n debug('removed temporal file %o', temporalName);\n }\n\n /**\n * Write a tarball into the storage\n * @param fileName package name\n * @param param1\n * @returns\n */\n public async writeTarball(fileName: string, { signal }): Promise<Writable> {\n debug('write a tarball %o', fileName);\n const pathName: string = this._getStorage(fileName);\n // create a temporary file to avoid conflicts or prev corruption files\n const temporalName = path.join(\n this.path,\n `${fileName}.tmp-${String(Math.random()).replace(/^0\\./, '')}`\n );\n\n debug('write a temporal name %o', temporalName);\n let opened = false;\n const writeStream = fs.createWriteStream(temporalName);\n\n writeStream.on('open', () => {\n opened = true;\n });\n\n writeStream.on('error', async (err) => {\n if (opened) {\n this.logger.error(\n { err: err.message, fileName },\n 'error on open write tarball for @{pkgName}'\n );\n // TODO: maybe add .once\n writeStream.on('close', async () => {\n await this.removeTempFile(temporalName);\n });\n } else {\n this.logger.error(\n { err: err.message, fileName },\n 'error a non open write tarball for @{pkgName}'\n );\n await this.removeTempFile(temporalName);\n }\n });\n\n // the 'close' event is emitted when the stream and any of its\n // underlying resources (a file descriptor, for example) have been closed.\n // TODO: maybe add .once\n writeStream.on('close', async () => {\n try {\n await renameTmp(temporalName, pathName);\n } catch (err) {\n this.logger.error(\n { err },\n 'error on rename temporal file, please report this is a bug @{err}'\n );\n }\n });\n\n // if upload is aborted, we clean up the temporal file\n signal?.addEventListener(\n 'abort',\n async () => {\n if (opened) {\n // close always happens, even if error\n writeStream.once('close', async () => {\n await this.removeTempFile(temporalName);\n });\n } else {\n await this.removeTempFile(temporalName);\n }\n },\n { once: true }\n );\n\n return writeStream;\n }\n\n /**\n * Read a tarball from the storage\n * @param tarballName tarball name eg: foo-1.0.0.tgz\n * @param options {signal} abort signal\n * @returns Readable stream\n */\n public async readTarball(tarballName: string, { signal }): Promise<Readable> {\n const pathName: string = this._getStorage(tarballName);\n debug('read a tarball %o', pathName);\n const readStream = addAbortSignal(signal, fs.createReadStream(pathName));\n readStream.on('open', async function (fileDescriptorId: number) {\n // if abort, the descriptor is null\n debug('file descriptor id %o', fileDescriptorId);\n if (fileDescriptorId) {\n const stats = await fstatPromise(fileDescriptorId);\n debug('file size %o', stats.size);\n readStream.emit('content-length', stats.size);\n }\n });\n readStream.on('error', (error) => {\n debug('not tarball found %o for %s message %s', pathName, tarballName, error.message);\n });\n return readStream;\n }\n\n private async _readStorageFile(name: string): Promise<any> {\n debug('reading the file: %o', name);\n try {\n debug('reading the file: %o', name);\n return await readFilePromise(name);\n } catch (err: any) {\n debug('error reading the file: %o with error %o', name, err.message);\n throw err;\n }\n }\n\n private _convertToString(value: Manifest): string {\n return JSON.stringify(value);\n }\n\n public _getStorage(fileName = ''): string {\n const storagePath: string = path.join(this.path, sanitzers(fileName));\n debug('get storage %s', storagePath);\n return storagePath;\n }\n\n private async writeTempFileAndRename(dest: string, fileContent: string): Promise<any> {\n const tempFilePath = tempFile(dest);\n try {\n // write file on temp locatio\n // TODO: we need to handle when directory does not exist\n await writeFilePromise(tempFilePath, fileContent);\n debug('creating a new file:: %o', dest);\n // rename tmp file to original\n await renameTmp(tempFilePath, dest);\n } catch (err: any) {\n debug('error on write the file: %o', dest);\n throw err;\n }\n }\n\n private async writeFile(destiny: string, fileContent: string): Promise<void> {\n try {\n await this.writeTempFileAndRename(destiny, fileContent);\n debug('write file success %s', destiny);\n } catch (err: any) {\n if (err && err.code === noSuchFile) {\n const dir = path.dirname(destiny);\n // if fails, we create the folder for the package\n debug('write file has failed, creating folder %s', dir);\n await mkdirPromise(dir, { recursive: true });\n // we try again create the temp file\n debug('writing a temp file %s', destiny);\n await this.writeTempFileAndRename(destiny, fileContent);\n debug('write file success %s', destiny);\n } else {\n this.logger.error({ err: err.message }, 'error on write file @{err}');\n throw err;\n }\n }\n }\n\n private async _lockAndReadJSON(name: string): Promise<Manifest> {\n const fileName: string = this._getStorage(name);\n debug('lock and read a file %o', fileName);\n try {\n const data = await readFileNext<Manifest>(fileName, {\n lock: true,\n parse: true,\n });\n return data;\n } catch (err) {\n this.logger.error({ err }, 'error on lock file @{err.message}');\n debug('error on lock and read json for file: %o', name);\n\n throw err;\n }\n }\n\n private async _unlockJSON(name: string): Promise<void> {\n await unlockFileNext(this._getStorage(name));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"local-fs.js","names":["fileExist","noSuchFile","resourceNotAvailable","packageJSONFileName","debug","buildDebug","fSError","message","code","err","errorUtils","getCode","tempFile","str","String","Math","random","slice","renameTmp","src","dst","renamePromise","unlinkPromise","LocalFS","constructor","path","logger","updatePackage","packageName","handleUpdate","locked","manifestUpdated","manifest","_lockAndReadJSON","_unlockJSON","error","getInternalError","getNotFound","deletePackage","_getStorage","removePackage","rmdirPromise","hasPackage","pathName","stat","statPromise","isFile","createPackage","name","pathPackage","openPromise","writeFile","_convertToString","savePackage","value","readPackage","res","_readStorageFile","data","JSON","parse","toString","hasTarball","fileName","Promise","resolve","accessPromise","then","catch","removeTempFile","temporalName","writeTarball","signal","join","replace","opened","writeStream","fs","createWriteStream","on","addEventListener","once","readTarball","tarballName","readStream","addAbortSignal","createReadStream","fileDescriptorId","stats","fstatPromise","size","emit","readFilePromise","stringify","storagePath","sanitzers","writeTempFileAndRename","dest","fileContent","tempFilePath","writeFilePromise","destiny","dir","dirname","mkdirPromise","recursive","readFileNext","lock","unlockFileNext"],"sources":["../src/local-fs.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport buildDebug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\nimport sanitzers from 'sanitize-filename';\nimport { Readable, Writable, addAbortSignal } from 'stream';\n\nimport { VerdaccioError, errorUtils, pluginUtils } from '@verdaccio/core';\nimport { readFileNext, unlockFileNext } from '@verdaccio/file-locking';\nimport { Logger, Manifest } from '@verdaccio/types';\n\nimport {\n accessPromise,\n fstatPromise,\n mkdirPromise,\n openPromise,\n readFilePromise,\n renamePromise,\n rmdirPromise,\n statPromise,\n unlinkPromise,\n writeFilePromise,\n} from './fs';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const packageJSONFileName = 'package.json';\n\nexport type ILocalFSPackageManager = pluginUtils.StorageHandler & { path: string };\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:local-fs');\n\nexport const fSError = function (message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = errorUtils.getCode(code, message);\n // FIXME: we should return http-status codes here instead, future improvement\n // @ts-ignore\n err.code = message;\n\n return err;\n};\n\nconst tempFile = function (str): string {\n return `${str}.tmp${String(Math.random()).slice(2)}`;\n};\n\nexport async function renameTmp(src: string, dst: string): Promise<void> {\n debug('rename %s to %s', src, dst);\n try {\n await renamePromise(src, dst);\n } catch (err: any) {\n debug('error rename %s error %s', src, err?.message);\n await unlinkPromise(src);\n }\n}\n\nexport default class LocalFS implements ILocalFSPackageManager {\n public path: string;\n public logger: Logger;\n\n public constructor(path: string, logger: Logger) {\n this.path = path;\n this.logger = logger;\n }\n\n /**\n * This function allows to update the package\n * This function handle the update package logic, for this plugin\n * we need to lock/unlock handlers for thread-safely and then apply\n * the `handleUpdate` and return the result.\n *\n * The lock could fail on several steps so we need to ensure the\n * file does not get locked if the whole process fails.\n *\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. apply external update package handler\n 4. return manifest (write is being hanlded into the core)\n 5. rename package.json.tmp package.json\n * @param {*} packageName\n * The update package handler could be different based\n * on the action and handled into the core.\n * @param {*} handleUpdate\n */\n public async updatePackage(\n packageName: string,\n handleUpdate: (manifest: Manifest) => Promise<Manifest>\n ): Promise<Manifest> {\n // this plugin lock files on write, we handle all possible scenarios\n let locked = false;\n let manifestUpdated: Manifest;\n try {\n const manifest = await this._lockAndReadJSON(packageJSONFileName);\n locked = true;\n manifestUpdated = await handleUpdate(manifest);\n if (locked) {\n debug('unlock %s', packageJSONFileName);\n await this._unlockJSON(packageJSONFileName);\n this.logger.debug({ packageName }, 'the package @{packageName} has been updated');\n return manifestUpdated;\n } else {\n this.logger.debug({ packageName }, 'the package @{packageName} has been updated');\n return manifestUpdated;\n }\n } catch (err: any) {\n // we ensure lock the file\n this.logger.error(\n { err, packageName },\n 'error @{err.message} on update package @{packageName}'\n );\n if (locked) {\n // eslint-disable-next-line no-useless-catch\n try {\n await this._unlockJSON(packageJSONFileName);\n // after unlock bubble up error.\n throw err;\n } catch (err: any) {\n // unlock could fail, we bubble up error\n throw errorUtils.getInternalError('resource temporarily unavailable');\n }\n } else {\n if (err.code === resourceNotAvailable) {\n throw errorUtils.getInternalError('resource temporarily unavailable');\n } else if (err.code === noSuchFile) {\n throw errorUtils.getNotFound();\n } else {\n throw err;\n }\n }\n }\n }\n\n public async deletePackage(packageName: string): Promise<void> {\n debug('delete a file/package %o', packageName);\n\n return await unlinkPromise(this._getStorage(packageName));\n }\n\n public async removePackage(): Promise<void> {\n debug('remove a package folder %o', this.path);\n\n await rmdirPromise(this._getStorage('.'));\n }\n\n /**\n * Verify if the package exists already.\n * @param name package name\n * @returns\n */\n public async hasPackage(): Promise<boolean> {\n const pathName: string = this._getStorage(packageJSONFileName);\n try {\n const stat = await statPromise(pathName);\n return stat.isFile();\n } catch (err: any) {\n if (err.code === noSuchFile) {\n debug('dir: %o does not exist %s', pathName, err?.code);\n return false;\n } else {\n this.logger.error('error on verify a package exist %o', err);\n throw errorUtils.getInternalError('error on verify a package exist');\n }\n }\n }\n\n /**\n * Create a package in the local storage, if package already exist fails.\n * @param name package name\n * @param manifest package manifest\n */\n public async createPackage(name: string, manifest: Manifest): Promise<void> {\n debug('create a a new package %o', name);\n const pathPackage = this._getStorage(packageJSONFileName);\n try {\n // https://nodejs.org/dist/latest-v17.x/docs/api/fs.html#file-system-flags\n // 'wx': Like 'w' but fails if the path exists\n await openPromise(pathPackage, 'wx');\n } catch (err: any) {\n // cannot override a pacakge that already exist\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n throw fSError(fileExist);\n }\n }\n // Create a new file and it´s folder if does not exist previously\n await this.writeFile(pathPackage, this._convertToString(manifest));\n }\n\n public async savePackage(name: string, value: Manifest): Promise<void> {\n debug('save a package %o', name);\n\n await this.writeFile(this._getStorage(packageJSONFileName), this._convertToString(value));\n }\n\n public async readPackage(name: string): Promise<Manifest> {\n debug('read a package %o', name);\n try {\n const res = await this._readStorageFile(this._getStorage(packageJSONFileName));\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeeded', name);\n return data;\n } catch (err: any) {\n if (err.code !== noSuchFile) {\n debug('parse error');\n this.logger.error({ err, name }, 'error @{err.message} on parse @{name}');\n }\n throw err;\n }\n }\n\n public async hasTarball(fileName: string): Promise<boolean> {\n const pathName: string = this._getStorage(fileName);\n return new Promise((resolve) => {\n accessPromise(pathName)\n .then(() => {\n resolve(true);\n })\n .catch(() => resolve(false));\n });\n }\n\n // remove the temporary file\n private async removeTempFile(temporalName): Promise<void> {\n debug('remove temporal file %o', temporalName);\n await unlinkPromise(temporalName);\n debug('removed temporal file %o', temporalName);\n }\n\n /**\n * Write a tarball into the storage\n * @param fileName package name\n * @param param1\n * @returns\n */\n public async writeTarball(fileName: string, { signal }): Promise<Writable> {\n debug('write a tarball %o', fileName);\n const pathName: string = this._getStorage(fileName);\n // create a temporary file to avoid conflicts or prev corruption files\n const temporalName = path.join(\n this.path,\n `${fileName}.tmp-${String(Math.random()).replace(/^0\\./, '')}`\n );\n\n debug('write a temporal name %o', temporalName);\n let opened = false;\n const writeStream = fs.createWriteStream(temporalName);\n\n writeStream.on('open', () => {\n opened = true;\n });\n\n writeStream.on('error', async (err) => {\n if (opened) {\n this.logger.error(\n { err: err.message, fileName },\n 'error on open write tarball for @{pkgName}'\n );\n // TODO: maybe add .once\n writeStream.on('close', async () => {\n await this.removeTempFile(temporalName);\n });\n } else {\n this.logger.error(\n { err: err.message, fileName },\n 'error a non open write tarball for @{pkgName}'\n );\n await this.removeTempFile(temporalName);\n }\n });\n\n // the 'close' event is emitted when the stream and any of its\n // underlying resources (a file descriptor, for example) have been closed.\n // TODO: maybe add .once\n writeStream.on('close', async () => {\n try {\n await renameTmp(temporalName, pathName);\n } catch (err) {\n this.logger.error(\n { err },\n 'error on rename temporal file, please report this is a bug @{err}'\n );\n }\n });\n\n // if upload is aborted, we clean up the temporal file\n signal?.addEventListener(\n 'abort',\n async () => {\n if (opened) {\n // close always happens, even if error\n writeStream.once('close', async () => {\n await this.removeTempFile(temporalName);\n });\n } else {\n await this.removeTempFile(temporalName);\n }\n },\n { once: true }\n );\n\n return writeStream;\n }\n\n /**\n * Read a tarball from the storage\n * @param tarballName tarball name eg: foo-1.0.0.tgz\n * @param options {signal} abort signal\n * @returns Readable stream\n */\n public async readTarball(tarballName: string, { signal }): Promise<Readable> {\n const pathName: string = this._getStorage(tarballName);\n debug('read a tarball %o', pathName);\n const readStream = addAbortSignal(signal, fs.createReadStream(pathName));\n readStream.on('open', async function (fileDescriptorId: number) {\n // if abort, the descriptor is null\n debug('file descriptor id %o', fileDescriptorId);\n if (fileDescriptorId) {\n const stats = await fstatPromise(fileDescriptorId);\n debug('file size %o', stats.size);\n readStream.emit('content-length', stats.size);\n }\n });\n readStream.on('error', (error) => {\n debug('not tarball found %o for %s message %s', pathName, tarballName, error.message);\n });\n return readStream;\n }\n\n private async _readStorageFile(name: string): Promise<any> {\n debug('reading the file: %o', name);\n try {\n debug('reading the file: %o', name);\n return await readFilePromise(name);\n } catch (err: any) {\n debug('error reading the file: %o with error %o', name, err.message);\n throw err;\n }\n }\n\n private _convertToString(value: Manifest): string {\n return JSON.stringify(value);\n }\n\n public _getStorage(fileName = ''): string {\n const storagePath: string = path.join(this.path, sanitzers(fileName));\n debug('get storage %s', storagePath);\n return storagePath;\n }\n\n private async writeTempFileAndRename(dest: string, fileContent: string): Promise<any> {\n const tempFilePath = tempFile(dest);\n try {\n // write file on temp locatio\n // TODO: we need to handle when directory does not exist\n await writeFilePromise(tempFilePath, fileContent);\n debug('creating a new file:: %o', dest);\n // rename tmp file to original\n await renameTmp(tempFilePath, dest);\n } catch (err: any) {\n debug('error on write the file: %o', dest);\n throw err;\n }\n }\n\n private async writeFile(destiny: string, fileContent: string): Promise<void> {\n try {\n await this.writeTempFileAndRename(destiny, fileContent);\n debug('write file success %s', destiny);\n } catch (err: any) {\n if (err && err.code === noSuchFile) {\n const dir = path.dirname(destiny);\n // if fails, we create the folder for the package\n debug('write file has failed, creating folder %s', dir);\n await mkdirPromise(dir, { recursive: true });\n // we try again create the temp file\n debug('writing a temp file %s', destiny);\n await this.writeTempFileAndRename(destiny, fileContent);\n debug('write file success %s', destiny);\n } else {\n this.logger.error({ err: err.message }, 'error on write file @{err}');\n throw err;\n }\n }\n }\n\n private async _lockAndReadJSON(name: string): Promise<Manifest> {\n const fileName: string = this._getStorage(name);\n debug('lock and read a file %o', fileName);\n try {\n const data = await readFileNext<Manifest>(fileName, {\n lock: true,\n parse: true,\n });\n return data;\n } catch (err) {\n this.logger.error({ err }, 'error on lock file @{err.message}');\n debug('error on lock and read json for file: %o', name);\n\n throw err;\n }\n }\n\n private async _unlockJSON(name: string): Promise<void> {\n await unlockFileNext(this._getStorage(name));\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Logger } from '@verdaccio/types';
2
- export declare type LocalStorage = {
2
+ export type LocalStorage = {
3
3
  list: any;
4
4
  secret: string;
5
5
  };