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