text: "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 get() {
              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.\n\n    See http://goo.gl/sdkXL9\n");
      }
      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.\n\n    See http://goo.gl/sdkXL9\n");
      }
      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.\n\n    See http://goo.gl/sdkXL9\n");
      }
      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;
  
  //# sourceMappingURL=promise_resolver-compiled.js.map