async-lock
Advanced tools
Comparing version 1.2.3 to 1.2.4
1.2.4 | ||
================== | ||
* Be robust to lock names that are also Object keys - simpler solution, extra tests. | ||
1.2.3 | ||
@@ -3,0 +7,0 @@ ================== |
'use strict'; | ||
// Small Map polyfill to remain ES5-compatible as requested in issue #21 while also solving PR #30 | ||
var MapPolyfill = function () { | ||
this.elements = []; | ||
this.size = 0; | ||
}; | ||
MapPolyfill.prototype.has = function (key) { | ||
var i; | ||
for (i = 0; i < this.elements.length; ++i) { | ||
if (this.elements[i].key === key) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
}; | ||
MapPolyfill.prototype.get = function (key) { | ||
var i; | ||
for (i = 0; i < this.elements.length; ++i) { | ||
if (this.elements[i].key === key) { | ||
return this.elements[i].value; | ||
} | ||
} | ||
return false; | ||
}; | ||
MapPolyfill.prototype.set = function (key, value) { | ||
var i; | ||
for (i = 0; i < this.elements.length; ++i) { | ||
if (this.elements[i].key === key) { | ||
this.elements[i].value = value; | ||
return; | ||
} | ||
} | ||
this.elements.push({ key: key, value: value }); | ||
this.size++; | ||
}; | ||
MapPolyfill.prototype.delete = function (key) { | ||
var i; | ||
for (i = 0; i < this.elements.length; ++i) { | ||
if (this.elements[i].key === key) { | ||
this.elements.splice(i, 1); | ||
this.size--; | ||
return; | ||
} | ||
} | ||
}; | ||
var AsyncLock = function (opts) { | ||
@@ -59,7 +9,7 @@ opts = opts || {}; | ||
// format: {key : [fn, fn]} | ||
// queues.has(key) indicates job running for key | ||
this.queues = new MapPolyfill(); | ||
// queues[key] = null indicates no job running for key | ||
this.queues = Object.create(null); | ||
// domain of current running func {key : fn} | ||
this.domains = new MapPolyfill(); | ||
this.domains = Object.create(null); | ||
@@ -117,6 +67,6 @@ // lock is reentrant for same domain | ||
if (locked) { | ||
if (self.queues.get(key).length === 0) { | ||
self.queues.delete(key); | ||
if (self.queues[key].length === 0) { | ||
delete self.queues[key]; | ||
} | ||
self.domains.delete(key); | ||
delete self.domains[key]; | ||
} | ||
@@ -144,4 +94,4 @@ | ||
//run next func | ||
if (self.queues.has(key) && self.queues.get(key).length > 0) { | ||
self.queues.get(key).shift()(); | ||
if (!!self.queues[key] && self.queues[key].length > 0) { | ||
self.queues[key].shift()(); | ||
} | ||
@@ -162,3 +112,3 @@ } | ||
if (locked) { | ||
self.domains.set(key, process.domain); | ||
self.domains[key] = process.domain; | ||
} | ||
@@ -192,7 +142,7 @@ | ||
if (!self.queues.has(key)) { | ||
self.queues.set(key, []); | ||
if (!self.queues[key]) { | ||
self.queues[key] = []; | ||
exec(true); | ||
} | ||
else if (self.domainReentrant && !!process.domain && process.domain === self.domains.get(key)) { | ||
else if (self.domainReentrant && !!process.domain && process.domain === self.domains[key]) { | ||
// If code is in the same domain of current running task, run it directly | ||
@@ -202,4 +152,4 @@ // Since lock is re-enterable | ||
} | ||
else if (self.queues.get(key).length >= self.maxPending) { | ||
done(false, new Error('Too many pending tasks')); | ||
else if (self.queues[key].length >= self.maxPending) { | ||
done(false, new Error('Too much pending tasks')); | ||
} | ||
@@ -211,5 +161,5 @@ else { | ||
if (opts.skipQueue) { | ||
self.queues.get(key).unshift(taskFn); | ||
self.queues[key].unshift(taskFn); | ||
} else { | ||
self.queues.get(key).push(taskFn); | ||
self.queues[key].push(taskFn); | ||
} | ||
@@ -294,6 +244,6 @@ | ||
if (!key) { | ||
return this.queues.size > 0; | ||
return Object.keys(this.queues).length > 0; | ||
} | ||
else { | ||
return this.queues.has(key); | ||
return !!this.queues[key]; | ||
} | ||
@@ -300,0 +250,0 @@ }; |
{ | ||
"name": "async-lock", | ||
"description": "Lock on asynchronous code", | ||
"version": "1.2.3", | ||
"version": "1.2.4", | ||
"author": { | ||
@@ -6,0 +6,0 @@ "name": "Rogier Schouten", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
14399
226