forked from sent/waves
56 lines
2.8 KiB
JavaScript
56 lines
2.8 KiB
JavaScript
/**
|
|
* Register ajax transports for blob send/recieve and array buffer send/receive via XMLHttpRequest Level 2
|
|
* within the comfortable framework of the jquery ajax request, with full support for promises.
|
|
*
|
|
* Notice the +* in the dataType string? The + indicates we want this transport to be prepended to the list
|
|
* of potential transports (so it gets first dibs if the request passes the conditions within to provide the
|
|
* ajax transport, preventing the standard transport from hogging the request), and the * indicates that
|
|
* potentially any request with any dataType might want to use the transports provided herein.
|
|
*
|
|
* Remember to specify 'processData:false' in the ajax options when attempting to send a blob or arraybuffer -
|
|
* otherwise jquery will try (and fail) to convert the blob or buffer into a query string.
|
|
*/
|
|
$.ajaxTransport("+*", function(options, originalOptions, jqXHR){
|
|
// Test for the conditions that mean we can/want to send/receive blobs or arraybuffers - we need XMLHttpRequest
|
|
// level 2 (so feature-detect against window.FormData), feature detect against window.Blob or window.ArrayBuffer,
|
|
// and then check to see if the dataType is blob/arraybuffer or the data itself is a Blob/ArrayBuffer
|
|
if (window.FormData && ((options.dataType && (options.dataType == 'blob' || options.dataType == 'arraybuffer'))
|
|
|| (options.data && ((window.Blob && options.data instanceof Blob)
|
|
|| (window.ArrayBuffer && options.data instanceof ArrayBuffer)))
|
|
))
|
|
{
|
|
return {
|
|
/**
|
|
* Return a transport capable of sending and/or receiving blobs - in this case, we instantiate
|
|
* a new XMLHttpRequest and use it to actually perform the request, and funnel the result back
|
|
* into the jquery complete callback (such as the success function, done blocks, etc.)
|
|
*
|
|
* @param headers
|
|
* @param completeCallback
|
|
*/
|
|
send: function(headers, completeCallback){
|
|
var xhr = new XMLHttpRequest(),
|
|
url = options.url || window.location.href,
|
|
type = options.type || 'GET',
|
|
dataType = options.dataType || 'text',
|
|
data = options.data || null,
|
|
async = options.async || true;
|
|
|
|
xhr.addEventListener('load', function(){
|
|
var res = {};
|
|
|
|
res[dataType] = xhr.response;
|
|
completeCallback(xhr.status, xhr.statusText, res, xhr.getAllResponseHeaders());
|
|
});
|
|
|
|
xhr.open(type, url, async);
|
|
xhr.responseType = dataType;
|
|
xhr.send(data);
|
|
},
|
|
abort: function(){
|
|
jqXHR.abort();
|
|
}
|
|
};
|
|
}
|
|
});
|