@xen-orchestra/fs 1.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ const {
4
+ readChunk
5
+ } = require('@vates/read-chunk');
6
+
7
+ const crypto = require('crypto');
8
+
9
+ const pumpify = require('pumpify');
10
+
11
+ function getEncryptor(key) {
12
+ if (key === undefined) {
13
+ return {
14
+ id: 'NULL_ENCRYPTOR',
15
+ algorithm: 'none',
16
+ key: 'none',
17
+ ivLength: 0,
18
+ encryptData: buffer => buffer,
19
+ encryptStream: stream => stream,
20
+ decryptData: buffer => buffer,
21
+ decryptStream: stream => stream
22
+ };
23
+ }
24
+
25
+ const algorithm = 'aes-256-cbc';
26
+ const ivLength = 16;
27
+
28
+ function encryptStream(input) {
29
+ const iv = crypto.randomBytes(ivLength);
30
+ const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
31
+ const encrypted = pumpify(input, cipher);
32
+ encrypted.unshift(iv);
33
+ return encrypted;
34
+ }
35
+
36
+ async function decryptStream(encryptedStream) {
37
+ const iv = await readChunk(encryptedStream, ivLength);
38
+ const cipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv);
39
+ return pumpify(encryptedStream, cipher);
40
+ }
41
+
42
+ function encryptData(buffer) {
43
+ const iv = crypto.randomBytes(ivLength);
44
+ const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
45
+ const encrypted = cipher.update(buffer);
46
+ return Buffer.concat([iv, encrypted, cipher.final()]);
47
+ }
48
+
49
+ function decryptData(buffer) {
50
+ const iv = buffer.slice(0, ivLength);
51
+ const encrypted = buffer.slice(ivLength);
52
+ const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv);
53
+ const decrypted = decipher.update(encrypted);
54
+ return Buffer.concat([decrypted, decipher.final()]);
55
+ }
56
+
57
+ return {
58
+ id: algorithm,
59
+ algorithm,
60
+ key,
61
+ ivLength,
62
+ encryptData,
63
+ encryptStream,
64
+ decryptData,
65
+ decryptStream
66
+ };
67
+ }
68
+
69
+ exports._getEncryptor = getEncryptor;
70
+ //# sourceMappingURL=_encryptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_encryptor.js","names":["readChunk","require","crypto","pumpify","getEncryptor","key","undefined","id","algorithm","ivLength","encryptData","buffer","encryptStream","stream","decryptData","decryptStream","input","iv","randomBytes","cipher","createCipheriv","Buffer","from","encrypted","unshift","encryptedStream","createDecipheriv","update","concat","final","slice","decipher","decrypted","exports","_getEncryptor"],"sources":["../src/_encryptor.js"],"sourcesContent":["const { readChunk } = require('@vates/read-chunk')\nconst crypto = require('crypto')\nconst pumpify = require('pumpify')\n\nfunction getEncryptor(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 algorithm = 'aes-256-cbc'\n const ivLength = 16\n\n function encryptStream(input) {\n const iv = crypto.randomBytes(ivLength)\n const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv)\n\n const encrypted = pumpify(input, cipher)\n encrypted.unshift(iv)\n return encrypted\n }\n\n async function decryptStream(encryptedStream) {\n const iv = await readChunk(encryptedStream, ivLength)\n const cipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n /**\n * WARNING\n *\n * the crytped size has an initializtion vector + 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 return pumpify(encryptedStream, cipher)\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()])\n }\n\n function decryptData(buffer) {\n const iv = buffer.slice(0, ivLength)\n const encrypted = buffer.slice(ivLength)\n const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n const decrypted = decipher.update(encrypted)\n return Buffer.concat([decrypted, decipher.final()])\n }\n\n return {\n id: algorithm,\n algorithm,\n key,\n ivLength,\n encryptData,\n encryptStream,\n decryptData,\n decryptStream,\n }\n}\n\nexports._getEncryptor = getEncryptor\n"],"mappings":"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"}
package/dist/abstract.js CHANGED
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _legacy = _interopRequireDefault(require("@xen-orchestra/async-map/legacy"));
9
9
 
10
+ var _assert = _interopRequireDefault(require("assert"));
11
+
10
12
  var _getStream = _interopRequireDefault(require("get-stream"));
11
13
 
12
14
  var _coalesceCalls = require("@vates/coalesce-calls");
@@ -25,10 +27,12 @@ var _crypto = require("crypto");
25
27
 
26
28
  var _decoratorSynchronized = require("decorator-synchronized");
27
29
 
28
- var _path = require("./_path");
30
+ var _path = require("./path");
29
31
 
30
32
  var _checksum = require("./checksum");
31
33
 
34
+ var _encryptor = require("./_encryptor");
35
+
32
36
  var _dec, _dec2, _class;
33
37
 
34
38
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -36,6 +40,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
36
40
  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; }
37
41
 
38
42
  const {
43
+ info,
39
44
  warn
40
45
  } = (0, _log.createLogger)('@xen-orchestra:fs');
41
46
 
