bitcore-wallet-service
Version:
A service for Mutisig HD Bitcoin Wallets
65 lines • 2.4 kB
JavaScript
;
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