1 | var workQueue = require('./workQueue');
|
2 | var Promise = require('unexpected-bluebird');
|
3 | var useFullStackTrace = require('./useFullStackTrace');
|
4 |
|
5 | module.exports = function oathbreaker(value) {
|
6 | if (!value || typeof value.then !== 'function') {
|
7 | return value;
|
8 | }
|
9 |
|
10 | if (!value.isRejected) {
|
11 |
|
12 | return value;
|
13 | }
|
14 |
|
15 | if (value.isFulfilled()) {
|
16 | return value;
|
17 | }
|
18 |
|
19 | if (value.isRejected()) {
|
20 | value.caught(function () {
|
21 |
|
22 | });
|
23 |
|
24 | throw value.reason();
|
25 | }
|
26 |
|
27 | var onResolve = function () {};
|
28 | var onReject = function () {};
|
29 |
|
30 | var evaluated = false;
|
31 | var error;
|
32 | value.then(
|
33 | function (obj) {
|
34 | evaluated = true;
|
35 | onResolve(value);
|
36 | },
|
37 | function (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(function (resolve, reject) {
|
58 | onResolve = resolve;
|
59 | onReject = reject;
|
60 | });
|
61 | };
|