UNPKG

bitcore-wallet-service

Version:
65 lines 2.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Lock = void 0; const lodash_1 = __importDefault(require("lodash")); const common_1 = require("./common"); const errordefinitions_1 = require("./errors/errordefinitions"); const $ = require('preconditions').singleton(); const Defaults = common_1.Common.Defaults; const ACQUIRE_RETRY_STEP = 50; class Lock { constructor(storage, opts = {}) { opts = opts || {}; this.storage = storage; } acquire(token, opts, cb, timeLeft) { opts = opts || {}; opts.lockTime = opts.lockTime || Defaults.LOCK_EXE_TIME; this.storage.acquireLock(token, Date.now() + opts.lockTime, err => { if (err && err.message && err.message.indexOf('E11000 ') !== -1) { this.storage.clearExpiredLock(token, () => { }); if (timeLeft < 0) { return cb('LOCKED'); } if (!lodash_1.default.isUndefined(opts.waitTime)) { if (lodash_1.default.isUndefined(timeLeft)) { timeLeft = opts.waitTime; } else { timeLeft -= ACQUIRE_RETRY_STEP; } } return setTimeout(this.acquire.bind(this, token, opts, cb, timeLeft), ACQUIRE_RETRY_STEP); } else if (err) { return cb(err); } else { return cb(null, icb => { if (!icb) icb = () => { }; this.storage.releaseLock(token, icb); }); } }); } runLocked(token, opts, cb, task) { $.shouldBeDefined(token, 'Failed state: token undefined at <runLocked()>'); this.acquire(token, opts, (err, release) => { if (err == 'LOCKED') return cb(errordefinitions_1.Errors.WALLET_BUSY); if (err) return cb(err); const _cb = function () { cb.apply(null, arguments); release(); }; task(_cb); }); } } exports.Lock = Lock; //# sourceMappingURL=lock.js.map