df127333992b39e4b332034079de3301100f3fc6
[aai/esr-gui.git] /
1 "use strict";
2 module.exports = function(NEXT_FILTER) {
3 var util = require("./util.js");
4 var errors = require("./errors.js");
5 var tryCatch = util.tryCatch;
6 var errorObj = util.errorObj;
7 var keys = require("./es5.js").keys;
8 var TypeError = errors.TypeError;
9
10 function CatchFilter(instances, callback, promise) {
11     this._instances = instances;
12     this._callback = callback;
13     this._promise = promise;
14 }
15
16 function safePredicate(predicate, e) {
17     var safeObject = {};
18     var retfilter = tryCatch(predicate).call(safeObject, e);
19
20     if (retfilter === errorObj) return retfilter;
21
22     var safeKeys = keys(safeObject);
23     if (safeKeys.length) {
24         errorObj.e = new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a    See http://goo.gl/o84o68\u000a");
25         return errorObj;
26     }
27     return retfilter;
28 }
29
30 CatchFilter.prototype.doFilter = function (e) {
31     var cb = this._callback;
32     var promise = this._promise;
33     var boundTo = promise._boundValue();
34     for (var i = 0, len = this._instances.length; i < len; ++i) {
35         var item = this._instances[i];
36         var itemIsErrorType = item === Error ||
37             (item != null && item.prototype instanceof Error);
38
39         if (itemIsErrorType && e instanceof item) {
40             var ret = tryCatch(cb).call(boundTo, e);
41             if (ret === errorObj) {
42                 NEXT_FILTER.e = ret.e;
43                 return NEXT_FILTER;
44             }
45             return ret;
46         } else if (typeof item === "function" && !itemIsErrorType) {
47             var shouldHandle = safePredicate(item, e);
48             if (shouldHandle === errorObj) {
49                 e = errorObj.e;
50                 break;
51             } else if (shouldHandle) {
52                 var ret = tryCatch(cb).call(boundTo, e);
53                 if (ret === errorObj) {
54                     NEXT_FILTER.e = ret.e;
55                     return NEXT_FILTER;
56                 }
57                 return ret;
58             }
59         }
60     }
61     NEXT_FILTER.e = e;
62     return NEXT_FILTER;
63 };
64
65 return CatchFilter;
66 };