@@ -48,6 +53,8 @@ const computeRate = (hrtime, size) => {
48
53
 
49
54
  const DEFAULT_TIMEOUT = 6e5;
50
55
  const DEFAULT_MAX_PARALLEL_OPERATIONS = 10;
56
+ const ENCRYPTION_DESC_FILENAME = 'encryption.json';
57
+ const ENCRYPTION_METADATA_FILENAME = 'metadata.json';
51
58
 
52
59
  const ignoreEnoent = error => {
53
60
  if (error == null || error.code !== 'ENOENT') {
@@ -91,6 +98,8 @@ class PrefixWrapper {
91
98
  }
92
99
 
93
100
  let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(), _dec2 = (0, _decoratorSynchronized.synchronized)(), (_class = class RemoteHandlerAbstract {
101
+ _encryptor;
102
+
94
103
  constructor(remote, options = {}) {
95
104
  if (remote.url === 'test://') {
96
105
  this._remote = remote;
@@ -109,6 +118,7 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
109
118
  highWaterMark: this._highWaterMark,
110
119
  timeout: this._timeout = DEFAULT_TIMEOUT
111
120
  } = options);
121
+ this._encryptor = (0, _encryptor._getEncryptor)(this._remote.encryptionKey);
112
122
  const sharedLimit = (0, _limitConcurrencyDecorator.limitConcurrency)(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS);
113
123
  this.closeFile = sharedLimit(this.closeFile);
114
124
  this.copy = sharedLimit(this.copy);
@@ -143,89 +153,53 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
143
153
  await this.__closeFile(fd);
144
154
  }
145
155
 
146
- async createOutputStream(file, {
156
+ async createReadStream(file, {
147
157
  checksum = false,
148
- dirMode,
158
+ ignoreMissingChecksum = false,
149
159
  ...options
150
160
  } = {}) {
151
- if (typeof file === 'string') {
152
- file = (0, _path.normalize)(file);
161
+ if (options.end !== undefined || options.start !== undefined) {
162
+ _assert.default.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`);
153
163
  }
154
164
 
155
- const path = typeof file === 'string' ? file : file.path;
156
-
157
- const streamP = _promiseToolbox.timeout.call(this._createOutputStream(file, {
158
- dirMode,
159
- flags: 'wx',
160
- ...options
161
- }), this._timeout);
162
-
163
- if (!checksum) {
164
- return streamP;
165
- }
166
-
167
- const checksumStream = (0, _checksum.createChecksumStream)();
168
-
169
- const forwardError = error => {
170
- checksumStream.emit('error', error);
171
- };
172
-
173
- const stream = await streamP;
174
- stream.on('error', forwardError);
175
- checksumStream.pipe(stream);
176
- checksumStream.checksumWritten = checksumStream.checksum.then(value => this._outputFile(checksumFile(path), value, {
177
- flags: 'wx'
178
- })).catch(forwardError);
179
- return checksumStream;
180
- }
181
-
182
- createReadStream(file, {
183
- checksum = false,
184
- ignoreMissingChecksum = false,
185
- ...options
186
- } = {}) {
187
165
  if (typeof file === 'string') {
188
166
  file = (0, _path.normalize)(file);
189
167
  }
190
168
 
191
- const path = typeof file === 'string' ? file : file.path;
192
-
193
- const streamP = _promiseToolbox.timeout.call(this._createReadStream(file, { ...options,
169
+ let stream = await _promiseToolbox.timeout.call(this._createReadStream(file, { ...options,
194
170
  highWaterMark: this._highWaterMark
195
- }), this._timeout).then(stream => {
196
- let promise = (0, _promiseToolbox.fromEvent)(stream, 'readable');
171
+ }), this._timeout);
172
+ await (0, _promiseToolbox.fromEvent)(stream, 'readable');
197
173
 
198
- if (stream.length === undefined && options.end === undefined && options.start === undefined) {
199
- promise = Promise.all([promise, _promiseToolbox.ignoreErrors.call(this._getSize(file).then(size => {
200
- stream.length = size;
201
- }))]);
174
+ if (checksum) {
175
+ try {
176
+ const path = typeof file === 'string' ? file : file.path;
177
+ const checksum = await this._readFile(checksumFile(path), {
178
+ flags: 'r'
179
+ });
180
+ const {
181
+ length
182
+ } = stream;
183
+ stream = (0, _checksum.validChecksumOfReadStream)(stream, String(checksum).trim());
184
+ stream.length = length;
185
+ } catch (error) {
186
+ if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {
187
+ throw error;
188
+ }
202
189
  }
203
-
204
- return promise.then(() => stream);
205
- });
206
-
207
- if (!checksum) {
208
- return streamP;
209
190
  }
210
191
 
211
- _promiseToolbox.ignoreErrors.call(streamP);
212
-
213
- return this._readFile(checksumFile(path), {
214
- flags: 'r'
215
- }).then(checksum => streamP.then(stream => {
216
- const {
217
- length
218
- } = stream;
219
- stream = (0, _checksum.validChecksumOfReadStream)(stream, String(checksum).trim());
220
- stream.length = length;
221
- return stream;
222
- }), error => {
223
- if (ignoreMissingChecksum && error && error.code === 'ENOENT') {
224
- return streamP;
192
+ if (this.isEncrypted) {
193
+ stream = this._encryptor.decryptStream(stream);
194
+ } else {
195
+ if (stream.length === undefined && options.end === undefined && options.start === undefined) {
196
+ try {
197
+ stream.length = await this._getSize(file);
198
+ } catch (error) {}
225
199
  }
200
+ }
226
201
 
227
- throw error;
228
- });
202
+ return stream;
229
203
  }
230
204
 
231
205
  async outputStream(path, input, {
@@ -235,6 +209,7 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
235
209
  } = {}) {
236
210
  path = (0, _path.normalize)(path);
237
211
  let checksumStream;
212
+ input = this._encryptor.encryptStream(input);
238
213
 
239
214
  if (checksum) {
240
215
  checksumStream = (0, _checksum.createChecksumStream)();
@@ -264,7 +239,10 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
264
239
  }
265
240
 
266
241
  async getSize(file) {
267
- return _promiseToolbox.timeout.call(this._getSize(typeof file === 'string' ? (0, _path.normalize)(file) : file), this._timeout);
242
+ _assert.default.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`);
243
+
244
+ const size = await _promiseToolbox.timeout.call(this._getSize(typeof file === 'string' ? (0, _path.normalize)(file) : file), this._timeout);
245
+ return size - this._encryptor.ivLength;
268
246
  }
269
247
 
270
248
  async list(dir, {
@@ -328,22 +306,27 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
328
306
  dirMode,
329
307
  flags = 'wx'
330
308
  } = {}) {
331
- await this._outputFile((0, _path.normalize)(file), data, {
309
+ const encryptedData = this._encryptor.encryptData(data);
310
+
311
+ await this._outputFile((0, _path.normalize)(file), encryptedData, {
332
312
  dirMode,
333
313
  flags
334
314
  });
335
315
  }
336
316
 
337
317
  async read(file, buffer, position) {
318
+ _assert.default.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`);
319
+
338
320
  return this._read(typeof file === 'string' ? (0, _path.normalize)(file) : file, buffer, position);
339
321
  }
340
322
 
341
323
  async readFile(file, {
342
324
  flags = 'r'
343
325
  } = {}) {
344
- return this._readFile((0, _path.normalize)(file), {
326
+ const data = await this._readFile((0, _path.normalize)(file), {
345
327
  flags
346
328
  });
329
+ return this._encryptor.decryptData(data);
347
330
  }
348
331
 
349
332
  async rename(oldPath, newPath, {
@@ -386,6 +369,56 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
386
369
 
387
370
  async sync() {
388
371
  await this._sync();
372
+
373
+ try {
374
+ await this._checkMetadata();
375
+ } catch (error) {
376
+ await this._forget();
377
+ throw error;
378
+ }
379
+ }
380
+
381
+ async _canWriteMetadata() {
382
+ const list = await this.list('/', {
383
+ filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME
384
+ });
385
+ return list.length === 0;
386
+ }
387
+
388
+ async _createMetadata() {
389
+ await Promise.all([this._writeFile((0, _path.normalize)(ENCRYPTION_DESC_FILENAME), JSON.stringify({
390
+ algorithm: this._encryptor.algorithm
391
+ }), {
392
+ flags: 'w'
393
+ }), this.writeFile(ENCRYPTION_METADATA_FILENAME, `{"random":"${(0, _crypto.randomUUID)()}"}`, {
394
+ flags: 'w'
395
+ })]);
396
+ }
397
+
398
+ async _checkMetadata() {
399
+ try {
400
+ const data = await this._readFile((0, _path.normalize)(ENCRYPTION_DESC_FILENAME));
401
+ JSON.parse(data);
402
+ } catch (error) {
403
+ if (error.code !== 'ENOENT') {
404
+ throw error;
405
+ }
406
+ }
407
+
408
+ try {
409
+ const data = await this.readFile(ENCRYPTION_METADATA_FILENAME);
410
+ JSON.parse(data);
411
+ } catch (error) {
412
+ if (error.code === 'ENOENT' || (await this._canWriteMetadata())) {
413
+ info('will update metadata of this remote');
414
+ return this._createMetadata();
415
+ }
416
+
417
+ warn(`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`, {
418
+ error
419
+ });
420
+ throw error;
421
+ }
389
422
  }
390
423
 
391
424
  async test() {
@@ -448,13 +481,17 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
448
481
  }
449
482
 
450
483
  async write(file, buffer, position) {
484
+ _assert.default.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`);
485
+
451
486
  await this._write(typeof file === 'string' ? (0, _path.normalize)(file) : file, buffer, position);
452
487
  }
453
488
 
454
489
  async writeFile(file, data, {
455
490
  flags = 'wx'
456
491
  } = {}) {
457
- await this._writeFile((0, _path.normalize)(file), data, {
492
+ const encryptedData = this._encryptor.encryptData(data);
493
+
494
+ await this._writeFile((0, _path.normalize)(file), encryptedData, {
458
495
  flags
459
496
  });
460
497
  }
@@ -597,9 +634,10 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
597
634
  validator
598
635
  }) {
599
636
  const tmpPath = `${(0, _path.dirname)(path)}/.${(0, _path.basename)(path)}`;
600
- const output = await this.createOutputStream(tmpPath, {
601
- dirMode
602
- });
637
+ const output = await _promiseToolbox.timeout.call(this._createOutputStream(tmpPath, {
638
+ dirMode,
639
+ flags: 'wx'
640
+ }), this._timeout);
603
641
 
604
642
  try {
605
643
  await (0, _promiseToolbox.fromCallback)(_stream.pipeline, input, output);
@@ -687,6 +725,10 @@ let RemoteHandlerAbstract = (_dec = (0, _decoratorSynchronized.synchronized)(),
687
725
  throw new Error('Not implemented');
688
726
  }
689
727
 
728
+ get isEncrypted() {
729
+ return this._encryptor.id !== 'NULL_ENCRYPTOR';
730
+ }
731
+
690
732
  }, (_applyDecoratedDescriptor(_class.prototype, "forget", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, "forget"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "sync", [_dec2], Object.getOwnPropertyDescriptor(_class.prototype, "sync"), _class.prototype)), _class));
691
733
  exports.default = RemoteHandlerAbstract;
692
734
 
@@ -1 +1 @@
1
- {"version":3,"file":"abstract.js","names":["warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","constructor","handler","prefix","_prefix","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","forEach","entry","i","slice","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","remote","options","url","_remote","parse","Error","highWaterMark","_highWaterMark","timeout","_timeout","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","fd","__closeFile","createOutputStream","checksum","dirMode","streamP","call","_createOutputStream","flags","checksumStream","createChecksumStream","forwardError","emit","stream","on","pipe","checksumWritten","then","value","_outputFile","catch","createReadStream","ignoreMissingChecksum","_createReadStream","promise","fromEvent","undefined","end","start","Promise","all","ignoreErrors","_getSize","_readFile","validChecksumOfReadStream","String","trim","outputStream","input","validator","pipeline","_outputStream","forget","_getInfo","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mode","__mkdir","mktree","_mktree","__openFile","data","buffer","position","_read","p","_rename","_copy","_rmdir","rmtree","_rmtree","sync","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","_unlink","len","_truncate","_write","_writeFile","_closeFile","_mkdir","_openFile","useVhdDirectory","_createWriteStream","dirname","resolve","tmpPath","basename","output","getStream","files","asyncMapSettled","isPath","_writeFd","createPrefixWrapperMethods","pPw","pRha","defineProperty","getOwnPropertyDescriptor","hasOwnProperty","Object","getOwnPropertyNames","name","descriptor","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import asyncMapSettled from '@xen-orchestra/async-map/legacy'\nimport getStream from 'get-stream'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './_path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\n\nconst { warn } = createLogger('@xen-orchestra:fs')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n constructor(handler, prefix) {\n this._prefix = prefix\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this._prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n _resolve(path) {\n return this._prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async closeFile(fd) {\n await this.__closeFile(fd)\n }\n\n // TODO: remove method\n async createOutputStream(file, { checksum = false, dirMode, ...options } = {}) {\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n const path = typeof file === 'string' ? file : file.path\n const streamP = timeout.call(\n this._createOutputStream(file, {\n dirMode,\n flags: 'wx',\n ...options,\n }),\n this._timeout\n )\n\n if (!checksum) {\n return streamP\n }\n\n const checksumStream = createChecksumStream()\n const forwardError = error => {\n checksumStream.emit('error', error)\n }\n\n const stream = await streamP\n stream.on('error', forwardError)\n checksumStream.pipe(stream)\n\n checksumStream.checksumWritten = checksumStream.checksum\n .then(value => this._outputFile(checksumFile(path), value, { flags: 'wx' }))\n .catch(forwardError)\n\n return checksumStream\n }\n\n createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n const path = typeof file === 'string' ? file : file.path\n const streamP = timeout\n .call(this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }), this._timeout)\n .then(stream => {\n // detect early errors\n let promise = fromEvent(stream, 'readable')\n\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n promise = Promise.all([\n promise,\n ignoreErrors.call(\n this._getSize(file).then(size => {\n stream.length = size\n })\n ),\n ])\n }\n\n return promise.then(() => stream)\n })\n\n if (!checksum) {\n return streamP\n }\n\n // avoid a unhandled rejection warning\n ignoreErrors.call(streamP)\n\n return this._readFile(checksumFile(path), { flags: 'r' }).then(\n checksum =>\n streamP.then(stream => {\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n\n return stream\n }),\n error => {\n if (ignoreMissingChecksum && error && error.code === 'ENOENT') {\n return streamP\n }\n throw error\n }\n )\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n validator,\n })\n if (checksum) {\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n async getSize(file) {\n return timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n }\n\n async list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mkdir(dir, { mode } = {}) {\n await this.__mkdir(normalizePath(dir), { mode })\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n openFile(path, flags) {\n return this.__openFile(path, flags)\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n await this._outputFile(normalizePath(file), data, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async readFile(file, { flags = 'r' } = {}) {\n return this._readFile(normalizePath(file), { flags })\n }\n\n async rename(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async writeFile(file, data, { flags = 'wx' } = {}) {\n await this._writeFile(normalizePath(file), data, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await this.createOutputStream(tmpPath, {\n dirMode,\n })\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.rename(tmpPath, path)\n } catch (error) {\n await this.unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncMapSettled(files, file =>\n this._unlink(`${dir}/${file}`).catch(error => {\n // Unlink dir behavior is not consistent across platforms\n // https://github.com/nodejs/node-v0.x-archive/issues/5791\n if (error.code === 'EISDIR' || error.code === 'EPERM') {\n return this._rmtree(`${dir}/${file}`)\n }\n throw error\n })\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":"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"}
1
+ {"version":3,"file":"abstract.js","names":["info","warn","createLogger","checksumFile","file","computeRate","hrtime","size","seconds","DEFAULT_TIMEOUT","DEFAULT_MAX_PARALLEL_OPERATIONS","ENCRYPTION_DESC_FILENAME","ENCRYPTION_METADATA_FILENAME","ignoreEnoent","error","code","noop","Function","prototype","PrefixWrapper","constructor","handler","prefix","_prefix","_handler","type","list","dir","opts","entries","_resolve","prependDir","n","length","forEach","entry","i","slice","rename","oldPath","newPath","path","normalizePath","RemoteHandlerAbstract","synchronized","_encryptor","remote","options","url","_remote","parse","Error","highWaterMark","_highWaterMark","timeout","_timeout","_getEncryptor","encryptionKey","sharedLimit","limitConcurrency","maxParallelOperations","closeFile","copy","getInfo","getSize","mkdir","openFile","outputFile","read","readFile","rmdir","truncate","unlink","write","writeFile","_forget","coalesceCalls","_sync","addPrefix","fd","__closeFile","createReadStream","checksum","ignoreMissingChecksum","end","undefined","start","assert","strictEqual","isEncrypted","stream","call","_createReadStream","fromEvent","_readFile","flags","validChecksumOfReadStream","String","trim","decryptStream","_getSize","outputStream","input","dirMode","validator","checksumStream","encryptStream","createChecksumStream","pipeline","_outputStream","_outputFile","forget","_getInfo","ivLength","filter","ignoreMissing","virtualDir","_list","lock","dispose","_lock","mode","__mkdir","mktree","_mktree","__openFile","data","encryptedData","encryptData","buffer","position","_read","decryptData","p","_rename","Promise","all","_copy","_rmdir","catch","rmtree","_rmtree","sync","_checkMetadata","_canWriteMetadata","e","startsWith","_createMetadata","_writeFile","JSON","stringify","algorithm","randomUUID","test","SIZE","testFileName","Date","now","fromCallback","randomBytes","step","writeStart","process","writeDuration","readStart","readDuration","equals","success","writeRate","readRate","ignoreErrors","_unlink","len","_truncate","_write","_closeFile","_mkdir","_openFile","useVhdDirectory","_createOutputStream","_createWriteStream","dirname","resolve","tmpPath","basename","output","then","getStream","files","asyncMapSettled","isPath","_writeFd","id","createPrefixWrapperMethods","pPw","pRha","defineProperty","getOwnPropertyDescriptor","hasOwnProperty","Object","getOwnPropertyNames","name","descriptor","value","arguments","apply"],"sources":["../src/abstract.js"],"sourcesContent":["import asyncMapSettled from '@xen-orchestra/async-map/legacy'\nimport assert from 'assert'\nimport getStream from 'get-stream'\nimport { coalesceCalls } from '@vates/coalesce-calls'\nimport { createLogger } from '@xen-orchestra/log'\nimport { fromCallback, fromEvent, ignoreErrors, timeout } from 'promise-toolbox'\nimport { limitConcurrency } from 'limit-concurrency-decorator'\nimport { parse } from 'xo-remote-parser'\nimport { pipeline } from 'stream'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { synchronized } from 'decorator-synchronized'\n\nimport { basename, dirname, normalize as normalizePath } from './path'\nimport { createChecksumStream, validChecksumOfReadStream } from './checksum'\nimport { _getEncryptor } from './_encryptor'\n\nconst { info, warn } = createLogger('@xen-orchestra:fs')\n\nconst checksumFile = file => file + '.checksum'\nconst computeRate = (hrtime, size) => {\n const seconds = hrtime[0] + hrtime[1] / 1e9\n return size / seconds\n}\n\nconst DEFAULT_TIMEOUT = 6e5 // 10 min\nconst DEFAULT_MAX_PARALLEL_OPERATIONS = 10\n\nconst ENCRYPTION_DESC_FILENAME = 'encryption.json'\nconst ENCRYPTION_METADATA_FILENAME = 'metadata.json'\n\nconst ignoreEnoent = error => {\n if (error == null || error.code !== 'ENOENT') {\n throw error\n }\n}\n\nconst noop = Function.prototype\n\nclass PrefixWrapper {\n constructor(handler, prefix) {\n this._prefix = prefix\n this._handler = handler\n }\n\n get type() {\n return this._handler.type\n }\n\n // necessary to remove the prefix from the path with `prependDir` option\n async list(dir, opts) {\n const entries = await this._handler.list(this._resolve(dir), opts)\n if (opts != null && opts.prependDir) {\n const n = this._prefix.length\n entries.forEach((entry, i, entries) => {\n entries[i] = entry.slice(n)\n })\n }\n return entries\n }\n\n rename(oldPath, newPath) {\n return this._handler.rename(this._resolve(oldPath), this._resolve(newPath))\n }\n\n _resolve(path) {\n return this._prefix + normalizePath(path)\n }\n}\n\nexport default class RemoteHandlerAbstract {\n _encryptor\n constructor(remote, options = {}) {\n if (remote.url === 'test://') {\n this._remote = remote\n } else {\n this._remote = { ...remote, ...parse(remote.url) }\n if (this._remote.type !== this.type) {\n throw new Error('Incorrect remote type')\n }\n }\n ;({ highWaterMark: this._highWaterMark, timeout: this._timeout = DEFAULT_TIMEOUT } = options)\n this._encryptor = _getEncryptor(this._remote.encryptionKey)\n\n const sharedLimit = limitConcurrency(options.maxParallelOperations ?? DEFAULT_MAX_PARALLEL_OPERATIONS)\n this.closeFile = sharedLimit(this.closeFile)\n this.copy = sharedLimit(this.copy)\n this.getInfo = sharedLimit(this.getInfo)\n this.getSize = sharedLimit(this.getSize)\n this.list = sharedLimit(this.list)\n this.mkdir = sharedLimit(this.mkdir)\n this.openFile = sharedLimit(this.openFile)\n this.outputFile = sharedLimit(this.outputFile)\n this.read = sharedLimit(this.read)\n this.readFile = sharedLimit(this.readFile)\n this.rename = sharedLimit(this.rename)\n this.rmdir = sharedLimit(this.rmdir)\n this.truncate = sharedLimit(this.truncate)\n this.unlink = sharedLimit(this.unlink)\n this.write = sharedLimit(this.write)\n this.writeFile = sharedLimit(this.writeFile)\n\n this._forget = coalesceCalls(this._forget)\n this._sync = coalesceCalls(this._sync)\n }\n\n // Public members\n\n get type() {\n throw new Error('Not implemented')\n }\n\n addPrefix(prefix) {\n prefix = normalizePath(prefix)\n return prefix === '/' ? this : new PrefixWrapper(this, prefix)\n }\n\n async closeFile(fd) {\n await this.__closeFile(fd)\n }\n\n async createReadStream(file, { checksum = false, ignoreMissingChecksum = false, ...options } = {}) {\n if (options.end !== undefined || options.start !== undefined) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of a file when encryption is active ${file}`)\n }\n if (typeof file === 'string') {\n file = normalizePath(file)\n }\n\n let stream = await timeout.call(\n this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }),\n this._timeout\n )\n\n // detect early errors\n await fromEvent(stream, 'readable')\n\n if (checksum) {\n try {\n const path = typeof file === 'string' ? file : file.path\n const checksum = await this._readFile(checksumFile(path), { flags: 'r' })\n\n const { length } = stream\n stream = validChecksumOfReadStream(stream, String(checksum).trim())\n stream.length = length\n } catch (error) {\n if (!(ignoreMissingChecksum && error.code === 'ENOENT')) {\n throw error\n }\n }\n }\n\n if (this.isEncrypted) {\n stream = this._encryptor.decryptStream(stream)\n } else {\n // try to add the length prop if missing and not a range stream\n if (stream.length === undefined && options.end === undefined && options.start === undefined) {\n try {\n stream.length = await this._getSize(file)\n } catch (error) {\n // ignore errors\n }\n }\n }\n\n return stream\n }\n\n /**\n * write a stream to a file using a temporary file\n *\n * @param {string} path\n * @param {ReadableStream} input\n * @param {object} [options]\n * @param {boolean} [options.checksum]\n * @param {number} [options.dirMode]\n * @param {(this: RemoteHandlerAbstract, path: string) => Promise<undefined>} [options.validator] Function that will be called before the data is commited to the remote, if it fails, file should not exist\n */\n async outputStream(path, input, { checksum = true, dirMode, validator } = {}) {\n path = normalizePath(path)\n let checksumStream\n\n input = this._encryptor.encryptStream(input)\n if (checksum) {\n checksumStream = createChecksumStream()\n pipeline(input, checksumStream, noop)\n input = checksumStream\n }\n await this._outputStream(path, input, {\n dirMode,\n validator,\n })\n if (checksum) {\n // using _outpuFile means the checksum will NOT be encrypted\n // it is by design to allow checking of encrypted files without the key\n await this._outputFile(checksumFile(path), await checksumStream.checksum, { dirMode, flags: 'wx' })\n }\n }\n\n // Free the resources possibly dedicated to put the remote at work, when it\n // is no more needed\n //\n // FIXME: Some handlers are implemented based on system-wide mecanisms (such\n // as mount), forgetting them might breaking other processes using the same\n // remote.\n @synchronized()\n async forget() {\n await this._forget()\n }\n\n async getInfo() {\n return timeout.call(this._getInfo(), this._timeout)\n }\n\n // when using encryption, the file size is aligned with the encryption block size ( 16 bytes )\n // that means that the size will be 1 to 16 bytes more than the content size + the initialized vector length (16 bytes)\n async getSize(file) {\n assert.strictEqual(this.isEncrypted, false, `Can't compute size of an encrypted file ${file}`)\n\n const size = await timeout.call(this._getSize(typeof file === 'string' ? normalizePath(file) : file), this._timeout)\n return size - this._encryptor.ivLength\n }\n\n async list(dir, { filter, ignoreMissing = false, prependDir = false } = {}) {\n try {\n const virtualDir = normalizePath(dir)\n dir = normalizePath(dir)\n\n let entries = await timeout.call(this._list(dir), this._timeout)\n if (filter !== undefined) {\n entries = entries.filter(filter)\n }\n\n if (prependDir) {\n entries.forEach((entry, i) => {\n entries[i] = virtualDir + '/' + entry\n })\n }\n\n return entries\n } catch (error) {\n if (ignoreMissing && error?.code === 'ENOENT') {\n return []\n }\n throw error\n }\n }\n\n async lock(path) {\n path = normalizePath(path)\n return { dispose: await this._lock(path) }\n }\n\n async mkdir(dir, { mode } = {}) {\n await this.__mkdir(normalizePath(dir), { mode })\n }\n\n async mktree(dir, { mode } = {}) {\n await this._mktree(normalizePath(dir), { mode })\n }\n\n openFile(path, flags) {\n return this.__openFile(path, flags)\n }\n\n async outputFile(file, data, { dirMode, flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._outputFile(normalizePath(file), encryptedData, { dirMode, flags })\n }\n\n async read(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't read part of an encrypted file ${file}`)\n return this._read(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async readFile(file, { flags = 'r' } = {}) {\n const data = await this._readFile(normalizePath(file), { flags })\n return this._encryptor.decryptData(data)\n }\n\n async rename(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._rename(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._rename(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async copy(oldPath, newPath, { checksum = false } = {}) {\n oldPath = normalizePath(oldPath)\n newPath = normalizePath(newPath)\n\n let p = timeout.call(this._copy(oldPath, newPath), this._timeout)\n if (checksum) {\n p = Promise.all([p, this._copy(checksumFile(oldPath), checksumFile(newPath))])\n }\n return p\n }\n\n async rmdir(dir) {\n await timeout.call(this._rmdir(normalizePath(dir)).catch(ignoreEnoent), this._timeout)\n }\n\n async rmtree(dir) {\n await this._rmtree(normalizePath(dir))\n }\n\n // Asks the handler to sync the state of the effective remote with its'\n // metadata\n //\n // This method MUST ALWAYS be called before using the handler.\n @synchronized()\n async sync() {\n await this._sync()\n try {\n await this._checkMetadata()\n } catch (error) {\n await this._forget()\n throw error\n }\n }\n\n async _canWriteMetadata() {\n const list = await this.list('/', {\n filter: e => !e.startsWith('.') && e !== ENCRYPTION_DESC_FILENAME && e !== ENCRYPTION_METADATA_FILENAME,\n })\n return list.length === 0\n }\n\n async _createMetadata() {\n await Promise.all([\n this._writeFile(\n normalizePath(ENCRYPTION_DESC_FILENAME),\n JSON.stringify({ algorithm: this._encryptor.algorithm }),\n {\n flags: 'w',\n }\n ), // not encrypted\n this.writeFile(ENCRYPTION_METADATA_FILENAME, `{\"random\":\"${randomUUID()}\"}`, { flags: 'w' }), // encrypted\n ])\n }\n\n async _checkMetadata() {\n try {\n // this file is not encrypted\n const data = await this._readFile(normalizePath(ENCRYPTION_DESC_FILENAME))\n JSON.parse(data)\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n try {\n // this file is encrypted\n const data = await this.readFile(ENCRYPTION_METADATA_FILENAME)\n JSON.parse(data)\n } catch (error) {\n if (error.code === 'ENOENT' || (await this._canWriteMetadata())) {\n info('will update metadata of this remote')\n return this._createMetadata()\n }\n warn(\n `The encryptionKey settings of this remote does not match the key used to create it. You won't be able to read any data from this remote`,\n { error }\n )\n // will probably send a ERR_OSSL_EVP_BAD_DECRYPT if key is incorrect\n throw error\n }\n }\n\n async test() {\n const SIZE = 1024 * 1024 * 10\n const testFileName = normalizePath(`${Date.now()}.test`)\n const data = await fromCallback(randomBytes, SIZE)\n let step = 'write'\n try {\n const writeStart = process.hrtime()\n await this._outputFile(testFileName, data, { flags: 'wx' })\n const writeDuration = process.hrtime(writeStart)\n\n step = 'read'\n const readStart = process.hrtime()\n const read = await this._readFile(testFileName, { flags: 'r' })\n const readDuration = process.hrtime(readStart)\n\n if (!data.equals(read)) {\n throw new Error('output and input did not match')\n }\n return {\n success: true,\n writeRate: computeRate(writeDuration, SIZE),\n readRate: computeRate(readDuration, SIZE),\n }\n } catch (error) {\n warn(`error while testing the remote at step ${step}`, { error })\n return {\n success: false,\n step,\n file: testFileName,\n error,\n }\n } finally {\n ignoreErrors.call(this._unlink(testFileName))\n }\n }\n\n async truncate(file, len) {\n await this._truncate(file, len)\n }\n\n async unlink(file, { checksum = true } = {}) {\n file = normalizePath(file)\n\n if (checksum) {\n ignoreErrors.call(this._unlink(checksumFile(file)))\n }\n\n await this._unlink(file).catch(ignoreEnoent)\n }\n\n async write(file, buffer, position) {\n assert.strictEqual(this.isEncrypted, false, `Can't write part of a file with encryption ${file}`)\n await this._write(typeof file === 'string' ? normalizePath(file) : file, buffer, position)\n }\n\n async writeFile(file, data, { flags = 'wx' } = {}) {\n const encryptedData = this._encryptor.encryptData(data)\n await this._writeFile(normalizePath(file), encryptedData, { flags })\n }\n\n // Methods that can be called by private methods to avoid parallel limit on public methods\n\n async __closeFile(fd) {\n await timeout.call(this._closeFile(fd.fd), this._timeout)\n }\n\n async __mkdir(dir, { mode } = {}) {\n try {\n await this._mkdir(dir, { mode })\n } catch (error) {\n if (error == null || error.code !== 'EEXIST') {\n throw error\n }\n\n // this operation will throw if it's not already a directory\n await this._list(dir)\n }\n }\n\n async __openFile(path, flags) {\n path = normalizePath(path)\n\n return {\n fd: await timeout.call(this._openFile(path, flags), this._timeout),\n path,\n }\n }\n\n // Methods that can be implemented by inheriting classes\n\n useVhdDirectory() {\n return this._remote.useVhdDirectory ?? false\n }\n\n async _closeFile(fd) {\n throw new Error('Not implemented')\n }\n\n async _createOutputStream(file, { dirMode, ...options } = {}) {\n try {\n return await this._createWriteStream(file, { ...options, highWaterMark: this._highWaterMark })\n } catch (error) {\n if (typeof file !== 'string' || error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._createOutputStream(file, options)\n }\n\n async _createReadStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // createWriteStream takes highWaterMark as option even if it's not documented.\n // Source: https://stackoverflow.com/questions/55026306/how-to-set-writeable-highwatermark\n async _createWriteStream(file, options) {\n throw new Error('Not implemented')\n }\n\n // called to finalize the remote\n async _forget() {}\n\n async _getInfo() {\n return {}\n }\n\n async _lock(path) {\n return () => Promise.resolve()\n }\n\n async _getSize(file) {\n throw new Error('Not implemented')\n }\n\n async _list(dir) {\n throw new Error('Not implemented')\n }\n\n async _mkdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _mktree(dir, { mode } = {}) {\n try {\n return await this.__mkdir(dir, { mode })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(dir), { mode })\n return this._mktree(dir, { mode })\n }\n\n async _openFile(path, flags) {\n throw new Error('Not implemented')\n }\n\n async _outputFile(file, data, { dirMode, flags }) {\n try {\n return await this._writeFile(file, data, { flags })\n } catch (error) {\n if (error.code !== 'ENOENT') {\n throw error\n }\n }\n\n await this._mktree(dirname(file), { mode: dirMode })\n return this._outputFile(file, data, { flags })\n }\n\n async _outputStream(path, input, { dirMode, validator }) {\n const tmpPath = `${dirname(path)}/.${basename(path)}`\n const output = await timeout.call(\n this._createOutputStream(tmpPath, {\n dirMode,\n flags: 'wx',\n }),\n this._timeout\n )\n try {\n await fromCallback(pipeline, input, output)\n if (validator !== undefined) {\n await validator.call(this, tmpPath)\n }\n await this.rename(tmpPath, path)\n } catch (error) {\n await this.unlink(tmpPath)\n throw error\n }\n }\n\n _read(file, buffer, position) {\n throw new Error('Not implemented')\n }\n\n _readFile(file, options) {\n return this._createReadStream(file, { ...options, highWaterMark: this._highWaterMark }).then(getStream.buffer)\n }\n\n async _rename(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n async _copy(oldPath, newPath) {\n throw new Error('Not implemented')\n }\n\n async _rmdir(dir) {\n throw new Error('Not implemented')\n }\n\n async _rmtree(dir) {\n try {\n return await this._rmdir(dir)\n } catch (error) {\n if (error.code !== 'ENOTEMPTY') {\n throw error\n }\n }\n\n const files = await this._list(dir)\n await asyncMapSettled(files, file =>\n this._unlink(`${dir}/${file}`).catch(error => {\n // Unlink dir behavior is not consistent across platforms\n // https://github.com/nodejs/node-v0.x-archive/issues/5791\n if (error.code === 'EISDIR' || error.code === 'EPERM') {\n return this._rmtree(`${dir}/${file}`)\n }\n throw error\n })\n )\n return this._rmtree(dir)\n }\n\n // called to initialize the remote\n async _sync() {}\n\n async _unlink(file) {\n throw new Error('Not implemented')\n }\n\n async _write(file, buffer, position) {\n const isPath = typeof file === 'string'\n if (isPath) {\n file = await this.__openFile(file, 'r+')\n }\n try {\n return await this._writeFd(file, buffer, position)\n } finally {\n if (isPath) {\n await this.__closeFile(file)\n }\n }\n }\n\n async _writeFd(fd, buffer, position) {\n throw new Error('Not implemented')\n }\n\n async _writeFile(file, data, options) {\n throw new Error('Not implemented')\n }\n\n get isEncrypted() {\n return this._encryptor.id !== 'NULL_ENCRYPTOR'\n }\n}\n\nfunction createPrefixWrapperMethods() {\n const pPw = PrefixWrapper.prototype\n const pRha = RemoteHandlerAbstract.prototype\n\n const {\n defineProperty,\n getOwnPropertyDescriptor,\n prototype: { hasOwnProperty },\n } = Object\n\n Object.getOwnPropertyNames(pRha).forEach(name => {\n let descriptor, value\n if (\n hasOwnProperty.call(pPw, name) ||\n name[0] === '_' ||\n typeof (value = (descriptor = getOwnPropertyDescriptor(pRha, name)).value) !== 'function'\n ) {\n return\n }\n\n descriptor.value = function () {\n let path\n if (arguments.length !== 0 && typeof (path = arguments[0]) === 'string') {\n arguments[0] = this._resolve(path)\n }\n return value.apply(this._handler, arguments)\n }\n\n defineProperty(pPw, name, descriptor)\n })\n}\ncreatePrefixWrapperMethods()\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,8 +17,6 @@ var _s = _interopRequireDefault(require("./s3"));
17
17
 
18
18
  var _smb = _interopRequireDefault(require("./smb"));
19
19
 
20
- var _smbMount = _interopRequireDefault(require("./smb-mount"));
21
-
22
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
21
 
24
22
  const HANDLERS = {
@@ -30,10 +28,8 @@ const HANDLERS = {
30
28
  try {
31
29
  _execa.default.sync('mount.cifs', ['-V']);
32
30
 
33
- HANDLERS.smb = _smbMount.default;
34
- } catch (_) {
35
31
  HANDLERS.smb = _smb.default;
36
- }
32
+ } catch (_) {}
37
33
 
38
34
  const getHandler = (remote, ...rest) => {
39
35
  const Handler = HANDLERS[(0, _xoRemoteParser.parse)(remote.url).type];
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","RemoteHandlerSmbMount","_","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'\nimport RemoteHandlerSmbMount from './smb-mount'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmbMount\n} catch (_) {\n HANDLERS.smb = RemoteHandlerSmb\n}\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;;;;AAEA,MAAMA,QAAQ,GAAG;EACfC,IAAI,EAAEC,cADS;EAEfC,GAAG,EAAEC,YAFU;EAGfC,EAAE,EAAEC;AAHW,CAAjB;;AAMA,IAAI;EACFC,cAAA,CAAMC,IAAN,CAAW,YAAX,EAAyB,CAAC,IAAD,CAAzB;;EACAR,QAAQ,CAACS,GAAT,GAAeC,iBAAf;AACD,CAHD,CAGE,OAAOC,CAAP,EAAU;EACVX,QAAQ,CAACS,GAAT,GAAeG,YAAf;AACD;;AAEM,MAAMC,UAAU,GAAG,CAACC,MAAD,EAAS,GAAGC,IAAZ,KAAqB;EAC7C,MAAMC,OAAO,GAAGhB,QAAQ,CAAC,IAAAiB,qBAAA,EAAMH,MAAM,CAACI,GAAb,EAAkBC,IAAnB,CAAxB;;EACA,IAAI,CAACH,OAAL,EAAc;IACZ,MAAM,IAAII,KAAJ,CAAU,uBAAV,CAAN;EACD;;EACD,OAAO,IAAIJ,OAAJ,CAAYF,MAAZ,EAAoB,GAAGC,IAAvB,CAAP;AACD,CANM;;;;AAQA,MAAMM,gBAAgB,GAAG,OAAO,GAAGC,IAAV,KAAmB;EACjD,MAAMC,OAAO,GAAGV,UAAU,CAAC,GAAGS,IAAJ,CAA1B;EACA,MAAMC,OAAO,CAACf,IAAR,EAAN;EACA,OAAO;IACLgB,OAAO,EAAE,MAAMD,OAAO,CAACE,MAAR,EADV;IAELC,KAAK,EAAEH;EAFF,CAAP;AAID,CAPM"}
1
+ {"version":3,"file":"index.js","names":["HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","getSyncedHandler","opts","handler","dispose","forget","value"],"sources":["../src/index.js"],"sourcesContent":["import execa from 'execa'\nimport { parse } from 'xo-remote-parser'\n\nimport RemoteHandlerLocal from './local'\nimport RemoteHandlerNfs from './nfs'\nimport RemoteHandlerS3 from './s3'\nimport RemoteHandlerSmb from './smb'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmb\n} catch (_) {}\n\nexport const getHandler = (remote, ...rest) => {\n const Handler = HANDLERS[parse(remote.url).type]\n if (!Handler) {\n throw new Error('Unhandled remote type')\n }\n return new Handler(remote, ...rest)\n}\n\nexport const getSyncedHandler = async (...opts) => {\n const handler = getHandler(...opts)\n await handler.sync()\n return {\n dispose: () => handler.forget(),\n value: handler,\n }\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;AACA;;AACA;;AACA;;;;AAEA,MAAMA,QAAQ,GAAG;EACfC,IAAI,EAAEC,cADS;EAEfC,GAAG,EAAEC,YAFU;EAGfC,EAAE,EAAEC;AAHW,CAAjB;;AAMA,IAAI;EACFC,cAAA,CAAMC,IAAN,CAAW,YAAX,EAAyB,CAAC,IAAD,CAAzB;;EACAR,QAAQ,CAACS,GAAT,GAAeC,YAAf;AACD,CAHD,CAGE,OAAOC,CAAP,EAAU,CAAE;;AAEP,MAAMC,UAAU,GAAG,CAACC,MAAD,EAAS,GAAGC,IAAZ,KAAqB;EAC7C,MAAMC,OAAO,GAAGf,QAAQ,CAAC,IAAAgB,qBAAA,EAAMH,MAAM,CAACI,GAAb,EAAkBC,IAAnB,CAAxB;;EACA,IAAI,CAACH,OAAL,EAAc;IACZ,MAAM,IAAII,KAAJ,CAAU,uBAAV,CAAN;EACD;;EACD,OAAO,IAAIJ,OAAJ,CAAYF,MAAZ,EAAoB,GAAGC,IAAvB,CAAP;AACD,CANM;;;;AAQA,MAAMM,gBAAgB,GAAG,OAAO,GAAGC,IAAV,KAAmB;EACjD,MAAMC,OAAO,GAAGV,UAAU,CAAC,GAAGS,IAAJ,CAA1B;EACA,MAAMC,OAAO,CAACd,IAAR,EAAN;EACA,OAAO;IACLe,OAAO,EAAE,MAAMD,OAAO,CAACE,MAAR,EADV;IAELC,KAAK,EAAEH;EAFF,CAAP;AAID,CAPM"}