@storyous/mongodb 1.1.0 → 1.1.2
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 +28 -0
- package/lib/appData/index.d.ts +12 -12
- package/lib/appData/index.js +39 -39
- package/lib/concurrentTask.d.ts +9 -9
- package/lib/concurrentTask.js +19 -19
- package/lib/fixtures.d.ts +5 -5
- package/lib/fixtures.js +27 -27
- package/lib/getCollection.d.ts +3 -3
- package/lib/getCollection.js +8 -8
- package/lib/getCollection.ts +1 -1
- package/lib/getMongoConfig.d.ts +6 -0
- package/lib/getMongoConfig.js +69 -0
- package/lib/getMongoConfig.ts +60 -0
- package/lib/getMongoLocker.d.ts +10 -10
- package/lib/getMongoLocker.js +52 -52
- package/lib/global-bundle.pem +2876 -0
- package/lib/index.d.ts +12 -12
- package/lib/index.js +28 -28
- package/lib/migrations/Migration.d.ts +6 -6
- package/lib/migrations/Migration.js +21 -21
- package/lib/migrations/MigrationsStore.d.ts +13 -13
- package/lib/migrations/MigrationsStore.js +64 -64
- package/lib/migrations/runMigrations.d.ts +12 -12
- package/lib/migrations/runMigrations.js +49 -49
- package/lib/migrations/template.d.ts +3 -3
- package/lib/migrations/template.js +10 -10
- package/lib/mongoClient.d.ts +8 -8
- package/lib/mongoClient.js +17 -17
- package/lib/mongoErrorCodes.d.ts +6 -6
- package/lib/mongoErrorCodes.js +10 -10
- package/lib/mongoLocker.d.ts +3 -3
- package/lib/mongoLocker.js +16 -16
- package/lib/withTransaction.d.ts +3 -3
- package/lib/withTransaction.js +20 -20
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -16,6 +16,34 @@ const user = mongoClient.getClient().db('test').collection('users').find();
|
|
|
16
16
|
await mongoClient.getClient().close();
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
## Usage of getMongoConfig
|
|
20
|
+
|
|
21
|
+
``` typescript
|
|
22
|
+
import { getMongoConfig, mongoClient } from '@storyous/mongodb';
|
|
23
|
+
|
|
24
|
+
// Set following env variables:
|
|
25
|
+
// DOCUMENTDB_ENGINE="mongodb" (or "documentdb")
|
|
26
|
+
// DOCUMENTDB_ENDPOINT="127.0.0.1"
|
|
27
|
+
// DOCUMENTDB_PORT="27017"
|
|
28
|
+
// DOCUMENTDB_USER="user"
|
|
29
|
+
// DOCUMENTDB_PASSWORD="password"
|
|
30
|
+
|
|
31
|
+
// Get config
|
|
32
|
+
const config = {
|
|
33
|
+
database: {
|
|
34
|
+
...getMongoConfig(),
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Initialize and connect MongoDB
|
|
39
|
+
mongoClient.init(config.database.mongodbUrl, config.database.mongoOptions);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
You can also use custom prefix for environment variables (e.g. MY_DB_ENGINE, MY_DB_ENDPOINT, ...):
|
|
43
|
+
```typescript
|
|
44
|
+
getMongoConfig('MY_DB');
|
|
45
|
+
```
|
|
46
|
+
|
|
19
47
|
## Usage of MongoLocker
|
|
20
48
|
|
|
21
49
|
``` typescript
|
package/lib/appData/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Collection, InsertOneResult, WithId } from 'mongodb';
|
|
2
|
-
import { Key } from '../mongoClient';
|
|
3
|
-
declare const appData: {
|
|
4
|
-
readonly _collection: Collection<any>;
|
|
5
|
-
_failReads: number;
|
|
6
|
-
ensureDocumentExists(document: {
|
|
7
|
-
_id: Key;
|
|
8
|
-
}): Promise<Document | InsertOneResult | null>;
|
|
9
|
-
updateDocument(_id: Key, update: Object, upsert?: boolean): Promise<WithId<any | null>>;
|
|
10
|
-
getDocument(_id: Key): Promise<WithId<any | null>>;
|
|
11
|
-
};
|
|
12
|
-
export default appData;
|
|
1
|
+
import { Collection, InsertOneResult, WithId } from 'mongodb';
|
|
2
|
+
import { Key } from '../mongoClient';
|
|
3
|
+
declare const appData: {
|
|
4
|
+
readonly _collection: Collection<any>;
|
|
5
|
+
_failReads: number;
|
|
6
|
+
ensureDocumentExists(document: {
|
|
7
|
+
_id: Key;
|
|
8
|
+
}): Promise<Document | InsertOneResult | null>;
|
|
9
|
+
updateDocument(_id: Key, update: Object, upsert?: boolean): Promise<WithId<any | null>>;
|
|
10
|
+
getDocument(_id: Key): Promise<WithId<any | null>>;
|
|
11
|
+
};
|
|
12
|
+
export default appData;
|
package/lib/appData/index.js
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
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
|
-
const getCollection_1 = __importDefault(require("../getCollection"));
|
|
7
|
-
const mongoDuplicateKeyErrorCodes = [11000, 11001];
|
|
8
|
-
const appData = {
|
|
9
|
-
get _collection() {
|
|
10
|
-
return (0, getCollection_1.default)('appData');
|
|
11
|
-
},
|
|
12
|
-
_failReads: 0,
|
|
13
|
-
ensureDocumentExists(document) {
|
|
14
|
-
return this._collection
|
|
15
|
-
.insertOne(document)
|
|
16
|
-
.catch((err) => (new Promise((resolve, reject) => {
|
|
17
|
-
if (!mongoDuplicateKeyErrorCodes.includes(err.code)) {
|
|
18
|
-
reject(err);
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
resolve(null);
|
|
22
|
-
})));
|
|
23
|
-
},
|
|
24
|
-
updateDocument(_id, update, upsert = false) {
|
|
25
|
-
const query = { _id };
|
|
26
|
-
const options = {
|
|
27
|
-
returnOriginal: false,
|
|
28
|
-
upsert,
|
|
29
|
-
};
|
|
30
|
-
return this._collection
|
|
31
|
-
.findOneAndUpdate(query, update, options)
|
|
32
|
-
.then((result) => result.value);
|
|
33
|
-
},
|
|
34
|
-
getDocument(_id) {
|
|
35
|
-
const query = { _id };
|
|
36
|
-
return this._collection.findOne(query);
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
exports.default = appData;
|
|
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
|
+
const getCollection_1 = __importDefault(require("../getCollection"));
|
|
7
|
+
const mongoDuplicateKeyErrorCodes = [11000, 11001];
|
|
8
|
+
const appData = {
|
|
9
|
+
get _collection() {
|
|
10
|
+
return (0, getCollection_1.default)('appData');
|
|
11
|
+
},
|
|
12
|
+
_failReads: 0,
|
|
13
|
+
ensureDocumentExists(document) {
|
|
14
|
+
return this._collection
|
|
15
|
+
.insertOne(document)
|
|
16
|
+
.catch((err) => (new Promise((resolve, reject) => {
|
|
17
|
+
if (!mongoDuplicateKeyErrorCodes.includes(err.code)) {
|
|
18
|
+
reject(err);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
resolve(null);
|
|
22
|
+
})));
|
|
23
|
+
},
|
|
24
|
+
updateDocument(_id, update, upsert = false) {
|
|
25
|
+
const query = { _id };
|
|
26
|
+
const options = {
|
|
27
|
+
returnOriginal: false,
|
|
28
|
+
upsert,
|
|
29
|
+
};
|
|
30
|
+
return this._collection
|
|
31
|
+
.findOneAndUpdate(query, update, options)
|
|
32
|
+
.then((result) => result.value);
|
|
33
|
+
},
|
|
34
|
+
getDocument(_id) {
|
|
35
|
+
const query = { _id };
|
|
36
|
+
return this._collection.findOne(query);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
exports.default = appData;
|
|
40
40
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHFFQUE2QztBQUc3QyxNQUFNLDJCQUEyQixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRW5ELE1BQU0sT0FBTyxHQUFHO0lBRVosSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFBLHVCQUFhLEVBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFVBQVUsRUFBRSxDQUFDO0lBRWIsb0JBQW9CLENBQUUsUUFBc0I7UUFDeEMsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNsQixTQUFTLENBQUMsUUFBZSxDQUFDO2FBQzFCLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FDakIsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFWixPQUFPO2FBQ1Y7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0wsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGNBQWMsQ0FBRSxHQUFRLEVBQUUsTUFBYyxFQUFFLFNBQWtCLEtBQUs7UUFDN0QsTUFBTSxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0QixNQUFNLE9BQU8sR0FBRztZQUNaLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLE1BQU07U0FDVCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNsQixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQzthQUN4QyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsV0FBVyxDQUFFLEdBQVE7UUFDakIsTUFBTSxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FFSixDQUFDO0FBRUYsa0JBQWUsT0FBTyxDQUFDIn0=
|
package/lib/concurrentTask.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* noLaterThan = In what time by now should be the latest attempt executed
|
|
3
|
-
* startAttemptsDelay = Starting attempts delay
|
|
4
|
-
*/
|
|
5
|
-
declare const concurrentTask: <T>(task: () => Promise<T>, { noLaterThan, startAttemptsDelay }?: {
|
|
6
|
-
noLaterThan?: number | undefined;
|
|
7
|
-
startAttemptsDelay?: number | undefined;
|
|
8
|
-
}) => Promise<any>;
|
|
9
|
-
export default concurrentTask;
|
|
1
|
+
/**
|
|
2
|
+
* noLaterThan = In what time by now should be the latest attempt executed
|
|
3
|
+
* startAttemptsDelay = Starting attempts delay
|
|
4
|
+
*/
|
|
5
|
+
declare const concurrentTask: <T>(task: () => Promise<T>, { noLaterThan, startAttemptsDelay }?: {
|
|
6
|
+
noLaterThan?: number | undefined;
|
|
7
|
+
startAttemptsDelay?: number | undefined;
|
|
8
|
+
}) => Promise<any>;
|
|
9
|
+
export default concurrentTask;
|
package/lib/concurrentTask.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const errors_1 = require("@storyous/errors");
|
|
4
|
-
const attemptRecursive = async (task, startAttemptsDelay, latestTime, callNumber) => (task().catch(async (err) => {
|
|
5
|
-
if (errors_1.AppError.isConcurrentRequestError(err)) {
|
|
6
|
-
const nextCallDelay = startAttemptsDelay * (callNumber ** 2);
|
|
7
|
-
if ((Date.now() + nextCallDelay) < latestTime) {
|
|
8
|
-
await new Promise((resolve) => { setTimeout(resolve, nextCallDelay); });
|
|
9
|
-
return attemptRecursive(task, startAttemptsDelay, latestTime, ++callNumber);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
throw err;
|
|
13
|
-
}));
|
|
14
|
-
/**
|
|
15
|
-
* noLaterThan = In what time by now should be the latest attempt executed
|
|
16
|
-
* startAttemptsDelay = Starting attempts delay
|
|
17
|
-
*/
|
|
18
|
-
const concurrentTask = async (task, { noLaterThan = 2000, startAttemptsDelay = 50 } = {}) => (attemptRecursive(task, startAttemptsDelay, Date.now() + noLaterThan, 1));
|
|
19
|
-
exports.default = concurrentTask;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const errors_1 = require("@storyous/errors");
|
|
4
|
+
const attemptRecursive = async (task, startAttemptsDelay, latestTime, callNumber) => (task().catch(async (err) => {
|
|
5
|
+
if (errors_1.AppError.isConcurrentRequestError(err)) {
|
|
6
|
+
const nextCallDelay = startAttemptsDelay * (callNumber ** 2);
|
|
7
|
+
if ((Date.now() + nextCallDelay) < latestTime) {
|
|
8
|
+
await new Promise((resolve) => { setTimeout(resolve, nextCallDelay); });
|
|
9
|
+
return attemptRecursive(task, startAttemptsDelay, latestTime, ++callNumber);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
throw err;
|
|
13
|
+
}));
|
|
14
|
+
/**
|
|
15
|
+
* noLaterThan = In what time by now should be the latest attempt executed
|
|
16
|
+
* startAttemptsDelay = Starting attempts delay
|
|
17
|
+
*/
|
|
18
|
+
const concurrentTask = async (task, { noLaterThan = 2000, startAttemptsDelay = 50 } = {}) => (attemptRecursive(task, startAttemptsDelay, Date.now() + noLaterThan, 1));
|
|
19
|
+
exports.default = concurrentTask;
|
|
20
20
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY3VycmVudFRhc2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb25jdXJyZW50VGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUE0QztBQUU1QyxNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFDMUIsSUFBc0IsRUFDdEIsa0JBQTBCLEVBQzFCLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ04sRUFBRSxDQUFDLENBQ2YsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFVLEVBQUUsRUFBRTtJQUM5QixJQUFJLGlCQUFRLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDeEMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxhQUFhLENBQUMsR0FBRyxVQUFVLEVBQUU7WUFDM0MsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQy9FO0tBQ0o7SUFFRCxNQUFNLEdBQUcsQ0FBQztBQUNkLENBQUMsQ0FBQyxDQUNMLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQU0sSUFBc0IsRUFBRSxFQUFFLFdBQVcsR0FBRyxJQUFJLEVBQUUsa0JBQWtCLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUMvRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FDMUUsQ0FBQztBQUVGLGtCQUFlLGNBQWMsQ0FBQyJ9
|
package/lib/fixtures.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Collection, Document } from 'mongodb';
|
|
2
|
-
declare const fixtures: {
|
|
3
|
-
ensureInCollection(_fixtures: Document[], collection: Collection): Promise<any>;
|
|
4
|
-
};
|
|
5
|
-
export default fixtures;
|
|
1
|
+
import { Collection, Document } from 'mongodb';
|
|
2
|
+
declare const fixtures: {
|
|
3
|
+
ensureInCollection(_fixtures: Document[], collection: Collection): Promise<any>;
|
|
4
|
+
};
|
|
5
|
+
export default fixtures;
|
package/lib/fixtures.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const lodash_1 = require("lodash");
|
|
4
|
-
const fixtures = {
|
|
5
|
-
ensureInCollection(_fixtures, collection) {
|
|
6
|
-
const fixtureIds = [];
|
|
7
|
-
const objectMap = {};
|
|
8
|
-
_fixtures.forEach((object) => {
|
|
9
|
-
fixtureIds.push(object._id);
|
|
10
|
-
objectMap[object._id.toString()] = object;
|
|
11
|
-
});
|
|
12
|
-
return collection.find({ _id: { $in: fixtureIds } })
|
|
13
|
-
.toArray()
|
|
14
|
-
.then((existing) => {
|
|
15
|
-
existing.forEach((object) => {
|
|
16
|
-
const stringId = object._id.toString();
|
|
17
|
-
delete objectMap[stringId];
|
|
18
|
-
});
|
|
19
|
-
const filteredObjects = (0, lodash_1.toArray)(objectMap);
|
|
20
|
-
if (filteredObjects.length) {
|
|
21
|
-
return collection.insertMany(filteredObjects);
|
|
22
|
-
}
|
|
23
|
-
return Promise.resolve(null);
|
|
24
|
-
});
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
exports.default = fixtures;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lodash_1 = require("lodash");
|
|
4
|
+
const fixtures = {
|
|
5
|
+
ensureInCollection(_fixtures, collection) {
|
|
6
|
+
const fixtureIds = [];
|
|
7
|
+
const objectMap = {};
|
|
8
|
+
_fixtures.forEach((object) => {
|
|
9
|
+
fixtureIds.push(object._id);
|
|
10
|
+
objectMap[object._id.toString()] = object;
|
|
11
|
+
});
|
|
12
|
+
return collection.find({ _id: { $in: fixtureIds } })
|
|
13
|
+
.toArray()
|
|
14
|
+
.then((existing) => {
|
|
15
|
+
existing.forEach((object) => {
|
|
16
|
+
const stringId = object._id.toString();
|
|
17
|
+
delete objectMap[stringId];
|
|
18
|
+
});
|
|
19
|
+
const filteredObjects = (0, lodash_1.toArray)(objectMap);
|
|
20
|
+
if (filteredObjects.length) {
|
|
21
|
+
return collection.insertMany(filteredObjects);
|
|
22
|
+
}
|
|
23
|
+
return Promise.resolve(null);
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
exports.default = fixtures;
|
|
28
28
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaXh0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUFpQztBQUdqQyxNQUFNLFFBQVEsR0FBRztJQUNiLGtCQUFrQixDQUFFLFNBQXFCLEVBQUUsVUFBc0I7UUFDN0QsTUFBTSxVQUFVLEdBQWUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUE2QixFQUFFLENBQUM7UUFFL0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUNsQixFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUMvQjthQUNJLE9BQU8sRUFBRTthQUNULElBQUksQ0FDRCxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ1QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN4QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sZUFBZSxHQUFlLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQztZQUV2RCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNqRDtZQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNmLENBQUM7Q0FDSixDQUFDO0FBRUYsa0JBQWUsUUFBUSxDQUFDIn0=
|
package/lib/getCollection.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Collection } from 'mongodb';
|
|
2
|
-
declare const _default: <T extends Document = Document>(name: string) => Collection<T>;
|
|
3
|
-
export default _default;
|
|
1
|
+
import { Collection, Document } from 'mongodb';
|
|
2
|
+
declare const _default: <T extends Document = Document>(name: string) => Collection<T>;
|
|
3
|
+
export default _default;
|
package/lib/getCollection.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
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
|
-
const mongoClient_1 = __importDefault(require("./mongoClient"));
|
|
7
|
-
exports.default = (name) => mongoClient_1.default
|
|
8
|
-
.getClient().db().collection(name);
|
|
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
|
+
const mongoClient_1 = __importDefault(require("./mongoClient"));
|
|
7
|
+
exports.default = (name) => mongoClient_1.default
|
|
8
|
+
.getClient().db().collection(name);
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdldENvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxnRUFBd0M7QUFFeEMsa0JBQWUsQ0FBZ0MsSUFBWSxFQUFpQixFQUFFLENBQUMscUJBQVc7S0FDckYsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDIn0=
|
package/lib/getCollection.ts
CHANGED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const path = __importStar(require("path"));
|
|
27
|
+
const getEnv = (prefix, variable) => {
|
|
28
|
+
const value = process.env[`${prefix}_${variable}`];
|
|
29
|
+
if (value === undefined) {
|
|
30
|
+
throw new Error(`Environment variable "${prefix}_${variable}" missing.`);
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
};
|
|
34
|
+
exports.default = (envPrefix = 'DOCUMENTDB', database = null, mongoOptions = {}, documentDbOptions = {}) => {
|
|
35
|
+
const engine = getEnv(envPrefix, 'ENGINE');
|
|
36
|
+
const endpoint = getEnv(envPrefix, 'ENDPOINT');
|
|
37
|
+
const port = getEnv(envPrefix, 'PORT');
|
|
38
|
+
const username = getEnv(envPrefix, 'USERNAME');
|
|
39
|
+
const password = getEnv(envPrefix, 'PASSWORD');
|
|
40
|
+
if (engine === 'mongodb') {
|
|
41
|
+
return {
|
|
42
|
+
mongodbUrl: `mongodb://${username}:${password}@${endpoint}:${port}/${database || ''}?retryWrites=false`,
|
|
43
|
+
mongoOptions,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (engine === 'documentdb') {
|
|
47
|
+
return {
|
|
48
|
+
mongodbUrl: `mongodb://${endpoint}:${port}/${database || ''}?retryWrites=false`,
|
|
49
|
+
mongoOptions: {
|
|
50
|
+
...documentDbOptions,
|
|
51
|
+
tlsCAFile: path.resolve(__dirname, 'global-bundle.pem'),
|
|
52
|
+
tls: true,
|
|
53
|
+
auth: {
|
|
54
|
+
username,
|
|
55
|
+
password,
|
|
56
|
+
},
|
|
57
|
+
replicaSet: 'rs0',
|
|
58
|
+
connectTimeoutMS: 5000,
|
|
59
|
+
maxIdleTimeMS: 5000,
|
|
60
|
+
socketTimeoutMS: 5000,
|
|
61
|
+
waitQueueTimeoutMS: 5000,
|
|
62
|
+
wtimeoutMS: 5000,
|
|
63
|
+
serverSelectionTimeoutMS: 5000,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
throw new Error(`Invalid ${envPrefix}_ENGINE value "${engine}", values "mongodb" or "documentdb" allowed.`);
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0TW9uZ29Db25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnZXRNb25nb0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBTzdCLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBYyxFQUFFLFFBQWdCLEVBQVUsRUFBRTtJQUN4RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDbkQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE1BQU0sSUFBSSxRQUFRLFlBQVksQ0FBQyxDQUFDO0tBQzVFO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsa0JBQWUsQ0FDWCxZQUFvQixZQUFZLEVBQ2hDLFdBQXdCLElBQUksRUFDNUIsWUFBWSxHQUFHLEVBQUUsRUFDakIsaUJBQWlCLEdBQUcsRUFBRSxFQUNoQixFQUFFO0lBQ1IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtRQUN0QixPQUFPO1lBQ0gsVUFBVSxFQUFFLGFBQWEsUUFBUSxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxFQUFFLG9CQUFvQjtZQUN2RyxZQUFZO1NBQ2YsQ0FBQztLQUNMO0lBRUQsSUFBSSxNQUFNLEtBQUssWUFBWSxFQUFFO1FBQ3pCLE9BQU87WUFDSCxVQUFVLEVBQUUsYUFBYSxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxFQUFFLG9CQUFvQjtZQUMvRSxZQUFZLEVBQUU7Z0JBQ1YsR0FBRyxpQkFBaUI7Z0JBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQztnQkFDdkQsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsSUFBSSxFQUFFO29CQUNGLFFBQVE7b0JBQ1IsUUFBUTtpQkFDWDtnQkFDRCxVQUFVLEVBQUUsS0FBSztnQkFFakIsZ0JBQWdCLEVBQUUsSUFBSTtnQkFDdEIsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsd0JBQXdCLEVBQUUsSUFBSTthQUNqQztTQUNKLENBQUM7S0FDTDtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxTQUFTLGtCQUFrQixNQUFNLDhDQUE4QyxDQUFDLENBQUM7QUFDaEgsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
|
|
3
|
+
interface Config {
|
|
4
|
+
mongodbUrl: string,
|
|
5
|
+
mongoOptions: Record<string, any>,
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const getEnv = (prefix: string, variable: string): string => {
|
|
9
|
+
const value = process.env[`${prefix}_${variable}`];
|
|
10
|
+
if (value === undefined) {
|
|
11
|
+
throw new Error(`Environment variable "${prefix}_${variable}" missing.`);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return value;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default (
|
|
18
|
+
envPrefix: string = 'DOCUMENTDB',
|
|
19
|
+
database: string|null = null,
|
|
20
|
+
mongoOptions = {},
|
|
21
|
+
documentDbOptions = {},
|
|
22
|
+
): Config => {
|
|
23
|
+
const engine = getEnv(envPrefix, 'ENGINE');
|
|
24
|
+
const endpoint = getEnv(envPrefix, 'ENDPOINT');
|
|
25
|
+
const port = getEnv(envPrefix, 'PORT');
|
|
26
|
+
const username = getEnv(envPrefix, 'USERNAME');
|
|
27
|
+
const password = getEnv(envPrefix, 'PASSWORD');
|
|
28
|
+
|
|
29
|
+
if (engine === 'mongodb') {
|
|
30
|
+
return {
|
|
31
|
+
mongodbUrl: `mongodb://${username}:${password}@${endpoint}:${port}/${database || ''}?retryWrites=false`,
|
|
32
|
+
mongoOptions,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (engine === 'documentdb') {
|
|
37
|
+
return {
|
|
38
|
+
mongodbUrl: `mongodb://${endpoint}:${port}/${database || ''}?retryWrites=false`,
|
|
39
|
+
mongoOptions: {
|
|
40
|
+
...documentDbOptions,
|
|
41
|
+
tlsCAFile: path.resolve(__dirname, 'global-bundle.pem'),
|
|
42
|
+
tls: true,
|
|
43
|
+
auth: {
|
|
44
|
+
username,
|
|
45
|
+
password,
|
|
46
|
+
},
|
|
47
|
+
replicaSet: 'rs0',
|
|
48
|
+
|
|
49
|
+
connectTimeoutMS: 5000,
|
|
50
|
+
maxIdleTimeMS: 5000,
|
|
51
|
+
socketTimeoutMS: 5000,
|
|
52
|
+
waitQueueTimeoutMS: 5000,
|
|
53
|
+
wtimeoutMS: 5000,
|
|
54
|
+
serverSelectionTimeoutMS: 5000,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
throw new Error(`Invalid ${envPrefix}_ENGINE value "${engine}", values "mongodb" or "documentdb" allowed.`);
|
|
60
|
+
};
|
package/lib/getMongoLocker.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Collection } from 'mongodb';
|
|
2
|
-
import { Key } from './mongoClient';
|
|
3
|
-
export declare type LockCallback<T> = () => Promise<T>;
|
|
4
|
-
export declare type LockerOptions = {
|
|
5
|
-
noLaterThan?: number;
|
|
6
|
-
startAttemptsDelay?: number;
|
|
7
|
-
expireIn?: number;
|
|
8
|
-
};
|
|
9
|
-
declare const _default: (collection: Collection) => Promise<(<T>(key: Key, callback: LockCallback<T>, { noLaterThan, startAttemptsDelay, expireIn }?: LockerOptions) => Promise<T>)>;
|
|
10
|
-
export default _default;
|
|
1
|
+
import { Collection } from 'mongodb';
|
|
2
|
+
import { Key } from './mongoClient';
|
|
3
|
+
export declare type LockCallback<T> = () => Promise<T>;
|
|
4
|
+
export declare type LockerOptions = {
|
|
5
|
+
noLaterThan?: number;
|
|
6
|
+
startAttemptsDelay?: number;
|
|
7
|
+
expireIn?: number;
|
|
8
|
+
};
|
|
9
|
+
declare const _default: (collection: Collection) => Promise<(<T>(key: Key, callback: LockCallback<T>, { noLaterThan, startAttemptsDelay, expireIn }?: LockerOptions) => Promise<T>)>;
|
|
10
|
+
export default _default;
|
package/lib/getMongoLocker.js
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
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
|
-
const errors_1 = require("@storyous/errors");
|
|
7
|
-
const mongodb_1 = require("mongodb");
|
|
8
|
-
const concurrentTask_1 = __importDefault(require("./concurrentTask"));
|
|
9
|
-
const mongoErrorCodes_1 = __importDefault(require("./mongoErrorCodes"));
|
|
10
|
-
const _removeDeprecatedIndex = async (collection) => {
|
|
11
|
-
const collectionStats = await collection.stats();
|
|
12
|
-
if (collectionStats.indexDetails?.acquiredAt_1) {
|
|
13
|
-
await collection.dropIndex('acquiredAt_1');
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
exports.default = async (collection) => {
|
|
17
|
-
await _removeDeprecatedIndex(collection);
|
|
18
|
-
await collection.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 });
|
|
19
|
-
return async (key, callback, { noLaterThan = 1000, startAttemptsDelay = 50, expireIn = 120000 } = {}) => {
|
|
20
|
-
const lockId = new mongodb_1.ObjectId();
|
|
21
|
-
const releaseLock = () => collection.deleteOne({ _id: key, lockId });
|
|
22
|
-
const acquireLock = async () => {
|
|
23
|
-
try {
|
|
24
|
-
const now = new Date();
|
|
25
|
-
/**
|
|
26
|
-
* 3 possible situations
|
|
27
|
-
* a) There is no lock -> upsert will create the document
|
|
28
|
-
* b) There is an expired lock -> expiresAt: { $lte: now } will match and the document will be replaced
|
|
29
|
-
* c) There is an unexpired lock -> expiresAt: { $lte: now } will not match,
|
|
30
|
-
* database will try to insert the new one, but it will fail on duplicate key (_id) error
|
|
31
|
-
*/
|
|
32
|
-
await collection.replaceOne({ _id: key, expiresAt: { $lte: now } },
|
|
33
|
-
// replaceOne will use the _id from filter parameter when inserting new document
|
|
34
|
-
{ lockId, expiresAt: new Date(now.getTime() + expireIn) }, { upsert: true });
|
|
35
|
-
}
|
|
36
|
-
catch (err) {
|
|
37
|
-
if (mongoErrorCodes_1.default.DUPLICATE_KEY.includes(err.code)) {
|
|
38
|
-
throw errors_1.AppError.concurrentRequest('The lock is already acquired.');
|
|
39
|
-
}
|
|
40
|
-
await releaseLock(); // the lock could be possible acquired
|
|
41
|
-
throw err;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
await (0, concurrentTask_1.default)(acquireLock, { noLaterThan, startAttemptsDelay });
|
|
45
|
-
try {
|
|
46
|
-
return await callback();
|
|
47
|
-
}
|
|
48
|
-
finally {
|
|
49
|
-
await releaseLock();
|
|
50
|
-
}
|
|
51
|
-
};
|
|
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
|
+
const errors_1 = require("@storyous/errors");
|
|
7
|
+
const mongodb_1 = require("mongodb");
|
|
8
|
+
const concurrentTask_1 = __importDefault(require("./concurrentTask"));
|
|
9
|
+
const mongoErrorCodes_1 = __importDefault(require("./mongoErrorCodes"));
|
|
10
|
+
const _removeDeprecatedIndex = async (collection) => {
|
|
11
|
+
const collectionStats = await collection.stats();
|
|
12
|
+
if (collectionStats.indexDetails?.acquiredAt_1) {
|
|
13
|
+
await collection.dropIndex('acquiredAt_1');
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
exports.default = async (collection) => {
|
|
17
|
+
await _removeDeprecatedIndex(collection);
|
|
18
|
+
await collection.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 });
|
|
19
|
+
return async (key, callback, { noLaterThan = 1000, startAttemptsDelay = 50, expireIn = 120000 } = {}) => {
|
|
20
|
+
const lockId = new mongodb_1.ObjectId();
|
|
21
|
+
const releaseLock = () => collection.deleteOne({ _id: key, lockId });
|
|
22
|
+
const acquireLock = async () => {
|
|
23
|
+
try {
|
|
24
|
+
const now = new Date();
|
|
25
|
+
/**
|
|
26
|
+
* 3 possible situations
|
|
27
|
+
* a) There is no lock -> upsert will create the document
|
|
28
|
+
* b) There is an expired lock -> expiresAt: { $lte: now } will match and the document will be replaced
|
|
29
|
+
* c) There is an unexpired lock -> expiresAt: { $lte: now } will not match,
|
|
30
|
+
* database will try to insert the new one, but it will fail on duplicate key (_id) error
|
|
31
|
+
*/
|
|
32
|
+
await collection.replaceOne({ _id: key, expiresAt: { $lte: now } },
|
|
33
|
+
// replaceOne will use the _id from filter parameter when inserting new document
|
|
34
|
+
{ lockId, expiresAt: new Date(now.getTime() + expireIn) }, { upsert: true });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
if (mongoErrorCodes_1.default.DUPLICATE_KEY.includes(err.code)) {
|
|
38
|
+
throw errors_1.AppError.concurrentRequest('The lock is already acquired.');
|
|
39
|
+
}
|
|
40
|
+
await releaseLock(); // the lock could be possible acquired
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
await (0, concurrentTask_1.default)(acquireLock, { noLaterThan, startAttemptsDelay });
|
|
45
|
+
try {
|
|
46
|
+
return await callback();
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await releaseLock();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
53
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0TW9uZ29Mb2NrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnZXRNb25nb0xvY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUM1QyxxQ0FBK0M7QUFDL0Msc0VBQThDO0FBRTlDLHdFQUFnRDtBQVVoRCxNQUFNLHNCQUFzQixHQUFHLEtBQUssRUFBRSxVQUFzQixFQUFFLEVBQUU7SUFDNUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakQsSUFBSSxlQUFlLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtRQUM1QyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDOUM7QUFDTCxDQUFDLENBQUM7QUFFRixrQkFBZSxLQUFLLEVBQUUsVUFBc0IsRUFBRSxFQUFFO0lBRTVDLE1BQU0sc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUUxRSxPQUFPLEtBQUssRUFDUixHQUFRLEVBQ1IsUUFBeUIsRUFDekIsRUFBRSxXQUFXLEdBQUcsSUFBSSxFQUFFLGtCQUFrQixHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsTUFBTSxLQUFvQixFQUFFLEVBQzVFLEVBQUU7UUFFWixNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFRLEVBQUUsQ0FBQztRQUU5QixNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTVFLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzNCLElBQUk7Z0JBQ0EsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkI7Ozs7OzttQkFNRztnQkFDSCxNQUFNLFVBQVUsQ0FBQyxVQUFVLENBQ3ZCLEVBQUUsR0FBRyxFQUFFLEdBQVUsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzdDLGdGQUFnRjtnQkFDaEYsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxFQUN6RCxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FDbkIsQ0FBQzthQUNMO1lBQUMsT0FBTyxHQUFPLEVBQUU7Z0JBQ2QsSUFBSSx5QkFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsRCxNQUFNLGlCQUFRLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUMsQ0FBQztpQkFDckU7Z0JBQ0QsTUFBTSxXQUFXLEVBQUUsQ0FBQyxDQUFDLHNDQUFzQztnQkFDM0QsTUFBTSxHQUFHLENBQUM7YUFDYjtRQUNMLENBQUMsQ0FBQztRQUVGLE1BQU0sSUFBQSx3QkFBYyxFQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFFdkUsSUFBSTtZQUNBLE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQztTQUUzQjtnQkFBUztZQUNOLE1BQU0sV0FBVyxFQUFFLENBQUM7U0FDdkI7SUFDTCxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMifQ==
|