Comparing version 2.9.4 to 3.0.0
@@ -126,3 +126,3 @@ /** | ||
export function longSleep(ms: number, { thresholdMs, intervalMs, progressCb, }?: LongSleepOptions | undefined): Promise<void>; | ||
import B from "bluebird"; | ||
import B from 'bluebird'; | ||
//# sourceMappingURL=asyncbox.d.ts.map |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.asyncfilter = asyncfilter; | ||
exports.asyncify = asyncify; | ||
exports.asyncmap = asyncmap; | ||
exports.longSleep = longSleep; | ||
exports.nodeify = nodeify; | ||
exports.nodeifyAll = nodeifyAll; | ||
exports.parallel = void 0; | ||
exports.retry = retry; | ||
exports.retryInterval = retryInterval; | ||
exports.sleep = sleep; | ||
exports.waitForCondition = waitForCondition; | ||
require("source-map-support/register"); | ||
var _bluebird = _interopRequireDefault(require("bluebird")); | ||
var _lodash = _interopRequireDefault(require("lodash")); | ||
const LONG_SLEEP_THRESHOLD = 5000; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.longSleep = exports.waitForCondition = exports.asyncfilter = exports.asyncmap = exports.parallel = exports.asyncify = exports.retryInterval = exports.nodeifyAll = exports.nodeify = exports.retry = exports.sleep = void 0; | ||
const bluebird_1 = __importDefault(require("bluebird")); | ||
const lodash_1 = __importDefault(require("lodash")); | ||
const LONG_SLEEP_THRESHOLD = 5000; // anything over 5000ms will turn into a spin | ||
/** | ||
* An async/await version of setTimeout | ||
* @param {number} ms | ||
* @returns {Promise<void>} | ||
*/ | ||
async function sleep(ms) { | ||
return await _bluebird.default.delay(ms); | ||
return await bluebird_1.default.delay(ms); | ||
} | ||
async function longSleep(ms, { | ||
thresholdMs = LONG_SLEEP_THRESHOLD, | ||
intervalMs = 1000, | ||
progressCb = null | ||
} = {}) { | ||
if (ms < thresholdMs) { | ||
return await sleep(ms); | ||
} | ||
const endAt = Date.now() + ms; | ||
let timeLeft; | ||
let elapsedMs = 0; | ||
do { | ||
const pre = Date.now(); | ||
await sleep(intervalMs); | ||
const post = Date.now(); | ||
timeLeft = endAt - post; | ||
elapsedMs = elapsedMs + (post - pre); | ||
if (_lodash.default.isFunction(progressCb)) { | ||
progressCb({ | ||
elapsedMs, | ||
timeLeft, | ||
progress: elapsedMs / ms | ||
}); | ||
exports.sleep = sleep; | ||
/** | ||
* Sometimes `Promise.delay` or `setTimeout` are inaccurate for large wait | ||
* times. To safely wait for these long times (e.g. in the 5+ minute range), you | ||
* can use `longSleep`. | ||
* | ||
* sYou can also pass a `progressCb` option which is a callback function that | ||
* receives an object with the properties `elapsedMs`, `timeLeft`, and | ||
* `progress`. This will be called on every wait interval so you can do your | ||
* wait logging or whatever. | ||
* @param {number} ms | ||
* @param {LongSleepOptions} [opts] | ||
* @returns {Promise<void>} | ||
*/ | ||
async function longSleep(ms, { thresholdMs = LONG_SLEEP_THRESHOLD, intervalMs = 1000, progressCb = null, } = {}) { | ||
if (ms < thresholdMs) { | ||
return await sleep(ms); | ||
} | ||
} while (timeLeft > 0); | ||
const endAt = Date.now() + ms; | ||
let timeLeft; | ||
let elapsedMs = 0; | ||
do { | ||
const pre = Date.now(); | ||
await sleep(intervalMs); | ||
const post = Date.now(); | ||
timeLeft = endAt - post; | ||
elapsedMs = elapsedMs + (post - pre); | ||
if (lodash_1.default.isFunction(progressCb)) { | ||
progressCb({ elapsedMs, timeLeft, progress: elapsedMs / ms }); | ||
} | ||
} while (timeLeft > 0); | ||
} | ||
exports.longSleep = longSleep; | ||
/** | ||
* An async/await way of running a method until it doesn't throw an error | ||
* @template [T=any] | ||
* @param {number} times | ||
* @param {(...args: any[]) => Promise<T>} fn | ||
* @param {...any} args | ||
* @returns {Promise<T?>} | ||
*/ | ||
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; | ||
} | ||
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; | ||
return res; | ||
} | ||
exports.retry = retry; | ||
/** | ||
* You can also use `retryInterval` to add a sleep in between retries. This can | ||
* be useful if you want to throttle how fast we retry. | ||
* @template [T=any] | ||
* @param {number} times | ||
* @param {number} sleepMs | ||
* @param {(...args: any[]) => Promise<T>} fn | ||
* @param {...any} args | ||
* @returns {Promise<T?>} | ||
*/ | ||
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); | ||
let count = 0; | ||
let wrapped = async () => { | ||
count++; | ||
let res; | ||
try { | ||
res = await fn(...args); | ||
} | ||
catch (e) { | ||
// do not pause when finished the last retry | ||
if (count !== times) { | ||
await sleep(sleepMs); | ||
} | ||
throw e; | ||
} | ||
return res; | ||
}; | ||
return await retry(times, wrapped); | ||
} | ||
const parallel = _bluebird.default.all; | ||
exports.retryInterval = retryInterval; | ||
const parallel = bluebird_1.default.all; | ||
exports.parallel = parallel; | ||
/** | ||
* Export async functions (Promises) and import this with your ES5 code to use | ||
* it with Node. | ||
* @template [R=any] | ||
* @param {any} promisey | ||
* @param {(err: any, value?: R) => void} cb | ||
* @returns {Promise<R>} | ||
*/ | ||
function nodeify(promisey, cb) { | ||
return _bluebird.default.resolve(promisey).nodeify(cb); | ||
return bluebird_1.default.resolve(promisey).nodeify(cb); | ||
} | ||
exports.nodeify = nodeify; | ||
/** | ||
* Node-ify an entire object of `Promise`-returning functions | ||
* @param {Record<string,(...args: any[]) => any>} promiseyMap | ||
* @returns {Record<string,(...args: any[])=>void>} | ||
*/ | ||
function nodeifyAll(promiseyMap) { | ||
let cbMap = {}; | ||
for (const [name, fn] of _lodash.default.toPairs(promiseyMap)) { | ||
cbMap[name] = function (...args) { | ||
const _cb = args.slice(-1)[0]; | ||
args = args.slice(0, -1); | ||
nodeify(fn(...args), _cb); | ||
}; | ||
} | ||
return cbMap; | ||
/** @type {Record<string,(...args: any[])=>void>} */ | ||
let cbMap = {}; | ||
for (const [name, fn] of lodash_1.default.toPairs(promiseyMap)) { | ||
cbMap[name] = function (...args) { | ||
const _cb = args.slice(-1)[0]; | ||
args = args.slice(0, -1); | ||
nodeify(fn(...args), _cb); | ||
}; | ||
} | ||
return cbMap; | ||
} | ||
exports.nodeifyAll = nodeifyAll; | ||
/** | ||
* @param {(...args: any[]) => any|Promise<any>} fn | ||
* @param {...any} args | ||
*/ | ||
function asyncify(fn, ...args) { | ||
_bluebird.default.resolve(fn(...args)).done(); | ||
bluebird_1.default.resolve(fn(...args)).done(); | ||
} | ||
exports.asyncify = asyncify; | ||
/** | ||
* Similar to `Array.prototype.map`; runs in serial | ||
* @param {any[]} coll | ||
* @param {(value: any) => any|Promise<any>} mapper | ||
* @returns {Promise<any[]>} | ||
*/ | ||
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; | ||
if (runInParallel) { | ||
return parallel(coll.map(mapper)); | ||
} | ||
let newColl = []; | ||
for (let item of coll) { | ||
newColl.push(await mapper(item)); | ||
} | ||
return newColl; | ||
} | ||
exports.asyncmap = asyncmap; | ||
/** | ||
* Similar to `Array.prototype.filter` | ||
* @param {any[]} coll | ||
* @param {(value: any) => any|Promise<any>} filter | ||
* @param {boolean} runInParallel | ||
* @returns {Promise<any[]>} | ||
*/ | ||
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]); | ||
} | ||
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); | ||
} | ||
else { | ||
for (let item of coll) { | ||
if (await filter(item)) { | ||
newColl.push(item); | ||
} | ||
} | ||
} | ||
} | ||
return newColl; | ||
return newColl; | ||
} | ||
exports.asyncfilter = asyncfilter; | ||
/** | ||
* Takes a condition (a function returning a boolean or boolean promise), and | ||
* waits until the condition is true. | ||
* | ||
* Throws a `/Condition unmet/` error if the condition has not been satisfied | ||
* within the allocated time, unless an error is provided in the options, as the | ||
* `error` property, which is either thrown itself, or used as the message. | ||
* | ||
* The condition result is returned if it is not falsy. If the condition throws an | ||
* error then this exception will be immediately passed through. | ||
* | ||
* The default options are: `{ waitMs: 5000, intervalMs: 500 }` | ||
* @template T | ||
* @param {() => Promise<T>|T} condFn | ||
* @param {WaitForConditionOptions} [options] | ||
* @returns {Promise<T>} | ||
*/ | ||
async function waitForCondition(condFn, options = {}) { | ||
const opts = _lodash.default.defaults(options, { | ||
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; | ||
const remainingTime = endAt - now; | ||
if (now < endAt) { | ||
debug(`Waited for ${waited} ms so far`); | ||
await _bluebird.default.delay(Math.min(opts.intervalMs, remainingTime)); | ||
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FzeW5jYm94LmpzIiwibmFtZXMiOlsiTE9OR19TTEVFUF9USFJFU0hPTEQiLCJzbGVlcCIsIm1zIiwiQiIsImRlbGF5IiwibG9uZ1NsZWVwIiwidGhyZXNob2xkTXMiLCJpbnRlcnZhbE1zIiwicHJvZ3Jlc3NDYiIsImVuZEF0IiwiRGF0ZSIsIm5vdyIsInRpbWVMZWZ0IiwiZWxhcHNlZE1zIiwicHJlIiwicG9zdCIsIl8iLCJpc0Z1bmN0aW9uIiwicHJvZ3Jlc3MiLCJyZXRyeSIsInRpbWVzIiwiZm4iLCJhcmdzIiwidHJpZXMiLCJkb25lIiwicmVzIiwiZXJyIiwicmV0cnlJbnRlcnZhbCIsInNsZWVwTXMiLCJjb3VudCIsIndyYXBwZWQiLCJlIiwicGFyYWxsZWwiLCJhbGwiLCJub2RlaWZ5IiwicHJvbWlzZXkiLCJjYiIsInJlc29sdmUiLCJub2RlaWZ5QWxsIiwicHJvbWlzZXlNYXAiLCJjYk1hcCIsIm5hbWUiLCJ0b1BhaXJzIiwiX2NiIiwic2xpY2UiLCJhc3luY2lmeSIsImFzeW5jbWFwIiwiY29sbCIsIm1hcHBlciIsInJ1bkluUGFyYWxsZWwiLCJtYXAiLCJuZXdDb2xsIiwiaXRlbSIsInB1c2giLCJhc3luY2ZpbHRlciIsImZpbHRlciIsImJvb2xzIiwiaSIsImxlbmd0aCIsIndhaXRGb3JDb25kaXRpb24iLCJjb25kRm4iLCJvcHRpb25zIiwib3B0cyIsImRlZmF1bHRzIiwid2FpdE1zIiwiZGVidWciLCJsb2dnZXIiLCJiaW5kIiwibm9vcCIsImVycm9yIiwiYmVndW5BdCIsInNwaW4iLCJyZXN1bHQiLCJ3YWl0ZWQiLCJyZW1haW5pbmdUaW1lIiwiTWF0aCIsIm1pbiIsImlzU3RyaW5nIiwiRXJyb3IiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvYXN5bmNib3guanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgTE9OR19TTEVFUF9USFJFU0hPTEQgPSA1MDAwOyAvLyBhbnl0aGluZyBvdmVyIDUwMDBtcyB3aWxsIHR1cm4gaW50byBhIHNwaW5cblxuLyoqXG4gKiBBbiBhc3luYy9hd2FpdCB2ZXJzaW9uIG9mIHNldFRpbWVvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtc1xuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwIChtcykge1xuICByZXR1cm4gYXdhaXQgQi5kZWxheShtcyk7XG59XG5cbi8qKlxuICogU29tZXRpbWVzIGBQcm9taXNlLmRlbGF5YCBvciBgc2V0VGltZW91dGAgYXJlIGluYWNjdXJhdGUgZm9yIGxhcmdlIHdhaXRcbiAqIHRpbWVzLiBUbyBzYWZlbHkgd2FpdCBmb3IgdGhlc2UgbG9uZyB0aW1lcyAoZS5nLiBpbiB0aGUgNSsgbWludXRlIHJhbmdlKSwgeW91XG4gKiBjYW4gdXNlIGBsb25nU2xlZXBgLlxuICpcbiAqIHNZb3UgY2FuIGFsc28gcGFzcyBhIGBwcm9ncmVzc0NiYCBvcHRpb24gd2hpY2ggaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0XG4gKiByZWNlaXZlcyBhbiBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcyBgZWxhcHNlZE1zYCwgYHRpbWVMZWZ0YCwgYW5kXG4gKiBgcHJvZ3Jlc3NgLiBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIGV2ZXJ5IHdhaXQgaW50ZXJ2YWwgc28geW91IGNhbiBkbyB5b3VyXG4gKiB3YWl0IGxvZ2dpbmcgb3Igd2hhdGV2ZXIuXG4gKiBAcGFyYW0ge251bWJlcn0gbXNcbiAqIEBwYXJhbSB7TG9uZ1NsZWVwT3B0aW9uc30gW29wdHNdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9uZ1NsZWVwIChtcywge1xuICB0aHJlc2hvbGRNcyA9IExPTkdfU0xFRVBfVEhSRVNIT0xELFxuICBpbnRlcnZhbE1zID0gMTAwMCxcbiAgcHJvZ3Jlc3NDYiA9IG51bGwsXG59ID0ge30pIHtcbiAgaWYgKG1zIDwgdGhyZXNob2xkTXMpIHtcbiAgICByZXR1cm4gYXdhaXQgc2xlZXAobXMpO1xuICB9XG4gIGNvbnN0IGVuZEF0ID0gRGF0ZS5ub3coKSArIG1zO1xuICBsZXQgdGltZUxlZnQ7XG4gIGxldCBlbGFwc2VkTXMgPSAwO1xuICBkbyB7XG4gICAgY29uc3QgcHJlID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBzbGVlcChpbnRlcnZhbE1zKTtcbiAgICBjb25zdCBwb3N0ID0gRGF0ZS5ub3coKTtcbiAgICB0aW1lTGVmdCA9IGVuZEF0IC0gcG9zdDtcbiAgICBlbGFwc2VkTXMgPSBlbGFwc2VkTXMgKyAocG9zdCAtIHByZSk7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwcm9ncmVzc0NiKSkge1xuICAgICAgcHJvZ3Jlc3NDYih7ZWxhcHNlZE1zLCB0aW1lTGVmdCwgcHJvZ3Jlc3M6IGVsYXBzZWRNcyAvIG1zfSk7XG4gICAgfVxuICB9IHdoaWxlICh0aW1lTGVmdCA+IDApO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jL2F3YWl0IHdheSBvZiBydW5uaW5nIGEgbWV0aG9kIHVudGlsIGl0IGRvZXNuJ3QgdGhyb3cgYW4gZXJyb3JcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZXNcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5ICh0aW1lcywgZm4sIC4uLmFyZ3MpIHtcbiAgbGV0IHRyaWVzID0gMDtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IHJlcyA9IG51bGw7XG4gIHdoaWxlICghZG9uZSAmJiB0cmllcyA8IHRpbWVzKSB7XG4gICAgdHJpZXMrKztcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0cmllcyA+PSB0aW1lcykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogWW91IGNhbiBhbHNvIHVzZSBgcmV0cnlJbnRlcnZhbGAgdG8gYWRkIGEgc2xlZXAgaW4gYmV0d2VlbiByZXRyaWVzLiBUaGlzIGNhblxuICogYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHRocm90dGxlIGhvdyBmYXN0IHdlIHJldHJ5LlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc1xuICogQHBhcmFtIHtudW1iZXJ9IHNsZWVwTXNcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5SW50ZXJ2YWwgKHRpbWVzLCBzbGVlcE1zLCBmbiwgLi4uYXJncykge1xuICBsZXQgY291bnQgPSAwO1xuICBsZXQgd3JhcHBlZCA9IGFzeW5jICgpID0+IHtcbiAgICBjb3VudCsrO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IGZuKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRvIG5vdCBwYXVzZSB3aGVuIGZpbmlzaGVkIHRoZSBsYXN0IHJldHJ5XG4gICAgICBpZiAoY291bnQgIT09IHRpbWVzKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTXMpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHJldHJ5KHRpbWVzLCB3cmFwcGVkKTtcbn1cblxuY29uc3QgcGFyYWxsZWwgPSBCLmFsbDtcblxuLyoqXG4gKiBFeHBvcnQgYXN5bmMgZnVuY3Rpb25zIChQcm9taXNlcykgYW5kIGltcG9ydCB0aGlzIHdpdGggeW91ciBFUzUgY29kZSB0byB1c2VcbiAqIGl0IHdpdGggTm9kZS5cbiAqIEB0ZW1wbGF0ZSBbUj1hbnldXG4gKiBAcGFyYW0ge2FueX0gcHJvbWlzZXlcbiAqIEBwYXJhbSB7KGVycjogYW55LCB2YWx1ZT86IFIpID0+IHZvaWR9IGNiXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSPn1cbiAqL1xuZnVuY3Rpb24gbm9kZWlmeSAocHJvbWlzZXksIGNiKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzXG4gIHJldHVybiBCLnJlc29sdmUocHJvbWlzZXkpLm5vZGVpZnkoY2IpO1xufVxuXG4vKipcbiAqIE5vZGUtaWZ5IGFuIGVudGlyZSBvYmplY3Qgb2YgYFByb21pc2VgLXJldHVybmluZyBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywoLi4uYXJnczogYW55W10pID0+IGFueT59IHByb21pc2V5TWFwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywoLi4uYXJnczogYW55W10pPT52b2lkPn1cbiAqL1xuZnVuY3Rpb24gbm9kZWlmeUFsbCAocHJvbWlzZXlNYXApIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCguLi5hcmdzOiBhbnlbXSk9PnZvaWQ+fSAqL1xuICBsZXQgY2JNYXAgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZm5dIG9mIF8udG9QYWlycyhwcm9taXNleU1hcCkpIHtcbiAgICBjYk1hcFtuYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBjb25zdCBfY2IgPSBhcmdzLnNsaWNlKC0xKVswXTtcbiAgICAgIGFyZ3MgPSBhcmdzLnNsaWNlKDAsIC0xKTtcbiAgICAgIG5vZGVpZnkoZm4oLi4uYXJncyksIF9jYik7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gY2JNYXA7XG59XG5cbi8qKlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueXxQcm9taXNlPGFueT59IGZuXG4gKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAqL1xuZnVuY3Rpb24gYXN5bmNpZnkgKGZuLCAuLi5hcmdzKSB7XG4gIEIucmVzb2x2ZShmbiguLi5hcmdzKSkuZG9uZSgpO1xufVxuXG4vKipcbiAqIFNpbWlsYXIgdG8gYEFycmF5LnByb3RvdHlwZS5tYXBgOyBydW5zIGluIHNlcmlhbFxuICogQHBhcmFtIHthbnlbXX0gY29sbFxuICogQHBhcmFtIHsodmFsdWU6IGFueSkgPT4gYW55fFByb21pc2U8YW55Pn0gbWFwcGVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jbWFwIChjb2xsLCBtYXBwZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgcmV0dXJuIHBhcmFsbGVsKGNvbGwubWFwKG1hcHBlcikpO1xuICB9XG5cbiAgbGV0IG5ld0NvbGwgPSBbXTtcbiAgZm9yIChsZXQgaXRlbSBvZiBjb2xsKSB7XG4gICAgbmV3Q29sbC5wdXNoKGF3YWl0IG1hcHBlcihpdGVtKSk7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbGw7XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmBcbiAqIEBwYXJhbSB7YW55W119IGNvbGxcbiAqIEBwYXJhbSB7KHZhbHVlOiBhbnkpID0+IGFueXxQcm9taXNlPGFueT59IGZpbHRlclxuICogQHBhcmFtIHtib29sZWFufSBydW5JblBhcmFsbGVsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jZmlsdGVyIChjb2xsLCBmaWx0ZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGxldCBuZXdDb2xsID0gW107XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgbGV0IGJvb2xzID0gYXdhaXQgcGFyYWxsZWwoY29sbC5tYXAoZmlsdGVyKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYm9vbHNbaV0pIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGNvbGxbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbGwpIHtcbiAgICAgIGlmIChhd2FpdCBmaWx0ZXIoaXRlbSkpIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3Q29sbDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNvbmRpdGlvbiAoYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBib29sZWFuIG9yIGJvb2xlYW4gcHJvbWlzZSksIGFuZFxuICogd2FpdHMgdW50aWwgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLlxuICpcbiAqIFRocm93cyBhIGAvQ29uZGl0aW9uIHVubWV0L2AgZXJyb3IgaWYgdGhlIGNvbmRpdGlvbiBoYXMgbm90IGJlZW4gc2F0aXNmaWVkXG4gKiB3aXRoaW4gdGhlIGFsbG9jYXRlZCB0aW1lLCB1bmxlc3MgYW4gZXJyb3IgaXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnMsIGFzIHRoZVxuICogYGVycm9yYCBwcm9wZXJ0eSwgd2hpY2ggaXMgZWl0aGVyIHRocm93biBpdHNlbGYsIG9yIHVzZWQgYXMgdGhlIG1lc3NhZ2UuXG4gKlxuICogVGhlIGNvbmRpdGlvbiByZXN1bHQgaXMgcmV0dXJuZWQgaWYgaXQgaXMgbm90IGZhbHN5LiBJZiB0aGUgY29uZGl0aW9uIHRocm93cyBhblxuICogZXJyb3IgdGhlbiB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIGltbWVkaWF0ZWx5IHBhc3NlZCB0aHJvdWdoLlxuICpcbiAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgYXJlOiBgeyB3YWl0TXM6IDUwMDAsIGludGVydmFsTXM6IDUwMCB9YFxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPnxUfSBjb25kRm5cbiAqIEBwYXJhbSB7V2FpdEZvckNvbmRpdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb25kaXRpb24gKGNvbmRGbiwgb3B0aW9ucyA9IHt9KSB7XG4gIC8qKiBAdHlwZSB7V2FpdEZvckNvbmRpdGlvbk9wdGlvbnMgJiB7d2FpdE1zOiBudW1iZXIsIGludGVydmFsTXM6IG51bWJlcn19ICovXG4gIGNvbnN0IG9wdHMgPSBfLmRlZmF1bHRzKG9wdGlvbnMsIHtcbiAgICB3YWl0TXM6IDUwMDAsXG4gICAgaW50ZXJ2YWxNczogNTAwLFxuICB9KTtcbiAgY29uc3QgZGVidWcgPSBvcHRzLmxvZ2dlciA/IG9wdHMubG9nZ2VyLmRlYnVnLmJpbmQob3B0cy5sb2dnZXIpIDogXy5ub29wO1xuICBjb25zdCBlcnJvciA9IG9wdHMuZXJyb3I7XG4gIGNvbnN0IGJlZ3VuQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlbmRBdCA9IGJlZ3VuQXQgKyBvcHRzLndhaXRNcztcbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAqL1xuICBjb25zdCBzcGluID0gYXN5bmMgZnVuY3Rpb24gc3BpbiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29uZEZuKCk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3YWl0ZWQgPSBub3cgLSBiZWd1bkF0O1xuICAgIGNvbnN0IHJlbWFpbmluZ1RpbWUgPSBlbmRBdCAtIG5vdztcbiAgICBpZiAobm93IDwgZW5kQXQpIHtcbiAgICAgIGRlYnVnKGBXYWl0ZWQgZm9yICR7d2FpdGVkfSBtcyBzbyBmYXJgKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoTWF0aC5taW4ob3B0cy5pbnRlcnZhbE1zLCByZW1haW5pbmdUaW1lKSk7XG4gICAgICByZXR1cm4gYXdhaXQgc3BpbigpO1xuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvcHRpb24sIGl0IGlzIGVpdGhlciBhIHN0cmluZyBtZXNzYWdlIG9yIGFuIGVycm9yIGl0c2VsZlxuICAgIHRocm93IGVycm9yXG4gICAgICA/IChfLmlzU3RyaW5nKGVycm9yKSA/IG5ldyBFcnJvcihlcnJvcikgOiBlcnJvcilcbiAgICAgIDogbmV3IEVycm9yKGBDb25kaXRpb24gdW5tZXQgYWZ0ZXIgJHt3YWl0ZWR9IG1zLiBUaW1pbmcgb3V0LmApO1xuICB9O1xuICByZXR1cm4gYXdhaXQgc3BpbigpO1xufVxuXG5leHBvcnQge1xuICBzbGVlcCwgcmV0cnksIG5vZGVpZnksIG5vZGVpZnlBbGwsIHJldHJ5SW50ZXJ2YWwsIGFzeW5jaWZ5LCBwYXJhbGxlbCxcbiAgYXN5bmNtYXAsIGFzeW5jZmlsdGVyLCB3YWl0Rm9yQ29uZGl0aW9uLCBsb25nU2xlZXAsXG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB3YWl0Rm9yQ29uZGl0aW9ufVxuICogQHR5cGVkZWYgV2FpdEZvckNvbmRpdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd2FpdE1zXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbnRlcnZhbE1zXVxuICogQHByb3BlcnR5IHt7ZGVidWc6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH19IFtsb2dnZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ3xFcnJvcn0gW2Vycm9yXVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGxvbmdTbGVlcH1cbiAqIEB0eXBlZGVmIExvbmdTbGVlcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyZXNob2xkTXNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2ludGVydmFsTXNdXG4gKiBAcHJvcGVydHkge1Byb2dyZXNzQ2FsbGJhY2s/fSBbcHJvZ3Jlc3NDYl1cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlciBwcm92aWRlZCB0byBhIHtAbGluayBQcm9ncmVzc0NhbGxiYWNrfVxuICogQHR5cGVkZWYgUHJvZ3Jlc3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbGFwc2VkTXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lTGVmdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByb2dyZXNzXG4gKi9cblxuLyoqXG4gKiBQcm9ncmVzcyBjYWxsYmFjayBmb3Ige0BsaW5rIGxvbmdTbGVlcH1cbiAqIEBjYWxsYmFjayBQcm9ncmVzc0NhbGxiYWNrXG4gKiBAcGFyYW0ge1Byb2dyZXNzfSBwcm9ncmVzc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTs7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyxJQUFJOztBQU9qQyxlQUFlQyxLQUFLLENBQUVDLEVBQUUsRUFBRTtFQUN4QixPQUFPLE1BQU1DLGlCQUFDLENBQUNDLEtBQUssQ0FBQ0YsRUFBRSxDQUFDO0FBQzFCOztBQWVBLGVBQWVHLFNBQVMsQ0FBRUgsRUFBRSxFQUFFO0VBQzVCSSxXQUFXLEdBQUdOLG9CQUFvQjtFQUNsQ08sVUFBVSxHQUFHLElBQUk7RUFDakJDLFVBQVUsR0FBRztBQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNOLElBQUlOLEVBQUUsR0FBR0ksV0FBVyxFQUFFO0lBQ3BCLE9BQU8sTUFBTUwsS0FBSyxDQUFDQyxFQUFFLENBQUM7RUFDeEI7RUFDQSxNQUFNTyxLQUFLLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLEdBQUdULEVBQUU7RUFDN0IsSUFBSVUsUUFBUTtFQUNaLElBQUlDLFNBQVMsR0FBRyxDQUFDO0VBQ2pCLEdBQUc7SUFDRCxNQUFNQyxHQUFHLEdBQUdKLElBQUksQ0FBQ0MsR0FBRyxFQUFFO0lBQ3RCLE1BQU1WLEtBQUssQ0FBQ00sVUFBVSxDQUFD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 | ||
/** @type {WaitForConditionOptions & {waitMs: number, intervalMs: number}} */ | ||
const opts = lodash_1.default.defaults(options, { | ||
waitMs: 5000, | ||
intervalMs: 500, | ||
}); | ||
const debug = opts.logger ? opts.logger.debug.bind(opts.logger) : lodash_1.default.noop; | ||
const error = opts.error; | ||
const begunAt = Date.now(); | ||
const endAt = begunAt + opts.waitMs; | ||
/** @returns {Promise<T>} */ | ||
const spin = async function spin() { | ||
const result = await condFn(); | ||
if (result) { | ||
return result; | ||
} | ||
const now = Date.now(); | ||
const waited = now - begunAt; | ||
const remainingTime = endAt - now; | ||
if (now < endAt) { | ||
debug(`Waited for ${waited} ms so far`); | ||
await bluebird_1.default.delay(Math.min(opts.intervalMs, remainingTime)); | ||
return await spin(); | ||
} | ||
// if there is an error option, it is either a string message or an error itself | ||
throw error | ||
? (lodash_1.default.isString(error) ? new Error(error) : error) | ||
: new Error(`Condition unmet after ${waited} ms. Timing out.`); | ||
}; | ||
return await spin(); | ||
} | ||
exports.waitForCondition = waitForCondition; | ||
/** | ||
* Options for {@link waitForCondition} | ||
* @typedef WaitForConditionOptions | ||
* @property {number} [waitMs] | ||
* @property {number} [intervalMs] | ||
* @property {{debug: (...args: any[]) => void}} [logger] | ||
* @property {string|Error} [error] | ||
*/ | ||
/** | ||
* Options for {@link longSleep} | ||
* @typedef LongSleepOptions | ||
* @property {number} [thresholdMs] | ||
* @property {number} [intervalMs] | ||
* @property {ProgressCallback?} [progressCb] | ||
*/ | ||
/** | ||
* Parameter provided to a {@link ProgressCallback} | ||
* @typedef Progress | ||
* @property {number} elapsedMs | ||
* @property {number} timeLeft | ||
* @property {number} progress | ||
*/ | ||
/** | ||
* Progress callback for {@link longSleep} | ||
* @callback ProgressCallback | ||
* @param {Progress} progress | ||
* @returns {void} | ||
*/ | ||
//# sourceMappingURL=asyncbox.js.map |
@@ -1,3 +0,1 @@ | ||
// transpile:main | ||
import B from 'bluebird'; | ||
@@ -4,0 +2,0 @@ import _ from 'lodash'; |
@@ -9,3 +9,3 @@ { | ||
], | ||
"version": "2.9.4", | ||
"version": "3.0.0", | ||
"author": "jlipps@gmail.com", | ||
@@ -21,3 +21,3 @@ "license": "Apache-2.0", | ||
"engines": { | ||
"node": ">=10" | ||
"node": ">=16" | ||
}, | ||
@@ -34,31 +34,39 @@ "main": "./build/lib/asyncbox.js", | ||
"dependencies": { | ||
"@babel/runtime": "^7.0.0", | ||
"bluebird": "^3.5.1", | ||
"lodash": "^4.17.4", | ||
"source-map-support": "^0.5.5", | ||
"@types/bluebird": "^3.5.37" | ||
"source-map-support": "^0.x" | ||
}, | ||
"scripts": { | ||
"clean": "rm -rf node_modules && rm -f package-lock.json && npm install", | ||
"prepare": "gulp prepublish && tsc", | ||
"test": "gulp once", | ||
"e2e-test": "gulp e2e-test", | ||
"build": "gulp transpile && tsc", | ||
"lint": "gulp eslint", | ||
"watch": "gulp watch" | ||
"build": "tsc -b", | ||
"clean": "npm run build -- --clean", | ||
"rebuild": "npm run clean; npm run build", | ||
"dev": "npm run build -- --watch", | ||
"prepare": "npm run rebuild", | ||
"test": "mocha --exit --timeout 1m \"./test/**/*-specs.js\"", | ||
"lint": "eslint .", | ||
"watch": "npm run dev" | ||
}, | ||
"devDependencies": { | ||
"@appium/eslint-config-appium": "^8.0.4", | ||
"@appium/eslint-config-appium-ts": "^0.x", | ||
"@appium/tsconfig": "^0.x", | ||
"@types/bluebird": "^3.5.37", | ||
"@types/lodash": "^4.14.189", | ||
"ajv": "^6.5.3", | ||
"appium-gulp-plugins": "^4.0.0", | ||
"chai": "4.2.0", | ||
"@types/node": "^20.4.7", | ||
"@typescript-eslint/eslint-plugin": "^6.9.0", | ||
"@typescript-eslint/parser": "^6.9.0", | ||
"chai": "^4.2.0", | ||
"chai-as-promised": "^7.1.1", | ||
"eslint-config-appium": "^4.0.0", | ||
"gulp": "^4.0.0", | ||
"request": "^2.47.0", | ||
"should": "^13.2.1", | ||
"sinon": "^11.1.2", | ||
"typescript": "~4.7.0" | ||
"eslint": "^8.46.0", | ||
"eslint-config-prettier": "^9.0.0", | ||
"eslint-import-resolver-typescript": "^3.5.5", | ||
"eslint-plugin-import": "^2.28.0", | ||
"eslint-plugin-mocha": "^10.1.0", | ||
"eslint-plugin-promise": "^6.1.1", | ||
"mocha": "^10.0.0", | ||
"sinon": "^16.0.0", | ||
"ts-node": "^10.9.1", | ||
"typescript": "^5.1.6" | ||
}, | ||
"types": "./build/lib/asyncbox.d.ts" | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
3
8
650
0
44877
20
- Removed@babel/runtime@^7.0.0
- Removed@types/bluebird@^3.5.37
- Removed@babel/runtime@7.26.0(transitive)
- Removed@types/bluebird@3.5.42(transitive)
- Removedregenerator-runtime@0.14.1(transitive)
Updatedsource-map-support@^0.x