"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.withTimeout = void 0; var tslib_1 = require("tslib"); var errors_1 = require("./errors"); // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types function withTimeout(sync, timeout, timeoutError) { var _this = this; if (timeoutError === void 0) { timeoutError = errors_1.E_TIMEOUT; } return { acquire: function () { return new Promise(function (resolve, reject) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var isTimeout, handle, ticket, release, e_1; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: isTimeout = false; handle = setTimeout(function () { isTimeout = true; reject(timeoutError); }, timeout); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, sync.acquire()]; case 2: ticket = _a.sent(); if (isTimeout) { release = Array.isArray(ticket) ? ticket[1] : ticket; release(); } else { clearTimeout(handle); resolve(ticket); } return [3 /*break*/, 4]; case 3: e_1 = _a.sent(); if (!isTimeout) { clearTimeout(handle); reject(e_1); } return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }); }, runExclusive: function (callback) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var release, ticket; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: release = function () { return undefined; }; _a.label = 1; case 1: _a.trys.push([1, , 7, 8]); return [4 /*yield*/, this.acquire()]; case 2: ticket = _a.sent(); if (!Array.isArray(ticket)) return [3 /*break*/, 4]; release = ticket[1]; return [4 /*yield*/, callback(ticket[0])]; case 3: return [2 /*return*/, _a.sent()]; case 4: release = ticket; return [4 /*yield*/, callback()]; case 5: return [2 /*return*/, _a.sent()]; case 6: return [3 /*break*/, 8]; case 7: release(); return [7 /*endfinally*/]; case 8: return [2 /*return*/]; } }); }); }, /** @deprecated Deprecated in 0.3.0, will be removed in 0.4.0. Use runExclusive instead. */ release: function () { sync.release(); }, cancel: function () { return sync.cancel(); }, waitForUnlock: function () { return sync.waitForUnlock(); }, isLocked: function () { return sync.isLocked(); }, }; } exports.withTimeout = withTimeout;