add jquery wrapper
This commit is contained in:
		
							parent
							
								
									67d589f6cf
								
							
						
					
					
						commit
						403dabc43f
					
				
							
								
								
									
										105
									
								
								oauth3.jquery.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								oauth3.jquery.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,105 @@
 | 
			
		||||
(function () {
 | 
			
		||||
  'use strict';
 | 
			
		||||
 | 
			
		||||
  // I did try to shim jQuery's deferred, but it's just too clunky.
 | 
			
		||||
  // Here I use es6-promise which lacks asynchrity, but it's the smallest Promise implementation.
 | 
			
		||||
  // Only Opera Mini and MSIE (even on 11) will use this shim, so no biggie;
 | 
			
		||||
 | 
			
		||||
  var oauth3 = window.OAUTH3;
 | 
			
		||||
  var count = 0;
 | 
			
		||||
 | 
			
		||||
  function inject() {
 | 
			
		||||
    count += 1;
 | 
			
		||||
 | 
			
		||||
    if (count >= 100) {
 | 
			
		||||
      throw new Error("you forgot to include rsvp.js, methinks");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     *
 | 
			
		||||
        [window.Promise, window.ES6Promise, window.RSVP.Promise].forEach(function (PromiseA) {
 | 
			
		||||
          var x = 1; new PromiseA(function (resolve, reject) { console.log('x', 1 === x); resolve(); }); x = 2; void null;
 | 
			
		||||
          var y = 1; PromiseA.resolve().then(function () { console.log('y', 2 === x); }); y = 2; void null;
 | 
			
		||||
        });
 | 
			
		||||
     */
 | 
			
		||||
    var PromiseA = /*(window.RSVP && window.RSVP.Promise) || window.ES6Promise || */window.Promise;
 | 
			
		||||
    if ('undefined' !== typeof PromiseA) {
 | 
			
		||||
      oauth3.providePromise(PromiseA).then(function () {
 | 
			
		||||
        // ignore
 | 
			
		||||
        window.jqOauth3 = oauth3;
 | 
			
		||||
      }, function (err) {
 | 
			
		||||
        console.error(err);
 | 
			
		||||
        console.error("Bad Promise Implementation!");
 | 
			
		||||
      });
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // because MSIE can't tell when a script is loaded
 | 
			
		||||
    setTimeout(inject, 100);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ('undefined' === typeof Promise) {
 | 
			
		||||
    // support Opera Mini and MSIE 11+ (which doesn't support <!-- [if IE]> detection)
 | 
			
		||||
    /* jshint ignore: start */
 | 
			
		||||
    document.write('<script src="bower_components/es6-promise/promise.min.js"></script>');
 | 
			
		||||
    /* jshint ignore: end */
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    // I would have used this, but it turns out that
 | 
			
		||||
    // MSIE can't tell when a script has loaded
 | 
			
		||||
    var js = document.createElement("script");
 | 
			
		||||
    js.setAttribute("src", "bower_components/es6-promise/promise.js");
 | 
			
		||||
    js.setAttribute("type", "text/javascript");
 | 
			
		||||
    document.getElementsByTagName("head")[0].appendChild(js);
 | 
			
		||||
    */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  inject();
 | 
			
		||||
 | 
			
		||||
  function Request(opts) {
 | 
			
		||||
    if (!opts.method) {
 | 
			
		||||
      throw new Error("Developer Error: you must set method as one of 'GET', 'POST', 'DELETE', etc");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var req = {
 | 
			
		||||
      url: opts.url
 | 
			
		||||
      // Noted: jQuery 1.9 finally added 'method' as an alias of 'type'
 | 
			
		||||
    , method: opts.method
 | 
			
		||||
      // leaving type for backwards compat
 | 
			
		||||
    , type: opts.method
 | 
			
		||||
    , headers: opts.headers
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // don't allow accidetal querystring via 'data'
 | 
			
		||||
    if (opts.data && !/get|delete/i.test(opts.method)) {
 | 
			
		||||
      req.data = opts.data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // I don't trust jQuery promises...
 | 
			
		||||
    return new oauth3.PromiseA(function (resolve, reject) {
 | 
			
		||||
      $.ajax(req).then(function (data, textStatus, jqXhr) {
 | 
			
		||||
        var resp = {};
 | 
			
		||||
 | 
			
		||||
        Object.keys(jqXhr).forEach(function (key) {
 | 
			
		||||
          // particularly we have to get rid of .then
 | 
			
		||||
          if ('function' !== typeof jqXhr[key]) {
 | 
			
		||||
            resp[key] = jqXhr[key];
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        resp.data = data;
 | 
			
		||||
        resp.status = textStatus;
 | 
			
		||||
        resp.request = jqXhr;
 | 
			
		||||
        resolve(resp);
 | 
			
		||||
      }, function (jqXhr, textStatus, errorThrown) {
 | 
			
		||||
        errorThrown.request = jqXhr;
 | 
			
		||||
        errorThrown.response = jqXhr;
 | 
			
		||||
        errorThrown.status = textStatus;
 | 
			
		||||
        reject(errorThrown);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  oauth3.provideRequest(Request);
 | 
			
		||||
}());
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user