gitlab-ci-local
Version:
Tired of pushing to test your .gitlab-ci.yml?
20 lines • 2.42 kB
JavaScript
export class Mutex {
static locks = new Set();
static async waitForLock(key) {
return new Promise((resolve) => {
const intervalKey = setInterval(() => {
if (!Mutex.locks.has(key)) {
clearInterval(intervalKey);
return resolve();
}
}, 10);
});
}
static async exclusive(key, cb) {
await Mutex.waitForLock(key);
Mutex.locks.add(key);
await cb();
Mutex.locks.delete(key);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0ZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtdXRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sS0FBSztJQUVOLE1BQU0sQ0FBVSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVsQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBRSxHQUFXO1FBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNqQyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMzQixPQUFPLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixDQUFDO1lBQ0wsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUUsR0FBVyxFQUFFLEVBQXVCO1FBQ3hELE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBNdXRleCB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2NrcyA9IG5ldyBTZXQoKTtcblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIHdhaXRGb3JMb2NrIChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGludGVydmFsS2V5ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghTXV0ZXgubG9ja3MuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZXhjbHVzaXZlIChrZXk6IHN0cmluZywgY2I6ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgYXdhaXQgTXV0ZXgud2FpdEZvckxvY2soa2V5KTtcbiAgICAgICAgTXV0ZXgubG9ja3MuYWRkKGtleSk7XG4gICAgICAgIGF3YWl0IGNiKCk7XG4gICAgICAgIE11dGV4LmxvY2tzLmRlbGV0ZShrZXkpO1xuICAgIH1cblxufVxuIl19