@xen-orchestra/fs 1.0.2 → 2.0.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.
package/dist/abstract.js CHANGED
@@ -11,6 +11,8 @@ var _getStream = _interopRequireDefault(require("get-stream"));
11
11
 
12
12
  var _coalesceCalls = require("@vates/coalesce-calls");
13
13
 
14
+ var _log = require("@xen-orchestra/log");
15
+
14
16
  var _promiseToolbox = require("promise-toolbox");
15
17
 
16
18
  var _limitConcurrencyDecorator = require("limit-concurrency-decorator");
@@ -33,6 +35,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
33
35
 
34
36
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
35
37
 
38
+ const {
39
+ warn
40
+ } = (0, _log.createLogger)('@xen-orchestra:fs');
41
+
36
42
  const checksumFile = file => file + '.checksum';
37
43
 
38
44
  const computeRate = (hrtime, size) => {
@@ -137,42 +143,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
137
143
  await this.__closeFile(fd);
138
144
  }
139
145
 
140
- async createOutputStream(file, {
141
- checksum = false,
142
- dirMode,
143
- ...options
144
- } = {}) {
145
- if (typeof file === 'string') {
146
- file = (0, _path.normalize)(file);
147
- }
148
-
149
- const path = typeof file === 'string' ? file : file.path;
150
-
151
- const streamP = _promiseToolbox.timeout.call(this._createOutputStream(file, {
152
- dirMode,
153
- flags: 'wx',
154
- ...options
155
- }), this._timeout);
156
-
157
- if (!checksum) {
158
- return streamP;
159
- }
160
-
161
- const checksumStream = (0, _checksum.createChecksumStream)();
162
-
163
- const forwardError = error => {
164
- checksumStream.emit('error', error);
165
- };
166
-
167
- const stream = await streamP;
168
- stream.on('error', forwardError);
169
- checksumStream.pipe(stream);
170
- checksumStream.checksumWritten = checksumStream.checksum.then(value => this._outputFile(checksumFile(path), value, {
171
- flags: 'wx'
172
- })).catch(forwardError);
173
- return checksumStream;
174
- }
175
-
176
146
  createReadStream(file, {
177
147
  checksum = false,
178
148
  ignoreMissingChecksum = false,
@@ -411,11 +381,14 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
411
381
  readRate: computeRate(readDuration, SIZE)
412
382
  };
413
383
  } catch (error) {
384
+ warn(`error while testing the remote at step ${step}`, {
385
+ error
386
+ });
414
387
  return {
415
388
  success: false,
416
389
  step,
417
390
  file: testFileName,
418
- error: error.message || String(error)
391
+ error
419
392
  };
420
393
  } finally {
421
394
  _promiseToolbox.ignoreErrors.call(this._unlink(testFileName));
@@ -478,6 +451,10 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
478
451
  };
479
452
  }
480
453
 
454
+ useVhdDirectory() {
455
+ return this._remote.useVhdDirectory ?? false;
456
+ }
457
+
481
458
  async _closeFile(fd) {
482
459
  throw new Error('Not implemented');
483
460
  }
@@ -584,9 +561,10 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
584
561
  validator
