@mongodb-js/mongodb-downloader 0.5.0 → 1.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/README.md ADDED
@@ -0,0 +1,39 @@
1
+ ## mongodb-downloader
2
+
3
+ A simple library to download MongoDB binaries for different platforms and versions.
4
+
5
+ ### Migrating from v0.5 to v0.6+
6
+
7
+ In v0.6.x, the library introduced lockfiles to prevent parallel downloads of the same MongoDB binary. It also changed the arguments for the `downloadMongoDb` and `downloadMongoDbWithVersionInfo` functions, introducing a new `useLockfile` field and using a single options object instead of separate parameters for different options. It is recommended to enable lockfiles to prevent redundant downloads unless you have a specific reason not to.
8
+
9
+ ```ts
10
+ // Before (v0.5.x)
11
+ downloadMongoDb('/tmp/directory', '4.4.6', {
12
+ platform: 'linux',
13
+ arch: 'x64',
14
+ });
15
+
16
+ downloadMongoDbWithVersionInfo('/tmp/directory', '4.4.6', {
17
+ arch: 'x64',
18
+ });
19
+
20
+ // After (v0.6.x)
21
+ downloadMongoDb({
22
+ directory: '/tmp/directory',
23
+ version: '4.4.6',
24
+ useLockfile: true, // New, required field.
25
+ downloadOptions: {
26
+ platform: 'linux',
27
+ arch: 'x64',
28
+ },
29
+ });
30
+
31
+ downloadMongoDbWithVersionInfo({
32
+ directory: '/tmp/directory',
33
+ version: '4.4.6',
34
+ useLockfile: true, // New, required field.
35
+ downloadOptions: {
36
+ arch: 'x64',
37
+ },
38
+ });
39
+ ```
@@ -1,5 +1,6 @@
1
1
  import mod from "./index.js";
2
2
 
3
3
  export default mod;
4
+ export const MongoDBDownloader = mod.MongoDBDownloader;
4
5
  export const downloadMongoDb = mod.downloadMongoDb;
5
6
  export const downloadMongoDbWithVersionInfo = mod.downloadMongoDbWithVersionInfo;
package/dist/index.d.ts CHANGED
@@ -3,6 +3,19 @@ export type { DownloadOptions };
3
3
  export type DownloadResult = DownloadArtifactInfo & {
4
4
  downloadedBinDir: string;
5
5
  };
6
- export declare function downloadMongoDbWithVersionInfo(tmpdir: string, targetVersionSemverSpecifier?: string, options?: DownloadOptions): Promise<DownloadResult>;
7
- export declare function downloadMongoDb(...args: Parameters<typeof downloadMongoDbWithVersionInfo>): Promise<string>;
6
+ export type MongoDBDownloaderOptions = {
7
+ directory: string;
8
+ version?: string;
9
+ useLockfile: boolean;
10
+ downloadOptions?: DownloadOptions;
11
+ };
12
+ export declare class MongoDBDownloader {
13
+ downloadMongoDbWithVersionInfo({ downloadOptions, version, directory, useLockfile, }: MongoDBDownloaderOptions): Promise<DownloadResult>;
14
+ static HWM: number;
15
+ private downloadAndExtract;
16
+ private lookupDownloadUrl;
17
+ private getCurrentDownloadedFile;
18
+ }
19
+ export declare function downloadMongoDbWithVersionInfo({ downloadOptions, version, directory, useLockfile, }: MongoDBDownloaderOptions): Promise<DownloadResult>;
20
+ export declare function downloadMongoDb({ downloadOptions, version, directory, useLockfile, }: MongoDBDownloaderOptions): Promise<string>;
8
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,OAAO,IAAI,eAAe,EAC1B,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAI9B,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG;IAClD,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAGF,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,MAAM,EACd,4BAA4B,SAAM,EAClC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAwCzB;AA2FD,wBAAsB,eAAe,CACnC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,GACzD,OAAO,CAAC,MAAM,CAAC,CAEjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,OAAO,IAAI,eAAe,EAC1B,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAM9B,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG;IAClD,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IAErC,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,EAAE,OAAO,CAAC;IAErB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,qBAAa,iBAAiB;IACtB,8BAA8B,CAAC,EACnC,eAAoB,EACpB,OAAa,EACb,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;IAkFrD,MAAM,CAAC,GAAG,SAAe;YAEX,kBAAkB;YA6DlB,iBAAiB;YAgBjB,wBAAwB;CAiBvC;AAaD,wBAAsB,8BAA8B,CAAC,EACnD,eAAoB,EACpB,OAAa,EACb,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAOpD;AAED,wBAAsB,eAAe,CAAC,EACpC,eAAoB,EACpB,OAAa,EACb,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAS5C"}
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MongoDBDownloader = void 0;
6
7
  exports.downloadMongoDbWithVersionInfo = downloadMongoDbWithVersionInfo;
