@xen-orchestra/fs 4.8.0 → 4.9.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/fs.d.mts ADDED
@@ -0,0 +1,129 @@
1
+ import type { Readable } from 'stream';
2
+ export interface RemoteInfo {
3
+ url: string;
4
+ encryptionKey?: string;
5
+ immutable?: boolean;
6
+ useVhdDirectory?: boolean;
7
+ [key: string]: unknown;
8
+ }
9
+ /** A file descriptor as returned by openFile() */
10
+ export interface FileArg {
11
+ fd: unknown;
12
+ path: string;
13
+ }
14
+ /** A file argument: either a path string or an open FileDescriptor */
15
+ export type FileDescriptor = number | string | FileArg;
16
+ export interface RemoteHandlerOptions {
17
+ highWaterMark?: number;
18
+ timeout?: number;
19
+ maxParallelOperations?: number;
20
+ withLimit?: string[];
21
+ withTimeout?: string[];
22
+ withRetry?: Record<string, RetryOptions>;
23
+ }
24
+ export interface RetryOptions {
25
+ updateArguments?: (error: Error, args: unknown[]) => unknown[];
26
+ }
27
+ export interface RemoteInfoResult {
28
+ size?: number;
29
+ used?: number;
30
+ available?: number;
31
+ [key: string]: unknown;
32
+ }
33
+ export interface ListOptions {
34
+ filter?: (entry: string) => boolean;
35
+ ignoreMissing?: boolean;
36
+ prependDir?: boolean;
37
+ }
38
+ export interface ReadStreamOptions {
39
+ checksum?: boolean;
40
+ ignoreMissingChecksum?: boolean;
41
+ start?: number;
42
+ end?: number;
43
+ highWaterMark?: number;
44
+ flags?: string;
45
+ [key: string]: unknown;
46
+ }
47
+ export interface OutputStreamOptions {
48
+ checksum?: boolean;
49
+ dirMode?: number;
50
+ maxStreamLength?: number;
51
+ streamLength?: number;
52
+ validator?: (this: RemoteHandlerAbstract, path: string) => Promise<void>;
53
+ }
54
+ export interface OutputFileOptions {
55
+ dirMode?: number;
56
+ flags?: string;
57
+ }
58
+ export interface ReadFileOptions {
59
+ flags?: string;
60
+ }
61
+ export interface WriteFileOptions {
62
+ flags?: string;
63
+ dirMode?: number;
64
+ }
65
+ export interface MkdirOptions {
66
+ mode?: number;
67
+ }
68
+ export interface RenameOptions {
69
+ checksum?: boolean;
70
+ }
71
+ export interface CopyOptions {
72
+ checksum?: boolean;
73
+ }
74
+ export interface UnlinkOptions {
75
+ checksum?: boolean;
76
+ }
77
+ export interface ReadResult {
78
+ buffer: Buffer;
79
+ bytesRead: number;
80
+ }
81
+ export interface TestResult {
82
+ success: boolean;
83
+ writeRate?: number;
84
+ readRate?: number;
85
+ step?: string;
86
+ file?: string;
87
+ error?: Error;
88
+ }
89
+ export interface LockDisposer {
90
+ dispose: () => Promise<void>;
91
+ }
92
+ export declare abstract class RemoteHandlerAbstract {
93
+ constructor(_remote: RemoteInfo, _options?: RemoteHandlerOptions);
94
+ abstract get type(): string;
95
+ abstract get isEncrypted(): boolean;
96
+ abstract get encryptionAlgorithm(): string;
97
+ abstract sync(): Promise<void>;
98
+ abstract forget(): Promise<void>;
99
+ abstract list(dir: string, options?: ListOptions): Promise<string[]>;
100
+ abstract mkdir(dir: string, options?: MkdirOptions): Promise<void>;
101
+ abstract mktree(dir: string, options?: MkdirOptions): Promise<void>;
102
+ abstract rmdir(dir: string): Promise<void>;
103
+ abstract rmtree(dir: string): Promise<void>;
104
+ abstract createReadStream(file: FileArg, options?: ReadStreamOptions): Promise<Readable & {
105
+ length?: number;
106
+ maxStreamLength?: number;
107
+ }>;
108
+ abstract readFile(file: string, options?: ReadFileOptions): Promise<string>;
109
+ abstract read(file: FileDescriptor, buffer: Buffer, position?: number): Promise<ReadResult>;
110
+ abstract outputStream(path: string, input: Readable, options?: OutputStreamOptions): Promise<void>;
111
+ abstract outputFile(file: string, data: string | Buffer, options?: OutputFileOptions): Promise<void>;
112
+ abstract writeFile(file: string, data: string | Buffer, options?: WriteFileOptions): Promise<void>;
113
+ abstract write(file: FileArg, buffer: Buffer, position?: number): Promise<void>;
114
+ abstract truncate(file: string, len: number): Promise<void>;
115
+ abstract rename(oldPath: string, newPath: string, options?: RenameOptions): Promise<void>;
116
+ abstract copy(oldPath: string, newPath: string, options?: CopyOptions): Promise<void>;
117
+ /** Silently ignores ENOENT. By default also removes the associated checksum file. */
118
+ abstract unlink(file: string, options?: UnlinkOptions): Promise<void>;
119
+ abstract openFile(path: string, flags: string): Promise<FileDescriptor>;
120
+ abstract closeFile(fd: FileDescriptor): Promise<void>;
121
+ abstract getInfo(): Promise<RemoteInfoResult>;
122
+ abstract getSize(file: FileDescriptor): Promise<number>;
123
+ abstract getSizeOnDisk(file: FileArg): Promise<number>;
124
+ abstract lock(path: string): Promise<LockDisposer>;
125
+ abstract test(): Promise<TestResult>;
126
+ abstract isImmutable(): boolean;
127
+ abstract useVhdDirectory(): boolean;
128
+ abstract addPrefix(prefix: string): RemoteHandlerAbstract;
129
+ }
package/dist/index.js CHANGED
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "DEFAULT_ENCRYPTION_ALGORITHM", {
9
9
  return _encryptor.DEFAULT_ENCRYPTION_ALGORITHM;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "RemoteHandlerAbstract", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _abstract.default;
16
+ }
17
+ });
12
18
  Object.defineProperty(exports, "UNENCRYPTED_ALGORITHM", {
13
19
  enumerable: true,
14
20
  get: function () {
@@ -30,6 +36,7 @@ var _s = _interopRequireDefault(require("./s3"));
30
36
  var _smb = _interopRequireDefault(require("./smb"));
31
37
  var _azure = _interopRequireDefault(require("./azure"));
32
38
  var _encryptor = require("./_encryptor");
39
+ var _abstract = _interopRequireDefault(require("./abstract.js"));
33
40
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
34
41
  const HANDLERS = {
35
42
  file: _local.default,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_execa","_interopRequireDefault","require","_xoRemoteParser","_local","_nfs","_s","_smb","_azure","_encryptor","e","__esModule","default","HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","azure","RemoteHandlerAzure","azurite","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","exports","getSyncedHandler","opts","handler","dispose","forget","value"],"sources":["../src/index.js"],"sourcesContent":["import execa from 'execa'\nimport { parse } from 'xo-remote-parser'\n\nimport RemoteHandlerLocal from './local'\nimport RemoteHandlerNfs from './nfs'\nimport RemoteHandlerS3 from './s3'\nimport RemoteHandlerSmb from './smb'\nimport RemoteHandlerAzure from './azure'\nexport { DEFAULT_ENCRYPTION_ALGORITHM, UNENCRYPTED_ALGORITHM, isLegacyEncryptionAlgorithm } from './_encryptor'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n azure: RemoteHandlerAzure,\n azurite: RemoteHandlerAzure,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmb\n} catch (_) {}\n\nexport const getHandler = (remote, ...rest) => {\n const Handler = HANDLERS[parse(remote.url).type]\n if (!Handler) {\n throw new Error('Unhandled remote type')\n }\n return new Handler(remote, ...rest)\n}\n\nexport const getSyncedHandler = async (...opts) => {\n const handler = getHandler(...opts)\n await handler.sync()\n return {\n dispose: () => handler.forget(),\n value: handler,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,EAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,IAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,MAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,UAAA,GAAAP,OAAA;AAA+G,SAAAD,uBAAAS,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/G,MAAMG,QAAQ,GAAG;EACfC,IAAI,EAAEC,cAAkB;EACxBC,GAAG,EAAEC,YAAgB;EACrBC,EAAE,EAAEC,UAAe;EACnBC,KAAK,EAAEC,cAAkB;EACzBC,OAAO,EAAED;AACX,CAAC;AAED,IAAI;EACFE,cAAK,CAACC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;EAChCX,QAAQ,CAACY,GAAG,GAAGC,YAAgB;AACjC,CAAC,CAAC,OAAOC,CAAC,EAAE,CAAC;AAEN,MAAMC,UAAU,GAAGA,CAACC,MAAM,EAAE,GAAGC,IAAI,KAAK;EAC7C,MAAMC,OAAO,GAAGlB,QAAQ,CAAC,IAAAmB,qBAAK,EAACH,MAAM,CAACI,GAAG,CAAC,CAACC,IAAI,CAAC;EAChD,IAAI,CAACH,OAAO,EAAE;IACZ,MAAM,IAAII,KAAK,CAAC,uBAAuB,CAAC;EAC1C;EACA,OAAO,IAAIJ,OAAO,CAACF,MAAM,EAAE,GAAGC,IAAI,CAAC;AACrC,CAAC;AAAAM,OAAA,CAAAR,UAAA,GAAAA,UAAA;AAEM,MAAMS,gBAAgB,GAAG,MAAAA,CAAO,GAAGC,IAAI,KAAK;EACjD,MAAMC,OAAO,GAAGX,UAAU,CAAC,GAAGU,IAAI,CAAC;EACnC,MAAMC,OAAO,CAACf,IAAI,CAAC,CAAC;EACpB,OAAO;IACLgB,OAAO,EAAEA,CAAA,KAAMD,OAAO,CAACE,MAAM,CAAC,CAAC;IAC/BC,KAAK,EAAEH;EACT,CAAC;AACH,CAAC;AAAAH,OAAA,CAAAC,gBAAA,GAAAA,gBAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_execa","_interopRequireDefault","require","_xoRemoteParser","_local","_nfs","_s","_smb","_azure","_encryptor","_abstract","e","__esModule","default","HANDLERS","file","RemoteHandlerLocal","nfs","RemoteHandlerNfs","s3","RemoteHandlerS3","azure","RemoteHandlerAzure","azurite","execa","sync","smb","RemoteHandlerSmb","_","getHandler","remote","rest","Handler","parse","url","type","Error","exports","getSyncedHandler","opts","handler","dispose","forget","value"],"sources":["../src/index.js"],"sourcesContent":["import execa from 'execa'\nimport { parse } from 'xo-remote-parser'\n\nimport RemoteHandlerLocal from './local'\nimport RemoteHandlerNfs from './nfs'\nimport RemoteHandlerS3 from './s3'\nimport RemoteHandlerSmb from './smb'\nimport RemoteHandlerAzure from './azure'\nexport { DEFAULT_ENCRYPTION_ALGORITHM, UNENCRYPTED_ALGORITHM, isLegacyEncryptionAlgorithm } from './_encryptor'\n\nconst HANDLERS = {\n file: RemoteHandlerLocal,\n nfs: RemoteHandlerNfs,\n s3: RemoteHandlerS3,\n azure: RemoteHandlerAzure,\n azurite: RemoteHandlerAzure,\n}\n\ntry {\n execa.sync('mount.cifs', ['-V'])\n HANDLERS.smb = RemoteHandlerSmb\n} catch (_) {}\n\nexport const getHandler = (remote, ...rest) => {\n const Handler = HANDLERS[parse(remote.url).type]\n if (!Handler) {\n throw new Error('Unhandled remote type')\n }\n return new Handler(remote, ...rest)\n}\n\nexport const getSyncedHandler = async (...opts) => {\n const handler = getHandler(...opts)\n await handler.sync()\n return {\n dispose: () => handler.forget(),\n value: handler,\n }\n}\n\n\nexport { default as RemoteHandlerAbstract } from './abstract.js'"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,IAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,EAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,IAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,MAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,UAAA,GAAAP,OAAA;AAiCA,IAAAQ,SAAA,GAAAT,sBAAA,CAAAC,OAAA;AAAgE,SAAAD,uBAAAU,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AA/BhE,MAAMG,QAAQ,GAAG;EACfC,IAAI,EAAEC,cAAkB;EACxBC,GAAG,EAAEC,YAAgB;EACrBC,EAAE,EAAEC,UAAe;EACnBC,KAAK,EAAEC,cAAkB;EACzBC,OAAO,EAAED;AACX,CAAC;AAED,IAAI;EACFE,cAAK,CAACC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;EAChCX,QAAQ,CAACY,GAAG,GAAGC,YAAgB;AACjC,CAAC,CAAC,OAAOC,CAAC,EAAE,CAAC;AAEN,MAAMC,UAAU,GAAGA,CAACC,MAAM,EAAE,GAAGC,IAAI,KAAK;EAC7C,MAAMC,OAAO,GAAGlB,QAAQ,CAAC,IAAAmB,qBAAK,EAACH,MAAM,CAACI,GAAG,CAAC,CAACC,IAAI,CAAC;EAChD,IAAI,CAACH,OAAO,EAAE;IACZ,MAAM,IAAII,KAAK,CAAC,uBAAuB,CAAC;EAC1C;EACA,OAAO,IAAIJ,OAAO,CAACF,MAAM,EAAE,GAAGC,IAAI,CAAC;AACrC,CAAC;AAAAM,OAAA,CAAAR,UAAA,GAAAA,UAAA;AAEM,MAAMS,gBAAgB,GAAG,MAAAA,CAAO,GAAGC,IAAI,KAAK;EACjD,MAAMC,OAAO,GAAGX,UAAU,CAAC,GAAGU,IAAI,CAAC;EACnC,MAAMC,OAAO,CAACf,IAAI,CAAC,CAAC;EACpB,OAAO;IACLgB,OAAO,EAAEA,CAAA,KAAMD,OAAO,CAACE,MAAM,CAAC,CAAC;IAC/BC,KAAK,EAAEH;EACT,CAAC;AACH,CAAC;AAAAH,OAAA,CAAAC,gBAAA,GAAAA,gBAAA","ignoreList":[]}
package/dist/local.js CHANGED
@@ -161,11 +161,15 @@ class LocalHandler extends _abstract.default {
161
161
  bytesRead
162
162
  } = await this.#addSyncStackTrace(_fsExtra.default.read, fd, buffer, 0, buffer.length, position === undefined ? null : position);
163
163
  if (bytesRead < buffer.length) {
164
- warn(`read was incomplete at first, expecting ${buffer.length} from ${position} got ${bytesRead}`);
164
+ warn(`read was incomplete at first, expecting ${buffer.length} from ${position} got ${bytesRead}`, {
165
+ path: file
166
+ });
165
167
  const additionalBuffer = buffer.slice(bytesRead);
166
168
  (0, _strict.default)(bytesRead > 0, `couldn't read any data from file ${JSON.stringify(file)} (asked for ${buffer.length} bytes}`);
167
169
  await this._read(file, additionalBuffer, position + bytesRead);
168
- warn(`read was incomplete at first, need to read the last ${additionalBuffer.length} bytes from ${position}`);
170
+ warn(`read was incomplete at first, need to read the last ${additionalBuffer.length} bytes from ${position}`, {
171
+ path: file
172
+ });
169
173
  }
170
174
  return {
171
175
  buffer,
package/dist/local.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","names":["_strict","_interopRequireDefault","require","_fromCallback","_fsExtra","_properLockfile","_log","_nodeChild_process","_promiseToolbox","_abstract","e","__esModule","default","info","warn","createLogger","addSyncStackTrace","fn","args","stackContainer","Error","apply","error","stack","slice","indexOf","join","DF_RE","df","path","stdout","fromCallback","execFile","lines","trim","split","assert","equal","length","matches","exec","notEqual","size","Number","used","available","dontAddSyncStackTrace","LocalHandler","RemoteHandlerAbstract","retriesOnEagain","constructor","remote","opts","syncStackTraces","delay","retries","when","code","type","getRealPath","_remote","getFilePath","file","_closeFile","fd","fs","close","_copy","oldPath","newPath","copy","_createReadStream","options","stream","createReadStream","fromEvent","autoClose","_createWriteStream","createWriteStream","_getInfo","Object","keys","forEach","key","isNaN","_getSize","stats","stat","_list","dir","readdir","_lock","acquire","lockfile","lock","bind","undefined","onCompromised","release","_mkdir","mode","mkdir","_openFile","flags","open","_read","buffer","position","needsClose","bytesRead","read","additionalBuffer","JSON","stringify","_readFile","flag","filePath","retry","readFile","_rename","rename","_rmdir","rmdir","_sync","ensureDir","access","R_OK","W_OK","_truncate","len","truncate","_unlink","unlink","_writeFd","write","_writeFile","data","writeFile","exports"],"sources":["../src/local.js"],"sourcesContent":["import assert from 'node:assert/strict'\nimport fromCallback from 'promise-toolbox/fromCallback'\nimport fs from 'fs-extra'\nimport lockfile from 'proper-lockfile'\nimport { createLogger } from '@xen-orchestra/log'\nimport { execFile } from 'node:child_process'\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 let { stack } = stackContainer\n\n // remove first line which does not contain stack information, simply `Error`\n stack = stack.slice(stack.indexOf('\\n') + 1)\n\n error.stack = [error.stack, 'From:', stack].join('\\n')\n throw error\n }\n}\n\n// $filesystem $size $used $available_bytes $capacity $mountpoint\nconst DF_RE = /^(.+?)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d{1,3})%\\s+(.+)$/\n\nasync function df(path) {\n const stdout = await fromCallback(execFile, 'df', ['-kP', path])\n const lines = stdout.trim().split('\\n')\n assert.equal(lines.length, 2) // headers + first line\n const matches = DF_RE.exec(lines[1])\n assert.notEqual(matches, null)\n return {\n size: Number(matches[2]) * 1024,\n used: Number(matches[3]) * 1024,\n available: Number(matches[4]) * 1024,\n }\n}\n\nfunction dontAddSyncStackTrace(fn, ...args) {\n return fn.apply(this, args)\n}\n\nexport default class LocalHandler extends RemoteHandlerAbstract {\n #addSyncStackTrace\n #retriesOnEagain\n\n constructor(remote, opts = {}) {\n super(remote, opts)\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(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 const fd = needsClose ? await this.#addSyncStackTrace(fs.open, this.getFilePath(file), 'r') : file.fd\n try {\n const { bytesRead } = await this.#addSyncStackTrace(\n fs.read,\n fd,\n buffer,\n 0,\n buffer.length,\n position === undefined ? null : position\n )\n\n // sometimes it won't fail if it can't read the data\n // and will return a partial buffer\n // let's read the missing data to force it to really succeed or completely fail\n if (bytesRead < buffer.length) {\n warn(`read was incomplete at first, expecting ${buffer.length} from ${position} got ${bytesRead}`)\n // additionalBuffer is a view on the end of buffer\n const additionalBuffer = buffer.slice(bytesRead)\n // ensure we don't fall into an infinite loop\n assert(\n bytesRead > 0,\n `couldn't read any data from file ${JSON.stringify(file)} (asked for ${buffer.length} bytes}`\n )\n await this._read(file, additionalBuffer, position + bytesRead)\n // this code should not be used, since the real error should pop from the read, either a read after the end or a EIO\n // but if the error was transient, let's accept the result\n warn(`read was incomplete at first, need to read the last ${additionalBuffer.length} bytes from ${position}`)\n }\n return { buffer, bytesRead: buffer.length }\n } finally {\n if (needsClose) {\n await this.#addSyncStackTrace(fs.close, fd)\n }\n }\n }\n\n async _readFile(file, { flags, ...options } = {}) {\n // contrary to createReadStream, readFile expect singular `flag`\n if (flags !== undefined) {\n options.flag = flags\n }\n\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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","ignoreList":[]}
1
+ {"version":3,"file":"local.js","names":["_strict","_interopRequireDefault","require","_fromCallback","_fsExtra","_properLockfile","_log","_nodeChild_process","_promiseToolbox","_abstract","e","__esModule","default","info","warn","createLogger","addSyncStackTrace","fn","args","stackContainer","Error","apply","error","stack","slice","indexOf","join","DF_RE","df","path","stdout","fromCallback","execFile","lines","trim","split","assert","equal","length","matches","exec","notEqual","size","Number","used","available","dontAddSyncStackTrace","LocalHandler","RemoteHandlerAbstract","retriesOnEagain","constructor","remote","opts","syncStackTraces","delay","retries","when","code","type","getRealPath","_remote","getFilePath","file","_closeFile","fd","fs","close","_copy","oldPath","newPath","copy","_createReadStream","options","stream","createReadStream","fromEvent","autoClose","_createWriteStream","createWriteStream","_getInfo","Object","keys","forEach","key","isNaN","_getSize","stats","stat","_list","dir","readdir","_lock","acquire","lockfile","lock","bind","undefined","onCompromised","release","_mkdir","mode","mkdir","_openFile","flags","open","_read","buffer","position","needsClose","bytesRead","read","additionalBuffer","JSON","stringify","_readFile","flag","filePath","retry","readFile","_rename","rename","_rmdir","rmdir","_sync","ensureDir","access","R_OK","W_OK","_truncate","len","truncate","_unlink","unlink","_writeFd","write","_writeFile","data","writeFile","exports"],"sources":["../src/local.js"],"sourcesContent":["import assert from 'node:assert/strict'\nimport fromCallback from 'promise-toolbox/fromCallback'\nimport fs from 'fs-extra'\nimport lockfile from 'proper-lockfile'\nimport { createLogger } from '@xen-orchestra/log'\nimport { execFile } from 'node:child_process'\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 let { stack } = stackContainer\n\n // remove first line which does not contain stack information, simply `Error`\n stack = stack.slice(stack.indexOf('\\n') + 1)\n\n error.stack = [error.stack, 'From:', stack].join('\\n')\n throw error\n }\n}\n\n// $filesystem $size $used $available_bytes $capacity $mountpoint\nconst DF_RE = /^(.+?)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d{1,3})%\\s+(.+)$/\n\nasync function df(path) {\n const stdout = await fromCallback(execFile, 'df', ['-kP', path])\n const lines = stdout.trim().split('\\n')\n assert.equal(lines.length, 2) // headers + first line\n const matches = DF_RE.exec(lines[1])\n assert.notEqual(matches, null)\n return {\n size: Number(matches[2]) * 1024,\n used: Number(matches[3]) * 1024,\n available: Number(matches[4]) * 1024,\n }\n}\n\nfunction dontAddSyncStackTrace(fn, ...args) {\n return fn.apply(this, args)\n}\n\nexport default class LocalHandler extends RemoteHandlerAbstract {\n #addSyncStackTrace\n #retriesOnEagain\n\n constructor(remote, opts = {}) {\n super(remote, opts)\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(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 const fd = needsClose ? await this.#addSyncStackTrace(fs.open, this.getFilePath(file), 'r') : file.fd\n try {\n const { bytesRead } = await this.#addSyncStackTrace(\n fs.read,\n fd,\n buffer,\n 0,\n buffer.length,\n position === undefined ? null : position\n )\n\n // sometimes it won't fail if it can't read the data\n // and will return a partial buffer\n // let's read the missing data to force it to really succeed or completely fail\n if (bytesRead < buffer.length) {\n warn(`read was incomplete at first, expecting ${buffer.length} from ${position} got ${bytesRead}`, {\n path: file,\n })\n // additionalBuffer is a view on the end of buffer\n const additionalBuffer = buffer.slice(bytesRead)\n // ensure we don't fall into an infinite loop\n assert(\n bytesRead > 0,\n `couldn't read any data from file ${JSON.stringify(file)} (asked for ${buffer.length} bytes}`\n )\n await this._read(file, additionalBuffer, position + bytesRead)\n // this code should not be used, since the real error should pop from the read, either a read after the end or a EIO\n // but if the error was transient, let's accept the result\n warn(`read was incomplete at first, need to read the last ${additionalBuffer.length} bytes from ${position}`, {\n path: file,\n })\n }\n return { buffer, bytesRead: buffer.length }\n } finally {\n if (needsClose) {\n await this.#addSyncStackTrace(fs.close, fd)\n }\n }\n }\n\n async _readFile(file, { flags, ...options } = {}) {\n // contrary to createReadStream, readFile expect singular `flag`\n if (flags !== undefined) {\n options.flag = flags\n }\n\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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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ export { basename, dirname, join } from 'path';
2
+ export declare const normalize: (path: string) => string;
3
+ export declare function split(path: string): string[];
4
+ export declare const relativeFromFile: (file: string, path: string) => string;
5
+ export declare const resolveFromFile: (file: string, path: string) => string;
package/dist/s3.js CHANGED
@@ -18,6 +18,7 @@ var _guessAwsRegion = _interopRequireDefault(require("./_guessAwsRegion.js"));
18
18
  var _abstract = _interopRequireDefault(require("./abstract"));
19
19
  var _path = require("./path");
20
20
  var _asyncEach = require("@vates/async-each");
21
+ var _package = require("../package.json");
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
23
  const MAX_PART_SIZE = 1024 * 1024 * 1024 * 5;
23
24
  const MAX_PART_NUMBER = 10000;
@@ -53,6 +54,7 @@ class S3Handler extends _abstract.default {
53
54
  this.#maxPartNumber = maxPartNumber;
54
55
  this.#minPartSize = minPartSize;
55
56
  this.#s3 = new _clientS.S3Client({
57
+ customUserAgent: `xen-orchestra-fs-${_package.version}`,
56
58
  apiVersion: '2006-03-01',
57
59
  endpoint: `${protocol}://${host}`,
58
60
  forcePathStyle: true,
package/dist/s3.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s3.js","names":["_clientS","require","_libStorage","_nodeHttpHandler","_middlewareApplyBodyChecksum","_http","_https","_log","_stream","_xoRemoteParser","_copyStreamToBuffer","_interopRequireDefault","_guessAwsRegion","_abstract","_path","_asyncEach","e","__esModule","default","MAX_PART_SIZE","MAX_PART_NUMBER","MIN_PART_SIZE","debug","info","warn","createLogger","S3Handler","RemoteHandlerAbstract","bucket","dir","s3","immutable","maxPartSize","maxPartNumber","minPartSize","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","requestChecksumCalculation","responseChecksumValidation","parts","split","shift","join","type","makeCopySource","#makeCopySource","makeKey","#makeKey","file","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","isImmutable","_conditionRetry","error","_error$$metadata","includes","$metadata","httpStatusCode","_copy","CopyObjectCommand","name","Error","cause","code","isNotEmptyDir","#isNotEmptyDir","_result$Contents","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","isFile","#isFile","HeadObjectCommand","_outputStream","input","streamLength","maxStreamLength","validator","partSize","undefined","max","ceil","readCounter","MAX_SIZE","streamCutter","Transform","transform","chunk","encoding","callback","Body","PassThrough","pipeline","Upload","client","params","leavePartsOnError","done","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","legacyBatchDeleteCommand","#legacyBatchDeleteCommand","asyncEach","concurrency","_rmtree","supportsDeleteObjects","DeleteObjectsCommand","Delete","Objects","$response","_openFile","flags","_closeFile","_sync","_res$ObjectLockConfig","res","GetObjectLockConfigurationCommand","ObjectLockConfiguration","ObjectLockEnabled","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","Code","useVhdDirectory","exports"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n DeleteObjectsCommand,\n GetObjectCommand,\n GetObjectLockConfigurationCommand,\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 { createLogger } from '@xen-orchestra/log'\nimport { PassThrough, Transform, 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 MAX_PART_NUMBER = 10000\nconst MIN_PART_SIZE = 5 * 1024 * 1024\nconst { debug, info, warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n #bucket\n #dir\n #s3\n #immutable = false\n #maxPartSize\n #maxPartNumber\n #minPartSize\n\n constructor(remote, _opts) {\n super(remote, _opts)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n maxPartSize = MAX_PART_SIZE,\n maxPartNumber = MAX_PART_NUMBER,\n minPartSize = MIN_PART_SIZE,\n } = parse(remote.url)\n\n this.#maxPartSize = maxPartSize\n this.#maxPartNumber = maxPartNumber\n this.#minPartSize = minPartSize\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 // from https://github.com/aws/aws-sdk-js-v3/issues/6810\n // some non AWS services like backblaze or cloudflare don't expect the new headers\n requestChecksumCalculation: 'WHEN_REQUIRED',\n responseChecksumValidation: 'WHEN_REQUIRED',\n })\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 + this.#maxPartSize, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += this.#maxPartSize\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 isImmutable() {\n return super.isImmutable() || this.#immutable\n }\n _conditionRetry(error) {\n return ![401, 403, 404, 405].includes(error?.$metadata?.httpStatusCode) && super._conditionRetry(error)\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, { streamLength, maxStreamLength = streamLength, validator }) {\n // S3 storage is limited to 10K part, each part is limited to 5GB. And the total upload must be smaller than 5TB\n // a bigger partSize increase the memory consumption of aws/lib-storage exponentially\n let partSize\n if (maxStreamLength === undefined) {\n warn(`Writing ${path} to a S3 remote without a max size set will cut it to 50GB`, { path })\n partSize = this.#minPartSize // min size for S3\n } else {\n partSize = Math.min(\n Math.max(Math.ceil(maxStreamLength / this.#maxPartNumber), this.#minPartSize),\n this.#maxPartSize\n )\n }\n\n // ensure we don't try to upload a stream to big for this partSize\n let readCounter = 0\n const MAX_SIZE = this.#maxPartNumber * partSize\n const streamCutter = new Transform({\n transform(chunk, encoding, callback) {\n readCounter += chunk.length\n if (readCounter > MAX_SIZE) {\n callback(new Error(`read ${readCounter} bytes, maximum size allowed is ${MAX_SIZE} `))\n } else {\n callback(null, chunk)\n }\n },\n })\n\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, streamCutter, Body, () => {})\n\n const upload = new Upload({\n client: this.#s3,\n params: {\n ...this.#createParams(path),\n Body,\n },\n partSize,\n leavePartsOnError: false,\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 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 async #legacyBatchDeleteCommand(result) {\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 }\n\n // reimplement _rmtree to handle efficiently path with more than 1000 entries in trees\n // @todo : use parallel processing for unlink\n async _rmtree(path) {\n let NextContinuationToken\n let supportsDeleteObjects = true\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 NextContinuationToken = result.IsTruncated ? result.NextContinuationToken : undefined\n if (supportsDeleteObjects) {\n try {\n await this.#s3.send(\n new DeleteObjectsCommand({\n Bucket: this.#bucket,\n Delete: {\n Objects: result.Contents ?? [],\n },\n })\n )\n // we catch any error because some providers don't return \"NotImplemented\" errors when they don't\n // support DeleteObjectsCommand. As we catch any error, we don't store supportsDeleteObjects param\n // because it can be due to network issues\n } catch (error) {\n warn('Unsupported DeleteObjects, fallback to DeleteObject.', { error, $response: error.$response ?? '' })\n supportsDeleteObjects = false\n await this.#legacyBatchDeleteCommand(result)\n }\n } else {\n await this.#legacyBatchDeleteCommand(result)\n }\n } while (NextContinuationToken !== undefined)\n }\n\n async _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n async _sync() {\n await super._sync()\n try {\n // if Object Lock is enabled, each upload must come with a contentMD5 header\n // the computation of this md5 is memory-intensive, especially when uploading a stream\n const res = await this.#s3.send(new GetObjectLockConfigurationCommand({ Bucket: this.#bucket }))\n if (res.ObjectLockConfiguration?.ObjectLockEnabled === 'Enabled') {\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n // will automatically add the contentMD5 header to any upload to S3\n debug(`Object Lock is enable, enable content md5 header`)\n this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config))\n this.#immutable = true\n }\n } catch (error) {\n // maybe the account doesn't have enough privilege to query the object lock configuration\n // be defensive and apply the md5 just in case\n if (error.$metadata.httpStatusCode === 403) {\n info(`s3 user doesnt have enough privilege to check for Object Lock, enable content MD5 header`)\n this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config))\n } else if (error.Code === 'ObjectLockConfigurationNotFoundError' || error.$metadata.httpStatusCode === 501) {\n info(`Object lock is not available or not configured, don't add the content MD5 header`)\n } else {\n throw error\n }\n }\n }\n\n useVhdDirectory() {\n return true\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"s3.js","names":["_clientS","require","_libStorage","_nodeHttpHandler","_middlewareApplyBodyChecksum","_http","_https","_log","_stream","_xoRemoteParser","_copyStreamToBuffer","_interopRequireDefault","_guessAwsRegion","_abstract","_path","_asyncEach","_package","e","__esModule","default","MAX_PART_SIZE","MAX_PART_NUMBER","MIN_PART_SIZE","debug","info","warn","createLogger","S3Handler","RemoteHandlerAbstract","bucket","dir","s3","immutable","maxPartSize","maxPartNumber","minPartSize","constructor","remote","_opts","allowUnauthorized","host","path","username","password","protocol","region","guessAwsRegion","parse","url","S3Client","customUserAgent","version","apiVersion","endpoint","forcePathStyle","credentials","accessKeyId","secretAccessKey","tls","requestHandler","NodeHttpHandler","socketTimeout","httpAgent","HttpAgent","keepAlive","httpsAgent","HttpsAgent","rejectUnauthorized","requestChecksumCalculation","responseChecksumValidation","parts","split","shift","join","type","makeCopySource","#makeCopySource","makeKey","#makeKey","file","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","isImmutable","_conditionRetry","error","_error$$metadata","includes","$metadata","httpStatusCode","_copy","CopyObjectCommand","name","Error","cause","code","isNotEmptyDir","#isNotEmptyDir","_result$Contents","result","ListObjectsV2Command","MaxKeys","Prefix","Contents","isFile","#isFile","HeadObjectCommand","_outputStream","input","streamLength","maxStreamLength","validator","partSize","undefined","max","ceil","readCounter","MAX_SIZE","streamCutter","Transform","transform","chunk","encoding","callback","Body","PassThrough","pipeline","Upload","client","params","leavePartsOnError","done","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","legacyBatchDeleteCommand","#legacyBatchDeleteCommand","asyncEach","concurrency","_rmtree","supportsDeleteObjects","DeleteObjectsCommand","Delete","Objects","$response","_openFile","flags","_closeFile","_sync","_res$ObjectLockConfig","res","GetObjectLockConfigurationCommand","ObjectLockConfiguration","ObjectLockEnabled","middlewareStack","use","getApplyMd5BodyChecksumPlugin","config","Code","useVhdDirectory","exports"],"sources":["../src/s3.js"],"sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n DeleteObjectsCommand,\n GetObjectCommand,\n GetObjectLockConfigurationCommand,\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 { createLogger } from '@xen-orchestra/log'\nimport { PassThrough, Transform, 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'\nimport { version } from '../package.json'\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 MAX_PART_NUMBER = 10000\nconst MIN_PART_SIZE = 5 * 1024 * 1024\nconst { debug, info, warn } = createLogger('xo:fs:s3')\n\nexport default class S3Handler extends RemoteHandlerAbstract {\n #bucket\n #dir\n #s3\n #immutable = false\n #maxPartSize\n #maxPartNumber\n #minPartSize\n\n constructor(remote, _opts) {\n super(remote, _opts)\n const {\n allowUnauthorized,\n host,\n path,\n username,\n password,\n protocol,\n region = guessAwsRegion(host),\n maxPartSize = MAX_PART_SIZE,\n maxPartNumber = MAX_PART_NUMBER,\n minPartSize = MIN_PART_SIZE,\n } = parse(remote.url)\n\n this.#maxPartSize = maxPartSize\n this.#maxPartNumber = maxPartNumber\n this.#minPartSize = minPartSize\n\n this.#s3 = new S3Client({\n customUserAgent: `xen-orchestra-fs-${version}`,\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 // from https://github.com/aws/aws-sdk-js-v3/issues/6810\n // some non AWS services like backblaze or cloudflare don't expect the new headers\n requestChecksumCalculation: 'WHEN_REQUIRED',\n responseChecksumValidation: 'WHEN_REQUIRED',\n })\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 + this.#maxPartSize, size) - 1}`,\n PartNumber: partNumber,\n })\n )\n parts.push({ ETag: upload.CopyPartResult.ETag, PartNumber: partNumber })\n start += this.#maxPartSize\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 isImmutable() {\n return super.isImmutable() || this.#immutable\n }\n _conditionRetry(error) {\n return ![401, 403, 404, 405].includes(error?.$metadata?.httpStatusCode) && super._conditionRetry(error)\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, { streamLength, maxStreamLength = streamLength, validator }) {\n // S3 storage is limited to 10K part, each part is limited to 5GB. And the total upload must be smaller than 5TB\n // a bigger partSize increase the memory consumption of aws/lib-storage exponentially\n let partSize\n if (maxStreamLength === undefined) {\n warn(`Writing ${path} to a S3 remote without a max size set will cut it to 50GB`, { path })\n partSize = this.#minPartSize // min size for S3\n } else {\n partSize = Math.min(\n Math.max(Math.ceil(maxStreamLength / this.#maxPartNumber), this.#minPartSize),\n this.#maxPartSize\n )\n }\n\n // ensure we don't try to upload a stream to big for this partSize\n let readCounter = 0\n const MAX_SIZE = this.#maxPartNumber * partSize\n const streamCutter = new Transform({\n transform(chunk, encoding, callback) {\n readCounter += chunk.length\n if (readCounter > MAX_SIZE) {\n callback(new Error(`read ${readCounter} bytes, maximum size allowed is ${MAX_SIZE} `))\n } else {\n callback(null, chunk)\n }\n },\n })\n\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, streamCutter, Body, () => {})\n\n const upload = new Upload({\n client: this.#s3,\n params: {\n ...this.#createParams(path),\n Body,\n },\n partSize,\n leavePartsOnError: false,\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 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 async #legacyBatchDeleteCommand(result) {\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 }\n\n // reimplement _rmtree to handle efficiently path with more than 1000 entries in trees\n // @todo : use parallel processing for unlink\n async _rmtree(path) {\n let NextContinuationToken\n let supportsDeleteObjects = true\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 NextContinuationToken = result.IsTruncated ? result.NextContinuationToken : undefined\n if (supportsDeleteObjects) {\n try {\n await this.#s3.send(\n new DeleteObjectsCommand({\n Bucket: this.#bucket,\n Delete: {\n Objects: result.Contents ?? [],\n },\n })\n )\n // we catch any error because some providers don't return \"NotImplemented\" errors when they don't\n // support DeleteObjectsCommand. As we catch any error, we don't store supportsDeleteObjects param\n // because it can be due to network issues\n } catch (error) {\n warn('Unsupported DeleteObjects, fallback to DeleteObject.', { error, $response: error.$response ?? '' })\n supportsDeleteObjects = false\n await this.#legacyBatchDeleteCommand(result)\n }\n } else {\n await this.#legacyBatchDeleteCommand(result)\n }\n } while (NextContinuationToken !== undefined)\n }\n\n async _openFile(path, flags) {\n return path\n }\n\n async _closeFile(fd) {}\n\n async _sync() {\n await super._sync()\n try {\n // if Object Lock is enabled, each upload must come with a contentMD5 header\n // the computation of this md5 is memory-intensive, especially when uploading a stream\n const res = await this.#s3.send(new GetObjectLockConfigurationCommand({ Bucket: this.#bucket }))\n if (res.ObjectLockConfiguration?.ObjectLockEnabled === 'Enabled') {\n // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673\n // will automatically add the contentMD5 header to any upload to S3\n debug(`Object Lock is enable, enable content md5 header`)\n this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config))\n this.#immutable = true\n }\n } catch (error) {\n // maybe the account doesn't have enough privilege to query the object lock configuration\n // be defensive and apply the md5 just in case\n if (error.$metadata.httpStatusCode === 403) {\n info(`s3 user doesnt have enough privilege to check for Object Lock, enable content MD5 header`)\n this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config))\n } else if (error.Code === 'ObjectLockConfigurationNotFoundError' || error.$metadata.httpStatusCode === 501) {\n info(`Object lock is not available or not configured, don't add the content MD5 header`)\n } else {\n throw error\n }\n }\n }\n\n useVhdDirectory() {\n return true\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@xen-orchestra/fs",
4
- "version": "4.8.0",
4
+ "version": "4.9.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",
@@ -54,10 +54,11 @@
54
54
  "dotenv": "^16.0.0",
55
55
  "rimraf": "^6.0.1",
56
56
  "sinon": "^18.0.0",
57
- "tmp": "^0.2.1"
57
+ "tmp": "^0.2.1",
58
+ "typescript": "~5.6.3"
58
59
  },
59
60
  "scripts": {
60
- "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/",
61
+ "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/ && tsc",
61
62
  "clean": "rimraf dist/",
62
63
  "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/",
63
64
  "prebuild": "yarn run clean",
@@ -71,7 +72,13 @@
71
72
  "url": "https://vates.fr"
72
73
  },
73
74
  "exports": {
74
- ".": "./dist/index.js",
75
- "./path": "./dist/path.js"
75
+ ".": {
76
+ "types": "./dist/fs.d.mts",
77
+ "default": "./dist/index.js"
78
+ },
79
+ "./path": {
80
+ "types": "./dist/path.d.mts",
81
+ "default": "./dist/path.js"
82
+ }
76
83
  }
77
84
  }
package/tsconfig.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "outDir": "./dist",
4
+ "declaration": true,
5
+ "strict": true,
6
+ "module": "ESNext",
7
+ "moduleResolution": "bundler",
8
+ "target": "ES2022",
9
+ "skipLibCheck": true,
10
+ "types": ["node"], // Only use types from Node.js and packages that are explicitly imported
11
+ "rootDir": "./src/types",
12
+ "emitDeclarationOnly": true
13
+ },
14
+ "include": ["src/types/*"],
15
+ "exclude": ["node_modules", "dist"]
16
+ }