pifall is an implementation of promisifyAll in terms of Node 8's
included util.promisify.
That is, it will iterate over your object's properties (Reflect.ownKeys), and
make an Async-suffixed copy of any functions it finds. If it runs into a
getter, it will create the Async version, which will grab the value from the
getter, and work as normal, if the value ends up being a function. Otherwise it
will throw.
The Async-suffixed versions are as returned by util.promisify.
In the event that you already have a foo and a fooAsync, the fooAsync will
be overwritten. If it's not writable, or not configurable, pifall will make no
attempt to circumvent that, meaning it will throw.
Note that pifall operates in-place on the object. It does not return
anything, and the original object is augmented with the new methods.
pifall will flat-out refuse to promisify a built-in prototype, even it it's in
a prototype chain when the proto option is provided. It will also flat-out
refuse to promisify objects whose typeof is not function or object. It
will do this by throwing a TypeError.
On versions of Node not supporting util.promisify, a polyfill is used.
Example:
const obj = {
func (cb) {
setImmediate(() => {
cb(null, 'hello');
});
}
}
require('pifall')(obj);
obj.funcAsync().then(result => console.assert(result === 'hello'));
It can also take a second parameter, an optional options object, with the following properties:
proto: If truthy, this causespifallto include any properties accessible on the object, including those in its prototype chain. Default isfalse;classes: If truthy, this causespifallto treat functions whose names start with a capital letter as "classes". That is, the function itself will not be promisified, but its prototype will bepifalled. (Note: This does not currently work for functions retrieved via getters. No matter what, these are treated as ordinary non-class functions. In practice, this doesn't come up a whole lot.) Default is false.suffix: Sets the suffix for promisified versions of functions. Default is'Async'.promisifier: Use custom promisifier instead ofutil.promisify
MIT License. See LICENSE.txt.