@xen-orchestra/fs 3.0.0 → 3.1.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/local.js +32 -30
- package/dist/local.js.map +1 -1
- package/dist/s3.js +8 -0
- package/dist/s3.js.map +1 -1
- package/package.json +1 -1
package/dist/local.js
CHANGED
|
@@ -9,8 +9,6 @@ var _df = _interopRequireDefault(require("@sindresorhus/df"));
|
|
|
9
9
|
|
|
10
10
|
var _fsExtra = _interopRequireDefault(require("fs-extra"));
|
|
11
11
|
|
|
12
|
-
var _identity = _interopRequireDefault(require("lodash/identity.js"));
|
|
13
|
-
|
|
14
12
|
var _properLockfile = _interopRequireDefault(require("proper-lockfile"));
|
|
15
13
|
|
|
16
14
|
var _log = require("@xen-orchestra/log");
|
|
@@ -26,21 +24,25 @@ const {
|
|
|
26
24
|
warn
|
|
27
25
|
} = (0, _log.createLogger)('xo:fs:local');
|
|
28
26
|
|
|
29
|
-
async function addSyncStackTrace(
|
|
27
|
+
async function addSyncStackTrace(fn, ...args) {
|
|
30
28
|
const stackContainer = new Error();
|
|
31
29
|
|
|
32
30
|
try {
|
|
33
|
-
return await
|
|
31
|
+
return await fn.apply(this, args);
|
|
34
32
|
} catch (error) {
|
|
35
|
-
error.
|
|
33
|
+
error.syncStack = stackContainer.stack;
|
|
36
34
|
throw error;
|
|
37
35
|
}
|
|
38
36
|
}
|
|
39
37
|
|
|
38
|
+
function dontAddSyncStackTrace(fn, ...args) {
|
|
39
|
+
return fn.apply(this, args);
|
|
40
|
+
}
|
|
41
|
+
|
|
40
42
|
class LocalHandler extends _abstract.default {
|
|
41
43
|
constructor(remote, opts = {}) {
|
|
42
44
|
super(remote);
|
|
43
|
-
this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace :
|
|
45
|
+
this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : dontAddSyncStackTrace;
|
|
44
46
|
this._retriesOnEagain = {
|
|
45
47
|
delay: 1e3,
|
|
46
48
|
retries: 9,
|
|
@@ -64,18 +66,18 @@ class LocalHandler extends _abstract.default {
|
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
async _closeFile(fd) {
|
|
67
|
-
return this._addSyncStackTrace(_fsExtra.default.close
|
|
69
|
+
return this._addSyncStackTrace(_fsExtra.default.close, fd);
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
async _copy(oldPath, newPath) {
|
|
71
|
-
return this._addSyncStackTrace(_fsExtra.default.copy
|
|
73
|
+
return this._addSyncStackTrace(_fsExtra.default.copy, this._getFilePath(oldPath), this._getFilePath(newPath));
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
async _createReadStream(file, options) {
|
|
75
77
|
if (typeof file === 'string') {
|
|
76
78
|
const stream = _fsExtra.default.createReadStream(this._getFilePath(file), options);
|
|
77
79
|
|
|
78
|
-
await this._addSyncStackTrace(
|
|
80
|
+
await this._addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
|
|
79
81
|
return stream;
|
|
80
82
|
}
|
|
81
83
|
|
|
@@ -90,7 +92,7 @@ class LocalHandler extends _abstract.default {
|
|
|
90
92
|
if (typeof file === 'string') {
|
|
91
93
|
const stream = _fsExtra.default.createWriteStream(this._getFilePath(file), options);
|
|
92
94
|
|
|
93
|
-
await this._addSyncStackTrace(
|
|
95
|
+
await this._addSyncStackTrace(_promiseToolbox.fromEvent, stream, 'open');
|
|
94
96
|
return stream;
|
|
95
97
|
}
|
|
96
98
|
|
|
@@ -112,12 +114,12 @@ class LocalHandler extends _abstract.default {
|
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
async _getSize(file) {
|
|
115
|
-
const stats = await this._addSyncStackTrace(_fsExtra.default.stat
|
|
117
|
+
const stats = await this._addSyncStackTrace(_fsExtra.default.stat, this._getFilePath(typeof file === 'string' ? file : file.path));
|
|
116
118
|
return stats.size;
|
|
117
119
|
}
|
|
118
120
|
|
|
119
121
|
async _list(dir) {
|
|
120
|
-
return this._addSyncStackTrace(_fsExtra.default.readdir
|
|
122
|
+
return this._addSyncStackTrace(_fsExtra.default.readdir, this._getFilePath(dir));
|
|
121
123
|
}
|
|
122
124
|
|
|
123
125
|
async _lock(path) {
|
|
@@ -139,10 +141,10 @@ class LocalHandler extends _abstract.default {
|
|
|
139
141
|
|
|
140
142
|
});
|
|
141
143
|
|
|
142
|
-
let release = await acquire
|
|
144
|
+
let release = await this._addSyncStackTrace(acquire);
|
|
143
145
|
return async () => {
|
|
144
146
|
try {
|
|
145
|
-
await release
|
|
147
|
+
await this._addSyncStackTrace(release);
|
|
146
148
|
} catch (error) {
|
|
147
149
|
warn('lock could not be released', {
|
|
148
150
|
error
|
|
@@ -154,24 +156,24 @@ class LocalHandler extends _abstract.default {
|
|
|
154
156
|
_mkdir(dir, {
|
|
155
157
|
mode
|
|
156
158
|
}) {
|
|
157
|
-
return this._addSyncStackTrace(_fsExtra.default.mkdir
|
|
159
|
+
return this._addSyncStackTrace(_fsExtra.default.mkdir, this._getFilePath(dir), {
|
|
158
160
|
mode
|
|
159
|
-
})
|
|
161
|
+
});
|
|
160
162
|
}
|
|
161
163
|
|
|
162
164
|
async _openFile(path, flags) {
|
|
163
|
-
return this._addSyncStackTrace(_fsExtra.default.open
|
|
165
|
+
return this._addSyncStackTrace(_fsExtra.default.open, this._getFilePath(path), flags);
|
|
164
166
|
}
|
|
165
167
|
|
|
166
168
|
async _read(file, buffer, position) {
|
|
167
169
|
const needsClose = typeof file === 'string';
|
|
168
|
-
file = needsClose ? await this._addSyncStackTrace(_fsExtra.default.open
|
|
170
|
+
file = needsClose ? await this._addSyncStackTrace(_fsExtra.default.open, this._getFilePath(file), 'r') : file.fd;
|
|
169
171
|
|
|
170
172
|
try {
|
|
171
|
-
return await this._addSyncStackTrace(_fsExtra.default.read
|
|
173
|
+
return await this._addSyncStackTrace(_fsExtra.default.read, file, buffer, 0, buffer.length, position === undefined ? null : position);
|
|
172
174
|
} finally {
|
|
173
175
|
if (needsClose) {
|
|
174
|
-
await this._addSyncStackTrace(_fsExtra.default.close
|
|
176
|
+
await this._addSyncStackTrace(_fsExtra.default.close, file);
|
|
175
177
|
}
|
|
176
178
|
}
|
|
177
179
|
}
|
|
@@ -179,44 +181,44 @@ class LocalHandler extends _abstract.default {
|
|
|
179
181
|
async _readFile(file, options) {
|
|
180
182
|
const filePath = this._getFilePath(file);
|
|
181
183
|
|
|
182
|
-
return await this._addSyncStackTrace(
|
|
184
|
+
return await this._addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.readFile(filePath, options), this._retriesOnEagain);
|
|
183
185
|
}
|
|
184
186
|
|
|
185
187
|
async _rename(oldPath, newPath) {
|
|
186
|
-
return this._addSyncStackTrace(_fsExtra.default.rename
|
|
188
|
+
return this._addSyncStackTrace(_fsExtra.default.rename, this._getFilePath(oldPath), this._getFilePath(newPath));
|
|
187
189
|
}
|
|
188
190
|
|
|
189
191
|
async _rmdir(dir) {
|
|
190
|
-
return this._addSyncStackTrace(_fsExtra.default.rmdir
|
|
192
|
+
return this._addSyncStackTrace(_fsExtra.default.rmdir, this._getFilePath(dir));
|
|
191
193
|
}
|
|
192
194
|
|
|
193
195
|
async _sync() {
|
|
194
196
|
const path = this._getRealPath('/');
|
|
195
197
|
|
|
196
|
-
await this._addSyncStackTrace(_fsExtra.default.ensureDir
|
|
197
|
-
await this._addSyncStackTrace(_fsExtra.default.access
|
|
198
|
+
await this._addSyncStackTrace(_fsExtra.default.ensureDir, path);
|
|
199
|
+
await this._addSyncStackTrace(_fsExtra.default.access, path, _fsExtra.default.R_OK | _fsExtra.default.W_OK);
|
|
198
200
|
}
|
|
199
201
|
|
|
200
202
|
_truncate(file, len) {
|
|
201
|
-
return this._addSyncStackTrace(_fsExtra.default.truncate
|
|
203
|
+
return this._addSyncStackTrace(_fsExtra.default.truncate, this._getFilePath(file), len);
|
|
202
204
|
}
|
|
203
205
|
|
|
204
206
|
async _unlink(file) {
|
|
205
207
|
const filePath = this._getFilePath(file);
|
|
206
208
|
|
|
207
|
-
return await this._addSyncStackTrace(
|
|
209
|
+
return await this._addSyncStackTrace(_promiseToolbox.retry, () => _fsExtra.default.unlink(filePath), this._retriesOnEagain);
|
|
208
210
|
}
|
|
209
211
|
|
|
210
212
|
_writeFd(file, buffer, position) {
|
|
211
|
-
return this._addSyncStackTrace(_fsExtra.default.write
|
|
213
|
+
return this._addSyncStackTrace(_fsExtra.default.write, file.fd, buffer, 0, buffer.length, position);
|
|
212
214
|
}
|
|
213
215
|
|
|
214
216
|
_writeFile(file, data, {
|
|
215
217
|
flags
|
|
216
218
|
}) {
|
|
217
|
-
return this._addSyncStackTrace(_fsExtra.default.writeFile
|
|
219
|
+
return this._addSyncStackTrace(_fsExtra.default.writeFile, this._getFilePath(file), data, {
|
|
218
220
|
flag: flags
|
|
219
|
-
})
|
|
221
|
+
});
|
|
220
222
|
}
|
|
221
223
|
|
|
222
224
|
}
|
package/dist/local.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","names":["info","warn","createLogger","addSyncStackTrace","promise","stackContainer","Error","error","stack","LocalHandler","RemoteHandlerAbstract","constructor","remote","opts","_addSyncStackTrace","syncStackTraces","identity","_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 identity from 'lodash/identity.js'\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(promise) {\n const stackContainer = new Error()\n try {\n return await promise\n } catch (error) {\n error.stack = stackContainer.stack\n throw error\n }\n}\n\nexport default class LocalHandler extends RemoteHandlerAbstract {\n constructor(remote, opts = {}) {\n super(remote)\n\n this._addSyncStackTrace = opts.syncStackTraces ?? true ? addSyncStackTrace : identity\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 acquire()\n\n return async () => {\n try {\n await 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(file, buffer, 0, buffer.length, 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":["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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"}
|
package/dist/s3.js
CHANGED
|
@@ -189,6 +189,14 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
189
189
|
return this._multipartCopy(oldPath, newPath);
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
+
if (e.name === 'NoSuchKey') {
|
|
193
|
+
const error = new Error(`ENOENT: no such file or directory '${oldPath}'`);
|
|
194
|
+
error.cause = e;
|
|
195
|
+
error.code = 'ENOENT';
|
|
196
|
+
error.path = oldPath;
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
|
|
192
200
|
throw e;
|
|
193
201
|
}
|
|
194
202
|
}
|
package/dist/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","names":["MIN_PART_SIZE","MAX_PART_SIZE","MAX_PARTS_COUNT","MAX_OBJECT_SIZE","IDEAL_FRAGMENT_SIZE","Math","ceil","warn","createLogger","S3Handler","decorateWith","pRetry","wrap","delays","when","e","$metadata","httpStatusCode","onRetry","error","attemptNumber","delay","file","arguments","RemoteHandlerAbstract","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","_s3","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","_bucket","shift","_dir","join","type","_makeCopySource","_makeKey","_makePrefix","dir","prefix","_createParams","Bucket","Key","_multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","_isNotEmptyDir","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","_isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","queueSize","partSize","params","done","undefined","call","unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","Error","code","_unlink","DeleteObjectCommand","_list","NextContinuationToken","uniq","Set","Delimiter","ContinuationToken","IsTruncated","entry","CommonPrefixes","add","basename","_mkdir","_rename","copy","fd","ContentLength","_read","buffer","position","Range","bytesRead","copyStreamToBuffer","_rmdir","_rmtree","asyncEach","concurrency","_write","uploadParams","fileSize","resultBuffer","Buffer","alloc","max","bytesWritten","copyMultipartParams","prefixSize","suffixOffset","suffixSize","hasSuffix","editBuffer","editBufferOffset","prefixPosition","fragmentsCount","floor","prefixFragmentSize","prefixLastFragmentSize","i","fragmentEnd","assert","strictEqual","range","copyPrefixParams","part","downloadParams","prefixBuffer","createBufferFromStream","concat","complementSize","complementOffset","prefixRange","complementBuffer","editParams","editPart","UploadPartCommand","suffixFragments","suffixFragmentOffset","suffixRange","copySuffixParams","suffixPart","_openFile","flags","_closeFile","useVhdDirectory"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n UploadPartCommand,\n UploadPartCopyCommand,\n} from '@aws-sdk/client-s3'\nimport { Upload } from '@aws-sdk/lib-storage'\nimport { NodeHttpHandler } from '@aws-sdk/node-http-handler'\nimport { getApplyMd5BodyChecksumPlugin } from '@aws-sdk/middleware-apply-body-checksum'\nimport assert from 'assert'\nimport { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport pRetry from 'promise-toolbox/retry'\nimport { createLogger } from '@xen-orchestra/log'\nimport { decorateWith } from '@vates/decorate-with'\nimport { PassThrough, pipeline } from 'stream'\nimport { parse } from 'xo-remote-parser'\nimport copyStreamToBuffer from './_copyStreamToBuffer.js'\nimport createBufferFromStream from './_createBufferFromStream.js'\nimport guessAwsRegion from './_guessAwsRegion.js'\nimport RemoteHandlerAbstract from './abstract'\nimport { basename, join, split } from './path'\nimport { asyncEach } from '@vates/async-each'\n\n// endpoints https://docs.aws.amazon.com/general/latest/gr/s3.html\n\n// limits: https://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html\nconst MIN_PART_SIZE = 1024 * 1024 * 5 // 5MB\nconst MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst MAX_PARTS_COUNT = 10000\nconst MAX_OBJECT_SIZE = 1024 * 1024 * 1024 * 1024 * 5 // 5TB\nconst IDEAL_FRAGMENT_SIZE = Math.ceil(MAX_OBJECT_SIZE / MAX_PARTS_COUNT) // the smallest fragment size that still allows a 5TB upload in 10000 fragments, about 524MB\n\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n constructor(remote, _opts) {\n super(remote)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n } = parse(remote.url)\n\n this._s3 = new S3Client({\n apiVersion: '2006-03-01',\n endpoint: `${protocol}://${host}`,\n forcePathStyle: true,\n credentials: {\n accessKeyId: username,\n secretAccessKey: password,\n },\n tls: protocol === 'https',\n region,\n requestHandler: new NodeHttpHandler({\n socketTimeout: 600000,\n httpAgent: new HttpAgent({\n keepAlive: true,\n }),\n httpsAgent: new HttpsAgent({\n rejectUnauthorized: !allowUnauthorized,\n keepAlive: true,\n }),\n }),\n })\n\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n this._s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this._s3.config))\n\n const parts = split(path)\n this._bucket = parts.shift()\n this._dir = join(...parts)\n }\n\n get type() {\n return 's3'\n }\n\n _makeCopySource(path) {\n return join(this._bucket, this._dir, path)\n }\n\n _makeKey(file) {\n return join(this._dir, file)\n }\n\n _makePrefix(dir) {\n const prefix = join(this._dir, dir, '/')\n\n // no prefix for root\n if (prefix !== './') {\n return prefix\n }\n }\n\n _createParams(file) {\n return { Bucket: this._bucket, Key: this._makeKey(file) }\n }\n\n async _multipartCopy(oldPath, newPath) {\n const size = await this._getSize(oldPath)\n const CopySource = this._makeCopySource(oldPath)\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand({ ...this._createParams(newPath) }))\n try {\n const parts = []\n let start = 0\n while (start < size) {\n const partNumber = parts.length + 1\n const upload = await this._s3.send(\n new UploadPartCopyCommand({\n ...multipartParams,\n CopySource,\n CopySourceRange: `bytes=${start}-${Math.min(start + MAX_PART_SIZE, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += MAX_PART_SIZE\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n\n async _copy(oldPath, newPath) {\n const CopySource = this._makeCopySource(oldPath)\n try {\n await this._s3.send(\n new CopyObjectCommand({\n ...this._createParams(newPath),\n CopySource,\n })\n )\n } catch (e) {\n // object > 5GB must be copied part by part\n if (e.name === 'EntityTooLarge') {\n return this._multipartCopy(oldPath, newPath)\n }\n throw e\n }\n }\n\n async _isNotEmptyDir(path) {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n MaxKeys: 1,\n Prefix: this._makePrefix(path),\n })\n )\n return result.Contents?.length > 0\n }\n\n async _isFile(path) {\n try {\n await this._s3.send(new HeadObjectCommand(this._createParams(path)))\n return true\n } catch (error) {\n if (error.name === 'NotFound') {\n return false\n }\n throw error\n }\n }\n\n async _outputStream(path, input, { validator }) {\n // Workaround for \"ReferenceError: ReadableStream is not defined\"\n // https://github.com/aws/aws-sdk-js-v3/issues/2522\n const Body = new PassThrough()\n pipeline(input, Body, () => {})\n\n const upload = new Upload({\n client: this._s3,\n queueSize: 1,\n partSize: IDEAL_FRAGMENT_SIZE,\n params: {\n ...this._createParams(path),\n Body,\n },\n })\n\n await upload.done()\n\n if (validator !== undefined) {\n try {\n await validator.call(this, path)\n } catch (error) {\n await this.unlink(path)\n throw error\n }\n }\n }\n\n // some objectstorage provider like backblaze, can answer a 500/503 routinely\n // in this case we should retry, and let their load balancing do its magic\n // https://www.backblaze.com/b2/docs/calling.html#error_handling\n @decorateWith(pRetry.wrap, {\n delays: [100, 200, 500, 1000, 2000],\n when: e => e.$metadata?.httpStatusCode === 500,\n onRetry(error) {\n warn('retrying writing file', {\n attemptNumber: this.attemptNumber,\n delay: this.delay,\n error,\n file: this.arguments[0],\n })\n },\n })\n async _writeFile(file, data, options) {\n return this._s3.send(\n new PutObjectCommand({\n ...this._createParams(file),\n Body: data,\n })\n )\n }\n\n async _createReadStream(path, options) {\n try {\n return (await this._s3.send(new GetObjectCommand(this._createParams(path)))).Body\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file '${path}'`)\n error.code = 'ENOENT'\n error.path = path\n throw error\n }\n throw e\n }\n }\n\n async _unlink(path) {\n await this._s3.send(new DeleteObjectCommand(this._createParams(path)))\n\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`EISDIR: illegal operation on a directory, unlink '${path}'`)\n error.code = 'EISDIR'\n error.path = path\n throw error\n }\n }\n\n async _list(dir) {\n let NextContinuationToken\n const uniq = new Set()\n const Prefix = this._makePrefix(dir)\n\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n Delimiter: '/',\n // will only return path until delimiters\n ContinuationToken: NextContinuationToken,\n })\n )\n\n if (result.IsTruncated) {\n warn(`need pagination to browse the directory ${dir} completely`)\n NextContinuationToken = result.NextContinuationToken\n } else {\n NextContinuationToken = undefined\n }\n\n // subdirectories\n for (const entry of result.CommonPrefixes ?? []) {\n uniq.add(basename(entry.Prefix))\n }\n\n // files\n for (const entry of result.Contents ?? []) {\n uniq.add(basename(entry.Key))\n }\n } while (NextContinuationToken !== undefined)\n\n return [...uniq]\n }\n\n async _mkdir(path) {\n if (await this._isFile(path)) {\n const error = new Error(`ENOTDIR: file already exists, mkdir '${path}'`)\n error.code = 'ENOTDIR'\n error.path = path\n throw error\n }\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // s3 doesn't have a rename operation, so copy + delete source\n async _rename(oldPath, newPath) {\n await this.copy(oldPath, newPath)\n await this._s3.send(new DeleteObjectCommand(this._createParams(oldPath)))\n }\n\n async _getSize(file) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const result = await this._s3.send(new HeadObjectCommand(this._createParams(file)))\n return +result.ContentLength\n }\n\n async _read(file, buffer, position = 0) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const params = this._createParams(file)\n params.Range = `bytes=${position}-${position + buffer.length - 1}`\n try {\n const result = await this._s3.send(new GetObjectCommand(params))\n const bytesRead = await copyStreamToBuffer(result.Body, buffer)\n return { bytesRead, buffer }\n } catch (e) {\n if (e.name === 'NoSuchKey') {\n if (await this._isNotEmptyDir(file)) {\n const error = new Error(`${file} is a directory`)\n error.code = 'EISDIR'\n error.path = file\n throw error\n }\n }\n throw e\n }\n }\n\n async _rmdir(path) {\n if (await this._isNotEmptyDir(path)) {\n const error = new Error(`ENOTEMPTY: directory not empty, rmdir '${path}`)\n error.code = 'ENOTEMPTY'\n error.path = path\n throw error\n }\n\n // nothing to do, directories do not exist, they are part of the files' path\n }\n\n // reimplement _rmtree to handle efficiantly path with more than 1000 entries in trees\n // @todo : use parallel processing for unlink\n async _rmtree(path) {\n let NextContinuationToken\n const Prefix = this._makePrefix(path)\n do {\n const result = await this._s3.send(\n new ListObjectsV2Command({\n Bucket: this._bucket,\n Prefix,\n ContinuationToken: NextContinuationToken,\n })\n )\n\n NextContinuationToken = result.IsTruncated ? result.NextContinuationToken : undefined\n await asyncEach(\n result.Contents ?? [],\n async ({ Key }) => {\n // _unlink will add the prefix, but Key contains everything\n // also we don't need to check if we delete a directory, since the list only return files\n await this._s3.send(\n new DeleteObjectCommand({\n Bucket: this._bucket,\n Key,\n })\n )\n },\n {\n concurrency: 16,\n }\n )\n } while (NextContinuationToken !== undefined)\n }\n\n async _write(file, buffer, position) {\n if (typeof file !== 'string') {\n file = file.fd\n }\n const uploadParams = this._createParams(file)\n let fileSize\n try {\n fileSize = +(await this._s3.send(new HeadObjectCommand(uploadParams))).ContentLength\n } catch (e) {\n if (e.name === 'NotFound') {\n fileSize = 0\n } else {\n throw e\n }\n }\n if (fileSize < MIN_PART_SIZE) {\n const resultBuffer = Buffer.alloc(Math.max(fileSize, position + buffer.length))\n if (fileSize !== 0) {\n const result = await this._s3.send(new GetObjectCommand(uploadParams))\n await copyStreamToBuffer(result.Body, resultBuffer)\n } else {\n Buffer.alloc(0).copy(resultBuffer)\n }\n buffer.copy(resultBuffer, position)\n await this._s3.send(\n new PutObjectCommand({\n ...uploadParams,\n Body: resultBuffer,\n })\n )\n return { buffer, bytesWritten: buffer.length }\n } else {\n // using this trick: https://stackoverflow.com/a/38089437/72637\n // multipart fragments have a minimum size of 5Mo and a max of 5Go unless they are last\n // splitting the file in 3 parts: [prefix, edit, suffix]\n // if `prefix` is bigger than 5Mo, it will be sourced from uploadPartCopy()\n // otherwise otherwise it will be downloaded, concatenated to `edit`\n // `edit` will always be an upload part\n // `suffix` will always be sourced from uploadPartCopy()\n // Then everything will be sliced in 5Gb parts before getting uploaded\n const multipartParams = await this._s3.send(new CreateMultipartUploadCommand(uploadParams))\n const copyMultipartParams = {\n ...multipartParams,\n CopySource: this._makeCopySource(file),\n }\n try {\n const parts = []\n const prefixSize = position\n let suffixOffset = prefixSize + buffer.length\n let suffixSize = Math.max(0, fileSize - suffixOffset)\n let hasSuffix = suffixSize > 0\n let editBuffer = buffer\n let editBufferOffset = position\n let partNumber = 1\n let prefixPosition = 0\n // use floor() so that last fragment is handled in the if bellow\n let fragmentsCount = Math.floor(prefixSize / MAX_PART_SIZE)\n const prefixFragmentSize = MAX_PART_SIZE\n let prefixLastFragmentSize = prefixSize - prefixFragmentSize * fragmentsCount\n if (prefixLastFragmentSize >= MIN_PART_SIZE) {\n // the last fragment of the prefix is smaller than MAX_PART_SIZE, but bigger than the minimum\n // so we can copy it too\n fragmentsCount++\n prefixLastFragmentSize = 0\n }\n for (let i = 0; i < fragmentsCount; i++) {\n const fragmentEnd = Math.min(prefixPosition + prefixFragmentSize, prefixSize)\n assert.strictEqual(fragmentEnd - prefixPosition <= MAX_PART_SIZE, true)\n const range = `bytes=${prefixPosition}-${fragmentEnd - 1}`\n const copyPrefixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: range }\n const part = await this._s3.send(new UploadPartCopyCommand(copyPrefixParams))\n parts.push({ ETag: part.CopyPartResult.ETag, PartNumber: copyPrefixParams.PartNumber })\n prefixPosition += prefixFragmentSize\n }\n if (prefixLastFragmentSize) {\n // grab everything from the prefix that was too small to be copied, download and merge to the edit buffer.\n const downloadParams = { ...uploadParams, Range: `bytes=${prefixPosition}-${prefixSize - 1}` }\n let prefixBuffer\n if (prefixSize > 0) {\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n prefixBuffer = await createBufferFromStream(result.Body)\n } else {\n prefixBuffer = Buffer.alloc(0)\n }\n editBuffer = Buffer.concat([prefixBuffer, buffer])\n editBufferOffset -= prefixLastFragmentSize\n }\n if (hasSuffix && editBuffer.length < MIN_PART_SIZE) {\n // the edit fragment is too short and is not the last fragment\n // let's steal from the suffix fragment to reach the minimum size\n // the suffix might be too short and itself entirely absorbed in the edit fragment, making it the last one.\n const complementSize = Math.min(MIN_PART_SIZE - editBuffer.length, suffixSize)\n const complementOffset = editBufferOffset + editBuffer.length\n suffixOffset += complementSize\n suffixSize -= complementSize\n hasSuffix = suffixSize > 0\n const prefixRange = `bytes=${complementOffset}-${complementOffset + complementSize - 1}`\n const downloadParams = { ...uploadParams, Range: prefixRange }\n const result = await this._s3.send(new GetObjectCommand(downloadParams))\n const complementBuffer = await createBufferFromStream(result.Body)\n editBuffer = Buffer.concat([editBuffer, complementBuffer])\n }\n const editParams = { ...multipartParams, Body: editBuffer, PartNumber: partNumber++ }\n const editPart = await this._s3.send(new UploadPartCommand(editParams))\n parts.push({ ETag: editPart.ETag, PartNumber: editParams.PartNumber })\n if (hasSuffix) {\n // use ceil because the last fragment can be arbitrarily small.\n const suffixFragments = Math.ceil(suffixSize / MAX_PART_SIZE)\n let suffixFragmentOffset = suffixOffset\n for (let i = 0; i < suffixFragments; i++) {\n const fragmentEnd = suffixFragmentOffset + MAX_PART_SIZE\n assert.strictEqual(Math.min(fileSize, fragmentEnd) - suffixFragmentOffset <= MAX_PART_SIZE, true)\n const suffixRange = `bytes=${suffixFragmentOffset}-${Math.min(fileSize, fragmentEnd) - 1}`\n const copySuffixParams = { ...copyMultipartParams, PartNumber: partNumber++, CopySourceRange: suffixRange }\n const suffixPart = (await this._s3.send(new UploadPartCopyCommand(copySuffixParams))).CopyPartResult\n parts.push({ ETag: suffixPart.ETag, PartNumber: copySuffixParams.PartNumber })\n suffixFragmentOffset = fragmentEnd\n }\n }\n await this._s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this._s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n }\n\n async _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n useVhdDirectory() {\n return true\n }\n}\n"],"mappings":"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"}
|
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"private": false,
|
|
3
3
|
"name": "@xen-orchestra/fs",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.1.0",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"description": "The File System for Xen Orchestra backups.",
|
|
7
7
|
"homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/@xen-orchestra/fs",
|