@xen-orchestra/fs 4.1.0 → 4.1.2
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/_encryptor.js +2 -4
- package/dist/_encryptor.js.map +1 -1
- package/dist/abstract.js +7 -2
- package/dist/abstract.js.map +1 -1
- package/dist/s3.js +45 -3
- package/dist/s3.js.map +1 -1
- package/package.json +2 -2
package/dist/_encryptor.js
CHANGED
|
@@ -12,10 +12,8 @@ const {
|
|
|
12
12
|
readChunk
|
|
13
13
|
} = require('@vates/read-chunk');
|
|
14
14
|
const crypto = require('crypto');
|
|
15
|
-
const DEFAULT_ENCRYPTION_ALGORITHM = 'aes-256-gcm';
|
|
16
|
-
exports.
|
|
17
|
-
const UNENCRYPTED_ALGORITHM = 'none';
|
|
18
|
-
exports.UNENCRYPTED_ALGORITHM = UNENCRYPTED_ALGORITHM;
|
|
15
|
+
const DEFAULT_ENCRYPTION_ALGORITHM = exports.DEFAULT_ENCRYPTION_ALGORITHM = 'aes-256-gcm';
|
|
16
|
+
const UNENCRYPTED_ALGORITHM = exports.UNENCRYPTED_ALGORITHM = 'none';
|
|
19
17
|
function isLegacyEncryptionAlgorithm(algorithm) {
|
|
20
18
|
return algorithm !== UNENCRYPTED_ALGORITHM && algorithm !== DEFAULT_ENCRYPTION_ALGORITHM;
|
|
21
19
|
}
|
package/dist/_encryptor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_encryptor.js","names":["pipeline","require","readChunk","crypto","DEFAULT_ENCRYPTION_ALGORITHM","exports","UNENCRYPTED_ALGORITHM","isLegacyEncryptionAlgorithm","algorithm","getEncryptor","key","undefined","id","ivLength","encryptData","buffer","encryptStream","stream","decryptData","decryptStream","info","getCipherInfo","keyLength","length","error","Error","getCiphers","code","mode","authTagLength","includes","input","source","iv","randomBytes","cipher","createCipheriv","Buffer","from","data","update","final","getAuthTag","encryptedStream","createDecipheriv","authTag","alloc","slice","fullData","concat","fullDataLength","setAuthTag","encrypted","decipher","decrypted","_getEncryptor"],"sources":["../src/_encryptor.js"],"sourcesContent":["const { pipeline } = require('node:stream')\nconst { readChunk } = require('@vates/read-chunk')\nconst crypto = require('crypto')\n\nexport const DEFAULT_ENCRYPTION_ALGORITHM = 'aes-256-gcm'\nexport const UNENCRYPTED_ALGORITHM = 'none'\n\nexport function isLegacyEncryptionAlgorithm(algorithm) {\n return algorithm !== UNENCRYPTED_ALGORITHM && algorithm !== DEFAULT_ENCRYPTION_ALGORITHM\n}\n\nfunction getEncryptor(algorithm = DEFAULT_ENCRYPTION_ALGORITHM, key) {\n if (key === undefined) {\n return {\n id: 'NULL_ENCRYPTOR',\n algorithm: 'none',\n key: 'none',\n ivLength: 0,\n encryptData: buffer => buffer,\n encryptStream: stream => stream,\n decryptData: buffer => buffer,\n decryptStream: stream => stream,\n }\n }\n const info = crypto.getCipherInfo(algorithm, { keyLength: key.length })\n if (info === undefined) {\n const error = new Error(\n `Either the algorithm ${algorithm} is not available, or the key length ${\n key.length\n } is incorrect. Supported algorithm are ${crypto.getCiphers()}`\n )\n error.code = 'BAD_ALGORITHM'\n throw error\n }\n const { ivLength, mode } = info\n const authTagLength = ['gcm', 'ccm', 'ocb'].includes(mode) ? 16 : 0\n\n function encryptStream(input) {\n return pipeline(\n input,\n async function* (source) {\n const iv = crypto.randomBytes(ivLength)\n const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv)\n yield iv\n for await (const data of source) {\n yield cipher.update(data)\n }\n yield cipher.final()\n // must write the auth tag at the end of the encryption stream\n if (authTagLength > 0) {\n yield cipher.getAuthTag()\n }\n },\n () => {}\n )\n }\n\n function decryptStream(encryptedStream) {\n return pipeline(\n encryptedStream,\n async function* (source) {\n /**\n * WARNING\n *\n * the crypted size has an initializtion vector + eventually an auth tag + a padding at the end\n * whe can't predict the decrypted size from the start of the encrypted size\n * thus, we can't set decrypted.length reliably\n *\n */\n\n const iv = await readChunk(source, ivLength)\n const cipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n let authTag = Buffer.alloc(0)\n for await (const data of source) {\n if (data.length >= authTagLength) {\n // fast path, no buffer concat\n yield cipher.update(authTag)\n authTag = data.slice(data.length - authTagLength)\n yield cipher.update(data.slice(0, data.length - authTagLength))\n } else {\n // slower since there is a concat\n const fullData = Buffer.concat([authTag, data])\n const fullDataLength = fullData.length\n if (fullDataLength > authTagLength) {\n authTag = fullData.slice(fullDataLength - authTagLength)\n yield cipher.update(fullData.slice(0, fullDataLength - authTagLength))\n } else {\n authTag = fullData\n }\n }\n }\n if (authTagLength > 0) {\n cipher.setAuthTag(authTag)\n }\n yield cipher.final()\n },\n () => {}\n )\n }\n\n function encryptData(buffer) {\n const iv = crypto.randomBytes(ivLength)\n const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv)\n const encrypted = cipher.update(buffer)\n return Buffer.concat([iv, encrypted, cipher.final(), authTagLength > 0 ? cipher.getAuthTag() : Buffer.alloc(0)])\n }\n\n function decryptData(buffer) {\n const iv = buffer.slice(0, ivLength)\n const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n let encrypted\n if (authTagLength > 0) {\n const authTag = buffer.slice(buffer.length - authTagLength)\n decipher.setAuthTag(authTag)\n encrypted = buffer.slice(ivLength, buffer.length - authTagLength)\n } else {\n encrypted = buffer.slice(ivLength)\n }\n const decrypted = decipher.update(encrypted)\n return Buffer.concat([decrypted, decipher.final()])\n }\n\n return {\n id: algorithm,\n algorithm,\n key,\n ivLength,\n encryptData,\n encryptStream,\n decryptData,\n decryptStream,\n }\n}\n\nexports._getEncryptor = getEncryptor\n"],"mappings":";;;;;;;AAAA,MAAM;EAAEA;AAAS,CAAC,GAAGC,OAAO,CAAC,aAAa,CAAC;AAC3C,MAAM;EAAEC;AAAU,CAAC,GAAGD,OAAO,CAAC,mBAAmB,CAAC;AAClD,MAAME,MAAM,GAAGF,OAAO,CAAC,QAAQ,CAAC;AAEzB,MAAMG,4BAA4B,
|
|
1
|
+
{"version":3,"file":"_encryptor.js","names":["pipeline","require","readChunk","crypto","DEFAULT_ENCRYPTION_ALGORITHM","exports","UNENCRYPTED_ALGORITHM","isLegacyEncryptionAlgorithm","algorithm","getEncryptor","key","undefined","id","ivLength","encryptData","buffer","encryptStream","stream","decryptData","decryptStream","info","getCipherInfo","keyLength","length","error","Error","getCiphers","code","mode","authTagLength","includes","input","source","iv","randomBytes","cipher","createCipheriv","Buffer","from","data","update","final","getAuthTag","encryptedStream","createDecipheriv","authTag","alloc","slice","fullData","concat","fullDataLength","setAuthTag","encrypted","decipher","decrypted","_getEncryptor"],"sources":["../src/_encryptor.js"],"sourcesContent":["const { pipeline } = require('node:stream')\nconst { readChunk } = require('@vates/read-chunk')\nconst crypto = require('crypto')\n\nexport const DEFAULT_ENCRYPTION_ALGORITHM = 'aes-256-gcm'\nexport const UNENCRYPTED_ALGORITHM = 'none'\n\nexport function isLegacyEncryptionAlgorithm(algorithm) {\n return algorithm !== UNENCRYPTED_ALGORITHM && algorithm !== DEFAULT_ENCRYPTION_ALGORITHM\n}\n\nfunction getEncryptor(algorithm = DEFAULT_ENCRYPTION_ALGORITHM, key) {\n if (key === undefined) {\n return {\n id: 'NULL_ENCRYPTOR',\n algorithm: 'none',\n key: 'none',\n ivLength: 0,\n encryptData: buffer => buffer,\n encryptStream: stream => stream,\n decryptData: buffer => buffer,\n decryptStream: stream => stream,\n }\n }\n const info = crypto.getCipherInfo(algorithm, { keyLength: key.length })\n if (info === undefined) {\n const error = new Error(\n `Either the algorithm ${algorithm} is not available, or the key length ${\n key.length\n } is incorrect. Supported algorithm are ${crypto.getCiphers()}`\n )\n error.code = 'BAD_ALGORITHM'\n throw error\n }\n const { ivLength, mode } = info\n const authTagLength = ['gcm', 'ccm', 'ocb'].includes(mode) ? 16 : 0\n\n function encryptStream(input) {\n return pipeline(\n input,\n async function* (source) {\n const iv = crypto.randomBytes(ivLength)\n const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv)\n yield iv\n for await (const data of source) {\n yield cipher.update(data)\n }\n yield cipher.final()\n // must write the auth tag at the end of the encryption stream\n if (authTagLength > 0) {\n yield cipher.getAuthTag()\n }\n },\n () => {}\n )\n }\n\n function decryptStream(encryptedStream) {\n return pipeline(\n encryptedStream,\n async function* (source) {\n /**\n * WARNING\n *\n * the crypted size has an initializtion vector + eventually an auth tag + a padding at the end\n * whe can't predict the decrypted size from the start of the encrypted size\n * thus, we can't set decrypted.length reliably\n *\n */\n\n const iv = await readChunk(source, ivLength)\n const cipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n let authTag = Buffer.alloc(0)\n for await (const data of source) {\n if (data.length >= authTagLength) {\n // fast path, no buffer concat\n yield cipher.update(authTag)\n authTag = data.slice(data.length - authTagLength)\n yield cipher.update(data.slice(0, data.length - authTagLength))\n } else {\n // slower since there is a concat\n const fullData = Buffer.concat([authTag, data])\n const fullDataLength = fullData.length\n if (fullDataLength > authTagLength) {\n authTag = fullData.slice(fullDataLength - authTagLength)\n yield cipher.update(fullData.slice(0, fullDataLength - authTagLength))\n } else {\n authTag = fullData\n }\n }\n }\n if (authTagLength > 0) {\n cipher.setAuthTag(authTag)\n }\n yield cipher.final()\n },\n () => {}\n )\n }\n\n function encryptData(buffer) {\n const iv = crypto.randomBytes(ivLength)\n const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv)\n const encrypted = cipher.update(buffer)\n return Buffer.concat([iv, encrypted, cipher.final(), authTagLength > 0 ? cipher.getAuthTag() : Buffer.alloc(0)])\n }\n\n function decryptData(buffer) {\n const iv = buffer.slice(0, ivLength)\n const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n let encrypted\n if (authTagLength > 0) {\n const authTag = buffer.slice(buffer.length - authTagLength)\n decipher.setAuthTag(authTag)\n encrypted = buffer.slice(ivLength, buffer.length - authTagLength)\n } else {\n encrypted = buffer.slice(ivLength)\n }\n const decrypted = decipher.update(encrypted)\n return Buffer.concat([decrypted, decipher.final()])\n }\n\n return {\n id: algorithm,\n algorithm,\n key,\n ivLength,\n encryptData,\n encryptStream,\n decryptData,\n decryptStream,\n }\n}\n\nexports._getEncryptor = getEncryptor\n"],"mappings":"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"}
|
package/dist/abstract.js
CHANGED
|
@@ -66,7 +66,7 @@ class PrefixWrapper {
|
|
|
66
66
|
return this.#prefix + (0, _path.normalize)(path);
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(), _dec2 = (0, _decoratorSynchronized.synchronized)(), (_class = class RemoteHandlerAbstract {
|
|
69
|
+
let RemoteHandlerAbstract = exports.default = (_dec = (0, _decoratorSynchronized.synchronized)(), _dec2 = (0, _decoratorSynchronized.synchronized)(), (_class = class RemoteHandlerAbstract {
|
|
70
70
|
#rawEncryptor;
|
|
71
71
|
get #encryptor() {
|
|
72
72
|
if (this.#rawEncryptor === undefined) {
|
|
@@ -165,6 +165,8 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
165
165
|
async outputStream(path, input, {
|
|
166
166
|
checksum = true,
|
|
167
167
|
dirMode,
|
|
168
|
+
maxStreamLength,
|
|
169
|
+
streamLength,
|
|
168
170
|
validator
|
|
169
171
|
} = {}) {
|
|
170
172
|
path = (0, _path.normalize)(path);
|
|
@@ -177,6 +179,8 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
177
179
|
}
|
|
178
180
|
await this._outputStream(path, input, {
|
|
179
181
|
dirMode,
|
|
182
|
+
maxStreamLength,
|
|
183
|
+
streamLength,
|
|
180
184
|
validator
|
|
181
185
|
});
|
|
182
186
|
if (checksum) {
|
|
@@ -586,6 +590,8 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
586
590
|
return this._rmtree(`${dir}/${file}`);
|
|
587
591
|
}
|
|
588
592
|
throw error;
|
|
593
|
+
}, {
|
|
594
|
+
concurrency: 2
|
|
589
595
|
}));
|
|
590
596
|
return this._rmtree(dir);
|
|
591
597
|
}
|
|
@@ -616,7 +622,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
616
622
|
return this.#encryptor.id !== 'NULL_ENCRYPTOR';
|
|
617
623
|
}
|
|
618
624
|
}, (_applyDecoratedDescriptor(_class.prototype, "forget", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, "forget"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "sync", [_dec2], Object.getOwnPropertyDescriptor(_class.prototype, "sync"), _class.prototype)), _class));
|
|
619
|
-
exports.default = RemoteHandlerAbstract;
|
|
620
625
|
{
|
|
621
626
|
const proto = RemoteHandlerAbstract.prototype;
|
|
622
627
|
for (const method of Object.getOwnPropertyNames(proto)) {
|
package/dist/abstract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract.js","names":["_assert","_interopRequireDefault","require","_getStream","_asyncEach","_coalesceCalls","_log","_promiseToolbox","_limitConcurrencyDecorator","_xoRemoteParser","_stream","_crypto","_decoratorSynchronized","_path","_checksum","_encryptor","_dec","_dec2","_class","obj","__esModule","default","_applyDecoratedDescriptor","target","property","decorators","descriptor","context","desc","Object","keys","forEach","key","enumerable","configurable","initializer","writable","slice","reverse","reduce","decorator","value","call","undefined","defineProperty","info","warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ENCRYPTION_DESC_FILENAME","ENCRYPTION_METADATA_FILENAME","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","prefix","constructor","handler","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","entry","i","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","rawEncryptor","encryptor","#encryptor","Error","remote","options","url","_remote","parse","highWaterMark","_highWaterMark","timeout","_timeout","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","createReadStream","checksum","ignoreMissingChecksum","end","start","assert","strictEqual","isEncrypted","stream","_createReadStream","fromEvent","_readFile","flags","validChecksumOfReadStream","String","trim","decryptStream","_getSize","outputStream","input","dirMode","validator","checksumStream","encryptStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","ivLength","__list","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mktree","mode","_mktree","data","encryptedData","encryptData","buffer","position","_read","__readFile","decryptData","#rename","createTree","p","_rename","Promise","all","dirname","__rename","__copy","_copy","_rmdir","catch","rmtree","_rmtree","sync","checkMetadata","canWriteMetadata","#canWriteMetadata","e","startsWith","createMetadata","#createMetadata","encryptionAlgorithm","encryptionKey","DEFAULT_ENCRYPTION_ALGORITHM","_getEncryptor","_writeFile","JSON","stringify","algorithm","__writeFile","randomUUID","#checkMetadata","json","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","ignoreErrors","_unlink","len","_truncate","__unlink","_write","__closeFile","fd","_closeFile","__mkdir","_mkdir","__openFile","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","resolve","tmpPath","basename","output","then","getStream","files","asyncEach","isPath","_writeFd","id","getOwnPropertyDescriptor","exports","proto","method","getOwnPropertyNames","publicName","hasOwn","createPrefixWrapperMethods","pPw","pRha","hasOwnProperty","name","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import assert from 'assert'\nimport getStream from 'get-stream'\nimport { asyncEach } from '@vates/async-each'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\nimport { DEFAULT_ENCRYPTION_ALGORITHM, _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('xo:fs:abstract')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ENCRYPTION_DESC_FILENAME = 'encryption.json'\nconst ENCRYPTION_METADATA_FILENAME = 'metadata.json'\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n #prefix\n\n constructor(handler, prefix) {\n this.#prefix = prefix\n\n // cannot be a private field because used by methods dynamically added\n // outside of the class\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this.#prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n // cannot be a private method because used by methods dynamically added\n // outside of the class\n _resolve(path) {\n return this.#prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n #rawEncryptor\n\n get #encryptor() {\n if (this.#rawEncryptor === undefined) {\n throw new Error(`Can't access to encryptor before remote synchronization`)\n }\n return this.#rawEncryptor\n }\n\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n //\n // Should not be called directly because:\n // - some concurrency limits may be applied which may lead to deadlocks\n // - some preprocessing may be applied on parameters that should not be done multiple times (e.g. prefixing paths)\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (options.end !== undefined || options.start !== undefined) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`)\n }\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n\n let stream = await timeout.call(\n this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }),\n this._timeout\n )\n\n // detect early errors\n await fromEvent(stream, 'readable')\n\n if (checksum) {\n try {\n const path = typeof file === 'string' ? file : file.path\n const checksum = await this._readFile(checksumFile(path), { flags: 'r' })\n\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n } catch (error) {\n if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {\n throw error\n }\n }\n }\n\n if (this.isEncrypted) {\n stream = this.#encryptor.decryptStream(stream)\n } else {\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n try {\n stream.length = await this._getSize(file)\n } catch (error) {\n // ignore errors\n }\n }\n }\n\n return stream\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n\n input = this.#encryptor.encryptStream(input)\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n validator,\n })\n if (checksum) {\n // using _outpuFile means the checksum will NOT be encrypted\n // it is by design to allow checking of encrypted files without the key\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n // when using encryption, the file size is aligned with the encryption block size ( 16 bytes )\n // that means that the size will be 1 to 16 bytes more than the content size + the initialized vector length (16 bytes)\n async getSize(file) {\n assert.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`)\n\n const size = await timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n return size - this.#encryptor.ivLength\n }\n\n async __list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n const encryptedData = this.#encryptor.encryptData(data)\n await this._outputFile(normalizePath(file), encryptedData, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`)\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async __readFile(file, { flags = 'r' } = {}) {\n const data = await this._readFile(normalizePath(file), { flags })\n return this.#encryptor.decryptData(data)\n }\n\n async #rename(oldPath, newPath, { checksum }, createTree = true) {\n try {\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n await p\n } catch (error) {\n // ENOENT can be a missing target directory OR a missing source\n if (error.code === 'ENOENT' && createTree) {\n await this._mktree(dirname(newPath))\n return this.#rename(oldPath, newPath, { checksum }, false)\n }\n throw error\n }\n }\n\n __rename(oldPath, newPath, { checksum = false } = {}) {\n return this.#rename(normalizePath(oldPath), normalizePath(newPath), { checksum })\n }\n\n async __copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n try {\n await this.#checkMetadata()\n } catch (error) {\n await this._forget()\n throw error\n }\n }\n\n async #canWriteMetadata() {\n const list = await this.__list('/', {\n filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME,\n })\n return list.length === 0\n }\n\n async #createMetadata() {\n const encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n this.#rawEncryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n\n await Promise.all([\n this._writeFile(normalizePath(ENCRYPTION_DESC_FILENAME), JSON.stringify({ algorithm: encryptionAlgorithm }), {\n flags: 'w',\n }), // not encrypted\n this.__writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async #checkMetadata() {\n let encryptionAlgorithm = 'none'\n let data\n try {\n // this file is not encrypted\n data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME), 'utf-8')\n const json = JSON.parse(data)\n encryptionAlgorithm = json.algorithm\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n }\n\n try {\n this.#rawEncryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n // this file is encrypted\n const data = await this.__readFile(ENCRYPTION_METADATA_FILENAME, 'utf-8')\n JSON.parse(data)\n } catch (error) {\n // can be enoent, bad algorithm, or broeken json ( bad key or algorithm)\n if (encryptionAlgorithm !== 'none') {\n if (await this.#canWriteMetadata()) {\n // any other error , but on empty remote => update with remote settings\n\n info('will update metadata of this remote')\n return this.#createMetadata()\n } else {\n warn(\n `The encryptionKey settings of this remote does not match the key used to create it. You won't be able to read any data from this remote`,\n { error }\n )\n // will probably send a ERR_OSSL_EVP_BAD_DECRYPT if key is incorrect\n throw error\n }\n }\n }\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async __unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`)\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async __writeFile(file, data, { flags = 'wx' } = {}) {\n const encryptedData = this.#encryptor.encryptData(data)\n await this._writeFile(normalizePath(file), encryptedData, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n dir = normalizePath(dir)\n\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await timeout.call(\n this._createOutputStream(tmpPath, {\n dirMode,\n flags: 'wx',\n }),\n this._timeout\n )\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.__rename(tmpPath, path)\n } catch (error) {\n await this.__unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncEach(files, file =>\n this._unlink(`${dir}/${file}`).catch(error => {\n // Unlink dir behavior is not consistent across platforms\n // https://github.com/nodejs/node-v0.x-archive/issues/5791\n if (error.code === 'EISDIR' || error.code === 'EPERM') {\n return this._rmtree(`${dir}/${file}`)\n }\n throw error\n })\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n\n get isEncrypted() {\n return this.#encryptor.id !== 'NULL_ENCRYPTOR'\n }\n}\n\n// from implementation methods, which names start with `__`, create public\n// accessors on which external behaviors can be added (e.g. concurrency limits, path rewriting)\n{\n const proto = RemoteHandlerAbstract.prototype\n for (const method of Object.getOwnPropertyNames(proto)) {\n if (method.startsWith('__')) {\n const publicName = method.slice(2)\n\n assert(!Object.hasOwn(proto, publicName))\n\n Object.defineProperty(proto, publicName, Object.getOwnPropertyDescriptor(proto, method))\n }\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abstract.js","names":["_assert","_interopRequireDefault","require","_getStream","_asyncEach","_coalesceCalls","_log","_promiseToolbox","_limitConcurrencyDecorator","_xoRemoteParser","_stream","_crypto","_decoratorSynchronized","_path","_checksum","_encryptor","_dec","_dec2","_class","obj","__esModule","default","_applyDecoratedDescriptor","target","property","decorators","descriptor","context","desc","Object","keys","forEach","key","enumerable","configurable","initializer","writable","slice","reverse","reduce","decorator","value","call","undefined","defineProperty","info","warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ENCRYPTION_DESC_FILENAME","ENCRYPTION_METADATA_FILENAME","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","prefix","constructor","handler","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","entry","i","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","exports","synchronized","rawEncryptor","encryptor","#encryptor","Error","remote","options","url","_remote","parse","highWaterMark","_highWaterMark","timeout","_timeout","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","createReadStream","checksum","ignoreMissingChecksum","end","start","assert","strictEqual","isEncrypted","stream","_createReadStream","fromEvent","_readFile","flags","validChecksumOfReadStream","String","trim","decryptStream","_getSize","outputStream","input","dirMode","maxStreamLength","streamLength","validator","checksumStream","encryptStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","ivLength","__list","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mktree","mode","_mktree","data","encryptedData","encryptData","buffer","position","_read","__readFile","decryptData","#rename","createTree","p","_rename","Promise","all","dirname","__rename","__copy","_copy","_rmdir","catch","rmtree","_rmtree","sync","checkMetadata","canWriteMetadata","#canWriteMetadata","e","startsWith","createMetadata","#createMetadata","encryptionAlgorithm","encryptionKey","DEFAULT_ENCRYPTION_ALGORITHM","_getEncryptor","_writeFile","JSON","stringify","algorithm","__writeFile","randomUUID","#checkMetadata","json","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","ignoreErrors","_unlink","len","_truncate","__unlink","_write","__closeFile","fd","_closeFile","__mkdir","_mkdir","__openFile","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","resolve","tmpPath","basename","output","then","getStream","files","asyncEach","concurrency","isPath","_writeFd","id","getOwnPropertyDescriptor","proto","method","getOwnPropertyNames","publicName","hasOwn","createPrefixWrapperMethods","pPw","pRha","hasOwnProperty","name","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import assert from 'assert'\nimport getStream from 'get-stream'\nimport { asyncEach } from '@vates/async-each'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\nimport { DEFAULT_ENCRYPTION_ALGORITHM, _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('xo:fs:abstract')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ENCRYPTION_DESC_FILENAME = 'encryption.json'\nconst ENCRYPTION_METADATA_FILENAME = 'metadata.json'\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n #prefix\n\n constructor(handler, prefix) {\n this.#prefix = prefix\n\n // cannot be a private field because used by methods dynamically added\n // outside of the class\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this.#prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n // cannot be a private method because used by methods dynamically added\n // outside of the class\n _resolve(path) {\n return this.#prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n #rawEncryptor\n\n get #encryptor() {\n if (this.#rawEncryptor === undefined) {\n throw new Error(`Can't access to encryptor before remote synchronization`)\n }\n return this.#rawEncryptor\n }\n\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n //\n // Should not be called directly because:\n // - some concurrency limits may be applied which may lead to deadlocks\n // - some preprocessing may be applied on parameters that should not be done multiple times (e.g. prefixing paths)\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (options.end !== undefined || options.start !== undefined) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`)\n }\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n\n let stream = await timeout.call(\n this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }),\n this._timeout\n )\n\n // detect early errors\n await fromEvent(stream, 'readable')\n\n if (checksum) {\n try {\n const path = typeof file === 'string' ? file : file.path\n const checksum = await this._readFile(checksumFile(path), { flags: 'r' })\n\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n } catch (error) {\n if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {\n throw error\n }\n }\n }\n\n if (this.isEncrypted) {\n stream = this.#encryptor.decryptStream(stream)\n } else {\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n try {\n stream.length = await this._getSize(file)\n } catch (error) {\n // ignore errors\n }\n }\n }\n\n return stream\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, maxStreamLength, streamLength, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n\n input = this.#encryptor.encryptStream(input)\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n maxStreamLength,\n streamLength,\n validator,\n })\n if (checksum) {\n // using _outpuFile means the checksum will NOT be encrypted\n // it is by design to allow checking of encrypted files without the key\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n // when using encryption, the file size is aligned with the encryption block size ( 16 bytes )\n // that means that the size will be 1 to 16 bytes more than the content size + the initialized vector length (16 bytes)\n async getSize(file) {\n assert.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`)\n\n const size = await timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n return size - this.#encryptor.ivLength\n }\n\n async __list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n const encryptedData = this.#encryptor.encryptData(data)\n await this._outputFile(normalizePath(file), encryptedData, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`)\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async __readFile(file, { flags = 'r' } = {}) {\n const data = await this._readFile(normalizePath(file), { flags })\n return this.#encryptor.decryptData(data)\n }\n\n async #rename(oldPath, newPath, { checksum }, createTree = true) {\n try {\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n await p\n } catch (error) {\n // ENOENT can be a missing target directory OR a missing source\n if (error.code === 'ENOENT' && createTree) {\n await this._mktree(dirname(newPath))\n return this.#rename(oldPath, newPath, { checksum }, false)\n }\n throw error\n }\n }\n\n __rename(oldPath, newPath, { checksum = false } = {}) {\n return this.#rename(normalizePath(oldPath), normalizePath(newPath), { checksum })\n }\n\n async __copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n try {\n await this.#checkMetadata()\n } catch (error) {\n await this._forget()\n throw error\n }\n }\n\n async #canWriteMetadata() {\n const list = await this.__list('/', {\n filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME,\n })\n return list.length === 0\n }\n\n async #createMetadata() {\n const encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n this.#rawEncryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n\n await Promise.all([\n this._writeFile(normalizePath(ENCRYPTION_DESC_FILENAME), JSON.stringify({ algorithm: encryptionAlgorithm }), {\n flags: 'w',\n }), // not encrypted\n this.__writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async #checkMetadata() {\n let encryptionAlgorithm = 'none'\n let data\n try {\n // this file is not encrypted\n data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME), 'utf-8')\n const json = JSON.parse(data)\n encryptionAlgorithm = json.algorithm\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n }\n\n try {\n this.#rawEncryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n // this file is encrypted\n const data = await this.__readFile(ENCRYPTION_METADATA_FILENAME, 'utf-8')\n JSON.parse(data)\n } catch (error) {\n // can be enoent, bad algorithm, or broeken json ( bad key or algorithm)\n if (encryptionAlgorithm !== 'none') {\n if (await this.#canWriteMetadata()) {\n // any other error , but on empty remote => update with remote settings\n\n info('will update metadata of this remote')\n return this.#createMetadata()\n } else {\n warn(\n `The encryptionKey settings of this remote does not match the key used to create it. You won't be able to read any data from this remote`,\n { error }\n )\n // will probably send a ERR_OSSL_EVP_BAD_DECRYPT if key is incorrect\n throw error\n }\n }\n }\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async __unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`)\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async __writeFile(file, data, { flags = 'wx' } = {}) {\n const encryptedData = this.#encryptor.encryptData(data)\n await this._writeFile(normalizePath(file), encryptedData, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n dir = normalizePath(dir)\n\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await timeout.call(\n this._createOutputStream(tmpPath, {\n dirMode,\n flags: 'wx',\n }),\n this._timeout\n )\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.__rename(tmpPath, path)\n } catch (error) {\n await this.__unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncEach(files, file =>\n this._unlink(`${dir}/${file}`).catch(\n 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 // real unlink concurrency will be 2**max directory depth\n { concurrency: 2 }\n )\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n\n get isEncrypted() {\n return this.#encryptor.id !== 'NULL_ENCRYPTOR'\n }\n}\n\n// from implementation methods, which names start with `__`, create public\n// accessors on which external behaviors can be added (e.g. concurrency limits, path rewriting)\n{\n const proto = RemoteHandlerAbstract.prototype\n for (const method of Object.getOwnPropertyNames(proto)) {\n if (method.startsWith('__')) {\n const publicName = method.slice(2)\n\n assert(!Object.hasOwn(proto, publicName))\n\n Object.defineProperty(proto, publicName, Object.getOwnPropertyDescriptor(proto, method))\n }\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,IAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAL,OAAA;AACA,IAAAM,0BAAA,GAAAN,OAAA;AACA,IAAAO,eAAA,GAAAP,OAAA;AACA,IAAAQ,OAAA,GAAAR,OAAA;AACA,IAAAS,OAAA,GAAAT,OAAA;AACA,IAAAU,sBAAA,GAAAV,OAAA;AAEA,IAAAW,KAAA,GAAAX,OAAA;AACA,IAAAY,SAAA,GAAAZ,OAAA;AACA,IAAAa,UAAA,GAAAb,OAAA;AAA0E,IAAAc,IAAA,EAAAC,KAAA,EAAAC,MAAA;AAAA,SAAAjB,uBAAAkB,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,0BAAAC,MAAA,EAAAC,QAAA,EAAAC,UAAA,EAAAC,UAAA,EAAAC,OAAA,QAAAC,IAAA,OAAAC,MAAA,CAAAC,IAAA,CAAAJ,UAAA,EAAAK,OAAA,WAAAC,GAAA,IAAAJ,IAAA,CAAAI,GAAA,IAAAN,UAAA,CAAAM,GAAA,OAAAJ,IAAA,CAAAK,UAAA,KAAAL,IAAA,CAAAK,UAAA,EAAAL,IAAA,CAAAM,YAAA,KAAAN,IAAA,CAAAM,YAAA,iBAAAN,IAAA,IAAAA,IAAA,CAAAO,WAAA,IAAAP,IAAA,CAAAQ,QAAA,WAAAR,IAAA,GAAAH,UAAA,CAAAY,KAAA,GAAAC,OAAA,GAAAC,MAAA,WAAAX,IAAA,EAAAY,SAAA,WAAAA,SAAA,CAAAjB,MAAA,EAAAC,QAAA,EAAAI,IAAA,KAAAA,IAAA,KAAAA,IAAA,OAAAD,OAAA,IAAAC,IAAA,CAAAO,WAAA,eAAAP,IAAA,CAAAa,KAAA,GAAAb,IAAA,CAAAO,WAAA,GAAAP,IAAA,CAAAO,WAAA,CAAAO,IAAA,CAAAf,OAAA,YAAAC,IAAA,CAAAO,WAAA,GAAAQ,SAAA,QAAAf,IAAA,CAAAO,WAAA,eAAAN,MAAA,CAAAe,cAAA,CAAArB,MAAA,EAAAC,QAAA,EAAAI,IAAA,GAAAA,IAAA,kBAAAA,IAAA;AAE1E,MAAM;EAAEiB,IAAI;EAAEC;AAAK,CAAC,GAAG,IAAAC,iBAAY,EAAC,gBAAgB,CAAC;AAErD,MAAMC,YAAY,GAAGC,IAAI,IAAIA,IAAI,GAAG,WAAW;AAC/C,MAAMC,WAAW,GAAGA,CAACC,MAAM,EAAEC,IAAI,KAAK;EACpC,MAAMC,OAAO,GAAGF,MAAM,CAAC,CAAC,CAAC,GAAGA,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG;EAC3C,OAAOC,IAAI,GAAGC,OAAO;AACvB,CAAC;AAED,MAAMC,eAAe,GAAG,GAAG;AAC3B,MAAMC,+BAA+B,GAAG,EAAE;AAE1C,MAAMC,wBAAwB,GAAG,iBAAiB;AAClD,MAAMC,4BAA4B,GAAG,eAAe;AAEpD,MAAMC,YAAY,GAAGC,KAAK,IAAI;EAC5B,IAAIA,KAAK,IAAI,IAAI,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;IAC5C,MAAMD,KAAK;EACb;AACF,CAAC;AAED,MAAME,IAAI,GAAGC,QAAQ,CAACC,SAAS;AAE/B,MAAMC,aAAa,CAAC;EAClB,CAACC,MAAM;EAEPC,WAAWA,CAACC,OAAO,EAAEF,MAAM,EAAE;IAC3B,IAAI,CAAC,CAACA,MAAM,GAAGA,MAAM;IAIrB,IAAI,CAACG,QAAQ,GAAGD,OAAO;EACzB;EAEA,IAAIE,IAAIA,CAAA,EAAG;IACT,OAAO,IAAI,CAACD,QAAQ,CAACC,IAAI;EAC3B;EAGA,MAAMC,IAAIA,CAACC,GAAG,EAAEC,IAAI,EAAE;IACpB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACL,QAAQ,CAACE,IAAI,CAAC,IAAI,CAACI,QAAQ,CAACH,GAAG,CAAC,EAAEC,IAAI,CAAC;IAClE,IAAIA,IAAI,IAAI,IAAI,IAAIA,IAAI,CAACG,UAAU,EAAE;MACnC,MAAMC,CAAC,GAAG,IAAI,CAAC,CAACX,MAAM,CAACY,MAAM;MAC7BJ,OAAO,CAAC1C,OAAO,CAAC,CAAC+C,KAAK,EAAEC,CAAC,EAAEN,OAAO,KAAK;QACrCA,OAAO,CAACM,CAAC,CAAC,GAAGD,KAAK,CAACzC,KAAK,CAACuC,CAAC,CAAC;MAC7B,CAAC,CAAC;IACJ;IACA,OAAOH,OAAO;EAChB;EAEAO,MAAMA,CAACC,OAAO,EAAEC,OAAO,EAAE;IACvB,OAAO,IAAI,CAACd,QAAQ,CAACY,MAAM,CAAC,IAAI,CAACN,QAAQ,CAACO,OAAO,CAAC,EAAE,IAAI,CAACP,QAAQ,CAACQ,OAAO,CAAC,CAAC;EAC7E;EAIAR,QAAQA,CAACS,IAAI,EAAE;IACb,OAAO,IAAI,CAAC,CAAClB,MAAM,GAAG,IAAAmB,eAAa,EAACD,IAAI,CAAC;EAC3C;AACF;AAAC,IAEoBE,qBAAqB,GAAAC,OAAA,CAAAjE,OAAA,IAAAL,IAAA,GAgJvC,IAAAuE,mCAAY,EAAC,CAAC,EAAAtE,KAAA,GA+Gd,IAAAsE,mCAAY,EAAC,CAAC,GAAArE,MAAA,GA/PF,MAAMmE,qBAAqB,CAAC;EACzC,CAACG,YAAY;EAEb,IAAI,CAACC,SAASC,CAAA,EAAG;IACf,IAAI,IAAI,CAAC,CAACF,YAAY,KAAK7C,SAAS,EAAE;MACpC,MAAM,IAAIgD,KAAK,CAAE,yDAAwD,CAAC;IAC5E;IACA,OAAO,IAAI,CAAC,CAACH,YAAY;EAC3B;EAEAtB,WAAWA,CAAC0B,MAAM,EAAEC,OAAO,GAAG,CAAC,CAAC,EAAE;IAChC,IAAID,MAAM,CAACE,GAAG,KAAK,SAAS,EAAE;MAC5B,IAAI,CAACC,OAAO,GAAGH,MAAM;IACvB,CAAC,MAAM;MACL,IAAI,CAACG,OAAO,GAAG;QAAE,GAAGH,MAAM;QAAE,GAAG,IAAAI,qBAAK,EAACJ,MAAM,CAACE,GAAG;MAAE,CAAC;MAClD,IAAI,IAAI,CAACC,OAAO,CAAC1B,IAAI,KAAK,IAAI,CAACA,IAAI,EAAE;QACnC,MAAM,IAAIsB,KAAK,CAAC,uBAAuB,CAAC;MAC1C;IACF;IACA;IAAC,CAAC;MAAEM,aAAa,EAAE,IAAI,CAACC,cAAc;MAAEC,OAAO,EAAE,IAAI,CAACC,QAAQ,GAAG9C;IAAgB,CAAC,GAAGuC,OAAO;IAE5F,MAAMQ,WAAW,GAAG,IAAAC,2CAAgB,EAACT,OAAO,CAACU,qBAAqB,IAAIhD,+BAA+B,CAAC;IACtG,IAAI,CAACiD,SAAS,GAAGH,WAAW,CAAC,IAAI,CAACG,SAAS,CAAC;IAC5C,IAAI,CAACC,IAAI,GAAGJ,WAAW,CAAC,IAAI,CAACI,IAAI,CAAC;IAClC,IAAI,CAACC,OAAO,GAAGL,WAAW,CAAC,IAAI,CAACK,OAAO,CAAC;IACxC,IAAI,CAACC,OAAO,GAAGN,WAAW,CAAC,IAAI,CAACM,OAAO,CAAC;IACxC,IAAI,CAACrC,IAAI,GAAG+B,WAAW,CAAC,IAAI,CAAC/B,IAAI,CAAC;IAClC,IAAI,CAACsC,KAAK,GAAGP,WAAW,CAAC,IAAI,CAACO,KAAK,CAAC;IACpC,IAAI,CAACC,QAAQ,GAAGR,WAAW,CAAC,IAAI,CAACQ,QAAQ,CAAC;IAC1C,IAAI,CAACC,UAAU,GAAGT,WAAW,CAAC,IAAI,CAACS,UAAU,CAAC;IAC9C,IAAI,CAACC,IAAI,GAAGV,WAAW,CAAC,IAAI,CAACU,IAAI,CAAC;IAClC,IAAI,CAACC,QAAQ,GAAGX,WAAW,CAAC,IAAI,CAACW,QAAQ,CAAC;IAC1C,IAAI,CAAChC,MAAM,GAAGqB,WAAW,CAAC,IAAI,CAACrB,MAAM,CAAC;IACtC,IAAI,CAACiC,KAAK,GAAGZ,WAAW,CAAC,IAAI,CAACY,KAAK,CAAC;IACpC,IAAI,CAACC,QAAQ,GAAGb,WAAW,CAAC,IAAI,CAACa,QAAQ,CAAC;IAC1C,IAAI,CAACC,MAAM,GAAGd,WAAW,CAAC,IAAI,CAACc,MAAM,CAAC;IACtC,IAAI,CAACC,KAAK,GAAGf,WAAW,CAAC,IAAI,CAACe,KAAK,CAAC;IACpC,IAAI,CAACC,SAAS,GAAGhB,WAAW,CAAC,IAAI,CAACgB,SAAS,CAAC;IAE5C,IAAI,CAACC,OAAO,GAAG,IAAAC,4BAAa,EAAC,IAAI,CAACD,OAAO,CAAC;IAC1C,IAAI,CAACE,KAAK,GAAG,IAAAD,4BAAa,EAAC,IAAI,CAACC,KAAK,CAAC;EACxC;EAQA,IAAInD,IAAIA,CAAA,EAAG;IACT,MAAM,IAAIsB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA8B,SAASA,CAACxD,MAAM,EAAE;IAChBA,MAAM,GAAG,IAAAmB,eAAa,EAACnB,MAAM,CAAC;IAC9B,OAAOA,MAAM,KAAK,GAAG,GAAG,IAAI,GAAG,IAAID,aAAa,CAAC,IAAI,EAAEC,MAAM,CAAC;EAChE;EAEA,MAAMyD,gBAAgBA,CAACzE,IAAI,EAAE;IAAE0E,QAAQ,GAAG,KAAK;IAAEC,qBAAqB,GAAG,KAAK;IAAE,GAAG/B;EAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;IACjG,IAAIA,OAAO,CAACgC,GAAG,KAAKlF,SAAS,IAAIkD,OAAO,CAACiC,KAAK,KAAKnF,SAAS,EAAE;MAC5DoF,eAAM,CAACC,WAAW,CAAC,IAAI,CAACC,WAAW,EAAE,KAAK,EAAG,uDAAsDhF,IAAK,EAAC,CAAC;IAC5G;IACA,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;MAC5BA,IAAI,GAAG,IAAAmC,eAAa,EAACnC,IAAI,CAAC;IAC5B;IAEA,IAAIiF,MAAM,GAAG,MAAM/B,uBAAO,CAACzD,IAAI,CAC7B,IAAI,CAACyF,iBAAiB,CAAClF,IAAI,EAAE;MAAE,GAAG4C,OAAO;MAAEI,aAAa,EAAE,IAAI,CAACC;IAAe,CAAC,CAAC,EAChF,IAAI,CAACE,QACP,CAAC;IAGD,MAAM,IAAAgC,yBAAS,EAACF,MAAM,EAAE,UAAU,CAAC;IAEnC,IAAIP,QAAQ,EAAE;MACZ,IAAI;QACF,MAAMxC,IAAI,GAAG,OAAOlC,IAAI,KAAK,QAAQ,GAAGA,IAAI,GAAGA,IAAI,CAACkC,IAAI;QACxD,MAAMwC,QAAQ,GAAG,MAAM,IAAI,CAACU,SAAS,CAACrF,YAAY,CAACmC,IAAI,CAAC,EAAE;UAAEmD,KAAK,EAAE;QAAI,CAAC,CAAC;QAEzE,MAAM;UAAEzD;QAAO,CAAC,GAAGqD,MAAM;QACzBA,MAAM,GAAG,IAAAK,mCAAyB,EAACL,MAAM,EAAEM,MAAM,CAACb,QAAQ,CAAC,CAACc,IAAI,CAAC,CAAC,CAAC;QACnEP,MAAM,CAACrD,MAAM,GAAGA,MAAM;MACxB,CAAC,CAAC,OAAOlB,KAAK,EAAE;QACd,IAAI,EAAEiE,qBAAqB,IAAIjE,KAAK,CAACC,IAAI,KAAK,QAAQ,CAAC,EAAE;UACvD,MAAMD,KAAK;QACb;MACF;IACF;IAEA,IAAI,IAAI,CAACsE,WAAW,EAAE;MACpBC,MAAM,GAAG,IAAI,CAAC,CAACzC,SAAS,CAACiD,aAAa,CAACR,MAAM,CAAC;IAChD,CAAC,MAAM;MAEL,IAAIA,MAAM,CAACrD,MAAM,KAAKlC,SAAS,IAAIkD,OAAO,CAACgC,GAAG,KAAKlF,SAAS,IAAIkD,OAAO,CAACiC,KAAK,KAAKnF,SAAS,EAAE;QAC3F,IAAI;UACFuF,MAAM,CAACrD,MAAM,GAAG,MAAM,IAAI,CAAC8D,QAAQ,CAAC1F,IAAI,CAAC;QAC3C,CAAC,CAAC,OAAOU,KAAK,EAAE,CAEhB;MACF;IACF;IAEA,OAAOuE,MAAM;EACf;EAYA,MAAMU,YAAYA,CAACzD,IAAI,EAAE0D,KAAK,EAAE;IAAElB,QAAQ,GAAG,IAAI;IAAEmB,OAAO;IAAEC,eAAe;IAAEC,YAAY;IAAEC;EAAU,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3G9D,IAAI,GAAG,IAAAC,eAAa,EAACD,IAAI,CAAC;IAC1B,IAAI+D,cAAc;IAElBL,KAAK,GAAG,IAAI,CAAC,CAACpD,SAAS,CAAC0D,aAAa,CAACN,KAAK,CAAC;IAC5C,IAAIlB,QAAQ,EAAE;MACZuB,cAAc,GAAG,IAAAE,8BAAoB,EAAC,CAAC;MACvC,IAAAC,gBAAQ,EAACR,KAAK,EAAEK,cAAc,EAAErF,IAAI,CAAC;MACrCgF,KAAK,GAAGK,cAAc;IACxB;IACA,MAAM,IAAI,CAACI,aAAa,CAACnE,IAAI,EAAE0D,KAAK,EAAE;MACpCC,OAAO;MACPC,eAAe;MACfC,YAAY;MACZC;IACF,CAAC,CAAC;IACF,IAAItB,QAAQ,EAAE;MAGZ,MAAM,IAAI,CAAC4B,WAAW,CAACvG,YAAY,CAACmC,IAAI,CAAC,EAAE,MAAM+D,cAAc,CAACvB,QAAQ,EAAE;QAAEmB,OAAO;QAAER,KAAK,EAAE;MAAK,CAAC,CAAC;IACrG;EACF;EAQA,MACMkB,MAAMA,CAAA,EAAG;IACb,MAAM,IAAI,CAAClC,OAAO,CAAC,CAAC;EACtB;EAEA,MAAMZ,OAAOA,CAAA,EAAG;IACd,OAAOP,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAAC+G,QAAQ,CAAC,CAAC,EAAE,IAAI,CAACrD,QAAQ,CAAC;EACrD;EAIA,MAAMO,OAAOA,CAAC1D,IAAI,EAAE;IAClB8E,eAAM,CAACC,WAAW,CAAC,IAAI,CAACC,WAAW,EAAE,KAAK,EAAG,2CAA0ChF,IAAK,EAAC,CAAC;IAE9F,MAAMG,IAAI,GAAG,MAAM+C,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAACiG,QAAQ,CAAC,OAAO1F,IAAI,KAAK,QAAQ,GAAG,IAAAmC,eAAa,EAACnC,IAAI,CAAC,GAAGA,IAAI,CAAC,EAAE,IAAI,CAACmD,QAAQ,CAAC;IACpH,OAAOhD,IAAI,GAAG,IAAI,CAAC,CAACqC,SAAS,CAACiE,QAAQ;EACxC;EAEA,MAAMC,MAAMA,CAACpF,GAAG,EAAE;IAAEqF,MAAM;IAAEC,aAAa,GAAG,KAAK;IAAElF,UAAU,GAAG;EAAM,CAAC,GAAG,CAAC,CAAC,EAAE;IAC5E,IAAI;MACF,MAAMmF,UAAU,GAAG,IAAA1E,eAAa,EAACb,GAAG,CAAC;MACrCA,GAAG,GAAG,IAAAa,eAAa,EAACb,GAAG,CAAC;MAExB,IAAIE,OAAO,GAAG,MAAM0B,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAACqH,KAAK,CAACxF,GAAG,CAAC,EAAE,IAAI,CAAC6B,QAAQ,CAAC;MAChE,IAAIwD,MAAM,KAAKjH,SAAS,EAAE;QACxB8B,OAAO,GAAGA,OAAO,CAACmF,MAAM,CAACA,MAAM,CAAC;MAClC;MAEA,IAAIjF,UAAU,EAAE;QACdF,OAAO,CAAC1C,OAAO,CAAC,CAAC+C,KAAK,EAAEC,CAAC,KAAK;UAC5BN,OAAO,CAACM,CAAC,CAAC,GAAG+E,UAAU,GAAG,GAAG,GAAGhF,KAAK;QACvC,CAAC,CAAC;MACJ;MAEA,OAAOL,OAAO;IAChB,CAAC,CAAC,OAAOd,KAAK,EAAE;MACd,IAAIkG,aAAa,IAAI,CAAAlG,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEC,IAAI,MAAK,QAAQ,EAAE;QAC7C,OAAO,EAAE;MACX;MACA,MAAMD,KAAK;IACb;EACF;EAEA,MAAMqG,IAAIA,CAAC7E,IAAI,EAAE;IACfA,IAAI,GAAG,IAAAC,eAAa,EAACD,IAAI,CAAC;IAC1B,OAAO;MAAE8E,OAAO,EAAE,MAAM,IAAI,CAACC,KAAK,CAAC/E,IAAI;IAAE,CAAC;EAC5C;EAEA,MAAMgF,MAAMA,CAAC5F,GAAG,EAAE;IAAE6F;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC/B,MAAM,IAAI,CAACC,OAAO,CAAC,IAAAjF,eAAa,EAACb,GAAG,CAAC,EAAE;MAAE6F;IAAK,CAAC,CAAC;EAClD;EAEA,MAAMtD,UAAUA,CAAC7D,IAAI,EAAEqH,IAAI,EAAE;IAAExB,OAAO;IAAER,KAAK,GAAG;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3D,MAAMiC,aAAa,GAAG,IAAI,CAAC,CAAC9E,SAAS,CAAC+E,WAAW,CAACF,IAAI,CAAC;IACvD,MAAM,IAAI,CAACf,WAAW,CAAC,IAAAnE,eAAa,EAACnC,IAAI,CAAC,EAAEsH,aAAa,EAAE;MAAEzB,OAAO;MAAER;IAAM,CAAC,CAAC;EAChF;EAEA,MAAMvB,IAAIA,CAAC9D,IAAI,EAAEwH,MAAM,EAAEC,QAAQ,EAAE;IACjC3C,eAAM,CAACC,WAAW,CAAC,IAAI,CAACC,WAAW,EAAE,KAAK,EAAG,wCAAuChF,IAAK,EAAC,CAAC;IAC3F,OAAO,IAAI,CAAC0H,KAAK,CAAC,OAAO1H,IAAI,KAAK,QAAQ,GAAG,IAAAmC,eAAa,EAACnC,IAAI,CAAC,GAAGA,IAAI,EAAEwH,MAAM,EAAEC,QAAQ,CAAC;EAC5F;EAEA,MAAME,UAAUA,CAAC3H,IAAI,EAAE;IAAEqF,KAAK,GAAG;EAAI,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C,MAAMgC,IAAI,GAAG,MAAM,IAAI,CAACjC,SAAS,CAAC,IAAAjD,eAAa,EAACnC,IAAI,CAAC,EAAE;MAAEqF;IAAM,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,CAAC7C,SAAS,CAACoF,WAAW,CAACP,IAAI,CAAC;EAC1C;EAEA,MAAM,CAACtF,MAAM8F,CAAC7F,OAAO,EAAEC,OAAO,EAAE;IAAEyC;EAAS,CAAC,EAAEoD,UAAU,GAAG,IAAI,EAAE;IAC/D,IAAI;MACF,IAAIC,CAAC,GAAG7E,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAACuI,OAAO,CAAChG,OAAO,EAAEC,OAAO,CAAC,EAAE,IAAI,CAACkB,QAAQ,CAAC;MACnE,IAAIuB,QAAQ,EAAE;QACZqD,CAAC,GAAGE,OAAO,CAACC,GAAG,CAAC,CAACH,CAAC,EAAE,IAAI,CAACC,OAAO,CAACjI,YAAY,CAACiC,OAAO,CAAC,EAAEjC,YAAY,CAACkC,OAAO,CAAC,CAAC,CAAC,CAAC;MAClF;MACA,MAAM8F,CAAC;IACT,CAAC,CAAC,OAAOrH,KAAK,EAAE;MAEd,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,IAAImH,UAAU,EAAE;QACzC,MAAM,IAAI,CAACV,OAAO,CAAC,IAAAe,aAAO,EAAClG,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,CAACF,MAAM,CAACC,OAAO,EAAEC,OAAO,EAAE;UAAEyC;QAAS,CAAC,EAAE,KAAK,CAAC;MAC5D;MACA,MAAMhE,KAAK;IACb;EACF;EAEA0H,QAAQA,CAACpG,OAAO,EAAEC,OAAO,EAAE;IAAEyC,QAAQ,GAAG;EAAM,CAAC,GAAG,CAAC,CAAC,EAAE;IACpD,OAAO,IAAI,CAAC,CAAC3C,MAAM,CAAC,IAAAI,eAAa,EAACH,OAAO,CAAC,EAAE,IAAAG,eAAa,EAACF,OAAO,CAAC,EAAE;MAAEyC;IAAS,CAAC,CAAC;EACnF;EAEA,MAAM2D,MAAMA,CAACrG,OAAO,EAAEC,OAAO,EAAE;IAAEyC,QAAQ,GAAG;EAAM,CAAC,GAAG,CAAC,CAAC,EAAE;IACxD1C,OAAO,GAAG,IAAAG,eAAa,EAACH,OAAO,CAAC;IAChCC,OAAO,GAAG,IAAAE,eAAa,EAACF,OAAO,CAAC;IAEhC,IAAI8F,CAAC,GAAG7E,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAAC6I,KAAK,CAACtG,OAAO,EAAEC,OAAO,CAAC,EAAE,IAAI,CAACkB,QAAQ,CAAC;IACjE,IAAIuB,QAAQ,EAAE;MACZqD,CAAC,GAAGE,OAAO,CAACC,GAAG,CAAC,CAACH,CAAC,EAAE,IAAI,CAACO,KAAK,CAACvI,YAAY,CAACiC,OAAO,CAAC,EAAEjC,YAAY,CAACkC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChF;IACA,OAAO8F,CAAC;EACV;EAEA,MAAM/D,KAAKA,CAAC1C,GAAG,EAAE;IACf,MAAM4B,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAAC8I,MAAM,CAAC,IAAApG,eAAa,EAACb,GAAG,CAAC,CAAC,CAACkH,KAAK,CAAC/H,YAAY,CAAC,EAAE,IAAI,CAAC0C,QAAQ,CAAC;EACxF;EAEA,MAAMsF,MAAMA,CAACnH,GAAG,EAAE;IAChB,MAAM,IAAI,CAACoH,OAAO,CAAC,IAAAvG,eAAa,EAACb,GAAG,CAAC,CAAC;EACxC;EAMA,MACMqH,IAAIA,CAAA,EAAG;IACX,MAAM,IAAI,CAACpE,KAAK,CAAC,CAAC;IAClB,IAAI;MACF,MAAM,IAAI,CAAC,CAACqE,aAAa,CAAC,CAAC;IAC7B,CAAC,CAAC,OAAOlI,KAAK,EAAE;MACd,MAAM,IAAI,CAAC2D,OAAO,CAAC,CAAC;MACpB,MAAM3D,KAAK;IACb;EACF;EAEA,MAAM,CAACmI,gBAAgBC,CAAA,EAAG;IACxB,MAAMzH,IAAI,GAAG,MAAM,IAAI,CAACqF,MAAM,CAAC,GAAG,EAAE;MAClCC,MAAM,EAAEoC,CAAC,IAAI,CAACA,CAAC,CAACC,UAAU,CAAC,GAAG,CAAC,IAAID,CAAC,KAAKxI,wBAAwB,IAAIwI,CAAC,KAAKvI;IAC7E,CAAC,CAAC;IACF,OAAOa,IAAI,CAACO,MAAM,KAAK,CAAC;EAC1B;EAEA,MAAM,CAACqH,cAAcC,CAAA,EAAG;IACtB,MAAMC,mBAAmB,GAAG,IAAI,CAACrG,OAAO,CAACsG,aAAa,KAAK1J,SAAS,GAAG,MAAM,GAAG2J,uCAA4B;IAC5G,IAAI,CAAC,CAAC9G,YAAY,GAAG,IAAA+G,wBAAa,EAACH,mBAAmB,EAAE,IAAI,CAACrG,OAAO,CAACsG,aAAa,CAAC;IAEnF,MAAMnB,OAAO,CAACC,GAAG,CAAC,CAChB,IAAI,CAACqB,UAAU,CAAC,IAAApH,eAAa,EAAC5B,wBAAwB,CAAC,EAAEiJ,IAAI,CAACC,SAAS,CAAC;MAAEC,SAAS,EAAEP;IAAoB,CAAC,CAAC,EAAE;MAC3G9D,KAAK,EAAE;IACT,CAAC,CAAC,EACF,IAAI,CAACsE,WAAW,CAACnJ,4BAA4B,EAAG,cAAa,IAAAoJ,kBAAU,EAAC,CAAE,IAAG,EAAE;MAAEvE,KAAK,EAAE;IAAI,CAAC,CAAC,CAC/F,CAAC;EACJ;EAEA,MAAM,CAACuD,aAAaiB,CAAA,EAAG;IACrB,IAAIV,mBAAmB,GAAG,MAAM;IAChC,IAAI9B,IAAI;IACR,IAAI;MAEFA,IAAI,GAAG,MAAM,IAAI,CAACjC,SAAS,CAAC,IAAAjD,eAAa,EAAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;MAC7E,MAAMuJ,IAAI,GAAGN,IAAI,CAACzG,KAAK,CAACsE,IAAI,CAAC;MAC7B8B,mBAAmB,GAAGW,IAAI,CAACJ,SAAS;IACtC,CAAC,CAAC,OAAOhJ,KAAK,EAAE;MACd,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC3B,MAAMD,KAAK;MACb;MACAyI,mBAAmB,GAAG,IAAI,CAACrG,OAAO,CAACsG,aAAa,KAAK1J,SAAS,GAAG,MAAM,GAAG2J,uCAA4B;IACxG;IAEA,IAAI;MACF,IAAI,CAAC,CAAC9G,YAAY,GAAG,IAAA+G,wBAAa,EAACH,mBAAmB,EAAE,IAAI,CAACrG,OAAO,CAACsG,aAAa,CAAC;MAEnF,MAAM/B,IAAI,GAAG,MAAM,IAAI,CAACM,UAAU,CAACnH,4BAA4B,EAAE,OAAO,CAAC;MACzEgJ,IAAI,CAACzG,KAAK,CAACsE,IAAI,CAAC;IAClB,CAAC,CAAC,OAAO3G,KAAK,EAAE;MAEd,IAAIyI,mBAAmB,KAAK,MAAM,EAAE;QAClC,IAAI,MAAM,IAAI,CAAC,CAACN,gBAAgB,CAAC,CAAC,EAAE;UAGlCjJ,IAAI,CAAC,qCAAqC,CAAC;UAC3C,OAAO,IAAI,CAAC,CAACqJ,cAAc,CAAC,CAAC;QAC/B,CAAC,MAAM;UACLpJ,IAAI,CACD,yIAAwI,EACzI;YAAEa;UAAM,CACV,CAAC;UAED,MAAMA,KAAK;QACb;MACF;IACF;EACF;EAEA,MAAMqJ,IAAIA,CAAA,EAAG;IACX,MAAMC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;IAC7B,MAAMC,YAAY,GAAG,IAAA9H,eAAa,EAAE,GAAE+H,IAAI,CAACC,GAAG,CAAC,CAAE,OAAM,CAAC;IACxD,MAAM9C,IAAI,GAAG,MAAM,IAAA+C,4BAAY,EAACC,mBAAW,EAAEL,IAAI,CAAC;IAClD,IAAIM,IAAI,GAAG,OAAO;IAClB,IAAI;MACF,MAAMC,UAAU,GAAGC,OAAO,CAACtK,MAAM,CAAC,CAAC;MACnC,MAAM,IAAI,CAACoG,WAAW,CAAC2D,YAAY,EAAE5C,IAAI,EAAE;QAAEhC,KAAK,EAAE;MAAK,CAAC,CAAC;MAC3D,MAAMoF,aAAa,GAAGD,OAAO,CAACtK,MAAM,CAACqK,UAAU,CAAC;MAEhDD,IAAI,GAAG,MAAM;MACb,MAAMI,SAAS,GAAGF,OAAO,CAACtK,MAAM,CAAC,CAAC;MAClC,MAAM4D,IAAI,GAAG,MAAM,IAAI,CAACsB,SAAS,CAAC6E,YAAY,EAAE;QAAE5E,KAAK,EAAE;MAAI,CAAC,CAAC;MAC/D,MAAMsF,YAAY,GAAGH,OAAO,CAACtK,MAAM,CAACwK,SAAS,CAAC;MAE9C,IAAI,CAACrD,IAAI,CAACuD,MAAM,CAAC9G,IAAI,CAAC,EAAE;QACtB,MAAM,IAAIpB,KAAK,CAAC,gCAAgC,CAAC;MACnD;MACA,OAAO;QACLmI,OAAO,EAAE,IAAI;QACbC,SAAS,EAAE7K,WAAW,CAACwK,aAAa,EAAET,IAAI,CAAC;QAC3Ce,QAAQ,EAAE9K,WAAW,CAAC0K,YAAY,EAAEX,IAAI;MAC1C,CAAC;IACH,CAAC,CAAC,OAAOtJ,KAAK,EAAE;MACdb,IAAI,CAAE,0CAAyCyK,IAAK,EAAC,EAAE;QAAE5J;MAAM,CAAC,CAAC;MACjE,OAAO;QACLmK,OAAO,EAAE,KAAK;QACdP,IAAI;QACJtK,IAAI,EAAEiK,YAAY;QAClBvJ;MACF,CAAC;IACH,CAAC,SAAS;MACRsK,4BAAY,CAACvL,IAAI,CAAC,IAAI,CAACwL,OAAO,CAAChB,YAAY,CAAC,CAAC;IAC/C;EACF;EAEA,MAAMhG,QAAQA,CAACjE,IAAI,EAAEkL,GAAG,EAAE;IACxB,MAAM,IAAI,CAACC,SAAS,CAACnL,IAAI,EAAEkL,GAAG,CAAC;EACjC;EAEA,MAAME,QAAQA,CAACpL,IAAI,EAAE;IAAE0E,QAAQ,GAAG;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC7C1E,IAAI,GAAG,IAAAmC,eAAa,EAACnC,IAAI,CAAC;IAE1B,IAAI0E,QAAQ,EAAE;MACZsG,4BAAY,CAACvL,IAAI,CAAC,IAAI,CAACwL,OAAO,CAAClL,YAAY,CAACC,IAAI,CAAC,CAAC,CAAC;IACrD;IAEA,MAAM,IAAI,CAACiL,OAAO,CAACjL,IAAI,CAAC,CAACwI,KAAK,CAAC/H,YAAY,CAAC;EAC9C;EAEA,MAAM0D,KAAKA,CAACnE,IAAI,EAAEwH,MAAM,EAAEC,QAAQ,EAAE;IAClC3C,eAAM,CAACC,WAAW,CAAC,IAAI,CAACC,WAAW,EAAE,KAAK,EAAG,8CAA6ChF,IAAK,EAAC,CAAC;IACjG,MAAM,IAAI,CAACqL,MAAM,CAAC,OAAOrL,IAAI,KAAK,QAAQ,GAAG,IAAAmC,eAAa,EAACnC,IAAI,CAAC,GAAGA,IAAI,EAAEwH,MAAM,EAAEC,QAAQ,CAAC;EAC5F;EAEA,MAAMkC,WAAWA,CAAC3J,IAAI,EAAEqH,IAAI,EAAE;IAAEhC,KAAK,GAAG;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IACnD,MAAMiC,aAAa,GAAG,IAAI,CAAC,CAAC9E,SAAS,CAAC+E,WAAW,CAACF,IAAI,CAAC;IACvD,MAAM,IAAI,CAACkC,UAAU,CAAC,IAAApH,eAAa,EAACnC,IAAI,CAAC,EAAEsH,aAAa,EAAE;MAAEjC;IAAM,CAAC,CAAC;EACtE;EAIA,MAAMiG,WAAWA,CAACC,EAAE,EAAE;IACpB,MAAMrI,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAAC+L,UAAU,CAACD,EAAE,CAACA,EAAE,CAAC,EAAE,IAAI,CAACpI,QAAQ,CAAC;EAC3D;EAEA,MAAMsI,OAAOA,CAACnK,GAAG,EAAE;IAAE6F;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAChC7F,GAAG,GAAG,IAAAa,eAAa,EAACb,GAAG,CAAC;IAExB,IAAI;MACF,MAAM,IAAI,CAACoK,MAAM,CAACpK,GAAG,EAAE;QAAE6F;MAAK,CAAC,CAAC;IAClC,CAAC,CAAC,OAAOzG,KAAK,EAAE;MACd,IAAIA,KAAK,IAAI,IAAI,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC5C,MAAMD,KAAK;MACb;MAGA,MAAM,IAAI,CAACoG,KAAK,CAACxF,GAAG,CAAC;IACvB;EACF;EAEA,MAAMqK,UAAUA,CAACzJ,IAAI,EAAEmD,KAAK,EAAE;IAC5BnD,IAAI,GAAG,IAAAC,eAAa,EAACD,IAAI,CAAC;IAE1B,OAAO;MACLqJ,EAAE,EAAE,MAAMrI,uBAAO,CAACzD,IAAI,CAAC,IAAI,CAACmM,SAAS,CAAC1J,IAAI,EAAEmD,KAAK,CAAC,EAAE,IAAI,CAAClC,QAAQ,CAAC;MAClEjB;IACF,CAAC;EACH;EAIA2J,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI,CAAC/I,OAAO,CAAC+I,eAAe,IAAI,KAAK;EAC9C;EAEA,MAAML,UAAUA,CAACD,EAAE,EAAE;IACnB,MAAM,IAAI7I,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMoJ,mBAAmBA,CAAC9L,IAAI,EAAE;IAAE6F,OAAO;IAAE,GAAGjD;EAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;IAC5D,IAAI;MACF,OAAO,MAAM,IAAI,CAACmJ,kBAAkB,CAAC/L,IAAI,EAAE;QAAE,GAAG4C,OAAO;QAAEI,aAAa,EAAE,IAAI,CAACC;MAAe,CAAC,CAAC;IAChG,CAAC,CAAC,OAAOvC,KAAK,EAAE;MACd,IAAI,OAAOV,IAAI,KAAK,QAAQ,IAAIU,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QACvD,MAAMD,KAAK;MACb;IACF;IAEA,MAAM,IAAI,CAAC0G,OAAO,CAAC,IAAAe,aAAO,EAACnI,IAAI,CAAC,EAAE;MAAEmH,IAAI,EAAEtB;IAAQ,CAAC,CAAC;IACpD,OAAO,IAAI,CAACiG,mBAAmB,CAAC9L,IAAI,EAAE4C,OAAO,CAAC;EAChD;EAEA,MAAMsC,iBAAiBA,CAAClF,IAAI,EAAE4C,OAAO,EAAE;IACrC,MAAM,IAAIF,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAIA,MAAMqJ,kBAAkBA,CAAC/L,IAAI,EAAE4C,OAAO,EAAE;IACtC,MAAM,IAAIF,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAGA,MAAM2B,OAAOA,CAAA,EAAG,CAAC;EAEjB,MAAMmC,QAAQA,CAAA,EAAG;IACf,OAAO,CAAC,CAAC;EACX;EAEA,MAAMS,KAAKA,CAAC/E,IAAI,EAAE;IAChB,OAAO,MAAM+F,OAAO,CAAC+D,OAAO,CAAC,CAAC;EAChC;EAEA,MAAMtG,QAAQA,CAAC1F,IAAI,EAAE;IACnB,MAAM,IAAI0C,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMoE,KAAKA,CAACxF,GAAG,EAAE;IACf,MAAM,IAAIoB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMgJ,MAAMA,CAACpK,GAAG,EAAE;IAChB,MAAM,IAAIoB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM0E,OAAOA,CAAC9F,GAAG,EAAE;IAAE6F;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAChC,IAAI;MACF,OAAO,MAAM,IAAI,CAACsE,OAAO,CAACnK,GAAG,EAAE;QAAE6F;MAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,OAAOzG,KAAK,EAAE;MACd,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC3B,MAAMD,KAAK;MACb;IACF;IAEA,MAAM,IAAI,CAAC0G,OAAO,CAAC,IAAAe,aAAO,EAAC7G,GAAG,CAAC,EAAE;MAAE6F;IAAK,CAAC,CAAC;IAC1C,OAAO,IAAI,CAACC,OAAO,CAAC9F,GAAG,EAAE;MAAE6F;IAAK,CAAC,CAAC;EACpC;EAEA,MAAMyE,SAASA,CAAC1J,IAAI,EAAEmD,KAAK,EAAE;IAC3B,MAAM,IAAI3C,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM4D,WAAWA,CAACtG,IAAI,EAAEqH,IAAI,EAAE;IAAExB,OAAO;IAAER;EAAM,CAAC,EAAE;IAChD,IAAI;MACF,OAAO,MAAM,IAAI,CAACkE,UAAU,CAACvJ,IAAI,EAAEqH,IAAI,EAAE;QAAEhC;MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,OAAO3E,KAAK,EAAE;MACd,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC3B,MAAMD,KAAK;MACb;IACF;IAEA,MAAM,IAAI,CAAC0G,OAAO,CAAC,IAAAe,aAAO,EAACnI,IAAI,CAAC,EAAE;MAAEmH,IAAI,EAAEtB;IAAQ,CAAC,CAAC;IACpD,OAAO,IAAI,CAACS,WAAW,CAACtG,IAAI,EAAEqH,IAAI,EAAE;MAAEhC;IAAM,CAAC,CAAC;EAChD;EAEA,MAAMgB,aAAaA,CAACnE,IAAI,EAAE0D,KAAK,EAAE;IAAEC,OAAO;IAAEG;EAAU,CAAC,EAAE;IACvD,MAAMiG,OAAO,GAAI,GAAE,IAAA9D,aAAO,EAACjG,IAAI,CAAE,KAAI,IAAAgK,cAAQ,EAAChK,IAAI,CAAE,EAAC;IACrD,MAAMiK,MAAM,GAAG,MAAMjJ,uBAAO,CAACzD,IAAI,CAC/B,IAAI,CAACqM,mBAAmB,CAACG,OAAO,EAAE;MAChCpG,OAAO;MACPR,KAAK,EAAE;IACT,CAAC,CAAC,EACF,IAAI,CAAClC,QACP,CAAC;IACD,IAAI;MACF,MAAM,IAAAiH,4BAAY,EAAChE,gBAAQ,EAAER,KAAK,EAAEuG,MAAM,CAAC;MAC3C,IAAInG,SAAS,KAAKtG,SAAS,EAAE;QAC3B,MAAMsG,SAAS,CAACvG,IAAI,CAAC,IAAI,EAAEwM,OAAO,CAAC;MACrC;MACA,MAAM,IAAI,CAAC7D,QAAQ,CAAC6D,OAAO,EAAE/J,IAAI,CAAC;IACpC,CAAC,CAAC,OAAOxB,KAAK,EAAE;MACd,MAAM,IAAI,CAAC0K,QAAQ,CAACa,OAAO,CAAC;MAC5B,MAAMvL,KAAK;IACb;EACF;EAEAgH,KAAKA,CAAC1H,IAAI,EAAEwH,MAAM,EAAEC,QAAQ,EAAE;IAC5B,MAAM,IAAI/E,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA0C,SAASA,CAACpF,IAAI,EAAE4C,OAAO,EAAE;IACvB,OAAO,IAAI,CAACsC,iBAAiB,CAAClF,IAAI,EAAE;MAAE,GAAG4C,OAAO;MAAEI,aAAa,EAAE,IAAI,CAACC;IAAe,CAAC,CAAC,CAACmJ,IAAI,CAACC,kBAAS,CAAC7E,MAAM,CAAC;EAChH;EAEA,MAAMQ,OAAOA,CAAChG,OAAO,EAAEC,OAAO,EAAE;IAC9B,MAAM,IAAIS,KAAK,CAAC,iBAAiB,CAAC;EACpC;EACA,MAAM4F,KAAKA,CAACtG,OAAO,EAAEC,OAAO,EAAE;IAC5B,MAAM,IAAIS,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM6F,MAAMA,CAACjH,GAAG,EAAE;IAChB,MAAM,IAAIoB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMgG,OAAOA,CAACpH,GAAG,EAAE;IACjB,IAAI;MACF,OAAO,MAAM,IAAI,CAACiH,MAAM,CAACjH,GAAG,CAAC;IAC/B,CAAC,CAAC,OAAOZ,KAAK,EAAE;MACd,IAAIA,KAAK,CAACC,IAAI,KAAK,WAAW,EAAE;QAC9B,MAAMD,KAAK;MACb;IACF;IAEA,MAAM4L,KAAK,GAAG,MAAM,IAAI,CAACxF,KAAK,CAACxF,GAAG,CAAC;IACnC,MAAM,IAAAiL,oBAAS,EAACD,KAAK,EAAEtM,IAAI,IACzB,IAAI,CAACiL,OAAO,CAAE,GAAE3J,GAAI,IAAGtB,IAAK,EAAC,CAAC,CAACwI,KAAK,CAClC9H,KAAK,IAAI;MAGP,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,IAAID,KAAK,CAACC,IAAI,KAAK,OAAO,EAAE;QACrD,OAAO,IAAI,CAAC+H,OAAO,CAAE,GAAEpH,GAAI,IAAGtB,IAAK,EAAC,CAAC;MACvC;MACA,MAAMU,KAAK;IACb,CAAC,EAED;MAAE8L,WAAW,EAAE;IAAE,CACnB,CACF,CAAC;IACD,OAAO,IAAI,CAAC9D,OAAO,CAACpH,GAAG,CAAC;EAC1B;EAGA,MAAMiD,KAAKA,CAAA,EAAG,CAAC;EAEf,MAAM0G,OAAOA,CAACjL,IAAI,EAAE;IAClB,MAAM,IAAI0C,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM2I,MAAMA,CAACrL,IAAI,EAAEwH,MAAM,EAAEC,QAAQ,EAAE;IACnC,MAAMgF,MAAM,GAAG,OAAOzM,IAAI,KAAK,QAAQ;IACvC,IAAIyM,MAAM,EAAE;MACVzM,IAAI,GAAG,MAAM,IAAI,CAAC2L,UAAU,CAAC3L,IAAI,EAAE,IAAI,CAAC;IAC1C;IACA,IAAI;MACF,OAAO,MAAM,IAAI,CAAC0M,QAAQ,CAAC1M,IAAI,EAAEwH,MAAM,EAAEC,QAAQ,CAAC;IACpD,CAAC,SAAS;MACR,IAAIgF,MAAM,EAAE;QACV,MAAM,IAAI,CAACnB,WAAW,CAACtL,IAAI,CAAC;MAC9B;IACF;EACF;EAEA,MAAM0M,QAAQA,CAACnB,EAAE,EAAE/D,MAAM,EAAEC,QAAQ,EAAE;IACnC,MAAM,IAAI/E,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM6G,UAAUA,CAACvJ,IAAI,EAAEqH,IAAI,EAAEzE,OAAO,EAAE;IACpC,MAAM,IAAIF,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,IAAIsC,WAAWA,CAAA,EAAG;IAChB,OAAO,IAAI,CAAC,CAACxC,SAAS,CAACmK,EAAE,KAAK,gBAAgB;EAChD;AACF,CAAC,GAAAtO,yBAAA,CAAAJ,MAAA,CAAA6C,SAAA,aAAA/C,IAAA,GAAAa,MAAA,CAAAgO,wBAAA,CAAA3O,MAAA,CAAA6C,SAAA,aAAA7C,MAAA,CAAA6C,SAAA,GAAAzC,yBAAA,CAAAJ,MAAA,CAAA6C,SAAA,WAAA9C,KAAA,GAAAY,MAAA,CAAAgO,wBAAA,CAAA3O,MAAA,CAAA6C,SAAA,WAAA7C,MAAA,CAAA6C,SAAA,IAAA7C,MAAA;AAID;EACE,MAAM4O,KAAK,GAAGzK,qBAAqB,CAACtB,SAAS;EAC7C,KAAK,MAAMgM,MAAM,IAAIlO,MAAM,CAACmO,mBAAmB,CAACF,KAAK,CAAC,EAAE;IACtD,IAAIC,MAAM,CAAC9D,UAAU,CAAC,IAAI,CAAC,EAAE;MAC3B,MAAMgE,UAAU,GAAGF,MAAM,CAAC1N,KAAK,CAAC,CAAC,CAAC;MAElC,IAAA0F,eAAM,EAAC,CAAClG,MAAM,CAACqO,MAAM,CAACJ,KAAK,EAAEG,UAAU,CAAC,CAAC;MAEzCpO,MAAM,CAACe,cAAc,CAACkN,KAAK,EAAEG,UAAU,EAAEpO,MAAM,CAACgO,wBAAwB,CAACC,KAAK,EAAEC,MAAM,CAAC,CAAC;IAC1F;EACF;AACF;AAEA,SAASI,0BAA0BA,CAAA,EAAG;EACpC,MAAMC,GAAG,GAAGpM,aAAa,CAACD,SAAS;EACnC,MAAMsM,IAAI,GAAGhL,qBAAqB,CAACtB,SAAS;EAE5C,MAAM;IACJnB,cAAc;IACdiN,wBAAwB;IACxB9L,SAAS,EAAE;MAAEuM;IAAe;EAC9B,CAAC,GAAGzO,MAAM;EAEVA,MAAM,CAACmO,mBAAmB,CAACK,IAAI,CAAC,CAACtO,OAAO,CAACwO,IAAI,IAAI;IAC/C,IAAI7O,UAAU,EAAEe,KAAK;IACrB,IACE6N,cAAc,CAAC5N,IAAI,CAAC0N,GAAG,EAAEG,IAAI,CAAC,IAC9BA,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IACf,QAAQ9N,KAAK,GAAG,CAACf,UAAU,GAAGmO,wBAAwB,CAACQ,IAAI,EAAEE,IAAI,CAAC,EAAE9N,KAAK,CAAC,KAAK,UAAU,EACzF;MACA;IACF;IAEAf,UAAU,CAACe,KAAK,GAAG,YAAY;MAC7B,IAAI0C,IAAI;MACR,IAAIqL,SAAS,CAAC3L,MAAM,KAAK,CAAC,IAAI,QAAQM,IAAI,GAAGqL,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACvEA,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC9L,QAAQ,CAACS,IAAI,CAAC;MACpC;MACA,OAAO1C,KAAK,CAACgO,KAAK,CAAC,IAAI,CAACrM,QAAQ,EAAEoM,SAAS,CAAC;IAC9C,CAAC;IAED5N,cAAc,CAACwN,GAAG,EAAEG,IAAI,EAAE7O,UAAU,CAAC;EACvC,CAAC,CAAC;AACJ;AACAyO,0BAA0B,CAAC,CAAC"}
|
package/dist/s3.js
CHANGED
|
@@ -21,6 +21,8 @@ var _asyncEach = require("@vates/async-each");
|
|
|
21
21
|
var _promiseToolbox = require("promise-toolbox");
|
|
22
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
23
|
const MAX_PART_SIZE = 1024 * 1024 * 1024 * 5;
|
|
24
|
+
const MAX_PART_NUMBER = 10000;
|
|
25
|
+
const MIN_PART_SIZE = 5 * 1024 * 1024;
|
|
24
26
|
const {
|
|
25
27
|
warn
|
|
26
28
|
} = (0, _log.createLogger)('xo:fs:s3');
|
|
@@ -60,7 +62,6 @@ class S3Handler extends _abstract.default {
|
|
|
60
62
|
})
|
|
61
63
|
})
|
|
62
64
|
});
|
|
63
|
-
this.#s3.middlewareStack.use((0, _middlewareApplyBodyChecksum.getApplyMd5BodyChecksumPlugin)(this.#s3.config));
|
|
64
65
|
const parts = (0, _path.split)(path);
|
|
65
66
|
this.#bucket = parts.shift();
|
|
66
67
|
this.#dir = (0, _path.join)(...parts);
|
|
@@ -181,16 +182,41 @@ class S3Handler extends _abstract.default {
|
|
|
181
182
|
}
|
|
182
183
|
}
|
|
183
184
|
async _outputStream(path, input, {
|
|
185
|
+
streamLength,
|
|
186
|
+
maxStreamLength = streamLength,
|
|
184
187
|
validator
|
|
185
188
|
}) {
|
|
189
|
+
let partSize;
|
|
190
|
+
if (maxStreamLength === undefined) {
|
|
191
|
+
warn(`Writing ${path} to a S3 remote without a max size set will cut it to 50GB`, {
|
|
192
|
+
path
|
|
193
|
+
});
|
|
194
|
+
partSize = MIN_PART_SIZE;
|
|
195
|
+
} else {
|
|
196
|
+
partSize = Math.min(Math.max(Math.ceil(maxStreamLength / MAX_PART_NUMBER), MIN_PART_SIZE), MAX_PART_SIZE);
|
|
197
|
+
}
|
|
198
|
+
let readCounter = 0;
|
|
199
|
+
const MAX_SIZE = MAX_PART_NUMBER * partSize;
|
|
200
|
+
const streamCutter = new _stream.Transform({
|
|
201
|
+
transform(chunk, encoding, callback) {
|
|
202
|
+
readCounter += chunk.length;
|
|
203
|
+
if (readCounter > MAX_SIZE) {
|
|
204
|
+
callback(new Error(`read ${readCounter} bytes, maximum size allowed is ${MAX_SIZE} `));
|
|
205
|
+
} else {
|
|
206
|
+
callback(null, chunk);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
186
210
|
const Body = new _stream.PassThrough();
|
|
187
|
-
(0, _stream.pipeline)(input, Body, () => {});
|
|
211
|
+
(0, _stream.pipeline)(input, streamCutter, Body, () => {});
|
|
188
212
|
const upload = new _libStorage.Upload({
|
|
189
213
|
client: this.#s3,
|
|
190
214
|
params: {
|
|
191
215
|
...this.#createParams(path),
|
|
192
216
|
Body
|
|
193
|
-
}
|
|
217
|
+
},
|
|
218
|
+
partSize,
|
|
219
|
+
leavePartsOnError: false
|
|
194
220
|
});
|
|
195
221
|
await upload.done();
|
|
196
222
|
if (validator !== undefined) {
|
|
@@ -334,6 +360,22 @@ class S3Handler extends _abstract.default {
|
|
|
334
360
|
return path;
|
|
335
361
|
}
|
|
336
362
|
async _closeFile(fd) {}
|
|
363
|
+
async _sync() {
|
|
364
|
+
await super._sync();
|
|
365
|
+
try {
|
|
366
|
+
var _res$ObjectLockConfig;
|
|
367
|
+
const res = await this.#s3.send(new _clientS.GetObjectLockConfigurationCommand({
|
|
368
|
+
Bucket: this.#bucket
|
|
369
|
+
}));
|
|
370
|
+
if (((_res$ObjectLockConfig = res.ObjectLockConfiguration) === null || _res$ObjectLockConfig === void 0 ? void 0 : _res$ObjectLockConfig.ObjectLockEnabled) === 'Enabled') {
|
|
371
|
+
this.#s3.middlewareStack.use((0, _middlewareApplyBodyChecksum.getApplyMd5BodyChecksumPlugin)(this.#s3.config));
|
|
372
|
+
}
|
|
373
|
+
} catch (error) {
|
|
374
|
+
if (error.Code !== 'ObjectLockConfigurationNotFoundError' && error.$metadata.httpStatusCode !== 501) {
|
|
375
|
+
throw error;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
337
379
|
useVhdDirectory() {
|
|
338
380
|
return true;
|
|
339
381
|
}
|
package/dist/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","names":["_clientS","require","_libStorage","_nodeHttpHandler","_middlewareApplyBodyChecksum","_http","_https","_log","_stream","_xoRemoteParser","_copyStreamToBuffer","_interopRequireDefault","_guessAwsRegion","_abstract","_path","_asyncEach","_promiseToolbox","obj","__esModule","default","MAX_PART_SIZE","warn","createLogger","S3Handler","RemoteHandlerAbstract","bucket","dir","s3","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","shift","join","WITH_RETRY","forEach","functionName","undefined","pRetry","wrap","delays","when","err","includes","code","onRetry","error","_this$arguments","method","attemptNumber","delay","file","arguments","type","makeCopySource","#makeCopySource","makeKey","#makeKey","makePrefix","#makePrefix","prefix","createParams","#createParams","Bucket","Key","multipartCopy","#multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","Math","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","e","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","Error","cause","isNotEmptyDir","#isNotEmptyDir","_result$Contents","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","isFile","#isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","params","done","call","__unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","_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","_openFile","flags","_closeFile","useVhdDirectory","exports"],"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 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 { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport { createLogger } from '@xen-orchestra/log'\nimport { PassThrough, pipeline } from 'stream'\nimport { parse } from 'xo-remote-parser'\nimport copyStreamToBuffer from './_copyStreamToBuffer.js'\nimport guessAwsRegion from './_guessAwsRegion.js'\nimport RemoteHandlerAbstract from './abstract'\nimport { basename, join, split } from './path'\nimport { asyncEach } from '@vates/async-each'\nimport { pRetry } from 'promise-toolbox'\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 MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n #bucket\n #dir\n #s3\n\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 const WITH_RETRY = [\n '_closeFile',\n '_copy',\n '_getInfo',\n '_getSize',\n '_list',\n '_mkdir',\n '_openFile',\n '_outputFile',\n '_read',\n '_readFile',\n '_rename',\n '_rmdir',\n '_truncate',\n '_unlink',\n '_write',\n '_writeFile',\n ]\n WITH_RETRY.forEach(functionName => {\n if (this[functionName] !== undefined) {\n // adding the retry on the top level mtehod won't\n // cover when _functionName are called internally\n this[functionName] = pRetry.wrap(this[functionName], {\n delays: [100, 200, 500, 1000, 2000],\n // these errors should not change on retry\n when: err => !['EEXIST', 'EISDIR', 'ENOTEMPTY', 'ENOENT', 'ENOTDIR', 'EISDIR'].includes(err?.code),\n onRetry(error) {\n warn('retrying method on fs ', {\n method: functionName,\n attemptNumber: this.attemptNumber,\n delay: this.delay,\n error,\n file: this.arguments?.[0],\n })\n },\n })\n }\n })\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 // normalize this error code\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file or directory '${oldPath}'`)\n error.cause = e\n error.code = 'ENOENT'\n error.path = oldPath\n throw error\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 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 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 _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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"}
|
|
1
|
+
{"version":3,"file":"s3.js","names":["_clientS","require","_libStorage","_nodeHttpHandler","_middlewareApplyBodyChecksum","_http","_https","_log","_stream","_xoRemoteParser","_copyStreamToBuffer","_interopRequireDefault","_guessAwsRegion","_abstract","_path","_asyncEach","_promiseToolbox","obj","__esModule","default","MAX_PART_SIZE","MAX_PART_NUMBER","MIN_PART_SIZE","warn","createLogger","S3Handler","RemoteHandlerAbstract","bucket","dir","s3","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","parts","split","shift","join","WITH_RETRY","forEach","functionName","undefined","pRetry","wrap","delays","when","err","includes","code","onRetry","error","_this$arguments","method","attemptNumber","delay","file","arguments","type","makeCopySource","#makeCopySource","makeKey","#makeKey","makePrefix","#makePrefix","prefix","createParams","#createParams","Bucket","Key","multipartCopy","#multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","Math","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","e","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","Error","cause","isNotEmptyDir","#isNotEmptyDir","_result$Contents","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","isFile","#isFile","HeadObjectCommand","_outputStream","input","streamLength","maxStreamLength","validator","partSize","max","ceil","readCounter","MAX_SIZE","streamCutter","Transform","transform","chunk","encoding","callback","Body","PassThrough","pipeline","Upload","client","params","leavePartsOnError","done","call","__unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","_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","_openFile","flags","_closeFile","_sync","_res$ObjectLockConfig","res","GetObjectLockConfigurationCommand","ObjectLockConfiguration","ObjectLockEnabled","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","Code","$metadata","httpStatusCode","useVhdDirectory","exports"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n GetObjectLockConfigurationCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\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 { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport { createLogger } from '@xen-orchestra/log'\nimport { PassThrough, Transform, pipeline } from 'stream'\nimport { parse } from 'xo-remote-parser'\nimport copyStreamToBuffer from './_copyStreamToBuffer.js'\nimport guessAwsRegion from './_guessAwsRegion.js'\nimport RemoteHandlerAbstract from './abstract'\nimport { basename, join, split } from './path'\nimport { asyncEach } from '@vates/async-each'\nimport { pRetry } from 'promise-toolbox'\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 MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst MAX_PART_NUMBER = 10000\nconst MIN_PART_SIZE = 5 * 1024 * 1024\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n #bucket\n #dir\n #s3\n\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 const parts = split(path)\n this.#bucket = parts.shift()\n this.#dir = join(...parts)\n const WITH_RETRY = [\n '_closeFile',\n '_copy',\n '_getInfo',\n '_getSize',\n '_list',\n '_mkdir',\n '_openFile',\n '_outputFile',\n '_read',\n '_readFile',\n '_rename',\n '_rmdir',\n '_truncate',\n '_unlink',\n '_write',\n '_writeFile',\n ]\n WITH_RETRY.forEach(functionName => {\n if (this[functionName] !== undefined) {\n // adding the retry on the top level mtehod won't\n // cover when _functionName are called internally\n this[functionName] = pRetry.wrap(this[functionName], {\n delays: [100, 200, 500, 1000, 2000],\n // these errors should not change on retry\n when: err => !['EEXIST', 'EISDIR', 'ENOTEMPTY', 'ENOENT', 'ENOTDIR', 'EISDIR'].includes(err?.code),\n onRetry(error) {\n warn('retrying method on fs ', {\n method: functionName,\n attemptNumber: this.attemptNumber,\n delay: this.delay,\n error,\n file: this.arguments?.[0],\n })\n },\n })\n }\n })\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 // normalize this error code\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file or directory '${oldPath}'`)\n error.cause = e\n error.code = 'ENOENT'\n error.path = oldPath\n throw error\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, { streamLength, maxStreamLength = streamLength, validator }) {\n // S3 storage is limited to 10K part, each part is limited to 5GB. And the total upload must be smaller than 5TB\n // a bigger partSize increase the memory consumption of aws/lib-storage exponentially\n let partSize\n if (maxStreamLength === undefined) {\n warn(`Writing ${path} to a S3 remote without a max size set will cut it to 50GB`, { path })\n partSize = MIN_PART_SIZE // min size for S3\n } else {\n partSize = Math.min(Math.max(Math.ceil(maxStreamLength / MAX_PART_NUMBER), MIN_PART_SIZE), MAX_PART_SIZE)\n }\n\n // ensure we don't try to upload a stream to big for this partSize\n let readCounter = 0\n const MAX_SIZE = MAX_PART_NUMBER * partSize\n const streamCutter = new Transform({\n transform(chunk, encoding, callback) {\n readCounter += chunk.length\n if (readCounter > MAX_SIZE) {\n callback(new Error(`read ${readCounter} bytes, maximum size allowed is ${MAX_SIZE} `))\n } else {\n callback(null, chunk)\n }\n },\n })\n\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, streamCutter, Body, () => {})\n\n const upload = new Upload({\n client: this.#s3,\n params: {\n ...this.#createParams(path),\n Body,\n },\n partSize,\n leavePartsOnError: false,\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 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 _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n async _sync() {\n await super._sync()\n try {\n // if Object Lock is enabled, each upload must come with a contentMD5 header\n // the computation of this md5 is memory-intensive, especially when uploading a stream\n const res = await this.#s3.send(new GetObjectLockConfigurationCommand({ Bucket: this.#bucket }))\n if (res.ObjectLockConfiguration?.ObjectLockEnabled === 'Enabled') {\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n // will automatically add the contentMD5 header to any upload to S3\n this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config))\n }\n } catch (error) {\n if (error.Code !== 'ObjectLockConfigurationNotFoundError' && error.$metadata.httpStatusCode !== 501) {\n throw error\n }\n }\n }\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": "4.1.
|
|
4
|
+
"version": "4.1.2",
|
|
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",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"cross-env": "^7.0.2",
|
|
54
54
|
"dotenv": "^16.0.0",
|
|
55
55
|
"rimraf": "^5.0.1",
|
|
56
|
-
"sinon": "^
|
|
56
|
+
"sinon": "^16.0.0",
|
|
57
57
|
"test": "^3.3.0",
|
|
58
58
|
"tmp": "^0.2.1"
|
|
59
59
|
},
|