UNPKG

1.43 kBJavaScriptView Raw
1const lodash = require('lodash');
2const sign = require('./sign');
3const format = require('./format');
4
5function assert(bool, value) {
6 if (!bool) {
7 if (lodash.isPlainObject(value)) {
8 value = JSON.stringify(value);
9 }
10 throw new Error(value);
11 }
12}
13
14/**
15 * Await sleep.
16 *
17 * @memberOf utils
18 * @param ms {number} - Sleep duration in ms.
19 * @return {Promise<undefined>}
20 */
21function sleep(ms) {
22 return new Promise(resolve => setTimeout(resolve, ms));
23}
24
25/**
26 * Loop execute `func` if it return `undefined`
27 *
28 * @memberOf utils
29 * @param [options] {object}
30 * @param [options.delta=1000] {number} - Loop transaction interval in ms.
31 * @param [options.timeout=30*1000] {number} - Loop timeout in ms.
32 * @param func {function} - Function to execute.
33 * @return {Promise<*>}
34 */
35async function loop({ delta = 1000, timeout = 30 * 1000 }, func) {
36 const startTime = Date.now();
37
38 for (let lastTime = startTime; Date.now() - startTime < timeout; lastTime = Date.now()) {
39 const ret = await func();
40 if (ret !== undefined) {
41 return ret;
42 }
43
44 await sleep(lastTime + delta - Date.now());
45 }
46
47 throw new Error(`Timeout after ${Date.now() - startTime} ms`);
48}
49
50function decorate(func, callback) {
51 return function (...args) {
52 return callback(func.bind(this), ...args);
53 };
54}
55
56module.exports = { sign, format, assert, sleep, loop, decorate };