-
-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
147 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
'use strict'; | ||
|
||
var define = require('define-properties'); | ||
var util = require('util'); | ||
|
||
var implementation = require('./implementation'); | ||
var getPolyfill = require('./polyfill'); | ||
var polyfill = getPolyfill(); | ||
var shim = require('./shim'); | ||
|
||
/* eslint-disable no-unused-vars */ | ||
var boundPromisify = function promisify(orig) { | ||
/* eslint-enable no-unused-vars */ | ||
return polyfill.apply(util, arguments); | ||
}; | ||
define(boundPromisify, { | ||
custom: polyfill.custom, | ||
customPromisifyArgs: polyfill.customPromisifyArgs, | ||
getPolyfill: getPolyfill, | ||
implementation: implementation, | ||
shim: shim | ||
}); | ||
|
||
module.exports = boundPromisify; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
'use strict'; | ||
|
||
var util = require('util'); | ||
var implementation = require('./implementation'); | ||
|
||
module.exports = function getPolyfill() { | ||
if (typeof util.promisify === 'function') { | ||
return util.promisify; | ||
} | ||
return implementation; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
'use strict'; | ||
|
||
var util = require('util'); | ||
var getPolyfill = require('./polyfill'); | ||
|
||
module.exports = function shimUtilPromisify() { | ||
var polyfill = getPolyfill(); | ||
if (polyfill !== util.promisify) { | ||
util.promisify = polyfill; | ||
Object.defineProperty(util, 'promisify', { value: polyfill }); | ||
} | ||
return polyfill; | ||
}; |