@xen-orchestra/fs 3.0.0 → 3.2.0

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":["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","forEach","entry","i","slice","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","_encryptor","remote","options","url","_remote","parse","Error","highWaterMark","_highWaterMark","timeout","_timeout","_getEncryptor","encryptionKey","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","undefined","start","assert","strictEqual","isEncrypted","stream","call","_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","p","_rename","Promise","all","_copy","_rmdir","catch","rmtree","_rmtree","sync","_checkMetadata","_canWriteMetadata","e","startsWith","_createMetadata","_writeFile","JSON","stringify","algorithm","randomUUID","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","dirname","resolve","tmpPath","basename","output","then","getStream","files","asyncMapSettled","isPath","_writeFd","id","createPrefixWrapperMethods","pPw","pRha","defineProperty","getOwnPropertyDescriptor","hasOwnProperty","Object","getOwnPropertyNames","name","descriptor","value","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 { _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('@xen-orchestra:fs')\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 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 this._encryptor = _getEncryptor(this._remote.encryptionKey)\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 = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\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 return p\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 await Promise.all([\n this._writeFile(\n normalizePath(ENCRYPTION_DESC_FILENAME),\n JSON.stringify({ algorithm: this._encryptor.algorithm }),\n {\n flags: 'w',\n }\n ), // not encrypted\n this.writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async _checkMetadata() {\n try {\n // this file is not encrypted\n const data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME))\n JSON.parse(data)\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n try {\n // this file is encrypted\n const data = await this.readFile(ENCRYPTION_METADATA_FILENAME)\n JSON.parse(data)\n } catch (error) {\n if (error.code === 'ENOENT' || (await this._canWriteMetadata())) {\n info('will update metadata of this remote')\n return this._createMetadata()\n }\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 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":["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","forEach","entry","i","slice","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","encryptor","_encryptor","undefined","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","call","_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","p","_rename","Promise","all","_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","dirname","resolve","tmpPath","basename","output","then","getStream","files","asyncMapSettled","isPath","_writeFd","id","createPrefixWrapperMethods","pPw","pRha","defineProperty","getOwnPropertyDescriptor","hasOwnProperty","Object","getOwnPropertyNames","name","descriptor","value","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('@xen-orchestra:fs')\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 = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\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 return p\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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"}
package/dist/checksum.js CHANGED
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.validChecksumOfReadStream = exports.createChecksumStream = void 0;
7
-
8
7
  var _invert2 = _interopRequireDefault(require("lodash/invert"));
9
-
10
8
  var _through = _interopRequireDefault(require("through2"));
11
-
12
9
  var _crypto = require("crypto");
13
-
14
10
  var _promiseToolbox = require("promise-toolbox");
15
-
16
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
12
  const ALGORITHM_TO_ID = {
19
13
  md5: '1',
20
14
  sha256: '5',
@@ -24,11 +18,9 @@ const ID_TO_ALGORITHM = (0, _invert2.default)(ALGORITHM_TO_ID);
24
18
 
25
19
  const createChecksumStream = (algorithm = 'md5') => {
26
20
  const algorithmId = ALGORITHM_TO_ID[algorithm];
27
-
28
21
  if (!algorithmId) {
29
22
  throw new Error(`unknown algorithm: ${algorithm}`);
30
23
  }
31
-
32
24
  const hash = (0, _crypto.createHash)(algorithm);
33
25
  const {
34
26
  promise,
@@ -47,14 +39,11 @@ const createChecksumStream = (algorithm = 'md5') => {
47
39
  };
48
40
 
49
41
  exports.createChecksumStream = createChecksumStream;
50
-
51
42
  const validChecksumOfReadStream = (stream, expectedChecksum) => {
52
43
  const algorithmId = expectedChecksum.slice(1, expectedChecksum.indexOf('$', 1));
53
-
54
44
  if (!algorithmId) {
55
45
  throw new Error(`unknown algorithm: ${algorithmId}`);
56
46
  }
57
-
58
47
  const hash = (0, _crypto.createHash)(ID_TO_ALGORITHM[algorithmId]);
59
48
  const wrapper = stream.pipe((0, _through.default)({
60
49
  highWaterMark: 0
@@ -69,6 +58,5 @@ const validChecksumOfReadStream = (stream, expectedChecksum) => {
69
58
  wrapper.checksumVerified = (0, _promiseToolbox.fromEvent)(wrapper, 'end');
70
59
  return wrapper;
71
60
  };
72
-
73
61
  exports.validChecksumOfReadStream = validChecksumOfReadStream;
74
62
  //# sourceMappingURL=checksum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.js","names":["ALGORITHM_TO_ID","md5","sha256","sha512","ID_TO_ALGORITHM","createChecksumStream","algorithm","algorithmId","Error","hash","createHash","promise","resolve","reject","defer","stream","through2","chunk","enc","callback","update","digest","once","checksum","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'\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":";;;;;;;;;AAAA;;AACA;;AACA;;;;AAMA,MAAMA,eAAe,GAAG;EACtBC,GAAG,EAAE,GADiB;EAEtBC,MAAM,EAAE,GAFc;EAGtBC,MAAM,EAAE;AAHc,CAAxB;AAMA,MAAMC,eAAe,GAAG,sBAAOJ,eAAP,CAAxB;;AAYO,MAAMK,oBAAoB,GAAG,CAACC,SAAS,GAAG,KAAb,KAAuB;EACzD,MAAMC,WAAW,GAAGP,eAAe,CAACM,SAAD,CAAnC;;EAEA,IAAI,CAACC,WAAL,EAAkB;IAChB,MAAM,IAAIC,KAAJ,CAAW,sBAAqBF,SAAU,EAA1C,CAAN;EACD;;EAED,MAAMG,IAAI,GAAG,IAAAC,kBAAA,EAAWJ,SAAX,CAAb;EACA,MAAM;IAAEK,OAAF;IAAWC,OAAX;IAAoBC;EAApB,IAA+B,IAAAC,qBAAA,GAArC;EAEA,MAAMC,MAAM,GAAG,IAAAC,gBAAA,EACb,CAACC,KAAD,EAAQC,GAAR,EAAaC,QAAb,KAA0B;IACxBV,IAAI,CAACW,MAAL,CAAYH,KAAZ;IACAE,QAAQ,CAAC,IAAD,EAAOF,KAAP,CAAR;EACD,CAJY,EAKbE,QAAQ,IAAI;IACVP,OAAO,CAAE,IAAGL,WAAY,KAAIE,IAAI,CAACY,MAAL,CAAY,KAAZ,CAAmB,EAAxC,CAAP;IACAF,QAAQ;EACT,CARY,EASbG,IATa,CASR,OATQ,EASCT,MATD,CAAf;EAUAE,MAAM,CAACQ,QAAP,GAAkBZ,OAAlB;EACA,OAAOI,MAAP;AACD,CAtBM;;;;AA2BA,MAAMS,yBAAyB,GAAG,CAACT,MAAD,EAASU,gBAAT,KAA8B;EACrE,MAAMlB,WAAW,GAAGkB,gBAAgB,CAACC,KAAjB,CAAuB,CAAvB,EAA0BD,gBAAgB,CAACE,OAAjB,CAAyB,GAAzB,EAA8B,CAA9B,CAA1B,CAApB;;EAEA,IAAI,CAACpB,WAAL,EAAkB;IAChB,MAAM,IAAIC,KAAJ,CAAW,sBAAqBD,WAAY,EAA5C,CAAN;EACD;;EAED,MAAME,IAAI,GAAG,IAAAC,kBAAA,EAAWN,eAAe,CAACG,WAAD,CAA1B,CAAb;EAEA,MAAMqB,OAAO,GAAGb,MAAM,CAACc,IAAP,CACd,IAAAb,gBAAA,EACE;IAAEc,aAAa,EAAE;EAAjB,CADF,EAEE,CAACb,KAAD,EAAQC,GAAR,EAAaC,QAAb,KAA0B;IACxBV,IAAI,CAACW,MAAL,CAAYH,KAAZ;IACAE,QAAQ,CAAC,IAAD,EAAOF,KAAP,CAAR;EACD,CALH,EAMEE,QAAQ,IAAI;IACV,MAAMI,QAAQ,GAAI,IAAGhB,WAAY,KAAIE,IAAI,CAACY,MAAL,CAAY,KAAZ,CAAmB,EAAxD;IAEAF,QAAQ,CACNI,QAAQ,KAAKE,gBAAb,GAAgC,IAAIjB,KAAJ,CAAW,iBAAgBe,QAAS,gBAAeE,gBAAiB,EAApE,CAAhC,GAAyG,IADnG,CAAR;EAGD,CAZH,CADc,CAAhB;EAiBAV,MAAM,CAACgB,EAAP,CAAU,OAAV,EAAmBC,KAAK,IAAIJ,OAAO,CAACK,IAAR,CAAa,OAAb,EAAsBD,KAAtB,CAA5B;EACAJ,OAAO,CAACM,gBAAR,GAA2B,IAAAC,yBAAA,EAAUP,OAAV,EAAmB,KAAnB,CAA3B;EAEA,OAAOA,OAAP;AACD,CA9BM"}
1
+ {"version":3,"file":"checksum.js","names":["ALGORITHM_TO_ID","md5","sha256","sha512","ID_TO_ALGORITHM","createChecksumStream","algorithm","algorithmId","Error","hash","createHash","promise","resolve","reject","defer","stream","through2","chunk","enc","callback","update","digest","once","checksum","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'\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":";;;;;;;AAAA;AACA;AACA;AAAkD;AAMlD,MAAMA,eAAe,GAAG;EACtBC,GAAG,EAAE,GAAG;EACRC,MAAM,EAAE,GAAG;EACXC,MAAM,EAAE;AACV,CAAC;AAED,MAAMC,eAAe,GAAG,sBAAOJ,eAAe,CAAC;;AAYxC,MAAMK,oBAAoB,GAAG,CAACC,SAAS,GAAG,KAAK,KAAK;EACzD,MAAMC,WAAW,GAAGP,eAAe,CAACM,SAAS,CAAC;EAE9C,IAAI,CAACC,WAAW,EAAE;IAChB,MAAM,IAAIC,KAAK,CAAE,sBAAqBF,SAAU,EAAC,CAAC;EACpD;EAEA,MAAMG,IAAI,GAAG,IAAAC,kBAAU,EAACJ,SAAS,CAAC;EAClC,MAAM;IAAEK,OAAO;IAAEC,OAAO;IAAEC;EAAO,CAAC,GAAG,IAAAC,qBAAK,GAAE;EAE5C,MAAMC,MAAM,GAAG,IAAAC,gBAAQ,EACrB,CAACC,KAAK,EAAEC,GAAG,EAAEC,QAAQ,KAAK;IACxBV,IAAI,CAACW,MAAM,CAACH,KAAK,CAAC;IAClBE,QAAQ,CAAC,IAAI,EAAEF,KAAK,CAAC;EACvB,CAAC,EACDE,QAAQ,IAAI;IACVP,OAAO,CAAE,IAAGL,WAAY,KAAIE,IAAI,CAACY,MAAM,CAAC,KAAK,CAAE,EAAC,CAAC;IACjDF,QAAQ,EAAE;EACZ,CAAC,CACF,CAACG,IAAI,CAAC,OAAO,EAAET,MAAM,CAAC;EACvBE,MAAM,CAACQ,QAAQ,GAAGZ,OAAO;EACzB,OAAOI,MAAM;AACf,CAAC;;AAAA;AAKM,MAAMS,yBAAyB,GAAG,CAACT,MAAM,EAAEU,gBAAgB,KAAK;EACrE,MAAMlB,WAAW,GAAGkB,gBAAgB,CAACC,KAAK,CAAC,CAAC,EAAED,gBAAgB,CAACE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;EAE/E,IAAI,CAACpB,WAAW,EAAE;IAChB,MAAM,IAAIC,KAAK,CAAE,sBAAqBD,WAAY,EAAC,CAAC;EACtD;EAEA,MAAME,IAAI,GAAG,IAAAC,kBAAU,EAACN,eAAe,CAACG,WAAW,CAAC,CAAC;EAErD,MAAMqB,OAAO,GAAGb,MAAM,CAACc,IAAI,CACzB,IAAAb,gBAAQ,EACN;IAAEc,aAAa,EAAE;EAAE,CAAC,EACpB,CAACb,KAAK,EAAEC,GAAG,EAAEC,QAAQ,KAAK;IACxBV,IAAI,CAACW,MAAM,CAACH,KAAK,CAAC;IAClBE,QAAQ,CAAC,IAAI,EAAEF,KAAK,CAAC;EACvB,CAAC,EACDE,QAAQ,IAAI;IACV,MAAMI,QAAQ,GAAI,IAAGhB,WAAY,KAAIE,IAAI,CAACY,MAAM,CAAC,KAAK,CAAE,EAAC;IAEzDF,QAAQ,CACNI,QAAQ,KAAKE,gBAAgB,GAAG,IAAIjB,KAAK,CAAE,iBAAgBe,QAAS,gBAAeE,gBAAiB,EAAC,CAAC,GAAG,IAAI,CAC9G;EACH,CAAC,CACF,CACF;EAEDV,MAAM,CAACgB,EAAE,CAAC,OAAO,EAAEC,KAAK,IAAIJ,OAAO,CAACK,IAAI,CAAC,OAAO,EAAED,KAAK,CAAC,CAAC;EACzDJ,OAAO,CAACM,gBAAgB,GAAG,IAAAC,yBAAS,EAACP,OAAO,EAAE,KAAK,CAAC;EAEpD,OAAOA,OAAO;AAChB,CAAC;AAAA"}
package/dist/index.js CHANGED
@@ -3,46 +3,50 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "DEFAULT_ENCRYPTION_ALGORITHM", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _encryptor.DEFAULT_ENCRYPTION_ALGORITHM;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "UNENCRYPTED_ALGORITHM", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _encryptor.UNENCRYPTED_ALGORITHM;
16
+ }
17
+ });
6
18
  exports.getSyncedHandler = exports.getHandler = void 0;
7
-
19
+ Object.defineProperty(exports, "isLegacyEncryptionAlgorithm", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _encryptor.isLegacyEncryptionAlgorithm;
23
+ }
24
+ });
8
25
  var _execa = _interopRequireDefault(require("execa"));
9
-
10
26
  var _xoRemoteParser = require("xo-remote-parser");
11
-
12
27
  var _local = _interopRequireDefault(require("./local"));
13
-
14
28
  var _nfs = _interopRequireDefault(require("./nfs"));
15
-
16
29
  var _s = _interopRequireDefault(require("./s3"));
17
-
18
30
  var _smb = _interopRequireDefault(require("./smb"));
19
-
31
+ var _encryptor = require("./_encryptor");
20
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
33
  const HANDLERS = {
23
34
  file: _local.default,
24
35
  nfs: _nfs.default,
25
36
  s3: _s.default
26
37
  };
27
-
28
38
  try {
29
39
  _execa.default.sync('mount.cifs', ['-V']);
30
-
31
40
  HANDLERS.smb = _smb.default;
32
41
  } catch (_) {}
33
-
34
42
  const getHandler = (remote, ...rest) => {
35
43
  const Handler = HANDLERS[(0, _xoRemoteParser.parse)(remote.url).type];
36
-
37
44
  if (!Handler) {
38
45
  throw new Error('Unhandled remote type');
39
46
  }
40
-
41
47
  return new Handler(remote, ...rest);
42
48
  };
43
-
44
49
  exports.getHandler = getHandler;
45
-
46
50
  const getSyncedHandler = async (...opts) => {
47
51
  const handler = getHandler(...opts);
48
52
  await handler.sync();
@@ -51,6 +55,5 @@ const getSyncedHandler = async (...opts) => {
51
55
  value: handler
52
56
  };
53
57
  };
54
-
55
58
  exports.getSyncedHandler = getSyncedHandler;
56
59
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","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'\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;;AACA;;AAEA;;AACA;;AACA;;AACA;;;;AAEA,MAAMA,QAAQ,GAAG;EACfC,IAAI,EAAEC,cADS;EAEfC,GAAG,EAAEC,YAFU;EAGfC,EAAE,EAAEC;AAHW,CAAjB;;AAMA,IAAI;EACFC,cAAA,CAAMC,IAAN,CAAW,YAAX,EAAyB,CAAC,IAAD,CAAzB;;EACAR,QAAQ,CAACS,GAAT,GAAeC,YAAf;AACD,CAHD,CAGE,OAAOC,CAAP,EAAU,CAAE;;AAEP,MAAMC,UAAU,GAAG,CAACC,MAAD,EAAS,GAAGC,IAAZ,KAAqB;EAC7C,MAAMC,OAAO,GAAGf,QAAQ,CAAC,IAAAgB,qBAAA,EAAMH,MAAM,CAACI,GAAb,EAAkBC,IAAnB,CAAxB;;EACA,IAAI,CAACH,OAAL,EAAc;IACZ,MAAM,IAAII,KAAJ,CAAU,uBAAV,CAAN;EACD;;EACD,OAAO,IAAIJ,OAAJ,CAAYF,MAAZ,EAAoB,GAAGC,IAAvB,CAAP;AACD,CANM;;;;AAQA,MAAMM,gBAAgB,GAAG,OAAO,GAAGC,IAAV,KAAmB;EACjD,MAAMC,OAAO,GAAGV,UAAU,CAAC,GAAGS,IAAJ,CAA1B;EACA,MAAMC,OAAO,CAACd,IAAR,EAAN;EACA,OAAO;IACLe,OAAO,EAAE,MAAMD,OAAO,CAACE,MAAR,EADV;IAELC,KAAK,EAAEH;EAFF,CAAP;AAID,CAPM"}
1
+ {"version":3,"file":"index.js","names":["HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","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;AACA;AAEA;AACA;AACA;AACA;AACA;AAA+G;AAE/G,MAAMA,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,GAAG,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;AAAA;AAEM,MAAMM,gBAAgB,GAAG,OAAO,GAAGC,IAAI,KAAK;EACjD,MAAMC,OAAO,GAAGV,UAAU,CAAC,GAAGS,IAAI,CAAC;EACnC,MAAMC,OAAO,CAACd,IAAI,EAAE;EACpB,OAAO;IACLe,OAAO,EAAE,MAAMD,OAAO,CAACE,MAAM,EAAE;IAC/BC,KAAK,EAAEH;EACT,CAAC;AACH,CAAC;AAAA"}
package/dist/local.js CHANGED
@@ -4,43 +4,34 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _df = _interopRequireDefault(require("@sindresorhus/df"));
9
-
10
8
  var _fsExtra = _interopRequireDefault(require("fs-extra"));
11
-
12
- var _identity = _interopRequireDefault(require("lodash/identity.js"));
13
-
14
9
  var _properLockfile = _interopRequireDefault(require("proper-lockfile"));
15
-
16
10
  var _log = require("@xen-orchestra/log");
17
-
18
11
  var _promiseToolbox = require("promise-toolbox");
19
-
20
12
  var _abstract = _interopRequireDefault(require("./abstract"));
21
-
22
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
14
  const {
25
15
  info,
26
16
  warn
27
17
  } = (0, _log.createLogger)('xo:fs:local');
28
18
 
29
- async function addSyncStackTrace(promise) {
19
+ async function addSyncStackTrace(fn, ...args) {
30
20
  const stackContainer = new Error();
31
-
32
21
  try {
33
- return await promise;
22
+ return await fn.apply(this, args);
34
23
  } catch (error) {
35
- error.stack = stackContainer.stack;
24
+ error.syncStack = stackContainer.stack;
36
25
  throw error;
37
26
  }
38
27
  }
39
-
28
+ function dontAddSyncStackTrace(fn, ...args) {
29
+ return fn.apply(this, args);
30
+ }
40
31
  class LocalHandler extends _abstract.default {
41
32
  constructor(remote, opts = {}) {
42
33
  super(remote);
43
- this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : _identity.default;
34
+ this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace;
44
35
  this._retriesOnEagain = {
45
36
  delay: 1e3,
46
37
  retries: 9,
@@ -50,57 +41,45 @@ class LocalHandler extends _abstract.default {
50
41
  }
51
42
  };
52
43
  }
53
-
54
44
  get type() {
55
45
  return 'file';
56
46
  }
57
-
58
47
  _getRealPath() {
59
48
  return this._remote.path;
60
49
  }
61
-
62
50
  _getFilePath(file) {
63
51
  return this._getRealPath() + file;
64
52
  }
65
-
66
53
  async _closeFile(fd) {
67
- return this._addSyncStackTrace(_fsExtra.default.close(fd));
54
+ return this._addSyncStackTrace(_fsExtra.default.close, fd);
68
55
  }
69
-
70
56
  async _copy(oldPath, newPath) {
71
- return this._addSyncStackTrace(_fsExtra.default.copy(this._getFilePath(oldPath), this._getFilePath(newPath)));
57
+ return this._addSyncStackTrace(_fsExtra.default.copy, this._getFilePath(oldPath), this._getFilePath(newPath));
72
58
  }
73
-
74
59
  async _createReadStream(file, options) {
75
60
  if (typeof file === 'string') {
76
61
  const stream = _fsExtra.default.createReadStream(this._getFilePath(file), options);
77
-
78
- await this._addSyncStackTrace((0, _promiseToolbox.fromEvent)(stream, 'open'));
62
+ await this._addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
79
63
  return stream;
80
64
  }
81
-
82
65
  return _fsExtra.default.createReadStream('', {
83
66
  autoClose: false,
84
67
  ...options,
85
68
  fd: file.fd
86
69
  });
87
70
  }
88
-
89
71
  async _createWriteStream(file, options) {
90
72
  if (typeof file === 'string') {
91
73
  const stream = _fsExtra.default.createWriteStream(this._getFilePath(file), options);
92
-
93
- await this._addSyncStackTrace((0, _promiseToolbox.fromEvent)(stream, 'open'));
74
+ await this._addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
94
75
  return stream;
95
76
  }
96
-
97
77
  return _fsExtra.default.createWriteStream('', {
98
78
  autoClose: false,
99
79
  ...options,
100
80
  fd: file.fd
101
81
  });
102
82
  }
103
-
104
83
  async _getInfo() {
105
84
  const info = await _df.default.file(this._getFilePath('/'));
106
85
  Object.keys(info).forEach(key => {
@@ -110,23 +89,19 @@ class LocalHandler extends _abstract.default {
110
89
  });
111
90
  return info;
112
91
  }
113
-
114
92
  async _getSize(file) {
115
- const stats = await this._addSyncStackTrace(_fsExtra.default.stat(this._getFilePath(typeof file === 'string' ? file : file.path)));
93
+ const stats = await this._addSyncStackTrace(_fsExtra.default.stat, this._getFilePath(typeof file === 'string' ? file : file.path));
116
94
  return stats.size;
117
95
  }
118
-
119
96
  async _list(dir) {
120
- return this._addSyncStackTrace(_fsExtra.default.readdir(this._getFilePath(dir)));
97
+ return this._addSyncStackTrace(_fsExtra.default.readdir, this._getFilePath(dir));
121
98
  }
122
-
123
99
  async _lock(path) {
124
100
  const acquire = _properLockfile.default.lock.bind(undefined, this._getFilePath(path), {
125
101
  async onCompromised(error) {
126
102
  warn('lock compromised', {
127
103
  error
128
104
  });
129
-
130
105
  try {
131
106
  release = await acquire();
132
107
  info('compromised lock was reacquired');
@@ -136,13 +111,11 @@ class LocalHandler extends _abstract.default {
136
111
  });
137
112
  }
138
113
  }
139
-
140
114
  });
141
-
142
- let release = await acquire();
115
+ let release = await this._addSyncStackTrace(acquire);
143
116
  return async () => {
144
117
  try {
145
- await release();
118
+ await this._addSyncStackTrace(release);
146
119
  } catch (error) {
147
120
  warn('lock could not be released', {
148
121
  error
@@ -150,76 +123,59 @@ class LocalHandler extends _abstract.default {
150
123
  }
151
124
  };
152
125
  }
153
-
154
126
  _mkdir(dir, {
155
127
  mode
156
128
  }) {
157
- return this._addSyncStackTrace(_fsExtra.default.mkdir(this._getFilePath(dir), {
129
+ return this._addSyncStackTrace(_fsExtra.default.mkdir, this._getFilePath(dir), {
158
130
  mode
159
- }));
131
+ });
160
132
  }
161
-
162
133
  async _openFile(path, flags) {
163
- return this._addSyncStackTrace(_fsExtra.default.open(this._getFilePath(path), flags));
134
+ return this._addSyncStackTrace(_fsExtra.default.open, this._getFilePath(path), flags);
164
135
  }
165
-
166
136
  async _read(file, buffer, position) {
167
137
  const needsClose = typeof file === 'string';
168
- file = needsClose ? await this._addSyncStackTrace(_fsExtra.default.open(this._getFilePath(file), 'r')) : file.fd;
169
-
138
+ file = needsClose ? await this._addSyncStackTrace(_fsExtra.default.open, this._getFilePath(file), 'r') : file.fd;
170
139
  try {
171
- return await this._addSyncStackTrace(_fsExtra.default.read(file, buffer, 0, buffer.length, position === undefined ? null : position));
140
+ return await this._addSyncStackTrace(_fsExtra.default.read, file, buffer, 0, buffer.length, position === undefined ? null : position);
172
141
  } finally {
173
142
  if (needsClose) {
174
- await this._addSyncStackTrace(_fsExtra.default.close(file));
143
+ await this._addSyncStackTrace(_fsExtra.default.close, file);
175
144
  }
176
145
  }
177
146
  }
178
-
179
147
  async _readFile(file, options) {
180
148
  const filePath = this._getFilePath(file);
181
-
182
- return await this._addSyncStackTrace((0, _promiseToolbox.retry)(() => _fsExtra.default.readFile(filePath, options), this._retriesOnEagain));
149
+ return await this._addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.readFile(filePath, options), this._retriesOnEagain);
183
150
  }
184
-
185
151
  async _rename(oldPath, newPath) {
186
- return this._addSyncStackTrace(_fsExtra.default.rename(this._getFilePath(oldPath), this._getFilePath(newPath)));
152
+ return this._addSyncStackTrace(_fsExtra.default.rename, this._getFilePath(oldPath), this._getFilePath(newPath));
187
153
  }
188
-
189
154
  async _rmdir(dir) {
190
- return this._addSyncStackTrace(_fsExtra.default.rmdir(this._getFilePath(dir)));
155
+ return this._addSyncStackTrace(_fsExtra.default.rmdir, this._getFilePath(dir));
191
156
  }
192
-
193
157
  async _sync() {
194
158
  const path = this._getRealPath('/');
195
-
196
- await this._addSyncStackTrace(_fsExtra.default.ensureDir(path));
197
- await this._addSyncStackTrace(_fsExtra.default.access(path, _fsExtra.default.R_OK | _fsExtra.default.W_OK));
159
+ await this._addSyncStackTrace(_fsExtra.default.ensureDir, path);
160
+ await this._addSyncStackTrace(_fsExtra.default.access, path, _fsExtra.default.R_OK | _fsExtra.default.W_OK);
198
161
  }
199
-
200
162
  _truncate(file, len) {
201
- return this._addSyncStackTrace(_fsExtra.default.truncate(this._getFilePath(file), len));
163
+ return this._addSyncStackTrace(_fsExtra.default.truncate, this._getFilePath(file), len);
202
164
  }
203
-
204
165
  async _unlink(file) {
205
166
  const filePath = this._getFilePath(file);
206
-
207
- return await this._addSyncStackTrace((0, _promiseToolbox.retry)(() => _fsExtra.default.unlink(filePath), this._retriesOnEagain));
167
+ return await this._addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.unlink(filePath), this._retriesOnEagain);
208
168
  }
209
-
210
169
  _writeFd(file, buffer, position) {
211
- return this._addSyncStackTrace(_fsExtra.default.write(file.fd, buffer, 0, buffer.length, position));
170
+ return this._addSyncStackTrace(_fsExtra.default.write, file.fd, buffer, 0, buffer.length, position);
212
171
  }
213
-
214
172
  _writeFile(file, data, {
215
173
  flags
216
174
  }) {
217
- return this._addSyncStackTrace(_fsExtra.default.writeFile(this._getFilePath(file), data, {
175
+ return this._addSyncStackTrace(_fsExtra.default.writeFile, this._getFilePath(file), data, {
218
176
  flag: flags
219
- }));
177
+ });
220
178
  }
221
-
222
179
  }
223
-
224
180
  exports.default = LocalHandler;
225
181
  //# sourceMappingURL=local.js.map