diff options
Diffstat (limited to 'lib/internal/awaitify.js')
-rw-r--r-- | lib/internal/awaitify.js | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/internal/awaitify.js b/lib/internal/awaitify.js new file mode 100644 index 0000000..57628de --- /dev/null +++ b/lib/internal/awaitify.js @@ -0,0 +1,24 @@ +// conditionally promisify a function. +// only return a promise if a callback is omitted +export default function awaitify (asyncFn, arity = asyncFn.length) { + if (!arity) throw new Error('arity is undefined') + function awaitable (...args) { + if (typeof args[arity - 1] === 'function') { + return asyncFn.apply(this, args) + } + + return new Promise((resolve, reject) => { + args[arity - 1] = (err, ...cbArgs) => { + if (err) return reject(err) + resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]) + } + asyncFn.apply(this, args) + }) + } + + Object.defineProperty(awaitable, 'name', { + value: `awaitable(${asyncFn.name})` + }) + + return awaitable +} |