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);
 | 
						|
}());
 |