Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50659 views
1
/*global setTimeout: false, console: false */
2
(function () {
3
4
var async = {};
5
6
// global on the server, window in the browser
7
var root = this,
8
previous_async = root.async;
9
10
if (typeof module !== 'undefined' && module.exports) {
11
module.exports = async;
12
}
13
else {
14
root.async = async;
15
}
16
17
async.noConflict = function () {
18
root.async = previous_async;
19
return async;
20
};
21
22
//// cross-browser compatiblity functions ////
23
24
var _forEach = function (arr, iterator) {
25
if (arr.forEach) {
26
return arr.forEach(iterator);
27
}
28
for (var i = 0; i < arr.length; i += 1) {
29
iterator(arr[i], i, arr);
30
}
31
};
32
33
var _map = function (arr, iterator) {
34
if (arr.map) {
35
return arr.map(iterator);
36
}
37
var results = [];
38
_forEach(arr, function (x, i, a) {
39
results.push(iterator(x, i, a));
40
});
41
return results;
42
};
43
44
var _reduce = function (arr, iterator, memo) {
45
if (arr.reduce) {
46
return arr.reduce(iterator, memo);
47
}
48
_forEach(arr, function (x, i, a) {
49
memo = iterator(memo, x, i, a);
50
});
51
return memo;
52
};
53
54
var _keys = function (obj) {
55
if (Object.keys) {
56
return Object.keys(obj);
57
}
58
var keys = [];
59
for (var k in obj) {
60
if (obj.hasOwnProperty(k)) {
61
keys.push(k);
62
}
63
}
64
return keys;
65
};
66
67
//// exported async module functions ////
68
69
//// nextTick implementation with browser-compatible fallback ////
70
if (typeof process === 'undefined' || !(process.nextTick)) {
71
async.nextTick = function (fn) {
72
setTimeout(fn, 0);
73
};
74
}
75
else {
76
async.nextTick = process.nextTick;
77
}
78
79
async.forEach = function (arr, iterator, callback) {
80
callback = callback || function () {};
81
if (!arr.length) {
82
return callback();
83
}
84
var completed = 0;
85
_forEach(arr, function (x) {
86
iterator(x, function (err) {
87
if (err) {
88
callback(err);
89
callback = function () {};
90
}
91
else {
92
completed += 1;
93
if (completed === arr.length) {
94
callback(null);
95
}
96
}
97
});
98
});
99
};
100
101
async.forEachSeries = function (arr, iterator, callback) {
102
callback = callback || function () {};
103
if (!arr.length) {
104
return callback();
105
}
106
var completed = 0;
107
var iterate = function () {
108
iterator(arr[completed], function (err) {
109
if (err) {
110
callback(err);
111
callback = function () {};
112
}
113
else {
114
completed += 1;
115
if (completed === arr.length) {
116
callback(null);
117
}
118
else {
119
iterate();
120
}
121
}
122
});
123
};
124
iterate();
125
};
126
127
async.forEachLimit = function (arr, limit, iterator, callback) {
128
callback = callback || function () {};
129
if (!arr.length || limit <= 0) {
130
return callback();
131
}
132
var completed = 0;
133
var started = 0;
134
var running = 0;
135
136
(function replenish () {
137
if (completed === arr.length) {
138
return callback();
139
}
140
141
while (running < limit && started < arr.length) {
142
started += 1;
143
running += 1;
144
iterator(arr[started - 1], function (err) {
145
if (err) {
146
callback(err);
147
callback = function () {};
148
}
149
else {
150
completed += 1;
151
running -= 1;
152
if (completed === arr.length) {
153
callback();
154
}
155
else {
156
replenish();
157
}
158
}
159
});
160
}
161
})();
162
};
163
164
165
var doParallel = function (fn) {
166
return function () {
167
var args = Array.prototype.slice.call(arguments);
168
return fn.apply(null, [async.forEach].concat(args));
169
};
170
};
171
var doSeries = function (fn) {
172
return function () {
173
var args = Array.prototype.slice.call(arguments);
174
return fn.apply(null, [async.forEachSeries].concat(args));
175
};
176
};
177
178
179
var _asyncMap = function (eachfn, arr, iterator, callback) {
180
var results = [];
181
arr = _map(arr, function (x, i) {
182
return {index: i, value: x};
183
});
184
eachfn(arr, function (x, callback) {
185
iterator(x.value, function (err, v) {
186
results[x.index] = v;
187
callback(err);
188
});
189
}, function (err) {
190
callback(err, results);
191
});
192
};
193
async.map = doParallel(_asyncMap);
194
async.mapSeries = doSeries(_asyncMap);
195
196
197
// reduce only has a series version, as doing reduce in parallel won't
198
// work in many situations.
199
async.reduce = function (arr, memo, iterator, callback) {
200
async.forEachSeries(arr, function (x, callback) {
201
iterator(memo, x, function (err, v) {
202
memo = v;
203
callback(err);
204
});
205
}, function (err) {
206
callback(err, memo);
207
});
208
};
209
// inject alias
210
async.inject = async.reduce;
211
// foldl alias
212
async.foldl = async.reduce;
213
214
async.reduceRight = function (arr, memo, iterator, callback) {
215
var reversed = _map(arr, function (x) {
216
return x;
217
}).reverse();
218
async.reduce(reversed, memo, iterator, callback);
219
};
220
// foldr alias
221
async.foldr = async.reduceRight;
222
223
var _filter = function (eachfn, arr, iterator, callback) {
224
var results = [];
225
arr = _map(arr, function (x, i) {
226
return {index: i, value: x};
227
});
228
eachfn(arr, function (x, callback) {
229
iterator(x.value, function (v) {
230
if (v) {
231
results.push(x);
232
}
233
callback();
234
});
235
}, function (err) {
236
callback(_map(results.sort(function (a, b) {
237
return a.index - b.index;
238
}), function (x) {
239
return x.value;
240
}));
241
});
242
};
243
async.filter = doParallel(_filter);
244
async.filterSeries = doSeries(_filter);
245
// select alias
246
async.select = async.filter;
247
async.selectSeries = async.filterSeries;
248
249
var _reject = function (eachfn, arr, iterator, callback) {
250
var results = [];
251
arr = _map(arr, function (x, i) {
252
return {index: i, value: x};
253
});
254
eachfn(arr, function (x, callback) {
255
iterator(x.value, function (v) {
256
if (!v) {
257
results.push(x);
258
}
259
callback();
260
});
261
}, function (err) {
262
callback(_map(results.sort(function (a, b) {
263
return a.index - b.index;
264
}), function (x) {
265
return x.value;
266
}));
267
});
268
};
269
async.reject = doParallel(_reject);
270
async.rejectSeries = doSeries(_reject);
271
272
var _detect = function (eachfn, arr, iterator, main_callback) {
273
eachfn(arr, function (x, callback) {
274
iterator(x, function (result) {
275
if (result) {
276
main_callback(x);
277
main_callback = function () {};
278
}
279
else {
280
callback();
281
}
282
});
283
}, function (err) {
284
main_callback();
285
});
286
};
287
async.detect = doParallel(_detect);
288
async.detectSeries = doSeries(_detect);
289
290
async.some = function (arr, iterator, main_callback) {
291
async.forEach(arr, function (x, callback) {
292
iterator(x, function (v) {
293
if (v) {
294
main_callback(true);
295
main_callback = function () {};
296
}
297
callback();
298
});
299
}, function (err) {
300
main_callback(false);
301
});
302
};
303
// any alias
304
async.any = async.some;
305
306
async.every = function (arr, iterator, main_callback) {
307
async.forEach(arr, function (x, callback) {
308
iterator(x, function (v) {
309
if (!v) {
310
main_callback(false);
311
main_callback = function () {};
312
}
313
callback();
314
});
315
}, function (err) {
316
main_callback(true);
317
});
318
};
319
// all alias
320
async.all = async.every;
321
322
async.sortBy = function (arr, iterator, callback) {
323
async.map(arr, function (x, callback) {
324
iterator(x, function (err, criteria) {
325
if (err) {
326
callback(err);
327
}
328
else {
329
callback(null, {value: x, criteria: criteria});
330
}
331
});
332
}, function (err, results) {
333
if (err) {
334
return callback(err);
335
}
336
else {
337
var fn = function (left, right) {
338
var a = left.criteria, b = right.criteria;
339
return a < b ? -1 : a > b ? 1 : 0;
340
};
341
callback(null, _map(results.sort(fn), function (x) {
342
return x.value;
343
}));
344
}
345
});
346
};
347
348
async.auto = function (tasks, callback) {
349
callback = callback || function () {};
350
var keys = _keys(tasks);
351
if (!keys.length) {
352
return callback(null);
353
}
354
355
var results = {};
356
357
var listeners = [];
358
var addListener = function (fn) {
359
listeners.unshift(fn);
360
};
361
var removeListener = function (fn) {
362
for (var i = 0; i < listeners.length; i += 1) {
363
if (listeners[i] === fn) {
364
listeners.splice(i, 1);
365
return;
366
}
367
}
368
};
369
var taskComplete = function () {
370
_forEach(listeners.slice(0), function (fn) {
371
fn();
372
});
373
};
374
375
addListener(function () {
376
if (_keys(results).length === keys.length) {
377
callback(null, results);
378
callback = function () {};
379
}
380
});
381
382
_forEach(keys, function (k) {
383
var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
384
var taskCallback = function (err) {
385
if (err) {
386
callback(err);
387
// stop subsequent errors hitting callback multiple times
388
callback = function () {};
389
}
390
else {
391
var args = Array.prototype.slice.call(arguments, 1);
392
if (args.length <= 1) {
393
args = args[0];
394
}
395
results[k] = args;
396
taskComplete();
397
}
398
};
399
var requires = task.slice(0, Math.abs(task.length - 1)) || [];
400
var ready = function () {
401
return _reduce(requires, function (a, x) {
402
return (a && results.hasOwnProperty(x));
403
}, true) && !results.hasOwnProperty(k);
404
};
405
if (ready()) {
406
task[task.length - 1](taskCallback, results);
407
}
408
else {
409
var listener = function () {
410
if (ready()) {
411
removeListener(listener);
412
task[task.length - 1](taskCallback, results);
413
}
414
};
415
addListener(listener);
416
}
417
});
418
};
419
420
async.waterfall = function (tasks, callback) {
421
callback = callback || function () {};
422
if (!tasks.length) {
423
return callback();
424
}
425
var wrapIterator = function (iterator) {
426
return function (err) {
427
if (err) {
428
callback(err);
429
callback = function () {};
430
}
431
else {
432
var args = Array.prototype.slice.call(arguments, 1);
433
var next = iterator.next();
434
if (next) {
435
args.push(wrapIterator(next));
436
}
437
else {
438
args.push(callback);
439
}
440
async.nextTick(function () {
441
iterator.apply(null, args);
442
});
443
}
444
};
445
};
446
wrapIterator(async.iterator(tasks))();
447
};
448
449
async.parallel = function (tasks, callback) {
450
callback = callback || function () {};
451
if (tasks.constructor === Array) {
452
async.map(tasks, function (fn, callback) {
453
if (fn) {
454
fn(function (err) {
455
var args = Array.prototype.slice.call(arguments, 1);
456
if (args.length <= 1) {
457
args = args[0];
458
}
459
callback.call(null, err, args);
460
});
461
}
462
}, callback);
463
}
464
else {
465
var results = {};
466
async.forEach(_keys(tasks), function (k, callback) {
467
tasks[k](function (err) {
468
var args = Array.prototype.slice.call(arguments, 1);
469
if (args.length <= 1) {
470
args = args[0];
471
}
472
results[k] = args;
473
callback(err);
474
});
475
}, function (err) {
476
callback(err, results);
477
});
478
}
479
};
480
481
async.series = function (tasks, callback) {
482
callback = callback || function () {};
483
if (tasks.constructor === Array) {
484
async.mapSeries(tasks, function (fn, callback) {
485
if (fn) {
486
fn(function (err) {
487
var args = Array.prototype.slice.call(arguments, 1);
488
if (args.length <= 1) {
489
args = args[0];
490
}
491
callback.call(null, err, args);
492
});
493
}
494
}, callback);
495
}
496
else {
497
var results = {};
498
async.forEachSeries(_keys(tasks), function (k, callback) {
499
tasks[k](function (err) {
500
var args = Array.prototype.slice.call(arguments, 1);
501
if (args.length <= 1) {
502
args = args[0];
503
}
504
results[k] = args;
505
callback(err);
506
});
507
}, function (err) {
508
callback(err, results);
509
});
510
}
511
};
512
513
async.iterator = function (tasks) {
514
var makeCallback = function (index) {
515
var fn = function () {
516
if (tasks.length) {
517
tasks[index].apply(null, arguments);
518
}
519
return fn.next();
520
};
521
fn.next = function () {
522
return (index < tasks.length - 1) ? makeCallback(index + 1): null;
523
};
524
return fn;
525
};
526
return makeCallback(0);
527
};
528
529
async.apply = function (fn) {
530
var args = Array.prototype.slice.call(arguments, 1);
531
return function () {
532
return fn.apply(
533
null, args.concat(Array.prototype.slice.call(arguments))
534
);
535
};
536
};
537
538
var _concat = function (eachfn, arr, fn, callback) {
539
var r = [];
540
eachfn(arr, function (x, cb) {
541
fn(x, function (err, y) {
542
r = r.concat(y || []);
543
cb(err);
544
});
545
}, function (err) {
546
callback(err, r);
547
});
548
};
549
async.concat = doParallel(_concat);
550
async.concatSeries = doSeries(_concat);
551
552
async.whilst = function (test, iterator, callback) {
553
if (test()) {
554
iterator(function (err) {
555
if (err) {
556
return callback(err);
557
}
558
async.whilst(test, iterator, callback);
559
});
560
}
561
else {
562
callback();
563
}
564
};
565
566
async.until = function (test, iterator, callback) {
567
if (!test()) {
568
iterator(function (err) {
569
if (err) {
570
return callback(err);
571
}
572
async.until(test, iterator, callback);
573
});
574
}
575
else {
576
callback();
577
}
578
};
579
580
async.queue = function (worker, concurrency) {
581
var workers = 0;
582
var q = {
583
tasks: [],
584
concurrency: concurrency,
585
saturated: null,
586
empty: null,
587
drain: null,
588
push: function (data, callback) {
589
if(data.constructor !== Array) {
590
data = [data];
591
}
592
_forEach(data, function(task) {
593
q.tasks.push({
594
data: task,
595
callback: typeof callback === 'function' ? callback : null
596
});
597
if (q.saturated && q.tasks.length == concurrency) {
598
q.saturated();
599
}
600
async.nextTick(q.process);
601
});
602
},
603
process: function () {
604
if (workers < q.concurrency && q.tasks.length) {
605
var task = q.tasks.shift();
606
if(q.empty && q.tasks.length == 0) q.empty();
607
workers += 1;
608
worker(task.data, function () {
609
workers -= 1;
610
if (task.callback) {
611
task.callback.apply(task, arguments);
612
}
613
if(q.drain && q.tasks.length + workers == 0) q.drain();
614
q.process();
615
});
616
}
617
},
618
length: function () {
619
return q.tasks.length;
620
},
621
running: function () {
622
return workers;
623
}
624
};
625
return q;
626
};
627
628
var _console_fn = function (name) {
629
return function (fn) {
630
var args = Array.prototype.slice.call(arguments, 1);
631
fn.apply(null, args.concat([function (err) {
632
var args = Array.prototype.slice.call(arguments, 1);
633
if (typeof console !== 'undefined') {
634
if (err) {
635
if (console.error) {
636
console.error(err);
637
}
638
}
639
else if (console[name]) {
640
_forEach(args, function (x) {
641
console[name](x);
642
});
643
}
644
}
645
}]));
646
};
647
};
648
async.log = _console_fn('log');
649
async.dir = _console_fn('dir');
650
/*async.info = _console_fn('info');
651
async.warn = _console_fn('warn');
652
async.error = _console_fn('error');*/
653
654
async.memoize = function (fn, hasher) {
655
var memo = {};
656
var queues = {};
657
hasher = hasher || function (x) {
658
return x;
659
};
660
var memoized = function () {
661
var args = Array.prototype.slice.call(arguments);
662
var callback = args.pop();
663
var key = hasher.apply(null, args);
664
if (key in memo) {
665
callback.apply(null, memo[key]);
666
}
667
else if (key in queues) {
668
queues[key].push(callback);
669
}
670
else {
671
queues[key] = [callback];
672
fn.apply(null, args.concat([function () {
673
memo[key] = arguments;
674
var q = queues[key];
675
delete queues[key];
676
for (var i = 0, l = q.length; i < l; i++) {
677
q[i].apply(null, arguments);
678
}
679
}]));
680
}
681
};
682
memoized.unmemoized = fn;
683
return memoized;
684
};
685
686
async.unmemoize = function (fn) {
687
return function () {
688
return (fn.unmemoized || fn).apply(null, arguments);
689
};
690
};
691
692
}());
693
694