diff options
Diffstat (limited to 'node_modules/util.promisify/implementation.js')
| -rw-r--r-- | node_modules/util.promisify/implementation.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/node_modules/util.promisify/implementation.js b/node_modules/util.promisify/implementation.js new file mode 100644 index 00000000..3b532484 --- /dev/null +++ b/node_modules/util.promisify/implementation.js @@ -0,0 +1,86 @@ +'use strict'; + +var isES5 = typeof Object.defineProperty === 'function' + && typeof Object.defineProperties === 'function' + && typeof Object.getPrototypeOf === 'function' + && typeof Object.setPrototypeOf === 'function'; + +if (!isES5) { + throw new TypeError('util.promisify requires a true ES5 environment'); +} + +var getOwnPropertyDescriptors = require('object.getownpropertydescriptors'); + +if (typeof Promise !== 'function') { + throw new TypeError('`Promise` must be globally available for util.promisify to work.'); +} + +var slice = Function.call.bind(Array.prototype.slice); +var concat = Function.call.bind(Array.prototype.concat); +var forEach = Function.call.bind(Array.prototype.forEach); + +var hasSymbols = typeof Symbol === 'function' && typeof Symbol('') === 'symbol'; + +var kCustomPromisifiedSymbol = hasSymbols ? Symbol('util.promisify.custom') : null; +var kCustomPromisifyArgsSymbol = hasSymbols ? Symbol('customPromisifyArgs') : null; + +module.exports = function promisify(orig) { + if (typeof orig !== 'function') { + var error = new TypeError('The "original" argument must be of type function'); + error.name = 'TypeError [ERR_INVALID_ARG_TYPE]'; + error.code = 'ERR_INVALID_ARG_TYPE'; + throw error; + } + + if (hasSymbols && orig[kCustomPromisifiedSymbol]) { + var customFunction = orig[kCustomPromisifiedSymbol]; + if (typeof customFunction !== 'function') { + throw new TypeError('The [util.promisify.custom] property must be a function'); + } + Object.defineProperty(customFunction, kCustomPromisifiedSymbol, { + configurable: true, + enumerable: false, + value: customFunction, + writable: false + }); + return customFunction; + } + + // Names to create an object from in case the callback receives multiple + // arguments, e.g. ['stdout', 'stderr'] for child_process.exec. + var argumentNames = orig[kCustomPromisifyArgsSymbol]; + + var promisified = function fn() { + var args = slice(arguments); + var self = this; // eslint-disable-line no-invalid-this + return new Promise(function (resolve, reject) { + orig.apply(self, concat(args, function (err) { + var values = arguments.length > 1 ? slice(arguments, 1) : []; + if (err) { + reject(err); + } else if (typeof argumentNames !== 'undefined' && values.length > 1) { + var obj = {}; + forEach(argumentNames, function (name, index) { + obj[name] = values[index]; + }); + resolve(obj); + } else { + resolve(values[0]); + } + })); + }); + }; + + Object.setPrototypeOf(promisified, Object.getPrototypeOf(orig)); + + Object.defineProperty(promisified, kCustomPromisifiedSymbol, { + configurable: true, + enumerable: false, + value: promisified, + writable: false + }); + return Object.defineProperties(promisified, getOwnPropertyDescriptors(orig)); +}; + +module.exports.custom = kCustomPromisifiedSymbol; +module.exports.customPromisifyArgs = kCustomPromisifyArgsSymbol; |
