diff --git a/Gruntfile.js b/Gruntfile.js
index a24f35902..643083cd9 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -12,9 +12,8 @@ module.exports = function (grunt) {
banner: '/*! <%= package.name %> - v<%= package.version %> - ' +
'<%= grunt.template.today("yyyy-mm-dd") %>\n' +
'<%= package.homepage ? " * " + package.homepage + "\\n" : "" %>' +
- ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= package.author.name %>;' +
- ' Licensed <%= package.license %> */\n' +
- ' // built using browserify\n\n'
+ ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= package.author.company %>;' +
+ ' Licensed <%= package.license %> */\n'
}
}
});
diff --git a/README.md b/README.md
index d3bf63d37..0d8bd844c 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ We also provide builds of the elasticsearch.js client for use in the browser. If
- [Quick Start](http://spenceralger.github.io/elasticsearch-js/index.html#quick-start)
- [API](http://spenceralger.github.io/elasticsearch-js/api.html)
- [Configuration](http://spenceralger.github.io/elasticsearch-js/index.html#configuration)
- - [Development/Contributions](http://spenceralger.github.io/elasticsearch-js/index.html#dev)
+ - [Development/Contributing](http://spenceralger.github.io/elasticsearch-js/index.html#dev)
- [Extending Core Components](http://spenceralger.github.io/elasticsearch-js/index.html#extending)
- [Logging](http://spenceralger.github.io/elasticsearch-js/index.html#logging)
diff --git a/grunt/config/mocha.js b/grunt/config/mocha.js
deleted file mode 100644
index 6a180debc..000000000
--- a/grunt/config/mocha.js
+++ /dev/null
@@ -1,8 +0,0 @@
-module.exports = {
- unit: {
- src: ['test/unit/test_*.js'],
- reporter: 'XUnit',
- dest: './test-output-phantom-unit.xml',
- run: true
- }
-};
\ No newline at end of file
diff --git a/grunt/config/watch.js b/grunt/config/watch.js
new file mode 100644
index 000000000..44bbb17f7
--- /dev/null
+++ b/grunt/config/watch.js
@@ -0,0 +1,15 @@
+module.exports = {
+ source: {
+ files: [
+ 'src/**/*.js',
+ 'test/unit/**/*.js',
+ 'grunt/**/*.js',
+ 'Gruntfile.js'
+ ],
+ interrupt: true,
+ tasks: [
+ // 'jshint',
+ 'run:unit_tests'
+ ]
+ }
+};
\ No newline at end of file
diff --git a/package.json b/package.json
index c4841afe9..8d2d2a1b8 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,7 @@
"mocha-lcov-reporter": "0.0.1",
"blanket": "~1.1.5",
"sinon": "~1.7.3",
- "nock": "git://github.com/spenceralger/nock.git#f28dc3c973651830b930793932b4006577260dc1",
+ "nock": "git://github.com/spenceralger/nock.git#5218548233983c594da5535bc07e7db36841987e",
"open": "0.0.4",
"testling": "git://github.com/spenceralger/testling.git",
"load-grunt-tasks": "~0.2.0",
@@ -64,7 +64,7 @@
},
"scripts": {
"test": "grunt test",
- "coverage": "mocha test/unit/test_*.js --require blanket -R html-cov > coverage.html && open -a \"Google Chrome\"./coverage.html",
+ "coverage": "mocha test/unit/test_*.js --require blanket -R html-cov > coverage.html && open -a \"Google Chrome\" ./coverage.html",
"blanket": {
"pattern": "src"
}
diff --git a/scripts/export_docs.js b/scripts/export_docs.js
deleted file mode 100644
index f8dadb8ae..000000000
--- a/scripts/export_docs.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var path = require('path');
-
-var argv = require('optimist')
- .default({
- outputDir: '.',
- verbose: false
- })
- .alias({
- o: 'outputDir',
- v: 'verbose'
- })
- .argv;
-
-require('./_steps')(argv, [
- ['runInModule', {
- cmd: 'node',
- args: ['scripts/generate', '--force']
- }],
- ['copy', {
- from: path.join(__dirname, '../docs/_methods.jade'),
- to: path.join(argv.outputDir, '_methods.jade')
- }],
- ['copy', {
- from: path.join(__dirname, '../docs/_method_list.jade'),
- to: path.join(argv.outputDir, '_method_list.jade')
- }]
-]);
-
-// function runInModule(cmd, args, exitCb) {
-// log('running', cmd, args.join(' '));
-
-// var proc = cp.spawn(cmd, args, {
-// stdio: argv.verbose ? 'inherit' : 'ignore'
-// });
-
-// proc.on('error', function (err) {
-// console.error('Error! --', err.message);
-// process.exit(1);
-// });
-
-// proc.on('exit', function (status) {
-// if (status) {
-// console.error('Error! --', cmd, 'exit status was', status);
-// process.exit(1);
-// } else {
-// exitCb();
-// }
-// });
-// }
-
-// function copy(from, to, done) {
-// log('copying', from, 'to', to);
-
-// var read = fs.createReadStream(from);
-// var write = fs.createWriteStream(to);
-
-// read.pipe(write);
-
-// read.on('error', function (err) {
-// console.error('unable to read: ' + from);
-// console.error(err.message);
-// process.exit(1);
-// });
-
-// write.on('error', function (err) {
-// console.error('unable to write to: ' + to);
-// console.error(err.message);
-// process.exit(1);
-// });
-
-// write.on('finish', function () {
-// done();
-// });
-// }
diff --git a/scripts/generate/templates/api_methods.tmpl b/scripts/generate/templates/api_methods.tmpl
index 99b9af20e..c9a681d55 100644
--- a/scripts/generate/templates/api_methods.tmpl
+++ b/scripts/generate/templates/api_methods.tmpl
@@ -7,14 +7,12 @@ var actionId = action.name.toLowerCase().replace(/[^\w]+/g, '-');
h2#<%= actionId %>.fn
span.name <%= action.name %>
span.args (params, [callback])
-a.perma(href="api.html#<%= actionId %>", title="Permalink")
-a.esdoc(href="<%= action.docUrl %>", title="Endpoint Docs")
-//-
- h4 Spec:
- pre
- code <%= JSON.stringify(action, null, ' ').split('\n').map(function (line, i) {
- return (i > 0 ? ' | ' : '') + line;
- }).join('\n') %>
+include _descriptions/<%= action.name %>.jade
+a.esdoc(href="<%= action.docUrl %>", title="<%= action.name %> at elasticsearch.org").
+ <%= action.docUrl %>
+p.tight.
+ The default method is <%= action.spec.method || 'GET' %> and
+ the usual params and return values apply.
<% if (_.size(action.allParams)) { %>
h3 Params:
@@ -26,10 +24,6 @@ dl.params.api
<%= indent(param.description || '', 4) %><%
}); %>
<% } %>
-p.
- Default method: <%= action.spec.method || 'GET' %>
- Includes the usual
-
include _examples/<%= action.name %>.jade<%
});
%>
diff --git a/scripts/jenkins.sh b/scripts/jenkins.sh
index f7802060f..2070f0d19 100755
--- a/scripts/jenkins.sh
+++ b/scripts/jenkins.sh
@@ -1,7 +1,13 @@
#!/bin/bash
+
+# let the dust settle and ensure that es is ready for us.
+sleep 15s
+
# generate the latest version of the yaml-tests
node scripts/generate/ --no-api 2>&1 > /dev/null
+export VERBOSE="true"
+
# unit tests
./node_modules/.bin/mocha test/unit/test_*.js \
--require should \
diff --git a/src/elasticsearch.angular.js b/src/elasticsearch.angular.js
index bbff6cd99..6ace08e0e 100644
--- a/src/elasticsearch.angular.js
+++ b/src/elasticsearch.angular.js
@@ -5,6 +5,7 @@
* It will also instruct the client to use Angular's $http service for it's ajax requests
*/
var AngularConnector = require('./lib/connectors/angular');
+var Transport = require('./lib/transport');
var Client = require('./lib/client');
process.angular_build = true;
@@ -16,12 +17,14 @@ angular.module('elasticsearch.client', [])
AngularConnector.prototype.$http = $http;
AngularConnector.prototype.$q = $q;
+ // make the Transport return $q promisses instead
+ Transport.createDefer = function () {
+ return $q.defer();
+ };
+
var factory = function (config) {
config = config || {};
config.connectionClass = AngularConnector;
- config.createDefer = function () {
- return $q.defer();
- };
return new Client(config);
};
diff --git a/src/elasticsearch.js b/src/elasticsearch.js
index 4eda23b14..4fc3e5116 100644
--- a/src/elasticsearch.js
+++ b/src/elasticsearch.js
@@ -1,9 +1,15 @@
-var es = {
- Client: require('./lib/client'),
- ConnectionPool: require('./lib/connection_pool'),
- Transport: require('./lib/transport'),
+// In order to help people who were accidentally upgraded to this ES client,
+// throw an error when they try to instanciate the exported function.
+// previous "elasticsearch" module -> https://github.com/ncb000gt/node-es
+function es() {
+ throw new Error('Looks like you are expecting the previous "elasticsearch" module. ' +
+ 'It is now the "es" module. To create a client with this module use ' +
+ '`new es.Client(params)`.');
+}
- errors: require('./lib/errors')
-};
+es.Client = require('./lib/client');
+es.ConnectionPool = require('./lib/connection_pool');
+es.Transport = require('./lib/transport');
+es.errors = require('./lib/errors');
module.exports = es;
diff --git a/src/lib/connectors/angular.js b/src/lib/connectors/angular.js
index 7644a1a1f..e2ad56af0 100644
--- a/src/lib/connectors/angular.js
+++ b/src/lib/connectors/angular.js
@@ -36,4 +36,5 @@ AngularConnector.prototype.request = function (params, cb) {
// must be overwritten before this connection can be used
AngularConnector.prototype.$http = null;
+// required in order to provide abort functionality
AngularConnector.prototype.$q = null;
diff --git a/src/lib/host.js b/src/lib/host.js
index 4a3f4f344..08df533ff 100644
--- a/src/lib/host.js
+++ b/src/lib/host.js
@@ -128,7 +128,14 @@ Host.prototype.makeUrl = function (params) {
query = qs.stringify(this.query);
}
- return this.protocol + '://' + this.host + port + path + (query ? '?' + query : '');
+ var auth = '';
+ if (params.auth) {
+ auth = params.auth + '@';
+ } else if (this.auth) {
+ auth = this.auth + '@';
+ }
+
+ return this.protocol + '://' + auth + this.host + port + path + (query ? '?' + query : '');
};
Host.prototype.toString = function () {
diff --git a/src/lib/log.js b/src/lib/log.js
index a5f0d014f..c82a65d62 100755
--- a/src/lib/log.js
+++ b/src/lib/log.js
@@ -22,10 +22,6 @@ function Log(config) {
var i;
var outputs;
- if (config.loggers) {
- config.log = config.loggers;
- }
-
if (config.log) {
if (_.isArrayOfStrings(config.log)) {
outputs = [{
@@ -305,8 +301,7 @@ Log.prototype.trace = function (method, requestUrl, body, responseBody, response
function prettyJSON(body) {
try {
- // TESTME
- return JSON.stringify(JSON.parse(body), null, ' ').replace(/'/g, '\\\'');
+ return JSON.stringify(JSON.parse(body), null, ' ').replace(/'/g, '\\u0027');
} catch (e) {
return body || '';
}
diff --git a/test/integration/browser_yaml_suite/yaml_tests.js b/test/integration/browser_yaml_suite/yaml_tests.js
deleted file mode 100644
index c04f3ee82..000000000
--- a/test/integration/browser_yaml_suite/yaml_tests.js
+++ /dev/null
@@ -1,34572 +0,0 @@
-;(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= arr.length) {
- callback(null);
- }
- }
- }));
- });
- };
- async.forEach = async.each;
-
- async.eachSeries = function (arr, iterator, callback) {
- callback = callback || function () {};
- if (!arr.length) {
- return callback();
- }
- var completed = 0;
- var iterate = function () {
- iterator(arr[completed], function (err) {
- if (err) {
- callback(err);
- callback = function () {};
- }
- else {
- completed += 1;
- if (completed >= arr.length) {
- callback(null);
- }
- else {
- iterate();
- }
- }
- });
- };
- iterate();
- };
- async.forEachSeries = async.eachSeries;
-
- async.eachLimit = function (arr, limit, iterator, callback) {
- var fn = _eachLimit(limit);
- fn.apply(null, [arr, iterator, callback]);
- };
- async.forEachLimit = async.eachLimit;
-
- var _eachLimit = function (limit) {
-
- return function (arr, iterator, callback) {
- callback = callback || function () {};
- if (!arr.length || limit <= 0) {
- return callback();
- }
- var completed = 0;
- var started = 0;
- var running = 0;
-
- (function replenish () {
- if (completed >= arr.length) {
- return callback();
- }
-
- while (running < limit && started < arr.length) {
- started += 1;
- running += 1;
- iterator(arr[started - 1], function (err) {
- if (err) {
- callback(err);
- callback = function () {};
- }
- else {
- completed += 1;
- running -= 1;
- if (completed >= arr.length) {
- callback();
- }
- else {
- replenish();
- }
- }
- });
- }
- })();
- };
- };
-
-
- var doParallel = function (fn) {
- return function () {
- var args = Array.prototype.slice.call(arguments);
- return fn.apply(null, [async.each].concat(args));
- };
- };
- var doParallelLimit = function(limit, fn) {
- return function () {
- var args = Array.prototype.slice.call(arguments);
- return fn.apply(null, [_eachLimit(limit)].concat(args));
- };
- };
- var doSeries = function (fn) {
- return function () {
- var args = Array.prototype.slice.call(arguments);
- return fn.apply(null, [async.eachSeries].concat(args));
- };
- };
-
-
- var _asyncMap = function (eachfn, arr, iterator, callback) {
- var results = [];
- arr = _map(arr, function (x, i) {
- return {index: i, value: x};
- });
- eachfn(arr, function (x, callback) {
- iterator(x.value, function (err, v) {
- results[x.index] = v;
- callback(err);
- });
- }, function (err) {
- callback(err, results);
- });
- };
- async.map = doParallel(_asyncMap);
- async.mapSeries = doSeries(_asyncMap);
- async.mapLimit = function (arr, limit, iterator, callback) {
- return _mapLimit(limit)(arr, iterator, callback);
- };
-
- var _mapLimit = function(limit) {
- return doParallelLimit(limit, _asyncMap);
- };
-
- // reduce only has a series version, as doing reduce in parallel won't
- // work in many situations.
- async.reduce = function (arr, memo, iterator, callback) {
- async.eachSeries(arr, function (x, callback) {
- iterator(memo, x, function (err, v) {
- memo = v;
- callback(err);
- });
- }, function (err) {
- callback(err, memo);
- });
- };
- // inject alias
- async.inject = async.reduce;
- // foldl alias
- async.foldl = async.reduce;
-
- async.reduceRight = function (arr, memo, iterator, callback) {
- var reversed = _map(arr, function (x) {
- return x;
- }).reverse();
- async.reduce(reversed, memo, iterator, callback);
- };
- // foldr alias
- async.foldr = async.reduceRight;
-
- var _filter = function (eachfn, arr, iterator, callback) {
- var results = [];
- arr = _map(arr, function (x, i) {
- return {index: i, value: x};
- });
- eachfn(arr, function (x, callback) {
- iterator(x.value, function (v) {
- if (v) {
- results.push(x);
- }
- callback();
- });
- }, function (err) {
- callback(_map(results.sort(function (a, b) {
- return a.index - b.index;
- }), function (x) {
- return x.value;
- }));
- });
- };
- async.filter = doParallel(_filter);
- async.filterSeries = doSeries(_filter);
- // select alias
- async.select = async.filter;
- async.selectSeries = async.filterSeries;
-
- var _reject = function (eachfn, arr, iterator, callback) {
- var results = [];
- arr = _map(arr, function (x, i) {
- return {index: i, value: x};
- });
- eachfn(arr, function (x, callback) {
- iterator(x.value, function (v) {
- if (!v) {
- results.push(x);
- }
- callback();
- });
- }, function (err) {
- callback(_map(results.sort(function (a, b) {
- return a.index - b.index;
- }), function (x) {
- return x.value;
- }));
- });
- };
- async.reject = doParallel(_reject);
- async.rejectSeries = doSeries(_reject);
-
- var _detect = function (eachfn, arr, iterator, main_callback) {
- eachfn(arr, function (x, callback) {
- iterator(x, function (result) {
- if (result) {
- main_callback(x);
- main_callback = function () {};
- }
- else {
- callback();
- }
- });
- }, function (err) {
- main_callback();
- });
- };
- async.detect = doParallel(_detect);
- async.detectSeries = doSeries(_detect);
-
- async.some = function (arr, iterator, main_callback) {
- async.each(arr, function (x, callback) {
- iterator(x, function (v) {
- if (v) {
- main_callback(true);
- main_callback = function () {};
- }
- callback();
- });
- }, function (err) {
- main_callback(false);
- });
- };
- // any alias
- async.any = async.some;
-
- async.every = function (arr, iterator, main_callback) {
- async.each(arr, function (x, callback) {
- iterator(x, function (v) {
- if (!v) {
- main_callback(false);
- main_callback = function () {};
- }
- callback();
- });
- }, function (err) {
- main_callback(true);
- });
- };
- // all alias
- async.all = async.every;
-
- async.sortBy = function (arr, iterator, callback) {
- async.map(arr, function (x, callback) {
- iterator(x, function (err, criteria) {
- if (err) {
- callback(err);
- }
- else {
- callback(null, {value: x, criteria: criteria});
- }
- });
- }, function (err, results) {
- if (err) {
- return callback(err);
- }
- else {
- var fn = function (left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- };
- callback(null, _map(results.sort(fn), function (x) {
- return x.value;
- }));
- }
- });
- };
-
- async.auto = function (tasks, callback) {
- callback = callback || function () {};
- var keys = _keys(tasks);
- if (!keys.length) {
- return callback(null);
- }
-
- var results = {};
-
- var listeners = [];
- var addListener = function (fn) {
- listeners.unshift(fn);
- };
- var removeListener = function (fn) {
- for (var i = 0; i < listeners.length; i += 1) {
- if (listeners[i] === fn) {
- listeners.splice(i, 1);
- return;
- }
- }
- };
- var taskComplete = function () {
- _each(listeners.slice(0), function (fn) {
- fn();
- });
- };
-
- addListener(function () {
- if (_keys(results).length === keys.length) {
- callback(null, results);
- callback = function () {};
- }
- });
-
- _each(keys, function (k) {
- var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
- var taskCallback = function (err) {
- var args = Array.prototype.slice.call(arguments, 1);
- if (args.length <= 1) {
- args = args[0];
- }
- if (err) {
- var safeResults = {};
- _each(_keys(results), function(rkey) {
- safeResults[rkey] = results[rkey];
- });
- safeResults[k] = args;
- callback(err, safeResults);
- // stop subsequent errors hitting callback multiple times
- callback = function () {};
- }
- else {
- results[k] = args;
- async.setImmediate(taskComplete);
- }
- };
- var requires = task.slice(0, Math.abs(task.length - 1)) || [];
- var ready = function () {
- return _reduce(requires, function (a, x) {
- return (a && results.hasOwnProperty(x));
- }, true) && !results.hasOwnProperty(k);
- };
- if (ready()) {
- task[task.length - 1](taskCallback, results);
- }
- else {
- var listener = function () {
- if (ready()) {
- removeListener(listener);
- task[task.length - 1](taskCallback, results);
- }
- };
- addListener(listener);
- }
- });
- };
-
- async.waterfall = function (tasks, callback) {
- callback = callback || function () {};
- if (tasks.constructor !== Array) {
- var err = new Error('First argument to waterfall must be an array of functions');
- return callback(err);
- }
- if (!tasks.length) {
- return callback();
- }
- var wrapIterator = function (iterator) {
- return function (err) {
- if (err) {
- callback.apply(null, arguments);
- callback = function () {};
- }
- else {
- var args = Array.prototype.slice.call(arguments, 1);
- var next = iterator.next();
- if (next) {
- args.push(wrapIterator(next));
- }
- else {
- args.push(callback);
- }
- async.setImmediate(function () {
- iterator.apply(null, args);
- });
- }
- };
- };
- wrapIterator(async.iterator(tasks))();
- };
-
- var _parallel = function(eachfn, tasks, callback) {
- callback = callback || function () {};
- if (tasks.constructor === Array) {
- eachfn.map(tasks, function (fn, callback) {
- if (fn) {
- fn(function (err) {
- var args = Array.prototype.slice.call(arguments, 1);
- if (args.length <= 1) {
- args = args[0];
- }
- callback.call(null, err, args);
- });
- }
- }, callback);
- }
- else {
- var results = {};
- eachfn.each(_keys(tasks), function (k, callback) {
- tasks[k](function (err) {
- var args = Array.prototype.slice.call(arguments, 1);
- if (args.length <= 1) {
- args = args[0];
- }
- results[k] = args;
- callback(err);
- });
- }, function (err) {
- callback(err, results);
- });
- }
- };
-
- async.parallel = function (tasks, callback) {
- _parallel({ map: async.map, each: async.each }, tasks, callback);
- };
-
- async.parallelLimit = function(tasks, limit, callback) {
- _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
- };
-
- async.series = function (tasks, callback) {
- callback = callback || function () {};
- if (tasks.constructor === Array) {
- async.mapSeries(tasks, function (fn, callback) {
- if (fn) {
- fn(function (err) {
- var args = Array.prototype.slice.call(arguments, 1);
- if (args.length <= 1) {
- args = args[0];
- }
- callback.call(null, err, args);
- });
- }
- }, callback);
- }
- else {
- var results = {};
- async.eachSeries(_keys(tasks), function (k, callback) {
- tasks[k](function (err) {
- var args = Array.prototype.slice.call(arguments, 1);
- if (args.length <= 1) {
- args = args[0];
- }
- results[k] = args;
- callback(err);
- });
- }, function (err) {
- callback(err, results);
- });
- }
- };
-
- async.iterator = function (tasks) {
- var makeCallback = function (index) {
- var fn = function () {
- if (tasks.length) {
- tasks[index].apply(null, arguments);
- }
- return fn.next();
- };
- fn.next = function () {
- return (index < tasks.length - 1) ? makeCallback(index + 1): null;
- };
- return fn;
- };
- return makeCallback(0);
- };
-
- async.apply = function (fn) {
- var args = Array.prototype.slice.call(arguments, 1);
- return function () {
- return fn.apply(
- null, args.concat(Array.prototype.slice.call(arguments))
- );
- };
- };
-
- var _concat = function (eachfn, arr, fn, callback) {
- var r = [];
- eachfn(arr, function (x, cb) {
- fn(x, function (err, y) {
- r = r.concat(y || []);
- cb(err);
- });
- }, function (err) {
- callback(err, r);
- });
- };
- async.concat = doParallel(_concat);
- async.concatSeries = doSeries(_concat);
-
- async.whilst = function (test, iterator, callback) {
- if (test()) {
- iterator(function (err) {
- if (err) {
- return callback(err);
- }
- async.whilst(test, iterator, callback);
- });
- }
- else {
- callback();
- }
- };
-
- async.doWhilst = function (iterator, test, callback) {
- iterator(function (err) {
- if (err) {
- return callback(err);
- }
- if (test()) {
- async.doWhilst(iterator, test, callback);
- }
- else {
- callback();
- }
- });
- };
-
- async.until = function (test, iterator, callback) {
- if (!test()) {
- iterator(function (err) {
- if (err) {
- return callback(err);
- }
- async.until(test, iterator, callback);
- });
- }
- else {
- callback();
- }
- };
-
- async.doUntil = function (iterator, test, callback) {
- iterator(function (err) {
- if (err) {
- return callback(err);
- }
- if (!test()) {
- async.doUntil(iterator, test, callback);
- }
- else {
- callback();
- }
- });
- };
-
- async.queue = function (worker, concurrency) {
- if (concurrency === undefined) {
- concurrency = 1;
- }
- function _insert(q, data, pos, callback) {
- if(data.constructor !== Array) {
- data = [data];
- }
- _each(data, function(task) {
- var item = {
- data: task,
- callback: typeof callback === 'function' ? callback : null
- };
-
- if (pos) {
- q.tasks.unshift(item);
- } else {
- q.tasks.push(item);
- }
-
- if (q.saturated && q.tasks.length === concurrency) {
- q.saturated();
- }
- async.setImmediate(q.process);
- });
- }
-
- var workers = 0;
- var q = {
- tasks: [],
- concurrency: concurrency,
- saturated: null,
- empty: null,
- drain: null,
- push: function (data, callback) {
- _insert(q, data, false, callback);
- },
- unshift: function (data, callback) {
- _insert(q, data, true, callback);
- },
- process: function () {
- if (workers < q.concurrency && q.tasks.length) {
- var task = q.tasks.shift();
- if (q.empty && q.tasks.length === 0) {
- q.empty();
- }
- workers += 1;
- var next = function () {
- workers -= 1;
- if (task.callback) {
- task.callback.apply(task, arguments);
- }
- if (q.drain && q.tasks.length + workers === 0) {
- q.drain();
- }
- q.process();
- };
- var cb = only_once(next);
- worker(task.data, cb);
- }
- },
- length: function () {
- return q.tasks.length;
- },
- running: function () {
- return workers;
- }
- };
- return q;
- };
-
- async.cargo = function (worker, payload) {
- var working = false,
- tasks = [];
-
- var cargo = {
- tasks: tasks,
- payload: payload,
- saturated: null,
- empty: null,
- drain: null,
- push: function (data, callback) {
- if(data.constructor !== Array) {
- data = [data];
- }
- _each(data, function(task) {
- tasks.push({
- data: task,
- callback: typeof callback === 'function' ? callback : null
- });
- if (cargo.saturated && tasks.length === payload) {
- cargo.saturated();
- }
- });
- async.setImmediate(cargo.process);
- },
- process: function process() {
- if (working) return;
- if (tasks.length === 0) {
- if(cargo.drain) cargo.drain();
- return;
- }
-
- var ts = typeof payload === 'number'
- ? tasks.splice(0, payload)
- : tasks.splice(0);
-
- var ds = _map(ts, function (task) {
- return task.data;
- });
-
- if(cargo.empty) cargo.empty();
- working = true;
- worker(ds, function () {
- working = false;
-
- var args = arguments;
- _each(ts, function (data) {
- if (data.callback) {
- data.callback.apply(null, args);
- }
- });
-
- process();
- });
- },
- length: function () {
- return tasks.length;
- },
- running: function () {
- return working;
- }
- };
- return cargo;
- };
-
- var _console_fn = function (name) {
- return function (fn) {
- var args = Array.prototype.slice.call(arguments, 1);
- fn.apply(null, args.concat([function (err) {
- var args = Array.prototype.slice.call(arguments, 1);
- if (typeof console !== 'undefined') {
- if (err) {
- if (console.error) {
- console.error(err);
- }
- }
- else if (console[name]) {
- _each(args, function (x) {
- console[name](x);
- });
- }
- }
- }]));
- };
- };
- async.log = _console_fn('log');
- async.dir = _console_fn('dir');
- /*async.info = _console_fn('info');
- async.warn = _console_fn('warn');
- async.error = _console_fn('error');*/
-
- async.memoize = function (fn, hasher) {
- var memo = {};
- var queues = {};
- hasher = hasher || function (x) {
- return x;
- };
- var memoized = function () {
- var args = Array.prototype.slice.call(arguments);
- var callback = args.pop();
- var key = hasher.apply(null, args);
- if (key in memo) {
- callback.apply(null, memo[key]);
- }
- else if (key in queues) {
- queues[key].push(callback);
- }
- else {
- queues[key] = [callback];
- fn.apply(null, args.concat([function () {
- memo[key] = arguments;
- var q = queues[key];
- delete queues[key];
- for (var i = 0, l = q.length; i < l; i++) {
- q[i].apply(null, arguments);
- }
- }]));
- }
- };
- memoized.memo = memo;
- memoized.unmemoized = fn;
- return memoized;
- };
-
- async.unmemoize = function (fn) {
- return function () {
- return (fn.unmemoized || fn).apply(null, arguments);
- };
- };
-
- async.times = function (count, iterator, callback) {
- var counter = [];
- for (var i = 0; i < count; i++) {
- counter.push(i);
- }
- return async.map(counter, iterator, callback);
- };
-
- async.timesSeries = function (count, iterator, callback) {
- var counter = [];
- for (var i = 0; i < count; i++) {
- counter.push(i);
- }
- return async.mapSeries(counter, iterator, callback);
- };
-
- async.compose = function (/* functions... */) {
- var fns = Array.prototype.reverse.call(arguments);
- return function () {
- var that = this;
- var args = Array.prototype.slice.call(arguments);
- var callback = args.pop();
- async.reduce(fns, args, function (newargs, fn, cb) {
- fn.apply(that, newargs.concat([function () {
- var err = arguments[0];
- var nextargs = Array.prototype.slice.call(arguments, 1);
- cb(err, nextargs);
- }]))
- },
- function (err, results) {
- callback.apply(that, [err].concat(results));
- });
- };
- };
-
- var _applyEach = function (eachfn, fns /*args...*/) {
- var go = function () {
- var that = this;
- var args = Array.prototype.slice.call(arguments);
- var callback = args.pop();
- return eachfn(fns, function (fn, cb) {
- fn.apply(that, args.concat([cb]));
- },
- callback);
- };
- if (arguments.length > 2) {
- var args = Array.prototype.slice.call(arguments, 2);
- return go.apply(this, args);
- }
- else {
- return go;
- }
- };
- async.applyEach = doParallel(_applyEach);
- async.applyEachSeries = doSeries(_applyEach);
-
- async.forever = function (fn, callback) {
- function next(err) {
- if (err) {
- if (callback) {
- return callback(err);
- }
- throw err;
- }
- fn(next);
- }
- next();
- };
-
- // AMD / RequireJS
- if (typeof define !== 'undefined' && define.amd) {
- define([], function () {
- return async;
- });
- }
- // Node.js
- else if (typeof module !== 'undefined' && module.exports) {
- module.exports = async;
- }
- // included directly via