| 'use strict' |
| |
| const { promisify } = require('util') |
| |
| const handler = { |
| get: function (target, prop, receiver) { |
| if (typeof target[prop] !== 'function') { |
| return target[prop] |
| } |
| if (target[prop][promisify.custom]) { |
| return function () { |
| return Reflect.get(target, prop, receiver)[promisify.custom].apply(target, arguments) |
| } |
| } |
| return function () { |
| return new Promise((resolve, reject) => { |
| Reflect.get(target, prop, receiver).apply(target, [...arguments, function (err, result) { |
| if (err) { |
| return reject(err) |
| } |
| resolve(result) |
| }]) |
| }) |
| } |
| } |
| } |
| |
| module.exports = function (thingToPromisify) { |
| if (typeof thingToPromisify === 'function') { |
| return promisify(thingToPromisify) |
| } |
| if (typeof thingToPromisify === 'object') { |
| return new Proxy(thingToPromisify, handler) |
| } |
| throw new TypeError('Can only promisify functions or objects') |
| } |