110 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.4 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");
 | |
|     }
 | |
| 
 | |
|     /*
 | |
|      *
 | |
|         [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;
 | |
|       if (opts.data && 'object' === typeof opts.data) {
 | |
|         req.data = JSON.stringify(req.data);
 | |
|         req.headers['Content-Type'] = 'application/json; charset=utf-8';
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     // 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);
 | |
| }());
 |