UNPKG

1.22 kBJavaScriptView Raw
1const workQueue = require('./workQueue');
2const Promise = require('unexpected-bluebird');
3const useFullStackTrace = require('./useFullStackTrace');
4
5module.exports = function oathbreaker(value) {
6 if (!value || typeof value.then !== 'function') {
7 return value;
8 }
9
10 if (!value.isRejected) {
11 // this is not a bluebird promise
12 return value;
13 }
14
15 if (value.isFulfilled()) {
16 return value;
17 }
18
19 if (value.isRejected()) {
20 value.caught(() => {
21 // Ignore - already handled
22 });
23
24 throw value.reason();
25 }
26
27 let onResolve = () => {};
28 let onReject = () => {};
29
30 let evaluated = false;
31 let error;
32 value.then(
33 obj => {
34 evaluated = true;
35 onResolve(value);
36 },
37 err => {
38 evaluated = true;
39 error = err;
40 onReject(err);
41 }
42 );
43
44 workQueue.drain();
45
46 if (evaluated && error) {
47 if (error._isUnexpected && Error.captureStackTrace) {
48 Error.captureStackTrace(error);
49 }
50 throw error;
51 } else if (evaluated) {
52 return value;
53 } else if (value._captureStackTrace && !useFullStackTrace) {
54 value._captureStackTrace(true);
55 }
56
57 return new Promise((resolve, reject) => {
58 onResolve = resolve;
59 onReject = reject;
60 });
61};