@xen-orchestra/fs 3.3.0 → 3.3.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/README.md +2 -2
- package/dist/_copyStreamToBuffer.js.map +1 -1
- package/dist/_createBufferFromStream.js.map +1 -1
- package/dist/_encryptor.js +0 -1
- package/dist/_encryptor.js.map +1 -1
- package/dist/_guessAwsRegion.js.map +1 -1
- package/dist/_mount.js +0 -2
- package/dist/_mount.js.map +1 -1
- package/dist/abstract.js +3 -21
- package/dist/abstract.js.map +1 -1
- package/dist/checksum.js +2 -4
- package/dist/checksum.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/local.js +0 -1
- package/dist/local.js.map +1 -1
- package/dist/nfs.js.map +1 -1
- package/dist/path.js +0 -1
- package/dist/path.js.map +1 -1
- package/dist/s3.js +0 -10
- package/dist/s3.js.map +1 -1
- package/dist/smb.js.map +1 -1
- package/package.json +5 -5
- package/encryption.json +0 -1
- package/metadata.json +0 -1
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_copyStreamToBuffer.js","names":["copyStreamToBuffer","inputStream","destinationBuffer","Promise","resolve","reject","index","on","chunk","copy","length","err"],"sources":["../src/_copyStreamToBuffer.js"],"sourcesContent":["/**\n * @param {Readable} inputStream\n * @param {Buffer} destinationBuffer\n * @returns {Promise<int>} Buffer length\n * @private\n */\nexport default function copyStreamToBuffer(inputStream, destinationBuffer) {\n return new Promise((resolve, reject) => {\n let index = 0\n\n inputStream.on('data', chunk => {\n chunk.copy(destinationBuffer, index)\n index += chunk.length\n })\n inputStream.on('end', () => resolve(index))\n inputStream.on('error', err => reject(err))\n })\n}\n"],"mappings":";;;;;;AAMe,SAASA,
|
|
1
|
+
{"version":3,"file":"_copyStreamToBuffer.js","names":["copyStreamToBuffer","inputStream","destinationBuffer","Promise","resolve","reject","index","on","chunk","copy","length","err"],"sources":["../src/_copyStreamToBuffer.js"],"sourcesContent":["/**\n * @param {Readable} inputStream\n * @param {Buffer} destinationBuffer\n * @returns {Promise<int>} Buffer length\n * @private\n */\nexport default function copyStreamToBuffer(inputStream, destinationBuffer) {\n return new Promise((resolve, reject) => {\n let index = 0\n\n inputStream.on('data', chunk => {\n chunk.copy(destinationBuffer, index)\n index += chunk.length\n })\n inputStream.on('end', () => resolve(index))\n inputStream.on('error', err => reject(err))\n })\n}\n"],"mappings":";;;;;;AAMe,SAASA,kBAAkBA,CAACC,WAAW,EAAEC,iBAAiB,EAAE;EACzE,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtC,IAAIC,KAAK,GAAG,CAAC;IAEbL,WAAW,CAACM,EAAE,CAAC,MAAM,EAAEC,KAAK,IAAI;MAC9BA,KAAK,CAACC,IAAI,CAACP,iBAAiB,EAAEI,KAAK,CAAC;MACpCA,KAAK,IAAIE,KAAK,CAACE,MAAM;IACvB,CAAC,CAAC;IACFT,WAAW,CAACM,EAAE,CAAC,KAAK,EAAE,MAAMH,OAAO,CAACE,KAAK,CAAC,CAAC;IAC3CL,WAAW,CAACM,EAAE,CAAC,OAAO,EAAEI,GAAG,IAAIN,MAAM,CAACM,GAAG,CAAC,CAAC;EAC7C,CAAC,CAAC;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_createBufferFromStream.js","names":["createBufferFromStream","stream","Promise","resolve","reject","chunks","on","chunk","push","Buffer","concat","error"],"sources":["../src/_createBufferFromStream.js"],"sourcesContent":["/**\n * @param {Readable} stream\n * @returns {Promise<Buffer>}\n * @private\n */\nexport default function createBufferFromStream(stream) {\n return new Promise((resolve, reject) => {\n const chunks = []\n stream.on('data', chunk => chunks.push(chunk))\n stream.on('end', () => resolve(Buffer.concat(chunks)))\n stream.on('error', error => reject(error))\n })\n}\n"],"mappings":";;;;;;AAKe,SAASA,
|
|
1
|
+
{"version":3,"file":"_createBufferFromStream.js","names":["createBufferFromStream","stream","Promise","resolve","reject","chunks","on","chunk","push","Buffer","concat","error"],"sources":["../src/_createBufferFromStream.js"],"sourcesContent":["/**\n * @param {Readable} stream\n * @returns {Promise<Buffer>}\n * @private\n */\nexport default function createBufferFromStream(stream) {\n return new Promise((resolve, reject) => {\n const chunks = []\n stream.on('data', chunk => chunks.push(chunk))\n stream.on('end', () => resolve(Buffer.concat(chunks)))\n stream.on('error', error => reject(error))\n })\n}\n"],"mappings":";;;;;;AAKe,SAASA,sBAAsBA,CAACC,MAAM,EAAE;EACrD,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtC,MAAMC,MAAM,GAAG,EAAE;IACjBJ,MAAM,CAACK,EAAE,CAAC,MAAM,EAAEC,KAAK,IAAIF,MAAM,CAACG,IAAI,CAACD,KAAK,CAAC,CAAC;IAC9CN,MAAM,CAACK,EAAE,CAAC,KAAK,EAAE,MAAMH,OAAO,CAACM,MAAM,CAACC,MAAM,CAACL,MAAM,CAAC,CAAC,CAAC;IACtDJ,MAAM,CAACK,EAAE,CAAC,OAAO,EAAEK,KAAK,IAAIP,MAAM,CAACO,KAAK,CAAC,CAAC;EAC5C,CAAC,CAAC;AACJ"}
|
package/dist/_encryptor.js
CHANGED
|
@@ -61,7 +61,6 @@ function getEncryptor(algorithm = DEFAULT_ENCRYPTION_ALGORITHM, key) {
|
|
|
61
61
|
}
|
|
62
62
|
function decryptStream(encryptedStream) {
|
|
63
63
|
return pipeline(encryptedStream, async function* (source) {
|
|
64
|
-
|
|
65
64
|
const iv = await readChunk(source, ivLength);
|
|
66
65
|
const cipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv);
|
|
67
66
|
let authTag = Buffer.alloc(0);
|
package/dist/_encryptor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_encryptor.js","names":["pipeline","require","readChunk","crypto","DEFAULT_ENCRYPTION_ALGORITHM","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","
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_guessAwsRegion.js","names":["guessAwsRegion","host","matches","exec"],"sources":["../src/_guessAwsRegion.js"],"sourcesContent":["export default function guessAwsRegion(host) {\n const matches = /^s3\\.([^.]+)\\.amazonaws.com$/.exec(host)\n return matches !== null ? matches[1] : 'us-east-1'\n}\n"],"mappings":";;;;;;AAAe,SAASA,
|
|
1
|
+
{"version":3,"file":"_guessAwsRegion.js","names":["guessAwsRegion","host","matches","exec"],"sources":["../src/_guessAwsRegion.js"],"sourcesContent":["export default function guessAwsRegion(host) {\n const matches = /^s3\\.([^.]+)\\.amazonaws.com$/.exec(host)\n return matches !== null ? matches[1] : 'us-east-1'\n}\n"],"mappings":";;;;;;AAAe,SAASA,cAAcA,CAACC,IAAI,EAAE;EAC3C,MAAMC,OAAO,GAAG,8BAA8B,CAACC,IAAI,CAACF,IAAI,CAAC;EACzD,OAAOC,OAAO,KAAK,IAAI,GAAGA,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW;AACpD"}
|
package/dist/_mount.js
CHANGED
|
@@ -60,7 +60,6 @@ class MountHandler extends _local.default {
|
|
|
60
60
|
options,
|
|
61
61
|
env
|
|
62
62
|
} = this._params;
|
|
63
|
-
|
|
64
63
|
await this._execa('mount', ['-o', options, '-t', type, device, realPath], {
|
|
65
64
|
env: {
|
|
66
65
|
LANG: 'C',
|
|
@@ -76,7 +75,6 @@ class MountHandler extends _local.default {
|
|
|
76
75
|
throw error;
|
|
77
76
|
}
|
|
78
77
|
}
|
|
79
|
-
|
|
80
78
|
const keeperPath = `${realPath}/.keeper_${Math.random().toString(36).slice(2)}`;
|
|
81
79
|
this._keeper = await _fsExtra.default.open(keeperPath, 'w');
|
|
82
80
|
_promiseToolbox.ignoreErrors.call(_fsExtra.default.unlink(keeperPath));
|
package/dist/_mount.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_mount.js","names":["sudoExeca","command","args","opts","execa","MountHandler","LocalHandler","constructor","remote","mountsDir","join","tmpdir","useSudo","params","
|
|
1
|
+
{"version":3,"file":"_mount.js","names":["_execa","_interopRequireDefault","require","_fsExtra","_promiseToolbox","_path","_os","_local","obj","__esModule","default","sudoExeca","command","args","opts","execa","MountHandler","LocalHandler","constructor","remote","mountsDir","join","tmpdir","useSudo","params","_keeper","undefined","_params","options","defaultOptions","filter","_","_realPath","id","Math","random","toString","slice","_forget","keeper","fs","close","ignoreErrors","call","_getRealPath","env","LANG","_sync","realPath","ensureDir","type","device","error","stdio","keeperPath","open","unlink","exports"],"sources":["../src/_mount.js"],"sourcesContent":["import execa from 'execa'\nimport fs from 'fs-extra'\nimport { ignoreErrors } from 'promise-toolbox'\nimport { join } from 'path'\nimport { tmpdir } from 'os'\n\nimport LocalHandler from './local'\n\nconst sudoExeca = (command, args, opts) => execa('sudo', [command, ...args], opts)\n\nexport default class MountHandler extends LocalHandler {\n constructor(remote, { mountsDir = join(tmpdir(), 'xo-fs-mounts'), useSudo = false, ...opts } = {}, params) {\n super(remote, opts)\n\n this._execa = useSudo ? sudoExeca : execa\n this._keeper = undefined\n this._params = {\n ...params,\n options: [params.options, remote.options ?? params.defaultOptions].filter(_ => _ !== undefined).join(','),\n }\n this._realPath = join(mountsDir, remote.id || Math.random().toString(36).slice(2))\n }\n\n async _forget() {\n const keeper = this._keeper\n if (keeper === undefined) {\n return\n }\n this._keeper = undefined\n await fs.close(keeper)\n\n await ignoreErrors.call(\n this._execa('umount', [this._getRealPath()], {\n env: {\n LANG: 'C',\n },\n })\n )\n }\n\n _getRealPath() {\n return this._realPath\n }\n\n async _sync() {\n // in case of multiple `sync`s, ensure we properly close previous keeper\n {\n const keeper = this._keeper\n if (keeper !== undefined) {\n this._keeper = undefined\n ignoreErrors.call(fs.close(keeper))\n }\n }\n\n const realPath = this._getRealPath()\n\n await fs.ensureDir(realPath)\n\n try {\n const { type, device, options, env } = this._params\n\n // Linux mount is more flexible in which order the mount arguments appear.\n // But FreeBSD requires this order of the arguments.\n await this._execa('mount', ['-o', options, '-t', type, device, realPath], {\n env: {\n LANG: 'C',\n ...env,\n },\n })\n } catch (error) {\n try {\n // the failure may mean it's already mounted, use `findmnt` to check\n // that's the case\n await this._execa('findmnt', [realPath], {\n stdio: 'ignore',\n })\n } catch (_) {\n throw error\n }\n }\n\n // keep an open file on the mount to prevent it from being unmounted if used\n // by another handler/process\n const keeperPath = `${realPath}/.keeper_${Math.random().toString(36).slice(2)}`\n this._keeper = await fs.open(keeperPath, 'w')\n ignoreErrors.call(fs.unlink(keeperPath))\n }\n}\n"],"mappings":"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"}
|
package/dist/abstract.js
CHANGED
|
@@ -24,7 +24,7 @@ function _applyDecoratedDescriptor(target, property, decorators, descriptor, con
|
|
|
24
24
|
const {
|
|
25
25
|
info,
|
|
26
26
|
warn
|
|
27
|
-
} = (0, _log.createLogger)('
|
|
27
|
+
} = (0, _log.createLogger)('xo:fs:abstract');
|
|
28
28
|
const checksumFile = file => file + '.checksum';
|
|
29
29
|
const computeRate = (hrtime, size) => {
|
|
30
30
|
const seconds = hrtime[0] + hrtime[1] / 1e9;
|
|
@@ -48,7 +48,6 @@ class PrefixWrapper {
|
|
|
48
48
|
get type() {
|
|
49
49
|
return this._handler.type;
|
|
50
50
|
}
|
|
51
|
-
|
|
52
51
|
async list(dir, opts) {
|
|
53
52
|
const entries = await this._handler.list(this._resolve(dir), opts);
|
|
54
53
|
if (opts != null && opts.prependDir) {
|
|
@@ -111,7 +110,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
111
110
|
this._forget = (0, _coalesceCalls.coalesceCalls)(this._forget);
|
|
112
111
|
this._sync = (0, _coalesceCalls.coalesceCalls)(this._sync);
|
|
113
112
|
}
|
|
114
|
-
|
|
115
113
|
get type() {
|
|
116
114
|
throw new Error('Not implemented');
|
|
117
115
|
}
|
|
@@ -137,7 +135,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
137
135
|
...options,
|
|
138
136
|
highWaterMark: this._highWaterMark
|
|
139
137
|
}), this._timeout);
|
|
140
|
-
|
|
141
138
|
await (0, _promiseToolbox.fromEvent)(stream, 'readable');
|
|
142
139
|
if (checksum) {
|
|
143
140
|
try {
|
|
@@ -162,14 +159,11 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
162
159
|
if (stream.length === undefined && options.end === undefined && options.start === undefined) {
|
|
163
160
|
try {
|
|
164
161
|
stream.length = await this._getSize(file);
|
|
165
|
-
} catch (error) {
|
|
166
|
-
}
|
|
162
|
+
} catch (error) {}
|
|
167
163
|
}
|
|
168
164
|
}
|
|
169
|
-
|
|
170
165
|
return stream;
|
|
171
166
|
}
|
|
172
|
-
|
|
173
167
|
async outputStream(path, input, {
|
|
174
168
|
checksum = true,
|
|
175
169
|
dirMode,
|
|
@@ -194,14 +188,12 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
194
188
|
});
|
|
195
189
|
}
|
|
196
190
|
}
|
|
197
|
-
|
|
198
191
|
async forget() {
|
|
199
192
|
await this._forget();
|
|
200
193
|
}
|
|
201
194
|
async getInfo() {
|
|
202
195
|
return _promiseToolbox.timeout.call(this._getInfo(), this._timeout);
|
|
203
196
|
}
|
|
204
|
-
|
|
205
197
|
async getSize(file) {
|
|
206
198
|
_assert.default.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`);
|
|
207
199
|
const size = await _promiseToolbox.timeout.call(this._getSize(typeof file === 'string' ? (0, _path.normalize)(file) : file), this._timeout);
|
|
@@ -320,7 +312,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
320
312
|
async rmtree(dir) {
|
|
321
313
|
await this._rmtree((0, _path.normalize)(dir));
|
|
322
314
|
}
|
|
323
|
-
|
|
324
315
|
async sync() {
|
|
325
316
|
await this._sync();
|
|
326
317
|
try {
|
|
@@ -343,12 +334,10 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
343
334
|
algorithm: encryptionAlgorithm
|
|
344
335
|
}), {
|
|
345
336
|
flags: 'w'
|
|
346
|
-
}),
|
|
347
|
-
this.writeFile(ENCRYPTION_METADATA_FILENAME, `{"random":"${(0, _crypto.randomUUID)()}"}`, {
|
|
337
|
+
}), this.writeFile(ENCRYPTION_METADATA_FILENAME, `{"random":"${(0, _crypto.randomUUID)()}"}`, {
|
|
348
338
|
flags: 'w'
|
|
349
339
|
})]);
|
|
350
340
|
}
|
|
351
|
-
|
|
352
341
|
async _checkMetadata() {
|
|
353
342
|
let encryptionAlgorithm = 'none';
|
|
354
343
|
let data;
|
|
@@ -369,7 +358,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
369
358
|
} catch (error) {
|
|
370
359
|
if (encryptionAlgorithm !== 'none') {
|
|
371
360
|
if (await this._canWriteMetadata()) {
|
|
372
|
-
|
|
373
361
|
info('will update metadata of this remote');
|
|
374
362
|
return this._createMetadata();
|
|
375
363
|
} else {
|
|
@@ -444,7 +432,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
444
432
|
flags
|
|
445
433
|
});
|
|
446
434
|
}
|
|
447
|
-
|
|
448
435
|
async __closeFile(fd) {
|
|
449
436
|
await _promiseToolbox.timeout.call(this._closeFile(fd.fd), this._timeout);
|
|
450
437
|
}
|
|
@@ -459,7 +446,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
459
446
|
if (error == null || error.code !== 'EEXIST') {
|
|
460
447
|
throw error;
|
|
461
448
|
}
|
|
462
|
-
|
|
463
449
|
await this._list(dir);
|
|
464
450
|
}
|
|
465
451
|
}
|
|
@@ -470,7 +456,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
470
456
|
path
|
|
471
457
|
};
|
|
472
458
|
}
|
|
473
|
-
|
|
474
459
|
useVhdDirectory() {
|
|
475
460
|
return this._remote.useVhdDirectory ?? false;
|
|
476
461
|
}
|
|
@@ -499,11 +484,9 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
499
484
|
async _createReadStream(file, options) {
|
|
500
485
|
throw new Error('Not implemented');
|
|
501
486
|
}
|
|
502
|
-
|
|
503
487
|
async _createWriteStream(file, options) {
|
|
504
488
|
throw new Error('Not implemented');
|
|
505
489
|
}
|
|
506
|
-
|
|
507
490
|
async _forget() {}
|
|
508
491
|
async _getInfo() {
|
|
509
492
|
return {};
|
|
@@ -617,7 +600,6 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
|
|
|
617
600
|
}));
|
|
618
601
|
return this._rmtree(dir);
|
|
619
602
|
}
|
|
620
|
-
|
|
621
603
|
async _sync() {}
|
|
622
604
|
async _unlink(file) {
|
|
623
605
|
throw new Error('Not implemented');
|
package/dist/abstract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract.js","names":["info","warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ENCRYPTION_DESC_FILENAME","ENCRYPTION_METADATA_FILENAME","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","constructor","handler","prefix","_prefix","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","forEach","entry","i","slice","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","encryptor","_encryptor","undefined","Error","remote","options","url","_remote","parse","highWaterMark","_highWaterMark","timeout","_timeout","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","fd","__closeFile","createReadStream","checksum","ignoreMissingChecksum","end","start","assert","strictEqual","isEncrypted","stream","call","_createReadStream","fromEvent","_readFile","flags","validChecksumOfReadStream","String","trim","decryptStream","_getSize","outputStream","input","dirMode","validator","checksumStream","encryptStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","ivLength","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mode","__mkdir","mktree","_mktree","__openFile","data","encryptedData","encryptData","buffer","position","_read","decryptData","createTree","p","_rename","Promise","all","dirname","_copy","_rmdir","catch","rmtree","_rmtree","sync","_checkMetadata","_canWriteMetadata","e","startsWith","_createMetadata","encryptionAlgorithm","encryptionKey","DEFAULT_ENCRYPTION_ALGORITHM","_getEncryptor","_writeFile","JSON","stringify","algorithm","randomUUID","json","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","ignoreErrors","_unlink","len","_truncate","_write","_closeFile","_mkdir","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","resolve","tmpPath","basename","output","then","getStream","files","asyncMapSettled","isPath","_writeFd","id","createPrefixWrapperMethods","pPw","pRha","defineProperty","getOwnPropertyDescriptor","hasOwnProperty","Object","getOwnPropertyNames","name","descriptor","value","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import asyncMapSettled from '@xen-orchestra/async-map/legacy'\nimport assert from 'assert'\nimport getStream from 'get-stream'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\nimport { DEFAULT_ENCRYPTION_ALGORITHM, _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('@xen-orchestra:fs')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ENCRYPTION_DESC_FILENAME = 'encryption.json'\nconst ENCRYPTION_METADATA_FILENAME = 'metadata.json'\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n constructor(handler, prefix) {\n this._prefix = prefix\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this._prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n _resolve(path) {\n return this._prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n #encryptor\n\n get _encryptor() {\n if (this.#encryptor === undefined) {\n throw new Error(`Can't access to encryptor before remote synchronization`)\n }\n return this.#encryptor\n }\n\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async closeFile(fd) {\n await this.__closeFile(fd)\n }\n\n async createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (options.end !== undefined || options.start !== undefined) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`)\n }\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n\n let stream = await timeout.call(\n this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }),\n this._timeout\n )\n\n // detect early errors\n await fromEvent(stream, 'readable')\n\n if (checksum) {\n try {\n const path = typeof file === 'string' ? file : file.path\n const checksum = await this._readFile(checksumFile(path), { flags: 'r' })\n\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n } catch (error) {\n if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {\n throw error\n }\n }\n }\n\n if (this.isEncrypted) {\n stream = this._encryptor.decryptStream(stream)\n } else {\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n try {\n stream.length = await this._getSize(file)\n } catch (error) {\n // ignore errors\n }\n }\n }\n\n return stream\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n\n input = this._encryptor.encryptStream(input)\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n validator,\n })\n if (checksum) {\n // using _outpuFile means the checksum will NOT be encrypted\n // it is by design to allow checking of encrypted files without the key\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n // when using encryption, the file size is aligned with the encryption block size ( 16 bytes )\n // that means that the size will be 1 to 16 bytes more than the content size + the initialized vector length (16 bytes)\n async getSize(file) {\n assert.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`)\n\n const size = await timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n return size - this._encryptor.ivLength\n }\n\n async list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mkdir(dir, { mode } = {}) {\n await this.__mkdir(normalizePath(dir), { mode })\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n openFile(path, flags) {\n return this.__openFile(path, flags)\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._outputFile(normalizePath(file), encryptedData, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`)\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async readFile(file, { flags = 'r' } = {}) {\n const data = await this._readFile(normalizePath(file), { flags })\n return this._encryptor.decryptData(data)\n }\n\n async #rename(oldPath, newPath, { checksum }, createTree = true) {\n try {\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n await p\n } catch (error) {\n // ENOENT can be a missing target directory OR a missing source\n if (error.code === 'ENOENT' && createTree) {\n await this._mktree(dirname(newPath))\n return this.#rename(oldPath, newPath, { checksum }, false)\n }\n throw error\n }\n }\n\n rename(oldPath, newPath, { checksum = false } = {}) {\n return this.#rename(normalizePath(oldPath), normalizePath(newPath), { checksum })\n }\n\n async copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n try {\n await this._checkMetadata()\n } catch (error) {\n await this._forget()\n throw error\n }\n }\n\n async _canWriteMetadata() {\n const list = await this.list('/', {\n filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME,\n })\n return list.length === 0\n }\n\n async _createMetadata() {\n const encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n this.#encryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n\n await Promise.all([\n this._writeFile(normalizePath(ENCRYPTION_DESC_FILENAME), JSON.stringify({ algorithm: encryptionAlgorithm }), {\n flags: 'w',\n }), // not encrypted\n this.writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async _checkMetadata() {\n let encryptionAlgorithm = 'none'\n let data\n try {\n // this file is not encrypted\n data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME), 'utf-8')\n const json = JSON.parse(data)\n encryptionAlgorithm = json.algorithm\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n }\n\n try {\n this.#encryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n // this file is encrypted\n const data = await this.readFile(ENCRYPTION_METADATA_FILENAME, 'utf-8')\n JSON.parse(data)\n } catch (error) {\n // can be enoent, bad algorithm, or broeken json ( bad key or algorithm)\n if (encryptionAlgorithm !== 'none') {\n if (await this._canWriteMetadata()) {\n // any other error , but on empty remote => update with remote settings\n\n info('will update metadata of this remote')\n return this._createMetadata()\n } else {\n warn(\n `The encryptionKey settings of this remote does not match the key used to create it. You won't be able to read any data from this remote`,\n { error }\n )\n // will probably send a ERR_OSSL_EVP_BAD_DECRYPT if key is incorrect\n throw error\n }\n }\n }\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`)\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async writeFile(file, data, { flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._writeFile(normalizePath(file), encryptedData, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await timeout.call(\n this._createOutputStream(tmpPath, {\n dirMode,\n flags: 'wx',\n }),\n this._timeout\n )\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.rename(tmpPath, path)\n } catch (error) {\n await this.unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncMapSettled(files, file =>\n this._unlink(`${dir}/${file}`).catch(error => {\n // Unlink dir behavior is not consistent across platforms\n // https://github.com/nodejs/node-v0.x-archive/issues/5791\n if (error.code === 'EISDIR' || error.code === 'EPERM') {\n return this._rmtree(`${dir}/${file}`)\n }\n throw error\n })\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n\n get isEncrypted() {\n return this._encryptor.id !== 'NULL_ENCRYPTOR'\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abstract.js","names":["_legacy","_interopRequireDefault","require","_assert","_getStream","_coalesceCalls","_log","_promiseToolbox","_limitConcurrencyDecorator","_xoRemoteParser","_stream","_crypto","_decoratorSynchronized","_path","_checksum","_encryptor","_dec","_dec2","_class","obj","__esModule","default","_applyDecoratedDescriptor","target","property","decorators","descriptor","context","desc","Object","keys","forEach","key","enumerable","configurable","initializer","writable","slice","reverse","reduce","decorator","value","call","undefined","defineProperty","info","warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ENCRYPTION_DESC_FILENAME","ENCRYPTION_METADATA_FILENAME","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","constructor","handler","prefix","_prefix","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","entry","i","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","encryptor","Error","remote","options","url","_remote","parse","highWaterMark","_highWaterMark","timeout","_timeout","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","fd","__closeFile","createReadStream","checksum","ignoreMissingChecksum","end","start","assert","strictEqual","isEncrypted","stream","_createReadStream","fromEvent","_readFile","flags","validChecksumOfReadStream","String","trim","decryptStream","_getSize","outputStream","input","dirMode","validator","checksumStream","encryptStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","ivLength","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mode","__mkdir","mktree","_mktree","__openFile","data","encryptedData","encryptData","buffer","position","_read","decryptData","#rename","createTree","p","_rename","Promise","all","dirname","_copy","_rmdir","catch","rmtree","_rmtree","sync","_checkMetadata","_canWriteMetadata","e","startsWith","_createMetadata","encryptionAlgorithm","encryptionKey","DEFAULT_ENCRYPTION_ALGORITHM","_getEncryptor","_writeFile","JSON","stringify","algorithm","randomUUID","json","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","ignoreErrors","_unlink","len","_truncate","_write","_closeFile","_mkdir","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","resolve","tmpPath","basename","output","then","getStream","files","asyncMapSettled","isPath","_writeFd","id","getOwnPropertyDescriptor","exports","createPrefixWrapperMethods","pPw","pRha","hasOwnProperty","getOwnPropertyNames","name","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import asyncMapSettled from '@xen-orchestra/async-map/legacy'\nimport assert from 'assert'\nimport getStream from 'get-stream'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\nimport { DEFAULT_ENCRYPTION_ALGORITHM, _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('xo:fs:abstract')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ENCRYPTION_DESC_FILENAME = 'encryption.json'\nconst ENCRYPTION_METADATA_FILENAME = 'metadata.json'\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n constructor(handler, prefix) {\n this._prefix = prefix\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this._prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n _resolve(path) {\n return this._prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n #encryptor\n\n get _encryptor() {\n if (this.#encryptor === undefined) {\n throw new Error(`Can't access to encryptor before remote synchronization`)\n }\n return this.#encryptor\n }\n\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async closeFile(fd) {\n await this.__closeFile(fd)\n }\n\n async createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (options.end !== undefined || options.start !== undefined) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`)\n }\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n\n let stream = await timeout.call(\n this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }),\n this._timeout\n )\n\n // detect early errors\n await fromEvent(stream, 'readable')\n\n if (checksum) {\n try {\n const path = typeof file === 'string' ? file : file.path\n const checksum = await this._readFile(checksumFile(path), { flags: 'r' })\n\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n } catch (error) {\n if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {\n throw error\n }\n }\n }\n\n if (this.isEncrypted) {\n stream = this._encryptor.decryptStream(stream)\n } else {\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n try {\n stream.length = await this._getSize(file)\n } catch (error) {\n // ignore errors\n }\n }\n }\n\n return stream\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n\n input = this._encryptor.encryptStream(input)\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n validator,\n })\n if (checksum) {\n // using _outpuFile means the checksum will NOT be encrypted\n // it is by design to allow checking of encrypted files without the key\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n // when using encryption, the file size is aligned with the encryption block size ( 16 bytes )\n // that means that the size will be 1 to 16 bytes more than the content size + the initialized vector length (16 bytes)\n async getSize(file) {\n assert.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`)\n\n const size = await timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n return size - this._encryptor.ivLength\n }\n\n async list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mkdir(dir, { mode } = {}) {\n await this.__mkdir(normalizePath(dir), { mode })\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n openFile(path, flags) {\n return this.__openFile(path, flags)\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._outputFile(normalizePath(file), encryptedData, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`)\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async readFile(file, { flags = 'r' } = {}) {\n const data = await this._readFile(normalizePath(file), { flags })\n return this._encryptor.decryptData(data)\n }\n\n async #rename(oldPath, newPath, { checksum }, createTree = true) {\n try {\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n await p\n } catch (error) {\n // ENOENT can be a missing target directory OR a missing source\n if (error.code === 'ENOENT' && createTree) {\n await this._mktree(dirname(newPath))\n return this.#rename(oldPath, newPath, { checksum }, false)\n }\n throw error\n }\n }\n\n rename(oldPath, newPath, { checksum = false } = {}) {\n return this.#rename(normalizePath(oldPath), normalizePath(newPath), { checksum })\n }\n\n async copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n try {\n await this._checkMetadata()\n } catch (error) {\n await this._forget()\n throw error\n }\n }\n\n async _canWriteMetadata() {\n const list = await this.list('/', {\n filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME,\n })\n return list.length === 0\n }\n\n async _createMetadata() {\n const encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n this.#encryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n\n await Promise.all([\n this._writeFile(normalizePath(ENCRYPTION_DESC_FILENAME), JSON.stringify({ algorithm: encryptionAlgorithm }), {\n flags: 'w',\n }), // not encrypted\n this.writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async _checkMetadata() {\n let encryptionAlgorithm = 'none'\n let data\n try {\n // this file is not encrypted\n data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME), 'utf-8')\n const json = JSON.parse(data)\n encryptionAlgorithm = json.algorithm\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n encryptionAlgorithm = this._remote.encryptionKey === undefined ? 'none' : DEFAULT_ENCRYPTION_ALGORITHM\n }\n\n try {\n this.#encryptor = _getEncryptor(encryptionAlgorithm, this._remote.encryptionKey)\n // this file is encrypted\n const data = await this.readFile(ENCRYPTION_METADATA_FILENAME, 'utf-8')\n JSON.parse(data)\n } catch (error) {\n // can be enoent, bad algorithm, or broeken json ( bad key or algorithm)\n if (encryptionAlgorithm !== 'none') {\n if (await this._canWriteMetadata()) {\n // any other error , but on empty remote => update with remote settings\n\n info('will update metadata of this remote')\n return this._createMetadata()\n } else {\n warn(\n `The encryptionKey settings of this remote does not match the key used to create it. You won't be able to read any data from this remote`,\n { error }\n )\n // will probably send a ERR_OSSL_EVP_BAD_DECRYPT if key is incorrect\n throw error\n }\n }\n }\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`)\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async writeFile(file, data, { flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._writeFile(normalizePath(file), encryptedData, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await timeout.call(\n this._createOutputStream(tmpPath, {\n dirMode,\n flags: 'wx',\n }),\n this._timeout\n )\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.rename(tmpPath, path)\n } catch (error) {\n await this.unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncMapSettled(files, file =>\n this._unlink(`${dir}/${file}`).catch(error => {\n // Unlink dir behavior is not consistent across platforms\n // https://github.com/nodejs/node-v0.x-archive/issues/5791\n if (error.code === 'EISDIR' || error.code === 'EPERM') {\n return this._rmtree(`${dir}/${file}`)\n }\n throw error\n })\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n\n get isEncrypted() {\n return this._encryptor.id !== 'NULL_ENCRYPTOR'\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,UAAA,GAAAH,sBAAA,CAAAC,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;EAClBC,WAAWA,CAACC,OAAO,EAAEC,MAAM,EAAE;IAC3B,IAAI,CAACC,OAAO,GAAGD,MAAM;IACrB,IAAI,CAACE,QAAQ,GAAGH,OAAO;EACzB;EAEA,IAAII,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,CAACT,OAAO,CAACU,MAAM;MAC7BJ,OAAO,CAAC3C,OAAO,CAAC,CAACgD,KAAK,EAAEC,CAAC,EAAEN,OAAO,KAAK;QACrCA,OAAO,CAACM,CAAC,CAAC,GAAGD,KAAK,CAAC1C,KAAK,CAACwC,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;EAEAR,QAAQA,CAACS,IAAI,EAAE;IACb,OAAO,IAAI,CAAChB,OAAO,GAAG,IAAAiB,eAAa,EAACD,IAAI,CAAC;EAC3C;AACF;AAAC,IAEoBE,qBAAqB,IAAAtE,IAAA,GA8IvC,IAAAuE,mCAAY,GAAE,EAAAtE,KAAA,GAuHd,IAAAsE,mCAAY,GAAE,GAAArE,MAAA,GArQF,MAAMoE,qBAAqB,CAAC;EACzC,CAACE,SAAS;EAEV,IAAIzE,UAAUA,CAAA,EAAG;IACf,IAAI,IAAI,CAAC,CAACyE,SAAS,KAAK7C,SAAS,EAAE;MACjC,MAAM,IAAI8C,KAAK,CAAE,yDAAwD,CAAC;IAC5E;IACA,OAAO,IAAI,CAAC,CAACD,SAAS;EACxB;EAEAvB,WAAWA,CAACyB,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,CAACvB,IAAI,KAAK,IAAI,CAACA,IAAI,EAAE;QACnC,MAAM,IAAImB,KAAK,CAAC,uBAAuB,CAAC;MAC1C;IACF;IACA;IAAC,CAAC;MAAEM,aAAa,EAAE,IAAI,CAACC,cAAc;MAAEC,OAAO,EAAE,IAAI,CAACC,QAAQ,GAAG5C;IAAgB,CAAC,GAAGqC,OAAO;IAE5F,MAAMQ,WAAW,GAAG,IAAAC,2CAAgB,EAACT,OAAO,CAACU,qBAAqB,IAAI9C,+BAA+B,CAAC;IACtG,IAAI,CAAC+C,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,CAAClC,IAAI,GAAG4B,WAAW,CAAC,IAAI,CAAC5B,IAAI,CAAC;IAClC,IAAI,CAACmC,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,CAAC7B,MAAM,GAAGkB,WAAW,CAAC,IAAI,CAAClB,MAAM,CAAC;IACtC,IAAI,CAAC8B,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;EAIA,IAAIhD,IAAIA,CAAA,EAAG;IACT,MAAM,IAAImB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA8B,SAASA,CAACpD,MAAM,EAAE;IAChBA,MAAM,GAAG,IAAAkB,eAAa,EAAClB,MAAM,CAAC;IAC9B,OAAOA,MAAM,KAAK,GAAG,GAAG,IAAI,GAAG,IAAIH,aAAa,CAAC,IAAI,EAAEG,MAAM,CAAC;EAChE;EAEA,MAAMmC,SAASA,CAACkB,EAAE,EAAE;IAClB,MAAM,IAAI,CAACC,WAAW,CAACD,EAAE,CAAC;EAC5B;EAEA,MAAME,gBAAgBA,CAACzE,IAAI,EAAE;IAAE0E,QAAQ,GAAG,KAAK;IAAEC,qBAAqB,GAAG,KAAK;IAAE,GAAGjC;EAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;IACjG,IAAIA,OAAO,CAACkC,GAAG,KAAKlF,SAAS,IAAIgD,OAAO,CAACmC,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,IAAAoC,eAAa,EAACpC,IAAI,CAAC;IAC5B;IAEA,IAAIiF,MAAM,GAAG,MAAMjC,uBAAO,CAACvD,IAAI,CAC7B,IAAI,CAACyF,iBAAiB,CAAClF,IAAI,EAAE;MAAE,GAAG0C,OAAO;MAAEI,aAAa,EAAE,IAAI,CAACC;IAAe,CAAC,CAAC,EAChF,IAAI,CAACE,QAAQ,CACd;IAGD,MAAM,IAAAkC,yBAAS,EAACF,MAAM,EAAE,UAAU,CAAC;IAEnC,IAAIP,QAAQ,EAAE;MACZ,IAAI;QACF,MAAMvC,IAAI,GAAG,OAAOnC,IAAI,KAAK,QAAQ,GAAGA,IAAI,GAAGA,IAAI,CAACmC,IAAI;QACxD,MAAMuC,QAAQ,GAAG,MAAM,IAAI,CAACU,SAAS,CAACrF,YAAY,CAACoC,IAAI,CAAC,EAAE;UAAEkD,KAAK,EAAE;QAAI,CAAC,CAAC;QAEzE,MAAM;UAAExD;QAAO,CAAC,GAAGoD,MAAM;QACzBA,MAAM,GAAG,IAAAK,mCAAyB,EAACL,MAAM,EAAEM,MAAM,CAACb,QAAQ,CAAC,CAACc,IAAI,EAAE,CAAC;QACnEP,MAAM,CAACpD,MAAM,GAAGA,MAAM;MACxB,CAAC,CAAC,OAAOnB,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,CAACnH,UAAU,CAAC2H,aAAa,CAACR,MAAM,CAAC;IAChD,CAAC,MAAM;MAEL,IAAIA,MAAM,CAACpD,MAAM,KAAKnC,SAAS,IAAIgD,OAAO,CAACkC,GAAG,KAAKlF,SAAS,IAAIgD,OAAO,CAACmC,KAAK,KAAKnF,SAAS,EAAE;QAC3F,IAAI;UACFuF,MAAM,CAACpD,MAAM,GAAG,MAAM,IAAI,CAAC6D,QAAQ,CAAC1F,IAAI,CAAC;QAC3C,CAAC,CAAC,OAAOU,KAAK,EAAE,CAEhB;MACF;IACF;IAEA,OAAOuE,MAAM;EACf;EAYA,MAAMU,YAAYA,CAACxD,IAAI,EAAEyD,KAAK,EAAE;IAAElB,QAAQ,GAAG,IAAI;IAAEmB,OAAO;IAAEC;EAAU,CAAC,GAAG,CAAC,CAAC,EAAE;IAC5E3D,IAAI,GAAG,IAAAC,eAAa,EAACD,IAAI,CAAC;IAC1B,IAAI4D,cAAc;IAElBH,KAAK,GAAG,IAAI,CAAC9H,UAAU,CAACkI,aAAa,CAACJ,KAAK,CAAC;IAC5C,IAAIlB,QAAQ,EAAE;MACZqB,cAAc,GAAG,IAAAE,8BAAoB,GAAE;MACvC,IAAAC,gBAAQ,EAACN,KAAK,EAAEG,cAAc,EAAEnF,IAAI,CAAC;MACrCgF,KAAK,GAAGG,cAAc;IACxB;IACA,MAAM,IAAI,CAACI,aAAa,CAAChE,IAAI,EAAEyD,KAAK,EAAE;MACpCC,OAAO;MACPC;IACF,CAAC,CAAC;IACF,IAAIpB,QAAQ,EAAE;MAGZ,MAAM,IAAI,CAAC0B,WAAW,CAACrG,YAAY,CAACoC,IAAI,CAAC,EAAE,MAAM4D,cAAc,CAACrB,QAAQ,EAAE;QAAEmB,OAAO;QAAER,KAAK,EAAE;MAAK,CAAC,CAAC;IACrG;EACF;EAQA,MACMgB,MAAMA,CAAA,EAAG;IACb,MAAM,IAAI,CAAClC,OAAO,EAAE;EACtB;EAEA,MAAMZ,OAAOA,CAAA,EAAG;IACd,OAAOP,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAAC6G,QAAQ,EAAE,EAAE,IAAI,CAACrD,QAAQ,CAAC;EACrD;EAIA,MAAMO,OAAOA,CAACxD,IAAI,EAAE;IAClB8E,eAAM,CAACC,WAAW,CAAC,IAAI,CAACC,WAAW,EAAE,KAAK,EAAG,2CAA0ChF,IAAK,EAAC,CAAC;IAE9F,MAAMG,IAAI,GAAG,MAAM6C,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAACiG,QAAQ,CAAC,OAAO1F,IAAI,KAAK,QAAQ,GAAG,IAAAoC,eAAa,EAACpC,IAAI,CAAC,GAAGA,IAAI,CAAC,EAAE,IAAI,CAACiD,QAAQ,CAAC;IACpH,OAAO9C,IAAI,GAAG,IAAI,CAACrC,UAAU,CAACyI,QAAQ;EACxC;EAEA,MAAMjF,IAAIA,CAACC,GAAG,EAAE;IAAEiF,MAAM;IAAEC,aAAa,GAAG,KAAK;IAAE9E,UAAU,GAAG;EAAM,CAAC,GAAG,CAAC,CAAC,EAAE;IAC1E,IAAI;MACF,MAAM+E,UAAU,GAAG,IAAAtE,eAAa,EAACb,GAAG,CAAC;MACrCA,GAAG,GAAG,IAAAa,eAAa,EAACb,GAAG,CAAC;MAExB,IAAIE,OAAO,GAAG,MAAMuB,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAACkH,KAAK,CAACpF,GAAG,CAAC,EAAE,IAAI,CAAC0B,QAAQ,CAAC;MAChE,IAAIuD,MAAM,KAAK9G,SAAS,EAAE;QACxB+B,OAAO,GAAGA,OAAO,CAAC+E,MAAM,CAACA,MAAM,CAAC;MAClC;MAEA,IAAI7E,UAAU,EAAE;QACdF,OAAO,CAAC3C,OAAO,CAAC,CAACgD,KAAK,EAAEC,CAAC,KAAK;UAC5BN,OAAO,CAACM,CAAC,CAAC,GAAG2E,UAAU,GAAG,GAAG,GAAG5E,KAAK;QACvC,CAAC,CAAC;MACJ;MAEA,OAAOL,OAAO;IAChB,CAAC,CAAC,OAAOf,KAAK,EAAE;MACd,IAAI+F,aAAa,IAAI,CAAA/F,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEC,IAAI,MAAK,QAAQ,EAAE;QAC7C,OAAO,EAAE;MACX;MACA,MAAMD,KAAK;IACb;EACF;EAEA,MAAMkG,IAAIA,CAACzE,IAAI,EAAE;IACfA,IAAI,GAAG,IAAAC,eAAa,EAACD,IAAI,CAAC;IAC1B,OAAO;MAAE0E,OAAO,EAAE,MAAM,IAAI,CAACC,KAAK,CAAC3E,IAAI;IAAE,CAAC;EAC5C;EAEA,MAAMsB,KAAKA,CAAClC,GAAG,EAAE;IAAEwF;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC9B,MAAM,IAAI,CAACC,OAAO,CAAC,IAAA5E,eAAa,EAACb,GAAG,CAAC,EAAE;MAAEwF;IAAK,CAAC,CAAC;EAClD;EAEA,MAAME,MAAMA,CAAC1F,GAAG,EAAE;IAAEwF;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC/B,MAAM,IAAI,CAACG,OAAO,CAAC,IAAA9E,eAAa,EAACb,GAAG,CAAC,EAAE;MAAEwF;IAAK,CAAC,CAAC;EAClD;EAEArD,QAAQA,CAACvB,IAAI,EAAEkD,KAAK,EAAE;IACpB,OAAO,IAAI,CAAC8B,UAAU,CAAChF,IAAI,EAAEkD,KAAK,CAAC;EACrC;EAEA,MAAM1B,UAAUA,CAAC3D,IAAI,EAAEoH,IAAI,EAAE;IAAEvB,OAAO;IAAER,KAAK,GAAG;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3D,MAAMgC,aAAa,GAAG,IAAI,CAACvJ,UAAU,CAACwJ,WAAW,CAACF,IAAI,CAAC;IACvD,MAAM,IAAI,CAAChB,WAAW,CAAC,IAAAhE,eAAa,EAACpC,IAAI,CAAC,EAAEqH,aAAa,EAAE;MAAExB,OAAO;MAAER;IAAM,CAAC,CAAC;EAChF;EAEA,MAAMzB,IAAIA,CAAC5D,IAAI,EAAEuH,MAAM,EAAEC,QAAQ,EAAE;IACjC1C,eAAM,CAACC,WAAW,CAAC,IAAI,CAACC,WAAW,EAAE,KAAK,EAAG,wCAAuChF,IAAK,EAAC,CAAC;IAC3F,OAAO,IAAI,CAACyH,KAAK,CAAC,OAAOzH,IAAI,KAAK,QAAQ,GAAG,IAAAoC,eAAa,EAACpC,IAAI,CAAC,GAAGA,IAAI,EAAEuH,MAAM,EAAEC,QAAQ,CAAC;EAC5F;EAEA,MAAM3D,QAAQA,CAAC7D,IAAI,EAAE;IAAEqF,KAAK,GAAG;EAAI,CAAC,GAAG,CAAC,CAAC,EAAE;IACzC,MAAM+B,IAAI,GAAG,MAAM,IAAI,CAAChC,SAAS,CAAC,IAAAhD,eAAa,EAACpC,IAAI,CAAC,EAAE;MAAEqF;IAAM,CAAC,CAAC;IACjE,OAAO,IAAI,CAACvH,UAAU,CAAC4J,WAAW,CAACN,IAAI,CAAC;EAC1C;EAEA,MAAM,CAACpF,MAAM2F,CAAC1F,OAAO,EAAEC,OAAO,EAAE;IAAEwC;EAAS,CAAC,EAAEkD,UAAU,GAAG,IAAI,EAAE;IAC/D,IAAI;MACF,IAAIC,CAAC,GAAG7E,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAACqI,OAAO,CAAC7F,OAAO,EAAEC,OAAO,CAAC,EAAE,IAAI,CAACe,QAAQ,CAAC;MACnE,IAAIyB,QAAQ,EAAE;QACZmD,CAAC,GAAGE,OAAO,CAACC,GAAG,CAAC,CAACH,CAAC,EAAE,IAAI,CAACC,OAAO,CAAC/H,YAAY,CAACkC,OAAO,CAAC,EAAElC,YAAY,CAACmC,OAAO,CAAC,CAAC,CAAC,CAAC;MAClF;MACA,MAAM2F,CAAC;IACT,CAAC,CAAC,OAAOnH,KAAK,EAAE;MAEd,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,IAAIiH,UAAU,EAAE;QACzC,MAAM,IAAI,CAACV,OAAO,CAAC,IAAAe,aAAO,EAAC/F,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,CAACF,MAAM,CAACC,OAAO,EAAEC,OAAO,EAAE;UAAEwC;QAAS,CAAC,EAAE,KAAK,CAAC;MAC5D;MACA,MAAMhE,KAAK;IACb;EACF;EAEAsB,MAAMA,CAACC,OAAO,EAAEC,OAAO,EAAE;IAAEwC,QAAQ,GAAG;EAAM,CAAC,GAAG,CAAC,CAAC,EAAE;IAClD,OAAO,IAAI,CAAC,CAAC1C,MAAM,CAAC,IAAAI,eAAa,EAACH,OAAO,CAAC,EAAE,IAAAG,eAAa,EAACF,OAAO,CAAC,EAAE;MAAEwC;IAAS,CAAC,CAAC;EACnF;EAEA,MAAMpB,IAAIA,CAACrB,OAAO,EAAEC,OAAO,EAAE;IAAEwC,QAAQ,GAAG;EAAM,CAAC,GAAG,CAAC,CAAC,EAAE;IACtDzC,OAAO,GAAG,IAAAG,eAAa,EAACH,OAAO,CAAC;IAChCC,OAAO,GAAG,IAAAE,eAAa,EAACF,OAAO,CAAC;IAEhC,IAAI2F,CAAC,GAAG7E,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAACyI,KAAK,CAACjG,OAAO,EAAEC,OAAO,CAAC,EAAE,IAAI,CAACe,QAAQ,CAAC;IACjE,IAAIyB,QAAQ,EAAE;MACZmD,CAAC,GAAGE,OAAO,CAACC,GAAG,CAAC,CAACH,CAAC,EAAE,IAAI,CAACK,KAAK,CAACnI,YAAY,CAACkC,OAAO,CAAC,EAAElC,YAAY,CAACmC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChF;IACA,OAAO2F,CAAC;EACV;EAEA,MAAM/D,KAAKA,CAACvC,GAAG,EAAE;IACf,MAAMyB,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAAC0I,MAAM,CAAC,IAAA/F,eAAa,EAACb,GAAG,CAAC,CAAC,CAAC6G,KAAK,CAAC3H,YAAY,CAAC,EAAE,IAAI,CAACwC,QAAQ,CAAC;EACxF;EAEA,MAAMoF,MAAMA,CAAC9G,GAAG,EAAE;IAChB,MAAM,IAAI,CAAC+G,OAAO,CAAC,IAAAlG,eAAa,EAACb,GAAG,CAAC,CAAC;EACxC;EAMA,MACMgH,IAAIA,CAAA,EAAG;IACX,MAAM,IAAI,CAAClE,KAAK,EAAE;IAClB,IAAI;MACF,MAAM,IAAI,CAACmE,cAAc,EAAE;IAC7B,CAAC,CAAC,OAAO9H,KAAK,EAAE;MACd,MAAM,IAAI,CAACyD,OAAO,EAAE;MACpB,MAAMzD,KAAK;IACb;EACF;EAEA,MAAM+H,iBAAiBA,CAAA,EAAG;IACxB,MAAMnH,IAAI,GAAG,MAAM,IAAI,CAACA,IAAI,CAAC,GAAG,EAAE;MAChCkF,MAAM,EAAEkC,CAAC,IAAI,CAACA,CAAC,CAACC,UAAU,CAAC,GAAG,CAAC,IAAID,CAAC,KAAKnI,wBAAwB,IAAImI,CAAC,KAAKlI;IAC7E,CAAC,CAAC;IACF,OAAOc,IAAI,CAACO,MAAM,KAAK,CAAC;EAC1B;EAEA,MAAM+G,eAAeA,CAAA,EAAG;IACtB,MAAMC,mBAAmB,GAAG,IAAI,CAACjG,OAAO,CAACkG,aAAa,KAAKpJ,SAAS,GAAG,MAAM,GAAGqJ,uCAA4B;IAC5G,IAAI,CAAC,CAACxG,SAAS,GAAG,IAAAyG,wBAAa,EAACH,mBAAmB,EAAE,IAAI,CAACjG,OAAO,CAACkG,aAAa,CAAC;IAEhF,MAAMf,OAAO,CAACC,GAAG,CAAC,CAChB,IAAI,CAACiB,UAAU,CAAC,IAAA7G,eAAa,EAAC7B,wBAAwB,CAAC,EAAE2I,IAAI,CAACC,SAAS,CAAC;MAAEC,SAAS,EAAEP;IAAoB,CAAC,CAAC,EAAE;MAC3GxD,KAAK,EAAE;IACT,CAAC,CAAC,EACF,IAAI,CAACnB,SAAS,CAAC1D,4BAA4B,EAAG,cAAa,IAAA6I,kBAAU,GAAG,IAAG,EAAE;MAAEhE,KAAK,EAAE;IAAI,CAAC,CAAC,CAC7F,CAAC;EACJ;EAEA,MAAMmD,cAAcA,CAAA,EAAG;IACrB,IAAIK,mBAAmB,GAAG,MAAM;IAChC,IAAIzB,IAAI;IACR,IAAI;MAEFA,IAAI,GAAG,MAAM,IAAI,CAAChC,SAAS,CAAC,IAAAhD,eAAa,EAAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;MAC7E,MAAM+I,IAAI,GAAGJ,IAAI,CAACrG,KAAK,CAACuE,IAAI,CAAC;MAC7ByB,mBAAmB,GAAGS,IAAI,CAACF,SAAS;IACtC,CAAC,CAAC,OAAO1I,KAAK,EAAE;MACd,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC3B,MAAMD,KAAK;MACb;MACAmI,mBAAmB,GAAG,IAAI,CAACjG,OAAO,CAACkG,aAAa,KAAKpJ,SAAS,GAAG,MAAM,GAAGqJ,uCAA4B;IACxG;IAEA,IAAI;MACF,IAAI,CAAC,CAACxG,SAAS,GAAG,IAAAyG,wBAAa,EAACH,mBAAmB,EAAE,IAAI,CAACjG,OAAO,CAACkG,aAAa,CAAC;MAEhF,MAAM1B,IAAI,GAAG,MAAM,IAAI,CAACvD,QAAQ,CAACrD,4BAA4B,EAAE,OAAO,CAAC;MACvE0I,IAAI,CAACrG,KAAK,CAACuE,IAAI,CAAC;IAClB,CAAC,CAAC,OAAO1G,KAAK,EAAE;MAEd,IAAImI,mBAAmB,KAAK,MAAM,EAAE;QAClC,IAAI,MAAM,IAAI,CAACJ,iBAAiB,EAAE,EAAE;UAGlC7I,IAAI,CAAC,qCAAqC,CAAC;UAC3C,OAAO,IAAI,CAACgJ,eAAe,EAAE;QAC/B,CAAC,MAAM;UACL/I,IAAI,CACD,yIAAwI,EACzI;YAAEa;UAAM,CAAC,CACV;UAED,MAAMA,KAAK;QACb;MACF;IACF;EACF;EAEA,MAAM6I,IAAIA,CAAA,EAAG;IACX,MAAMC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;IAC7B,MAAMC,YAAY,GAAG,IAAArH,eAAa,EAAE,GAAEsH,IAAI,CAACC,GAAG,EAAG,OAAM,CAAC;IACxD,MAAMvC,IAAI,GAAG,MAAM,IAAAwC,4BAAY,EAACC,mBAAW,EAAEL,IAAI,CAAC;IAClD,IAAIM,IAAI,GAAG,OAAO;IAClB,IAAI;MACF,MAAMC,UAAU,GAAGC,OAAO,CAAC9J,MAAM,EAAE;MACnC,MAAM,IAAI,CAACkG,WAAW,CAACqD,YAAY,EAAErC,IAAI,EAAE;QAAE/B,KAAK,EAAE;MAAK,CAAC,CAAC;MAC3D,MAAM4E,aAAa,GAAGD,OAAO,CAAC9J,MAAM,CAAC6J,UAAU,CAAC;MAEhDD,IAAI,GAAG,MAAM;MACb,MAAMI,SAAS,GAAGF,OAAO,CAAC9J,MAAM,EAAE;MAClC,MAAM0D,IAAI,GAAG,MAAM,IAAI,CAACwB,SAAS,CAACqE,YAAY,EAAE;QAAEpE,KAAK,EAAE;MAAI,CAAC,CAAC;MAC/D,MAAM8E,YAAY,GAAGH,OAAO,CAAC9J,MAAM,CAACgK,SAAS,CAAC;MAE9C,IAAI,CAAC9C,IAAI,CAACgD,MAAM,CAACxG,IAAI,CAAC,EAAE;QACtB,MAAM,IAAIpB,KAAK,CAAC,gCAAgC,CAAC;MACnD;MACA,OAAO;QACL6H,OAAO,EAAE,IAAI;QACbC,SAAS,EAAErK,WAAW,CAACgK,aAAa,EAAET,IAAI,CAAC;QAC3Ce,QAAQ,EAAEtK,WAAW,CAACkK,YAAY,EAAEX,IAAI;MAC1C,CAAC;IACH,CAAC,CAAC,OAAO9I,KAAK,EAAE;MACdb,IAAI,CAAE,0CAAyCiK,IAAK,EAAC,EAAE;QAAEpJ;MAAM,CAAC,CAAC;MACjE,OAAO;QACL2J,OAAO,EAAE,KAAK;QACdP,IAAI;QACJ9J,IAAI,EAAEyJ,YAAY;QAClB/I;MACF,CAAC;IACH,CAAC,SAAS;MACR8J,4BAAY,CAAC/K,IAAI,CAAC,IAAI,CAACgL,OAAO,CAAChB,YAAY,CAAC,CAAC;IAC/C;EACF;EAEA,MAAM1F,QAAQA,CAAC/D,IAAI,EAAE0K,GAAG,EAAE;IACxB,MAAM,IAAI,CAACC,SAAS,CAAC3K,IAAI,EAAE0K,GAAG,CAAC;EACjC;EAEA,MAAM1G,MAAMA,CAAChE,IAAI,EAAE;IAAE0E,QAAQ,GAAG;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3C1E,IAAI,GAAG,IAAAoC,eAAa,EAACpC,IAAI,CAAC;IAE1B,IAAI0E,QAAQ,EAAE;MACZ8F,4BAAY,CAAC/K,IAAI,CAAC,IAAI,CAACgL,OAAO,CAAC1K,YAAY,CAACC,IAAI,CAAC,CAAC,CAAC;IACrD;IAEA,MAAM,IAAI,CAACyK,OAAO,CAACzK,IAAI,CAAC,CAACoI,KAAK,CAAC3H,YAAY,CAAC;EAC9C;EAEA,MAAMwD,KAAKA,CAACjE,IAAI,EAAEuH,MAAM,EAAEC,QAAQ,EAAE;IAClC1C,eAAM,CAACC,WAAW,CAAC,IAAI,CAACC,WAAW,EAAE,KAAK,EAAG,8CAA6ChF,IAAK,EAAC,CAAC;IACjG,MAAM,IAAI,CAAC4K,MAAM,CAAC,OAAO5K,IAAI,KAAK,QAAQ,GAAG,IAAAoC,eAAa,EAACpC,IAAI,CAAC,GAAGA,IAAI,EAAEuH,MAAM,EAAEC,QAAQ,CAAC;EAC5F;EAEA,MAAMtD,SAASA,CAAClE,IAAI,EAAEoH,IAAI,EAAE;IAAE/B,KAAK,GAAG;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IACjD,MAAMgC,aAAa,GAAG,IAAI,CAACvJ,UAAU,CAACwJ,WAAW,CAACF,IAAI,CAAC;IACvD,MAAM,IAAI,CAAC6B,UAAU,CAAC,IAAA7G,eAAa,EAACpC,IAAI,CAAC,EAAEqH,aAAa,EAAE;MAAEhC;IAAM,CAAC,CAAC;EACtE;EAIA,MAAMb,WAAWA,CAACD,EAAE,EAAE;IACpB,MAAMvB,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAACoL,UAAU,CAACtG,EAAE,CAACA,EAAE,CAAC,EAAE,IAAI,CAACtB,QAAQ,CAAC;EAC3D;EAEA,MAAM+D,OAAOA,CAACzF,GAAG,EAAE;IAAEwF;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAChC,IAAI;MACF,MAAM,IAAI,CAAC+D,MAAM,CAACvJ,GAAG,EAAE;QAAEwF;MAAK,CAAC,CAAC;IAClC,CAAC,CAAC,OAAOrG,KAAK,EAAE;MACd,IAAIA,KAAK,IAAI,IAAI,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC5C,MAAMD,KAAK;MACb;MAGA,MAAM,IAAI,CAACiG,KAAK,CAACpF,GAAG,CAAC;IACvB;EACF;EAEA,MAAM4F,UAAUA,CAAChF,IAAI,EAAEkD,KAAK,EAAE;IAC5BlD,IAAI,GAAG,IAAAC,eAAa,EAACD,IAAI,CAAC;IAE1B,OAAO;MACLoC,EAAE,EAAE,MAAMvB,uBAAO,CAACvD,IAAI,CAAC,IAAI,CAACsL,SAAS,CAAC5I,IAAI,EAAEkD,KAAK,CAAC,EAAE,IAAI,CAACpC,QAAQ,CAAC;MAClEd;IACF,CAAC;EACH;EAIA6I,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI,CAACpI,OAAO,CAACoI,eAAe,IAAI,KAAK;EAC9C;EAEA,MAAMH,UAAUA,CAACtG,EAAE,EAAE;IACnB,MAAM,IAAI/B,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMyI,mBAAmBA,CAACjL,IAAI,EAAE;IAAE6F,OAAO;IAAE,GAAGnD;EAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;IAC5D,IAAI;MACF,OAAO,MAAM,IAAI,CAACwI,kBAAkB,CAAClL,IAAI,EAAE;QAAE,GAAG0C,OAAO;QAAEI,aAAa,EAAE,IAAI,CAACC;MAAe,CAAC,CAAC;IAChG,CAAC,CAAC,OAAOrC,KAAK,EAAE;MACd,IAAI,OAAOV,IAAI,KAAK,QAAQ,IAAIU,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QACvD,MAAMD,KAAK;MACb;IACF;IAEA,MAAM,IAAI,CAACwG,OAAO,CAAC,IAAAe,aAAO,EAACjI,IAAI,CAAC,EAAE;MAAE+G,IAAI,EAAElB;IAAQ,CAAC,CAAC;IACpD,OAAO,IAAI,CAACoF,mBAAmB,CAACjL,IAAI,EAAE0C,OAAO,CAAC;EAChD;EAEA,MAAMwC,iBAAiBA,CAAClF,IAAI,EAAE0C,OAAO,EAAE;IACrC,MAAM,IAAIF,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAIA,MAAM0I,kBAAkBA,CAAClL,IAAI,EAAE0C,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,MAAMQ,KAAKA,CAAC3E,IAAI,EAAE;IAChB,OAAO,MAAM4F,OAAO,CAACoD,OAAO,EAAE;EAChC;EAEA,MAAMzF,QAAQA,CAAC1F,IAAI,EAAE;IACnB,MAAM,IAAIwC,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMmE,KAAKA,CAACpF,GAAG,EAAE;IACf,MAAM,IAAIiB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMsI,MAAMA,CAACvJ,GAAG,EAAE;IAChB,MAAM,IAAIiB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM0E,OAAOA,CAAC3F,GAAG,EAAE;IAAEwF;EAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAChC,IAAI;MACF,OAAO,MAAM,IAAI,CAACC,OAAO,CAACzF,GAAG,EAAE;QAAEwF;MAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,OAAOrG,KAAK,EAAE;MACd,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,EAAE;QAC3B,MAAMD,KAAK;MACb;IACF;IAEA,MAAM,IAAI,CAACwG,OAAO,CAAC,IAAAe,aAAO,EAAC1G,GAAG,CAAC,EAAE;MAAEwF;IAAK,CAAC,CAAC;IAC1C,OAAO,IAAI,CAACG,OAAO,CAAC3F,GAAG,EAAE;MAAEwF;IAAK,CAAC,CAAC;EACpC;EAEA,MAAMgE,SAASA,CAAC5I,IAAI,EAAEkD,KAAK,EAAE;IAC3B,MAAM,IAAI7C,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM4D,WAAWA,CAACpG,IAAI,EAAEoH,IAAI,EAAE;IAAEvB,OAAO;IAAER;EAAM,CAAC,EAAE;IAChD,IAAI;MACF,OAAO,MAAM,IAAI,CAAC4D,UAAU,CAACjJ,IAAI,EAAEoH,IAAI,EAAE;QAAE/B;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,CAACwG,OAAO,CAAC,IAAAe,aAAO,EAACjI,IAAI,CAAC,EAAE;MAAE+G,IAAI,EAAElB;IAAQ,CAAC,CAAC;IACpD,OAAO,IAAI,CAACO,WAAW,CAACpG,IAAI,EAAEoH,IAAI,EAAE;MAAE/B;IAAM,CAAC,CAAC;EAChD;EAEA,MAAMc,aAAaA,CAAChE,IAAI,EAAEyD,KAAK,EAAE;IAAEC,OAAO;IAAEC;EAAU,CAAC,EAAE;IACvD,MAAMsF,OAAO,GAAI,GAAE,IAAAnD,aAAO,EAAC9F,IAAI,CAAE,KAAI,IAAAkJ,cAAQ,EAAClJ,IAAI,CAAE,EAAC;IACrD,MAAMmJ,MAAM,GAAG,MAAMtI,uBAAO,CAACvD,IAAI,CAC/B,IAAI,CAACwL,mBAAmB,CAACG,OAAO,EAAE;MAChCvF,OAAO;MACPR,KAAK,EAAE;IACT,CAAC,CAAC,EACF,IAAI,CAACpC,QAAQ,CACd;IACD,IAAI;MACF,MAAM,IAAA2G,4BAAY,EAAC1D,gBAAQ,EAAEN,KAAK,EAAE0F,MAAM,CAAC;MAC3C,IAAIxF,SAAS,KAAKpG,SAAS,EAAE;QAC3B,MAAMoG,SAAS,CAACrG,IAAI,CAAC,IAAI,EAAE2L,OAAO,CAAC;MACrC;MACA,MAAM,IAAI,CAACpJ,MAAM,CAACoJ,OAAO,EAAEjJ,IAAI,CAAC;IAClC,CAAC,CAAC,OAAOzB,KAAK,EAAE;MACd,MAAM,IAAI,CAACsD,MAAM,CAACoH,OAAO,CAAC;MAC1B,MAAM1K,KAAK;IACb;EACF;EAEA+G,KAAKA,CAACzH,IAAI,EAAEuH,MAAM,EAAEC,QAAQ,EAAE;IAC5B,MAAM,IAAIhF,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA4C,SAASA,CAACpF,IAAI,EAAE0C,OAAO,EAAE;IACvB,OAAO,IAAI,CAACwC,iBAAiB,CAAClF,IAAI,EAAE;MAAE,GAAG0C,OAAO;MAAEI,aAAa,EAAE,IAAI,CAACC;IAAe,CAAC,CAAC,CAACwI,IAAI,CAACC,kBAAS,CAACjE,MAAM,CAAC;EAChH;EAEA,MAAMO,OAAOA,CAAC7F,OAAO,EAAEC,OAAO,EAAE;IAC9B,MAAM,IAAIM,KAAK,CAAC,iBAAiB,CAAC;EACpC;EACA,MAAM0F,KAAKA,CAACjG,OAAO,EAAEC,OAAO,EAAE;IAC5B,MAAM,IAAIM,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM2F,MAAMA,CAAC5G,GAAG,EAAE;IAChB,MAAM,IAAIiB,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAM8F,OAAOA,CAAC/G,GAAG,EAAE;IACjB,IAAI;MACF,OAAO,MAAM,IAAI,CAAC4G,MAAM,CAAC5G,GAAG,CAAC;IAC/B,CAAC,CAAC,OAAOb,KAAK,EAAE;MACd,IAAIA,KAAK,CAACC,IAAI,KAAK,WAAW,EAAE;QAC9B,MAAMD,KAAK;MACb;IACF;IAEA,MAAM+K,KAAK,GAAG,MAAM,IAAI,CAAC9E,KAAK,CAACpF,GAAG,CAAC;IACnC,MAAM,IAAAmK,eAAe,EAACD,KAAK,EAAEzL,IAAI,IAC/B,IAAI,CAACyK,OAAO,CAAE,GAAElJ,GAAI,IAAGvB,IAAK,EAAC,CAAC,CAACoI,KAAK,CAAC1H,KAAK,IAAI;MAG5C,IAAIA,KAAK,CAACC,IAAI,KAAK,QAAQ,IAAID,KAAK,CAACC,IAAI,KAAK,OAAO,EAAE;QACrD,OAAO,IAAI,CAAC2H,OAAO,CAAE,GAAE/G,GAAI,IAAGvB,IAAK,EAAC,CAAC;MACvC;MACA,MAAMU,KAAK;IACb,CAAC,CAAC,CACH;IACD,OAAO,IAAI,CAAC4H,OAAO,CAAC/G,GAAG,CAAC;EAC1B;EAGA,MAAM8C,KAAKA,CAAA,EAAG,CAAC;EAEf,MAAMoG,OAAOA,CAACzK,IAAI,EAAE;IAClB,MAAM,IAAIwC,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMoI,MAAMA,CAAC5K,IAAI,EAAEuH,MAAM,EAAEC,QAAQ,EAAE;IACnC,MAAMmE,MAAM,GAAG,OAAO3L,IAAI,KAAK,QAAQ;IACvC,IAAI2L,MAAM,EAAE;MACV3L,IAAI,GAAG,MAAM,IAAI,CAACmH,UAAU,CAACnH,IAAI,EAAE,IAAI,CAAC;IAC1C;IACA,IAAI;MACF,OAAO,MAAM,IAAI,CAAC4L,QAAQ,CAAC5L,IAAI,EAAEuH,MAAM,EAAEC,QAAQ,CAAC;IACpD,CAAC,SAAS;MACR,IAAImE,MAAM,EAAE;QACV,MAAM,IAAI,CAACnH,WAAW,CAACxE,IAAI,CAAC;MAC9B;IACF;EACF;EAEA,MAAM4L,QAAQA,CAACrH,EAAE,EAAEgD,MAAM,EAAEC,QAAQ,EAAE;IACnC,MAAM,IAAIhF,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,MAAMyG,UAAUA,CAACjJ,IAAI,EAAEoH,IAAI,EAAE1E,OAAO,EAAE;IACpC,MAAM,IAAIF,KAAK,CAAC,iBAAiB,CAAC;EACpC;EAEA,IAAIwC,WAAWA,CAAA,EAAG;IAChB,OAAO,IAAI,CAAClH,UAAU,CAAC+N,EAAE,KAAK,gBAAgB;EAChD;AACF,CAAC,GAAAxN,yBAAA,CAAAJ,MAAA,CAAA6C,SAAA,aAAA/C,IAAA,GAAAa,MAAA,CAAAkN,wBAAA,CAAA7N,MAAA,CAAA6C,SAAA,aAAA7C,MAAA,CAAA6C,SAAA,GAAAzC,yBAAA,CAAAJ,MAAA,CAAA6C,SAAA,WAAA9C,KAAA,GAAAY,MAAA,CAAAkN,wBAAA,CAAA7N,MAAA,CAAA6C,SAAA,WAAA7C,MAAA,CAAA6C,SAAA,IAAA7C,MAAA;AAAA8N,OAAA,CAAA3N,OAAA,GAAAiE,qBAAA;AAED,SAAS2J,0BAA0BA,CAAA,EAAG;EACpC,MAAMC,GAAG,GAAGlL,aAAa,CAACD,SAAS;EACnC,MAAMoL,IAAI,GAAG7J,qBAAqB,CAACvB,SAAS;EAE5C,MAAM;IACJnB,cAAc;IACdmM,wBAAwB;IACxBhL,SAAS,EAAE;MAAEqL;IAAe;EAC9B,CAAC,GAAGvN,MAAM;EAEVA,MAAM,CAACwN,mBAAmB,CAACF,IAAI,CAAC,CAACpN,OAAO,CAACuN,IAAI,IAAI;IAC/C,IAAI5N,UAAU,EAAEe,KAAK;IACrB,IACE2M,cAAc,CAAC1M,IAAI,CAACwM,GAAG,EAAEI,IAAI,CAAC,IAC9BA,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IACf,QAAQ7M,KAAK,GAAG,CAACf,UAAU,GAAGqN,wBAAwB,CAACI,IAAI,EAAEG,IAAI,CAAC,EAAE7M,KAAK,CAAC,KAAK,UAAU,EACzF;MACA;IACF;IAEAf,UAAU,CAACe,KAAK,GAAG,YAAY;MAC7B,IAAI2C,IAAI;MACR,IAAImK,SAAS,CAACzK,MAAM,KAAK,CAAC,IAAI,QAAQM,IAAI,GAAGmK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACvEA,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC5K,QAAQ,CAACS,IAAI,CAAC;MACpC;MACA,OAAO3C,KAAK,CAAC+M,KAAK,CAAC,IAAI,CAACnL,QAAQ,EAAEkL,SAAS,CAAC;IAC9C,CAAC;IAED3M,cAAc,CAACsM,GAAG,EAAEI,IAAI,EAAE5N,UAAU,CAAC;EACvC,CAAC,CAAC;AACJ;AACAuN,0BAA0B,EAAE"}
|
package/dist/checksum.js
CHANGED
|
@@ -4,18 +4,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.validChecksumOfReadStream = exports.createChecksumStream = void 0;
|
|
7
|
-
var _invert2 = _interopRequireDefault(require("lodash/invert"));
|
|
8
7
|
var _through = _interopRequireDefault(require("through2"));
|
|
9
8
|
var _crypto = require("crypto");
|
|
10
9
|
var _promiseToolbox = require("promise-toolbox");
|
|
10
|
+
var _invert = _interopRequireDefault(require("lodash/invert.js"));
|
|
11
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
12
|
const ALGORITHM_TO_ID = {
|
|
13
13
|
md5: '1',
|
|
14
14
|
sha256: '5',
|
|
15
15
|
sha512: '6'
|
|
16
16
|
};
|
|
17
|
-
const ID_TO_ALGORITHM = (0,
|
|
18
|
-
|
|
17
|
+
const ID_TO_ALGORITHM = (0, _invert.default)(ALGORITHM_TO_ID);
|
|
19
18
|
const createChecksumStream = (algorithm = 'md5') => {
|
|
20
19
|
const algorithmId = ALGORITHM_TO_ID[algorithm];
|
|
21
20
|
if (!algorithmId) {
|
|
@@ -37,7 +36,6 @@ const createChecksumStream = (algorithm = 'md5') => {
|
|
|
37
36
|
stream.checksum = promise;
|
|
38
37
|
return stream;
|
|
39
38
|
};
|
|
40
|
-
|
|
41
39
|
exports.createChecksumStream = createChecksumStream;
|
|
42
40
|
const validChecksumOfReadStream = (stream, expectedChecksum) => {
|
|
43
41
|
const algorithmId = expectedChecksum.slice(1, expectedChecksum.indexOf('$', 1));
|
package/dist/checksum.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.js","names":["ALGORITHM_TO_ID","md5","sha256","sha512","ID_TO_ALGORITHM","createChecksumStream","algorithm","algorithmId","Error","hash","createHash","promise","resolve","reject","defer","stream","through2","chunk","enc","callback","update","digest","once","checksum","validChecksumOfReadStream","expectedChecksum","slice","indexOf","wrapper","pipe","highWaterMark","on","error","emit","checksumVerified","fromEvent"],"sources":["../src/checksum.js"],"sourcesContent":["import through2 from 'through2'\nimport { createHash } from 'crypto'\nimport { defer, fromEvent } from 'promise-toolbox'\nimport
|
|
1
|
+
{"version":3,"file":"checksum.js","names":["_through","_interopRequireDefault","require","_crypto","_promiseToolbox","_invert","obj","__esModule","default","ALGORITHM_TO_ID","md5","sha256","sha512","ID_TO_ALGORITHM","invert","createChecksumStream","algorithm","algorithmId","Error","hash","createHash","promise","resolve","reject","defer","stream","through2","chunk","enc","callback","update","digest","once","checksum","exports","validChecksumOfReadStream","expectedChecksum","slice","indexOf","wrapper","pipe","highWaterMark","on","error","emit","checksumVerified","fromEvent"],"sources":["../src/checksum.js"],"sourcesContent":["import through2 from 'through2'\nimport { createHash } from 'crypto'\nimport { defer, fromEvent } from 'promise-toolbox'\nimport invert from 'lodash/invert.js'\n\n// Format: $<algorithm>$<salt>$<encrypted>\n//\n// http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES\nconst ALGORITHM_TO_ID = {\n md5: '1',\n sha256: '5',\n sha512: '6',\n}\n\nconst ID_TO_ALGORITHM = invert(ALGORITHM_TO_ID)\n\n// Create a through stream which computes the checksum of all data going\n// through.\n//\n// The `checksum` attribute is a promise which resolves at the end of the stream\n// with a string representation of the checksum.\n//\n// const source = ...\n// const checksumStream = source.pipe(createChecksumStream())\n// checksumStream.resume() // make the data flow without an output\n// console.log(await checksumStream.checksum)\nexport const createChecksumStream = (algorithm = 'md5') => {\n const algorithmId = ALGORITHM_TO_ID[algorithm]\n\n if (!algorithmId) {\n throw new Error(`unknown algorithm: ${algorithm}`)\n }\n\n const hash = createHash(algorithm)\n const { promise, resolve, reject } = defer()\n\n const stream = through2(\n (chunk, enc, callback) => {\n hash.update(chunk)\n callback(null, chunk)\n },\n callback => {\n resolve(`$${algorithmId}$$${hash.digest('hex')}`)\n callback()\n }\n ).once('error', reject)\n stream.checksum = promise\n return stream\n}\n\n// Check if the checksum of a readable stream is equals to an expected checksum.\n// The given stream is wrapped in a stream which emits an error event\n// if the computed checksum is not equals to the expected checksum.\nexport const validChecksumOfReadStream = (stream, expectedChecksum) => {\n const algorithmId = expectedChecksum.slice(1, expectedChecksum.indexOf('$', 1))\n\n if (!algorithmId) {\n throw new Error(`unknown algorithm: ${algorithmId}`)\n }\n\n const hash = createHash(ID_TO_ALGORITHM[algorithmId])\n\n const wrapper = stream.pipe(\n through2(\n { highWaterMark: 0 },\n (chunk, enc, callback) => {\n hash.update(chunk)\n callback(null, chunk)\n },\n callback => {\n const checksum = `$${algorithmId}$$${hash.digest('hex')}`\n\n callback(\n checksum !== expectedChecksum ? new Error(`Bad checksum (${checksum}), expected: ${expectedChecksum}`) : null\n )\n }\n )\n )\n\n stream.on('error', error => wrapper.emit('error', error))\n wrapper.checksumVerified = fromEvent(wrapper, 'end')\n\n return wrapper\n}\n"],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","getSyncedHandler","opts","handler","dispose","forget","value"],"sources":["../src/index.js"],"sourcesContent":["import execa from 'execa'\nimport { parse } from 'xo-remote-parser'\n\nimport RemoteHandlerLocal from './local'\nimport RemoteHandlerNfs from './nfs'\nimport RemoteHandlerS3 from './s3'\nimport RemoteHandlerSmb from './smb'\nexport { DEFAULT_ENCRYPTION_ALGORITHM, UNENCRYPTED_ALGORITHM, isLegacyEncryptionAlgorithm } from './_encryptor'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmb\n} catch (_) {}\n\nexport const getHandler = (remote, ...rest) => {\n const Handler = HANDLERS[parse(remote.url).type]\n if (!Handler) {\n throw new Error('Unhandled remote type')\n }\n return new Handler(remote, ...rest)\n}\n\nexport const getSyncedHandler = async (...opts) => {\n const handler = getHandler(...opts)\n await handler.sync()\n return {\n dispose: () => handler.forget(),\n value: handler,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AAA+G;AAE/G,
|
|
1
|
+
{"version":3,"file":"index.js","names":["_execa","_interopRequireDefault","require","_xoRemoteParser","_local","_nfs","_s","_smb","_encryptor","obj","__esModule","default","HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","exports","getSyncedHandler","opts","handler","dispose","forget","value"],"sources":["../src/index.js"],"sourcesContent":["import execa from 'execa'\nimport { parse } from 'xo-remote-parser'\n\nimport RemoteHandlerLocal from './local'\nimport RemoteHandlerNfs from './nfs'\nimport RemoteHandlerS3 from './s3'\nimport RemoteHandlerSmb from './smb'\nexport { DEFAULT_ENCRYPTION_ALGORITHM, UNENCRYPTED_ALGORITHM, isLegacyEncryptionAlgorithm } from './_encryptor'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmb\n} catch (_) {}\n\nexport const getHandler = (remote, ...rest) => {\n const Handler = HANDLERS[parse(remote.url).type]\n if (!Handler) {\n throw new Error('Unhandled remote type')\n }\n return new Handler(remote, ...rest)\n}\n\nexport const getSyncedHandler = async (...opts) => {\n const handler = getHandler(...opts)\n await handler.sync()\n return {\n dispose: () => handler.forget(),\n value: handler,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,EAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,IAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,UAAA,GAAAN,OAAA;AAA+G,SAAAD,uBAAAQ,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE/G,MAAMG,QAAQ,GAAG;EACfC,IAAI,EAAEC,cAAkB;EACxBC,GAAG,EAAEC,YAAgB;EACrBC,EAAE,EAAEC;AACN,CAAC;AAED,IAAI;EACFC,cAAK,CAACC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;EAChCR,QAAQ,CAACS,GAAG,GAAGC,YAAgB;AACjC,CAAC,CAAC,OAAOC,CAAC,EAAE,CAAC;AAEN,MAAMC,UAAU,GAAGA,CAACC,MAAM,EAAE,GAAGC,IAAI,KAAK;EAC7C,MAAMC,OAAO,GAAGf,QAAQ,CAAC,IAAAgB,qBAAK,EAACH,MAAM,CAACI,GAAG,CAAC,CAACC,IAAI,CAAC;EAChD,IAAI,CAACH,OAAO,EAAE;IACZ,MAAM,IAAII,KAAK,CAAC,uBAAuB,CAAC;EAC1C;EACA,OAAO,IAAIJ,OAAO,CAACF,MAAM,EAAE,GAAGC,IAAI,CAAC;AACrC,CAAC;AAAAM,OAAA,CAAAR,UAAA,GAAAA,UAAA;AAEM,MAAMS,gBAAgB,GAAG,MAAAA,CAAO,GAAGC,IAAI,KAAK;EACjD,MAAMC,OAAO,GAAGX,UAAU,CAAC,GAAGU,IAAI,CAAC;EACnC,MAAMC,OAAO,CAACf,IAAI,EAAE;EACpB,OAAO;IACLgB,OAAO,EAAEA,CAAA,KAAMD,OAAO,CAACE,MAAM,EAAE;IAC/BC,KAAK,EAAEH;EACT,CAAC;AACH,CAAC;AAAAH,OAAA,CAAAC,gBAAA,GAAAA,gBAAA"}
|
package/dist/local.js
CHANGED
package/dist/local.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","names":["info","warn","createLogger","addSyncStackTrace","fn","args","stackContainer","Error","apply","error","syncStack","stack","dontAddSyncStackTrace","LocalHandler","RemoteHandlerAbstract","constructor","remote","opts","_addSyncStackTrace","syncStackTraces","_retriesOnEagain","delay","retries","retriesOnEagain","when","code","type","_getRealPath","_remote","path","_getFilePath","file","_closeFile","fd","fs","close","_copy","oldPath","newPath","copy","_createReadStream","options","stream","createReadStream","fromEvent","autoClose","_createWriteStream","createWriteStream","_getInfo","df","Object","keys","forEach","key","Number","isNaN","_getSize","stats","stat","size","_list","dir","readdir","_lock","acquire","lockfile","lock","bind","undefined","onCompromised","release","_mkdir","mode","mkdir","_openFile","flags","open","_read","buffer","position","needsClose","read","length","_readFile","filePath","retry","readFile","_rename","rename","_rmdir","rmdir","_sync","ensureDir","access","R_OK","W_OK","_truncate","len","truncate","_unlink","unlink","_writeFd","write","_writeFile","data","writeFile","flag"],"sources":["../src/local.js"],"sourcesContent":["import df from '@sindresorhus/df'\nimport fs from 'fs-extra'\nimport lockfile from 'proper-lockfile'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromEvent, retry } from 'promise-toolbox'\n\nimport RemoteHandlerAbstract from './abstract'\n\nconst { info, warn } = createLogger('xo:fs:local')\n\n// save current stack trace and add it to any rejected error\n//\n// This is especially useful when the resolution is separate from the initial\n// call, which is often the case with RPC libs.\n//\n// There is a perf impact and it should be avoided in production.\nasync function addSyncStackTrace(fn, ...args) {\n const stackContainer = new Error()\n try {\n return await fn.apply(this, args)\n } catch (error) {\n error.syncStack = stackContainer.stack\n throw error\n }\n}\n\nfunction dontAddSyncStackTrace(fn, ...args) {\n return fn.apply(this, args)\n}\n\nexport default class LocalHandler extends RemoteHandlerAbstract {\n constructor(remote, opts = {}) {\n super(remote)\n\n this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace\n this._retriesOnEagain = {\n delay: 1e3,\n retries: 9,\n ...opts.retriesOnEagain,\n when: {\n code: 'EAGAIN',\n },\n }\n }\n get type() {\n return 'file'\n }\n\n _getRealPath() {\n return this._remote.path\n }\n\n _getFilePath(file) {\n return this._getRealPath() + file\n }\n\n async _closeFile(fd) {\n return this._addSyncStackTrace(fs.close, fd)\n }\n\n async _copy(oldPath, newPath) {\n return this._addSyncStackTrace(fs.copy, this._getFilePath(oldPath), this._getFilePath(newPath))\n }\n\n async _createReadStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createReadStream(this._getFilePath(file), options)\n await this._addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createReadStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _createWriteStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createWriteStream(this._getFilePath(file), options)\n await this._addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createWriteStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _getInfo() {\n // df.file() resolves with an object with the following properties:\n // filesystem, type, size, used, available, capacity and mountpoint.\n // size, used, available and capacity may be `NaN` so we remove any `NaN`\n // value from the object.\n const info = await df.file(this._getFilePath('/'))\n Object.keys(info).forEach(key => {\n if (Number.isNaN(info[key])) {\n delete info[key]\n }\n })\n\n return info\n }\n\n async _getSize(file) {\n const stats = await this._addSyncStackTrace(fs.stat, this._getFilePath(typeof file === 'string' ? file : file.path))\n return stats.size\n }\n\n async _list(dir) {\n return this._addSyncStackTrace(fs.readdir, this._getFilePath(dir))\n }\n\n async _lock(path) {\n const acquire = lockfile.lock.bind(undefined, this._getFilePath(path), {\n async onCompromised(error) {\n warn('lock compromised', { error })\n try {\n release = await acquire()\n info('compromised lock was reacquired')\n } catch (error) {\n warn('compromised lock could not be reacquired', { error })\n }\n },\n })\n\n let release = await this._addSyncStackTrace(acquire)\n\n return async () => {\n try {\n await this._addSyncStackTrace(release)\n } catch (error) {\n warn('lock could not be released', { error })\n }\n }\n }\n\n _mkdir(dir, { mode }) {\n return this._addSyncStackTrace(fs.mkdir, this._getFilePath(dir), { mode })\n }\n\n async _openFile(path, flags) {\n return this._addSyncStackTrace(fs.open, this._getFilePath(path), flags)\n }\n\n async _read(file, buffer, position) {\n const needsClose = typeof file === 'string'\n file = needsClose ? await this._addSyncStackTrace(fs.open, this._getFilePath(file), 'r') : file.fd\n try {\n return await this._addSyncStackTrace(\n fs.read,\n file,\n buffer,\n 0,\n buffer.length,\n position === undefined ? null : position\n )\n } finally {\n if (needsClose) {\n await this._addSyncStackTrace(fs.close, file)\n }\n }\n }\n\n async _readFile(file, options) {\n const filePath = this._getFilePath(file)\n return await this._addSyncStackTrace(retry, () => fs.readFile(filePath, options), this._retriesOnEagain)\n }\n\n async _rename(oldPath, newPath) {\n return this._addSyncStackTrace(fs.rename, this._getFilePath(oldPath), this._getFilePath(newPath))\n }\n\n async _rmdir(dir) {\n return this._addSyncStackTrace(fs.rmdir, this._getFilePath(dir))\n }\n\n async _sync() {\n const path = this._getRealPath('/')\n await this._addSyncStackTrace(fs.ensureDir, path)\n await this._addSyncStackTrace(fs.access, path, fs.R_OK | fs.W_OK)\n }\n\n _truncate(file, len) {\n return this._addSyncStackTrace(fs.truncate, this._getFilePath(file), len)\n }\n\n async _unlink(file) {\n const filePath = this._getFilePath(file)\n return await this._addSyncStackTrace(retry, () => fs.unlink(filePath), this._retriesOnEagain)\n }\n\n _writeFd(file, buffer, position) {\n return this._addSyncStackTrace(fs.write, file.fd, buffer, 0, buffer.length, position)\n }\n\n _writeFile(file, data, { flags }) {\n return this._addSyncStackTrace(fs.writeFile, this._getFilePath(file), data, { flag: flags })\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"local.js","names":["_df","_interopRequireDefault","require","_fsExtra","_properLockfile","_log","_promiseToolbox","_abstract","obj","__esModule","default","info","warn","createLogger","addSyncStackTrace","fn","args","stackContainer","Error","apply","error","syncStack","stack","dontAddSyncStackTrace","LocalHandler","RemoteHandlerAbstract","constructor","remote","opts","_addSyncStackTrace","syncStackTraces","_retriesOnEagain","delay","retries","retriesOnEagain","when","code","type","_getRealPath","_remote","path","_getFilePath","file","_closeFile","fd","fs","close","_copy","oldPath","newPath","copy","_createReadStream","options","stream","createReadStream","fromEvent","autoClose","_createWriteStream","createWriteStream","_getInfo","df","Object","keys","forEach","key","Number","isNaN","_getSize","stats","stat","size","_list","dir","readdir","_lock","acquire","lockfile","lock","bind","undefined","onCompromised","release","_mkdir","mode","mkdir","_openFile","flags","open","_read","buffer","position","needsClose","read","length","_readFile","filePath","retry","readFile","_rename","rename","_rmdir","rmdir","_sync","ensureDir","access","R_OK","W_OK","_truncate","len","truncate","_unlink","unlink","_writeFd","write","_writeFile","data","writeFile","flag","exports"],"sources":["../src/local.js"],"sourcesContent":["import df from '@sindresorhus/df'\nimport fs from 'fs-extra'\nimport lockfile from 'proper-lockfile'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromEvent, retry } from 'promise-toolbox'\n\nimport RemoteHandlerAbstract from './abstract'\n\nconst { info, warn } = createLogger('xo:fs:local')\n\n// save current stack trace and add it to any rejected error\n//\n// This is especially useful when the resolution is separate from the initial\n// call, which is often the case with RPC libs.\n//\n// There is a perf impact and it should be avoided in production.\nasync function addSyncStackTrace(fn, ...args) {\n const stackContainer = new Error()\n try {\n return await fn.apply(this, args)\n } catch (error) {\n error.syncStack = stackContainer.stack\n throw error\n }\n}\n\nfunction dontAddSyncStackTrace(fn, ...args) {\n return fn.apply(this, args)\n}\n\nexport default class LocalHandler extends RemoteHandlerAbstract {\n constructor(remote, opts = {}) {\n super(remote)\n\n this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace\n this._retriesOnEagain = {\n delay: 1e3,\n retries: 9,\n ...opts.retriesOnEagain,\n when: {\n code: 'EAGAIN',\n },\n }\n }\n get type() {\n return 'file'\n }\n\n _getRealPath() {\n return this._remote.path\n }\n\n _getFilePath(file) {\n return this._getRealPath() + file\n }\n\n async _closeFile(fd) {\n return this._addSyncStackTrace(fs.close, fd)\n }\n\n async _copy(oldPath, newPath) {\n return this._addSyncStackTrace(fs.copy, this._getFilePath(oldPath), this._getFilePath(newPath))\n }\n\n async _createReadStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createReadStream(this._getFilePath(file), options)\n await this._addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createReadStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _createWriteStream(file, options) {\n if (typeof file === 'string') {\n const stream = fs.createWriteStream(this._getFilePath(file), options)\n await this._addSyncStackTrace(fromEvent, stream, 'open')\n return stream\n }\n return fs.createWriteStream('', {\n autoClose: false,\n ...options,\n fd: file.fd,\n })\n }\n\n async _getInfo() {\n // df.file() resolves with an object with the following properties:\n // filesystem, type, size, used, available, capacity and mountpoint.\n // size, used, available and capacity may be `NaN` so we remove any `NaN`\n // value from the object.\n const info = await df.file(this._getFilePath('/'))\n Object.keys(info).forEach(key => {\n if (Number.isNaN(info[key])) {\n delete info[key]\n }\n })\n\n return info\n }\n\n async _getSize(file) {\n const stats = await this._addSyncStackTrace(fs.stat, this._getFilePath(typeof file === 'string' ? file : file.path))\n return stats.size\n }\n\n async _list(dir) {\n return this._addSyncStackTrace(fs.readdir, this._getFilePath(dir))\n }\n\n async _lock(path) {\n const acquire = lockfile.lock.bind(undefined, this._getFilePath(path), {\n async onCompromised(error) {\n warn('lock compromised', { error })\n try {\n release = await acquire()\n info('compromised lock was reacquired')\n } catch (error) {\n warn('compromised lock could not be reacquired', { error })\n }\n },\n })\n\n let release = await this._addSyncStackTrace(acquire)\n\n return async () => {\n try {\n await this._addSyncStackTrace(release)\n } catch (error) {\n warn('lock could not be released', { error })\n }\n }\n }\n\n _mkdir(dir, { mode }) {\n return this._addSyncStackTrace(fs.mkdir, this._getFilePath(dir), { mode })\n }\n\n async _openFile(path, flags) {\n return this._addSyncStackTrace(fs.open, this._getFilePath(path), flags)\n }\n\n async _read(file, buffer, position) {\n const needsClose = typeof file === 'string'\n file = needsClose ? await this._addSyncStackTrace(fs.open, this._getFilePath(file), 'r') : file.fd\n try {\n return await this._addSyncStackTrace(\n fs.read,\n file,\n buffer,\n 0,\n buffer.length,\n position === undefined ? null : position\n )\n } finally {\n if (needsClose) {\n await this._addSyncStackTrace(fs.close, file)\n }\n }\n }\n\n async _readFile(file, options) {\n const filePath = this._getFilePath(file)\n return await this._addSyncStackTrace(retry, () => fs.readFile(filePath, options), this._retriesOnEagain)\n }\n\n async _rename(oldPath, newPath) {\n return this._addSyncStackTrace(fs.rename, this._getFilePath(oldPath), this._getFilePath(newPath))\n }\n\n async _rmdir(dir) {\n return this._addSyncStackTrace(fs.rmdir, this._getFilePath(dir))\n }\n\n async _sync() {\n const path = this._getRealPath('/')\n await this._addSyncStackTrace(fs.ensureDir, path)\n await this._addSyncStackTrace(fs.access, path, fs.R_OK | fs.W_OK)\n }\n\n _truncate(file, len) {\n return this._addSyncStackTrace(fs.truncate, this._getFilePath(file), len)\n }\n\n async _unlink(file) {\n const filePath = this._getFilePath(file)\n return await this._addSyncStackTrace(retry, () => fs.unlink(filePath), this._retriesOnEagain)\n }\n\n _writeFd(file, buffer, position) {\n return this._addSyncStackTrace(fs.write, file.fd, buffer, 0, buffer.length, position)\n }\n\n _writeFile(file, data, { flags }) {\n return this._addSyncStackTrace(fs.writeFile, this._getFilePath(file), data, { flag: flags })\n }\n}\n"],"mappings":"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"}
|
package/dist/nfs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nfs.js","names":["NfsHandler","MountHandler","constructor","remote","opts","host","port","path","parse","url","type","device","undefined"],"sources":["../src/nfs.js"],"sourcesContent":["import { parse } from 'xo-remote-parser'\n\nimport MountHandler from './_mount'\n\nexport default class NfsHandler extends MountHandler {\n constructor(remote, opts) {\n const { host, port, path } = parse(remote.url)\n super(remote, opts, {\n type: 'nfs',\n device: `${host}${port !== undefined ? ':' + port : ''}:${path}`,\n })\n }\n\n get type() {\n return 'nfs'\n }\n}\n"],"mappings":";;;;;;AAAA;AAEA;AAAmC;AAEpB,
|
|
1
|
+
{"version":3,"file":"nfs.js","names":["_xoRemoteParser","require","_mount","_interopRequireDefault","obj","__esModule","default","NfsHandler","MountHandler","constructor","remote","opts","host","port","path","parse","url","type","device","undefined","exports"],"sources":["../src/nfs.js"],"sourcesContent":["import { parse } from 'xo-remote-parser'\n\nimport MountHandler from './_mount'\n\nexport default class NfsHandler extends MountHandler {\n constructor(remote, opts) {\n const { host, port, path } = parse(remote.url)\n super(remote, opts, {\n type: 'nfs',\n device: `${host}${port !== undefined ? ':' + port : ''}:${path}`,\n })\n }\n\n get type() {\n return 'nfs'\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAmC,SAAAE,uBAAAC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEpB,MAAMG,UAAU,SAASC,cAAY,CAAC;EACnDC,WAAWA,CAACC,MAAM,EAAEC,IAAI,EAAE;IACxB,MAAM;MAAEC,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,GAAG,IAAAC,qBAAK,EAACL,MAAM,CAACM,GAAG,CAAC;IAC9C,KAAK,CAACN,MAAM,EAAEC,IAAI,EAAE;MAClBM,IAAI,EAAE,KAAK;MACXC,MAAM,EAAG,GAAEN,IAAK,GAAEC,IAAI,KAAKM,SAAS,GAAG,GAAG,GAAGN,IAAI,GAAG,EAAG,IAAGC,IAAK;IACjE,CAAC,CAAC;EACJ;EAEA,IAAIG,IAAIA,CAAA,EAAG;IACT,OAAO,KAAK;EACd;AACF;AAACG,OAAA,CAAAd,OAAA,GAAAC,UAAA"}
|
package/dist/path.js
CHANGED
package/dist/path.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.js","names":["basename","dirname","join","resolve","relative","sep","path","posix","normalize","split","parts","shift","relativeFromFile","file","resolveFromFile","slice"],"sources":["../src/path.js"],"sourcesContent":["import path from 'path'\n\nconst { basename, dirname, join, resolve, relative, sep } = path.posix\n\nexport { basename, dirname, join }\n\n// normalize the path:\n// - does not contains `.` or `..` (cannot escape root dir)\n// - always starts with `/`\n// - no trailing slash (expect for root)\n// - no duplicate slashes\nexport const normalize = path => resolve('/', path)\n\nexport function split(path) {\n const parts = normalize(path).split(sep)\n\n // remove first (empty) entry\n parts.shift()\n\n return parts\n}\n\nexport const relativeFromFile = (file, path) => relative(dirname(file), path)\nexport const resolveFromFile = (file, path) => resolve('/', dirname(file), path).slice(1)\n"],"mappings":";;;;;;;AAAA;AAAuB;AAEvB,MAAM;
|
|
1
|
+
{"version":3,"file":"path.js","names":["_path","_interopRequireDefault","require","obj","__esModule","default","basename","dirname","join","resolve","relative","sep","path","posix","exports","normalize","split","parts","shift","relativeFromFile","file","resolveFromFile","slice"],"sources":["../src/path.js"],"sourcesContent":["import path from 'path'\n\nconst { basename, dirname, join, resolve, relative, sep } = path.posix\n\nexport { basename, dirname, join }\n\n// normalize the path:\n// - does not contains `.` or `..` (cannot escape root dir)\n// - always starts with `/`\n// - no trailing slash (expect for root)\n// - no duplicate slashes\nexport const normalize = path => resolve('/', path)\n\nexport function split(path) {\n const parts = normalize(path).split(sep)\n\n // remove first (empty) entry\n parts.shift()\n\n return parts\n}\n\nexport const relativeFromFile = (file, path) => relative(dirname(file), path)\nexport const resolveFromFile = (file, path) => resolve('/', dirname(file), path).slice(1)\n"],"mappings":";;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAuB,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEvB,MAAM;EAAEG,QAAQ;EAAEC,OAAO;EAAEC,IAAI;EAAEC,OAAO;EAAEC,QAAQ;EAAEC;AAAI,CAAC,GAAGC,aAAI,CAACC,KAAK;AAAAC,OAAA,CAAAN,IAAA,GAAAA,IAAA;AAAAM,OAAA,CAAAP,OAAA,GAAAA,OAAA;AAAAO,OAAA,CAAAR,QAAA,GAAAA,QAAA;AAS/D,MAAMS,SAAS,GAAGH,IAAI,IAAIH,OAAO,CAAC,GAAG,EAAEG,IAAI,CAAC;AAAAE,OAAA,CAAAC,SAAA,GAAAA,SAAA;AAE5C,SAASC,KAAKA,CAACJ,IAAI,EAAE;EAC1B,MAAMK,KAAK,GAAGF,SAAS,CAACH,IAAI,CAAC,CAACI,KAAK,CAACL,GAAG,CAAC;EAGxCM,KAAK,CAACC,KAAK,EAAE;EAEb,OAAOD,KAAK;AACd;AAEO,MAAME,gBAAgB,GAAGA,CAACC,IAAI,EAAER,IAAI,KAAKF,QAAQ,CAACH,OAAO,CAACa,IAAI,CAAC,EAAER,IAAI,CAAC;AAAAE,OAAA,CAAAK,gBAAA,GAAAA,gBAAA;AACtE,MAAME,eAAe,GAAGA,CAACD,IAAI,EAAER,IAAI,KAAKH,OAAO,CAAC,GAAG,EAAEF,OAAO,CAACa,IAAI,CAAC,EAAER,IAAI,CAAC,CAACU,KAAK,CAAC,CAAC,CAAC;AAAAR,OAAA,CAAAO,eAAA,GAAAA,eAAA"}
|
package/dist/s3.js
CHANGED
|
@@ -25,13 +25,11 @@ var _asyncEach = require("@vates/async-each");
|
|
|
25
25
|
var _dec, _class;
|
|
26
26
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
27
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
28
|
-
|
|
29
28
|
const MIN_PART_SIZE = 1024 * 1024 * 5;
|
|
30
29
|
const MAX_PART_SIZE = 1024 * 1024 * 1024 * 5;
|
|
31
30
|
const MAX_PARTS_COUNT = 10000;
|
|
32
31
|
const MAX_OBJECT_SIZE = 1024 * 1024 * 1024 * 1024 * 5;
|
|
33
32
|
const IDEAL_FRAGMENT_SIZE = Math.ceil(MAX_OBJECT_SIZE / MAX_PARTS_COUNT);
|
|
34
|
-
|
|
35
33
|
const {
|
|
36
34
|
warn
|
|
37
35
|
} = (0, _log.createLogger)('xo:fs:s3');
|
|
@@ -82,7 +80,6 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
82
80
|
})
|
|
83
81
|
})
|
|
84
82
|
});
|
|
85
|
-
|
|
86
83
|
this._s3.middlewareStack.use((0, _middlewareApplyBodyChecksum.getApplyMd5BodyChecksumPlugin)(this._s3.config));
|
|
87
84
|
const parts = (0, _path.split)(path);
|
|
88
85
|
this._bucket = parts.shift();
|
|
@@ -99,7 +96,6 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
99
96
|
}
|
|
100
97
|
_makePrefix(dir) {
|
|
101
98
|
const prefix = (0, _path.join)(this._dir, dir, '/');
|
|
102
|
-
|
|
103
99
|
if (prefix !== './') {
|
|
104
100
|
return prefix;
|
|
105
101
|
}
|
|
@@ -209,7 +205,6 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
209
205
|
}
|
|
210
206
|
}
|
|
211
207
|
}
|
|
212
|
-
|
|
213
208
|
async _writeFile(file, data, options) {
|
|
214
209
|
return this._s3.send(new _clientS.PutObjectCommand({
|
|
215
210
|
...this._createParams(file),
|
|
@@ -255,11 +250,9 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
255
250
|
} else {
|
|
256
251
|
NextContinuationToken = undefined;
|
|
257
252
|
}
|
|
258
|
-
|
|
259
253
|
for (const entry of result.CommonPrefixes ?? []) {
|
|
260
254
|
uniq.add((0, _path.basename)(entry.Prefix));
|
|
261
255
|
}
|
|
262
|
-
|
|
263
256
|
for (const entry of result.Contents ?? []) {
|
|
264
257
|
uniq.add((0, _path.basename)(entry.Key));
|
|
265
258
|
}
|
|
@@ -274,7 +267,6 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
274
267
|
throw error;
|
|
275
268
|
}
|
|
276
269
|
}
|
|
277
|
-
|
|
278
270
|
async _rename(oldPath, newPath) {
|
|
279
271
|
await this.copy(oldPath, newPath);
|
|
280
272
|
await this._s3.send(new _clientS.DeleteObjectCommand(this._createParams(oldPath)));
|
|
@@ -318,9 +310,7 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
318
310
|
error.path = path;
|
|
319
311
|
throw error;
|
|
320
312
|
}
|
|
321
|
-
|
|
322
313
|
}
|
|
323
|
-
|
|
324
314
|
async _rmtree(path) {
|
|
325
315
|
let NextContinuationToken;
|
|
326
316
|
const Prefix = this._makePrefix(path);
|
package/dist/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","names":["MIN_PART_SIZE","MAX_PART_SIZE","MAX_PARTS_COUNT","MAX_OBJECT_SIZE","IDEAL_FRAGMENT_SIZE","Math","ceil","warn","createLogger","S3Handler","decorateWith","pRetry","wrap","delays","when","e","$metadata","httpStatusCode","onRetry","error","attemptNumber","delay","file","arguments","RemoteHandlerAbstract","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","_s3","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","_bucket","shift","_dir","join","type","_makeCopySource","_makeKey","_makePrefix","dir","prefix","_createParams","Bucket","Key","_multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","Error","cause","code","_isNotEmptyDir","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","_isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","queueSize","partSize","params","done","undefined","call","unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","_unlink","DeleteObjectCommand","_list","NextContinuationToken","uniq","Set","Delimiter","ContinuationToken","IsTruncated","entry","CommonPrefixes","add","basename","_mkdir","_rename","copy","fd","ContentLength","_read","buffer","position","Range","bytesRead","copyStreamToBuffer","_rmdir","_rmtree","asyncEach","concurrency","_write","uploadParams","fileSize","resultBuffer","Buffer","alloc","max","bytesWritten","copyMultipartParams","prefixSize","suffixOffset","suffixSize","hasSuffix","editBuffer","editBufferOffset","prefixPosition","fragmentsCount","floor","prefixFragmentSize","prefixLastFragmentSize","i","fragmentEnd","assert","strictEqual","range","copyPrefixParams","part","downloadParams","prefixBuffer","createBufferFromStream","concat","complementSize","complementOffset","prefixRange","complementBuffer","editParams","editPart","UploadPartCommand","suffixFragments","suffixFragmentOffset","suffixRange","copySuffixParams","suffixPart","_openFile","flags","_closeFile","useVhdDirectory"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n UploadPartCommand,\n UploadPartCopyCommand,\n} from '@aws-sdk/client-s3'\nimport { Upload } from '@aws-sdk/lib-storage'\nimport { NodeHttpHandler } from '@aws-sdk/node-http-handler'\nimport { getApplyMd5BodyChecksumPlugin } from '@aws-sdk/middleware-apply-body-checksum'\nimport assert from 'assert'\nimport { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport pRetry from 'promise-toolbox/retry'\nimport { createLogger } from '@xen-orchestra/log'\nimport { decorateWith } from '@vates/decorate-with'\nimport { PassThrough, pipeline } from 'stream'\nimport { parse } from 'xo-remote-parser'\nimport copyStreamToBuffer from './_copyStreamToBuffer.js'\nimport createBufferFromStream from './_createBufferFromStream.js'\nimport guessAwsRegion from './_guessAwsRegion.js'\nimport RemoteHandlerAbstract from './abstract'\nimport { basename, join, split } from './path'\nimport { asyncEach } from '@vates/async-each'\n\n// endpoints https://docs.aws.amazon.com/general/latest/gr/s3.html\n\n// limits: https://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html\nconst MIN_PART_SIZE = 1024 * 1024 * 5 // 5MB\nconst MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst MAX_PARTS_COUNT = 10000\nconst MAX_OBJECT_SIZE = 1024 * 1024 * 1024 * 1024 * 5 // 5TB\nconst IDEAL_FRAGMENT_SIZE = Math.ceil(MAX_OBJECT_SIZE / MAX_PARTS_COUNT) // the smallest fragment size that still allows a 5TB upload in 10000 fragments, about 524MB\n\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n constructor(remote, _opts) {\n super(remote)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n } = parse(remote.url)\n\n this._s3 = new S3Client({\n apiVersion: '2006-03-01',\n endpoint: `${protocol}://${host}`,\n forcePathStyle: true,\n credentials: {\n accessKeyId: username,\n secretAccessKey: password,\n },\n tls: protocol === 'https',\n region,\n requestHandler: new NodeHttpHandler({\n socketTimeout: 600000,\n httpAgent: new HttpAgent({\n keepAlive: true,\n }),\n httpsAgent: new HttpsAgent({\n rejectUnauthorized: !allowUnauthorized,\n keepAlive: true,\n }),\n }),\n })\n\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n this._s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this._s3.config))\n\n const parts = split(path)\n this._bucket = parts.shift()\n this._dir = join(...parts)\n }\n\n get type() {\n return 's3'\n }\n\n _makeCopySource(path) {\n return join(this._bucket, this._dir, path)\n }\n\n _makeKey(file) {\n return join(this._dir, file)\n }\n\n _makePrefix(dir) {\n const prefix = join(this._dir, dir, '/')\n\n // no prefix for root\n if (prefix !== './') {\n return prefix\n }\n }\n\n _createParams(file) {\n return { Bucket: this._bucket, Key: this._makeKey(file) }\n }\n\n async _multipartCopy(oldPath, newPath) {\n const size = await this._getSize(oldPath)\n const CopySource = this._makeCopySource(oldPath)\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand({ ...this._createParams(newPath) }))\n try {\n const parts = []\n let start = 0\n while (start < size) {\n const partNumber = parts.length + 1\n const upload = await this._s3.send(\n new UploadPartCopyCommand({\n ...multipartParams,\n CopySource,\n CopySourceRange: `bytes=${start}-${Math.min(start + MAX_PART_SIZE, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += MAX_PART_SIZE\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n\n async _copy(oldPath, newPath) {\n const CopySource = this._makeCopySource(oldPath)\n try {\n await this._s3.send(\n new CopyObjectCommand({\n ...this._createParams(newPath),\n CopySource,\n })\n )\n } catch (e) {\n // object > 5GB must be copied part by part\n if (e.name === 'EntityTooLarge') {\n return this._multipartCopy(oldPath, newPath)\n }\n // 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 queueSize: 1,\n partSize: IDEAL_FRAGMENT_SIZE,\n params: {\n ...this._createParams(path),\n Body,\n },\n })\n\n await upload.done()\n\n if (validator !== undefined) {\n try {\n await validator.call(this, path)\n } catch (error) {\n await this.unlink(path)\n throw error\n }\n }\n }\n\n // some objectstorage provider like backblaze, can answer a 500/503 routinely\n // in this case we should retry, and let their load balancing do its magic\n // https://www.backblaze.com/b2/docs/calling.html#error_handling\n @decorateWith(pRetry.wrap, {\n delays: [100, 200, 500, 1000, 2000],\n when: e => e.$metadata?.httpStatusCode === 500,\n onRetry(error) {\n warn('retrying writing file', {\n attemptNumber: this.attemptNumber,\n delay: this.delay,\n error,\n file: this.arguments[0],\n })\n },\n })\n async _writeFile(file, data, options) {\n return this._s3.send(\n new PutObjectCommand({\n ...this._createParams(file),\n Body: data,\n })\n )\n }\n\n async _createReadStream(path, options) {\n try {\n return (await this._s3.send(new GetObjectCommand(this._createParams(path)))).Body\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file '${path}'`)\n error.code = 'ENOENT'\n error.path = path\n throw error\n }\n throw e\n }\n }\n\n async _unlink(path) {\n await this._s3.send(new DeleteObjectCommand(this._createParams(path)))\n\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`EISDIR: illegal operation on a directory, unlink '${path}'`)\n error.code = 'EISDIR'\n error.path = path\n throw error\n }\n }\n\n async _list(dir) {\n let NextContinuationToken\n const uniq = new Set()\n const Prefix = this._makePrefix(dir)\n\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n Delimiter: '/',\n // will only return path until delimiters\n ContinuationToken: NextContinuationToken,\n })\n )\n\n if (result.IsTruncated) {\n warn(`need pagination to browse the directory ${dir} completely`)\n NextContinuationToken = result.NextContinuationToken\n } else {\n NextContinuationToken = undefined\n }\n\n // subdirectories\n for (const entry of result.CommonPrefixes ?? []) {\n uniq.add(basename(entry.Prefix))\n }\n\n // files\n for (const entry of result.Contents ?? []) {\n uniq.add(basename(entry.Key))\n }\n } while (NextContinuationToken !== undefined)\n\n return [...uniq]\n }\n\n async _mkdir(path) {\n if (await this._isFile(path)) {\n const error = new Error(`ENOTDIR: file already exists, mkdir '${path}'`)\n error.code = 'ENOTDIR'\n error.path = path\n throw error\n }\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // s3 doesn't have a rename operation, so copy + delete source\n async _rename(oldPath, newPath) {\n await this.copy(oldPath, newPath)\n await this._s3.send(new DeleteObjectCommand(this._createParams(oldPath)))\n }\n\n async _getSize(file) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const result = await this._s3.send(new HeadObjectCommand(this._createParams(file)))\n return +result.ContentLength\n }\n\n async _read(file, buffer, position = 0) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const params = this._createParams(file)\n params.Range = `bytes=${position}-${position + buffer.length - 1}`\n try {\n const result = await this._s3.send(new GetObjectCommand(params))\n const bytesRead = await copyStreamToBuffer(result.Body, buffer)\n return { bytesRead, buffer }\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n if (await this._isNotEmptyDir(file)) {\n const error = new Error(`${file} is a directory`)\n error.code = 'EISDIR'\n error.path = file\n throw error\n }\n }\n throw e\n }\n }\n\n async _rmdir(path) {\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`ENOTEMPTY: directory not empty, rmdir '${path}`)\n error.code = 'ENOTEMPTY'\n error.path = path\n throw error\n }\n\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // reimplement _rmtree to handle efficiantly path with more than 1000 entries in trees\n // @todo : use parallel processing for unlink\n async _rmtree(path) {\n let NextContinuationToken\n const Prefix = this._makePrefix(path)\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n ContinuationToken: NextContinuationToken,\n })\n )\n\n NextContinuationToken = result.IsTruncated ? result.NextContinuationToken : undefined\n await asyncEach(\n result.Contents ?? [],\n async ({ Key }) => {\n // _unlink will add the prefix, but Key contains everything\n // also we don't need to check if we delete a directory, since the list only return files\n await this._s3.send(\n new DeleteObjectCommand({\n Bucket: this._bucket,\n Key,\n })\n )\n },\n {\n concurrency: 16,\n }\n )\n } while (NextContinuationToken !== undefined)\n }\n\n async _write(file, buffer, position) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const uploadParams = this._createParams(file)\n let fileSize\n try {\n fileSize = +(await this._s3.send(new HeadObjectCommand(uploadParams))).ContentLength\n } catch (e) {\n if (e.name === 'NotFound') {\n fileSize = 0\n } else {\n throw e\n }\n }\n if (fileSize < MIN_PART_SIZE) {\n const resultBuffer = Buffer.alloc(Math.max(fileSize, position + buffer.length))\n if (fileSize !== 0) {\n const result = await this._s3.send(new GetObjectCommand(uploadParams))\n await copyStreamToBuffer(result.Body, resultBuffer)\n } else {\n Buffer.alloc(0).copy(resultBuffer)\n }\n buffer.copy(resultBuffer, position)\n await this._s3.send(\n new PutObjectCommand({\n ...uploadParams,\n Body: resultBuffer,\n })\n )\n return { buffer, bytesWritten: buffer.length }\n } else {\n // using this trick: https://stackoverflow.com/a/38089437/72637\n // multipart fragments have a minimum size of 5Mo and a max of 5Go unless they are last\n // splitting the file in 3 parts: [prefix, edit, suffix]\n // if `prefix` is bigger than 5Mo, it will be sourced from uploadPartCopy()\n // otherwise otherwise it will be downloaded, concatenated to `edit`\n // `edit` will always be an upload part\n // `suffix` will always be sourced from uploadPartCopy()\n // Then everything will be sliced in 5Gb parts before getting uploaded\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand(uploadParams))\n const copyMultipartParams = {\n ...multipartParams,\n CopySource: this._makeCopySource(file),\n }\n try {\n const parts = []\n const prefixSize = position\n let suffixOffset = prefixSize + buffer.length\n let suffixSize = Math.max(0, fileSize - suffixOffset)\n let hasSuffix = suffixSize > 0\n let editBuffer = buffer\n let editBufferOffset = position\n let partNumber = 1\n let prefixPosition = 0\n // use floor() so that last fragment is handled in the if bellow\n let fragmentsCount = Math.floor(prefixSize / MAX_PART_SIZE)\n const prefixFragmentSize = MAX_PART_SIZE\n let prefixLastFragmentSize = prefixSize - prefixFragmentSize * fragmentsCount\n if (prefixLastFragmentSize >= MIN_PART_SIZE) {\n // the last fragment of the prefix is smaller than MAX_PART_SIZE, but bigger than the minimum\n // so we can copy it too\n fragmentsCount++\n prefixLastFragmentSize = 0\n }\n for (let i = 0; i < fragmentsCount; i++) {\n const fragmentEnd = Math.min(prefixPosition + prefixFragmentSize, prefixSize)\n assert.strictEqual(fragmentEnd - prefixPosition <= MAX_PART_SIZE, true)\n const range = `bytes=${prefixPosition}-${fragmentEnd - 1}`\n const copyPrefixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: range }\n const part = await this._s3.send(new UploadPartCopyCommand(copyPrefixParams))\n parts.push({ ETag: part.CopyPartResult.ETag, PartNumber: copyPrefixParams.PartNumber })\n prefixPosition += prefixFragmentSize\n }\n if (prefixLastFragmentSize) {\n // grab everything from the prefix that was too small to be copied, download and merge to the edit buffer.\n const downloadParams = { ...uploadParams, Range: `bytes=${prefixPosition}-${prefixSize - 1}` }\n let prefixBuffer\n if (prefixSize > 0) {\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n prefixBuffer = await createBufferFromStream(result.Body)\n } else {\n prefixBuffer = Buffer.alloc(0)\n }\n editBuffer = Buffer.concat([prefixBuffer, buffer])\n editBufferOffset -= prefixLastFragmentSize\n }\n if (hasSuffix && editBuffer.length < MIN_PART_SIZE) {\n // the edit fragment is too short and is not the last fragment\n // let's steal from the suffix fragment to reach the minimum size\n // the suffix might be too short and itself entirely absorbed in the edit fragment, making it the last one.\n const complementSize = Math.min(MIN_PART_SIZE - editBuffer.length, suffixSize)\n const complementOffset = editBufferOffset + editBuffer.length\n suffixOffset += complementSize\n suffixSize -= complementSize\n hasSuffix = suffixSize > 0\n const prefixRange = `bytes=${complementOffset}-${complementOffset + complementSize - 1}`\n const downloadParams = { ...uploadParams, Range: prefixRange }\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n const complementBuffer = await createBufferFromStream(result.Body)\n editBuffer = Buffer.concat([editBuffer, complementBuffer])\n }\n const editParams = { ...multipartParams, Body: editBuffer, PartNumber: partNumber++ }\n const editPart = await this._s3.send(new UploadPartCommand(editParams))\n parts.push({ ETag: editPart.ETag, PartNumber: editParams.PartNumber })\n if (hasSuffix) {\n // use ceil because the last fragment can be arbitrarily small.\n const suffixFragments = Math.ceil(suffixSize / MAX_PART_SIZE)\n let suffixFragmentOffset = suffixOffset\n for (let i = 0; i < suffixFragments; i++) {\n const fragmentEnd = suffixFragmentOffset + MAX_PART_SIZE\n assert.strictEqual(Math.min(fileSize, fragmentEnd) - suffixFragmentOffset <= MAX_PART_SIZE, true)\n const suffixRange = `bytes=${suffixFragmentOffset}-${Math.min(fileSize, fragmentEnd) - 1}`\n const copySuffixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: suffixRange }\n const suffixPart = (await this._s3.send(new UploadPartCopyCommand(copySuffixParams))).CopyPartResult\n parts.push({ ETag: suffixPart.ETag, PartNumber: copySuffixParams.PartNumber })\n suffixFragmentOffset = fragmentEnd\n }\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n }\n\n async _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n useVhdDirectory() {\n return true\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"s3.js","names":["_clientS","require","_libStorage","_nodeHttpHandler","_middlewareApplyBodyChecksum","_assert","_interopRequireDefault","_http","_https","_retry","_log","_decorateWith","_stream","_xoRemoteParser","_copyStreamToBuffer","_createBufferFromStream","_guessAwsRegion","_abstract","_path","_asyncEach","_dec","_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","MIN_PART_SIZE","MAX_PART_SIZE","MAX_PARTS_COUNT","MAX_OBJECT_SIZE","IDEAL_FRAGMENT_SIZE","Math","ceil","warn","createLogger","S3Handler","decorateWith","pRetry","wrap","delays","when","e","_e$$metadata","$metadata","httpStatusCode","onRetry","error","attemptNumber","delay","file","arguments","RemoteHandlerAbstract","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","_s3","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","_bucket","shift","_dir","join","type","_makeCopySource","_makeKey","_makePrefix","dir","prefix","_createParams","Bucket","Key","_multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","Error","cause","code","_isNotEmptyDir","_result$Contents","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","_isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","queueSize","partSize","params","done","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","_write","uploadParams","fileSize","resultBuffer","Buffer","alloc","max","bytesWritten","copyMultipartParams","prefixSize","suffixOffset","suffixSize","hasSuffix","editBuffer","editBufferOffset","prefixPosition","fragmentsCount","floor","prefixFragmentSize","prefixLastFragmentSize","i","fragmentEnd","assert","strictEqual","range","copyPrefixParams","part","downloadParams","prefixBuffer","createBufferFromStream","concat","complementSize","complementOffset","prefixRange","complementBuffer","editParams","editPart","UploadPartCommand","suffixFragments","suffixFragmentOffset","suffixRange","copySuffixParams","suffixPart","_openFile","flags","_closeFile","useVhdDirectory","prototype","getOwnPropertyDescriptor","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 UploadPartCommand,\n UploadPartCopyCommand,\n} from '@aws-sdk/client-s3'\nimport { Upload } from '@aws-sdk/lib-storage'\nimport { NodeHttpHandler } from '@aws-sdk/node-http-handler'\nimport { getApplyMd5BodyChecksumPlugin } from '@aws-sdk/middleware-apply-body-checksum'\nimport assert from 'assert'\nimport { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport pRetry from 'promise-toolbox/retry'\nimport { createLogger } from '@xen-orchestra/log'\nimport { decorateWith } from '@vates/decorate-with'\nimport { PassThrough, pipeline } from 'stream'\nimport { parse } from 'xo-remote-parser'\nimport copyStreamToBuffer from './_copyStreamToBuffer.js'\nimport createBufferFromStream from './_createBufferFromStream.js'\nimport guessAwsRegion from './_guessAwsRegion.js'\nimport RemoteHandlerAbstract from './abstract'\nimport { basename, join, split } from './path'\nimport { asyncEach } from '@vates/async-each'\n\n// endpoints https://docs.aws.amazon.com/general/latest/gr/s3.html\n\n// limits: https://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html\nconst MIN_PART_SIZE = 1024 * 1024 * 5 // 5MB\nconst MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst MAX_PARTS_COUNT = 10000\nconst MAX_OBJECT_SIZE = 1024 * 1024 * 1024 * 1024 * 5 // 5TB\nconst IDEAL_FRAGMENT_SIZE = Math.ceil(MAX_OBJECT_SIZE / MAX_PARTS_COUNT) // the smallest fragment size that still allows a 5TB upload in 10000 fragments, about 524MB\n\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n constructor(remote, _opts) {\n super(remote)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n } = parse(remote.url)\n\n this._s3 = new S3Client({\n apiVersion: '2006-03-01',\n endpoint: `${protocol}://${host}`,\n forcePathStyle: true,\n credentials: {\n accessKeyId: username,\n secretAccessKey: password,\n },\n tls: protocol === 'https',\n region,\n requestHandler: new NodeHttpHandler({\n socketTimeout: 600000,\n httpAgent: new HttpAgent({\n keepAlive: true,\n }),\n httpsAgent: new HttpsAgent({\n rejectUnauthorized: !allowUnauthorized,\n keepAlive: true,\n }),\n }),\n })\n\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n this._s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this._s3.config))\n\n const parts = split(path)\n this._bucket = parts.shift()\n this._dir = join(...parts)\n }\n\n get type() {\n return 's3'\n }\n\n _makeCopySource(path) {\n return join(this._bucket, this._dir, path)\n }\n\n _makeKey(file) {\n return join(this._dir, file)\n }\n\n _makePrefix(dir) {\n const prefix = join(this._dir, dir, '/')\n\n // no prefix for root\n if (prefix !== './') {\n return prefix\n }\n }\n\n _createParams(file) {\n return { Bucket: this._bucket, Key: this._makeKey(file) }\n }\n\n async _multipartCopy(oldPath, newPath) {\n const size = await this._getSize(oldPath)\n const CopySource = this._makeCopySource(oldPath)\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand({ ...this._createParams(newPath) }))\n try {\n const parts = []\n let start = 0\n while (start < size) {\n const partNumber = parts.length + 1\n const upload = await this._s3.send(\n new UploadPartCopyCommand({\n ...multipartParams,\n CopySource,\n CopySourceRange: `bytes=${start}-${Math.min(start + MAX_PART_SIZE, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += MAX_PART_SIZE\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n\n async _copy(oldPath, newPath) {\n const CopySource = this._makeCopySource(oldPath)\n try {\n await this._s3.send(\n new CopyObjectCommand({\n ...this._createParams(newPath),\n CopySource,\n })\n )\n } catch (e) {\n // object > 5GB must be copied part by part\n if (e.name === 'EntityTooLarge') {\n return this._multipartCopy(oldPath, newPath)\n }\n // 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 queueSize: 1,\n partSize: IDEAL_FRAGMENT_SIZE,\n params: {\n ...this._createParams(path),\n Body,\n },\n })\n\n await upload.done()\n\n if (validator !== undefined) {\n try {\n await validator.call(this, path)\n } catch (error) {\n await this.unlink(path)\n throw error\n }\n }\n }\n\n // some objectstorage provider like backblaze, can answer a 500/503 routinely\n // in this case we should retry, and let their load balancing do its magic\n // https://www.backblaze.com/b2/docs/calling.html#error_handling\n @decorateWith(pRetry.wrap, {\n delays: [100, 200, 500, 1000, 2000],\n when: e => e.$metadata?.httpStatusCode === 500,\n onRetry(error) {\n warn('retrying writing file', {\n attemptNumber: this.attemptNumber,\n delay: this.delay,\n error,\n file: this.arguments[0],\n })\n },\n })\n async _writeFile(file, data, options) {\n return this._s3.send(\n new PutObjectCommand({\n ...this._createParams(file),\n Body: data,\n })\n )\n }\n\n async _createReadStream(path, options) {\n try {\n return (await this._s3.send(new GetObjectCommand(this._createParams(path)))).Body\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file '${path}'`)\n error.code = 'ENOENT'\n error.path = path\n throw error\n }\n throw e\n }\n }\n\n async _unlink(path) {\n await this._s3.send(new DeleteObjectCommand(this._createParams(path)))\n\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`EISDIR: illegal operation on a directory, unlink '${path}'`)\n error.code = 'EISDIR'\n error.path = path\n throw error\n }\n }\n\n async _list(dir) {\n let NextContinuationToken\n const uniq = new Set()\n const Prefix = this._makePrefix(dir)\n\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n Delimiter: '/',\n // will only return path until delimiters\n ContinuationToken: NextContinuationToken,\n })\n )\n\n if (result.IsTruncated) {\n warn(`need pagination to browse the directory ${dir} completely`)\n NextContinuationToken = result.NextContinuationToken\n } else {\n NextContinuationToken = undefined\n }\n\n // subdirectories\n for (const entry of result.CommonPrefixes ?? []) {\n uniq.add(basename(entry.Prefix))\n }\n\n // files\n for (const entry of result.Contents ?? []) {\n uniq.add(basename(entry.Key))\n }\n } while (NextContinuationToken !== undefined)\n\n return [...uniq]\n }\n\n async _mkdir(path) {\n if (await this._isFile(path)) {\n const error = new Error(`ENOTDIR: file already exists, mkdir '${path}'`)\n error.code = 'ENOTDIR'\n error.path = path\n throw error\n }\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // s3 doesn't have a rename operation, so copy + delete source\n async _rename(oldPath, newPath) {\n await this.copy(oldPath, newPath)\n await this._s3.send(new DeleteObjectCommand(this._createParams(oldPath)))\n }\n\n async _getSize(file) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const result = await this._s3.send(new HeadObjectCommand(this._createParams(file)))\n return +result.ContentLength\n }\n\n async _read(file, buffer, position = 0) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const params = this._createParams(file)\n params.Range = `bytes=${position}-${position + buffer.length - 1}`\n try {\n const result = await this._s3.send(new GetObjectCommand(params))\n const bytesRead = await copyStreamToBuffer(result.Body, buffer)\n return { bytesRead, buffer }\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n if (await this._isNotEmptyDir(file)) {\n const error = new Error(`${file} is a directory`)\n error.code = 'EISDIR'\n error.path = file\n throw error\n }\n }\n throw e\n }\n }\n\n async _rmdir(path) {\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`ENOTEMPTY: directory not empty, rmdir '${path}`)\n error.code = 'ENOTEMPTY'\n error.path = path\n throw error\n }\n\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // reimplement _rmtree to handle efficiantly path with more than 1000 entries in trees\n // @todo : use parallel processing for unlink\n async _rmtree(path) {\n let NextContinuationToken\n const Prefix = this._makePrefix(path)\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n ContinuationToken: NextContinuationToken,\n })\n )\n\n NextContinuationToken = result.IsTruncated ? result.NextContinuationToken : undefined\n await asyncEach(\n result.Contents ?? [],\n async ({ Key }) => {\n // _unlink will add the prefix, but Key contains everything\n // also we don't need to check if we delete a directory, since the list only return files\n await this._s3.send(\n new DeleteObjectCommand({\n Bucket: this._bucket,\n Key,\n })\n )\n },\n {\n concurrency: 16,\n }\n )\n } while (NextContinuationToken !== undefined)\n }\n\n async _write(file, buffer, position) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const uploadParams = this._createParams(file)\n let fileSize\n try {\n fileSize = +(await this._s3.send(new HeadObjectCommand(uploadParams))).ContentLength\n } catch (e) {\n if (e.name === 'NotFound') {\n fileSize = 0\n } else {\n throw e\n }\n }\n if (fileSize < MIN_PART_SIZE) {\n const resultBuffer = Buffer.alloc(Math.max(fileSize, position + buffer.length))\n if (fileSize !== 0) {\n const result = await this._s3.send(new GetObjectCommand(uploadParams))\n await copyStreamToBuffer(result.Body, resultBuffer)\n } else {\n Buffer.alloc(0).copy(resultBuffer)\n }\n buffer.copy(resultBuffer, position)\n await this._s3.send(\n new PutObjectCommand({\n ...uploadParams,\n Body: resultBuffer,\n })\n )\n return { buffer, bytesWritten: buffer.length }\n } else {\n // using this trick: https://stackoverflow.com/a/38089437/72637\n // multipart fragments have a minimum size of 5Mo and a max of 5Go unless they are last\n // splitting the file in 3 parts: [prefix, edit, suffix]\n // if `prefix` is bigger than 5Mo, it will be sourced from uploadPartCopy()\n // otherwise otherwise it will be downloaded, concatenated to `edit`\n // `edit` will always be an upload part\n // `suffix` will always be sourced from uploadPartCopy()\n // Then everything will be sliced in 5Gb parts before getting uploaded\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand(uploadParams))\n const copyMultipartParams = {\n ...multipartParams,\n CopySource: this._makeCopySource(file),\n }\n try {\n const parts = []\n const prefixSize = position\n let suffixOffset = prefixSize + buffer.length\n let suffixSize = Math.max(0, fileSize - suffixOffset)\n let hasSuffix = suffixSize > 0\n let editBuffer = buffer\n let editBufferOffset = position\n let partNumber = 1\n let prefixPosition = 0\n // use floor() so that last fragment is handled in the if bellow\n let fragmentsCount = Math.floor(prefixSize / MAX_PART_SIZE)\n const prefixFragmentSize = MAX_PART_SIZE\n let prefixLastFragmentSize = prefixSize - prefixFragmentSize * fragmentsCount\n if (prefixLastFragmentSize >= MIN_PART_SIZE) {\n // the last fragment of the prefix is smaller than MAX_PART_SIZE, but bigger than the minimum\n // so we can copy it too\n fragmentsCount++\n prefixLastFragmentSize = 0\n }\n for (let i = 0; i < fragmentsCount; i++) {\n const fragmentEnd = Math.min(prefixPosition + prefixFragmentSize, prefixSize)\n assert.strictEqual(fragmentEnd - prefixPosition <= MAX_PART_SIZE, true)\n const range = `bytes=${prefixPosition}-${fragmentEnd - 1}`\n const copyPrefixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: range }\n const part = await this._s3.send(new UploadPartCopyCommand(copyPrefixParams))\n parts.push({ ETag: part.CopyPartResult.ETag, PartNumber: copyPrefixParams.PartNumber })\n prefixPosition += prefixFragmentSize\n }\n if (prefixLastFragmentSize) {\n // grab everything from the prefix that was too small to be copied, download and merge to the edit buffer.\n const downloadParams = { ...uploadParams, Range: `bytes=${prefixPosition}-${prefixSize - 1}` }\n let prefixBuffer\n if (prefixSize > 0) {\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n prefixBuffer = await createBufferFromStream(result.Body)\n } else {\n prefixBuffer = Buffer.alloc(0)\n }\n editBuffer = Buffer.concat([prefixBuffer, buffer])\n editBufferOffset -= prefixLastFragmentSize\n }\n if (hasSuffix && editBuffer.length < MIN_PART_SIZE) {\n // the edit fragment is too short and is not the last fragment\n // let's steal from the suffix fragment to reach the minimum size\n // the suffix might be too short and itself entirely absorbed in the edit fragment, making it the last one.\n const complementSize = Math.min(MIN_PART_SIZE - editBuffer.length, suffixSize)\n const complementOffset = editBufferOffset + editBuffer.length\n suffixOffset += complementSize\n suffixSize -= complementSize\n hasSuffix = suffixSize > 0\n const prefixRange = `bytes=${complementOffset}-${complementOffset + complementSize - 1}`\n const downloadParams = { ...uploadParams, Range: prefixRange }\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n const complementBuffer = await createBufferFromStream(result.Body)\n editBuffer = Buffer.concat([editBuffer, complementBuffer])\n }\n const editParams = { ...multipartParams, Body: editBuffer, PartNumber: partNumber++ }\n const editPart = await this._s3.send(new UploadPartCommand(editParams))\n parts.push({ ETag: editPart.ETag, PartNumber: editParams.PartNumber })\n if (hasSuffix) {\n // use ceil because the last fragment can be arbitrarily small.\n const suffixFragments = Math.ceil(suffixSize / MAX_PART_SIZE)\n let suffixFragmentOffset = suffixOffset\n for (let i = 0; i < suffixFragments; i++) {\n const fragmentEnd = suffixFragmentOffset + MAX_PART_SIZE\n assert.strictEqual(Math.min(fileSize, fragmentEnd) - suffixFragmentOffset <= MAX_PART_SIZE, true)\n const suffixRange = `bytes=${suffixFragmentOffset}-${Math.min(fileSize, fragmentEnd) - 1}`\n const copySuffixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: suffixRange }\n const suffixPart = (await this._s3.send(new UploadPartCopyCommand(copySuffixParams))).CopyPartResult\n parts.push({ ETag: suffixPart.ETag, PartNumber: copySuffixParams.PartNumber })\n suffixFragmentOffset = fragmentEnd\n }\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n }\n\n async _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n useVhdDirectory() {\n return true\n }\n}\n"],"mappings":"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"}
|
package/dist/smb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smb.js","names":["SmbHandler","MountHandler","constructor","remote","opts","domain","host","password","path","username","parse","url","type","device","normalize","options","env","USER","PASSWD"],"sources":["../src/smb.js"],"sourcesContent":["import { parse } from 'xo-remote-parser'\n\nimport MountHandler from './_mount'\nimport { normalize } from './path'\n\nexport default class SmbHandler extends MountHandler {\n constructor(remote, opts) {\n const { domain = 'WORKGROUP', host, password, path, username } = parse(remote.url)\n super(remote, opts, {\n type: 'cifs',\n device: '//' + host + normalize(path),\n options: `domain=${domain}`,\n env: {\n USER: username,\n PASSWD: password,\n },\n })\n }\n\n get type() {\n return 'smb'\n }\n}\n"],"mappings":";;;;;;AAAA;AAEA;AACA;AAAkC;AAEnB,
|
|
1
|
+
{"version":3,"file":"smb.js","names":["_xoRemoteParser","require","_mount","_interopRequireDefault","_path","obj","__esModule","default","SmbHandler","MountHandler","constructor","remote","opts","domain","host","password","path","username","parse","url","type","device","normalize","options","env","USER","PASSWD","exports"],"sources":["../src/smb.js"],"sourcesContent":["import { parse } from 'xo-remote-parser'\n\nimport MountHandler from './_mount'\nimport { normalize } from './path'\n\nexport default class SmbHandler extends MountHandler {\n constructor(remote, opts) {\n const { domain = 'WORKGROUP', host, password, path, username } = parse(remote.url)\n super(remote, opts, {\n type: 'cifs',\n device: '//' + host + normalize(path),\n options: `domain=${domain}`,\n env: {\n USER: username,\n PASSWD: password,\n },\n })\n }\n\n get type() {\n return 'smb'\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AAAkC,SAAAE,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEnB,MAAMG,UAAU,SAASC,cAAY,CAAC;EACnDC,WAAWA,CAACC,MAAM,EAAEC,IAAI,EAAE;IACxB,MAAM;MAAEC,MAAM,GAAG,WAAW;MAAEC,IAAI;MAAEC,QAAQ;MAAEC,IAAI;MAAEC;IAAS,CAAC,GAAG,IAAAC,qBAAK,EAACP,MAAM,CAACQ,GAAG,CAAC;IAClF,KAAK,CAACR,MAAM,EAAEC,IAAI,EAAE;MAClBQ,IAAI,EAAE,MAAM;MACZC,MAAM,EAAE,IAAI,GAAGP,IAAI,GAAG,IAAAQ,eAAS,EAACN,IAAI,CAAC;MACrCO,OAAO,EAAG,UAASV,MAAO,EAAC;MAC3BW,GAAG,EAAE;QACHC,IAAI,EAAER,QAAQ;QACdS,MAAM,EAAEX;MACV;IACF,CAAC,CAAC;EACJ;EAEA,IAAIK,IAAIA,CAAA,EAAG;IACT,OAAO,KAAK;EACd;AACF;AAACO,OAAA,CAAApB,OAAA,GAAAC,UAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"private": false,
|
|
3
3
|
"name": "@xen-orchestra/fs",
|
|
4
|
-
"version": "3.3.
|
|
4
|
+
"version": "3.3.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",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"node": ">=14.13"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
+
"@aws-sdk/abort-controller": "^3.272.0",
|
|
23
24
|
"@aws-sdk/client-s3": "^3.54.0",
|
|
24
25
|
"@aws-sdk/lib-storage": "^3.54.0",
|
|
25
26
|
"@aws-sdk/middleware-apply-body-checksum": "^3.58.0",
|
|
@@ -30,11 +31,11 @@
|
|
|
30
31
|
"@vates/decorate-with": "^2.0.0",
|
|
31
32
|
"@vates/read-chunk": "^1.0.1",
|
|
32
33
|
"@xen-orchestra/async-map": "^0.1.2",
|
|
33
|
-
"@xen-orchestra/log": "^0.
|
|
34
|
+
"@xen-orchestra/log": "^0.6.0",
|
|
34
35
|
"bind-property-descriptor": "^2.0.0",
|
|
35
36
|
"decorator-synchronized": "^0.6.0",
|
|
36
37
|
"execa": "^5.0.0",
|
|
37
|
-
"fs-extra": "^
|
|
38
|
+
"fs-extra": "^11.1.0",
|
|
38
39
|
"get-stream": "^6.0.0",
|
|
39
40
|
"limit-concurrency-decorator": "^0.5.0",
|
|
40
41
|
"lodash": "^4.17.4",
|
|
@@ -50,10 +51,9 @@
|
|
|
50
51
|
"@babel/plugin-proposal-decorators": "^7.1.6",
|
|
51
52
|
"@babel/plugin-proposal-function-bind": "^7.0.0",
|
|
52
53
|
"@babel/preset-env": "^7.8.0",
|
|
53
|
-
"babel-plugin-lodash": "^3.3.2",
|
|
54
54
|
"cross-env": "^7.0.2",
|
|
55
55
|
"dotenv": "^16.0.0",
|
|
56
|
-
"rimraf": "^
|
|
56
|
+
"rimraf": "^4.1.1",
|
|
57
57
|
"tmp": "^0.2.1"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
package/encryption.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"algorithm":"none"}
|
package/metadata.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"random":"45651f73-be2a-48dd-9ee4-80e054436939"}
|