47fe83a4273fdab26ffc9bfd1e606ec900c156fc
[yaffs-website] / node_modules / uncss / node_modules / form-data / node_modules / async / internal / queue.js
1 'use strict';
2
3 Object.defineProperty(exports, "__esModule", {
4     value: true
5 });
6 exports.default = queue;
7
8 var _baseIndexOf = require('lodash/_baseIndexOf');
9
10 var _baseIndexOf2 = _interopRequireDefault(_baseIndexOf);
11
12 var _isArray = require('lodash/isArray');
13
14 var _isArray2 = _interopRequireDefault(_isArray);
15
16 var _noop = require('lodash/noop');
17
18 var _noop2 = _interopRequireDefault(_noop);
19
20 var _rest = require('./rest');
21
22 var _rest2 = _interopRequireDefault(_rest);
23
24 var _onlyOnce = require('./onlyOnce');
25
26 var _onlyOnce2 = _interopRequireDefault(_onlyOnce);
27
28 var _setImmediate = require('./setImmediate');
29
30 var _setImmediate2 = _interopRequireDefault(_setImmediate);
31
32 var _DoublyLinkedList = require('./DoublyLinkedList');
33
34 var _DoublyLinkedList2 = _interopRequireDefault(_DoublyLinkedList);
35
36 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
37
38 function queue(worker, concurrency, payload) {
39     if (concurrency == null) {
40         concurrency = 1;
41     } else if (concurrency === 0) {
42         throw new Error('Concurrency must not be zero');
43     }
44
45     function _insert(data, insertAtFront, callback) {
46         if (callback != null && typeof callback !== 'function') {
47             throw new Error('task callback must be a function');
48         }
49         q.started = true;
50         if (!(0, _isArray2.default)(data)) {
51             data = [data];
52         }
53         if (data.length === 0 && q.idle()) {
54             // call drain immediately if there are no tasks
55             return (0, _setImmediate2.default)(function () {
56                 q.drain();
57             });
58         }
59
60         for (var i = 0, l = data.length; i < l; i++) {
61             var item = {
62                 data: data[i],
63                 callback: callback || _noop2.default
64             };
65
66             if (insertAtFront) {
67                 q._tasks.unshift(item);
68             } else {
69                 q._tasks.push(item);
70             }
71         }
72         (0, _setImmediate2.default)(q.process);
73     }
74
75     function _next(tasks) {
76         return (0, _rest2.default)(function (args) {
77             workers -= 1;
78
79             for (var i = 0, l = tasks.length; i < l; i++) {
80                 var task = tasks[i];
81                 var index = (0, _baseIndexOf2.default)(workersList, task, 0);
82                 if (index >= 0) {
83                     workersList.splice(index);
84                 }
85
86                 task.callback.apply(task, args);
87
88                 if (args[0] != null) {
89                     q.error(args[0], task.data);
90                 }
91             }
92
93             if (workers <= q.concurrency - q.buffer) {
94                 q.unsaturated();
95             }
96
97             if (q.idle()) {
98                 q.drain();
99             }
100             q.process();
101         });
102     }
103
104     var workers = 0;
105     var workersList = [];
106     var isProcessing = false;
107     var q = {
108         _tasks: new _DoublyLinkedList2.default(),
109         concurrency: concurrency,
110         payload: payload,
111         saturated: _noop2.default,
112         unsaturated: _noop2.default,
113         buffer: concurrency / 4,
114         empty: _noop2.default,
115         drain: _noop2.default,
116         error: _noop2.default,
117         started: false,
118         paused: false,
119         push: function (data, callback) {
120             _insert(data, false, callback);
121         },
122         kill: function () {
123             q.drain = _noop2.default;
124             q._tasks.empty();
125         },
126         unshift: function (data, callback) {
127             _insert(data, true, callback);
128         },
129         process: function () {
130             // Avoid trying to start too many processing operations. This can occur
131             // when callbacks resolve synchronously (#1267).
132             if (isProcessing) {
133                 return;
134             }
135             isProcessing = true;
136             while (!q.paused && workers < q.concurrency && q._tasks.length) {
137                 var tasks = [],
138                     data = [];
139                 var l = q._tasks.length;
140                 if (q.payload) l = Math.min(l, q.payload);
141                 for (var i = 0; i < l; i++) {
142                     var node = q._tasks.shift();
143                     tasks.push(node);
144                     data.push(node.data);
145                 }
146
147                 if (q._tasks.length === 0) {
148                     q.empty();
149                 }
150                 workers += 1;
151                 workersList.push(tasks[0]);
152
153                 if (workers === q.concurrency) {
154                     q.saturated();
155                 }
156
157                 var cb = (0, _onlyOnce2.default)(_next(tasks));
158                 worker(data, cb);
159             }
160             isProcessing = false;
161         },
162         length: function () {
163             return q._tasks.length;
164         },
165         running: function () {
166             return workers;
167         },
168         workersList: function () {
169             return workersList;
170         },
171         idle: function () {
172             return q._tasks.length + workers === 0;
173         },
174         pause: function () {
175             q.paused = true;
176         },
177         resume: function () {
178             if (q.paused === false) {
179                 return;
180             }
181             q.paused = false;
182             (0, _setImmediate2.default)(q.process);
183         }
184     };
185     return q;
186 }
187 module.exports = exports['default'];