'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') }