Comparing version 7.0.4 to 7.1.0
@@ -61,9 +61,12 @@ 'use strict'; | ||
} | ||
this._37 = 0; | ||
this._12 = null; | ||
this._59 = []; | ||
this._56 = 0; | ||
this._25 = 0; | ||
this._14 = null; | ||
this._95 = null; | ||
if (fn === noop) return; | ||
doResolve(fn, this); | ||
} | ||
Promise._99 = noop; | ||
Promise._87 = null; | ||
Promise._79 = null; | ||
Promise._22 = noop; | ||
@@ -87,20 +90,37 @@ Promise.prototype.then = function(onFulfilled, onRejected) { | ||
function handle(self, deferred) { | ||
while (self._37 === 3) { | ||
self = self._12; | ||
while (self._25 === 3) { | ||
self = self._14; | ||
} | ||
if (self._37 === 0) { | ||
self._59.push(deferred); | ||
if (Promise._87) { | ||
Promise._87(self); | ||
} | ||
if (self._25 === 0) { | ||
if (self._56 === 0) { | ||
self._56 = 1; | ||
self._95 = deferred; | ||
return; | ||
} | ||
if (self._56 === 1) { | ||
self._56 = 2; | ||
self._95 = [self._95, deferred]; | ||
return; | ||
} | ||
self._95.push(deferred); | ||
return; | ||
} | ||
handleResolved(self, deferred); | ||
} | ||
function handleResolved(self, deferred) { | ||
asap(function() { | ||
var cb = self._37 === 1 ? deferred.onFulfilled : deferred.onRejected; | ||
var cb = self._25 === 1 ? deferred.onFulfilled : deferred.onRejected; | ||
if (cb === null) { | ||
if (self._37 === 1) { | ||
resolve(deferred.promise, self._12); | ||
if (self._25 === 1) { | ||
resolve(deferred.promise, self._14); | ||
} else { | ||
reject(deferred.promise, self._12); | ||
reject(deferred.promise, self._14); | ||
} | ||
return; | ||
} | ||
var ret = tryCallOne(cb, self._12); | ||
var ret = tryCallOne(cb, self._14); | ||
if (ret === IS_ERROR) { | ||
@@ -133,4 +153,4 @@ reject(deferred.promise, LAST_ERROR); | ||
) { | ||
self._37 = 3; | ||
self._12 = newValue; | ||
self._25 = 3; | ||
self._14 = newValue; | ||
finale(self); | ||
@@ -143,4 +163,4 @@ return; | ||
} | ||
self._37 = 1; | ||
self._12 = newValue; | ||
self._25 = 1; | ||
self._14 = newValue; | ||
finale(self); | ||
@@ -150,11 +170,20 @@ } | ||
function reject(self, newValue) { | ||
self._37 = 2; | ||
self._12 = newValue; | ||
self._25 = 2; | ||
self._14 = newValue; | ||
if (Promise._79) { | ||
Promise._79(self, newValue); | ||
} | ||
finale(self); | ||
} | ||
function finale(self) { | ||
for (var i = 0; i < self._59.length; i++) { | ||
handle(self, self._59[i]); | ||
if (self._56 === 1) { | ||
handle(self, self._95); | ||
self._95 = null; | ||
} | ||
self._59 = null; | ||
if (self._56 === 2) { | ||
for (var i = 0; i < self._95.length; i++) { | ||
handle(self, self._95[i]); | ||
} | ||
self._95 = null; | ||
} | ||
} | ||
@@ -161,0 +190,0 @@ |
@@ -19,5 +19,5 @@ 'use strict'; | ||
function valuePromise(value) { | ||
var p = new Promise(Promise._99); | ||
p._37 = 1; | ||
p._12 = value; | ||
var p = new Promise(Promise._22); | ||
p._25 = 1; | ||
p._14 = value; | ||
return p; | ||
@@ -59,7 +59,7 @@ } | ||
if (val instanceof Promise && val.then === Promise.prototype.then) { | ||
while (val._37 === 3) { | ||
val = val._12; | ||
while (val._25 === 3) { | ||
val = val._14; | ||
} | ||
if (val._37 === 1) return res(i, val._12); | ||
if (val._37 === 2) reject(val._12); | ||
if (val._25 === 1) return res(i, val._14); | ||
if (val._25 === 2) reject(val._14); | ||
val.then(function (val) { | ||
@@ -66,0 +66,0 @@ res(i, val); |
@@ -8,1 +8,2 @@ 'use strict'; | ||
require('./node-extensions.js'); | ||
require('./synchronous.js'); |
@@ -14,25 +14,84 @@ 'use strict'; | ||
Promise.denodeify = function (fn, argumentCount) { | ||
argumentCount = argumentCount || Infinity; | ||
return function () { | ||
var self = this; | ||
var args = Array.prototype.slice.call(arguments, 0, | ||
argumentCount > 0 ? argumentCount : 0); | ||
return new Promise(function (resolve, reject) { | ||
args.push(function (err, res) { | ||
if (err) reject(err); | ||
else resolve(res); | ||
}) | ||
var res = fn.apply(self, args); | ||
if (res && | ||
( | ||
typeof res === 'object' || | ||
typeof res === 'function' | ||
) && | ||
typeof res.then === 'function' | ||
) { | ||
resolve(res); | ||
} | ||
}) | ||
if ( | ||
typeof argumentCount === 'number' && argumentCount !== Infinity | ||
) { | ||
return denodeifyWithCount(fn, argumentCount); | ||
} else { | ||
return denodeifyWithoutCount(fn); | ||
} | ||
} | ||
var callbackFn = ( | ||
'function (err, res) {' + | ||
'if (err) { rj(err); } else { rs(res); }' + | ||
'}' | ||
); | ||
function denodeifyWithCount(fn, argumentCount) { | ||
var args = []; | ||
for (var i = 0; i < argumentCount; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'return new Promise(function (rs, rj) {', | ||
'var res = fn.call(', | ||
['self'].concat(args).concat([callbackFn]).join(','), | ||
');', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function(['Promise', 'fn'], body)(Promise, fn); | ||
} | ||
function denodeifyWithoutCount(fn) { | ||
var fnLength = Math.max(fn.length - 1, 3); | ||
var args = []; | ||
for (var i = 0; i < fnLength; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'var args;', | ||
'var argLength = arguments.length;', | ||
'if (arguments.length > ' + fnLength + ') {', | ||
'args = new Array(arguments.length + 1);', | ||
'for (var i = 0; i < arguments.length; i++) {', | ||
'args[i] = arguments[i];', | ||
'}', | ||
'}', | ||
'return new Promise(function (rs, rj) {', | ||
'var cb = ' + callbackFn + ';', | ||
'var res;', | ||
'switch (argLength) {', | ||
args.concat(['extra']).map(function (_, index) { | ||
return ( | ||
'case ' + (index) + ':' + | ||
'res = fn.call(' + ['self'].concat(args.slice(0, index)).concat('cb').join(',') + ');' + | ||
'break;' | ||
); | ||
}).join(''), | ||
'default:', | ||
'args[argLength] = cb;', | ||
'res = fn.apply(self, args);', | ||
'}', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function( | ||
['Promise', 'fn'], | ||
body | ||
)(Promise, fn); | ||
} | ||
Promise.nodeify = function (fn) { | ||
@@ -39,0 +98,0 @@ return function () { |
@@ -61,9 +61,12 @@ 'use strict'; | ||
} | ||
this._37 = 0; | ||
this._12 = null; | ||
this._59 = []; | ||
this._56 = 0; | ||
this._25 = 0; | ||
this._14 = null; | ||
this._95 = null; | ||
if (fn === noop) return; | ||
doResolve(fn, this); | ||
} | ||
Promise._99 = noop; | ||
Promise._87 = null; | ||
Promise._79 = null; | ||
Promise._22 = noop; | ||
@@ -87,20 +90,37 @@ Promise.prototype.then = function(onFulfilled, onRejected) { | ||
function handle(self, deferred) { | ||
while (self._37 === 3) { | ||
self = self._12; | ||
while (self._25 === 3) { | ||
self = self._14; | ||
} | ||
if (self._37 === 0) { | ||
self._59.push(deferred); | ||
if (Promise._87) { | ||
Promise._87(self); | ||
} | ||
if (self._25 === 0) { | ||
if (self._56 === 0) { | ||
self._56 = 1; | ||
self._95 = deferred; | ||
return; | ||
} | ||
if (self._56 === 1) { | ||
self._56 = 2; | ||
self._95 = [self._95, deferred]; | ||
return; | ||
} | ||
self._95.push(deferred); | ||
return; | ||
} | ||
handleResolved(self, deferred); | ||
} | ||
function handleResolved(self, deferred) { | ||
asap(function() { | ||
var cb = self._37 === 1 ? deferred.onFulfilled : deferred.onRejected; | ||
var cb = self._25 === 1 ? deferred.onFulfilled : deferred.onRejected; | ||
if (cb === null) { | ||
if (self._37 === 1) { | ||
resolve(deferred.promise, self._12); | ||
if (self._25 === 1) { | ||
resolve(deferred.promise, self._14); | ||
} else { | ||
reject(deferred.promise, self._12); | ||
reject(deferred.promise, self._14); | ||
} | ||
return; | ||
} | ||
var ret = tryCallOne(cb, self._12); | ||
var ret = tryCallOne(cb, self._14); | ||
if (ret === IS_ERROR) { | ||
@@ -133,4 +153,4 @@ reject(deferred.promise, LAST_ERROR); | ||
) { | ||
self._37 = 3; | ||
self._12 = newValue; | ||
self._25 = 3; | ||
self._14 = newValue; | ||
finale(self); | ||
@@ -143,4 +163,4 @@ return; | ||
} | ||
self._37 = 1; | ||
self._12 = newValue; | ||
self._25 = 1; | ||
self._14 = newValue; | ||
finale(self); | ||
@@ -150,11 +170,20 @@ } | ||
function reject(self, newValue) { | ||
self._37 = 2; | ||
self._12 = newValue; | ||
self._25 = 2; | ||
self._14 = newValue; | ||
if (Promise._79) { | ||
Promise._79(self, newValue); | ||
} | ||
finale(self); | ||
} | ||
function finale(self) { | ||
for (var i = 0; i < self._59.length; i++) { | ||
handle(self, self._59[i]); | ||
if (self._56 === 1) { | ||
handle(self, self._95); | ||
self._95 = null; | ||
} | ||
self._59 = null; | ||
if (self._56 === 2) { | ||
for (var i = 0; i < self._95.length; i++) { | ||
handle(self, self._95[i]); | ||
} | ||
self._95 = null; | ||
} | ||
} | ||
@@ -161,0 +190,0 @@ |
@@ -19,5 +19,5 @@ 'use strict'; | ||
function valuePromise(value) { | ||
var p = new Promise(Promise._99); | ||
p._37 = 1; | ||
p._12 = value; | ||
var p = new Promise(Promise._22); | ||
p._25 = 1; | ||
p._14 = value; | ||
return p; | ||
@@ -59,7 +59,7 @@ } | ||
if (val instanceof Promise && val.then === Promise.prototype.then) { | ||
while (val._37 === 3) { | ||
val = val._12; | ||
while (val._25 === 3) { | ||
val = val._14; | ||
} | ||
if (val._37 === 1) return res(i, val._12); | ||
if (val._37 === 2) reject(val._12); | ||
if (val._25 === 1) return res(i, val._14); | ||
if (val._25 === 2) reject(val._14); | ||
val.then(function (val) { | ||
@@ -66,0 +66,0 @@ res(i, val); |
@@ -8,1 +8,2 @@ 'use strict'; | ||
require('./node-extensions.js'); | ||
require('./synchronous.js'); |
@@ -14,25 +14,84 @@ 'use strict'; | ||
Promise.denodeify = function (fn, argumentCount) { | ||
argumentCount = argumentCount || Infinity; | ||
return function () { | ||
var self = this; | ||
var args = Array.prototype.slice.call(arguments, 0, | ||
argumentCount > 0 ? argumentCount : 0); | ||
return new Promise(function (resolve, reject) { | ||
args.push(function (err, res) { | ||
if (err) reject(err); | ||
else resolve(res); | ||
}) | ||
var res = fn.apply(self, args); | ||
if (res && | ||
( | ||
typeof res === 'object' || | ||
typeof res === 'function' | ||
) && | ||
typeof res.then === 'function' | ||
) { | ||
resolve(res); | ||
} | ||
}) | ||
if ( | ||
typeof argumentCount === 'number' && argumentCount !== Infinity | ||
) { | ||
return denodeifyWithCount(fn, argumentCount); | ||
} else { | ||
return denodeifyWithoutCount(fn); | ||
} | ||
} | ||
var callbackFn = ( | ||
'function (err, res) {' + | ||
'if (err) { rj(err); } else { rs(res); }' + | ||
'}' | ||
); | ||
function denodeifyWithCount(fn, argumentCount) { | ||
var args = []; | ||
for (var i = 0; i < argumentCount; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'return new Promise(function (rs, rj) {', | ||
'var res = fn.call(', | ||
['self'].concat(args).concat([callbackFn]).join(','), | ||
');', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function(['Promise', 'fn'], body)(Promise, fn); | ||
} | ||
function denodeifyWithoutCount(fn) { | ||
var fnLength = Math.max(fn.length - 1, 3); | ||
var args = []; | ||
for (var i = 0; i < fnLength; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'var args;', | ||
'var argLength = arguments.length;', | ||
'if (arguments.length > ' + fnLength + ') {', | ||
'args = new Array(arguments.length + 1);', | ||
'for (var i = 0; i < arguments.length; i++) {', | ||
'args[i] = arguments[i];', | ||
'}', | ||
'}', | ||
'return new Promise(function (rs, rj) {', | ||
'var cb = ' + callbackFn + ';', | ||
'var res;', | ||
'switch (argLength) {', | ||
args.concat(['extra']).map(function (_, index) { | ||
return ( | ||
'case ' + (index) + ':' + | ||
'res = fn.call(' + ['self'].concat(args.slice(0, index)).concat('cb').join(',') + ');' + | ||
'break;' | ||
); | ||
}).join(''), | ||
'default:', | ||
'args[argLength] = cb;', | ||
'res = fn.apply(self, args);', | ||
'}', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function( | ||
['Promise', 'fn'], | ||
body | ||
)(Promise, fn); | ||
} | ||
Promise.nodeify = function (fn) { | ||
@@ -39,0 +98,0 @@ return function () { |
{ | ||
"name": "promise", | ||
"version": "7.0.4", | ||
"version": "7.1.0", | ||
"description": "Bare bones Promises/A+ implementation", | ||
@@ -35,2 +35,2 @@ "main": "index.js", | ||
} | ||
} | ||
} |
@@ -79,2 +79,32 @@ <a href="https://promisesaplus.com/"><img src="https://promisesaplus.com/assets/logo-small.png" align="right" /></a> | ||
## Unhandled Rejections | ||
By default, promises silence any unhandled rejections. | ||
You can enable logging of unhandled ReferenceErrors and TypeErrors via: | ||
```js | ||
require('promise/lib/rejection-tracking').enable(); | ||
``` | ||
Due to the performance cost, you should only do this during development. | ||
You can enable logging of all unhandled rejections if you need to debug an exception you think is being swallowed by promises: | ||
```js | ||
require('promise/lib/rejection-tracking').enable( | ||
{allRejections: true} | ||
); | ||
``` | ||
Due to the high probability of false positives, I only recommend using this when debugging specific issues that you think may be being swallowed. For the preferred debugging method, see `Promise#done(onFulfilled, onRejected)`. | ||
`rejection-tracking.enable(options)` takes the following options: | ||
- allRejections (`boolean`) - track all exceptions, not just reference errors and type errors. Note that this has a high probability of resulting in false positives if your code loads data optimisticly | ||
- whitelist (`Array<ErrorConstructor>`) - this defaults to `[ReferenceError, TypeError]` but you can override it with your own list of error constructors to track. | ||
- `onUnhandled(id, error)` and `onHandled(id, error)` - you can use these to provide your own customised display for errors. Note that if possible you should indicate that the error was a false positive if `onHandled` is called. `onHandled` is only called if `onUnhandled` has already been called. | ||
To reduce the chance of false-positives there is a delay of up to 2 seconds before errors are logged. This means that if you attach an error handler within 2 seconds, it won't be logged as a false positive. ReferenceErrors and TypeErrors are only subject to a 100ms delay due to the higher likelihood that the error is due to programmer error. | ||
## API | ||
@@ -81,0 +111,0 @@ |
@@ -61,9 +61,12 @@ 'use strict'; | ||
} | ||
this._37 = 0; | ||
this._12 = null; | ||
this._59 = []; | ||
this._56 = 0; | ||
this._25 = 0; | ||
this._14 = null; | ||
this._95 = null; | ||
if (fn === noop) return; | ||
doResolve(fn, this); | ||
} | ||
Promise._99 = noop; | ||
Promise._87 = null; | ||
Promise._79 = null; | ||
Promise._22 = noop; | ||
@@ -87,20 +90,37 @@ Promise.prototype.then = function(onFulfilled, onRejected) { | ||
function handle(self, deferred) { | ||
while (self._37 === 3) { | ||
self = self._12; | ||
while (self._25 === 3) { | ||
self = self._14; | ||
} | ||
if (self._37 === 0) { | ||
self._59.push(deferred); | ||
if (Promise._87) { | ||
Promise._87(self); | ||
} | ||
if (self._25 === 0) { | ||
if (self._56 === 0) { | ||
self._56 = 1; | ||
self._95 = deferred; | ||
return; | ||
} | ||
if (self._56 === 1) { | ||
self._56 = 2; | ||
self._95 = [self._95, deferred]; | ||
return; | ||
} | ||
self._95.push(deferred); | ||
return; | ||
} | ||
handleResolved(self, deferred); | ||
} | ||
function handleResolved(self, deferred) { | ||
setImmediate(function() { | ||
var cb = self._37 === 1 ? deferred.onFulfilled : deferred.onRejected; | ||
var cb = self._25 === 1 ? deferred.onFulfilled : deferred.onRejected; | ||
if (cb === null) { | ||
if (self._37 === 1) { | ||
resolve(deferred.promise, self._12); | ||
if (self._25 === 1) { | ||
resolve(deferred.promise, self._14); | ||
} else { | ||
reject(deferred.promise, self._12); | ||
reject(deferred.promise, self._14); | ||
} | ||
return; | ||
} | ||
var ret = tryCallOne(cb, self._12); | ||
var ret = tryCallOne(cb, self._14); | ||
if (ret === IS_ERROR) { | ||
@@ -133,4 +153,4 @@ reject(deferred.promise, LAST_ERROR); | ||
) { | ||
self._37 = 3; | ||
self._12 = newValue; | ||
self._25 = 3; | ||
self._14 = newValue; | ||
finale(self); | ||
@@ -143,4 +163,4 @@ return; | ||
} | ||
self._37 = 1; | ||
self._12 = newValue; | ||
self._25 = 1; | ||
self._14 = newValue; | ||
finale(self); | ||
@@ -150,11 +170,20 @@ } | ||
function reject(self, newValue) { | ||
self._37 = 2; | ||
self._12 = newValue; | ||
self._25 = 2; | ||
self._14 = newValue; | ||
if (Promise._79) { | ||
Promise._79(self, newValue); | ||
} | ||
finale(self); | ||
} | ||
function finale(self) { | ||
for (var i = 0; i < self._59.length; i++) { | ||
handle(self, self._59[i]); | ||
if (self._56 === 1) { | ||
handle(self, self._95); | ||
self._95 = null; | ||
} | ||
self._59 = null; | ||
if (self._56 === 2) { | ||
for (var i = 0; i < self._95.length; i++) { | ||
handle(self, self._95[i]); | ||
} | ||
self._95 = null; | ||
} | ||
} | ||
@@ -161,0 +190,0 @@ |
@@ -19,5 +19,5 @@ 'use strict'; | ||
function valuePromise(value) { | ||
var p = new Promise(Promise._99); | ||
p._37 = 1; | ||
p._12 = value; | ||
var p = new Promise(Promise._22); | ||
p._25 = 1; | ||
p._14 = value; | ||
return p; | ||
@@ -59,7 +59,7 @@ } | ||
if (val instanceof Promise && val.then === Promise.prototype.then) { | ||
while (val._37 === 3) { | ||
val = val._12; | ||
while (val._25 === 3) { | ||
val = val._14; | ||
} | ||
if (val._37 === 1) return res(i, val._12); | ||
if (val._37 === 2) reject(val._12); | ||
if (val._25 === 1) return res(i, val._14); | ||
if (val._25 === 2) reject(val._14); | ||
val.then(function (val) { | ||
@@ -66,0 +66,0 @@ res(i, val); |
@@ -8,1 +8,2 @@ 'use strict'; | ||
require('./node-extensions.js'); | ||
require('./synchronous.js'); |
@@ -14,25 +14,84 @@ 'use strict'; | ||
Promise.denodeify = function (fn, argumentCount) { | ||
argumentCount = argumentCount || Infinity; | ||
return function () { | ||
var self = this; | ||
var args = Array.prototype.slice.call(arguments, 0, | ||
argumentCount > 0 ? argumentCount : 0); | ||
return new Promise(function (resolve, reject) { | ||
args.push(function (err, res) { | ||
if (err) reject(err); | ||
else resolve(res); | ||
}) | ||
var res = fn.apply(self, args); | ||
if (res && | ||
( | ||
typeof res === 'object' || | ||
typeof res === 'function' | ||
) && | ||
typeof res.then === 'function' | ||
) { | ||
resolve(res); | ||
} | ||
}) | ||
if ( | ||
typeof argumentCount === 'number' && argumentCount !== Infinity | ||
) { | ||
return denodeifyWithCount(fn, argumentCount); | ||
} else { | ||
return denodeifyWithoutCount(fn); | ||
} | ||
} | ||
var callbackFn = ( | ||
'function (err, res) {' + | ||
'if (err) { rj(err); } else { rs(res); }' + | ||
'}' | ||
); | ||
function denodeifyWithCount(fn, argumentCount) { | ||
var args = []; | ||
for (var i = 0; i < argumentCount; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'return new Promise(function (rs, rj) {', | ||
'var res = fn.call(', | ||
['self'].concat(args).concat([callbackFn]).join(','), | ||
');', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function(['Promise', 'fn'], body)(Promise, fn); | ||
} | ||
function denodeifyWithoutCount(fn) { | ||
var fnLength = Math.max(fn.length - 1, 3); | ||
var args = []; | ||
for (var i = 0; i < fnLength; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'var args;', | ||
'var argLength = arguments.length;', | ||
'if (arguments.length > ' + fnLength + ') {', | ||
'args = new Array(arguments.length + 1);', | ||
'for (var i = 0; i < arguments.length; i++) {', | ||
'args[i] = arguments[i];', | ||
'}', | ||
'}', | ||
'return new Promise(function (rs, rj) {', | ||
'var cb = ' + callbackFn + ';', | ||
'var res;', | ||
'switch (argLength) {', | ||
args.concat(['extra']).map(function (_, index) { | ||
return ( | ||
'case ' + (index) + ':' + | ||
'res = fn.call(' + ['self'].concat(args.slice(0, index)).concat('cb').join(',') + ');' + | ||
'break;' | ||
); | ||
}).join(''), | ||
'default:', | ||
'args[argLength] = cb;', | ||
'res = fn.apply(self, args);', | ||
'}', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function( | ||
['Promise', 'fn'], | ||
body | ||
)(Promise, fn); | ||
} | ||
Promise.nodeify = function (fn) { | ||
@@ -39,0 +98,0 @@ return function () { |
@@ -61,8 +61,11 @@ 'use strict'; | ||
} | ||
this._deferredState = 0; | ||
this._state = 0; | ||
this._value = null; | ||
this._deferreds = []; | ||
this._deferreds = null; | ||
if (fn === noop) return; | ||
doResolve(fn, this); | ||
} | ||
Promise._onHandle = null; | ||
Promise._onReject = null; | ||
Promise._noop = noop; | ||
@@ -90,6 +93,23 @@ | ||
} | ||
if (Promise._onHandle) { | ||
Promise._onHandle(self); | ||
} | ||
if (self._state === 0) { | ||
if (self._deferredState === 0) { | ||
self._deferredState = 1; | ||
self._deferreds = deferred; | ||
return; | ||
} | ||
if (self._deferredState === 1) { | ||
self._deferredState = 2; | ||
self._deferreds = [self._deferreds, deferred]; | ||
return; | ||
} | ||
self._deferreds.push(deferred); | ||
return; | ||
} | ||
handleResolved(self, deferred); | ||
} | ||
function handleResolved(self, deferred) { | ||
asap(function() { | ||
@@ -150,9 +170,18 @@ var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; | ||
self._value = newValue; | ||
if (Promise._onReject) { | ||
Promise._onReject(self, newValue); | ||
} | ||
finale(self); | ||
} | ||
function finale(self) { | ||
for (var i = 0; i < self._deferreds.length; i++) { | ||
handle(self, self._deferreds[i]); | ||
if (self._deferredState === 1) { | ||
handle(self, self._deferreds); | ||
self._deferreds = null; | ||
} | ||
self._deferreds = null; | ||
if (self._deferredState === 2) { | ||
for (var i = 0; i < self._deferreds.length; i++) { | ||
handle(self, self._deferreds[i]); | ||
} | ||
self._deferreds = null; | ||
} | ||
} | ||
@@ -159,0 +188,0 @@ |
@@ -8,1 +8,2 @@ 'use strict'; | ||
require('./node-extensions.js'); | ||
require('./synchronous.js'); |
@@ -14,25 +14,84 @@ 'use strict'; | ||
Promise.denodeify = function (fn, argumentCount) { | ||
argumentCount = argumentCount || Infinity; | ||
return function () { | ||
var self = this; | ||
var args = Array.prototype.slice.call(arguments, 0, | ||
argumentCount > 0 ? argumentCount : 0); | ||
return new Promise(function (resolve, reject) { | ||
args.push(function (err, res) { | ||
if (err) reject(err); | ||
else resolve(res); | ||
}) | ||
var res = fn.apply(self, args); | ||
if (res && | ||
( | ||
typeof res === 'object' || | ||
typeof res === 'function' | ||
) && | ||
typeof res.then === 'function' | ||
) { | ||
resolve(res); | ||
} | ||
}) | ||
if ( | ||
typeof argumentCount === 'number' && argumentCount !== Infinity | ||
) { | ||
return denodeifyWithCount(fn, argumentCount); | ||
} else { | ||
return denodeifyWithoutCount(fn); | ||
} | ||
} | ||
var callbackFn = ( | ||
'function (err, res) {' + | ||
'if (err) { rj(err); } else { rs(res); }' + | ||
'}' | ||
); | ||
function denodeifyWithCount(fn, argumentCount) { | ||
var args = []; | ||
for (var i = 0; i < argumentCount; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'return new Promise(function (rs, rj) {', | ||
'var res = fn.call(', | ||
['self'].concat(args).concat([callbackFn]).join(','), | ||
');', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function(['Promise', 'fn'], body)(Promise, fn); | ||
} | ||
function denodeifyWithoutCount(fn) { | ||
var fnLength = Math.max(fn.length - 1, 3); | ||
var args = []; | ||
for (var i = 0; i < fnLength; i++) { | ||
args.push('a' + i); | ||
} | ||
var body = [ | ||
'return function (' + args.join(',') + ') {', | ||
'var self = this;', | ||
'var args;', | ||
'var argLength = arguments.length;', | ||
'if (arguments.length > ' + fnLength + ') {', | ||
'args = new Array(arguments.length + 1);', | ||
'for (var i = 0; i < arguments.length; i++) {', | ||
'args[i] = arguments[i];', | ||
'}', | ||
'}', | ||
'return new Promise(function (rs, rj) {', | ||
'var cb = ' + callbackFn + ';', | ||
'var res;', | ||
'switch (argLength) {', | ||
args.concat(['extra']).map(function (_, index) { | ||
return ( | ||
'case ' + (index) + ':' + | ||
'res = fn.call(' + ['self'].concat(args.slice(0, index)).concat('cb').join(',') + ');' + | ||
'break;' | ||
); | ||
}).join(''), | ||
'default:', | ||
'args[argLength] = cb;', | ||
'res = fn.apply(self, args);', | ||
'}', | ||
'if (res &&', | ||
'(typeof res === "object" || typeof res === "function") &&', | ||
'typeof res.then === "function"', | ||
') {rs(res);}', | ||
'});', | ||
'};' | ||
].join(''); | ||
return Function( | ||
['Promise', 'fn'], | ||
body | ||
)(Promise, fn); | ||
} | ||
Promise.nodeify = function (fn) { | ||
@@ -39,0 +98,0 @@ return function () { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
78474
42
2471
232
8