@xen-orchestra/fs 3.3.4 → 4.0.1

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":"abstract.js","names":["_legacy","_interopRequireDefault","require","_assert","_getStream","_coalesceCalls","_log","_promiseToolbox","_limitConcurrencyDecorator","_xoRemoteParser","_stream","_crypto","_decoratorSynchronized","_path","_checksum","_encryptor","_dec","_dec2","_class","obj","__esModule","default","_applyDecoratedDescriptor","target","property","decorators","descriptor","context","desc","Object","keys","forEach","key","enumerable","configurable","initializer","writable","slice","reverse","reduce","decorator","value","call","undefined","defineProperty","info","warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ENCRYPTION_DESC_FILENAME","ENCRYPTION_METADATA_FILENAME","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","constructor","handler","prefix","_prefix","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","entry","i","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","encryptor","Error","remote","options","url","_remote","parse","highWaterMark","_highWaterMark","timeout","_timeout","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","fd","__closeFile","createReadStream","checksum","ignoreMissingChecksum","end","start","assert","strictEqual","isEncrypted","stream","_createReadStream","fromEvent","_readFile","flags","validChecksumOfReadStream","String","trim","decryptStream","_getSize","outputStream","input","dirMode","validator","checksumStream","encryptStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","ivLength","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mode","__mkdir","mktree","_mktree","__openFile","data","encryptedData","encryptData","buffer","position","_read","decryptData","#rename","createTree","p","_rename","Promise","all","dirname","_copy","_rmdir","catch","rmtree","_rmtree","sync","_checkMetadata","_canWriteMetadata","e","startsWith","_createMetadata","encryptionAlgorithm","encryptionKey","DEFAULT_ENCRYPTION_ALGORITHM","_getEncryptor","_writeFile","JSON","stringify","algorithm","randomUUID","json","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","ignoreErrors","_unlink","len","_truncate","_write","_closeFile","_mkdir","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","resolve","tmpPath","basename","output","then","getStream","files","asyncMapSettled","isPath","_writeFd","id","getOwnPropertyDescriptor","exports","createPrefixWrapperMethods","pPw","pRha","hasOwnProperty","getOwnPropertyNames","name","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import asyncMapSettled from '@xen-orchestra/async-map/legacy'\nimport assert from 'assert'\nimport getStream from 'get-stream'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\nimport { DEFAULT_ENCRYPTION_ALGORITHM, _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('xo:fs:abstract')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ENCRYPTION_DESC_FILENAME = 'encryption.json'\nconst ENCRYPTION_METADATA_FILENAME = 'metadata.json'\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n constructor(handler, prefix) {\n this._prefix = prefix\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this._prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n _resolve(path) {\n return this._prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n #encryptor\n\n get _encryptor() {\n if (this.#encryptor === undefined) {\n throw new Error(`Can't access to encryptor before remote synchronization`)\n }\n return this.#encryptor\n }\n\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async closeFile(fd) {\n await this.__closeFile(fd)\n }\n\n async createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (options.end !== undefined || options.start !== undefined) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`)\n }\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n\n let stream = await timeout.call(\n this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }),\n this._timeout\n )\n\n // detect early errors\n await fromEvent(stream, 'readable')\n\n if (checksum) {\n try {\n const path = typeof file === 'string' ? file : file.path\n const checksum = await this._readFile(checksumFile(path), { flags: 'r' })\n\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n } catch (error) {\n if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {\n throw error\n }\n }\n }\n\n if (this.isEncrypted) {\n stream = this._encryptor.decryptStream(stream)\n } else {\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n try {\n stream.length = await this._getSize(file)\n } catch (error) {\n // ignore errors\n }\n }\n }\n\n return stream\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n\n input = this._encryptor.encryptStream(input)\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n validator,\n })\n if (checksum) {\n // using _outpuFile means the checksum will NOT be encrypted\n // it is by design to allow checking of encrypted files without the key\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n // when using encryption, the file size is aligned with the encryption block size ( 16 bytes )\n // that means that the size will be 1 to 16 bytes more than the content size + the initialized vector length (16 bytes)\n async getSize(file) {\n assert.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`)\n\n const size = await timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n return size - this._encryptor.ivLength\n }\n\n async list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mkdir(dir, { mode } = {}) {\n await this.__mkdir(normalizePath(dir), { mode })\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n openFile(path, flags) {\n return this.__openFile(path, flags)\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._outputFile(normalizePath(file), encryptedData, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`)\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async readFile(file, { flags = 'r' } = {}) {\n const data = await this._readFile(normalizePath(file), { flags })\n return this._encryptor.decryptData(data)\n }\n\n async #rename(oldPath, newPath, { checksum }, createTree = true) {\n try {\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n await p\n } catch (error) {\n // ENOENT can be a missing target directory OR a missing source\n if (error.code === 'ENOENT' && createTree) {\n await this._mktree(dirname(newPath))\n return this.#rename(oldPath, newPath, { checksum }, false)\n }\n throw error\n }\n }\n\n rename(oldPath, newPath, { checksum = false } = {}) {\n return this.#rename(normalizePath(oldPath), normalizePath(newPath), { checksum })\n }\n\n async copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n try {\n await this._checkMetadata()\n } catch (error) {\n await this._forget()\n throw error\n }\n }\n\n async _canWriteMetadata() {\n const list = await this.list('/', {\n filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME,\n })\n return list.length === 0\n }\n\n async _createMetadata() {\n const encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n this.#encryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n\n await Promise.all([\n this._writeFile(normalizePath(ENCRYPTION_DESC_FILENAME), JSON.stringify({ algorithm: encryptionAlgorithm }), {\n flags: 'w',\n }), // not encrypted\n this.writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async _checkMetadata() {\n let encryptionAlgorithm = 'none'\n let data\n try {\n // this file is not encrypted\n data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME), 'utf-8')\n const json = JSON.parse(data)\n encryptionAlgorithm = json.algorithm\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n }\n\n try {\n this.#encryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n // this file is encrypted\n const data = await this.readFile(ENCRYPTION_METADATA_FILENAME, 'utf-8')\n JSON.parse(data)\n } catch (error) {\n // can be enoent, bad algorithm, or broeken json ( bad key or algorithm)\n if (encryptionAlgorithm !== 'none') {\n if (await this._canWriteMetadata()) {\n // any other error , but on empty remote => update with remote settings\n\n info('will update metadata of this remote')\n return this._createMetadata()\n } else {\n warn(\n `The encryptionKey settings of this remote does not match the key used to create it. You won't be able to read any data from this remote`,\n { error }\n )\n // will probably send a ERR_OSSL_EVP_BAD_DECRYPT if key is incorrect\n throw error\n }\n }\n }\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`)\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async writeFile(file, data, { flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._writeFile(normalizePath(file), encryptedData, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await timeout.call(\n this._createOutputStream(tmpPath, {\n dirMode,\n flags: 'wx',\n }),\n this._timeout\n )\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.rename(tmpPath, path)\n } catch (error) {\n await this.unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncMapSettled(files, file =>\n this._unlink(`${dir}/${file}`).catch(error => {\n // Unlink dir behavior is not consistent across platforms\n // https://github.com/nodejs/node-v0.x-archive/issues/5791\n if (error.code === 'EISDIR' || error.code === 'EPERM') {\n return this._rmtree(`${dir}/${file}`)\n }\n throw error\n })\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n\n get isEncrypted() {\n return this._encryptor.id !== 'NULL_ENCRYPTOR'\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":"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"}
1
+ {"version":3,"file":"abstract.js","names":["_assert","_interopRequireDefault","require","_getStream","_asyncEach","_coalesceCalls","_log","_promiseToolbox","_limitConcurrencyDecorator","_xoRemoteParser","_stream","_crypto","_decoratorSynchronized","_path","_checksum","_encryptor","_dec","_dec2","_class","obj","__esModule","default","_applyDecoratedDescriptor","target","property","decorators","descriptor","context","desc","Object","keys","forEach","key","enumerable","configurable","initializer","writable","slice","reverse","reduce","decorator","value","call","undefined","defineProperty","info","warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ENCRYPTION_DESC_FILENAME","ENCRYPTION_METADATA_FILENAME","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","prefix","constructor","handler","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","entry","i","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","rawEncryptor","encryptor","#encryptor","Error","remote","options","url","_remote","parse","highWaterMark","_highWaterMark","timeout","_timeout","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","createReadStream","checksum","ignoreMissingChecksum","end","start","assert","strictEqual","isEncrypted","stream","_createReadStream","fromEvent","_readFile","flags","validChecksumOfReadStream","String","trim","decryptStream","_getSize","outputStream","input","dirMode","validator","checksumStream","encryptStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","ivLength","__list","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mktree","mode","_mktree","data","encryptedData","encryptData","buffer","position","_read","__readFile","decryptData","#rename","createTree","p","_rename","Promise","all","dirname","__rename","__copy","_copy","_rmdir","catch","rmtree","_rmtree","sync","checkMetadata","canWriteMetadata","#canWriteMetadata","e","startsWith","createMetadata","#createMetadata","encryptionAlgorithm","encryptionKey","DEFAULT_ENCRYPTION_ALGORITHM","_getEncryptor","_writeFile","JSON","stringify","algorithm","__writeFile","randomUUID","#checkMetadata","json","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","ignoreErrors","_unlink","len","_truncate","__unlink","_write","__closeFile","fd","_closeFile","__mkdir","_mkdir","__openFile","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","resolve","tmpPath","basename","output","then","getStream","files","asyncEach","isPath","_writeFd","id","getOwnPropertyDescriptor","exports","proto","method","getOwnPropertyNames","publicName","hasOwn","createPrefixWrapperMethods","pPw","pRha","hasOwnProperty","name","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import assert from 'assert'\nimport getStream from 'get-stream'\nimport { asyncEach } from '@vates/async-each'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\nimport { DEFAULT_ENCRYPTION_ALGORITHM, _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('xo:fs:abstract')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ENCRYPTION_DESC_FILENAME = 'encryption.json'\nconst ENCRYPTION_METADATA_FILENAME = 'metadata.json'\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n #prefix\n\n constructor(handler, prefix) {\n this.#prefix = prefix\n\n // cannot be a private field because used by methods dynamically added\n // outside of the class\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this.#prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n // cannot be a private method because used by methods dynamically added\n // outside of the class\n _resolve(path) {\n return this.#prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n #rawEncryptor\n\n get #encryptor() {\n if (this.#rawEncryptor === undefined) {\n throw new Error(`Can't access to encryptor before remote synchronization`)\n }\n return this.#rawEncryptor\n }\n\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n //\n // Should not be called directly because:\n // - some concurrency limits may be applied which may lead to deadlocks\n // - some preprocessing may be applied on parameters that should not be done multiple times (e.g. prefixing paths)\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (options.end !== undefined || options.start !== undefined) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`)\n }\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n\n let stream = await timeout.call(\n this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }),\n this._timeout\n )\n\n // detect early errors\n await fromEvent(stream, 'readable')\n\n if (checksum) {\n try {\n const path = typeof file === 'string' ? file : file.path\n const checksum = await this._readFile(checksumFile(path), { flags: 'r' })\n\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n } catch (error) {\n if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {\n throw error\n }\n }\n }\n\n if (this.isEncrypted) {\n stream = this.#encryptor.decryptStream(stream)\n } else {\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n try {\n stream.length = await this._getSize(file)\n } catch (error) {\n // ignore errors\n }\n }\n }\n\n return stream\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n\n input = this.#encryptor.encryptStream(input)\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n validator,\n })\n if (checksum) {\n // using _outpuFile means the checksum will NOT be encrypted\n // it is by design to allow checking of encrypted files without the key\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n // when using encryption, the file size is aligned with the encryption block size ( 16 bytes )\n // that means that the size will be 1 to 16 bytes more than the content size + the initialized vector length (16 bytes)\n async getSize(file) {\n assert.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`)\n\n const size = await timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n return size - this.#encryptor.ivLength\n }\n\n async __list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n const encryptedData = this.#encryptor.encryptData(data)\n await this._outputFile(normalizePath(file), encryptedData, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`)\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async __readFile(file, { flags = 'r' } = {}) {\n const data = await this._readFile(normalizePath(file), { flags })\n return this.#encryptor.decryptData(data)\n }\n\n async #rename(oldPath, newPath, { checksum }, createTree = true) {\n try {\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n await p\n } catch (error) {\n // ENOENT can be a missing target directory OR a missing source\n if (error.code === 'ENOENT' && createTree) {\n await this._mktree(dirname(newPath))\n return this.#rename(oldPath, newPath, { checksum }, false)\n }\n throw error\n }\n }\n\n __rename(oldPath, newPath, { checksum = false } = {}) {\n return this.#rename(normalizePath(oldPath), normalizePath(newPath), { checksum })\n }\n\n async __copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n try {\n await this.#checkMetadata()\n } catch (error) {\n await this._forget()\n throw error\n }\n }\n\n async #canWriteMetadata() {\n const list = await this.__list('/', {\n filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME,\n })\n return list.length === 0\n }\n\n async #createMetadata() {\n const encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n this.#rawEncryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n\n await Promise.all([\n this._writeFile(normalizePath(ENCRYPTION_DESC_FILENAME), JSON.stringify({ algorithm: encryptionAlgorithm }), {\n flags: 'w',\n }), // not encrypted\n this.__writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async #checkMetadata() {\n let encryptionAlgorithm = 'none'\n let data\n try {\n // this file is not encrypted\n data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME), 'utf-8')\n const json = JSON.parse(data)\n encryptionAlgorithm = json.algorithm\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n }\n\n try {\n this.#rawEncryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n // this file is encrypted\n const data = await this.__readFile(ENCRYPTION_METADATA_FILENAME, 'utf-8')\n JSON.parse(data)\n } catch (error) {\n // can be enoent, bad algorithm, or broeken json ( bad key or algorithm)\n if (encryptionAlgorithm !== 'none') {\n if (await this.#canWriteMetadata()) {\n // any other error , but on empty remote => update with remote settings\n\n info('will update metadata of this remote')\n return this.#createMetadata()\n } else {\n warn(\n `The encryptionKey settings of this remote does not match the key used to create it. You won't be able to read any data from this remote`,\n { error }\n )\n // will probably send a ERR_OSSL_EVP_BAD_DECRYPT if key is incorrect\n throw error\n }\n }\n }\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async __unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`)\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async __writeFile(file, data, { flags = 'wx' } = {}) {\n const encryptedData = this.#encryptor.encryptData(data)\n await this._writeFile(normalizePath(file), encryptedData, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n dir = normalizePath(dir)\n\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await timeout.call(\n this._createOutputStream(tmpPath, {\n dirMode,\n flags: 'wx',\n }),\n this._timeout\n )\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.__rename(tmpPath, path)\n } catch (error) {\n await this.__unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncEach(files, file =>\n this._unlink(`${dir}/${file}`).catch(error => {\n // Unlink dir behavior is not consistent across platforms\n // https://github.com/nodejs/node-v0.x-archive/issues/5791\n if (error.code === 'EISDIR' || error.code === 'EPERM') {\n return this._rmtree(`${dir}/${file}`)\n }\n throw error\n })\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n\n get isEncrypted() {\n return this.#encryptor.id !== 'NULL_ENCRYPTOR'\n }\n}\n\n// from implementation methods, which names start with `__`, create public\n// accessors on which external behaviors can be added (e.g. concurrency limits, path rewriting)\n{\n const proto = RemoteHandlerAbstract.prototype\n for (const method of Object.getOwnPropertyNames(proto)) {\n if (method.startsWith('__')) {\n const publicName = method.slice(2)\n\n assert(!Object.hasOwn(proto, publicName))\n\n Object.defineProperty(proto, publicName, Object.getOwnPropertyDescriptor(proto, method))\n }\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.js","names":["_through","_interopRequireDefault","require","_crypto","_promiseToolbox","_invert","obj","__esModule","default","ALGORITHM_TO_ID","md5","sha256","sha512","ID_TO_ALGORITHM","invert","createChecksumStream","algorithm","algorithmId","Error","hash","createHash","promise","resolve","reject","defer","stream","through2","chunk","enc","callback","update","digest","once","checksum","exports","validChecksumOfReadStream","expectedChecksum","slice","indexOf","wrapper","pipe","highWaterMark","on","error","emit","checksumVerified","fromEvent"],"sources":["../src/checksum.js"],"sourcesContent":["import through2 from 'through2'\nimport { createHash } from 'crypto'\nimport { defer, fromEvent } from 'promise-toolbox'\nimport invert from 'lodash/invert.js'\n\n// Format: $<algorithm>$<salt>$<encrypted>\n//\n// http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES\nconst ALGORITHM_TO_ID = {\n md5: '1',\n sha256: '5',\n sha512: '6',\n}\n\nconst ID_TO_ALGORITHM = invert(ALGORITHM_TO_ID)\n\n// Create a through stream which computes the checksum of all data going\n// through.\n//\n// The `checksum` attribute is a promise which resolves at the end of the stream\n// with a string representation of the checksum.\n//\n// const source = ...\n// const checksumStream = source.pipe(createChecksumStream())\n// checksumStream.resume() // make the data flow without an output\n// console.log(await checksumStream.checksum)\nexport const createChecksumStream = (algorithm = 'md5') => {\n const algorithmId = ALGORITHM_TO_ID[algorithm]\n\n if (!algorithmId) {\n throw new Error(`unknown algorithm: ${algorithm}`)\n }\n\n const hash = createHash(algorithm)\n const { promise, resolve, reject } = defer()\n\n const stream = through2(\n (chunk, enc, callback) => {\n hash.update(chunk)\n callback(null, chunk)\n },\n callback => {\n resolve(`$${algorithmId}$$${hash.digest('hex')}`)\n callback()\n }\n ).once('error', reject)\n stream.checksum = promise\n return stream\n}\n\n// Check if the checksum of a readable stream is equals to an expected checksum.\n// The given stream is wrapped in a stream which emits an error event\n// if the computed checksum is not equals to the expected checksum.\nexport const validChecksumOfReadStream = (stream, expectedChecksum) => {\n const algorithmId = expectedChecksum.slice(1, expectedChecksum.indexOf('$', 1))\n\n if (!algorithmId) {\n throw new Error(`unknown algorithm: ${algorithmId}`)\n }\n\n const hash = createHash(ID_TO_ALGORITHM[algorithmId])\n\n const wrapper = stream.pipe(\n through2(\n { highWaterMark: 0 },\n (chunk, enc, callback) => {\n hash.update(chunk)\n callback(null, chunk)\n },\n callback => {\n const checksum = `$${algorithmId}$$${hash.digest('hex')}`\n\n callback(\n checksum !== expectedChecksum ? new Error(`Bad checksum (${checksum}), expected: ${expectedChecksum}`) : null\n )\n }\n )\n )\n\n stream.on('error', error => wrapper.emit('error', error))\n wrapper.checksumVerified = fromEvent(wrapper, 'end')\n\n return wrapper\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"checksum.js","names":["_through","_interopRequireDefault","require","_crypto","_promiseToolbox","_invert","obj","__esModule","default","ALGORITHM_TO_ID","md5","sha256","sha512","ID_TO_ALGORITHM","invert","createChecksumStream","algorithm","algorithmId","Error","hash","createHash","promise","resolve","reject","defer","stream","through2","chunk","enc","callback","update","digest","once","checksum","exports","validChecksumOfReadStream","expectedChecksum","slice","indexOf","wrapper","pipe","highWaterMark","on","error","emit","checksumVerified","fromEvent"],"sources":["../src/checksum.js"],"sourcesContent":["import through2 from 'through2'\nimport { createHash } from 'crypto'\nimport { defer, fromEvent } from 'promise-toolbox'\nimport invert from 'lodash/invert.js'\n\n// Format: $<algorithm>$<salt>$<encrypted>\n//\n// http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES\nconst ALGORITHM_TO_ID = {\n md5: '1',\n sha256: '5',\n sha512: '6',\n}\n\nconst ID_TO_ALGORITHM = invert(ALGORITHM_TO_ID)\n\n// Create a through stream which computes the checksum of all data going\n// through.\n//\n// The `checksum` attribute is a promise which resolves at the end of the stream\n// with a string representation of the checksum.\n//\n// const source = ...\n// const checksumStream = source.pipe(createChecksumStream())\n// checksumStream.resume() // make the data flow without an output\n// console.log(await checksumStream.checksum)\nexport const createChecksumStream = (algorithm = 'md5') => {\n const algorithmId = ALGORITHM_TO_ID[algorithm]\n\n if (!algorithmId) {\n throw new Error(`unknown algorithm: ${algorithm}`)\n }\n\n const hash = createHash(algorithm)\n const { promise, resolve, reject } = defer()\n\n const stream = through2(\n (chunk, enc, callback) => {\n hash.update(chunk)\n callback(null, chunk)\n },\n callback => {\n resolve(`$${algorithmId}$$${hash.digest('hex')}`)\n callback()\n }\n ).once('error', reject)\n stream.checksum = promise\n return stream\n}\n\n// Check if the checksum of a readable stream is equals to an expected checksum.\n// The given stream is wrapped in a stream which emits an error event\n// if the computed checksum is not equals to the expected checksum.\nexport const validChecksumOfReadStream = (stream, expectedChecksum) => {\n const algorithmId = expectedChecksum.slice(1, expectedChecksum.indexOf('$', 1))\n\n if (!algorithmId) {\n throw new Error(`unknown algorithm: ${algorithmId}`)\n }\n\n const hash = createHash(ID_TO_ALGORITHM[algorithmId])\n\n const wrapper = stream.pipe(\n through2(\n { highWaterMark: 0 },\n (chunk, enc, callback) => {\n hash.update(chunk)\n callback(null, chunk)\n },\n callback => {\n const checksum = `$${algorithmId}$$${hash.digest('hex')}`\n\n callback(\n checksum !== expectedChecksum ? new Error(`Bad checksum (${checksum}), expected: ${expectedChecksum}`) : null\n )\n }\n )\n )\n\n stream.on('error', error => wrapper.emit('error', error))\n wrapper.checksumVerified = fromEvent(wrapper, 'end')\n\n return wrapper\n}\n"],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_execa","_interopRequireDefault","require","_xoRemoteParser","_local","_nfs","_s","_smb","_encryptor","obj","__esModule","default","HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","exports","getSyncedHandler","opts","handler","dispose","forget","value"],"sources":["../src/index.js"],"sourcesContent":["import execa from 'execa'\nimport { parse } from 'xo-remote-parser'\n\nimport RemoteHandlerLocal from './local'\nimport RemoteHandlerNfs from './nfs'\nimport RemoteHandlerS3 from './s3'\nimport RemoteHandlerSmb from './smb'\nexport { DEFAULT_ENCRYPTION_ALGORITHM, UNENCRYPTED_ALGORITHM, isLegacyEncryptionAlgorithm } from './_encryptor'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmb\n} catch (_) {}\n\nexport const getHandler = (remote, ...rest) => {\n const Handler = HANDLERS[parse(remote.url).type]\n if (!Handler) {\n throw new Error('Unhandled remote type')\n }\n return new Handler(remote, ...rest)\n}\n\nexport const getSyncedHandler = async (...opts) => {\n const handler = getHandler(...opts)\n await handler.sync()\n return {\n dispose: () => handler.forget(),\n value: handler,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,EAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,IAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,UAAA,GAAAN,OAAA;AAA+G,SAAAD,uBAAAQ,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE/G,MAAMG,QAAQ,GAAG;EACfC,IAAI,EAAEC,cAAkB;EACxBC,GAAG,EAAEC,YAAgB;EACrBC,EAAE,EAAEC;AACN,CAAC;AAED,IAAI;EACFC,cAAK,CAACC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;EAChCR,QAAQ,CAACS,GAAG,GAAGC,YAAgB;AACjC,CAAC,CAAC,OAAOC,CAAC,EAAE,CAAC;AAEN,MAAMC,UAAU,GAAGA,CAACC,MAAM,EAAE,GAAGC,IAAI,KAAK;EAC7C,MAAMC,OAAO,GAAGf,QAAQ,CAAC,IAAAgB,qBAAK,EAACH,MAAM,CAACI,GAAG,CAAC,CAACC,IAAI,CAAC;EAChD,IAAI,CAACH,OAAO,EAAE;IACZ,MAAM,IAAII,KAAK,CAAC,uBAAuB,CAAC;EAC1C;EACA,OAAO,IAAIJ,OAAO,CAACF,MAAM,EAAE,GAAGC,IAAI,CAAC;AACrC,CAAC;AAAAM,OAAA,CAAAR,UAAA,GAAAA,UAAA;AAEM,MAAMS,gBAAgB,GAAG,MAAAA,CAAO,GAAGC,IAAI,KAAK;EACjD,MAAMC,OAAO,GAAGX,UAAU,CAAC,GAAGU,IAAI,CAAC;EACnC,MAAMC,OAAO,CAACf,IAAI,EAAE;EACpB,OAAO;IACLgB,OAAO,EAAEA,CAAA,KAAMD,OAAO,CAACE,MAAM,EAAE;IAC/BC,KAAK,EAAEH;EACT,CAAC;AACH,CAAC;AAAAH,OAAA,CAAAC,gBAAA,GAAAA,gBAAA"}
1
+ {"version":3,"file":"index.js","names":["_execa","_interopRequireDefault","require","_xoRemoteParser","_local","_nfs","_s","_smb","_encryptor","obj","__esModule","default","HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","exports","getSyncedHandler","opts","handler","dispose","forget","value"],"sources":["../src/index.js"],"sourcesContent":["import execa from 'execa'\nimport { parse } from 'xo-remote-parser'\n\nimport RemoteHandlerLocal from './local'\nimport RemoteHandlerNfs from './nfs'\nimport RemoteHandlerS3 from './s3'\nimport RemoteHandlerSmb from './smb'\nexport { DEFAULT_ENCRYPTION_ALGORITHM, UNENCRYPTED_ALGORITHM, isLegacyEncryptionAlgorithm } from './_encryptor'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmb\n} catch (_) {}\n\nexport const getHandler = (remote, ...rest) => {\n const Handler = HANDLERS[parse(remote.url).type]\n if (!Handler) {\n throw new Error('Unhandled remote type')\n }\n return new Handler(remote, ...rest)\n}\n\nexport const getSyncedHandler = async (...opts) => {\n const handler = getHandler(...opts)\n await handler.sync()\n return {\n dispose: () => handler.forget(),\n value: handler,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,EAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,IAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,UAAA,GAAAN,OAAA;AAA+G,SAAAD,uBAAAQ,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE/G,MAAMG,QAAQ,GAAG;EACfC,IAAI,EAAEC,cAAkB;EACxBC,GAAG,EAAEC,YAAgB;EACrBC,EAAE,EAAEC;AACN,CAAC;AAED,IAAI;EACFC,cAAK,CAACC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;EAChCR,QAAQ,CAACS,GAAG,GAAGC,YAAgB;AACjC,CAAC,CAAC,OAAOC,CAAC,EAAE,CAAC;AAEN,MAAMC,UAAU,GAAGA,CAACC,MAAM,EAAE,GAAGC,IAAI,KAAK;EAC7C,MAAMC,OAAO,GAAGf,QAAQ,CAAC,IAAAgB,qBAAK,EAACH,MAAM,CAACI,GAAG,CAAC,CAACC,IAAI,CAAC;EAChD,IAAI,CAACH,OAAO,EAAE;IACZ,MAAM,IAAII,KAAK,CAAC,uBAAuB,CAAC;EAC1C;EACA,OAAO,IAAIJ,OAAO,CAACF,MAAM,EAAE,GAAGC,IAAI,CAAC;AACrC,CAAC;AAAAM,OAAA,CAAAR,UAAA,GAAAA,UAAA;AAEM,MAAMS,gBAAgB,GAAG,MAAAA,CAAO,GAAGC,IAAI,KAAK;EACjD,MAAMC,OAAO,GAAGX,UAAU,CAAC,GAAGU,IAAI,CAAC;EACnC,MAAMC,OAAO,CAACf,IAAI,CAAC,CAAC;EACpB,OAAO;IACLgB,OAAO,EAAEA,CAAA,KAAMD,OAAO,CAACE,MAAM,CAAC,CAAC;IAC/BC,KAAK,EAAEH;EACT,CAAC;AACH,CAAC;AAAAH,OAAA,CAAAC,gBAAA,GAAAA,gBAAA"}
package/dist/local.js CHANGED
@@ -32,10 +32,12 @@ function dontAddSyncStackTrace(fn, ...args) {
32
32
  return fn.apply(this, args);
33
33
  }
34
34
  class LocalHandler extends _abstract.default {
35
+ #addSyncStackTrace;
36
+ #retriesOnEagain;
35
37
  constructor(remote, opts = {}) {
36
38
  super(remote);
37
- this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace;
38
- this._retriesOnEagain = {
39
+ this.#addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace;
40
+ this.#retriesOnEagain = {
39
41
  delay: 1e3,
40
42
  retries: 9,
41
43
  ...opts.retriesOnEagain,
@@ -47,22 +49,22 @@ class LocalHandler extends _abstract.default {
47
49
  get type() {
48
50
  return 'file';
49
51
  }
50
- _getRealPath() {
52
+ getRealPath() {
51
53
  return this._remote.path;
52
54
  }
53
- _getFilePath(file) {
54
- return this._getRealPath() + file;
55
+ getFilePath(file) {
56
+ return this.getRealPath() + file;
55
57
  }
56
58
  async _closeFile(fd) {
57
- return this._addSyncStackTrace(_fsExtra.default.close, fd);
59
+ return this.#addSyncStackTrace(_fsExtra.default.close, fd);
58
60
  }
59
61
  async _copy(oldPath, newPath) {
60
- return this._addSyncStackTrace(_fsExtra.default.copy, this._getFilePath(oldPath), this._getFilePath(newPath));
62
+ return this.#addSyncStackTrace(_fsExtra.default.copy, this.getFilePath(oldPath), this.getFilePath(newPath));
61
63
  }
62
64
  async _createReadStream(file, options) {
63
65
  if (typeof file === 'string') {
64
- const stream = _fsExtra.default.createReadStream(this._getFilePath(file), options);
65
- await this._addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
66
+ const stream = _fsExtra.default.createReadStream(this.getFilePath(file), options);
67
+ await this.#addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
66
68
  return stream;
67
69
  }
68
70
  return _fsExtra.default.createReadStream('', {
@@ -73,8 +75,8 @@ class LocalHandler extends _abstract.default {
73
75
  }
74
76
  async _createWriteStream(file, options) {
75
77
  if (typeof file === 'string') {
76
- const stream = _fsExtra.default.createWriteStream(this._getFilePath(file), options);
77
- await this._addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
78
+ const stream = _fsExtra.default.createWriteStream(this.getFilePath(file), options);
79
+ await this.#addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
78
80
  return stream;
79
81
  }
80
82
  return _fsExtra.default.createWriteStream('', {
@@ -84,7 +86,7 @@ class LocalHandler extends _abstract.default {
84
86
  });
85
87
  }
86
88
  async _getInfo() {
87
- const info = await _df.default.file(this._getFilePath('/'));
89
+ const info = await _df.default.file(this.getFilePath('/'));
88
90
  Object.keys(info).forEach(key => {
89
91
  if (Number.isNaN(info[key])) {
90
92
  delete info[key];
@@ -93,14 +95,14 @@ class LocalHandler extends _abstract.default {
93
95
  return info;
94
96
  }
95
97
  async _getSize(file) {
96
- const stats = await this._addSyncStackTrace(_fsExtra.default.stat, this._getFilePath(typeof file === 'string' ? file : file.path));
98
+ const stats = await this.#addSyncStackTrace(_fsExtra.default.stat, this.getFilePath(typeof file === 'string' ? file : file.path));
97
99
  return stats.size;
98
100
  }
99
101
  async _list(dir) {
100
- return this._addSyncStackTrace(_fsExtra.default.readdir, this._getFilePath(dir));
102
+ return this.#addSyncStackTrace(_fsExtra.default.readdir, this.getFilePath(dir));
101
103
  }
102
104
  async _lock(path) {
103
- const acquire = _properLockfile.default.lock.bind(undefined, this._getFilePath(path), {
105
+ const acquire = _properLockfile.default.lock.bind(undefined, this.getFilePath(path), {
104
106
  async onCompromised(error) {
105
107
  warn('lock compromised', {
106
108
  error
@@ -115,10 +117,10 @@ class LocalHandler extends _abstract.default {
115
117
  }
116
118
  }
117
119
  });
118
- let release = await this._addSyncStackTrace(acquire);
120
+ let release = await this.#addSyncStackTrace(acquire);
119
121
  return async () => {
120
122
  try {
121
- await this._addSyncStackTrace(release);
123
+ await this.#addSyncStackTrace(release);
122
124
  } catch (error) {
123
125
  warn('lock could not be released', {
124
126
  error
@@ -129,53 +131,53 @@ class LocalHandler extends _abstract.default {
129
131
  _mkdir(dir, {
130
132
  mode
131
133
  }) {
132
- return this._addSyncStackTrace(_fsExtra.default.mkdir, this._getFilePath(dir), {
134
+ return this.#addSyncStackTrace(_fsExtra.default.mkdir, this.getFilePath(dir), {
133
135
  mode
134
136
  });
135
137
  }
136
138
  async _openFile(path, flags) {
137
- return this._addSyncStackTrace(_fsExtra.default.open, this._getFilePath(path), flags);
139
+ return this.#addSyncStackTrace(_fsExtra.default.open, this.getFilePath(path), flags);
138
140
  }
139
141
  async _read(file, buffer, position) {
140
142
  const needsClose = typeof file === 'string';
141
- file = needsClose ? await this._addSyncStackTrace(_fsExtra.default.open, this._getFilePath(file), 'r') : file.fd;
143
+ file = needsClose ? await this.#addSyncStackTrace(_fsExtra.default.open, this.getFilePath(file), 'r') : file.fd;
142
144
  try {
143
- return await this._addSyncStackTrace(_fsExtra.default.read, file, buffer, 0, buffer.length, position === undefined ? null : position);
145
+ return await this.#addSyncStackTrace(_fsExtra.default.read, file, buffer, 0, buffer.length, position === undefined ? null : position);
144
146
  } finally {
145
147
  if (needsClose) {
146
- await this._addSyncStackTrace(_fsExtra.default.close, file);
148
+ await this.#addSyncStackTrace(_fsExtra.default.close, file);
147
149
  }
148
150
  }
149
151
  }
150
152
  async _readFile(file, options) {
151
- const filePath = this._getFilePath(file);
152
- return await this._addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.readFile(filePath, options), this._retriesOnEagain);
153
+ const filePath = this.getFilePath(file);
154
+ return await this.#addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.readFile(filePath, options), this.#retriesOnEagain);
153
155
  }
154
156
  async _rename(oldPath, newPath) {
155
- return this._addSyncStackTrace(_fsExtra.default.rename, this._getFilePath(oldPath), this._getFilePath(newPath));
157
+ return this.#addSyncStackTrace(_fsExtra.default.rename, this.getFilePath(oldPath), this.getFilePath(newPath));
156
158
  }
157
159
  async _rmdir(dir) {
158
- return this._addSyncStackTrace(_fsExtra.default.rmdir, this._getFilePath(dir));
160
+ return this.#addSyncStackTrace(_fsExtra.default.rmdir, this.getFilePath(dir));
159
161
  }
160
162
  async _sync() {
161
- const path = this._getRealPath('/');
162
- await this._addSyncStackTrace(_fsExtra.default.ensureDir, path);
163
- await this._addSyncStackTrace(_fsExtra.default.access, path, _fsExtra.default.R_OK | _fsExtra.default.W_OK);
163
+ const path = this.getRealPath('/');
164
+ await this.#addSyncStackTrace(_fsExtra.default.ensureDir, path);
165
+ await this.#addSyncStackTrace(_fsExtra.default.access, path, _fsExtra.default.R_OK | _fsExtra.default.W_OK);
164
166
  }
165
167
  _truncate(file, len) {
166
- return this._addSyncStackTrace(_fsExtra.default.truncate, this._getFilePath(file), len);
168
+ return this.#addSyncStackTrace(_fsExtra.default.truncate, this.getFilePath(file), len);
167
169
  }
168
170
  async _unlink(file) {
169
- const filePath = this._getFilePath(file);
170
- return await this._addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.unlink(filePath), this._retriesOnEagain);
171
+ const filePath = this.getFilePath(file);
172
+ return await this.#addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.unlink(filePath), this.#retriesOnEagain);
171
173
  }
172
174
  _writeFd(file, buffer, position) {
173
- return this._addSyncStackTrace(_fsExtra.default.write, file.fd, buffer, 0, buffer.length, position);
175
+ return this.#addSyncStackTrace(_fsExtra.default.write, file.fd, buffer, 0, buffer.length, position);
174
176
  }
175
177
  _writeFile(file, data, {
176
178
  flags
177
179
  }) {
178
- return this._addSyncStackTrace(_fsExtra.default.writeFile, this._getFilePath(file), data, {
180
+ return this.#addSyncStackTrace(_fsExtra.default.writeFile, this.getFilePath(file), data, {
179
181
  flag: flags
180
182
  });
181
183
  }
package/dist/local.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","names":["_df","_interopRequireDefault","require","_fsExtra","_properLockfile","_log","_promiseToolbox","_abstract","obj","__esModule","default","info","warn","createLogger","addSyncStackTrace","fn","args","stackContainer","Error","apply","error","stack","slice","indexOf","join","dontAddSyncStackTrace","LocalHandler","RemoteHandlerAbstract","constructor","remote","opts","_addSyncStackTrace","syncStackTraces","_retriesOnEagain","delay","retries","retriesOnEagain","when","code","type","_getRealPath","_remote","path","_getFilePath","file","_closeFile","fd","fs","close","_copy","oldPath","newPath","copy","_createReadStream","options","stream","createReadStream","fromEvent","autoClose","_createWriteStream","createWriteStream","_getInfo","df","Object","keys","forEach","key","Number","isNaN","_getSize","stats","stat","size","_list","dir","readdir","_lock","acquire","lockfile","lock","bind","undefined","onCompromised","release","_mkdir","mode","mkdir","_openFile","flags","open","_read","buffer","position","needsClose","read","length","_readFile","filePath","retry","readFile","_rename","rename","_rmdir","rmdir","_sync","ensureDir","access","R_OK","W_OK","_truncate","len","truncate","_unlink","unlink","_writeFd","write","_writeFile","data","writeFile","flag","exports"],"sources":["../src/local.js"],"sourcesContent":["import df from '@sindresorhus/df'\nimport fs from 'fs-extra'\nimport lockfile from 'proper-lockfile'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromEvent, retry } from 'promise-toolbox'\n\nimport RemoteHandlerAbstract from './abstract'\n\nconst { info, warn } = createLogger('xo:fs:local')\n\n// save current stack trace and add it to any rejected error\n//\n// This is especially useful when the resolution is separate from the initial\n// call, which is often the case with RPC libs.\n//\n// There is a perf impact and it should be avoided in production.\nasync function addSyncStackTrace(fn, ...args) {\n const stackContainer = new Error()\n try {\n return await fn.apply(this, args)\n } catch (error) {\n let { stack } = stackContainer\n\n // remove first line which does not contain stack information, simply `Error`\n stack = stack.slice(stack.indexOf('\\n') + 1)\n\n error.stack = [error.stack, 'From:', stack].join('\\n')\n throw error\n }\n}\n\nfunction dontAddSyncStackTrace(fn, ...args) {\n return fn.apply(this, args)\n}\n\nexport default class LocalHandler extends RemoteHandlerAbstract {\n constructor(remote, opts = {}) {\n super(remote)\n\n this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace\n this._retriesOnEagain = {\n delay: 1e3,\n retries: 9,\n ...opts.retriesOnEagain,\n when: {\n code: 'EAGAIN',\n },\n }\n }\n get type() {\n return 'file'\n }\n\n _getRealPath() {\n return this._remote.path\n }\n\n _getFilePath(file) {\n return this._getRealPath() + file\n }\n\n async _closeFile(fd) {\n return this._addSyncStackTrace(fs.close, fd)\n }\n\n async _copy(oldPath, newPath) {\n return this._addSyncStackTrace(fs.copy, this._getFilePath(oldPath), this._getFilePath(newPath))\n }\n\n async _createReadStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createReadStream(this._getFilePath(file), options)\n await this._addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createReadStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _createWriteStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createWriteStream(this._getFilePath(file), options)\n await this._addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createWriteStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _getInfo() {\n // df.file() resolves with an object with the following properties:\n // filesystem, type, size, used, available, capacity and mountpoint.\n // size, used, available and capacity may be `NaN` so we remove any `NaN`\n // value from the object.\n const info = await df.file(this._getFilePath('/'))\n Object.keys(info).forEach(key => {\n if (Number.isNaN(info[key])) {\n delete info[key]\n }\n })\n\n return info\n }\n\n async _getSize(file) {\n const stats = await this._addSyncStackTrace(fs.stat, this._getFilePath(typeof file === 'string' ? file : file.path))\n return stats.size\n }\n\n async _list(dir) {\n return this._addSyncStackTrace(fs.readdir, this._getFilePath(dir))\n }\n\n async _lock(path) {\n const acquire = lockfile.lock.bind(undefined, this._getFilePath(path), {\n async onCompromised(error) {\n warn('lock compromised', { error })\n try {\n release = await acquire()\n info('compromised lock was reacquired')\n } catch (error) {\n warn('compromised lock could not be reacquired', { error })\n }\n },\n })\n\n let release = await this._addSyncStackTrace(acquire)\n\n return async () => {\n try {\n await this._addSyncStackTrace(release)\n } catch (error) {\n warn('lock could not be released', { error })\n }\n }\n }\n\n _mkdir(dir, { mode }) {\n return this._addSyncStackTrace(fs.mkdir, this._getFilePath(dir), { mode })\n }\n\n async _openFile(path, flags) {\n return this._addSyncStackTrace(fs.open, this._getFilePath(path), flags)\n }\n\n async _read(file, buffer, position) {\n const needsClose = typeof file === 'string'\n file = needsClose ? await this._addSyncStackTrace(fs.open, this._getFilePath(file), 'r') : file.fd\n try {\n return await this._addSyncStackTrace(\n fs.read,\n file,\n buffer,\n 0,\n buffer.length,\n position === undefined ? null : position\n )\n } finally {\n if (needsClose) {\n await this._addSyncStackTrace(fs.close, file)\n }\n }\n }\n\n async _readFile(file, options) {\n const filePath = this._getFilePath(file)\n return await this._addSyncStackTrace(retry, () => fs.readFile(filePath, options), this._retriesOnEagain)\n }\n\n async _rename(oldPath, newPath) {\n return this._addSyncStackTrace(fs.rename, this._getFilePath(oldPath), this._getFilePath(newPath))\n }\n\n async _rmdir(dir) {\n return this._addSyncStackTrace(fs.rmdir, this._getFilePath(dir))\n }\n\n async _sync() {\n const path = this._getRealPath('/')\n await this._addSyncStackTrace(fs.ensureDir, path)\n await this._addSyncStackTrace(fs.access, path, fs.R_OK | fs.W_OK)\n }\n\n _truncate(file, len) {\n return this._addSyncStackTrace(fs.truncate, this._getFilePath(file), len)\n }\n\n async _unlink(file) {\n const filePath = this._getFilePath(file)\n return await this._addSyncStackTrace(retry, () => fs.unlink(filePath), this._retriesOnEagain)\n }\n\n _writeFd(file, buffer, position) {\n return this._addSyncStackTrace(fs.write, file.fd, buffer, 0, buffer.length, position)\n }\n\n _writeFile(file, data, { flags }) {\n return this._addSyncStackTrace(fs.writeFile, this._getFilePath(file), data, { flag: flags })\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,eAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AAEA,IAAAK,SAAA,GAAAN,sBAAA,CAAAC,OAAA;AAA8C,SAAAD,uBAAAO,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE9C,MAAM;EAAEG,IAAI;EAAEC;AAAK,CAAC,GAAG,IAAAC,iBAAY,EAAC,aAAa,CAAC;AAQlD,eAAeC,iBAAiBA,CAACC,EAAE,EAAE,GAAGC,IAAI,EAAE;EAC5C,MAAMC,cAAc,GAAG,IAAIC,KAAK,EAAE;EAClC,IAAI;IACF,OAAO,MAAMH,EAAE,CAACI,KAAK,CAAC,IAAI,EAAEH,IAAI,CAAC;EACnC,CAAC,CAAC,OAAOI,KAAK,EAAE;IACd,IAAI;MAAEC;IAAM,CAAC,GAAGJ,cAAc;IAG9BI,KAAK,GAAGA,KAAK,CAACC,KAAK,CAACD,KAAK,CAACE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5CH,KAAK,CAACC,KAAK,GAAG,CAACD,KAAK,CAACC,KAAK,EAAE,OAAO,EAAEA,KAAK,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC;IACtD,MAAMJ,KAAK;EACb;AACF;AAEA,SAASK,qBAAqBA,CAACV,EAAE,EAAE,GAAGC,IAAI,EAAE;EAC1C,OAAOD,EAAE,CAACI,KAAK,CAAC,IAAI,EAAEH,IAAI,CAAC;AAC7B;AAEe,MAAMU,YAAY,SAASC,iBAAqB,CAAC;EAC9DC,WAAWA,CAACC,MAAM,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;IAC7B,KAAK,CAACD,MAAM,CAAC;IAEb,IAAI,CAACE,kBAAkB,GAAGD,IAAI,CAACE,eAAe,IAAI,IAAI,GAAGlB,iBAAiB,GAAGW,qBAAqB;IAClG,IAAI,CAACQ,gBAAgB,GAAG;MACtBC,KAAK,EAAE,GAAG;MACVC,OAAO,EAAE,CAAC;MACV,GAAGL,IAAI,CAACM,eAAe;MACvBC,IAAI,EAAE;QACJC,IAAI,EAAE;MACR;IACF,CAAC;EACH;EACA,IAAIC,IAAIA,CAAA,EAAG;IACT,OAAO,MAAM;EACf;EAEAC,YAAYA,CAAA,EAAG;IACb,OAAO,IAAI,CAACC,OAAO,CAACC,IAAI;EAC1B;EAEAC,YAAYA,CAACC,IAAI,EAAE;IACjB,OAAO,IAAI,CAACJ,YAAY,EAAE,GAAGI,IAAI;EACnC;EAEA,MAAMC,UAAUA,CAACC,EAAE,EAAE;IACnB,OAAO,IAAI,CAACf,kBAAkB,CAACgB,gBAAE,CAACC,KAAK,EAAEF,EAAE,CAAC;EAC9C;EAEA,MAAMG,KAAKA,CAACC,OAAO,EAAEC,OAAO,EAAE;IAC5B,OAAO,IAAI,CAACpB,kBAAkB,CAACgB,gBAAE,CAACK,IAAI,EAAE,IAAI,CAACT,YAAY,CAACO,OAAO,CAAC,EAAE,IAAI,CAACP,YAAY,CAACQ,OAAO,CAAC,CAAC;EACjG;EAEA,MAAME,iBAAiBA,CAACT,IAAI,EAAEU,OAAO,EAAE;IACrC,IAAI,OAAOV,IAAI,KAAK,QAAQ,EAAE;MAC5B,MAAMW,MAAM,GAAGR,gBAAE,CAACS,gBAAgB,CAAC,IAAI,CAACb,YAAY,CAACC,IAAI,CAAC,EAAEU,OAAO,CAAC;MACpE,MAAM,IAAI,CAACvB,kBAAkB,CAAC0B,yBAAS,EAAEF,MAAM,EAAE,MAAM,CAAC;MACxD,OAAOA,MAAM;IACf;IACA,OAAOR,gBAAE,CAACS,gBAAgB,CAAC,EAAE,EAAE;MAC7BE,SAAS,EAAE,KAAK;MAChB,GAAGJ,OAAO;MACVR,EAAE,EAAEF,IAAI,CAACE;IACX,CAAC,CAAC;EACJ;EAEA,MAAMa,kBAAkBA,CAACf,IAAI,EAAEU,OAAO,EAAE;IACtC,IAAI,OAAOV,IAAI,KAAK,QAAQ,EAAE;MAC5B,MAAMW,MAAM,GAAGR,gBAAE,CAACa,iBAAiB,CAAC,IAAI,CAACjB,YAAY,CAACC,IAAI,CAAC,EAAEU,OAAO,CAAC;MACrE,MAAM,IAAI,CAACvB,kBAAkB,CAAC0B,yBAAS,EAAEF,MAAM,EAAE,MAAM,CAAC;MACxD,OAAOA,MAAM;IACf;IACA,OAAOR,gBAAE,CAACa,iBAAiB,CAAC,EAAE,EAAE;MAC9BF,SAAS,EAAE,KAAK;MAChB,GAAGJ,OAAO;MACVR,EAAE,EAAEF,IAAI,CAACE;IACX,CAAC,CAAC;EACJ;EAEA,MAAMe,QAAQA,CAAA,EAAG;IAKf,MAAMlD,IAAI,GAAG,MAAMmD,WAAE,CAAClB,IAAI,CAAC,IAAI,CAACD,YAAY,CAAC,GAAG,CAAC,CAAC;IAClDoB,MAAM,CAACC,IAAI,CAACrD,IAAI,CAAC,CAACsD,OAAO,CAACC,GAAG,IAAI;MAC/B,IAAIC,MAAM,CAACC,KAAK,CAACzD,IAAI,CAACuD,GAAG,CAAC,CAAC,EAAE;QAC3B,OAAOvD,IAAI,CAACuD,GAAG,CAAC;MAClB;IACF,CAAC,CAAC;IAEF,OAAOvD,IAAI;EACb;EAEA,MAAM0D,QAAQA,CAACzB,IAAI,EAAE;IACnB,MAAM0B,KAAK,GAAG,MAAM,IAAI,CAACvC,kBAAkB,CAACgB,gBAAE,CAACwB,IAAI,EAAE,IAAI,CAAC5B,YAAY,CAAC,OAAOC,IAAI,KAAK,QAAQ,GAAGA,IAAI,GAAGA,IAAI,CAACF,IAAI,CAAC,CAAC;IACpH,OAAO4B,KAAK,CAACE,IAAI;EACnB;EAEA,MAAMC,KAAKA,CAACC,GAAG,EAAE;IACf,OAAO,IAAI,CAAC3C,kBAAkB,CAACgB,gBAAE,CAAC4B,OAAO,EAAE,IAAI,CAAChC,YAAY,CAAC+B,GAAG,CAAC,CAAC;EACpE;EAEA,MAAME,KAAKA,CAAClC,IAAI,EAAE;IAChB,MAAMmC,OAAO,GAAGC,uBAAQ,CAACC,IAAI,CAACC,IAAI,CAACC,SAAS,EAAE,IAAI,CAACtC,YAAY,CAACD,IAAI,CAAC,EAAE;MACrE,MAAMwC,aAAaA,CAAC9D,KAAK,EAAE;QACzBR,IAAI,CAAC,kBAAkB,EAAE;UAAEQ;QAAM,CAAC,CAAC;QACnC,IAAI;UACF+D,OAAO,GAAG,MAAMN,OAAO,EAAE;UACzBlE,IAAI,CAAC,iCAAiC,CAAC;QACzC,CAAC,CAAC,OAAOS,KAAK,EAAE;UACdR,IAAI,CAAC,0CAA0C,EAAE;YAAEQ;UAAM,CAAC,CAAC;QAC7D;MACF;IACF,CAAC,CAAC;IAEF,IAAI+D,OAAO,GAAG,MAAM,IAAI,CAACpD,kBAAkB,CAAC8C,OAAO,CAAC;IAEpD,OAAO,YAAY;MACjB,IAAI;QACF,MAAM,IAAI,CAAC9C,kBAAkB,CAACoD,OAAO,CAAC;MACxC,CAAC,CAAC,OAAO/D,KAAK,EAAE;QACdR,IAAI,CAAC,4BAA4B,EAAE;UAAEQ;QAAM,CAAC,CAAC;MAC/C;IACF,CAAC;EACH;EAEAgE,MAAMA,CAACV,GAAG,EAAE;IAAEW;EAAK,CAAC,EAAE;IACpB,OAAO,IAAI,CAACtD,kBAAkB,CAACgB,gBAAE,CAACuC,KAAK,EAAE,IAAI,CAAC3C,YAAY,CAAC+B,GAAG,CAAC,EAAE;MAAEW;IAAK,CAAC,CAAC;EAC5E;EAEA,MAAME,SAASA,CAAC7C,IAAI,EAAE8C,KAAK,EAAE;IAC3B,OAAO,IAAI,CAACzD,kBAAkB,CAACgB,gBAAE,CAAC0C,IAAI,EAAE,IAAI,CAAC9C,YAAY,CAACD,IAAI,CAAC,EAAE8C,KAAK,CAAC;EACzE;EAEA,MAAME,KAAKA,CAAC9C,IAAI,EAAE+C,MAAM,EAAEC,QAAQ,EAAE;IAClC,MAAMC,UAAU,GAAG,OAAOjD,IAAI,KAAK,QAAQ;IAC3CA,IAAI,GAAGiD,UAAU,GAAG,MAAM,IAAI,CAAC9D,kBAAkB,CAACgB,gBAAE,CAAC0C,IAAI,EAAE,IAAI,CAAC9C,YAAY,CAACC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAGA,IAAI,CAACE,EAAE;IAClG,IAAI;MACF,OAAO,MAAM,IAAI,CAACf,kBAAkB,CAClCgB,gBAAE,CAAC+C,IAAI,EACPlD,IAAI,EACJ+C,MAAM,EACN,CAAC,EACDA,MAAM,CAACI,MAAM,EACbH,QAAQ,KAAKX,SAAS,GAAG,IAAI,GAAGW,QAAQ,CACzC;IACH,CAAC,SAAS;MACR,IAAIC,UAAU,EAAE;QACd,MAAM,IAAI,CAAC9D,kBAAkB,CAACgB,gBAAE,CAACC,KAAK,EAAEJ,IAAI,CAAC;MAC/C;IACF;EACF;EAEA,MAAMoD,SAASA,CAACpD,IAAI,EAAEU,OAAO,EAAE;IAC7B,MAAM2C,QAAQ,GAAG,IAAI,CAACtD,YAAY,CAACC,IAAI,CAAC;IACxC,OAAO,MAAM,IAAI,CAACb,kBAAkB,CAACmE,qBAAK,EAAE,MAAMnD,gBAAE,CAACoD,QAAQ,CAACF,QAAQ,EAAE3C,OAAO,CAAC,EAAE,IAAI,CAACrB,gBAAgB,CAAC;EAC1G;EAEA,MAAMmE,OAAOA,CAAClD,OAAO,EAAEC,OAAO,EAAE;IAC9B,OAAO,IAAI,CAACpB,kBAAkB,CAACgB,gBAAE,CAACsD,MAAM,EAAE,IAAI,CAAC1D,YAAY,CAACO,OAAO,CAAC,EAAE,IAAI,CAACP,YAAY,CAACQ,OAAO,CAAC,CAAC;EACnG;EAEA,MAAMmD,MAAMA,CAAC5B,GAAG,EAAE;IAChB,OAAO,IAAI,CAAC3C,kBAAkB,CAACgB,gBAAE,CAACwD,KAAK,EAAE,IAAI,CAAC5D,YAAY,CAAC+B,GAAG,CAAC,CAAC;EAClE;EAEA,MAAM8B,KAAKA,CAAA,EAAG;IACZ,MAAM9D,IAAI,GAAG,IAAI,CAACF,YAAY,CAAC,GAAG,CAAC;IACnC,MAAM,IAAI,CAACT,kBAAkB,CAACgB,gBAAE,CAAC0D,SAAS,EAAE/D,IAAI,CAAC;IACjD,MAAM,IAAI,CAACX,kBAAkB,CAACgB,gBAAE,CAAC2D,MAAM,EAAEhE,IAAI,EAAEK,gBAAE,CAAC4D,IAAI,GAAG5D,gBAAE,CAAC6D,IAAI,CAAC;EACnE;EAEAC,SAASA,CAACjE,IAAI,EAAEkE,GAAG,EAAE;IACnB,OAAO,IAAI,CAAC/E,kBAAkB,CAACgB,gBAAE,CAACgE,QAAQ,EAAE,IAAI,CAACpE,YAAY,CAACC,IAAI,CAAC,EAAEkE,GAAG,CAAC;EAC3E;EAEA,MAAME,OAAOA,CAACpE,IAAI,EAAE;IAClB,MAAMqD,QAAQ,GAAG,IAAI,CAACtD,YAAY,CAACC,IAAI,CAAC;IACxC,OAAO,MAAM,IAAI,CAACb,kBAAkB,CAACmE,qBAAK,EAAE,MAAMnD,gBAAE,CAACkE,MAAM,CAAChB,QAAQ,CAAC,EAAE,IAAI,CAAChE,gBAAgB,CAAC;EAC/F;EAEAiF,QAAQA,CAACtE,IAAI,EAAE+C,MAAM,EAAEC,QAAQ,EAAE;IAC/B,OAAO,IAAI,CAAC7D,kBAAkB,CAACgB,gBAAE,CAACoE,KAAK,EAAEvE,IAAI,CAACE,EAAE,EAAE6C,MAAM,EAAE,CAAC,EAAEA,MAAM,CAACI,MAAM,EAAEH,QAAQ,CAAC;EACvF;EAEAwB,UAAUA,CAACxE,IAAI,EAAEyE,IAAI,EAAE;IAAE7B;EAAM,CAAC,EAAE;IAChC,OAAO,IAAI,CAACzD,kBAAkB,CAACgB,gBAAE,CAACuE,SAAS,EAAE,IAAI,CAAC3E,YAAY,CAACC,IAAI,CAAC,EAAEyE,IAAI,EAAE;MAAEE,IAAI,EAAE/B;IAAM,CAAC,CAAC;EAC9F;AACF;AAACgC,OAAA,CAAA9G,OAAA,GAAAgB,YAAA"}
1
+ {"version":3,"file":"local.js","names":["_df","_interopRequireDefault","require","_fsExtra","_properLockfile","_log","_promiseToolbox","_abstract","obj","__esModule","default","info","warn","createLogger","addSyncStackTrace","fn","args","stackContainer","Error","apply","error","stack","slice","indexOf","join","dontAddSyncStackTrace","LocalHandler","RemoteHandlerAbstract","retriesOnEagain","constructor","remote","opts","syncStackTraces","delay","retries","when","code","type","getRealPath","_remote","path","getFilePath","file","_closeFile","fd","fs","close","_copy","oldPath","newPath","copy","_createReadStream","options","stream","createReadStream","fromEvent","autoClose","_createWriteStream","createWriteStream","_getInfo","df","Object","keys","forEach","key","Number","isNaN","_getSize","stats","stat","size","_list","dir","readdir","_lock","acquire","lockfile","lock","bind","undefined","onCompromised","release","_mkdir","mode","mkdir","_openFile","flags","open","_read","buffer","position","needsClose","read","length","_readFile","filePath","retry","readFile","_rename","rename","_rmdir","rmdir","_sync","ensureDir","access","R_OK","W_OK","_truncate","len","truncate","_unlink","unlink","_writeFd","write","_writeFile","data","writeFile","flag","exports"],"sources":["../src/local.js"],"sourcesContent":["import df from '@sindresorhus/df'\nimport fs from 'fs-extra'\nimport lockfile from 'proper-lockfile'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromEvent, retry } from 'promise-toolbox'\n\nimport RemoteHandlerAbstract from './abstract'\n\nconst { info, warn } = createLogger('xo:fs:local')\n\n// save current stack trace and add it to any rejected error\n//\n// This is especially useful when the resolution is separate from the initial\n// call, which is often the case with RPC libs.\n//\n// There is a perf impact and it should be avoided in production.\nasync function addSyncStackTrace(fn, ...args) {\n const stackContainer = new Error()\n try {\n return await fn.apply(this, args)\n } catch (error) {\n let { stack } = stackContainer\n\n // remove first line which does not contain stack information, simply `Error`\n stack = stack.slice(stack.indexOf('\\n') + 1)\n\n error.stack = [error.stack, 'From:', stack].join('\\n')\n throw error\n }\n}\n\nfunction dontAddSyncStackTrace(fn, ...args) {\n return fn.apply(this, args)\n}\n\nexport default class LocalHandler extends RemoteHandlerAbstract {\n #addSyncStackTrace\n #retriesOnEagain\n\n constructor(remote, opts = {}) {\n super(remote)\n\n this.#addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace\n this.#retriesOnEagain = {\n delay: 1e3,\n retries: 9,\n ...opts.retriesOnEagain,\n when: {\n code: 'EAGAIN',\n },\n }\n }\n get type() {\n return 'file'\n }\n\n getRealPath() {\n return this._remote.path\n }\n\n getFilePath(file) {\n return this.getRealPath() + file\n }\n\n async _closeFile(fd) {\n return this.#addSyncStackTrace(fs.close, fd)\n }\n\n async _copy(oldPath, newPath) {\n return this.#addSyncStackTrace(fs.copy, this.getFilePath(oldPath), this.getFilePath(newPath))\n }\n\n async _createReadStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createReadStream(this.getFilePath(file), options)\n await this.#addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createReadStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _createWriteStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createWriteStream(this.getFilePath(file), options)\n await this.#addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createWriteStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _getInfo() {\n // df.file() resolves with an object with the following properties:\n // filesystem, type, size, used, available, capacity and mountpoint.\n // size, used, available and capacity may be `NaN` so we remove any `NaN`\n // value from the object.\n const info = await df.file(this.getFilePath('/'))\n Object.keys(info).forEach(key => {\n if (Number.isNaN(info[key])) {\n delete info[key]\n }\n })\n\n return info\n }\n\n async _getSize(file) {\n const stats = await this.#addSyncStackTrace(fs.stat, this.getFilePath(typeof file === 'string' ? file : file.path))\n return stats.size\n }\n\n async _list(dir) {\n return this.#addSyncStackTrace(fs.readdir, this.getFilePath(dir))\n }\n\n async _lock(path) {\n const acquire = lockfile.lock.bind(undefined, this.getFilePath(path), {\n async onCompromised(error) {\n warn('lock compromised', { error })\n try {\n release = await acquire()\n info('compromised lock was reacquired')\n } catch (error) {\n warn('compromised lock could not be reacquired', { error })\n }\n },\n })\n\n let release = await this.#addSyncStackTrace(acquire)\n\n return async () => {\n try {\n await this.#addSyncStackTrace(release)\n } catch (error) {\n warn('lock could not be released', { error })\n }\n }\n }\n\n _mkdir(dir, { mode }) {\n return this.#addSyncStackTrace(fs.mkdir, this.getFilePath(dir), { mode })\n }\n\n async _openFile(path, flags) {\n return this.#addSyncStackTrace(fs.open, this.getFilePath(path), flags)\n }\n\n async _read(file, buffer, position) {\n const needsClose = typeof file === 'string'\n file = needsClose ? await this.#addSyncStackTrace(fs.open, this.getFilePath(file), 'r') : file.fd\n try {\n return await this.#addSyncStackTrace(\n fs.read,\n file,\n buffer,\n 0,\n buffer.length,\n position === undefined ? null : position\n )\n } finally {\n if (needsClose) {\n await this.#addSyncStackTrace(fs.close, file)\n }\n }\n }\n\n async _readFile(file, options) {\n const filePath = this.getFilePath(file)\n return await this.#addSyncStackTrace(retry, () => fs.readFile(filePath, options), this.#retriesOnEagain)\n }\n\n async _rename(oldPath, newPath) {\n return this.#addSyncStackTrace(fs.rename, this.getFilePath(oldPath), this.getFilePath(newPath))\n }\n\n async _rmdir(dir) {\n return this.#addSyncStackTrace(fs.rmdir, this.getFilePath(dir))\n }\n\n async _sync() {\n const path = this.getRealPath('/')\n await this.#addSyncStackTrace(fs.ensureDir, path)\n await this.#addSyncStackTrace(fs.access, path, fs.R_OK | fs.W_OK)\n }\n\n _truncate(file, len) {\n return this.#addSyncStackTrace(fs.truncate, this.getFilePath(file), len)\n }\n\n async _unlink(file) {\n const filePath = this.getFilePath(file)\n return await this.#addSyncStackTrace(retry, () => fs.unlink(filePath), this.#retriesOnEagain)\n }\n\n _writeFd(file, buffer, position) {\n return this.#addSyncStackTrace(fs.write, file.fd, buffer, 0, buffer.length, position)\n }\n\n _writeFile(file, data, { flags }) {\n return this.#addSyncStackTrace(fs.writeFile, this.getFilePath(file), data, { flag: flags })\n }\n}\n"],"mappings":"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"}
package/dist/path.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"path.js","names":["_path","_interopRequireDefault","require","obj","__esModule","default","basename","dirname","join","resolve","relative","sep","path","posix","exports","normalize","split","parts","shift","relativeFromFile","file","resolveFromFile","slice"],"sources":["../src/path.js"],"sourcesContent":["import path from 'path'\n\nconst { basename, dirname, join, resolve, relative, sep } = path.posix\n\nexport { basename, dirname, join }\n\n// normalize the path:\n// - does not contains `.` or `..` (cannot escape root dir)\n// - always starts with `/`\n// - no trailing slash (expect for root)\n// - no duplicate slashes\nexport const normalize = path => resolve('/', path)\n\nexport function split(path) {\n const parts = normalize(path).split(sep)\n\n // remove first (empty) entry\n parts.shift()\n\n return parts\n}\n\nexport const relativeFromFile = (file, path) => relative(dirname(file), path)\nexport const resolveFromFile = (file, path) => resolve('/', dirname(file), path).slice(1)\n"],"mappings":";;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAuB,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEvB,MAAM;EAAEG,QAAQ;EAAEC,OAAO;EAAEC,IAAI;EAAEC,OAAO;EAAEC,QAAQ;EAAEC;AAAI,CAAC,GAAGC,aAAI,CAACC,KAAK;AAAAC,OAAA,CAAAN,IAAA,GAAAA,IAAA;AAAAM,OAAA,CAAAP,OAAA,GAAAA,OAAA;AAAAO,OAAA,CAAAR,QAAA,GAAAA,QAAA;AAS/D,MAAMS,SAAS,GAAGH,IAAI,IAAIH,OAAO,CAAC,GAAG,EAAEG,IAAI,CAAC;AAAAE,OAAA,CAAAC,SAAA,GAAAA,SAAA;AAE5C,SAASC,KAAKA,CAACJ,IAAI,EAAE;EAC1B,MAAMK,KAAK,GAAGF,SAAS,CAACH,IAAI,CAAC,CAACI,KAAK,CAACL,GAAG,CAAC;EAGxCM,KAAK,CAACC,KAAK,EAAE;EAEb,OAAOD,KAAK;AACd;AAEO,MAAME,gBAAgB,GAAGA,CAACC,IAAI,EAAER,IAAI,KAAKF,QAAQ,CAACH,OAAO,CAACa,IAAI,CAAC,EAAER,IAAI,CAAC;AAAAE,OAAA,CAAAK,gBAAA,GAAAA,gBAAA;AACtE,MAAME,eAAe,GAAGA,CAACD,IAAI,EAAER,IAAI,KAAKH,OAAO,CAAC,GAAG,EAAEF,OAAO,CAACa,IAAI,CAAC,EAAER,IAAI,CAAC,CAACU,KAAK,CAAC,CAAC,CAAC;AAAAR,OAAA,CAAAO,eAAA,GAAAA,eAAA"}
1
+ {"version":3,"file":"path.js","names":["_path","_interopRequireDefault","require","obj","__esModule","default","basename","dirname","join","resolve","relative","sep","path","posix","exports","normalize","split","parts","shift","relativeFromFile","file","resolveFromFile","slice"],"sources":["../src/path.js"],"sourcesContent":["import path from 'path'\n\nconst { basename, dirname, join, resolve, relative, sep } = path.posix\n\nexport { basename, dirname, join }\n\n// normalize the path:\n// - does not contains `.` or `..` (cannot escape root dir)\n// - always starts with `/`\n// - no trailing slash (expect for root)\n// - no duplicate slashes\nexport const normalize = path => resolve('/', path)\n\nexport function split(path) {\n const parts = normalize(path).split(sep)\n\n // remove first (empty) entry\n parts.shift()\n\n return parts\n}\n\nexport const relativeFromFile = (file, path) => relative(dirname(file), path)\nexport const resolveFromFile = (file, path) => resolve('/', dirname(file), path).slice(1)\n"],"mappings":";;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAuB,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEvB,MAAM;EAAEG,QAAQ;EAAEC,OAAO;EAAEC,IAAI;EAAEC,OAAO;EAAEC,QAAQ;EAAEC;AAAI,CAAC,GAAGC,aAAI,CAACC,KAAK;AAAAC,OAAA,CAAAN,IAAA,GAAAA,IAAA;AAAAM,OAAA,CAAAP,OAAA,GAAAA,OAAA;AAAAO,OAAA,CAAAR,QAAA,GAAAA,QAAA;AAS/D,MAAMS,SAAS,GAAGH,IAAI,IAAIH,OAAO,CAAC,GAAG,EAAEG,IAAI,CAAC;AAAAE,OAAA,CAAAC,SAAA,GAAAA,SAAA;AAE5C,SAASC,KAAKA,CAACJ,IAAI,EAAE;EAC1B,MAAMK,KAAK,GAAGF,SAAS,CAACH,IAAI,CAAC,CAACI,KAAK,CAACL,GAAG,CAAC;EAGxCM,KAAK,CAACC,KAAK,CAAC,CAAC;EAEb,OAAOD,KAAK;AACd;AAEO,MAAME,gBAAgB,GAAGA,CAACC,IAAI,EAAER,IAAI,KAAKF,QAAQ,CAACH,OAAO,CAACa,IAAI,CAAC,EAAER,IAAI,CAAC;AAAAE,OAAA,CAAAK,gBAAA,GAAAA,gBAAA;AACtE,MAAME,eAAe,GAAGA,CAACD,IAAI,EAAER,IAAI,KAAKH,OAAO,CAAC,GAAG,EAAEF,OAAO,CAACa,IAAI,CAAC,EAAER,IAAI,CAAC,CAACU,KAAK,CAAC,CAAC,CAAC;AAAAR,OAAA,CAAAO,eAAA,GAAAA,eAAA"}