@xen-orchestra/fs 3.1.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_copyStreamToBuffer.js +0 -1
- package/dist/_copyStreamToBuffer.js.map +1 -1
- package/dist/_createBufferFromStream.js +0 -1
- package/dist/_createBufferFromStream.js.map +1 -1
- package/dist/_encryptor.js +76 -24
- package/dist/_encryptor.js.map +1 -1
- package/dist/_guessAwsRegion.js +0 -1
- package/dist/_guessAwsRegion.js.map +1 -1
- package/dist/_mount.js +3 -23
- package/dist/_mount.js.map +1 -1
- package/dist/abstract.js +65 -157
- package/dist/abstract.js.map +1 -1
- package/dist/checksum.js +0 -12
- package/dist/checksum.js.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/local.js +0 -46
- package/dist/local.js.map +1 -1
- package/dist/nfs.js +0 -7
- package/dist/nfs.js.map +1 -1
- package/dist/path.js +1 -10
- package/dist/path.js.map +1 -1
- package/dist/s3.js +30 -106
- package/dist/s3.js.map +1 -1
- package/dist/smb.js +0 -8
- package/dist/smb.js.map +1 -1
- package/encryption.json +1 -0
- package/metadata.json +1 -0
- package/package.json +6 -6
|
@@ -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":"
|
|
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,kBAAkB,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":"
|
|
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,sBAAsB,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
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.UNENCRYPTED_ALGORITHM = exports.DEFAULT_ENCRYPTION_ALGORITHM = void 0;
|
|
7
|
+
exports.isLegacyEncryptionAlgorithm = isLegacyEncryptionAlgorithm;
|
|
8
|
+
const {
|
|
9
|
+
pipeline
|
|
10
|
+
} = require('node:stream');
|
|
3
11
|
const {
|
|
4
12
|
readChunk
|
|
5
13
|
} = require('@vates/read-chunk');
|
|
6
|
-
|
|
7
14
|
const crypto = require('crypto');
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
const DEFAULT_ENCRYPTION_ALGORITHM = 'aes-256-gcm';
|
|
16
|
+
exports.DEFAULT_ENCRYPTION_ALGORITHM = DEFAULT_ENCRYPTION_ALGORITHM;
|
|
17
|
+
const UNENCRYPTED_ALGORITHM = 'none';
|
|
18
|
+
exports.UNENCRYPTED_ALGORITHM = UNENCRYPTED_ALGORITHM;
|
|
19
|
+
function isLegacyEncryptionAlgorithm(algorithm) {
|
|
20
|
+
return algorithm !== UNENCRYPTED_ALGORITHM && algorithm !== DEFAULT_ENCRYPTION_ALGORITHM;
|
|
21
|
+
}
|
|
22
|
+
function getEncryptor(algorithm = DEFAULT_ENCRYPTION_ALGORITHM, key) {
|
|
12
23
|
if (key === undefined) {
|
|
13
24
|
return {
|
|
14
25
|
id: 'NULL_ENCRYPTOR',
|
|
@@ -21,39 +32,81 @@ function getEncryptor(key) {
|
|
|
21
32
|
decryptStream: stream => stream
|
|
22
33
|
};
|
|
23
34
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
35
|
+
const info = crypto.getCipherInfo(algorithm, {
|
|
36
|
+
keyLength: key.length
|
|
37
|
+
});
|
|
38
|
+
if (info === undefined) {
|
|
39
|
+
const error = new Error(`Either the algorithm ${algorithm} is not available, or the key length ${key.length} is incorrect. Supported algorithm are ${crypto.getCiphers()}`);
|
|
40
|
+
error.code = 'BAD_ALGORITHM';
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
const {
|
|
44
|
+
ivLength,
|
|
45
|
+
mode
|
|
46
|
+
} = info;
|
|
47
|
+
const authTagLength = ['gcm', 'ccm', 'ocb'].includes(mode) ? 16 : 0;
|
|
28
48
|
function encryptStream(input) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
49
|
+
return pipeline(input, async function* (source) {
|
|
50
|
+
const iv = crypto.randomBytes(ivLength);
|
|
51
|
+
const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
|
|
52
|
+
yield iv;
|
|
53
|
+
for await (const data of source) {
|
|
54
|
+
yield cipher.update(data);
|
|
55
|
+
}
|
|
56
|
+
yield cipher.final();
|
|
57
|
+
if (authTagLength > 0) {
|
|
58
|
+
yield cipher.getAuthTag();
|
|
59
|
+
}
|
|
60
|
+
}, () => {});
|
|
34
61
|
}
|
|
62
|
+
function decryptStream(encryptedStream) {
|
|
63
|
+
return pipeline(encryptedStream, async function* (source) {
|
|
35
64
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
65
|
+
const iv = await readChunk(source, ivLength);
|
|
66
|
+
const cipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv);
|
|
67
|
+
let authTag = Buffer.alloc(0);
|
|
68
|
+
for await (const data of source) {
|
|
69
|
+
if (data.length >= authTagLength) {
|
|
70
|
+
yield cipher.update(authTag);
|
|
71
|
+
authTag = data.slice(data.length - authTagLength);
|
|
72
|
+
yield cipher.update(data.slice(0, data.length - authTagLength));
|
|
73
|
+
} else {
|
|
74
|
+
const fullData = Buffer.concat([authTag, data]);
|
|
75
|
+
const fullDataLength = fullData.length;
|
|
76
|
+
if (fullDataLength > authTagLength) {
|
|
77
|
+
authTag = fullData.slice(fullDataLength - authTagLength);
|
|
78
|
+
yield cipher.update(fullData.slice(0, fullDataLength - authTagLength));
|
|
79
|
+
} else {
|
|
80
|
+
authTag = fullData;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (authTagLength > 0) {
|
|
85
|
+
cipher.setAuthTag(authTag);
|
|
86
|
+
}
|
|
87
|
+
yield cipher.final();
|
|
88
|
+
}, () => {});
|
|
40
89
|
}
|
|
41
|
-
|
|
42
90
|
function encryptData(buffer) {
|
|
43
91
|
const iv = crypto.randomBytes(ivLength);
|
|
44
92
|
const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
|
|
45
93
|
const encrypted = cipher.update(buffer);
|
|
46
|
-
return Buffer.concat([iv, encrypted, cipher.final()]);
|
|
94
|
+
return Buffer.concat([iv, encrypted, cipher.final(), authTagLength > 0 ? cipher.getAuthTag() : Buffer.alloc(0)]);
|
|
47
95
|
}
|
|
48
|
-
|
|
49
96
|
function decryptData(buffer) {
|
|
50
97
|
const iv = buffer.slice(0, ivLength);
|
|
51
|
-
const encrypted = buffer.slice(ivLength);
|
|
52
98
|
const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv);
|
|
99
|
+
let encrypted;
|
|
100
|
+
if (authTagLength > 0) {
|
|
101
|
+
const authTag = buffer.slice(buffer.length - authTagLength);
|
|
102
|
+
decipher.setAuthTag(authTag);
|
|
103
|
+
encrypted = buffer.slice(ivLength, buffer.length - authTagLength);
|
|
104
|
+
} else {
|
|
105
|
+
encrypted = buffer.slice(ivLength);
|
|
106
|
+
}
|
|
53
107
|
const decrypted = decipher.update(encrypted);
|
|
54
108
|
return Buffer.concat([decrypted, decipher.final()]);
|
|
55
109
|
}
|
|
56
|
-
|
|
57
110
|
return {
|
|
58
111
|
id: algorithm,
|
|
59
112
|
algorithm,
|
|
@@ -65,6 +118,5 @@ function getEncryptor(key) {
|
|
|
65
118
|
decryptStream
|
|
66
119
|
};
|
|
67
120
|
}
|
|
68
|
-
|
|
69
121
|
exports._getEncryptor = getEncryptor;
|
|
70
122
|
//# sourceMappingURL=_encryptor.js.map
|
package/dist/_encryptor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_encryptor.js","names":["
|
|
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","exports","_getEncryptor"],"sources":["../src/_encryptor.js"],"sourcesContent":["const { pipeline } = require('node:stream')\nconst { readChunk } = require('@vates/read-chunk')\nconst crypto = require('crypto')\n\nexport const DEFAULT_ENCRYPTION_ALGORITHM = 'aes-256-gcm'\nexport const UNENCRYPTED_ALGORITHM = 'none'\n\nexport function isLegacyEncryptionAlgorithm(algorithm) {\n return algorithm !== UNENCRYPTED_ALGORITHM && algorithm !== DEFAULT_ENCRYPTION_ALGORITHM\n}\n\nfunction getEncryptor(algorithm = DEFAULT_ENCRYPTION_ALGORITHM, key) {\n if (key === undefined) {\n return {\n id: 'NULL_ENCRYPTOR',\n algorithm: 'none',\n key: 'none',\n ivLength: 0,\n encryptData: buffer => buffer,\n encryptStream: stream => stream,\n decryptData: buffer => buffer,\n decryptStream: stream => stream,\n }\n }\n const info = crypto.getCipherInfo(algorithm, { keyLength: key.length })\n if (info === undefined) {\n const error = new Error(\n `Either the algorithm ${algorithm} is not available, or the key length ${\n key.length\n } is incorrect. Supported algorithm are ${crypto.getCiphers()}`\n )\n error.code = 'BAD_ALGORITHM'\n throw error\n }\n const { ivLength, mode } = info\n const authTagLength = ['gcm', 'ccm', 'ocb'].includes(mode) ? 16 : 0\n\n function encryptStream(input) {\n return pipeline(\n input,\n async function* (source) {\n const iv = crypto.randomBytes(ivLength)\n const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv)\n yield iv\n for await (const data of source) {\n yield cipher.update(data)\n }\n yield cipher.final()\n // must write the auth tag at the end of the encryption stream\n if (authTagLength > 0) {\n yield cipher.getAuthTag()\n }\n },\n () => {}\n )\n }\n\n function decryptStream(encryptedStream) {\n return pipeline(\n encryptedStream,\n async function* (source) {\n /**\n * WARNING\n *\n * the crypted size has an initializtion vector + eventually an auth tag + a padding at the end\n * whe can't predict the decrypted size from the start of the encrypted size\n * thus, we can't set decrypted.length reliably\n *\n */\n\n const iv = await readChunk(source, ivLength)\n const cipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n let authTag = Buffer.alloc(0)\n for await (const data of source) {\n if (data.length >= authTagLength) {\n // fast path, no buffer concat\n yield cipher.update(authTag)\n authTag = data.slice(data.length - authTagLength)\n yield cipher.update(data.slice(0, data.length - authTagLength))\n } else {\n // slower since there is a concat\n const fullData = Buffer.concat([authTag, data])\n const fullDataLength = fullData.length\n if (fullDataLength > authTagLength) {\n authTag = fullData.slice(fullDataLength - authTagLength)\n yield cipher.update(fullData.slice(0, fullDataLength - authTagLength))\n } else {\n authTag = fullData\n }\n }\n }\n if (authTagLength > 0) {\n cipher.setAuthTag(authTag)\n }\n yield cipher.final()\n },\n () => {}\n )\n }\n\n function encryptData(buffer) {\n const iv = crypto.randomBytes(ivLength)\n const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv)\n const encrypted = cipher.update(buffer)\n return Buffer.concat([iv, encrypted, cipher.final(), authTagLength > 0 ? cipher.getAuthTag() : Buffer.alloc(0)])\n }\n\n function decryptData(buffer) {\n const iv = buffer.slice(0, ivLength)\n const decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv)\n let encrypted\n if (authTagLength > 0) {\n const authTag = buffer.slice(buffer.length - authTagLength)\n decipher.setAuthTag(authTag)\n encrypted = buffer.slice(ivLength, buffer.length - authTagLength)\n } else {\n encrypted = buffer.slice(ivLength)\n }\n const decrypted = decipher.update(encrypted)\n return Buffer.concat([decrypted, decipher.final()])\n }\n\n return {\n id: algorithm,\n algorithm,\n key,\n ivLength,\n encryptData,\n encryptStream,\n decryptData,\n decryptStream,\n }\n}\n\nexports._getEncryptor = getEncryptor\n"],"mappings":"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"}
|
package/dist/_guessAwsRegion.js
CHANGED
|
@@ -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":"
|
|
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,cAAc,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
|
@@ -4,23 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _execa = _interopRequireDefault(require("execa"));
|
|
9
|
-
|
|
10
8
|
var _fsExtra = _interopRequireDefault(require("fs-extra"));
|
|
11
|
-
|
|
12
9
|
var _promiseToolbox = require("promise-toolbox");
|
|
13
|
-
|
|
14
10
|
var _path = require("path");
|
|
15
|
-
|
|
16
11
|
var _os = require("os");
|
|
17
|
-
|
|
18
12
|
var _local = _interopRequireDefault(require("./local"));
|
|
19
|
-
|
|
20
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
22
14
|
const sudoExeca = (command, args, opts) => (0, _execa.default)('sudo', [command, ...args], opts);
|
|
23
|
-
|
|
24
15
|
class MountHandler extends _local.default {
|
|
25
16
|
constructor(remote, {
|
|
26
17
|
mountsDir = (0, _path.join)((0, _os.tmpdir)(), 'xo-fs-mounts'),
|
|
@@ -30,19 +21,17 @@ class MountHandler extends _local.default {
|
|
|
30
21
|
super(remote, opts);
|
|
31
22
|
this._execa = useSudo ? sudoExeca : _execa.default;
|
|
32
23
|
this._keeper = undefined;
|
|
33
|
-
this._params = {
|
|
24
|
+
this._params = {
|
|
25
|
+
...params,
|
|
34
26
|
options: [params.options, remote.options ?? params.defaultOptions].filter(_ => _ !== undefined).join(',')
|
|
35
27
|
};
|
|
36
28
|
this._realPath = (0, _path.join)(mountsDir, remote.id || Math.random().toString(36).slice(2));
|
|
37
29
|
}
|
|
38
|
-
|
|
39
30
|
async _forget() {
|
|
40
31
|
const keeper = this._keeper;
|
|
41
|
-
|
|
42
32
|
if (keeper === undefined) {
|
|
43
33
|
return;
|
|
44
34
|
}
|
|
45
|
-
|
|
46
35
|
this._keeper = undefined;
|
|
47
36
|
await _fsExtra.default.close(keeper);
|
|
48
37
|
await _promiseToolbox.ignoreErrors.call(this._execa('umount', [this._getRealPath()], {
|
|
@@ -51,26 +40,19 @@ class MountHandler extends _local.default {
|
|
|
51
40
|
}
|
|
52
41
|
}));
|
|
53
42
|
}
|
|
54
|
-
|
|
55
43
|
_getRealPath() {
|
|
56
44
|
return this._realPath;
|
|
57
45
|
}
|
|
58
|
-
|
|
59
46
|
async _sync() {
|
|
60
47
|
{
|
|
61
48
|
const keeper = this._keeper;
|
|
62
|
-
|
|
63
49
|
if (keeper !== undefined) {
|
|
64
50
|
this._keeper = undefined;
|
|
65
|
-
|
|
66
51
|
_promiseToolbox.ignoreErrors.call(_fsExtra.default.close(keeper));
|
|
67
52
|
}
|
|
68
53
|
}
|
|
69
|
-
|
|
70
54
|
const realPath = this._getRealPath();
|
|
71
|
-
|
|
72
55
|
await _fsExtra.default.ensureDir(realPath);
|
|
73
|
-
|
|
74
56
|
try {
|
|
75
57
|
const {
|
|
76
58
|
type,
|
|
@@ -78,6 +60,7 @@ class MountHandler extends _local.default {
|
|
|
78
60
|
options,
|
|
79
61
|
env
|
|
80
62
|
} = this._params;
|
|
63
|
+
|
|
81
64
|
await this._execa('mount', ['-o', options, '-t', type, device, realPath], {
|
|
82
65
|
env: {
|
|
83
66
|
LANG: 'C',
|
|
@@ -96,11 +79,8 @@ class MountHandler extends _local.default {
|
|
|
96
79
|
|
|
97
80
|
const keeperPath = `${realPath}/.keeper_${Math.random().toString(36).slice(2)}`;
|
|
98
81
|
this._keeper = await _fsExtra.default.open(keeperPath, 'w');
|
|
99
|
-
|
|
100
82
|
_promiseToolbox.ignoreErrors.call(_fsExtra.default.unlink(keeperPath));
|
|
101
83
|
}
|
|
102
|
-
|
|
103
84
|
}
|
|
104
|
-
|
|
105
85
|
exports.default = MountHandler;
|
|
106
86
|
//# sourceMappingURL=_mount.js.map
|
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","_execa","_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"],"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":"
|
|
1
|
+
{"version":3,"file":"_mount.js","names":["sudoExeca","command","args","opts","execa","MountHandler","LocalHandler","constructor","remote","mountsDir","join","tmpdir","useSudo","params","_execa","_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"],"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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"}
|