{"version":3,"file":"memory-handler.mjs","names":[],"sources":["../src/memory-handler.ts"],"sourcesContent":["import MemoryFileSystem from 'memory-fs';\nimport path from 'node:path';\n\nimport type { VerdaccioError } from '@verdaccio/core';\nimport { errorUtils } from '@verdaccio/core';\nimport { ReadTarball, UploadTarball } from '@verdaccio/streams';\nimport type {\n  Callback,\n  CallbackAction,\n  Logger,\n  Package,\n  PackageTransformer,\n  ReadPackageCallback,\n  StorageUpdateCallback,\n  StorageWriteCallback,\n} from '@verdaccio/types';\n\nimport type { IPackageStorageManager } from './legacy-plugin-api';\n\nimport { parsePackage, stringifyPackage } from './utils';\n\nconst fs = new MemoryFileSystem();\nconst { getBadRequest, getInternalError, getConflict, getNotFound } = errorUtils;\n\nexport type DataHandler = {\n  [key: string]: string;\n};\n\nclass MemoryHandler implements IPackageStorageManager {\n  private data: DataHandler;\n  private name: string;\n  private path: string;\n  public logger: Logger;\n\n  public constructor(packageName: string, data: DataHandler, logger: Logger) {\n    // this is not need it\n    this.data = data;\n    this.name = packageName;\n    this.logger = logger;\n    this.path = `/${packageName}`;\n  }\n\n  public updatePackage(\n    pkgFileName: string,\n    updateHandler: StorageUpdateCallback,\n    onWrite: StorageWriteCallback,\n    transformPackage: PackageTransformer,\n    onEnd: CallbackAction\n  ): void {\n    const json: string = this._getStorage(pkgFileName);\n    let pkg: Package;\n\n    try {\n      pkg = parsePackage(json) as Package;\n    } catch (err) {\n      return onEnd(err);\n    }\n\n    updateHandler(pkg, (err: VerdaccioError) => {\n      if (err) {\n        return onEnd(err);\n      }\n      try {\n        onWrite(pkgFileName, transformPackage(pkg), onEnd);\n      } catch {\n        return onEnd(getInternalError('error on parse the metadata'));\n      }\n    });\n  }\n\n  public deletePackage(pkgName: string, callback: Callback): void {\n    delete this.data[pkgName];\n    return callback(null);\n  }\n\n  public removePackage(callback: CallbackAction): void {\n    return callback(null);\n  }\n\n  public createPackage(name: string, value: Package, cb: CallbackAction): void {\n    this.savePackage(name, value, cb);\n  }\n\n  public savePackage(name: string, value: Package, cb: CallbackAction): void {\n    try {\n      const json: string = stringifyPackage(value);\n\n      this.data[name] = json;\n      return cb(null);\n    } catch (err: any) {\n      return cb(getInternalError(err.message));\n    }\n  }\n\n  public readPackage(name: string, cb: ReadPackageCallback): void {\n    const json = this._getStorage(name);\n    const isJson = typeof json === 'undefined';\n\n    try {\n      return cb(isJson ? getNotFound() : null, parsePackage(json));\n    } catch {\n      return cb(getNotFound());\n    }\n  }\n\n  public writeTarball(name: string): UploadTarball {\n    const uploadStream: UploadTarball = new UploadTarball({});\n    const temporalName = `${this.path}/${name}`;\n\n    process.nextTick(function () {\n      fs.mkdirp(path.dirname(temporalName), function (mkdirpError) {\n        if (mkdirpError) {\n          return uploadStream.emit('error', mkdirpError);\n        }\n        fs.stat(temporalName, function (fileError, stats) {\n          if (!fileError && stats) {\n            return uploadStream.emit('error', getConflict());\n          }\n\n          try {\n            const file = fs.createWriteStream(temporalName);\n\n            uploadStream.pipe(file);\n\n            uploadStream.done = function (): void {\n              const onEnd = function (): void {\n                uploadStream.emit('success');\n              };\n\n              uploadStream.on('end', onEnd);\n            };\n\n            uploadStream.abort = function (): void {\n              uploadStream.emit('error', getBadRequest('transmision aborted'));\n              file.end();\n            };\n\n            uploadStream.emit('open');\n            return;\n          } catch (err) {\n            uploadStream.emit('error', err);\n            return;\n          }\n        });\n      });\n    });\n\n    return uploadStream;\n  }\n\n  public readTarball(name: string): ReadTarball {\n    const pathName = `${this.path}/${name}`;\n\n    const readTarballStream: ReadTarball = new ReadTarball({});\n\n    process.nextTick(function () {\n      fs.stat(pathName, function (fileError, stats) {\n        if (fileError && !stats) {\n          return readTarballStream.emit('error', getNotFound());\n        }\n\n        try {\n          const readStream = fs.createReadStream(pathName);\n\n          const pathMeta = fs.meta(pathName);\n          const contentLength: number = (pathMeta && pathMeta.length) || 0;\n          readTarballStream.emit('content-length', contentLength);\n          readTarballStream.emit('open');\n          readStream.pipe(readTarballStream);\n          readStream.on('error', (error: VerdaccioError) => {\n            readTarballStream.emit('error', error);\n          });\n\n          readTarballStream.abort = function (): void {\n            readStream.destroy(getBadRequest('read has been aborted'));\n          };\n          return;\n        } catch (err) {\n          readTarballStream.emit('error', err);\n          return;\n        }\n      });\n    });\n\n    return readTarballStream;\n  }\n\n  private _getStorage(name = ''): string {\n    return this.data[name];\n  }\n}\n\nexport default MemoryHandler;\n"],"mappings":"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"}