aboutsummaryrefslogtreecommitdiff
path: root/node_modules/util.promisify/implementation.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/util.promisify/implementation.js')
-rw-r--r--node_modules/util.promisify/implementation.js86
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;