@xen-orchestra/fs 3.3.4 → 4.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.
- package/dist/_encryptor.js.map +1 -1
- package/dist/_mount.js +19 -16
- package/dist/_mount.js.map +1 -1
- package/dist/abstract.js +45 -46
- package/dist/abstract.js.map +1 -1
- package/dist/checksum.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/local.js +36 -34
- package/dist/local.js.map +1 -1
- package/dist/path.js.map +1 -1
- package/dist/s3.js +57 -54
- package/dist/s3.js.map +1 -1
- package/package.json +8 -4
package/dist/s3.js
CHANGED
|
@@ -42,6 +42,9 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
}), (_class = class S3Handler extends _abstract.default {
|
|
45
|
+
#bucket;
|
|
46
|
+
#dir;
|
|
47
|
+
#s3;
|
|
45
48
|
constructor(remote, _opts) {
|
|
46
49
|
super(remote);
|
|
47
50
|
const {
|
|
@@ -53,7 +56,7 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
53
56
|
protocol,
|
|
54
57
|
region = (0, _guessAwsRegion.default)(host)
|
|
55
58
|
} = (0, _xoRemoteParser.parse)(remote.url);
|
|
56
|
-
this
|
|
59
|
+
this.#s3 = new _clientS.S3Client({
|
|
57
60
|
apiVersion: '2006-03-01',
|
|
58
61
|
endpoint: `${protocol}://${host}`,
|
|
59
62
|
forcePathStyle: true,
|
|
@@ -74,44 +77,44 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
74
77
|
})
|
|
75
78
|
})
|
|
76
79
|
});
|
|
77
|
-
this.
|
|
80
|
+
this.#s3.middlewareStack.use((0, _middlewareApplyBodyChecksum.getApplyMd5BodyChecksumPlugin)(this.#s3.config));
|
|
78
81
|
const parts = (0, _path.split)(path);
|
|
79
|
-
this
|
|
80
|
-
this
|
|
82
|
+
this.#bucket = parts.shift();
|
|
83
|
+
this.#dir = (0, _path.join)(...parts);
|
|
81
84
|
}
|
|
82
85
|
get type() {
|
|
83
86
|
return 's3';
|
|
84
87
|
}
|
|
85
|
-
|
|
86
|
-
return (0, _path.join)(this
|
|
88
|
+
#makeCopySource(path) {
|
|
89
|
+
return (0, _path.join)(this.#bucket, this.#dir, path);
|
|
87
90
|
}
|
|
88
|
-
|
|
89
|
-
return (0, _path.join)(this
|
|
91
|
+
#makeKey(file) {
|
|
92
|
+
return (0, _path.join)(this.#dir, file);
|
|
90
93
|
}
|
|
91
|
-
|
|
92
|
-
const prefix = (0, _path.join)(this
|
|
94
|
+
#makePrefix(dir) {
|
|
95
|
+
const prefix = (0, _path.join)(this.#dir, dir, '/');
|
|
93
96
|
if (prefix !== './') {
|
|
94
97
|
return prefix;
|
|
95
98
|
}
|
|
96
99
|
}
|
|
97
|
-
|
|
100
|
+
#createParams(file) {
|
|
98
101
|
return {
|
|
99
|
-
Bucket: this
|
|
100
|
-
Key: this
|
|
102
|
+
Bucket: this.#bucket,
|
|
103
|
+
Key: this.#makeKey(file)
|
|
101
104
|
};
|
|
102
105
|
}
|
|
103
|
-
async
|
|
106
|
+
async #multipartCopy(oldPath, newPath) {
|
|
104
107
|
const size = await this._getSize(oldPath);
|
|
105
|
-
const CopySource = this
|
|
106
|
-
const multipartParams = await this.
|
|
107
|
-
...this
|
|
108
|
+
const CopySource = this.#makeCopySource(oldPath);
|
|
109
|
+
const multipartParams = await this.#s3.send(new _clientS.CreateMultipartUploadCommand({
|
|
110
|
+
...this.#createParams(newPath)
|
|
108
111
|
}));
|
|
109
112
|
try {
|
|
110
113
|
const parts = [];
|
|
111
114
|
let start = 0;
|
|
112
115
|
while (start < size) {
|
|
113
116
|
const partNumber = parts.length + 1;
|
|
114
|
-
const upload = await this.
|
|
117
|
+
const upload = await this.#s3.send(new _clientS.UploadPartCopyCommand({
|
|
115
118
|
...multipartParams,
|
|
116
119
|
CopySource,
|
|
117
120
|
CopySourceRange: `bytes=${start}-${Math.min(start + MAX_PART_SIZE, size) - 1}`,
|
|
@@ -123,27 +126,27 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
123
126
|
});
|
|
124
127
|
start += MAX_PART_SIZE;
|
|
125
128
|
}
|
|
126
|
-
await this.
|
|
129
|
+
await this.#s3.send(new _clientS.CompleteMultipartUploadCommand({
|
|
127
130
|
...multipartParams,
|
|
128
131
|
MultipartUpload: {
|
|
129
132
|
Parts: parts
|
|
130
133
|
}
|
|
131
134
|
}));
|
|
132
135
|
} catch (e) {
|
|
133
|
-
await this.
|
|
136
|
+
await this.#s3.send(new _clientS.AbortMultipartUploadCommand(multipartParams));
|
|
134
137
|
throw e;
|
|
135
138
|
}
|
|
136
139
|
}
|
|
137
140
|
async _copy(oldPath, newPath) {
|
|
138
|
-
const CopySource = this
|
|
141
|
+
const CopySource = this.#makeCopySource(oldPath);
|
|
139
142
|
try {
|
|
140
|
-
await this.
|
|
141
|
-
...this
|
|
143
|
+
await this.#s3.send(new _clientS.CopyObjectCommand({
|
|
144
|
+
...this.#createParams(newPath),
|
|
142
145
|
CopySource
|
|
143
146
|
}));
|
|
144
147
|
} catch (e) {
|
|
145
148
|
if (e.name === 'EntityTooLarge') {
|
|
146
|
-
return this
|
|
149
|
+
return this.#multipartCopy(oldPath, newPath);
|
|
147
150
|
}
|
|
148
151
|
if (e.name === 'NoSuchKey') {
|
|
149
152
|
const error = new Error(`ENOENT: no such file or directory '${oldPath}'`);
|
|
@@ -155,18 +158,18 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
155
158
|
throw e;
|
|
156
159
|
}
|
|
157
160
|
}
|
|
158
|
-
async
|
|
161
|
+
async #isNotEmptyDir(path) {
|
|
159
162
|
var _result$Contents;
|
|
160
|
-
const result = await this.
|
|
161
|
-
Bucket: this
|
|
163
|
+
const result = await this.#s3.send(new _clientS.ListObjectsV2Command({
|
|
164
|
+
Bucket: this.#bucket,
|
|
162
165
|
MaxKeys: 1,
|
|
163
|
-
Prefix: this
|
|
166
|
+
Prefix: this.#makePrefix(path)
|
|
164
167
|
}));
|
|
165
168
|
return ((_result$Contents = result.Contents) === null || _result$Contents === void 0 ? void 0 : _result$Contents.length) > 0;
|
|
166
169
|
}
|
|
167
|
-
async
|
|
170
|
+
async #isFile(path) {
|
|
168
171
|
try {
|
|
169
|
-
await this.
|
|
172
|
+
await this.#s3.send(new _clientS.HeadObjectCommand(this.#createParams(path)));
|
|
170
173
|
return true;
|
|
171
174
|
} catch (error) {
|
|
172
175
|
if (error.name === 'NotFound') {
|
|
@@ -181,9 +184,9 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
181
184
|
const Body = new _stream.PassThrough();
|
|
182
185
|
(0, _stream.pipeline)(input, Body, () => {});
|
|
183
186
|
const upload = new _libStorage.Upload({
|
|
184
|
-
client: this
|
|
187
|
+
client: this.#s3,
|
|
185
188
|
params: {
|
|
186
|
-
...this
|
|
189
|
+
...this.#createParams(path),
|
|
187
190
|
Body
|
|
188
191
|
}
|
|
189
192
|
});
|
|
@@ -192,20 +195,20 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
192
195
|
try {
|
|
193
196
|
await validator.call(this, path);
|
|
194
197
|
} catch (error) {
|
|
195
|
-
await this.
|
|
198
|
+
await this.__unlink(path);
|
|
196
199
|
throw error;
|
|
197
200
|
}
|
|
198
201
|
}
|
|
199
202
|
}
|
|
200
203
|
async _writeFile(file, data, options) {
|
|
201
|
-
return this.
|
|
202
|
-
...this
|
|
204
|
+
return this.#s3.send(new _clientS.PutObjectCommand({
|
|
205
|
+
...this.#createParams(file),
|
|
203
206
|
Body: data
|
|
204
207
|
}));
|
|
205
208
|
}
|
|
206
209
|
async _createReadStream(path, options) {
|
|
207
210
|
try {
|
|
208
|
-
return (await this.
|
|
211
|
+
return (await this.#s3.send(new _clientS.GetObjectCommand(this.#createParams(path)))).Body;
|
|
209
212
|
} catch (e) {
|
|
210
213
|
if (e.name === 'NoSuchKey') {
|
|
211
214
|
const error = new Error(`ENOENT: no such file '${path}'`);
|
|
@@ -217,8 +220,8 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
217
220
|
}
|
|
218
221
|
}
|
|
219
222
|
async _unlink(path) {
|
|
220
|
-
await this.
|
|
221
|
-
if (await this
|
|
223
|
+
await this.#s3.send(new _clientS.DeleteObjectCommand(this.#createParams(path)));
|
|
224
|
+
if (await this.#isNotEmptyDir(path)) {
|
|
222
225
|
const error = new Error(`EISDIR: illegal operation on a directory, unlink '${path}'`);
|
|
223
226
|
error.code = 'EISDIR';
|
|
224
227
|
error.path = path;
|
|
@@ -228,10 +231,10 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
228
231
|
async _list(dir) {
|
|
229
232
|
let NextContinuationToken;
|
|
230
233
|
const uniq = new Set();
|
|
231
|
-
const Prefix = this
|
|
234
|
+
const Prefix = this.#makePrefix(dir);
|
|
232
235
|
do {
|
|
233
|
-
const result = await this.
|
|
234
|
-
Bucket: this
|
|
236
|
+
const result = await this.#s3.send(new _clientS.ListObjectsV2Command({
|
|
237
|
+
Bucket: this.#bucket,
|
|
235
238
|
Prefix,
|
|
236
239
|
Delimiter: '/',
|
|
237
240
|
ContinuationToken: NextContinuationToken
|
|
@@ -252,7 +255,7 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
252
255
|
return [...uniq];
|
|
253
256
|
}
|
|
254
257
|
async _mkdir(path) {
|
|
255
|
-
if (await this
|
|
258
|
+
if (await this.#isFile(path)) {
|
|
256
259
|
const error = new Error(`ENOTDIR: file already exists, mkdir '${path}'`);
|
|
257
260
|
error.code = 'ENOTDIR';
|
|
258
261
|
error.path = path;
|
|
@@ -260,24 +263,24 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
260
263
|
}
|
|
261
264
|
}
|
|
262
265
|
async _rename(oldPath, newPath) {
|
|
263
|
-
await this.
|
|
264
|
-
await this.
|
|
266
|
+
await this.__copy(oldPath, newPath);
|
|
267
|
+
await this.#s3.send(new _clientS.DeleteObjectCommand(this.#createParams(oldPath)));
|
|
265
268
|
}
|
|
266
269
|
async _getSize(file) {
|
|
267
270
|
if (typeof file !== 'string') {
|
|
268
271
|
file = file.fd;
|
|
269
272
|
}
|
|
270
|
-
const result = await this.
|
|
273
|
+
const result = await this.#s3.send(new _clientS.HeadObjectCommand(this.#createParams(file)));
|
|
271
274
|
return +result.ContentLength;
|
|
272
275
|
}
|
|
273
276
|
async _read(file, buffer, position = 0) {
|
|
274
277
|
if (typeof file !== 'string') {
|
|
275
278
|
file = file.fd;
|
|
276
279
|
}
|
|
277
|
-
const params = this
|
|
280
|
+
const params = this.#createParams(file);
|
|
278
281
|
params.Range = `bytes=${position}-${position + buffer.length - 1}`;
|
|
279
282
|
try {
|
|
280
|
-
const result = await this.
|
|
283
|
+
const result = await this.#s3.send(new _clientS.GetObjectCommand(params));
|
|
281
284
|
const bytesRead = await (0, _copyStreamToBuffer.default)(result.Body, buffer);
|
|
282
285
|
return {
|
|
283
286
|
bytesRead,
|
|
@@ -285,7 +288,7 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
285
288
|
};
|
|
286
289
|
} catch (e) {
|
|
287
290
|
if (e.name === 'NoSuchKey') {
|
|
288
|
-
if (await this
|
|
291
|
+
if (await this.#isNotEmptyDir(file)) {
|
|
289
292
|
const error = new Error(`${file} is a directory`);
|
|
290
293
|
error.code = 'EISDIR';
|
|
291
294
|
error.path = file;
|
|
@@ -296,7 +299,7 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
296
299
|
}
|
|
297
300
|
}
|
|
298
301
|
async _rmdir(path) {
|
|
299
|
-
if (await this
|
|
302
|
+
if (await this.#isNotEmptyDir(path)) {
|
|
300
303
|
const error = new Error(`ENOTEMPTY: directory not empty, rmdir '${path}`);
|
|
301
304
|
error.code = 'ENOTEMPTY';
|
|
302
305
|
error.path = path;
|
|
@@ -305,10 +308,10 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
305
308
|
}
|
|
306
309
|
async _rmtree(path) {
|
|
307
310
|
let NextContinuationToken;
|
|
308
|
-
const Prefix = this
|
|
311
|
+
const Prefix = this.#makePrefix(path);
|
|
309
312
|
do {
|
|
310
|
-
const result = await this.
|
|
311
|
-
Bucket: this
|
|
313
|
+
const result = await this.#s3.send(new _clientS.ListObjectsV2Command({
|
|
314
|
+
Bucket: this.#bucket,
|
|
312
315
|
Prefix,
|
|
313
316
|
ContinuationToken: NextContinuationToken
|
|
314
317
|
}));
|
|
@@ -316,8 +319,8 @@ let S3Handler = (_dec = (0, _decorateWith.decorateWith)(_retry.default.wrap, {
|
|
|
316
319
|
await (0, _asyncEach.asyncEach)(result.Contents ?? [], async ({
|
|
317
320
|
Key
|
|
318
321
|
}) => {
|
|
319
|
-
await this.
|
|
320
|
-
Bucket: this
|
|
322
|
+
await this.#s3.send(new _clientS.DeleteObjectCommand({
|
|
323
|
+
Bucket: this.#bucket,
|
|
321
324
|
Key
|
|
322
325
|
}));
|
|
323
326
|
}, {
|
package/dist/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","names":["_clientS","require","_libStorage","_nodeHttpHandler","_middlewareApplyBodyChecksum","_http","_https","_retry","_interopRequireDefault","_log","_decorateWith","_stream","_xoRemoteParser","_copyStreamToBuffer","_guessAwsRegion","_abstract","_path","_asyncEach","_dec","_class","obj","__esModule","default","_applyDecoratedDescriptor","target","property","decorators","descriptor","context","desc","Object","keys","forEach","key","enumerable","configurable","initializer","writable","slice","reverse","reduce","decorator","value","call","undefined","defineProperty","MAX_PART_SIZE","warn","createLogger","S3Handler","decorateWith","pRetry","wrap","delays","when","e","_e$$metadata","$metadata","httpStatusCode","onRetry","error","attemptNumber","delay","file","arguments","RemoteHandlerAbstract","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","_s3","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","_bucket","shift","_dir","join","type","_makeCopySource","_makeKey","_makePrefix","dir","prefix","_createParams","Bucket","Key","_multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","Math","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","Error","cause","code","_isNotEmptyDir","_result$Contents","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","_isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","params","done","unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","_unlink","DeleteObjectCommand","_list","NextContinuationToken","uniq","Set","Delimiter","ContinuationToken","IsTruncated","entry","CommonPrefixes","add","basename","_mkdir","_rename","copy","fd","ContentLength","_read","buffer","position","Range","bytesRead","copyStreamToBuffer","_rmdir","_rmtree","asyncEach","concurrency","_openFile","flags","_closeFile","useVhdDirectory","prototype","getOwnPropertyDescriptor","exports"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n UploadPartCopyCommand,\n} from '@aws-sdk/client-s3'\nimport { Upload } from '@aws-sdk/lib-storage'\nimport { NodeHttpHandler } from '@aws-sdk/node-http-handler'\nimport { getApplyMd5BodyChecksumPlugin } from '@aws-sdk/middleware-apply-body-checksum'\nimport { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport 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 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 MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\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 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 _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n useVhdDirectory() {\n return true\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"s3.js","names":["_clientS","require","_libStorage","_nodeHttpHandler","_middlewareApplyBodyChecksum","_http","_https","_retry","_interopRequireDefault","_log","_decorateWith","_stream","_xoRemoteParser","_copyStreamToBuffer","_guessAwsRegion","_abstract","_path","_asyncEach","_dec","_class","obj","__esModule","default","_applyDecoratedDescriptor","target","property","decorators","descriptor","context","desc","Object","keys","forEach","key","enumerable","configurable","initializer","writable","slice","reverse","reduce","decorator","value","call","undefined","defineProperty","MAX_PART_SIZE","warn","createLogger","S3Handler","decorateWith","pRetry","wrap","delays","when","e","_e$$metadata","$metadata","httpStatusCode","onRetry","error","attemptNumber","delay","file","arguments","RemoteHandlerAbstract","bucket","dir","s3","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","S3Client","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","parts","split","shift","join","type","makeCopySource","#makeCopySource","makeKey","#makeKey","makePrefix","#makePrefix","prefix","createParams","#createParams","Bucket","Key","multipartCopy","#multipartCopy","oldPath","newPath","size","_getSize","CopySource","multipartParams","send","CreateMultipartUploadCommand","start","partNumber","length","upload","UploadPartCopyCommand","CopySourceRange","Math","min","PartNumber","push","ETag","CopyPartResult","CompleteMultipartUploadCommand","MultipartUpload","Parts","AbortMultipartUploadCommand","_copy","CopyObjectCommand","name","Error","cause","code","isNotEmptyDir","#isNotEmptyDir","_result$Contents","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","isFile","#isFile","HeadObjectCommand","_outputStream","input","validator","Body","PassThrough","pipeline","Upload","client","params","done","__unlink","_writeFile","data","options","PutObjectCommand","_createReadStream","GetObjectCommand","_unlink","DeleteObjectCommand","_list","NextContinuationToken","uniq","Set","Delimiter","ContinuationToken","IsTruncated","entry","CommonPrefixes","add","basename","_mkdir","_rename","__copy","fd","ContentLength","_read","buffer","position","Range","bytesRead","copyStreamToBuffer","_rmdir","_rmtree","asyncEach","concurrency","_openFile","flags","_closeFile","useVhdDirectory","prototype","getOwnPropertyDescriptor","exports"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n UploadPartCopyCommand,\n} from '@aws-sdk/client-s3'\nimport { Upload } from '@aws-sdk/lib-storage'\nimport { NodeHttpHandler } from '@aws-sdk/node-http-handler'\nimport { getApplyMd5BodyChecksumPlugin } from '@aws-sdk/middleware-apply-body-checksum'\nimport { Agent as HttpAgent } from 'http'\nimport { Agent as HttpsAgent } from 'https'\nimport 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 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 MAX_PART_SIZE = 1024 * 1024 * 1024 * 5 // 5GB\nconst { warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n #bucket\n #dir\n #s3\n\n constructor(remote, _opts) {\n super(remote)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n } = parse(remote.url)\n\n this.#s3 = new S3Client({\n apiVersion: '2006-03-01',\n endpoint: `${protocol}://${host}`,\n forcePathStyle: true,\n credentials: {\n accessKeyId: username,\n secretAccessKey: password,\n },\n tls: protocol === 'https',\n region,\n requestHandler: new NodeHttpHandler({\n socketTimeout: 600000,\n httpAgent: new HttpAgent({\n keepAlive: true,\n }),\n httpsAgent: new HttpsAgent({\n rejectUnauthorized: !allowUnauthorized,\n keepAlive: true,\n }),\n }),\n })\n\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config))\n\n const parts = split(path)\n this.#bucket = parts.shift()\n this.#dir = join(...parts)\n }\n\n get type() {\n return 's3'\n }\n\n #makeCopySource(path) {\n return join(this.#bucket, this.#dir, path)\n }\n\n #makeKey(file) {\n return join(this.#dir, file)\n }\n\n #makePrefix(dir) {\n const prefix = join(this.#dir, dir, '/')\n\n // no prefix for root\n if (prefix !== './') {\n return prefix\n }\n }\n\n #createParams(file) {\n return { Bucket: this.#bucket, Key: this.#makeKey(file) }\n }\n\n async #multipartCopy(oldPath, newPath) {\n const size = await this._getSize(oldPath)\n const CopySource = this.#makeCopySource(oldPath)\n const multipartParams = await this.#s3.send(new CreateMultipartUploadCommand({ ...this.#createParams(newPath) }))\n try {\n const parts = []\n let start = 0\n while (start < size) {\n const partNumber = parts.length + 1\n const upload = await this.#s3.send(\n new UploadPartCopyCommand({\n ...multipartParams,\n CopySource,\n CopySourceRange: `bytes=${start}-${Math.min(start + MAX_PART_SIZE, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += MAX_PART_SIZE\n }\n await this.#s3.send(\n new CompleteMultipartUploadCommand({\n ...multipartParams,\n MultipartUpload: { Parts: parts },\n })\n )\n } catch (e) {\n await this.#s3.send(new AbortMultipartUploadCommand(multipartParams))\n throw e\n }\n }\n\n async _copy(oldPath, newPath) {\n const CopySource = this.#makeCopySource(oldPath)\n try {\n await this.#s3.send(\n new CopyObjectCommand({\n ...this.#createParams(newPath),\n CopySource,\n })\n )\n } catch (e) {\n // object > 5GB must be copied part by part\n if (e.name === 'EntityTooLarge') {\n return this.#multipartCopy(oldPath, newPath)\n }\n // normalize this error code\n if (e.name === 'NoSuchKey') {\n const error = new Error(`ENOENT: no such file or directory '${oldPath}'`)\n error.cause = e\n error.code = 'ENOENT'\n error.path = oldPath\n throw error\n }\n throw e\n }\n }\n\n async #isNotEmptyDir(path) {\n const result = await this.#s3.send(\n new ListObjectsV2Command({\n Bucket: this.#bucket,\n MaxKeys: 1,\n Prefix: this.#makePrefix(path),\n })\n )\n return result.Contents?.length > 0\n }\n\n async #isFile(path) {\n try {\n await this.#s3.send(new HeadObjectCommand(this.#createParams(path)))\n return true\n } catch (error) {\n if (error.name === 'NotFound') {\n return false\n }\n throw error\n }\n }\n\n async _outputStream(path, input, { validator }) {\n // Workaround for \"ReferenceError: ReadableStream is not defined\"\n // https://github.com/aws/aws-sdk-js-v3/issues/2522\n const Body = new PassThrough()\n pipeline(input, Body, () => {})\n\n const upload = new Upload({\n client: this.#s3,\n params: {\n ...this.#createParams(path),\n Body,\n },\n })\n\n await upload.done()\n\n if (validator !== undefined) {\n try {\n await validator.call(this, path)\n } catch (error) {\n await this.__unlink(path)\n throw error\n }\n }\n }\n\n // 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 _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": "
|
|
4
|
+
"version": "4.0.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",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"@vates/async-each": "^1.0.0",
|
|
30
30
|
"@vates/coalesce-calls": "^0.1.0",
|
|
31
31
|
"@vates/decorate-with": "^2.0.0",
|
|
32
|
-
"@vates/read-chunk": "^1.
|
|
32
|
+
"@vates/read-chunk": "^1.1.1",
|
|
33
33
|
"@xen-orchestra/async-map": "^0.1.2",
|
|
34
34
|
"@xen-orchestra/log": "^0.6.0",
|
|
35
35
|
"bind-property-descriptor": "^2.0.0",
|
|
@@ -53,7 +53,9 @@
|
|
|
53
53
|
"@babel/preset-env": "^7.8.0",
|
|
54
54
|
"cross-env": "^7.0.2",
|
|
55
55
|
"dotenv": "^16.0.0",
|
|
56
|
-
"rimraf": "^
|
|
56
|
+
"rimraf": "^5.0.1",
|
|
57
|
+
"sinon": "^15.0.4",
|
|
58
|
+
"test": "^3.3.0",
|
|
57
59
|
"tmp": "^0.2.1"
|
|
58
60
|
},
|
|
59
61
|
"scripts": {
|
|
@@ -63,7 +65,9 @@
|
|
|
63
65
|
"prebuild": "yarn run clean",
|
|
64
66
|
"predev": "yarn run clean",
|
|
65
67
|
"prepublishOnly": "yarn run build",
|
|
66
|
-
"
|
|
68
|
+
"pretest": "yarn run build",
|
|
69
|
+
"postversion": "npm publish",
|
|
70
|
+
"test": "node--test ./dist/"
|
|
67
71
|
},
|
|
68
72
|
"author": {
|
|
69
73
|
"name": "Vates SAS",
|