585
562
  }) {
586
563
  const tmpPath = `${(0, _path.dirname)(path)}/.${(0, _path.basename)(path)}`;
587
- const output = await this.createOutputStream(tmpPath, {
588
- dirMode
589
- });
564
+ const output = await _promiseToolbox.timeout.call(this._createOutputStream(tmpPath, {
565
+ dirMode,
566
+ flags: 'wx'
567
+ }), this._timeout);
590
568
 
591
569
  try {
592
570
  await (0, _promiseToolbox.fromCallback)(_stream.pipeline, input, output);
@@ -1 +1 @@
1
- {"version":3,"file":"abstract.js","names":["checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","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","remote","options","url","_remote","parse","Error","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","createOutputStream","checksum","dirMode","streamP","call","_createOutputStream","flags","checksumStream","createChecksumStream","forwardError","emit","stream","on","pipe","checksumWritten","then","value","_outputFile","catch","createReadStream","ignoreMissingChecksum","_createReadStream","promise","fromEvent","undefined","end","start","Promise","all","ignoreErrors","_getSize","_readFile","validChecksumOfReadStream","String","trim","outputStream","input","validator","pipeline","_outputStream","forget","_getInfo","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mode","__mkdir","mktree","_mktree","__openFile","data","buffer","position","_read","p","_rename","_copy","_rmdir","rmtree","_rmtree","sync","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","message","_unlink","len","_truncate","_write","_writeFile","_closeFile","_mkdir","_openFile","_createWriteStream","dirname","resolve","tmpPath","basename","output","getStream","files","asyncMapSettled","isPath","_writeFd","createPrefixWrapperMethods","pPw","pRha","defineProperty","getOwnPropertyDescriptor","hasOwnProperty","Object","getOwnPropertyNames","name","descriptor","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import asyncMapSettled from '@xen-orchestra/async-map/legacy'\nimport getStream from 'get-stream'\nimport { coalesceCalls } from '@vates/coalesce-calls'\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 } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './_path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\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 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 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 // TODO: remove method\n async createOutputStream(file, { checksum = false, dirMode, ...options } = {}) {\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n const path = typeof file === 'string' ? file : file.path\n const streamP = timeout.call(\n this._createOutputStream(file, {\n dirMode,\n flags: 'wx',\n ...options,\n }),\n this._timeout\n )\n\n if (!checksum) {\n return streamP\n }\n\n const checksumStream = createChecksumStream()\n const forwardError = error => {\n checksumStream.emit('error', error)\n }\n\n const stream = await streamP\n stream.on('error', forwardError)\n checksumStream.pipe(stream)\n\n checksumStream.checksumWritten = checksumStream.checksum\n .then(value => this._outputFile(checksumFile(path), value, { flags: 'wx' }))\n .catch(forwardError)\n\n return checksumStream\n }\n\n createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n const path = typeof file === 'string' ? file : file.path\n const streamP = timeout\n .call(this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }), this._timeout)\n .then(stream => {\n // detect early errors\n let promise = fromEvent(stream, 'readable')\n\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 promise = Promise.all([\n promise,\n ignoreErrors.call(\n this._getSize(file).then(size => {\n stream.length = size\n })\n ),\n ])\n }\n\n return promise.then(() => stream)\n })\n\n if (!checksum) {\n return streamP\n }\n\n // avoid a unhandled rejection warning\n ignoreErrors.call(streamP)\n\n return this._readFile(checksumFile(path), { flags: 'r' }).then(\n checksum =>\n streamP.then(stream => {\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n\n return stream\n }),\n error => {\n if (ignoreMissingChecksum && error && error.code === 'ENOENT') {\n return streamP\n }\n throw error\n }\n )\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 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 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 async getSize(file) {\n return timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\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 await this._outputFile(normalizePath(file), data, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async readFile(file, { flags = 'r' } = {}) {\n return this._readFile(normalizePath(file), { flags })\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 }\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 return {\n success: false,\n step,\n file: testFileName,\n error: error.message || String(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 await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async writeFile(file, data, { flags = 'wx' } = {}) {\n await this._writeFile(normalizePath(file), data, { 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 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 this.createOutputStream(tmpPath, {\n dirMode,\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\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":["warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","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","remote","options","url","_remote","parse","Error","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","streamP","call","_createReadStream","then","stream","promise","fromEvent","undefined","end","start","Promise","all","ignoreErrors","_getSize","_readFile","flags","validChecksumOfReadStream","String","trim","outputStream","input","dirMode","validator","checksumStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mode","__mkdir","mktree","_mktree","__openFile","data","buffer","position","_read","p","_rename","_copy","_rmdir","catch","rmtree","_rmtree","sync","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","_unlink","len","_truncate","_write","_writeFile","_closeFile","_mkdir","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","dirname","resolve","tmpPath","basename","output","getStream","files","asyncMapSettled","isPath","_writeFd","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 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 } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './_path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\n\nconst { 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 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 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 createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n const path = typeof file === 'string' ? file : file.path\n const streamP = timeout\n .call(this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }), this._timeout)\n .then(stream => {\n // detect early errors\n let promise = fromEvent(stream, 'readable')\n\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 promise = Promise.all([\n promise,\n ignoreErrors.call(\n this._getSize(file).then(size => {\n stream.length = size\n })\n ),\n ])\n }\n\n return promise.then(() => stream)\n })\n\n if (!checksum) {\n return streamP\n }\n\n // avoid a unhandled rejection warning\n ignoreErrors.call(streamP)\n\n return this._readFile(checksumFile(path), { flags: 'r' }).then(\n checksum =>\n streamP.then(stream => {\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n\n return stream\n }),\n error => {\n if (ignoreMissingChecksum && error && error.code === 'ENOENT') {\n return streamP\n }\n throw error\n }\n )\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 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 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 async getSize(file) {\n return timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\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 await this._outputFile(normalizePath(file), data, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async readFile(file, { flags = 'r' } = {}) {\n return this._readFile(normalizePath(file), { flags })\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 }\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 await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async writeFile(file, data, { flags = 'wx' } = {}) {\n await this._writeFile(normalizePath(file), data, { 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\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":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;AAEA,MAAM;EAAEA;AAAF,IAAW,IAAAC,iBAAA,EAAa,mBAAb,CAAjB;;AAEA,MAAMC,YAAY,GAAGC,IAAI,IAAIA,IAAI,GAAG,WAApC;;AACA,MAAMC,WAAW,GAAG,CAACC,MAAD,EAASC,IAAT,KAAkB;EACpC,MAAMC,OAAO,GAAGF,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAAN,GAAY,GAAxC;EACA,OAAOC,IAAI,GAAGC,OAAd;AACD,CAHD;;AAKA,MAAMC,eAAe,GAAG,GAAxB;AACA,MAAMC,+BAA+B,GAAG,EAAxC;;AAEA,MAAMC,YAAY,GAAGC,KAAK,IAAI;EAC5B,IAAIA,KAAK,IAAI,IAAT,IAAiBA,KAAK,CAACC,IAAN,KAAe,QAApC,EAA8C;IAC5C,MAAMD,KAAN;EACD;AACF,CAJD;;AAMA,MAAME,IAAI,GAAGC,QAAQ,CAACC,SAAtB;;AAEA,MAAMC,aAAN,CAAoB;EAClBC,WAAW,CAACC,OAAD,EAAUC,MAAV,EAAkB;IAC3B,KAAKC,OAAL,GAAeD,MAAf;IACA,KAAKE,QAAL,GAAgBH,OAAhB;EACD;;EAEO,IAAJI,IAAI,GAAG;IACT,OAAO,KAAKD,QAAL,CAAcC,IAArB;EACD;;EAGS,MAAJC,IAAI,CAACC,GAAD,EAAMC,IAAN,EAAY;IACpB,MAAMC,OAAO,GAAG,MAAM,KAAKL,QAAL,CAAcE,IAAd,CAAmB,KAAKI,QAAL,CAAcH,GAAd,CAAnB,EAAuCC,IAAvC,CAAtB;;IACA,IAAIA,IAAI,IAAI,IAAR,IAAgBA,IAAI,CAACG,UAAzB,EAAqC;MACnC,MAAMC,CAAC,GAAG,KAAKT,OAAL,CAAaU,MAAvB;MACAJ,OAAO,CAACK,OAAR,CAAgB,CAACC,KAAD,EAAQC,CAAR,EAAWP,OAAX,KAAuB;QACrCA,OAAO,CAACO,CAAD,CAAP,GAAaD,KAAK,CAACE,KAAN,CAAYL,CAAZ,CAAb;MACD,CAFD;IAGD;;IACD,OAAOH,OAAP;EACD;;EAEDS,MAAM,CAACC,OAAD,EAAUC,OAAV,EAAmB;IACvB,OAAO,KAAKhB,QAAL,CAAcc,MAAd,CAAqB,KAAKR,QAAL,CAAcS,OAAd,CAArB,EAA6C,KAAKT,QAAL,CAAcU,OAAd,CAA7C,CAAP;EACD;;EAEDV,QAAQ,CAACW,IAAD,EAAO;IACb,OAAO,KAAKlB,OAAL,GAAe,IAAAmB,eAAA,EAAcD,IAAd,CAAtB;EACD;;AA5BiB;;IA+BCE,qB,WAqIlB,IAAAC,mCAAA,G,UAqGA,IAAAA,mCAAA,G,YA1OY,MAAMD,qBAAN,CAA4B;EACzCvB,WAAW,CAACyB,MAAD,EAASC,OAAO,GAAG,EAAnB,EAAuB;IAChC,IAAID,MAAM,CAACE,GAAP,KAAe,SAAnB,EAA8B;MAC5B,KAAKC,OAAL,GAAeH,MAAf;IACD,CAFD,MAEO;MACL,KAAKG,OAAL,GAAe,EAAE,GAAGH,MAAL;QAAa,GAAG,IAAAI,qBAAA,EAAMJ,MAAM,CAACE,GAAb;MAAhB,CAAf;;MACA,IAAI,KAAKC,OAAL,CAAavB,IAAb,KAAsB,KAAKA,IAA/B,EAAqC;QACnC,MAAM,IAAIyB,KAAJ,CAAU,uBAAV,CAAN;MACD;IACF;;IACD;IAAC,CAAC;MAAEC,aAAa,EAAE,KAAKC,cAAtB;MAAsCC,OAAO,EAAE,KAAKC,QAAL,GAAgB3C;IAA/D,IAAmFmC,OAApF;IAED,MAAMS,WAAW,GAAG,IAAAC,2CAAA,EAAiBV,OAAO,CAACW,qBAAR,IAAiC7C,+BAAlD,CAApB;IACA,KAAK8C,SAAL,GAAiBH,WAAW,CAAC,KAAKG,SAAN,CAA5B;IACA,KAAKC,IAAL,GAAYJ,WAAW,CAAC,KAAKI,IAAN,CAAvB;IACA,KAAKC,OAAL,GAAeL,WAAW,CAAC,KAAKK,OAAN,CAA1B;IACA,KAAKC,OAAL,GAAeN,WAAW,CAAC,KAAKM,OAAN,CAA1B;IACA,KAAKnC,IAAL,GAAY6B,WAAW,CAAC,KAAK7B,IAAN,CAAvB;IACA,KAAKoC,KAAL,GAAaP,WAAW,CAAC,KAAKO,KAAN,CAAxB;IACA,KAAKC,QAAL,GAAgBR,WAAW,CAAC,KAAKQ,QAAN,CAA3B;IACA,KAAKC,UAAL,GAAkBT,WAAW,CAAC,KAAKS,UAAN,CAA7B;IACA,KAAKC,IAAL,GAAYV,WAAW,CAAC,KAAKU,IAAN,CAAvB;IACA,KAAKC,QAAL,GAAgBX,WAAW,CAAC,KAAKW,QAAN,CAA3B;IACA,KAAK5B,MAAL,GAAciB,WAAW,CAAC,KAAKjB,MAAN,CAAzB;IACA,KAAK6B,KAAL,GAAaZ,WAAW,CAAC,KAAKY,KAAN,CAAxB;IACA,KAAKC,QAAL,GAAgBb,WAAW,CAAC,KAAKa,QAAN,CAA3B;IACA,KAAKC,MAAL,GAAcd,WAAW,CAAC,KAAKc,MAAN,CAAzB;IACA,KAAKC,KAAL,GAAaf,WAAW,CAAC,KAAKe,KAAN,CAAxB;IACA,KAAKC,SAAL,GAAiBhB,WAAW,CAAC,KAAKgB,SAAN,CAA5B;IAEA,KAAKC,OAAL,GAAe,IAAAC,4BAAA,EAAc,KAAKD,OAAnB,CAAf;IACA,KAAKE,KAAL,GAAa,IAAAD,4BAAA,EAAc,KAAKC,KAAnB,CAAb;EACD;;EAIO,IAAJjD,IAAI,GAAG;IACT,MAAM,IAAIyB,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEDyB,SAAS,CAACrD,MAAD,EAAS;IAChBA,MAAM,GAAG,IAAAoB,eAAA,EAAcpB,MAAd,CAAT;IACA,OAAOA,MAAM,KAAK,GAAX,GAAiB,IAAjB,GAAwB,IAAIH,aAAJ,CAAkB,IAAlB,EAAwBG,MAAxB,CAA/B;EACD;;EAEc,MAAToC,SAAS,CAACkB,EAAD,EAAK;IAClB,MAAM,KAAKC,WAAL,CAAiBD,EAAjB,CAAN;EACD;;EAEDE,gBAAgB,CAACxE,IAAD,EAAO;IAAEyE,QAAQ,GAAG,KAAb;IAAoBC,qBAAqB,GAAG,KAA5C;IAAmD,GAAGlC;EAAtD,IAAkE,EAAzE,EAA6E;IAC3F,IAAI,OAAOxC,IAAP,KAAgB,QAApB,EAA8B;MAC5BA,IAAI,GAAG,IAAAoC,eAAA,EAAcpC,IAAd,CAAP;IACD;;IACD,MAAMmC,IAAI,GAAG,OAAOnC,IAAP,KAAgB,QAAhB,GAA2BA,IAA3B,GAAkCA,IAAI,CAACmC,IAApD;;IACA,MAAMwC,OAAO,GAAG5B,uBAAA,CACb6B,IADa,CACR,KAAKC,iBAAL,CAAuB7E,IAAvB,EAA6B,EAAE,GAAGwC,OAAL;MAAcK,aAAa,EAAE,KAAKC;IAAlC,CAA7B,CADQ,EAC0E,KAAKE,QAD/E,EAEb8B,IAFa,CAERC,MAAM,IAAI;MAEd,IAAIC,OAAO,GAAG,IAAAC,yBAAA,EAAUF,MAAV,EAAkB,UAAlB,CAAd;;MAGA,IAAIA,MAAM,CAACpD,MAAP,KAAkBuD,SAAlB,IAA+B1C,OAAO,CAAC2C,GAAR,KAAgBD,SAA/C,IAA4D1C,OAAO,CAAC4C,KAAR,KAAkBF,SAAlF,EAA6F;QAC3FF,OAAO,GAAGK,OAAO,CAACC,GAAR,CAAY,CACpBN,OADoB,EAEpBO,4BAAA,CAAaX,IAAb,CACE,KAAKY,QAAL,CAAcxF,IAAd,EAAoB8E,IAApB,CAAyB3E,IAAI,IAAI;UAC/B4E,MAAM,CAACpD,MAAP,GAAgBxB,IAAhB;QACD,CAFD,CADF,CAFoB,CAAZ,CAAV;MAQD;;MAED,OAAO6E,OAAO,CAACF,IAAR,CAAa,MAAMC,MAAnB,CAAP;IACD,CAnBa,CAAhB;;IAqBA,IAAI,CAACN,QAAL,EAAe;MACb,OAAOE,OAAP;IACD;;IAGDY,4BAAA,CAAaX,IAAb,CAAkBD,OAAlB;;IAEA,OAAO,KAAKc,SAAL,CAAe1F,YAAY,CAACoC,IAAD,CAA3B,EAAmC;MAAEuD,KAAK,EAAE;IAAT,CAAnC,EAAmDZ,IAAnD,CACLL,QAAQ,IACNE,OAAO,CAACG,IAAR,CAAaC,MAAM,IAAI;MACrB,MAAM;QAAEpD;MAAF,IAAaoD,MAAnB;MACAA,MAAM,GAAG,IAAAY,mCAAA,EAA0BZ,MAA1B,EAAkCa,MAAM,CAACnB,QAAD,CAAN,CAAiBoB,IAAjB,EAAlC,CAAT;MACAd,MAAM,CAACpD,MAAP,GAAgBA,MAAhB;MAEA,OAAOoD,MAAP;IACD,CAND,CAFG,EASLvE,KAAK,IAAI;MACP,IAAIkE,qBAAqB,IAAIlE,KAAzB,IAAkCA,KAAK,CAACC,IAAN,KAAe,QAArD,EAA+D;QAC7D,OAAOkE,OAAP;MACD;;MACD,MAAMnE,KAAN;IACD,CAdI,CAAP;EAgBD;;EAYiB,MAAZsF,YAAY,CAAC3D,IAAD,EAAO4D,KAAP,EAAc;IAAEtB,QAAQ,GAAG,IAAb;IAAmBuB,OAAnB;IAA4BC;EAA5B,IAA0C,EAAxD,EAA4D;IAC5E9D,IAAI,GAAG,IAAAC,eAAA,EAAcD,IAAd,CAAP;IACA,IAAI+D,cAAJ;;IACA,IAAIzB,QAAJ,EAAc;MACZyB,cAAc,GAAG,IAAAC,8BAAA,GAAjB;MACA,IAAAC,gBAAA,EAASL,KAAT,EAAgBG,cAAhB,EAAgCxF,IAAhC;MACAqF,KAAK,GAAGG,cAAR;IACD;;IACD,MAAM,KAAKG,aAAL,CAAmBlE,IAAnB,EAAyB4D,KAAzB,EAAgC;MACpCC,OADoC;MAEpCC;IAFoC,CAAhC,CAAN;;IAIA,IAAIxB,QAAJ,EAAc;MACZ,MAAM,KAAK6B,WAAL,CAAiBvG,YAAY,CAACoC,IAAD,CAA7B,EAAqC,MAAM+D,cAAc,CAACzB,QAA1D,EAAoE;QAAEuB,OAAF;QAAWN,KAAK,EAAE;MAAlB,CAApE,CAAN;IACD;EACF;;EASW,MAANa,MAAM,GAAG;IACb,MAAM,KAAKrC,OAAL,EAAN;EACD;;EAEY,MAAPZ,OAAO,GAAG;IACd,OAAOP,uBAAA,CAAQ6B,IAAR,CAAa,KAAK4B,QAAL,EAAb,EAA8B,KAAKxD,QAAnC,CAAP;EACD;;EAEY,MAAPO,OAAO,CAACvD,IAAD,EAAO;IAClB,OAAO+C,uBAAA,CAAQ6B,IAAR,CAAa,KAAKY,QAAL,CAAc,OAAOxF,IAAP,KAAgB,QAAhB,GAA2B,IAAAoC,eAAA,EAAcpC,IAAd,CAA3B,GAAiDA,IAA/D,CAAb,EAAmF,KAAKgD,QAAxF,CAAP;EACD;;EAES,MAAJ5B,IAAI,CAACC,GAAD,EAAM;IAAEoF,MAAF;IAAUC,aAAa,GAAG,KAA1B;IAAiCjF,UAAU,GAAG;EAA9C,IAAwD,EAA9D,EAAkE;IAC1E,IAAI;MACF,MAAMkF,UAAU,GAAG,IAAAvE,eAAA,EAAcf,GAAd,CAAnB;MACAA,GAAG,GAAG,IAAAe,eAAA,EAAcf,GAAd,CAAN;MAEA,IAAIE,OAAO,GAAG,MAAMwB,uBAAA,CAAQ6B,IAAR,CAAa,KAAKgC,KAAL,CAAWvF,GAAX,CAAb,EAA8B,KAAK2B,QAAnC,CAApB;;MACA,IAAIyD,MAAM,KAAKvB,SAAf,EAA0B;QACxB3D,OAAO,GAAGA,OAAO,CAACkF,MAAR,CAAeA,MAAf,CAAV;MACD;;MAED,IAAIhF,UAAJ,EAAgB;QACdF,OAAO,CAACK,OAAR,CAAgB,CAACC,KAAD,EAAQC,CAAR,KAAc;UAC5BP,OAAO,CAACO,CAAD,CAAP,GAAa6E,UAAU,GAAG,GAAb,GAAmB9E,KAAhC;QACD,CAFD;MAGD;;MAED,OAAON,OAAP;IACD,CAhBD,CAgBE,OAAOf,KAAP,EAAc;MACd,IAAIkG,aAAa,IAAI,CAAAlG,KAAK,SAAL,IAAAA,KAAK,WAAL,YAAAA,KAAK,CAAEC,IAAP,MAAgB,QAArC,EAA+C;QAC7C,OAAO,EAAP;MACD;;MACD,MAAMD,KAAN;IACD;EACF;;EAES,MAAJqG,IAAI,CAAC1E,IAAD,EAAO;IACfA,IAAI,GAAG,IAAAC,eAAA,EAAcD,IAAd,CAAP;IACA,OAAO;MAAE2E,OAAO,EAAE,MAAM,KAAKC,KAAL,CAAW5E,IAAX;IAAjB,CAAP;EACD;;EAEU,MAALqB,KAAK,CAACnC,GAAD,EAAM;IAAE2F;EAAF,IAAW,EAAjB,EAAqB;IAC9B,MAAM,KAAKC,OAAL,CAAa,IAAA7E,eAAA,EAAcf,GAAd,CAAb,EAAiC;MAAE2F;IAAF,CAAjC,CAAN;EACD;;EAEW,MAANE,MAAM,CAAC7F,GAAD,EAAM;IAAE2F;EAAF,IAAW,EAAjB,EAAqB;IAC/B,MAAM,KAAKG,OAAL,CAAa,IAAA/E,eAAA,EAAcf,GAAd,CAAb,EAAiC;MAAE2F;IAAF,CAAjC,CAAN;EACD;;EAEDvD,QAAQ,CAACtB,IAAD,EAAOuD,KAAP,EAAc;IACpB,OAAO,KAAK0B,UAAL,CAAgBjF,IAAhB,EAAsBuD,KAAtB,CAAP;EACD;;EAEe,MAAVhC,UAAU,CAAC1D,IAAD,EAAOqH,IAAP,EAAa;IAAErB,OAAF;IAAWN,KAAK,GAAG;EAAnB,IAA4B,EAAzC,EAA6C;IAC3D,MAAM,KAAKY,WAAL,CAAiB,IAAAlE,eAAA,EAAcpC,IAAd,CAAjB,EAAsCqH,IAAtC,EAA4C;MAAErB,OAAF;MAAWN;IAAX,CAA5C,CAAN;EACD;;EAES,MAAJ/B,IAAI,CAAC3D,IAAD,EAAOsH,MAAP,EAAeC,QAAf,EAAyB;IACjC,OAAO,KAAKC,KAAL,CAAW,OAAOxH,IAAP,KAAgB,QAAhB,GAA2B,IAAAoC,eAAA,EAAcpC,IAAd,CAA3B,GAAiDA,IAA5D,EAAkEsH,MAAlE,EAA0EC,QAA1E,CAAP;EACD;;EAEa,MAAR3D,QAAQ,CAAC5D,IAAD,EAAO;IAAE0F,KAAK,GAAG;EAAV,IAAkB,EAAzB,EAA6B;IACzC,OAAO,KAAKD,SAAL,CAAe,IAAArD,eAAA,EAAcpC,IAAd,CAAf,EAAoC;MAAE0F;IAAF,CAApC,CAAP;EACD;;EAEW,MAAN1D,MAAM,CAACC,OAAD,EAAUC,OAAV,EAAmB;IAAEuC,QAAQ,GAAG;EAAb,IAAuB,EAA1C,EAA8C;IACxDxC,OAAO,GAAG,IAAAG,eAAA,EAAcH,OAAd,CAAV;IACAC,OAAO,GAAG,IAAAE,eAAA,EAAcF,OAAd,CAAV;;IAEA,IAAIuF,CAAC,GAAG1E,uBAAA,CAAQ6B,IAAR,CAAa,KAAK8C,OAAL,CAAazF,OAAb,EAAsBC,OAAtB,CAAb,EAA6C,KAAKc,QAAlD,CAAR;;IACA,IAAIyB,QAAJ,EAAc;MACZgD,CAAC,GAAGpC,OAAO,CAACC,GAAR,CAAY,CAACmC,CAAD,EAAI,KAAKC,OAAL,CAAa3H,YAAY,CAACkC,OAAD,CAAzB,EAAoClC,YAAY,CAACmC,OAAD,CAAhD,CAAJ,CAAZ,CAAJ;IACD;;IACD,OAAOuF,CAAP;EACD;;EAES,MAAJpE,IAAI,CAACpB,OAAD,EAAUC,OAAV,EAAmB;IAAEuC,QAAQ,GAAG;EAAb,IAAuB,EAA1C,EAA8C;IACtDxC,OAAO,GAAG,IAAAG,eAAA,EAAcH,OAAd,CAAV;IACAC,OAAO,GAAG,IAAAE,eAAA,EAAcF,OAAd,CAAV;;IAEA,IAAIuF,CAAC,GAAG1E,uBAAA,CAAQ6B,IAAR,CAAa,KAAK+C,KAAL,CAAW1F,OAAX,EAAoBC,OAApB,CAAb,EAA2C,KAAKc,QAAhD,CAAR;;IACA,IAAIyB,QAAJ,EAAc;MACZgD,CAAC,GAAGpC,OAAO,CAACC,GAAR,CAAY,CAACmC,CAAD,EAAI,KAAKE,KAAL,CAAW5H,YAAY,CAACkC,OAAD,CAAvB,EAAkClC,YAAY,CAACmC,OAAD,CAA9C,CAAJ,CAAZ,CAAJ;IACD;;IACD,OAAOuF,CAAP;EACD;;EAEU,MAAL5D,KAAK,CAACxC,GAAD,EAAM;IACf,MAAM0B,uBAAA,CAAQ6B,IAAR,CAAa,KAAKgD,MAAL,CAAY,IAAAxF,eAAA,EAAcf,GAAd,CAAZ,EAAgCwG,KAAhC,CAAsCtH,YAAtC,CAAb,EAAkE,KAAKyC,QAAvE,CAAN;EACD;;EAEW,MAAN8E,MAAM,CAACzG,GAAD,EAAM;IAChB,MAAM,KAAK0G,OAAL,CAAa,IAAA3F,eAAA,EAAcf,GAAd,CAAb,CAAN;EACD;;EAOS,MAAJ2G,IAAI,GAAG;IACX,MAAM,KAAK5D,KAAL,EAAN;EACD;;EAES,MAAJ6D,IAAI,GAAG;IACX,MAAMC,IAAI,GAAG,OAAO,IAAP,GAAc,EAA3B;IACA,MAAMC,YAAY,GAAG,IAAA/F,eAAA,EAAe,GAAEgG,IAAI,CAACC,GAAL,EAAW,OAA5B,CAArB;IACA,MAAMhB,IAAI,GAAG,MAAM,IAAAiB,4BAAA,EAAaC,mBAAb,EAA0BL,IAA1B,CAAnB;IACA,IAAIM,IAAI,GAAG,OAAX;;IACA,IAAI;MACF,MAAMC,UAAU,GAAGC,OAAO,CAACxI,MAAR,EAAnB;MACA,MAAM,KAAKoG,WAAL,CAAiB6B,YAAjB,EAA+Bd,IAA/B,EAAqC;QAAE3B,KAAK,EAAE;MAAT,CAArC,CAAN;MACA,MAAMiD,aAAa,GAAGD,OAAO,CAACxI,MAAR,CAAeuI,UAAf,CAAtB;MAEAD,IAAI,GAAG,MAAP;MACA,MAAMI,SAAS,GAAGF,OAAO,CAACxI,MAAR,EAAlB;MACA,MAAMyD,IAAI,GAAG,MAAM,KAAK8B,SAAL,CAAe0C,YAAf,EAA6B;QAAEzC,KAAK,EAAE;MAAT,CAA7B,CAAnB;MACA,MAAMmD,YAAY,GAAGH,OAAO,CAACxI,MAAR,CAAe0I,SAAf,CAArB;;MAEA,IAAI,CAACvB,IAAI,CAACyB,MAAL,CAAYnF,IAAZ,CAAL,EAAwB;QACtB,MAAM,IAAIf,KAAJ,CAAU,gCAAV,CAAN;MACD;;MACD,OAAO;QACLmG,OAAO,EAAE,IADJ;QAELC,SAAS,EAAE/I,WAAW,CAAC0I,aAAD,EAAgBT,IAAhB,CAFjB;QAGLe,QAAQ,EAAEhJ,WAAW,CAAC4I,YAAD,EAAeX,IAAf;MAHhB,CAAP;IAKD,CAlBD,CAkBE,OAAO1H,KAAP,EAAc;MACdX,IAAI,CAAE,0CAAyC2I,IAAK,EAAhD,EAAmD;QAAEhI;MAAF,CAAnD,CAAJ;MACA,OAAO;QACLuI,OAAO,EAAE,KADJ;QAELP,IAFK;QAGLxI,IAAI,EAAEmI,YAHD;QAIL3H;MAJK,CAAP;IAMD,CA1BD,SA0BU;MACR+E,4BAAA,CAAaX,IAAb,CAAkB,KAAKsE,OAAL,CAAaf,YAAb,CAAlB;IACD;EACF;;EAEa,MAARrE,QAAQ,CAAC9D,IAAD,EAAOmJ,GAAP,EAAY;IACxB,MAAM,KAAKC,SAAL,CAAepJ,IAAf,EAAqBmJ,GAArB,CAAN;EACD;;EAEW,MAANpF,MAAM,CAAC/D,IAAD,EAAO;IAAEyE,QAAQ,GAAG;EAAb,IAAsB,EAA7B,EAAiC;IAC3CzE,IAAI,GAAG,IAAAoC,eAAA,EAAcpC,IAAd,CAAP;;IAEA,IAAIyE,QAAJ,EAAc;MACZc,4BAAA,CAAaX,IAAb,CAAkB,KAAKsE,OAAL,CAAanJ,YAAY,CAACC,IAAD,CAAzB,CAAlB;IACD;;IAED,MAAM,KAAKkJ,OAAL,CAAalJ,IAAb,EAAmB6H,KAAnB,CAAyBtH,YAAzB,CAAN;EACD;;EAEU,MAALyD,KAAK,CAAChE,IAAD,EAAOsH,MAAP,EAAeC,QAAf,EAAyB;IAClC,MAAM,KAAK8B,MAAL,CAAY,OAAOrJ,IAAP,KAAgB,QAAhB,GAA2B,IAAAoC,eAAA,EAAcpC,IAAd,CAA3B,GAAiDA,IAA7D,EAAmEsH,MAAnE,EAA2EC,QAA3E,CAAN;EACD;;EAEc,MAATtD,SAAS,CAACjE,IAAD,EAAOqH,IAAP,EAAa;IAAE3B,KAAK,GAAG;EAAV,IAAmB,EAAhC,EAAoC;IACjD,MAAM,KAAK4D,UAAL,CAAgB,IAAAlH,eAAA,EAAcpC,IAAd,CAAhB,EAAqCqH,IAArC,EAA2C;MAAE3B;IAAF,CAA3C,CAAN;EACD;;EAIgB,MAAXnB,WAAW,CAACD,EAAD,EAAK;IACpB,MAAMvB,uBAAA,CAAQ6B,IAAR,CAAa,KAAK2E,UAAL,CAAgBjF,EAAE,CAACA,EAAnB,CAAb,EAAqC,KAAKtB,QAA1C,CAAN;EACD;;EAEY,MAAPiE,OAAO,CAAC5F,GAAD,EAAM;IAAE2F;EAAF,IAAW,EAAjB,EAAqB;IAChC,IAAI;MACF,MAAM,KAAKwC,MAAL,CAAYnI,GAAZ,EAAiB;QAAE2F;MAAF,CAAjB,CAAN;IACD,CAFD,CAEE,OAAOxG,KAAP,EAAc;MACd,IAAIA,KAAK,IAAI,IAAT,IAAiBA,KAAK,CAACC,IAAN,KAAe,QAApC,EAA8C;QAC5C,MAAMD,KAAN;MACD;;MAGD,MAAM,KAAKoG,KAAL,CAAWvF,GAAX,CAAN;IACD;EACF;;EAEe,MAAV+F,UAAU,CAACjF,IAAD,EAAOuD,KAAP,EAAc;IAC5BvD,IAAI,GAAG,IAAAC,eAAA,EAAcD,IAAd,CAAP;IAEA,OAAO;MACLmC,EAAE,EAAE,MAAMvB,uBAAA,CAAQ6B,IAAR,CAAa,KAAK6E,SAAL,CAAetH,IAAf,EAAqBuD,KAArB,CAAb,EAA0C,KAAK1C,QAA/C,CADL;MAELb;IAFK,CAAP;EAID;;EAIDuH,eAAe,GAAG;IAChB,OAAO,KAAKhH,OAAL,CAAagH,eAAb,IAAgC,KAAvC;EACD;;EAEe,MAAVH,UAAU,CAACjF,EAAD,EAAK;IACnB,MAAM,IAAI1B,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEwB,MAAnB+G,mBAAmB,CAAC3J,IAAD,EAAO;IAAEgG,OAAF;IAAW,GAAGxD;EAAd,IAA0B,EAAjC,EAAqC;IAC5D,IAAI;MACF,OAAO,MAAM,KAAKoH,kBAAL,CAAwB5J,IAAxB,EAA8B,EAAE,GAAGwC,OAAL;QAAcK,aAAa,EAAE,KAAKC;MAAlC,CAA9B,CAAb;IACD,CAFD,CAEE,OAAOtC,KAAP,EAAc;MACd,IAAI,OAAOR,IAAP,KAAgB,QAAhB,IAA4BQ,KAAK,CAACC,IAAN,KAAe,QAA/C,EAAyD;QACvD,MAAMD,KAAN;MACD;IACF;;IAED,MAAM,KAAK2G,OAAL,CAAa,IAAA0C,aAAA,EAAQ7J,IAAR,CAAb,EAA4B;MAAEgH,IAAI,EAAEhB;IAAR,CAA5B,CAAN;IACA,OAAO,KAAK2D,mBAAL,CAAyB3J,IAAzB,EAA+BwC,OAA/B,CAAP;EACD;;EAEsB,MAAjBqC,iBAAiB,CAAC7E,IAAD,EAAOwC,OAAP,EAAgB;IACrC,MAAM,IAAII,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAIuB,MAAlBgH,kBAAkB,CAAC5J,IAAD,EAAOwC,OAAP,EAAgB;IACtC,MAAM,IAAII,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAGY,MAAPsB,OAAO,GAAG,CAAE;;EAEJ,MAARsC,QAAQ,GAAG;IACf,OAAO,EAAP;EACD;;EAEU,MAALO,KAAK,CAAC5E,IAAD,EAAO;IAChB,OAAO,MAAMkD,OAAO,CAACyE,OAAR,EAAb;EACD;;EAEa,MAARtE,QAAQ,CAACxF,IAAD,EAAO;IACnB,MAAM,IAAI4C,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEU,MAALgE,KAAK,CAACvF,GAAD,EAAM;IACf,MAAM,IAAIuB,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEW,MAAN4G,MAAM,CAACnI,GAAD,EAAM;IAChB,MAAM,IAAIuB,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEY,MAAPuE,OAAO,CAAC9F,GAAD,EAAM;IAAE2F;EAAF,IAAW,EAAjB,EAAqB;IAChC,IAAI;MACF,OAAO,MAAM,KAAKC,OAAL,CAAa5F,GAAb,EAAkB;QAAE2F;MAAF,CAAlB,CAAb;IACD,CAFD,CAEE,OAAOxG,KAAP,EAAc;MACd,IAAIA,KAAK,CAACC,IAAN,KAAe,QAAnB,EAA6B;QAC3B,MAAMD,KAAN;MACD;IACF;;IAED,MAAM,KAAK2G,OAAL,CAAa,IAAA0C,aAAA,EAAQxI,GAAR,CAAb,EAA2B;MAAE2F;IAAF,CAA3B,CAAN;IACA,OAAO,KAAKG,OAAL,CAAa9F,GAAb,EAAkB;MAAE2F;IAAF,CAAlB,CAAP;EACD;;EAEc,MAATyC,SAAS,CAACtH,IAAD,EAAOuD,KAAP,EAAc;IAC3B,MAAM,IAAI9C,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEgB,MAAX0D,WAAW,CAACtG,IAAD,EAAOqH,IAAP,EAAa;IAAErB,OAAF;IAAWN;EAAX,CAAb,EAAiC;IAChD,IAAI;MACF,OAAO,MAAM,KAAK4D,UAAL,CAAgBtJ,IAAhB,EAAsBqH,IAAtB,EAA4B;QAAE3B;MAAF,CAA5B,CAAb;IACD,CAFD,CAEE,OAAOlF,KAAP,EAAc;MACd,IAAIA,KAAK,CAACC,IAAN,KAAe,QAAnB,EAA6B;QAC3B,MAAMD,KAAN;MACD;IACF;;IAED,MAAM,KAAK2G,OAAL,CAAa,IAAA0C,aAAA,EAAQ7J,IAAR,CAAb,EAA4B;MAAEgH,IAAI,EAAEhB;IAAR,CAA5B,CAAN;IACA,OAAO,KAAKM,WAAL,CAAiBtG,IAAjB,EAAuBqH,IAAvB,EAA6B;MAAE3B;IAAF,CAA7B,CAAP;EACD;;EAEkB,MAAbW,aAAa,CAAClE,IAAD,EAAO4D,KAAP,EAAc;IAAEC,OAAF;IAAWC;EAAX,CAAd,EAAsC;IACvD,MAAM8D,OAAO,GAAI,GAAE,IAAAF,aAAA,EAAQ1H,IAAR,CAAc,KAAI,IAAA6H,cAAA,EAAS7H,IAAT,CAAe,EAApD;IACA,MAAM8H,MAAM,GAAG,MAAMlH,uBAAA,CAAQ6B,IAAR,CACnB,KAAK+E,mBAAL,CAAyBI,OAAzB,EAAkC;MAChC/D,OADgC;MAEhCN,KAAK,EAAE;IAFyB,CAAlC,CADmB,EAKnB,KAAK1C,QALc,CAArB;;IAOA,IAAI;MACF,MAAM,IAAAsF,4BAAA,EAAalC,gBAAb,EAAuBL,KAAvB,EAA8BkE,MAA9B,CAAN;;MACA,IAAIhE,SAAS,KAAKf,SAAlB,EAA6B;QAC3B,MAAMe,SAAS,CAACrB,IAAV,CAAe,IAAf,EAAqBmF,OAArB,CAAN;MACD;;MACD,MAAM,KAAK/H,MAAL,CAAY+H,OAAZ,EAAqB5H,IAArB,CAAN;IACD,CAND,CAME,OAAO3B,KAAP,EAAc;MACd,MAAM,KAAKuD,MAAL,CAAYgG,OAAZ,CAAN;MACA,MAAMvJ,KAAN;IACD;EACF;;EAEDgH,KAAK,CAACxH,IAAD,EAAOsH,MAAP,EAAeC,QAAf,EAAyB;IAC5B,MAAM,IAAI3E,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAED6C,SAAS,CAACzF,IAAD,EAAOwC,OAAP,EAAgB;IACvB,OAAO,KAAKqC,iBAAL,CAAuB7E,IAAvB,EAA6B,EAAE,GAAGwC,OAAL;MAAcK,aAAa,EAAE,KAAKC;IAAlC,CAA7B,EAAiFgC,IAAjF,CAAsFoF,kBAAA,CAAU5C,MAAhG,CAAP;EACD;;EAEY,MAAPI,OAAO,CAACzF,OAAD,EAAUC,OAAV,EAAmB;IAC9B,MAAM,IAAIU,KAAJ,CAAU,iBAAV,CAAN;EACD;;EACU,MAAL+E,KAAK,CAAC1F,OAAD,EAAUC,OAAV,EAAmB;IAC5B,MAAM,IAAIU,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEW,MAANgF,MAAM,CAACvG,GAAD,EAAM;IAChB,MAAM,IAAIuB,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEY,MAAPmF,OAAO,CAAC1G,GAAD,EAAM;IACjB,IAAI;MACF,OAAO,MAAM,KAAKuG,MAAL,CAAYvG,GAAZ,CAAb;IACD,CAFD,CAEE,OAAOb,KAAP,EAAc;MACd,IAAIA,KAAK,CAACC,IAAN,KAAe,WAAnB,EAAgC;QAC9B,MAAMD,KAAN;MACD;IACF;;IAED,MAAM2J,KAAK,GAAG,MAAM,KAAKvD,KAAL,CAAWvF,GAAX,CAApB;IACA,MAAM,IAAA+I,eAAA,EAAgBD,KAAhB,EAAuBnK,IAAI,IAC/B,KAAKkJ,OAAL,CAAc,GAAE7H,GAAI,IAAGrB,IAAK,EAA5B,EAA+B6H,KAA/B,CAAqCrH,KAAK,IAAI;MAG5C,IAAIA,KAAK,CAACC,IAAN,KAAe,QAAf,IAA2BD,KAAK,CAACC,IAAN,KAAe,OAA9C,EAAuD;QACrD,OAAO,KAAKsH,OAAL,CAAc,GAAE1G,GAAI,IAAGrB,IAAK,EAA5B,CAAP;MACD;;MACD,MAAMQ,KAAN;IACD,CAPD,CADI,CAAN;IAUA,OAAO,KAAKuH,OAAL,CAAa1G,GAAb,CAAP;EACD;;EAGU,MAAL+C,KAAK,GAAG,CAAE;;EAEH,MAAP8E,OAAO,CAAClJ,IAAD,EAAO;IAClB,MAAM,IAAI4C,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEW,MAANyG,MAAM,CAACrJ,IAAD,EAAOsH,MAAP,EAAeC,QAAf,EAAyB;IACnC,MAAM8C,MAAM,GAAG,OAAOrK,IAAP,KAAgB,QAA/B;;IACA,IAAIqK,MAAJ,EAAY;MACVrK,IAAI,GAAG,MAAM,KAAKoH,UAAL,CAAgBpH,IAAhB,EAAsB,IAAtB,CAAb;IACD;;IACD,IAAI;MACF,OAAO,MAAM,KAAKsK,QAAL,CAActK,IAAd,EAAoBsH,MAApB,EAA4BC,QAA5B,CAAb;IACD,CAFD,SAEU;MACR,IAAI8C,MAAJ,EAAY;QACV,MAAM,KAAK9F,WAAL,CAAiBvE,IAAjB,CAAN;MACD;IACF;EACF;;EAEa,MAARsK,QAAQ,CAAChG,EAAD,EAAKgD,MAAL,EAAaC,QAAb,EAAuB;IACnC,MAAM,IAAI3E,KAAJ,CAAU,iBAAV,CAAN;EACD;;EAEe,MAAV0G,UAAU,CAACtJ,IAAD,EAAOqH,IAAP,EAAa7E,OAAb,EAAsB;IACpC,MAAM,IAAII,KAAJ,CAAU,iBAAV,CAAN;EACD;;AArfwC,C;;;AAwf3C,SAAS2H,0BAAT,GAAsC;EACpC,MAAMC,GAAG,GAAG3J,aAAa,CAACD,SAA1B;EACA,MAAM6J,IAAI,GAAGpI,qBAAqB,CAACzB,SAAnC;EAEA,MAAM;IACJ8J,cADI;IAEJC,wBAFI;IAGJ/J,SAAS,EAAE;MAAEgK;IAAF;EAHP,IAIFC,MAJJ;EAMAA,MAAM,CAACC,mBAAP,CAA2BL,IAA3B,EAAiC7I,OAAjC,CAAyCmJ,IAAI,IAAI;IAC/C,IAAIC,UAAJ,EAAgBC,KAAhB;;IACA,IACEL,cAAc,CAAChG,IAAf,CAAoB4F,GAApB,EAAyBO,IAAzB,KACAA,IAAI,CAAC,CAAD,CAAJ,KAAY,GADZ,IAEA,QAAQE,KAAK,GAAG,CAACD,UAAU,GAAGL,wBAAwB,CAACF,IAAD,EAAOM,IAAP,CAAtC,EAAoDE,KAApE,MAA+E,UAHjF,EAIE;MACA;IACD;;IAEDD,UAAU,CAACC,KAAX,GAAmB,YAAY;MAC7B,IAAI9I,IAAJ;;MACA,IAAI+I,SAAS,CAACvJ,MAAV,KAAqB,CAArB,IAA0B,QAAQQ,IAAI,GAAG+I,SAAS,CAAC,CAAD,CAAxB,MAAiC,QAA/D,EAAyE;QACvEA,SAAS,CAAC,CAAD,CAAT,GAAe,KAAK1J,QAAL,CAAcW,IAAd,CAAf;MACD;;MACD,OAAO8I,KAAK,CAACE,KAAN,CAAY,KAAKjK,QAAjB,EAA2BgK,SAA3B,CAAP;IACD,CAND;;IAQAR,cAAc,CAACF,GAAD,EAAMO,IAAN,EAAYC,UAAZ,CAAd;EACD,CAnBD;AAoBD;;AACDT,0BAA0B"}
package/dist/s3.js CHANGED
@@ -557,6 +557,10 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
557
557
 
558
558
  async _closeFile(fd) {}
559
559
 
560
+ useVhdDirectory() {
561
+ return true;
562
+ }
563
+
560
564
  }, (_applyDecoratedDescriptor(_class.prototype, "_writeFile", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, "_writeFile"), _class.prototype)), _class));
561
565
  exports.default = S3Handler;
562
566
  //# sourceMappingURL=s3.js.map
package/dist/s3.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s3.js","names":["MIN_PART_SIZE","MAX_PART_SIZE","MAX_PARTS_COUNT","MAX_OBJECT_SIZE","IDEAL_FRAGMENT_SIZE","Math","ceil","warn","createLogger","S3Handler","decorateWith","pRetry","wrap","delays","when","e","$metadata","httpStatusCode","onRetry","error","attemptNumber","delay","file","arguments","RemoteHandlerAbstract","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","_s3","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","_bucket","shift","_dir","join","type","_makeCopySource","_makeKey","_makePrefix","dir","prefix","_createParams","Bucket","Key","_multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","_isNotEmptyDir","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","_isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","queueSize","partSize","params","done","undefined","call","unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","Error","code","_unlink","DeleteObjectCommand","_list","NextContinuationToken","uniq","Set","Delimiter","ContinuationToken","IsTruncated","entry","CommonPrefixes","add","basename","_mkdir","_rename","copy","fd","ContentLength","_read","buffer","position","Range","bytesRead","copyStreamToBuffer","_rmdir","_rmtree","asyncEach","concurrency","_write","uploadParams","fileSize","resultBuffer","Buffer","alloc","max","bytesWritten","copyMultipartParams","prefixSize","suffixOffset","suffixSize","hasSuffix","editBuffer","editBufferOffset","prefixPosition","fragmentsCount","floor","prefixFragmentSize","prefixLastFragmentSize","i","fragmentEnd","assert","strictEqual","range","copyPrefixParams","part","downloadParams","prefixBuffer","createBufferFromStream","concat","complementSize","complementOffset","prefixRange","complementBuffer","editParams","editPart","UploadPartCommand","suffixFragments","suffixFragmentOffset","suffixRange","copySuffixParams","suffixPart","_openFile","flags","_closeFile"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n UploadPartCommand,\n UploadPartCopyCommand,\n} from '@aws-sdk/client-s3'\nimport { Upload } from '@aws-sdk/lib-storage'\nimport { NodeHttpHandler } from '@aws-sdk/node-http-handler'\nimport { getApplyMd5BodyChecksumPlugin } from '@aws-sdk/middleware-apply-body-checksum'\nimport assert from 'assert'\nimport { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport pRetry from 'promise-toolbox/retry'\nimport { createLogger } from '@xen-orchestra/log'\nimport { decorateWith } from '@vates/decorate-with'\nimport { PassThrough, pipeline } from 'stream'\nimport { parse } from 'xo-remote-parser'\nimport copyStreamToBuffer from './_copyStreamToBuffer.js'\nimport createBufferFromStream from './_createBufferFromStream.js'\nimport guessAwsRegion from './_guessAwsRegion.js'\nimport RemoteHandlerAbstract from './abstract'\nimport { basename, join, split } from './_path'\nimport { asyncEach } from '@vates/async-each'\n\n// endpoints https://docs.aws.amazon.com/general/latest/gr/s3.html\n\n// limits: https://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html\nconst MIN_PART_SIZE = 1024 * 1024 * 5 // 5MB\nconst MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst MAX_PARTS_COUNT = 10000\nconst MAX_OBJECT_SIZE = 1024 * 1024 * 1024 * 1024 * 5 // 5TB\nconst IDEAL_FRAGMENT_SIZE = Math.ceil(MAX_OBJECT_SIZE / MAX_PARTS_COUNT) // the smallest fragment size that still allows a 5TB upload in 10000 fragments, about 524MB\n\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n constructor(remote, _opts) {\n super(remote)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n } = parse(remote.url)\n\n this._s3 = new S3Client({\n apiVersion: '2006-03-01',\n endpoint: `${protocol}://${host}`,\n forcePathStyle: true,\n credentials: {\n accessKeyId: username,\n secretAccessKey: password,\n },\n tls: protocol === 'https',\n region,\n requestHandler: new NodeHttpHandler({\n socketTimeout: 600000,\n httpAgent: new HttpAgent({\n keepAlive: true,\n }),\n httpsAgent: new HttpsAgent({\n rejectUnauthorized: !allowUnauthorized,\n keepAlive: true,\n }),\n }),\n })\n\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n this._s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this._s3.config))\n\n const parts = split(path)\n this._bucket = parts.shift()\n this._dir = join(...parts)\n }\n\n get type() {\n return 's3'\n }\n\n _makeCopySource(path) {\n return join(this._bucket, this._dir, path)\n }\n\n _makeKey(file) {\n return join(this._dir, file)\n }\n\n _makePrefix(dir) {\n const prefix = join(this._dir, dir, '/')\n\n // no prefix for root\n if (prefix !== './') {\n return prefix\n }\n }\n\n _createParams(file) {\n return { Bucket: this._bucket, Key: this._makeKey(file) }\n }\n\n async _multipartCopy(oldPath, newPath) {\n const size = await this._getSize(oldPath)\n const CopySource = this._makeCopySource(oldPath)\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand({ ...this._createParams(newPath) }))\n try {\n const parts = []\n let start = 0\n while (start < size) {\n const partNumber = parts.length + 1\n const upload = await this._s3.send(\n new UploadPartCopyCommand({\n ...multipartParams,\n CopySource,\n CopySourceRange: `bytes=${start}-${Math.min(start + MAX_PART_SIZE, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += MAX_PART_SIZE\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n\n async _copy(oldPath, newPath) {\n const CopySource = this._makeCopySource(oldPath)\n try {\n await this._s3.send(\n new CopyObjectCommand({\n ...this._createParams(newPath),\n CopySource,\n })\n )\n } catch (e) {\n // object > 5GB must be copied part by part\n if (e.name === 'EntityTooLarge') {\n return this._multipartCopy(oldPath, newPath)\n }\n throw e\n }\n }\n\n async _isNotEmptyDir(path) {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n MaxKeys: 1,\n Prefix: this._makePrefix(path),\n })\n )\n return result.Contents?.length > 0\n }\n\n async _isFile(path) {\n try {\n await this._s3.send(new HeadObjectCommand(this._createParams(path)))\n return true\n } catch (error) {\n if (error.name === 'NotFound') {\n return false\n }\n throw error\n }\n }\n\n async _outputStream(path, input, { validator }) {\n // Workaround for \"ReferenceError: ReadableStream is not defined\"\n // https://github.com/aws/aws-sdk-js-v3/issues/2522\n const Body = new PassThrough()\n pipeline(input, Body, () => {})\n\n const upload = new Upload({\n client: this._s3,\n queueSize: 1,\n partSize: IDEAL_FRAGMENT_SIZE,\n params: {\n ...this._createParams(path),\n Body,\n },\n })\n\n await upload.done()\n\n if (validator !== undefined) {\n try {\n await validator.call(this, path)\n } catch (error) {\n await this.unlink(path)\n throw error\n }\n }\n }\n\n // some objectstorage provider like backblaze, can answer a 500/503 routinely\n // in this case we should retry, and let their load balancing do its magic\n // https://www.backblaze.com/b2/docs/calling.html#error_handling\n @decorateWith(pRetry.wrap, {\n delays: [100, 200, 500, 1000, 2000],\n when: e => e.$metadata?.httpStatusCode === 500,\n onRetry(error) {\n warn('retrying writing file', {\n attemptNumber: this.attemptNumber,\n delay: this.delay,\n error,\n file: this.arguments[0],\n })\n },\n })\n async _writeFile(file, data, options) {\n return this._s3.send(\n new PutObjectCommand({\n ...this._createParams(file),\n Body: data,\n })\n )\n }\n\n async _createReadStream(path, options) {\n try {\n return (await this._s3.send(new GetObjectCommand(this._createParams(path)))).Body\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file '${path}'`)\n error.code = 'ENOENT'\n error.path = path\n throw error\n }\n throw e\n }\n }\n\n async _unlink(path) {\n await this._s3.send(new DeleteObjectCommand(this._createParams(path)))\n\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`EISDIR: illegal operation on a directory, unlink '${path}'`)\n error.code = 'EISDIR'\n error.path = path\n throw error\n }\n }\n\n async _list(dir) {\n let NextContinuationToken\n const uniq = new Set()\n const Prefix = this._makePrefix(dir)\n\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n Delimiter: '/',\n // will only return path until delimiters\n ContinuationToken: NextContinuationToken,\n })\n )\n\n if (result.IsTruncated) {\n warn(`need pagination to browse the directory ${dir} completely`)\n NextContinuationToken = result.NextContinuationToken\n } else {\n NextContinuationToken = undefined\n }\n\n // subdirectories\n for (const entry of result.CommonPrefixes ?? []) {\n uniq.add(basename(entry.Prefix))\n }\n\n // files\n for (const entry of result.Contents ?? []) {\n uniq.add(basename(entry.Key))\n }\n } while (NextContinuationToken !== undefined)\n\n return [...uniq]\n }\n\n async _mkdir(path) {\n if (await this._isFile(path)) {\n const error = new Error(`ENOTDIR: file already exists, mkdir '${path}'`)\n error.code = 'ENOTDIR'\n error.path = path\n throw error\n }\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // s3 doesn't have a rename operation, so copy + delete source\n async _rename(oldPath, newPath) {\n await this.copy(oldPath, newPath)\n await this._s3.send(new DeleteObjectCommand(this._createParams(oldPath)))\n }\n\n async _getSize(file) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const result = await this._s3.send(new HeadObjectCommand(this._createParams(file)))\n return +result.ContentLength\n }\n\n async _read(file, buffer, position = 0) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const params = this._createParams(file)\n params.Range = `bytes=${position}-${position + buffer.length - 1}`\n try {\n const result = await this._s3.send(new GetObjectCommand(params))\n const bytesRead = await copyStreamToBuffer(result.Body, buffer)\n return { bytesRead, buffer }\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n if (await this._isNotEmptyDir(file)) {\n const error = new Error(`${file} is a directory`)\n error.code = 'EISDIR'\n error.path = file\n throw error\n }\n }\n throw e\n }\n }\n\n async _rmdir(path) {\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`ENOTEMPTY: directory not empty, rmdir '${path}`)\n error.code = 'ENOTEMPTY'\n error.path = path\n throw error\n }\n\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // reimplement _rmtree to handle efficiantly path with more than 1000 entries in trees\n // @todo : use parallel processing for unlink\n async _rmtree(path) {\n let NextContinuationToken\n const Prefix = this._makePrefix(path)\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n ContinuationToken: NextContinuationToken,\n })\n )\n\n NextContinuationToken = result.IsTruncated ? result.NextContinuationToken : undefined\n await asyncEach(\n result.Contents ?? [],\n async ({ Key }) => {\n // _unlink will add the prefix, but Key contains everything\n // also we don't need to check if we delete a directory, since the list only return files\n await this._s3.send(\n new DeleteObjectCommand({\n Bucket: this._bucket,\n Key,\n })\n )\n },\n {\n concurrency: 16,\n }\n )\n } while (NextContinuationToken !== undefined)\n }\n\n async _write(file, buffer, position) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const uploadParams = this._createParams(file)\n let fileSize\n try {\n fileSize = +(await this._s3.send(new HeadObjectCommand(uploadParams))).ContentLength\n } catch (e) {\n if (e.name === 'NotFound') {\n fileSize = 0\n } else {\n throw e\n }\n }\n if (fileSize < MIN_PART_SIZE) {\n const resultBuffer = Buffer.alloc(Math.max(fileSize, position + buffer.length))\n if (fileSize !== 0) {\n const result = await this._s3.send(new GetObjectCommand(uploadParams))\n await copyStreamToBuffer(result.Body, resultBuffer)\n } else {\n Buffer.alloc(0).copy(resultBuffer)\n }\n buffer.copy(resultBuffer, position)\n await this._s3.send(\n new PutObjectCommand({\n ...uploadParams,\n Body: resultBuffer,\n })\n )\n return { buffer, bytesWritten: buffer.length }\n } else {\n // using this trick: https://stackoverflow.com/a/38089437/72637\n // multipart fragments have a minimum size of 5Mo and a max of 5Go unless they are last\n // splitting the file in 3 parts: [prefix, edit, suffix]\n // if `prefix` is bigger than 5Mo, it will be sourced from uploadPartCopy()\n // otherwise otherwise it will be downloaded, concatenated to `edit`\n // `edit` will always be an upload part\n // `suffix` will always be sourced from uploadPartCopy()\n // Then everything will be sliced in 5Gb parts before getting uploaded\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand(uploadParams))\n const copyMultipartParams = {\n ...multipartParams,\n CopySource: this._makeCopySource(file),\n }\n try {\n const parts = []\n const prefixSize = position\n let suffixOffset = prefixSize + buffer.length\n let suffixSize = Math.max(0, fileSize - suffixOffset)\n let hasSuffix = suffixSize > 0\n let editBuffer = buffer\n let editBufferOffset = position\n let partNumber = 1\n let prefixPosition = 0\n // use floor() so that last fragment is handled in the if bellow\n let fragmentsCount = Math.floor(prefixSize / MAX_PART_SIZE)\n const prefixFragmentSize = MAX_PART_SIZE\n let prefixLastFragmentSize = prefixSize - prefixFragmentSize * fragmentsCount\n if (prefixLastFragmentSize >= MIN_PART_SIZE) {\n // the last fragment of the prefix is smaller than MAX_PART_SIZE, but bigger than the minimum\n // so we can copy it too\n fragmentsCount++\n prefixLastFragmentSize = 0\n }\n for (let i = 0; i < fragmentsCount; i++) {\n const fragmentEnd = Math.min(prefixPosition + prefixFragmentSize, prefixSize)\n assert.strictEqual(fragmentEnd - prefixPosition <= MAX_PART_SIZE, true)\n const range = `bytes=${prefixPosition}-${fragmentEnd - 1}`\n const copyPrefixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: range }\n const part = await this._s3.send(new UploadPartCopyCommand(copyPrefixParams))\n parts.push({ ETag: part.CopyPartResult.ETag, PartNumber: copyPrefixParams.PartNumber })\n prefixPosition += prefixFragmentSize\n }\n if (prefixLastFragmentSize) {\n // grab everything from the prefix that was too small to be copied, download and merge to the edit buffer.\n const downloadParams = { ...uploadParams, Range: `bytes=${prefixPosition}-${prefixSize - 1}` }\n let prefixBuffer\n if (prefixSize > 0) {\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n prefixBuffer = await createBufferFromStream(result.Body)\n } else {\n prefixBuffer = Buffer.alloc(0)\n }\n editBuffer = Buffer.concat([prefixBuffer, buffer])\n editBufferOffset -= prefixLastFragmentSize\n }\n if (hasSuffix && editBuffer.length < MIN_PART_SIZE) {\n // the edit fragment is too short and is not the last fragment\n // let's steal from the suffix fragment to reach the minimum size\n // the suffix might be too short and itself entirely absorbed in the edit fragment, making it the last one.\n const complementSize = Math.min(MIN_PART_SIZE - editBuffer.length, suffixSize)\n const complementOffset = editBufferOffset + editBuffer.length\n suffixOffset += complementSize\n suffixSize -= complementSize\n hasSuffix = suffixSize > 0\n const prefixRange = `bytes=${complementOffset}-${complementOffset + complementSize - 1}`\n const downloadParams = { ...uploadParams, Range: prefixRange }\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n const complementBuffer = await createBufferFromStream(result.Body)\n editBuffer = Buffer.concat([editBuffer, complementBuffer])\n }\n const editParams = { ...multipartParams, Body: editBuffer, PartNumber: partNumber++ }\n const editPart = await this._s3.send(new UploadPartCommand(editParams))\n parts.push({ ETag: editPart.ETag, PartNumber: editParams.PartNumber })\n if (hasSuffix) {\n // use ceil because the last fragment can be arbitrarily small.\n const suffixFragments = Math.ceil(suffixSize / MAX_PART_SIZE)\n let suffixFragmentOffset = suffixOffset\n for (let i = 0; i < suffixFragments; i++) {\n const fragmentEnd = suffixFragmentOffset + MAX_PART_SIZE\n assert.strictEqual(Math.min(fileSize, fragmentEnd) - suffixFragmentOffset <= MAX_PART_SIZE, true)\n const suffixRange = `bytes=${suffixFragmentOffset}-${Math.min(fileSize, fragmentEnd) - 1}`\n const copySuffixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: suffixRange }\n const suffixPart = (await this._s3.send(new UploadPartCopyCommand(copySuffixParams))).CopyPartResult\n parts.push({ ETag: suffixPart.ETag, PartNumber: copySuffixParams.PartNumber })\n suffixFragmentOffset = fragmentEnd\n }\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n }\n\n async _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n}\n"],"mappings":";;;;;;;AAAA;;AAcA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAKA,MAAMA,aAAa,GAAG,OAAO,IAAP,GAAc,CAApC;AACA,MAAMC,aAAa,GAAG,OAAO,IAAP,GAAc,IAAd,GAAqB,CAA3C;AACA,MAAMC,eAAe,GAAG,KAAxB;AACA,MAAMC,eAAe,GAAG,OAAO,IAAP,GAAc,IAAd,GAAqB,IAArB,GAA4B,CAApD;AACA,MAAMC,mBAAmB,GAAGC,IAAI,CAACC,IAAL,CAAUH,eAAe,GAAGD,eAA5B,CAA5B;AAEA,MAAM;EAAEK;AAAF,IAAW,IAAAC,iBAAA,EAAa,UAAb,CAAjB;IAEqBC,S,WA4KlB,IAAAC,0BAAA,EAAaC,cAAA,CAAOC,IAApB,EAA0B;EACzBC,MAAM,EAAE,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,IAAhB,EAAsB,IAAtB,CADiB;EAEzBC,IAAI,EAAEC,CAAC;IAAA;;IAAA,OAAI,iBAAAA,CAAC,CAACC,SAAF,8DAAaC,cAAb,MAAgC,GAApC;EAAA,CAFkB;;EAGzBC,OAAO,CAACC,KAAD,EAAQ;IACbZ,IAAI,CAAC,uBAAD,EAA0B;MAC5Ba,aAAa,EAAE,KAAKA,aADQ;MAE5BC,KAAK,EAAE,KAAKA,KAFgB;MAG5BF,KAH4B;MAI5BG,IAAI,EAAE,KAAKC,SAAL,CAAe,CAAf;IAJsB,CAA1B,CAAJ;EAMD;;AAVwB,CAA1B,C,YA5KY,MAAMd,SAAN,SAAwBe,iBAAxB,CAA8C;EAC3DC,WAAW,CAACC,MAAD,EAASC,KAAT,EAAgB;IACzB,MAAMD,MAAN;IACA,MAAM;MACJE,iBADI;MAEJC,IAFI;MAGJC,IAHI;MAIJC,QAJI;MAKJC,QALI;MAMJC,QANI;MAOJC,MAAM,GAAG,IAAAC,uBAAA,EAAeN,IAAf;IAPL,IAQF,IAAAO,qBAAA,EAAMV,MAAM,CAACW,GAAb,CARJ;IAUA,KAAKC,GAAL,GAAW,IAAIC,iBAAJ,CAAa;MACtBC,UAAU,EAAE,YADU;MAEtBC,QAAQ,EAAG,GAAER,QAAS,MAAKJ,IAAK,EAFV;MAGtBa,cAAc,EAAE,IAHM;MAItBC,WAAW,EAAE;QACXC,WAAW,EAAEb,QADF;QAEXc,eAAe,EAAEb;MAFN,CAJS;MAQtBc,GAAG,EAAEb,QAAQ,KAAK,OARI;MAStBC,MATsB;MAUtBa,cAAc,EAAE,IAAIC,gCAAJ,CAAoB;QAClCC,aAAa,EAAE,MADmB;QAElCC,SAAS,EAAE,IAAIC,WAAJ,CAAc;UACvBC,SAAS,EAAE;QADY,CAAd,CAFuB;QAKlCC,UAAU,EAAE,IAAIC,YAAJ,CAAe;UACzBC,kBAAkB,EAAE,CAAC3B,iBADI;UAEzBwB,SAAS,EAAE;QAFc,CAAf;MALsB,CAApB;IAVM,CAAb,CAAX;;IAuBA,KAAKd,GAAL,CAASkB,eAAT,CAAyBC,GAAzB,CAA6B,IAAAC,0DAAA,EAA8B,KAAKpB,GAAL,CAASqB,MAAvC,CAA7B;;IAEA,MAAMC,KAAK,GAAG,IAAAC,WAAA,EAAM/B,IAAN,CAAd;IACA,KAAKgC,OAAL,GAAeF,KAAK,CAACG,KAAN,EAAf;IACA,KAAKC,IAAL,GAAY,IAAAC,UAAA,EAAK,GAAGL,KAAR,CAAZ;EACD;;EAEO,IAAJM,IAAI,GAAG;IACT,OAAO,IAAP;EACD;;EAEDC,eAAe,CAACrC,IAAD,EAAO;IACpB,OAAO,IAAAmC,UAAA,EAAK,KAAKH,OAAV,EAAmB,KAAKE,IAAxB,EAA8BlC,IAA9B,CAAP;EACD;;EAEDsC,QAAQ,CAAC9C,IAAD,EAAO;IACb,OAAO,IAAA2C,UAAA,EAAK,KAAKD,IAAV,EAAgB1C,IAAhB,CAAP;EACD;;EAED+C,WAAW,CAACC,GAAD,EAAM;IACf,MAAMC,MAAM,GAAG,IAAAN,UAAA,EAAK,KAAKD,IAAV,EAAgBM,GAAhB,EAAqB,GAArB,CAAf;;IAGA,IAAIC,MAAM,KAAK,IAAf,EAAqB;MACnB,OAAOA,MAAP;IACD;EACF;;EAEDC,aAAa,CAAClD,IAAD,EAAO;IAClB,OAAO;MAAEmD,MAAM,EAAE,KAAKX,OAAf;MAAwBY,GAAG,EAAE,KAAKN,QAAL,CAAc9C,IAAd;IAA7B,CAAP;EACD;;EAEmB,MAAdqD,cAAc,CAACC,OAAD,EAAUC,OAAV,EAAmB;IACrC,MAAMC,IAAI,GAAG,MAAM,KAAKC,QAAL,CAAcH,OAAd,CAAnB;;IACA,MAAMI,UAAU,GAAG,KAAKb,eAAL,CAAqBS,OAArB,CAAnB;;IACA,MAAMK,eAAe,GAAG,MAAM,KAAK3C,GAAL,CAAS4C,IAAT,CAAc,IAAIC,qCAAJ,CAAiC,EAAE,GAAG,KAAKX,aAAL,CAAmBK,OAAnB;IAAL,CAAjC,CAAd,CAA9B;;IACA,IAAI;MACF,MAAMjB,KAAK,GAAG,EAAd;MACA,IAAIwB,KAAK,GAAG,CAAZ;;MACA,OAAOA,KAAK,GAAGN,IAAf,EAAqB;QACnB,MAAMO,UAAU,GAAGzB,KAAK,CAAC0B,MAAN,GAAe,CAAlC;QACA,MAAMC,MAAM,GAAG,MAAM,KAAKjD,GAAL,CAAS4C,IAAT,CACnB,IAAIM,8BAAJ,CAA0B,EACxB,GAAGP,eADqB;UAExBD,UAFwB;UAGxBS,eAAe,EAAG,SAAQL,KAAM,IAAG/E,IAAI,CAACqF,GAAL,CAASN,KAAK,GAAGnF,aAAjB,EAAgC6E,IAAhC,IAAwC,CAAE,EAHrD;UAIxBa,UAAU,EAAEN;QAJY,CAA1B,CADmB,CAArB;QAQAzB,KAAK,CAACgC,IAAN,CAAW;UAAEC,IAAI,EAAEN,MAAM,CAACO,cAAP,CAAsBD,IAA9B;UAAoCF,UAAU,EAAEN;QAAhD,CAAX;QACAD,KAAK,IAAInF,aAAT;MACD;;MACD,MAAM,KAAKqC,GAAL,CAAS4C,IAAT,CACJ,IAAIa,uCAAJ,CAAmC,EACjC,GAAGd,eAD8B;QAEjCe,eAAe,EAAE;UAAEC,KAAK,EAAErC;QAAT;MAFgB,CAAnC,CADI,CAAN;IAMD,CAtBD,CAsBE,OAAO7C,CAAP,EAAU;MACV,MAAM,KAAKuB,GAAL,CAAS4C,IAAT,CAAc,IAAIgB,oCAAJ,CAAgCjB,eAAhC,CAAd,CAAN;MACA,MAAMlE,CAAN;IACD;EACF;;EAEU,MAALoF,KAAK,CAACvB,OAAD,EAAUC,OAAV,EAAmB;IAC5B,MAAMG,UAAU,GAAG,KAAKb,eAAL,CAAqBS,OAArB,CAAnB;;IACA,IAAI;MACF,MAAM,KAAKtC,GAAL,CAAS4C,IAAT,CACJ,IAAIkB,0BAAJ,CAAsB,EACpB,GAAG,KAAK5B,aAAL,CAAmBK,OAAnB,CADiB;QAEpBG;MAFoB,CAAtB,CADI,CAAN;IAMD,CAPD,CAOE,OAAOjE,CAAP,EAAU;MAEV,IAAIA,CAAC,CAACsF,IAAF,KAAW,gBAAf,EAAiC;QAC/B,OAAO,KAAK1B,cAAL,CAAoBC,OAApB,EAA6BC,OAA7B,CAAP;MACD;;MACD,MAAM9D,CAAN;IACD;EACF;;EAEmB,MAAduF,cAAc,CAACxE,IAAD,EAAO;IAAA;;IACzB,MAAMyE,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CACnB,IAAIsB,6BAAJ,CAAyB;MACvB/B,MAAM,EAAE,KAAKX,OADU;MAEvB2C,OAAO,EAAE,CAFc;MAGvBC,MAAM,EAAE,KAAKrC,WAAL,CAAiBvC,IAAjB;IAHe,CAAzB,CADmB,CAArB;IAOA,OAAO,qBAAAyE,MAAM,CAACI,QAAP,sEAAiBrB,MAAjB,IAA0B,CAAjC;EACD;;EAEY,MAAPsB,OAAO,CAAC9E,IAAD,EAAO;IAClB,IAAI;MACF,MAAM,KAAKQ,GAAL,CAAS4C,IAAT,CAAc,IAAI2B,0BAAJ,CAAsB,KAAKrC,aAAL,CAAmB1C,IAAnB,CAAtB,CAAd,CAAN;MACA,OAAO,IAAP;IACD,CAHD,CAGE,OAAOX,KAAP,EAAc;MACd,IAAIA,KAAK,CAACkF,IAAN,KAAe,UAAnB,EAA+B;QAC7B,OAAO,KAAP;MACD;;MACD,MAAMlF,KAAN;IACD;EACF;;EAEkB,MAAb2F,aAAa,CAAChF,IAAD,EAAOiF,KAAP,EAAc;IAAEC;EAAF,CAAd,EAA6B;IAG9C,MAAMC,IAAI,GAAG,IAAIC,mBAAJ,EAAb;IACA,IAAAC,gBAAA,EAASJ,KAAT,EAAgBE,IAAhB,EAAsB,MAAM,CAAE,CAA9B;IAEA,MAAM1B,MAAM,GAAG,IAAI6B,kBAAJ,CAAW;MACxBC,MAAM,EAAE,KAAK/E,GADW;MAExBgF,SAAS,EAAE,CAFa;MAGxBC,QAAQ,EAAEnH,mBAHc;MAIxBoH,MAAM,EAAE,EACN,GAAG,KAAKhD,aAAL,CAAmB1C,IAAnB,CADG;QAENmF;MAFM;IAJgB,CAAX,CAAf;IAUA,MAAM1B,MAAM,CAACkC,IAAP,EAAN;;IAEA,IAAIT,SAAS,KAAKU,SAAlB,EAA6B;MAC3B,IAAI;QACF,MAAMV,SAAS,CAACW,IAAV,CAAe,IAAf,EAAqB7F,IAArB,CAAN;MACD,CAFD,CAEE,OAAOX,KAAP,EAAc;QACd,MAAM,KAAKyG,MAAL,CAAY9F,IAAZ,CAAN;QACA,MAAMX,KAAN;MACD;IACF;EACF;;EAiBe,MAAV0G,UAAU,CAACvG,IAAD,EAAOwG,IAAP,EAAaC,OAAb,EAAsB;IACpC,OAAO,KAAKzF,GAAL,CAAS4C,IAAT,CACL,IAAI8C,yBAAJ,CAAqB,EACnB,GAAG,KAAKxD,aAAL,CAAmBlD,IAAnB,CADgB;MAEnB2F,IAAI,EAAEa;IAFa,CAArB,CADK,CAAP;EAMD;;EAEsB,MAAjBG,iBAAiB,CAACnG,IAAD,EAAOiG,OAAP,EAAgB;IACrC,IAAI;MACF,OAAO,CAAC,MAAM,KAAKzF,GAAL,CAAS4C,IAAT,CAAc,IAAIgD,yBAAJ,CAAqB,KAAK1D,aAAL,CAAmB1C,IAAnB,CAArB,CAAd,CAAP,EAAsEmF,IAA7E;IACD,CAFD,CAEE,OAAOlG,CAAP,EAAU;MACV,IAAIA,CAAC,CAACsF,IAAF,KAAW,WAAf,EAA4B;QAC1B,MAAMlF,KAAK,GAAG,IAAIgH,KAAJ,CAAW,yBAAwBrG,IAAK,GAAxC,CAAd;QACAX,KAAK,CAACiH,IAAN,GAAa,QAAb;QACAjH,KAAK,CAACW,IAAN,GAAaA,IAAb;QACA,MAAMX,KAAN;MACD;;MACD,MAAMJ,CAAN;IACD;EACF;;EAEY,MAAPsH,OAAO,CAACvG,IAAD,EAAO;IAClB,MAAM,KAAKQ,GAAL,CAAS4C,IAAT,CAAc,IAAIoD,4BAAJ,CAAwB,KAAK9D,aAAL,CAAmB1C,IAAnB,CAAxB,CAAd,CAAN;;IAEA,IAAI,MAAM,KAAKwE,cAAL,CAAoBxE,IAApB,CAAV,EAAqC;MACnC,MAAMX,KAAK,GAAG,IAAIgH,KAAJ,CAAW,qDAAoDrG,IAAK,GAApE,CAAd;MACAX,KAAK,CAACiH,IAAN,GAAa,QAAb;MACAjH,KAAK,CAACW,IAAN,GAAaA,IAAb;MACA,MAAMX,KAAN;IACD;EACF;;EAEU,MAALoH,KAAK,CAACjE,GAAD,EAAM;IACf,IAAIkE,qBAAJ;IACA,MAAMC,IAAI,GAAG,IAAIC,GAAJ,EAAb;;IACA,MAAMhC,MAAM,GAAG,KAAKrC,WAAL,CAAiBC,GAAjB,CAAf;;IAEA,GAAG;MACD,MAAMiC,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CACnB,IAAIsB,6BAAJ,CAAyB;QACvB/B,MAAM,EAAE,KAAKX,OADU;QAEvB4C,MAFuB;QAGvBiC,SAAS,EAAE,GAHY;QAKvBC,iBAAiB,EAAEJ;MALI,CAAzB,CADmB,CAArB;;MAUA,IAAIjC,MAAM,CAACsC,WAAX,EAAwB;QACtBtI,IAAI,CAAE,2CAA0C+D,GAAI,aAAhD,CAAJ;QACAkE,qBAAqB,GAAGjC,MAAM,CAACiC,qBAA/B;MACD,CAHD,MAGO;QACLA,qBAAqB,GAAGd,SAAxB;MACD;;MAGD,KAAK,MAAMoB,KAAX,IAAoBvC,MAAM,CAACwC,cAAP,IAAyB,EAA7C,EAAiD;QAC/CN,IAAI,CAACO,GAAL,CAAS,IAAAC,cAAA,EAASH,KAAK,CAACpC,MAAf,CAAT;MACD;;MAGD,KAAK,MAAMoC,KAAX,IAAoBvC,MAAM,CAACI,QAAP,IAAmB,EAAvC,EAA2C;QACzC8B,IAAI,CAACO,GAAL,CAAS,IAAAC,cAAA,EAASH,KAAK,CAACpE,GAAf,CAAT;MACD;IACF,CA3BD,QA2BS8D,qBAAqB,KAAKd,SA3BnC;;IA6BA,OAAO,CAAC,GAAGe,IAAJ,CAAP;EACD;;EAEW,MAANS,MAAM,CAACpH,IAAD,EAAO;IACjB,IAAI,MAAM,KAAK8E,OAAL,CAAa9E,IAAb,CAAV,EAA8B;MAC5B,MAAMX,KAAK,GAAG,IAAIgH,KAAJ,CAAW,wCAAuCrG,IAAK,GAAvD,CAAd;MACAX,KAAK,CAACiH,IAAN,GAAa,SAAb;MACAjH,KAAK,CAACW,IAAN,GAAaA,IAAb;MACA,MAAMX,KAAN;IACD;EAEF;;EAGY,MAAPgI,OAAO,CAACvE,OAAD,EAAUC,OAAV,EAAmB;IAC9B,MAAM,KAAKuE,IAAL,CAAUxE,OAAV,EAAmBC,OAAnB,CAAN;IACA,MAAM,KAAKvC,GAAL,CAAS4C,IAAT,CAAc,IAAIoD,4BAAJ,CAAwB,KAAK9D,aAAL,CAAmBI,OAAnB,CAAxB,CAAd,CAAN;EACD;;EAEa,MAARG,QAAQ,CAACzD,IAAD,EAAO;IACnB,IAAI,OAAOA,IAAP,KAAgB,QAApB,EAA8B;MAC5BA,IAAI,GAAGA,IAAI,CAAC+H,EAAZ;IACD;;IACD,MAAM9C,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CAAc,IAAI2B,0BAAJ,CAAsB,KAAKrC,aAAL,CAAmBlD,IAAnB,CAAtB,CAAd,CAArB;IACA,OAAO,CAACiF,MAAM,CAAC+C,aAAf;EACD;;EAEU,MAALC,KAAK,CAACjI,IAAD,EAAOkI,MAAP,EAAeC,QAAQ,GAAG,CAA1B,EAA6B;IACtC,IAAI,OAAOnI,IAAP,KAAgB,QAApB,EAA8B;MAC5BA,IAAI,GAAGA,IAAI,CAAC+H,EAAZ;IACD;;IACD,MAAM7B,MAAM,GAAG,KAAKhD,aAAL,CAAmBlD,IAAnB,CAAf;;IACAkG,MAAM,CAACkC,KAAP,GAAgB,SAAQD,QAAS,IAAGA,QAAQ,GAAGD,MAAM,CAAClE,MAAlB,GAA2B,CAAE,EAAjE;;IACA,IAAI;MACF,MAAMiB,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CAAc,IAAIgD,yBAAJ,CAAqBV,MAArB,CAAd,CAArB;MACA,MAAMmC,SAAS,GAAG,MAAM,IAAAC,2BAAA,EAAmBrD,MAAM,CAACU,IAA1B,EAAgCuC,MAAhC,CAAxB;MACA,OAAO;QAAEG,SAAF;QAAaH;MAAb,CAAP;IACD,CAJD,CAIE,OAAOzI,CAAP,EAAU;MACV,IAAIA,CAAC,CAACsF,IAAF,KAAW,WAAf,EAA4B;QAC1B,IAAI,MAAM,KAAKC,cAAL,CAAoBhF,IAApB,CAAV,EAAqC;UACnC,MAAMH,KAAK,GAAG,IAAIgH,KAAJ,CAAW,GAAE7G,IAAK,iBAAlB,CAAd;UACAH,KAAK,CAACiH,IAAN,GAAa,QAAb;UACAjH,KAAK,CAACW,IAAN,GAAaR,IAAb;UACA,MAAMH,KAAN;QACD;MACF;;MACD,MAAMJ,CAAN;IACD;EACF;;EAEW,MAAN8I,MAAM,CAAC/H,IAAD,EAAO;IACjB,IAAI,MAAM,KAAKwE,cAAL,CAAoBxE,IAApB,CAAV,EAAqC;MACnC,MAAMX,KAAK,GAAG,IAAIgH,KAAJ,CAAW,0CAAyCrG,IAAK,EAAzD,CAAd;MACAX,KAAK,CAACiH,IAAN,GAAa,WAAb;MACAjH,KAAK,CAACW,IAAN,GAAaA,IAAb;MACA,MAAMX,KAAN;IACD;EAGF;;EAIY,MAAP2I,OAAO,CAAChI,IAAD,EAAO;IAClB,IAAI0G,qBAAJ;;IACA,MAAM9B,MAAM,GAAG,KAAKrC,WAAL,CAAiBvC,IAAjB,CAAf;;IACA,GAAG;MACD,MAAMyE,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CACnB,IAAIsB,6BAAJ,CAAyB;QACvB/B,MAAM,EAAE,KAAKX,OADU;QAEvB4C,MAFuB;QAGvBkC,iBAAiB,EAAEJ;MAHI,CAAzB,CADmB,CAArB;MAQAA,qBAAqB,GAAGjC,MAAM,CAACsC,WAAP,GAAqBtC,MAAM,CAACiC,qBAA5B,GAAoDd,SAA5E;MACA,MAAM,IAAAqC,oBAAA,EACJxD,MAAM,CAACI,QAAP,IAAmB,EADf,EAEJ,OAAO;QAAEjC;MAAF,CAAP,KAAmB;QAGjB,MAAM,KAAKpC,GAAL,CAAS4C,IAAT,CACJ,IAAIoD,4BAAJ,CAAwB;UACtB7D,MAAM,EAAE,KAAKX,OADS;UAEtBY;QAFsB,CAAxB,CADI,CAAN;MAMD,CAXG,EAYJ;QACEsF,WAAW,EAAE;MADf,CAZI,CAAN;IAgBD,CA1BD,QA0BSxB,qBAAqB,KAAKd,SA1BnC;EA2BD;;EAEW,MAANuC,MAAM,CAAC3I,IAAD,EAAOkI,MAAP,EAAeC,QAAf,EAAyB;IACnC,IAAI,OAAOnI,IAAP,KAAgB,QAApB,EAA8B;MAC5BA,IAAI,GAAGA,IAAI,CAAC+H,EAAZ;IACD;;IACD,MAAMa,YAAY,GAAG,KAAK1F,aAAL,CAAmBlD,IAAnB,CAArB;;IACA,IAAI6I,QAAJ;;IACA,IAAI;MACFA,QAAQ,GAAG,CAAC,CAAC,MAAM,KAAK7H,GAAL,CAAS4C,IAAT,CAAc,IAAI2B,0BAAJ,CAAsBqD,YAAtB,CAAd,CAAP,EAA2DZ,aAAvE;IACD,CAFD,CAEE,OAAOvI,CAAP,EAAU;MACV,IAAIA,CAAC,CAACsF,IAAF,KAAW,UAAf,EAA2B;QACzB8D,QAAQ,GAAG,CAAX;MACD,CAFD,MAEO;QACL,MAAMpJ,CAAN;MACD;IACF;;IACD,IAAIoJ,QAAQ,GAAGnK,aAAf,EAA8B;MAC5B,MAAMoK,YAAY,GAAGC,MAAM,CAACC,KAAP,CAAajK,IAAI,CAACkK,GAAL,CAASJ,QAAT,EAAmBV,QAAQ,GAAGD,MAAM,CAAClE,MAArC,CAAb,CAArB;;MACA,IAAI6E,QAAQ,KAAK,CAAjB,EAAoB;QAClB,MAAM5D,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CAAc,IAAIgD,yBAAJ,CAAqBgC,YAArB,CAAd,CAArB;QACA,MAAM,IAAAN,2BAAA,EAAmBrD,MAAM,CAACU,IAA1B,EAAgCmD,YAAhC,CAAN;MACD,CAHD,MAGO;QACLC,MAAM,CAACC,KAAP,CAAa,CAAb,EAAgBlB,IAAhB,CAAqBgB,YAArB;MACD;;MACDZ,MAAM,CAACJ,IAAP,CAAYgB,YAAZ,EAA0BX,QAA1B;MACA,MAAM,KAAKnH,GAAL,CAAS4C,IAAT,CACJ,IAAI8C,yBAAJ,CAAqB,EACnB,GAAGkC,YADgB;QAEnBjD,IAAI,EAAEmD;MAFa,CAArB,CADI,CAAN;MAMA,OAAO;QAAEZ,MAAF;QAAUgB,YAAY,EAAEhB,MAAM,CAAClE;MAA/B,CAAP;IACD,CAhBD,MAgBO;MASL,MAAML,eAAe,GAAG,MAAM,KAAK3C,GAAL,CAAS4C,IAAT,CAAc,IAAIC,qCAAJ,CAAiC+E,YAAjC,CAAd,CAA9B;MACA,MAAMO,mBAAmB,GAAG,EAC1B,GAAGxF,eADuB;QAE1BD,UAAU,EAAE,KAAKb,eAAL,CAAqB7C,IAArB;MAFc,CAA5B;;MAIA,IAAI;QACF,MAAMsC,KAAK,GAAG,EAAd;QACA,MAAM8G,UAAU,GAAGjB,QAAnB;QACA,IAAIkB,YAAY,GAAGD,UAAU,GAAGlB,MAAM,CAAClE,MAAvC;QACA,IAAIsF,UAAU,GAAGvK,IAAI,CAACkK,GAAL,CAAS,CAAT,EAAYJ,QAAQ,GAAGQ,YAAvB,CAAjB;QACA,IAAIE,SAAS,GAAGD,UAAU,GAAG,CAA7B;QACA,IAAIE,UAAU,GAAGtB,MAAjB;QACA,IAAIuB,gBAAgB,GAAGtB,QAAvB;QACA,IAAIpE,UAAU,GAAG,CAAjB;QACA,IAAI2F,cAAc,GAAG,CAArB;QAEA,IAAIC,cAAc,GAAG5K,IAAI,CAAC6K,KAAL,CAAWR,UAAU,GAAGzK,aAAxB,CAArB;QACA,MAAMkL,kBAAkB,GAAGlL,aAA3B;QACA,IAAImL,sBAAsB,GAAGV,UAAU,GAAGS,kBAAkB,GAAGF,cAA/D;;QACA,IAAIG,sBAAsB,IAAIpL,aAA9B,EAA6C;UAG3CiL,cAAc;UACdG,sBAAsB,GAAG,CAAzB;QACD;;QACD,KAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,cAApB,EAAoCI,CAAC,EAArC,EAAyC;UACvC,MAAMC,WAAW,GAAGjL,IAAI,CAACqF,GAAL,CAASsF,cAAc,GAAGG,kBAA1B,EAA8CT,UAA9C,CAApB;;UACAa,eAAA,CAAOC,WAAP,CAAmBF,WAAW,GAAGN,cAAd,IAAgC/K,aAAnD,EAAkE,IAAlE;;UACA,MAAMwL,KAAK,GAAI,SAAQT,cAAe,IAAGM,WAAW,GAAG,CAAE,EAAzD;UACA,MAAMI,gBAAgB,GAAG,EAAE,GAAGjB,mBAAL;YAA0B9E,UAAU,EAAEN,UAAU,EAAhD;YAAoDI,eAAe,EAAEgG;UAArE,CAAzB;UACA,MAAME,IAAI,GAAG,MAAM,KAAKrJ,GAAL,CAAS4C,IAAT,CAAc,IAAIM,8BAAJ,CAA0BkG,gBAA1B,CAAd,CAAnB;UACA9H,KAAK,CAACgC,IAAN,CAAW;YAAEC,IAAI,EAAE8F,IAAI,CAAC7F,cAAL,CAAoBD,IAA5B;YAAkCF,UAAU,EAAE+F,gBAAgB,CAAC/F;UAA/D,CAAX;UACAqF,cAAc,IAAIG,kBAAlB;QACD;;QACD,IAAIC,sBAAJ,EAA4B;UAE1B,MAAMQ,cAAc,GAAG,EAAE,GAAG1B,YAAL;YAAmBR,KAAK,EAAG,SAAQsB,cAAe,IAAGN,UAAU,GAAG,CAAE;UAApE,CAAvB;UACA,IAAImB,YAAJ;;UACA,IAAInB,UAAU,GAAG,CAAjB,EAAoB;YAClB,MAAMnE,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CAAc,IAAIgD,yBAAJ,CAAqB0D,cAArB,CAAd,CAArB;YACAC,YAAY,GAAG,MAAM,IAAAC,+BAAA,EAAuBvF,MAAM,CAACU,IAA9B,CAArB;UACD,CAHD,MAGO;YACL4E,YAAY,GAAGxB,MAAM,CAACC,KAAP,CAAa,CAAb,CAAf;UACD;;UACDQ,UAAU,GAAGT,MAAM,CAAC0B,MAAP,CAAc,CAACF,YAAD,EAAerC,MAAf,CAAd,CAAb;UACAuB,gBAAgB,IAAIK,sBAApB;QACD;;QACD,IAAIP,SAAS,IAAIC,UAAU,CAACxF,MAAX,GAAoBtF,aAArC,EAAoD;UAIlD,MAAMgM,cAAc,GAAG3L,IAAI,CAACqF,GAAL,CAAS1F,aAAa,GAAG8K,UAAU,CAACxF,MAApC,EAA4CsF,UAA5C,CAAvB;UACA,MAAMqB,gBAAgB,GAAGlB,gBAAgB,GAAGD,UAAU,CAACxF,MAAvD;UACAqF,YAAY,IAAIqB,cAAhB;UACApB,UAAU,IAAIoB,cAAd;UACAnB,SAAS,GAAGD,UAAU,GAAG,CAAzB;UACA,MAAMsB,WAAW,GAAI,SAAQD,gBAAiB,IAAGA,gBAAgB,GAAGD,cAAnB,GAAoC,CAAE,EAAvF;UACA,MAAMJ,cAAc,GAAG,EAAE,GAAG1B,YAAL;YAAmBR,KAAK,EAAEwC;UAA1B,CAAvB;UACA,MAAM3F,MAAM,GAAG,MAAM,KAAKjE,GAAL,CAAS4C,IAAT,CAAc,IAAIgD,yBAAJ,CAAqB0D,cAArB,CAAd,CAArB;UACA,MAAMO,gBAAgB,GAAG,MAAM,IAAAL,+BAAA,EAAuBvF,MAAM,CAACU,IAA9B,CAA/B;UACA6D,UAAU,GAAGT,MAAM,CAAC0B,MAAP,CAAc,CAACjB,UAAD,EAAaqB,gBAAb,CAAd,CAAb;QACD;;QACD,MAAMC,UAAU,GAAG,EAAE,GAAGnH,eAAL;UAAsBgC,IAAI,EAAE6D,UAA5B;UAAwCnF,UAAU,EAAEN,UAAU;QAA9D,CAAnB;QACA,MAAMgH,QAAQ,GAAG,MAAM,KAAK/J,GAAL,CAAS4C,IAAT,CAAc,IAAIoH,0BAAJ,CAAsBF,UAAtB,CAAd,CAAvB;QACAxI,KAAK,CAACgC,IAAN,CAAW;UAAEC,IAAI,EAAEwG,QAAQ,CAACxG,IAAjB;UAAuBF,UAAU,EAAEyG,UAAU,CAACzG;QAA9C,CAAX;;QACA,IAAIkF,SAAJ,EAAe;UAEb,MAAM0B,eAAe,GAAGlM,IAAI,CAACC,IAAL,CAAUsK,UAAU,GAAG3K,aAAvB,CAAxB;UACA,IAAIuM,oBAAoB,GAAG7B,YAA3B;;UACA,KAAK,IAAIU,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGkB,eAApB,EAAqClB,CAAC,EAAtC,EAA0C;YACxC,MAAMC,WAAW,GAAGkB,oBAAoB,GAAGvM,aAA3C;;YACAsL,eAAA,CAAOC,WAAP,CAAmBnL,IAAI,CAACqF,GAAL,CAASyE,QAAT,EAAmBmB,WAAnB,IAAkCkB,oBAAlC,IAA0DvM,aAA7E,EAA4F,IAA5F;;YACA,MAAMwM,WAAW,GAAI,SAAQD,oBAAqB,IAAGnM,IAAI,CAACqF,GAAL,CAASyE,QAAT,EAAmBmB,WAAnB,IAAkC,CAAE,EAAzF;YACA,MAAMoB,gBAAgB,GAAG,EAAE,GAAGjC,mBAAL;cAA0B9E,UAAU,EAAEN,UAAU,EAAhD;cAAoDI,eAAe,EAAEgH;YAArE,CAAzB;YACA,MAAME,UAAU,GAAG,CAAC,MAAM,KAAKrK,GAAL,CAAS4C,IAAT,CAAc,IAAIM,8BAAJ,CAA0BkH,gBAA1B,CAAd,CAAP,EAAmE5G,cAAtF;YACAlC,KAAK,CAACgC,IAAN,CAAW;cAAEC,IAAI,EAAE8G,UAAU,CAAC9G,IAAnB;cAAyBF,UAAU,EAAE+G,gBAAgB,CAAC/G;YAAtD,CAAX;YACA6G,oBAAoB,GAAGlB,WAAvB;UACD;QACF;;QACD,MAAM,KAAKhJ,GAAL,CAAS4C,IAAT,CACJ,IAAIa,uCAAJ,CAAmC,EACjC,GAAGd,eAD8B;UAEjCe,eAAe,EAAE;YAAEC,KAAK,EAAErC;UAAT;QAFgB,CAAnC,CADI,CAAN;MAMD,CAhFD,CAgFE,OAAO7C,CAAP,EAAU;QACV,MAAM,KAAKuB,GAAL,CAAS4C,IAAT,CAAc,IAAIgB,oCAAJ,CAAgCjB,eAAhC,CAAd,CAAN;QACA,MAAMlE,CAAN;MACD;IACF;EACF;;EAEc,MAAT6L,SAAS,CAAC9K,IAAD,EAAO+K,KAAP,EAAc;IAC3B,OAAO/K,IAAP;EACD;;EAEe,MAAVgL,UAAU,CAACzD,EAAD,EAAK,CAAE;;AAneoC,C"}
1
+ {"version":3,"file":"s3.js","names":["MIN_PART_SIZE","MAX_PART_SIZE","MAX_PARTS_COUNT","MAX_OBJECT_SIZE","IDEAL_FRAGMENT_SIZE","Math","ceil","warn","createLogger","S3Handler","decorateWith","pRetry","wrap","delays","when","e","$metadata","httpStatusCode","onRetry","error","attemptNumber","delay","file","arguments","RemoteHandlerAbstract","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","_s3","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","_bucket","shift","_dir","join","type","_makeCopySource","_makeKey","_makePrefix","dir","prefix","_createParams","Bucket","Key","_multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","_isNotEmptyDir","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","_isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","queueSize","partSize","params","done","undefined","call","unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","Error","code","_unlink","DeleteObjectCommand","_list","NextContinuationToken","uniq","Set","Delimiter","ContinuationToken","IsTruncated","entry","CommonPrefixes","add","basename","_mkdir","_rename","copy","fd","ContentLength","_read","buffer","position","Range","bytesRead","copyStreamToBuffer","_rmdir","_rmtree","asyncEach","concurrency","_write","uploadParams","fileSize","resultBuffer","Buffer","alloc","max","bytesWritten","copyMultipartParams","prefixSize","suffixOffset","suffixSize","hasSuffix","editBuffer","editBufferOffset","prefixPosition","fragmentsCount","floor","prefixFragmentSize","prefixLastFragmentSize","i","fragmentEnd","assert","strictEqual","range","copyPrefixParams","part","downloadParams","prefixBuffer","createBufferFromStream","concat","complementSize","complementOffset","prefixRange","complementBuffer","editParams","editPart","UploadPartCommand","suffixFragments","suffixFragmentOffset","suffixRange","copySuffixParams","suffixPart","_openFile","flags","_closeFile","useVhdDirectory"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n UploadPartCommand,\n UploadPartCopyCommand,\n} from '@aws-sdk/client-s3'\nimport { Upload } from '@aws-sdk/lib-storage'\nimport { NodeHttpHandler } from '@aws-sdk/node-http-handler'\nimport { getApplyMd5BodyChecksumPlugin } from '@aws-sdk/middleware-apply-body-checksum'\nimport assert from 'assert'\nimport { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport pRetry from 'promise-toolbox/retry'\nimport { createLogger } from '@xen-orchestra/log'\nimport { decorateWith } from '@vates/decorate-with'\nimport { PassThrough, pipeline } from 'stream'\nimport { parse } from 'xo-remote-parser'\nimport copyStreamToBuffer from './_copyStreamToBuffer.js'\nimport createBufferFromStream from './_createBufferFromStream.js'\nimport guessAwsRegion from './_guessAwsRegion.js'\nimport RemoteHandlerAbstract from './abstract'\nimport { basename, join, split } from './_path'\nimport { asyncEach } from '@vates/async-each'\n\n// endpoints https://docs.aws.amazon.com/general/latest/gr/s3.html\n\n// limits: https://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html\nconst MIN_PART_SIZE = 1024 * 1024 * 5 // 5MB\nconst MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst MAX_PARTS_COUNT = 10000\nconst MAX_OBJECT_SIZE = 1024 * 1024 * 1024 * 1024 * 5 // 5TB\nconst IDEAL_FRAGMENT_SIZE = Math.ceil(MAX_OBJECT_SIZE / MAX_PARTS_COUNT) // the smallest fragment size that still allows a 5TB upload in 10000 fragments, about 524MB\n\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n constructor(remote, _opts) {\n super(remote)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n } = parse(remote.url)\n\n this._s3 = new S3Client({\n apiVersion: '2006-03-01',\n endpoint: `${protocol}://${host}`,\n forcePathStyle: true,\n credentials: {\n accessKeyId: username,\n secretAccessKey: password,\n },\n tls: protocol === 'https',\n region,\n requestHandler: new NodeHttpHandler({\n socketTimeout: 600000,\n httpAgent: new HttpAgent({\n keepAlive: true,\n }),\n httpsAgent: new HttpsAgent({\n rejectUnauthorized: !allowUnauthorized,\n keepAlive: true,\n }),\n }),\n })\n\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n this._s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this._s3.config))\n\n const parts = split(path)\n this._bucket = parts.shift()\n this._dir = join(...parts)\n }\n\n get type() {\n return 's3'\n }\n\n _makeCopySource(path) {\n return join(this._bucket, this._dir, path)\n }\n\n _makeKey(file) {\n return join(this._dir, file)\n }\n\n _makePrefix(dir) {\n const prefix = join(this._dir, dir, '/')\n\n // no prefix for root\n if (prefix !== './') {\n return prefix\n }\n }\n\n _createParams(file) {\n return { Bucket: this._bucket, Key: this._makeKey(file) }\n }\n\n async _multipartCopy(oldPath, newPath) {\n const size = await this._getSize(oldPath)\n const CopySource = this._makeCopySource(oldPath)\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand({ ...this._createParams(newPath) }))\n try {\n const parts = []\n let start = 0\n while (start < size) {\n const partNumber = parts.length + 1\n const upload = await this._s3.send(\n new UploadPartCopyCommand({\n ...multipartParams,\n CopySource,\n CopySourceRange: `bytes=${start}-${Math.min(start + MAX_PART_SIZE, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += MAX_PART_SIZE\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n\n async _copy(oldPath, newPath) {\n const CopySource = this._makeCopySource(oldPath)\n try {\n await this._s3.send(\n new CopyObjectCommand({\n ...this._createParams(newPath),\n CopySource,\n })\n )\n } catch (e) {\n // object > 5GB must be copied part by part\n if (e.name === 'EntityTooLarge') {\n return this._multipartCopy(oldPath, newPath)\n }\n throw e\n }\n }\n\n async _isNotEmptyDir(path) {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n MaxKeys: 1,\n Prefix: this._makePrefix(path),\n })\n )\n return result.Contents?.length > 0\n }\n\n async _isFile(path) {\n try {\n await this._s3.send(new HeadObjectCommand(this._createParams(path)))\n return true\n } catch (error) {\n if (error.name === 'NotFound') {\n return false\n }\n throw error\n }\n }\n\n async _outputStream(path, input, { validator }) {\n // Workaround for \"ReferenceError: ReadableStream is not defined\"\n // https://github.com/aws/aws-sdk-js-v3/issues/2522\n const Body = new PassThrough()\n pipeline(input, Body, () => {})\n\n const upload = new Upload({\n client: this._s3,\n queueSize: 1,\n partSize: IDEAL_FRAGMENT_SIZE,\n params: {\n ...this._createParams(path),\n Body,\n },\n })\n\n await upload.done()\n\n if (validator !== undefined) {\n try {\n await validator.call(this, path)\n } catch (error) {\n await this.unlink(path)\n throw error\n }\n }\n }\n\n // some objectstorage provider like backblaze, can answer a 500/503 routinely\n // in this case we should retry, and let their load balancing do its magic\n // https://www.backblaze.com/b2/docs/calling.html#error_handling\n @decorateWith(pRetry.wrap, {\n delays: [100, 200, 500, 1000, 2000],\n when: e => e.$metadata?.httpStatusCode === 500,\n onRetry(error) {\n warn('retrying writing file', {\n attemptNumber: this.attemptNumber,\n delay: this.delay,\n error,\n file: this.arguments[0],\n })\n },\n })\n async _writeFile(file, data, options) {\n return this._s3.send(\n new PutObjectCommand({\n ...this._createParams(file),\n Body: data,\n })\n )\n }\n\n async _createReadStream(path, options) {\n try {\n return (await this._s3.send(new GetObjectCommand(this._createParams(path)))).Body\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file '${path}'`)\n error.code = 'ENOENT'\n error.path = path\n throw error\n }\n throw e\n }\n }\n\n async _unlink(path) {\n await this._s3.send(new DeleteObjectCommand(this._createParams(path)))\n\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`EISDIR: illegal operation on a directory, unlink '${path}'`)\n error.code = 'EISDIR'\n error.path = path\n throw error\n }\n }\n\n async _list(dir) {\n let NextContinuationToken\n const uniq = new Set()\n const Prefix = this._makePrefix(dir)\n\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n Delimiter: '/',\n // will only return path until delimiters\n ContinuationToken: NextContinuationToken,\n })\n )\n\n if (result.IsTruncated) {\n warn(`need pagination to browse the directory ${dir} completely`)\n NextContinuationToken = result.NextContinuationToken\n } else {\n NextContinuationToken = undefined\n }\n\n // subdirectories\n for (const entry of result.CommonPrefixes ?? []) {\n uniq.add(basename(entry.Prefix))\n }\n\n // files\n for (const entry of result.Contents ?? []) {\n uniq.add(basename(entry.Key))\n }\n } while (NextContinuationToken !== undefined)\n\n return [...uniq]\n }\n\n async _mkdir(path) {\n if (await this._isFile(path)) {\n const error = new Error(`ENOTDIR: file already exists, mkdir '${path}'`)\n error.code = 'ENOTDIR'\n error.path = path\n throw error\n }\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // s3 doesn't have a rename operation, so copy + delete source\n async _rename(oldPath, newPath) {\n await this.copy(oldPath, newPath)\n await this._s3.send(new DeleteObjectCommand(this._createParams(oldPath)))\n }\n\n async _getSize(file) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const result = await this._s3.send(new HeadObjectCommand(this._createParams(file)))\n return +result.ContentLength\n }\n\n async _read(file, buffer, position = 0) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const params = this._createParams(file)\n params.Range = `bytes=${position}-${position + buffer.length - 1}`\n try {\n const result = await this._s3.send(new GetObjectCommand(params))\n const bytesRead = await copyStreamToBuffer(result.Body, buffer)\n return { bytesRead, buffer }\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n if (await this._isNotEmptyDir(file)) {\n const error = new Error(`${file} is a directory`)\n error.code = 'EISDIR'\n error.path = file\n throw error\n }\n }\n throw e\n }\n }\n\n async _rmdir(path) {\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`ENOTEMPTY: directory not empty, rmdir '${path}`)\n error.code = 'ENOTEMPTY'\n error.path = path\n throw error\n }\n\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // reimplement _rmtree to handle efficiantly path with more than 1000 entries in trees\n // @todo : use parallel processing for unlink\n async _rmtree(path) {\n let NextContinuationToken\n const Prefix = this._makePrefix(path)\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n ContinuationToken: NextContinuationToken,\n })\n )\n\n NextContinuationToken = result.IsTruncated ? result.NextContinuationToken : undefined\n await asyncEach(\n result.Contents ?? [],\n async ({ Key }) => {\n // _unlink will add the prefix, but Key contains everything\n // also we don't need to check if we delete a directory, since the list only return files\n await this._s3.send(\n new DeleteObjectCommand({\n Bucket: this._bucket,\n Key,\n })\n )\n },\n {\n concurrency: 16,\n }\n )\n } while (NextContinuationToken !== undefined)\n }\n\n async _write(file, buffer, position) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const uploadParams = this._createParams(file)\n let fileSize\n try {\n fileSize = +(await this._s3.send(new HeadObjectCommand(uploadParams))).ContentLength\n } catch (e) {\n if (e.name === 'NotFound') {\n fileSize = 0\n } else {\n throw e\n }\n }\n if (fileSize < MIN_PART_SIZE) {\n const resultBuffer = Buffer.alloc(Math.max(fileSize, position + buffer.length))\n if (fileSize !== 0) {\n const result = await this._s3.send(new GetObjectCommand(uploadParams))\n await copyStreamToBuffer(result.Body, resultBuffer)\n } else {\n Buffer.alloc(0).copy(resultBuffer)\n }\n buffer.copy(resultBuffer, position)\n await this._s3.send(\n new PutObjectCommand({\n ...uploadParams,\n Body: resultBuffer,\n })\n )\n return { buffer, bytesWritten: buffer.length }\n } else {\n // using this trick: https://stackoverflow.com/a/38089437/72637\n // multipart fragments have a minimum size of 5Mo and a max of 5Go unless they are last\n // splitting the file in 3 parts: [prefix, edit, suffix]\n // if `prefix` is bigger than 5Mo, it will be sourced from uploadPartCopy()\n // otherwise otherwise it will be downloaded, concatenated to `edit`\n // `edit` will always be an upload part\n // `suffix` will always be sourced from uploadPartCopy()\n // Then everything will be sliced in 5Gb parts before getting uploaded\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand(uploadParams))\n const copyMultipartParams = {\n ...multipartParams,\n CopySource: this._makeCopySource(file),\n }\n try {\n const parts = []\n const prefixSize = position\n let suffixOffset = prefixSize + buffer.length\n let suffixSize = Math.max(0, fileSize - suffixOffset)\n let hasSuffix = suffixSize > 0\n let editBuffer = buffer\n let editBufferOffset = position\n let partNumber = 1\n let prefixPosition = 0\n // use floor() so that last fragment is handled in the if bellow\n let fragmentsCount = Math.floor(prefixSize / MAX_PART_SIZE)\n const prefixFragmentSize = MAX_PART_SIZE\n let prefixLastFragmentSize = prefixSize - prefixFragmentSize * fragmentsCount\n if (prefixLastFragmentSize >= MIN_PART_SIZE) {\n // the last fragment of the prefix is smaller than MAX_PART_SIZE, but bigger than the minimum\n // so we can copy it too\n fragmentsCount++\n prefixLastFragmentSize = 0\n }\n for (let i = 0; i < fragmentsCount; i++) {\n const fragmentEnd = Math.min(prefixPosition + prefixFragmentSize, prefixSize)\n assert.strictEqual(fragmentEnd - prefixPosition <= MAX_PART_SIZE, true)\n const range = `bytes=${prefixPosition}-${fragmentEnd - 1}`\n const copyPrefixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: range }\n const part = await this._s3.send(new UploadPartCopyCommand(copyPrefixParams))\n parts.push({ ETag: part.CopyPartResult.ETag, PartNumber: copyPrefixParams.PartNumber })\n prefixPosition += prefixFragmentSize\n }\n if (prefixLastFragmentSize) {\n // grab everything from the prefix that was too small to be copied, download and merge to the edit buffer.\n const downloadParams = { ...uploadParams, Range: `bytes=${prefixPosition}-${prefixSize - 1}` }\n let prefixBuffer\n if (prefixSize > 0) {\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n prefixBuffer = await createBufferFromStream(result.Body)\n } else {\n prefixBuffer = Buffer.alloc(0)\n }\n editBuffer = Buffer.concat([prefixBuffer, buffer])\n editBufferOffset -= prefixLastFragmentSize\n }\n if (hasSuffix && editBuffer.length < MIN_PART_SIZE) {\n // the edit fragment is too short and is not the last fragment\n // let's steal from the suffix fragment to reach the minimum size\n // the suffix might be too short and itself entirely absorbed in the edit fragment, making it the last one.\n const complementSize = Math.min(MIN_PART_SIZE - editBuffer.length, suffixSize)\n const complementOffset = editBufferOffset + editBuffer.length\n suffixOffset += complementSize\n suffixSize -= complementSize\n hasSuffix = suffixSize > 0\n const prefixRange = `bytes=${complementOffset}-${complementOffset + complementSize - 1}`\n const downloadParams = { ...uploadParams, Range: prefixRange }\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n const complementBuffer = await createBufferFromStream(result.Body)\n editBuffer = Buffer.concat([editBuffer, complementBuffer])\n }\n const editParams = { ...multipartParams, Body: editBuffer, PartNumber: partNumber++ }\n const editPart = await this._s3.send(new UploadPartCommand(editParams))\n parts.push({ ETag: editPart.ETag, PartNumber: editParams.PartNumber })\n if (hasSuffix) {\n // use ceil because the last fragment can be arbitrarily small.\n const suffixFragments = Math.ceil(suffixSize / MAX_PART_SIZE)\n let suffixFragmentOffset = suffixOffset\n for (let i = 0; i < suffixFragments; i++) {\n const fragmentEnd = suffixFragmentOffset + MAX_PART_SIZE\n assert.strictEqual(Math.min(fileSize, fragmentEnd) - suffixFragmentOffset <= MAX_PART_SIZE, true)\n const suffixRange = `bytes=${suffixFragmentOffset}-${Math.min(fileSize, fragmentEnd) - 1}`\n const copySuffixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: suffixRange }\n const suffixPart = (await this._s3.send(new UploadPartCopyCommand(copySuffixParams))).CopyPartResult\n parts.push({ ETag: suffixPart.ETag, PartNumber: copySuffixParams.PartNumber })\n suffixFragmentOffset = fragmentEnd\n }\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n }\n\n async _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n useVhdDirectory() {\n return true\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@xen-orchestra/fs",
4
- "version": "1.0.2",
4
+ "version": "2.0.0",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "description": "The File System for Xen Orchestra backups.",
7
7
  "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@xen-orchestra/fs",
@@ -26,7 +26,7 @@
26
26
  "@aws-sdk/node-http-handler": "^3.54.0",
27
27
  "@marsaud/smb2": "^0.18.0",
28
28
  "@sindresorhus/df": "^3.1.1",
29
- "@vates/async-each": "^0.1.0",
29
+ "@vates/async-each": "^1.0.0",
30
30
  "@vates/coalesce-calls": "^0.1.0",
31
31
  "@vates/decorate-with": "^2.0.0",
32
32
  "@xen-orchestra/async-map": "^0.1.2",
@@ -42,7 +42,7 @@
42
42
  "proper-lockfile": "^4.1.2",
43
43
  "readable-stream": "^3.0.6",
44
44
  "through2": "^4.0.2",
45
- "xo-remote-parser": "^0.8.0"
45
+ "xo-remote-parser": "^0.9.1"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@babel/cli": "^7.0.0",
@@ -50,7 +50,6 @@
50
50
  "@babel/plugin-proposal-decorators": "^7.1.6",
51
51
  "@babel/plugin-proposal-function-bind": "^7.0.0",
52
52
  "@babel/preset-env": "^7.8.0",
53
- "async-iterator-to-stream": "^1.1.0",
54
53
  "babel-plugin-lodash": "^3.3.2",
55
54
  "cross-env": "^7.0.2",
56
55
  "dotenv": "^16.0.0",