| "use strict"; |
| var util = require("./util.js"); |
| var maybeWrapAsError = util.maybeWrapAsError; |
| var errors = require("./errors.js"); |
| var TimeoutError = errors.TimeoutError; |
| var OperationalError = errors.OperationalError; |
| var haveGetters = util.haveGetters; |
| var es5 = require("./es5.js"); |
| |
| function isUntypedError(obj) { |
| return obj instanceof Error && |
| es5.getPrototypeOf(obj) === Error.prototype; |
| } |
| |
| var rErrorKey = /^(?:name|message|stack|cause)$/; |
| function wrapAsOperationalError(obj) { |
| var ret; |
| if (isUntypedError(obj)) { |
| ret = new OperationalError(obj); |
| ret.name = obj.name; |
| ret.message = obj.message; |
| ret.stack = obj.stack; |
| var keys = es5.keys(obj); |
| for (var i = 0; i < keys.length; ++i) { |
| var key = keys[i]; |
| if (!rErrorKey.test(key)) { |
| ret[key] = obj[key]; |
| } |
| } |
| return ret; |
| } |
| util.markAsOriginatingFromRejection(obj); |
| return obj; |
| } |
| |
| function nodebackForPromise(promise) { |
| return function(err, value) { |
| if (promise === null) return; |
| |
| if (err) { |
| var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); |
| promise._attachExtraTrace(wrapped); |
| promise._reject(wrapped); |
| } else if (arguments.length > 2) { |
| var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];} |
| promise._fulfill(args); |
| } else { |
| promise._fulfill(value); |
| } |
| |
| promise = null; |
| }; |
| } |
| |
| |
| var PromiseResolver; |
| if (!haveGetters) { |
| PromiseResolver = function (promise) { |
| this.promise = promise; |
| this.asCallback = nodebackForPromise(promise); |
| this.callback = this.asCallback; |
| }; |
| } |
| else { |
| PromiseResolver = function (promise) { |
| this.promise = promise; |
| }; |
| } |
| if (haveGetters) { |
| var prop = { |
| get: function() { |
| return nodebackForPromise(this.promise); |
| } |
| }; |
| es5.defineProperty(PromiseResolver.prototype, "asCallback", prop); |
| es5.defineProperty(PromiseResolver.prototype, "callback", prop); |
| } |
| |
| PromiseResolver._nodebackForPromise = nodebackForPromise; |
| |
| PromiseResolver.prototype.toString = function () { |
| return "[object PromiseResolver]"; |
| }; |
| |
| PromiseResolver.prototype.resolve = |
| PromiseResolver.prototype.fulfill = function (value) { |
| if (!(this instanceof PromiseResolver)) { |
| throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a"); |
| } |
| this.promise._resolveCallback(value); |
| }; |
| |
| PromiseResolver.prototype.reject = function (reason) { |
| if (!(this instanceof PromiseResolver)) { |
| throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a"); |
| } |
| this.promise._rejectCallback(reason); |
| }; |
| |
| PromiseResolver.prototype.progress = function (value) { |
| if (!(this instanceof PromiseResolver)) { |
| throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a"); |
| } |
| this.promise._progress(value); |
| }; |
| |
| PromiseResolver.prototype.cancel = function (err) { |
| this.promise.cancel(err); |
| }; |
| |
| PromiseResolver.prototype.timeout = function () { |
| this.reject(new TimeoutError("timeout")); |
| }; |
| |
| PromiseResolver.prototype.isResolved = function () { |
| return this.promise.isResolved(); |
| }; |
| |
| PromiseResolver.prototype.toJSON = function () { |
| return this.promise.toJSON(); |
| }; |
| |
| module.exports = PromiseResolver; |