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