| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | 'use strict';Object.defineProperty(exports, "__esModule", {    value: true});exports.default = queue;var _baseIndexOf = require('lodash/_baseIndexOf');var _baseIndexOf2 = _interopRequireDefault(_baseIndexOf);var _isArray = require('lodash/isArray');var _isArray2 = _interopRequireDefault(_isArray);var _noop = require('lodash/noop');var _noop2 = _interopRequireDefault(_noop);var _onlyOnce = require('./onlyOnce');var _onlyOnce2 = _interopRequireDefault(_onlyOnce);var _setImmediate = require('./setImmediate');var _setImmediate2 = _interopRequireDefault(_setImmediate);var _DoublyLinkedList = require('./DoublyLinkedList');var _DoublyLinkedList2 = _interopRequireDefault(_DoublyLinkedList);var _wrapAsync = require('./wrapAsync');var _wrapAsync2 = _interopRequireDefault(_wrapAsync);function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }function queue(worker, concurrency, payload) {    if (concurrency == null) {        concurrency = 1;    } else if (concurrency === 0) {        throw new Error('Concurrency must not be zero');    }    var _worker = (0, _wrapAsync2.default)(worker);    var numRunning = 0;    var workersList = [];    var processingScheduled = false;    function _insert(data, insertAtFront, callback) {        if (callback != null && typeof callback !== 'function') {            throw new Error('task callback must be a function');        }        q.started = true;        if (!(0, _isArray2.default)(data)) {            data = [data];        }        if (data.length === 0 && q.idle()) {            // call drain immediately if there are no tasks            return (0, _setImmediate2.default)(function () {                q.drain();            });        }        for (var i = 0, l = data.length; i < l; i++) {            var item = {                data: data[i],                callback: callback || _noop2.default            };            if (insertAtFront) {                q._tasks.unshift(item);            } else {                q._tasks.push(item);            }        }        if (!processingScheduled) {            processingScheduled = true;            (0, _setImmediate2.default)(function () {                processingScheduled = false;                q.process();            });        }    }    function _next(tasks) {        return function (err) {            numRunning -= 1;            for (var i = 0, l = tasks.length; i < l; i++) {                var task = tasks[i];                var index = (0, _baseIndexOf2.default)(workersList, task, 0);                if (index === 0) {                    workersList.shift();                } else if (index > 0) {                    workersList.splice(index, 1);                }                task.callback.apply(task, arguments);                if (err != null) {                    q.error(err, task.data);                }            }            if (numRunning <= q.concurrency - q.buffer) {                q.unsaturated();            }            if (q.idle()) {                q.drain();            }            q.process();        };    }    var isProcessing = false;    var q = {        _tasks: new _DoublyLinkedList2.default(),        concurrency: concurrency,        payload: payload,        saturated: _noop2.default,        unsaturated: _noop2.default,        buffer: concurrency / 4,        empty: _noop2.default,        drain: _noop2.default,        error: _noop2.default,        started: false,        paused: false,        push: function (data, callback) {            _insert(data, false, callback);        },        kill: function () {            q.drain = _noop2.default;            q._tasks.empty();        },        unshift: function (data, callback) {            _insert(data, true, callback);        },        remove: function (testFn) {            q._tasks.remove(testFn);        },        process: function () {            // Avoid trying to start too many processing operations. This can occur            // when callbacks resolve synchronously (#1267).            if (isProcessing) {                return;            }            isProcessing = true;            while (!q.paused && numRunning < q.concurrency && q._tasks.length) {                var tasks = [],                    data = [];                var l = q._tasks.length;                if (q.payload) l = Math.min(l, q.payload);                for (var i = 0; i < l; i++) {                    var node = q._tasks.shift();                    tasks.push(node);                    workersList.push(node);                    data.push(node.data);                }                numRunning += 1;                if (q._tasks.length === 0) {                    q.empty();                }                if (numRunning === q.concurrency) {                    q.saturated();                }                var cb = (0, _onlyOnce2.default)(_next(tasks));                _worker(data, cb);            }            isProcessing = false;        },        length: function () {            return q._tasks.length;        },        running: function () {            return numRunning;        },        workersList: function () {            return workersList;        },        idle: function () {            return q._tasks.length + numRunning === 0;        },        pause: function () {            q.paused = true;        },        resume: function () {            if (q.paused === false) {                return;            }            q.paused = false;            (0, _setImmediate2.default)(q.process);        }    };    return q;}module.exports = exports['default'];
 |