forked from coolaj86/walnut.js
		
	
		
			
	
	
		
			98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								(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");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var PromiseA = window.Promise || window.ES6Promise;
							 | 
						||
| 
								 | 
							
								    if ('undefined' !== typeof PromiseA) {
							 | 
						||
| 
								 | 
							
								      oauth3.providePromise(PromiseA).then(function () {
							 | 
						||
| 
								 | 
							
								        // ignore
							 | 
						||
| 
								 | 
							
								        window.jqOauth3 = oauth3;
							 | 
						||
| 
								 | 
							
								      }, function (err) {
							 | 
						||
| 
								 | 
							
								        console.error(err);
							 | 
						||
| 
								 | 
							
								        console.error("Bad Promise Implementation!");
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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);
							 | 
						||
| 
								 | 
							
								}());
							 |