7
8
  exports.downloadMongoDb = downloadMongoDb;
8
9
  const node_fetch_1 = __importDefault(require("node-fetch"));
@@ -14,37 +15,107 @@ const decompress_1 = __importDefault(require("decompress"));
14
15
  const stream_1 = require("stream");
15
16
  const mongodb_download_url_1 = __importDefault(require("mongodb-download-url"));
16
17
  const debug_1 = __importDefault(require("debug"));
18
+ const with_lock_1 = require("./with-lock");
17
19
  const debug = (0, debug_1.default)('mongodb-downloader');
18
- async function downloadMongoDbWithVersionInfo(tmpdir, targetVersionSemverSpecifier = '*', options = {}) {
19
- let wantsEnterprise = options.enterprise ?? false;
20
- const isWindows = ['win32', 'windows'].includes(options.platform ?? process.platform);
21
- async function lookupDownloadUrl() {
20
+ class MongoDBDownloader {
21
+ async downloadMongoDbWithVersionInfo({ downloadOptions = {}, version = '*', directory, useLockfile, }) {
22
+ await fs_1.promises.mkdir(directory, { recursive: true });
23
+ const isWindows = ['win32', 'windows'].includes(downloadOptions.platform ?? process.platform);
24
+ const isCryptLibrary = !!downloadOptions.crypt_shared;
25
+ let isEnterprise = downloadOptions.enterprise ?? false;
26
+ let versionName = version;
27
+ if (/-enterprise$/.test(version)) {
28
+ isEnterprise = true;
29
+ version = version.replace(/-enterprise$/, '');
30
+ versionName = versionName.replace(/-enterprise$/, '');
31
+ }
32
+ if (versionName !== 'latest-alpha') {
33
+ versionName = versionName + (isEnterprise ? '-enterprise' : '-community');
34
+ }
35
+ const downloadTarget = path_1.default.resolve(directory, `mongodb-${process.platform}-${process.env.DISTRO_ID || 'none'}-${process.arch}-${versionName}`.replace(/[^a-zA-Z0-9_-]/g, ''));
36
+ const bindir = path_1.default.resolve(downloadTarget, isCryptLibrary && !isWindows ? 'lib' : 'bin');
37
+ return (async () => {
38
+ const artifactInfoFile = path_1.default.join(bindir, '.artifact_info');
39
+ const currentDownloadedFile = await this.getCurrentDownloadedFile({
40
+ bindir,
41
+ artifactInfoFile,
42
+ });
43
+ if (currentDownloadedFile) {
44
+ debug(`Skipping download because ${downloadTarget} exists`);
45
+ return currentDownloadedFile;
46
+ }
47
+ return await (useLockfile ? with_lock_1.withLock : withoutLock)(downloadTarget, async () => {
48
+ const downloadedFile = await this.getCurrentDownloadedFile({
49
+ bindir,
50
+ artifactInfoFile,
51
+ });
52
+ if (downloadedFile) {
53
+ debug(`Skipping download because ${downloadTarget} exists after waiting on lock`);
54
+ return downloadedFile;
55
+ }
56
+ await fs_1.promises.mkdir(downloadTarget, { recursive: true });
57
+ const artifactInfo = await this.lookupDownloadUrl({
58
+ targetVersion: version,
59
+ enterprise: isEnterprise,
60
+ options: downloadOptions,
61
+ });
62
+ const { url } = artifactInfo;
63
+ debug(`Downloading ${url} into ${downloadTarget}...`);
64
+ await this.downloadAndExtract({
65
+ url,
66
+ downloadTarget,
67
+ isCryptLibrary,
68
+ bindir,
69
+ });
70
+ await fs_1.promises.writeFile(artifactInfoFile, JSON.stringify(artifactInfo));
71
+ debug(`Download complete`, bindir);
72
+ return { ...artifactInfo, downloadedBinDir: bindir };
73
+ });
74
+ })();
75
+ }
76
+ async downloadAndExtract({ withExtraStripDepth = 0, downloadTarget, isCryptLibrary, bindir, url, }) {
77
+ const response = await (0, node_fetch_1.default)(url, {
78
+ highWaterMark: MongoDBDownloader.HWM,
79
+ });
80
+ if (/\.tgz$|\.tar(\.[^.]+)?$/.exec(url)) {
81
+ await (0, util_1.promisify)(stream_1.pipeline)(response.body, tar_1.default.x({ cwd: downloadTarget, strip: isCryptLibrary ? 0 : 1 }));
82
+ }
83
+ else {
84
+ const filename = path_1.default.join(downloadTarget, path_1.default.basename(new URL(url).pathname));
85
+ await (0, util_1.promisify)(stream_1.pipeline)(response.body, (0, fs_1.createWriteStream)(filename, { highWaterMark: MongoDBDownloader.HWM }));
86
+ debug(`Written file ${url} to ${filename}, extracting...`);
87
+ await (0, decompress_1.default)(filename, downloadTarget, {
88
+ strip: isCryptLibrary ? 0 : 1,
89
+ filter: (file) => path_1.default.extname(file.path) !== '.pdb',
90
+ });
91
+ }
92
+ try {
93
+ await fs_1.promises.stat(bindir);
94
+ }
95
+ catch (err) {
96
+ if (withExtraStripDepth === 0 && url.includes('macos')) {
97
+ console.info('Retry due to miscalculated --strip-components depth');
98
+ return await this.downloadAndExtract({
99
+ withExtraStripDepth: 1,
100
+ url,
101
+ downloadTarget,
102
+ isCryptLibrary,
103
+ bindir,
104
+ });
105
+ }
106
+ throw err;
107
+ }
108
+ }
109
+ async lookupDownloadUrl({ targetVersion, enterprise, options, }) {
22
110
  return await (0, mongodb_download_url_1.default)({
23
- version: targetVersionSemverSpecifier,
24
- enterprise: wantsEnterprise,
111
+ version: targetVersion,
112
+ enterprise,
25
113
  ...options,
26
114
  });
27
115
  }
28
- await fs_1.promises.mkdir(tmpdir, { recursive: true });
29
- if (targetVersionSemverSpecifier === 'latest-alpha') {
30
- return await doDownload(tmpdir, !!options.crypt_shared, 'latest-alpha', isWindows, lookupDownloadUrl);
31
- }
32
- if (/-enterprise$/.test(targetVersionSemverSpecifier)) {
33
- wantsEnterprise = true;
34
- targetVersionSemverSpecifier = targetVersionSemverSpecifier.replace(/-enterprise$/, '');
35
- }
36
- return await doDownload(tmpdir, !!options.crypt_shared, targetVersionSemverSpecifier +
37
- (wantsEnterprise ? '-enterprise' : '-community'), isWindows, () => lookupDownloadUrl());
38
- }
39
- const downloadPromises = Object.create(null);
40
- async function doDownload(tmpdir, isCryptLibrary, version, isWindows, lookupDownloadUrl) {
41
- const downloadTarget = path_1.default.resolve(tmpdir, `mongodb-${process.platform}-${process.env.DISTRO_ID || 'none'}-${process.arch}-${version}`.replace(/[^a-zA-Z0-9_-]/g, ''));
42
- return (downloadPromises[downloadTarget] ?? (downloadPromises[downloadTarget] = (async () => {
43
- const bindir = path_1.default.resolve(downloadTarget, isCryptLibrary && !isWindows ? 'lib' : 'bin');
44
- const artifactInfoFile = path_1.default.join(bindir, '.artifact_info');
116
+ async getCurrentDownloadedFile({ bindir, artifactInfoFile, }) {
45
117
  try {
46
118
  await fs_1.promises.stat(artifactInfoFile);
47
- debug(`Skipping download because ${downloadTarget} exists`);
48
119
  return {
49
120
  ...JSON.parse(await fs_1.promises.readFile(artifactInfoFile, 'utf8')),
50
121
  downloadedBinDir: bindir,
@@ -52,45 +123,28 @@ async function doDownload(tmpdir, isCryptLibrary, version, isWindows, lookupDown
52
123
  }
53
124
  catch {
54
125
  }
55
- await fs_1.promises.mkdir(downloadTarget, { recursive: true });
56
- const artifactInfo = await lookupDownloadUrl();
57
- const { url } = artifactInfo;
58
- debug(`Downloading ${url} into ${downloadTarget}...`);
59
- const HWM = 1024 * 1024;
60
- async function downloadAndExtract(withExtraStripDepth = 0) {
61
- const response = await (0, node_fetch_1.default)(url, {
62
- highWaterMark: HWM,
63
- });
64
- if (/\.tgz$|\.tar(\.[^.]+)?$/.exec(url)) {
65
- await (0, util_1.promisify)(stream_1.pipeline)(response.body, tar_1.default.x({ cwd: downloadTarget, strip: isCryptLibrary ? 0 : 1 }));
66
- }
67
- else {
68
- const filename = path_1.default.join(downloadTarget, path_1.default.basename(new URL(url).pathname));
69
- await (0, util_1.promisify)(stream_1.pipeline)(response.body, (0, fs_1.createWriteStream)(filename, { highWaterMark: HWM }));
70
- debug(`Written file ${url} to ${filename}, extracting...`);
71
- await (0, decompress_1.default)(filename, downloadTarget, {
72
- strip: isCryptLibrary ? 0 : 1,
73
- filter: (file) => path_1.default.extname(file.path) !== '.pdb',
74
- });
75
- }
76
- try {
77
- await fs_1.promises.stat(bindir);
78
- }
79
- catch (err) {
80
- if (withExtraStripDepth === 0 && url.includes('macos')) {
81
- console.info('Retry due to miscalculated --strip-components depth');
82
- return await downloadAndExtract(1);
83
- }
84
- throw err;
85
- }
86
- }
87
- await downloadAndExtract();
88
- await fs_1.promises.writeFile(artifactInfoFile, JSON.stringify(artifactInfo));
89
- debug(`Download complete`, bindir);
90
- return { ...artifactInfo, downloadedBinDir: bindir };
91
- })()));
126
+ }
127
+ }
128
+ exports.MongoDBDownloader = MongoDBDownloader;
129
+ MongoDBDownloader.HWM = 1024 * 1024;
130
+ async function withoutLock(bindir, callback) {
131
+ return await callback();
132
+ }
133
+ const downloader = new MongoDBDownloader();
134
+ async function downloadMongoDbWithVersionInfo({ downloadOptions = {}, version = '*', directory, useLockfile, }) {
135
+ return await downloader.downloadMongoDbWithVersionInfo({
136
+ downloadOptions,
137
+ version,
138
+ directory,
139
+ useLockfile,
140
+ });
92
141
  }
93
- async function downloadMongoDb(...args) {
94
- return (await downloadMongoDbWithVersionInfo(...args)).downloadedBinDir;
142
+ async function downloadMongoDb({ downloadOptions = {}, version = '*', directory, useLockfile, }) {
143
+ return (await downloader.downloadMongoDbWithVersionInfo({
144
+ downloadOptions,
145
+ version,
146
+ directory,
147
+ useLockfile,
148
+ })).downloadedBinDir;
95
149
  }
96
150
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAwOA,wEAYC;AAED,0CAcC;AAnQD,4DAA+B;AAC/B,8CAAsB;AACtB,+BAAiC;AACjC,2BAAuD;AACvD,gDAAwB;AACxB,4DAAoC;AACpC,mCAAkC;AAClC,gFAAkD;AAKlD,kDAAgC;AAChC,2CAAuC;AAEvC,MAAM,KAAK,GAAG,IAAA,eAAW,EAAC,oBAAoB,CAAC,CAAC;AAmBhD,MAAa,iBAAiB;IAC5B,KAAK,CAAC,8BAA8B,CAAC,EACnC,eAAe,GAAG,EAAE,EACpB,OAAO,GAAG,GAAG,EACb,SAAS,EACT,WAAW,GACc;QACzB,MAAM,aAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAC7C,eAAe,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAC7C,CAAC;QACF,MAAM,cAAc,GAAG,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC;QACtD,IAAI,YAAY,GAAG,eAAe,CAAC,UAAU,IAAI,KAAK,CAAC;QACvD,IAAI,WAAW,GAAG,OAAO,CAAC;QAE1B,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC9C,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;YACnC,WAAW,GAAG,WAAW,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,cAAc,GAAG,cAAI,CAAC,OAAO,CACjC,SAAS,EACT,WAAW,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,IAC5D,OAAO,CAAC,IACV,IAAI,WAAW,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CACjD,CAAC;QACF,MAAM,MAAM,GAAG,cAAI,CAAC,OAAO,CACzB,cAAc,EACd,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAC7C,CAAC;QAEF,OAAO,CAAC,KAAK,IAAI,EAAE;YACjB,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAG7D,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC;gBAChE,MAAM;gBACN,gBAAgB;aACjB,CAAC,CAAC;YACH,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,KAAK,CAAC,6BAA6B,cAAc,SAAS,CAAC,CAAC;gBAC5D,OAAO,qBAAqB,CAAC;YAC/B,CAAC;YAGD,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CACjD,cAAc,EACd,KAAK,IAAI,EAAE;gBAET,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC;oBACzD,MAAM;oBACN,gBAAgB;iBACjB,CAAC,CAAC;gBACH,IAAI,cAAc,EAAE,CAAC;oBACnB,KAAK,CACH,6BAA6B,cAAc,+BAA+B,CAC3E,CAAC;oBACF,OAAO,cAAc,CAAC;gBACxB,CAAC;gBAED,MAAM,aAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC;oBAChD,aAAa,EAAE,OAAO;oBACtB,UAAU,EAAE,YAAY;oBACxB,OAAO,EAAE,eAAe;iBACzB,CAAC,CAAC;gBACH,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;gBAC7B,KAAK,CAAC,eAAe,GAAG,SAAS,cAAc,KAAK,CAAC,CAAC;gBAEtD,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC5B,GAAG;oBACH,cAAc;oBACd,cAAc;oBACd,MAAM;iBACP,CAAC,CAAC;gBACH,MAAM,aAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;gBACnE,KAAK,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;gBACnC,OAAO,EAAE,GAAG,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;YACvD,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAIO,KAAK,CAAC,kBAAkB,CAAC,EAC/B,mBAAmB,GAAG,CAAC,EACvB,cAAc,EACd,cAAc,EACd,MAAM,EACN,GAAG,GAOJ;QACC,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE;YAChC,aAAa,EAAE,iBAAiB,CAAC,GAAG;SACN,CAAC,CAAC;QAClC,IAAI,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAGxC,MAAM,IAAA,gBAAS,EAAC,iBAAQ,CAAC,CACvB,QAAQ,CAAC,IAAI,EACb,aAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAC9D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CACxB,cAAc,EACd,cAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CACrC,CAAC;YACF,MAAM,IAAA,gBAAS,EAAC,iBAAQ,CAAC,CACvB,QAAQ,CAAC,IAAI,EACb,IAAA,sBAAiB,EAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CACtE,CAAC;YACF,KAAK,CAAC,gBAAgB,GAAG,OAAO,QAAQ,iBAAiB,CAAC,CAAC;YAC3D,MAAM,IAAA,oBAAU,EAAC,QAAQ,EAAE,cAAc,EAAE;gBACzC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM;aACrD,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,mBAAmB,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAMvD,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;gBACpE,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBACnC,mBAAmB,EAAE,CAAC;oBACtB,GAAG;oBACH,cAAc;oBACd,cAAc;oBACd,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,EAC9B,aAAa,EACb,UAAU,EACV,OAAO,GAKR;QACC,OAAO,MAAM,IAAA,8BAAc,EAAC;YAC1B,OAAO,EAAE,aAAa;YACtB,UAAU;YACV,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,EACrC,MAAM,EACN,gBAAgB,GAIjB;QACC,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChC,OAAO;gBACL,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,aAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;gBAC1D,gBAAgB,EAAE,MAAM;aACzB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;;AAvLH,8CAwLC;AAhGQ,qBAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAmG3B,KAAK,UAAU,WAAW,CACxB,MAAc,EACd,QAA0B;IAE1B,OAAO,MAAM,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAGpC,KAAK,UAAU,8BAA8B,CAAC,EACnD,eAAe,GAAG,EAAE,EACpB,OAAO,GAAG,GAAG,EACb,SAAS,EACT,WAAW,GACc;IACzB,OAAO,MAAM,UAAU,CAAC,8BAA8B,CAAC;QACrD,eAAe;QACf,OAAO;QACP,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,EACpC,eAAe,GAAG,EAAE,EACpB,OAAO,GAAG,GAAG,EACb,SAAS,EACT,WAAW,GACc;IACzB,OAAO,CACL,MAAM,UAAU,CAAC,8BAA8B,CAAC;QAC9C,eAAe;QACf,OAAO;QACP,SAAS;QACT,WAAW;KACZ,CAAC,CACH,CAAC,gBAAgB,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function withLock<T>(originalFilePath: string, cb: (signal: AbortSignal) => Promise<T>): Promise<T>;
2
+ //# sourceMappingURL=with-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-lock.d.ts","sourceRoot":"","sources":["../src/with-lock.ts"],"names":[],"mappings":"AASA,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,gBAAgB,EAAE,MAAM,EACxB,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,CAAC,CAgDZ"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.withLock = withLock;
7
+ const proper_lockfile_1 = __importDefault(require("proper-lockfile"));
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ async function withLock(originalFilePath, cb) {
10
+ const controller = new AbortController();
11
+ let release;
12
+ const lockFile = `${originalFilePath}/.mongodb-downloader-lock`;
13
+ await promises_1.default.mkdir(originalFilePath, { recursive: true });
14
+ await promises_1.default.writeFile(lockFile, '');
15
+ try {
16
+ release = await proper_lockfile_1.default.lock(lockFile, {
17
+ retries: {
18
+ retries: 100,
19
+ minTimeout: 100,
20
+ maxTimeout: 5000,
21
+ factor: 2,
22
+ },
23
+ stale: 100000,
24
+ onCompromised: () => {
25
+ controller.abort();
26
+ },
27
+ });
28
+ return await new Promise((resolve, reject) => {
29
+ controller.signal.addEventListener('abort', () => {
30
+ reject(new Error('Aborted by abort signal'));
31
+ });
32
+ void (async () => {
33
+ try {
34
+ resolve(await cb(controller.signal));
35
+ }
36
+ catch (err) {
37
+ reject(err);
38
+ }
39
+ })();
40
+ });
41
+ }
42
+ finally {
43
+ if (release) {
44
+ try {
45
+ await release();
46
+ }
47
+ catch (err) {
48
+ }
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=with-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-lock.js","sourceRoot":"","sources":["../src/with-lock.ts"],"names":[],"mappings":";;;;;AASA,4BAmDC;AA5DD,sEAAuC;AACvC,2DAA6B;AAQtB,KAAK,UAAU,QAAQ,CAC5B,gBAAwB,EACxB,EAAuC;IAEvC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,OAA0C,CAAC;IAE/C,MAAM,QAAQ,GAAG,GAAG,gBAAgB,2BAA2B,CAAC;IAGhE,MAAM,kBAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAGtD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,yBAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtC,OAAO,EAAE;gBACP,OAAO,EAAE,GAAG;gBACZ,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,CAAC;aACV;YACD,KAAK,EAAE,MAAO;YACd,aAAa,EAAE,GAAG,EAAE;gBAClB,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC/C,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC;oBACH,OAAO,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBACvC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;YAEf,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "email": "compass@mongodb.com"
14
14
  },
15
15
  "homepage": "https://github.com/mongodb-js/devtools-shared",
16
- "version": "0.5.0",
16
+ "version": "1.0.0",
17
17
  "repository": {
18
18
  "type": "git",
19
19
  "url": "https://github.com/mongodb-js/devtools-shared.git"
@@ -56,6 +56,7 @@
56
56
  "decompress": "^4.2.1",
57
57
  "mongodb-download-url": "^1.7.0",
58
58
  "node-fetch": "^2.7.0",
59
+ "proper-lockfile": "^4.1.2",
59
60
  "tar": "^6.1.15"
60
61
  },
61
62
  "devDependencies": {
@@ -63,18 +64,24 @@
63
64
  "@mongodb-js/mocha-config-devtools": "^1.0.5",
64
65
  "@mongodb-js/prettier-config-devtools": "^1.0.2",
65
66
  "@mongodb-js/tsconfig-devtools": "^1.0.4",
67
+ "@types/chai": "^4.2.21",
66
68
  "@types/debug": "^4.1.8",
67
69
  "@types/decompress": "^4.2.4",
68
70
  "@types/mocha": "^9.1.1",
69
71
  "@types/node": "^22.15.30",
72
+ "@types/proper-lockfile": "^4.1.4",
73
+ "@types/sinon-chai": "^3.2.5",
70
74
  "@types/tar": "^6.1.5",
75
+ "chai": "^4.5.0",
71
76
  "depcheck": "^1.4.7",
72
77
  "eslint": "^7.25.0",
73
78
  "gen-esm-wrapper": "^1.1.3",
74
79
  "mocha": "^8.4.0",
75
80
  "nyc": "^15.1.0",
76
81
  "prettier": "^3.5.3",
82
+ "sinon": "^9.2.3",
83
+ "sinon-chai": "^3.7.0",
77
84
  "typescript": "^5.0.4"
78
85
  },
79
- "gitHead": "5ee2b5c2e38aaef965394129dfae573d3c33c9f7"
86
+ "gitHead": "417692c25f4e605c333621b093819f0be131699f"
80
87
  }