asyncbox.js
13.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.sleep = sleep;
exports.retry = retry;
exports.nodeify = nodeify;
exports.nodeifyAll = nodeifyAll;
exports.retryInterval = retryInterval;
exports.asyncify = asyncify;
exports.parallel = parallel;
exports.asyncmap = asyncmap;
exports.asyncfilter = asyncfilter;
exports.waitForCondition = waitForCondition;
require("source-map-support/register");
var _bluebird = _interopRequireDefault(require("bluebird"));
var _es6Mapify = require("es6-mapify");
var _lodash = _interopRequireDefault(require("lodash"));
async function sleep(ms) {
return await _bluebird.default.delay(ms);
}
async function retry(times, fn, ...args) {
let tries = 0;
let done = false;
let res = null;
while (!done && tries < times) {
tries++;
try {
res = await fn(...args);
done = true;
} catch (err) {
if (tries >= times) {
throw err;
}
}
}
return res;
}
async function retryInterval(times, sleepMs, fn, ...args) {
let count = 0;
let wrapped = async () => {
count++;
let res;
try {
res = await fn(...args);
} catch (e) {
if (count !== times) {
await sleep(sleepMs);
}
throw e;
}
return res;
};
return await retry(times, wrapped);
}
async function parallel(promises) {
return await _bluebird.default.all(promises);
}
function nodeify(promisey, cb) {
return _bluebird.default.resolve(promisey).nodeify(cb);
}
function nodeifyAll(promiseyMap) {
let cbMap = {};
for (const [name, fn] of (0, _es6Mapify.mapify)(promiseyMap)) {
cbMap[name] = function (...args) {
const _cb = args.slice(-1)[0];
args = args.slice(0, -1);
nodeify(fn(...args), _cb);
};
}
return cbMap;
}
function asyncify(fn, ...args) {
_bluebird.default.resolve(fn(...args)).done();
}
async function asyncmap(coll, mapper, runInParallel = true) {
if (runInParallel) {
return parallel(coll.map(mapper));
}
let newColl = [];
for (let item of coll) {
newColl.push((await mapper(item)));
}
return newColl;
}
async function asyncfilter(coll, filter, runInParallel = true) {
let newColl = [];
if (runInParallel) {
let bools = await parallel(coll.map(filter));
for (let i = 0; i < coll.length; i++) {
if (bools[i]) {
newColl.push(coll[i]);
}
}
} else {
for (let item of coll) {
if (await filter(item)) {
newColl.push(item);
}
}
}
return newColl;
}
async function waitForCondition(condFn, opts = {}) {
_lodash.default.defaults(opts, {
waitMs: 5000,
intervalMs: 500
});
const debug = opts.logger ? opts.logger.debug.bind(opts.logger) : _lodash.default.noop;
const error = opts.error;
const begunAt = Date.now();
const endAt = begunAt + opts.waitMs;
const spin = async function spin() {
const result = await condFn();
if (result) {
return result;
}
const now = Date.now();
const waited = now - begunAt;
if (now < endAt) {
debug(`Waited for ${waited} ms so far`);
await _bluebird.default.delay(opts.intervalMs);
return await spin();
}
throw error ? _lodash.default.isString(error) ? new Error(error) : error : new Error(`Condition unmet after ${waited} ms. Timing out.`);
};
return await spin();
}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hc3luY2JveC5qcyJdLCJuYW1lcyI6WyJzbGVlcCIsIm1zIiwiQiIsImRlbGF5IiwicmV0cnkiLCJ0aW1lcyIsImZuIiwiYXJncyIsInRyaWVzIiwiZG9uZSIsInJlcyIsImVyciIsInJldHJ5SW50ZXJ2YWwiLCJzbGVlcE1zIiwiY291bnQiLCJ3cmFwcGVkIiwiZSIsInBhcmFsbGVsIiwicHJvbWlzZXMiLCJhbGwiLCJub2RlaWZ5IiwicHJvbWlzZXkiLCJjYiIsInJlc29sdmUiLCJub2RlaWZ5QWxsIiwicHJvbWlzZXlNYXAiLCJjYk1hcCIsIm5hbWUiLCJfY2IiLCJzbGljZSIsImFzeW5jaWZ5IiwiYXN5bmNtYXAiLCJjb2xsIiwibWFwcGVyIiwicnVuSW5QYXJhbGxlbCIsIm1hcCIsIm5ld0NvbGwiLCJpdGVtIiwicHVzaCIsImFzeW5jZmlsdGVyIiwiZmlsdGVyIiwiYm9vbHMiLCJpIiwibGVuZ3RoIiwid2FpdEZvckNvbmRpdGlvbiIsImNvbmRGbiIsIm9wdHMiLCJfIiwiZGVmYXVsdHMiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiZGVidWciLCJsb2dnZXIiLCJiaW5kIiwibm9vcCIsImVycm9yIiwiYmVndW5BdCIsIkRhdGUiLCJub3ciLCJlbmRBdCIsInNwaW4iLCJyZXN1bHQiLCJ3YWl0ZWQiLCJpc1N0cmluZyIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBLGVBQWVBLEtBQWYsQ0FBc0JDLEVBQXRCLEVBQTBCO0FBQ3hCLFNBQU8sTUFBTUMsa0JBQUVDLEtBQUYsQ0FBUUYsRUFBUixDQUFiO0FBQ0Q7O0FBRUQsZUFBZUcsS0FBZixDQUFzQkMsS0FBdEIsRUFBNkJDLEVBQTdCLEVBQWlDLEdBQUdDLElBQXBDLEVBQTBDO0FBQ3hDLE1BQUlDLEtBQUssR0FBRyxDQUFaO0FBQ0EsTUFBSUMsSUFBSSxHQUFHLEtBQVg7QUFDQSxNQUFJQyxHQUFHLEdBQUcsSUFBVjs7QUFD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QUFJLENBQUNTLEtBQW5CO0FBQ0EsUUFBTUMsT0FBTyxHQUFHQyxJQUFJLENBQUNDLEdBQUwsRUFBaEI7QUFDQSxRQUFNQyxLQUFLLEdBQUdILE9BQU8sR0FBR1YsSUFBSSxDQUFDRyxNQUE3Qjs7QUFDQSxRQUFNVyxJQUFJLEdBQUcsZUFBZUEsSUFBZixHQUF1QjtBQUNsQyxVQUFNQyxNQUFNLEdBQUcsTUFBTWhCLE1BQU0sRUFBM0I7O0FBQ0EsUUFBSWdCLE1BQUosRUFBWTtBQUNWLGFBQU9BLE1BQVA7QUFDRDs7QUFDRCxVQUFNSCxHQUFHLEdBQUdELElBQUksQ0FBQ0MsR0FBTCxFQUFaO0FBQ0EsVUFBTUksTUFBTSxHQUFHSixHQUFHLEdBQUdGLE9BQXJCOztBQUNBLFFBQUlFLEdBQUcsR0FBR0MsS0FBVixFQUFpQjtBQUNmUixNQUFBQSxLQUFLLENBQUUsY0FBYVcsTUFBTyxZQUF0QixDQUFMO0FBQ0EsWUFBTTVELGtCQUFFQyxLQUFGLENBQVEyQyxJQUFJLENBQUNJLFVBQWIsQ0FBTjtBQUNBLGFBQU8sTUFBTVUsSUFBSSxFQUFqQjtBQUNEOztBQUVELFVBQU1MLEtBQUssR0FDTlIsZ0JBQUVnQixRQUFGLENBQVdSLEtBQVgsSUFBb0IsSUFBSVMsS0FBSixDQUFVVCxLQUFWLENBQXBCLEdBQXVDQSxLQURqQyxHQUVQLElBQUlTLEtBQUosQ0FBVyx5QkFBd0JGLE1BQU8sa0JBQTFDLENBRko7QUFHRCxHQWhCRDs7QUFpQkEsU0FBTyxNQUFNRixJQUFJLEVBQWpCO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBtYXBpZnkgfSBmcm9tICdlczYtbWFwaWZ5JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwIChtcykge1xuICByZXR1cm4gYXdhaXQgQi5kZWxheShtcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5ICh0aW1lcywgZm4sIC4uLmFyZ3MpIHtcbiAgbGV0IHRyaWVzID0gMDtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IHJlcyA9IG51bGw7XG4gIHdoaWxlICghZG9uZSAmJiB0cmllcyA8IHRpbWVzKSB7XG4gICAgdHJpZXMrKztcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0cmllcyA+PSB0aW1lcykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5SW50ZXJ2YWwgKHRpbWVzLCBzbGVlcE1zLCBmbiwgLi4uYXJncykge1xuICBsZXQgY291bnQgPSAwO1xuICBsZXQgd3JhcHBlZCA9IGFzeW5jICgpID0+IHtcbiAgICBjb3VudCsrO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IGZuKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRvIG5vdCBwYXVzZSB3aGVuIGZpbmlzaGVkIHRoZSBsYXN0IHJldHJ5XG4gICAgICBpZiAoY291bnQgIT09IHRpbWVzKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTXMpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHJldHJ5KHRpbWVzLCB3cmFwcGVkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyYWxsZWwgKHByb21pc2VzKSB7XG4gIHJldHVybiBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG59XG5cbmZ1bmN0aW9uIG5vZGVpZnkgKHByb21pc2V5LCBjYikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICByZXR1cm4gQi5yZXNvbHZlKHByb21pc2V5KS5ub2RlaWZ5KGNiKTtcbn1cblxuZnVuY3Rpb24gbm9kZWlmeUFsbCAocHJvbWlzZXlNYXApIHtcbiAgbGV0IGNiTWFwID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIGZuXSBvZiBtYXBpZnkocHJvbWlzZXlNYXApKSB7XG4gICAgY2JNYXBbbmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY29uc3QgX2NiID0gYXJncy5zbGljZSgtMSlbMF07XG4gICAgICBhcmdzID0gYXJncy5zbGljZSgwLCAtMSk7XG4gICAgICBub2RlaWZ5KGZuKC4uLmFyZ3MpLCBfY2IpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNiTWFwO1xufVxuXG5mdW5jdGlvbiBhc3luY2lmeSAoZm4sIC4uLmFyZ3MpIHtcbiAgQi5yZXNvbHZlKGZuKC4uLmFyZ3MpKS5kb25lKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jbWFwIChjb2xsLCBtYXBwZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgcmV0dXJuIHBhcmFsbGVsKGNvbGwubWFwKG1hcHBlcikpO1xuICB9XG5cbiAgbGV0IG5ld0NvbGwgPSBbXTtcbiAgZm9yIChsZXQgaXRlbSBvZiBjb2xsKSB7XG4gICAgbmV3Q29sbC5wdXNoKGF3YWl0IG1hcHBlcihpdGVtKSk7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jZmlsdGVyIChjb2xsLCBmaWx0ZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGxldCBuZXdDb2xsID0gW107XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgbGV0IGJvb2xzID0gYXdhaXQgcGFyYWxsZWwoY29sbC5tYXAoZmlsdGVyKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYm9vbHNbaV0pIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGNvbGxbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbGwpIHtcbiAgICAgIGlmIChhd2FpdCBmaWx0ZXIoaXRlbSkpIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3Q29sbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckNvbmRpdGlvbiAoY29uZEZuLCBvcHRzID0ge30pIHtcbiAgXy5kZWZhdWx0cyhvcHRzLCB7XG4gICAgd2FpdE1zOiA1MDAwLFxuICAgIGludGVydmFsTXM6IDUwMCxcbiAgfSk7XG4gIGNvbnN0IGRlYnVnID0gb3B0cy5sb2dnZXIgPyBvcHRzLmxvZ2dlci5kZWJ1Zy5iaW5kKG9wdHMubG9nZ2VyKSA6IF8ubm9vcDtcbiAgY29uc3QgZXJyb3IgPSBvcHRzLmVycm9yO1xuICBjb25zdCBiZWd1bkF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZW5kQXQgPSBiZWd1bkF0ICsgb3B0cy53YWl0TXM7XG4gIGNvbnN0IHNwaW4gPSBhc3luYyBmdW5jdGlvbiBzcGluICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25kRm4oKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdhaXRlZCA9IG5vdyAtIGJlZ3VuQXQ7XG4gICAgaWYgKG5vdyA8IGVuZEF0KSB7XG4gICAgICBkZWJ1ZyhgV2FpdGVkIGZvciAke3dhaXRlZH0gbXMgc28gZmFyYCk7XG4gICAgICBhd2FpdCBCLmRlbGF5KG9wdHMuaW50ZXJ2YWxNcyk7XG4gICAgICByZXR1cm4gYXdhaXQgc3BpbigpO1xuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvcHRpb24sIGl0IGlzIGVpdGhlciBhIHN0cmluZyBtZXNzYWdlIG9yIGFuIGVycm9yIGl0c2VsZlxuICAgIHRocm93IGVycm9yXG4gICAgICA/IChfLmlzU3RyaW5nKGVycm9yKSA/IG5ldyBFcnJvcihlcnJvcikgOiBlcnJvcilcbiAgICAgIDogbmV3IEVycm9yKGBDb25kaXRpb24gdW5tZXQgYWZ0ZXIgJHt3YWl0ZWR9IG1zLiBUaW1pbmcgb3V0LmApO1xuICB9O1xuICByZXR1cm4gYXdhaXQgc3BpbigpO1xufVxuXG5leHBvcnQge1xuICBzbGVlcCwgcmV0cnksIG5vZGVpZnksIG5vZGVpZnlBbGwsIHJldHJ5SW50ZXJ2YWwsIGFzeW5jaWZ5LCBwYXJhbGxlbCxcbiAgYXN5bmNtYXAsIGFzeW5jZmlsdGVyLCB3YWl0Rm9yQ29uZGl0aW9uXG59O1xuIl0sImZpbGUiOiJsaWIvYXN5bmNib3guanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==