ad-promise
Version:
This is a fork of the gheeres node-activedirectory. It fixes some issues with timeouts with very large AD-Groups as well as returning also promises so you won't have to use callbacks
140 lines (125 loc) • 4.17 kB
JavaScript
var _ = require('underscore');
// [attribute];range=[low]-[high]
// matching: 1 = name, 2 = low, 3 = high
var pattern = '^([^;]+);range=(\\d+)-(.+)?$';
/**
* Parses the range retrieval specifier into an object.
*
* @private
* @param {String} range The range retrieval specifier to parse.
* @returns {RangeRetrievalSpecifier}
*/
function parseRangeRetrievalSpecifierAttribute(attribute) {
var re = new RegExp(pattern, 'i');
var match = re.exec(attribute);
return({
attributeName: match[1],
low: parseInt(match[2]),
high: parseInt(match[3]) || null
});
};
/**
* Multi-valued attribute range retreival specifier.
*
* @private
* @constructor
* @param {String|Object} attribute The actual attribute name. May also contain a full range retrieval specifier for parsing. (i.e. [attribute];range=[low]-[high]). Optionally an object can be specified.
* @returns {RangeRetrievalSpecifierAttribute}
*/
var RangeRetrievalSpecifierAttribute = function(attribute) {
if (this instanceof RangeRetrievalSpecifierAttribute) {
if (! attribute) throw new Error('No attribute provided to create a range retrieval specifier.');
if (typeof(attribute) === 'string') {
attribute = parseRangeRetrievalSpecifierAttribute(attribute);
}
for(var property in attribute) {
if (Array.prototype.hasOwnProperty.call(attribute, property)) {
this[property] = attribute[property];
}
}
}
else {
return(new RangeRetrievalSpecifierAttribute(attribute));
}
}
/**
* Gets the next range retrieval specifier for a query.
*
* @private
* @returns {String}
*/
RangeRetrievalSpecifierAttribute.prototype.next = function next() {
var self = this;
if ((self.high != null) && (self.high != self.low)) {
var low = self.low;
var high = self.high;
self.low = high + 1;
self.high = high + (high - low) + 1;
return(this);
}
return(null);
}
/**
* Checks to see if the range specifier has been exhausted or completed.
*
* @private
* @returns {Boolean}
*/
RangeRetrievalSpecifierAttribute.prototype.isComplete = function isComplete() {
var self = this;
return((self.high == null) || (typeof(self.high) === 'undefined'));
}
/**
* Gets the string representation of the range retrieval specifier.
*
* @private
* @returns {String}
*/
RangeRetrievalSpecifierAttribute.prototype.toString = function toString() {
var self = this;
return(self.attributeName + ';range=' + self.low + '-' + (self.high ? self.high : '*'));
}
/**
* Retrieves all of the attributes which have range attributes specified.
*
* @private
* @static
* @param {Object} item The value to extract the range retrieval attributes from.
* @returns {Array[RangeRetrievalSpecifierAttribute]}
*/
RangeRetrievalSpecifierAttribute.prototype.getRangeAttributes = function getRangeAttributes(item) {
var attributes = [];
for(var attribute in (item || {})) {
if (RangeRetrievalSpecifierAttribute.prototype.isRangeAttribute(attribute)) {
var range = new RangeRetrievalSpecifierAttribute(attribute);
attributes.push(range);
}
}
return(attributes.length > 0 ? attributes : null);
};
/**
* Checks to see if the specified attribute is a range retrieval attribute.
*
* @private
* @static
* @param {String} attribute The attribute to inspect.
* @returns {Boolean}
*/
RangeRetrievalSpecifierAttribute.prototype.isRangeAttribute = function isRangeAttribute(attribute) {
var re = new RegExp(pattern, 'i');
return(re.test(attribute));
};
/**
* Checks to see if the specified object has any range retrieval attributes.
*
* @private
* @static
* @param {Object} item The value to check for range retrieval specifiers.
* @returns {Boolean}
*/
RangeRetrievalSpecifierAttribute.prototype.hasRangeAttributes = function hasRangeAttributes(item) {
return(_.any(_.keys(item || {}), function(attribute) {
return(RangeRetrievalSpecifierAttribute.prototype.isRangeAttribute(attribute));
}));
};
module.exports = RangeRetrievalSpecifierAttribute;