faye
Version:
Simple pub/sub messaging for the web
83 lines (65 loc) • 2.29 kB
JavaScript
;
var Class = require('../util/class'),
URI = require('../util/uri'),
browser = require('../util/browser'),
assign = require('../util/assign'),
toJSON = require('../util/to_json'),
Transport = require('./transport');
var XHR = assign(Class(Transport, {
encode: function(messages) {
return toJSON(messages);
},
request: function(messages) {
var href = this.endpoint.href,
self = this,
xhr;
// Prefer XMLHttpRequest over ActiveXObject if they both exist
if (global.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else if (global.ActiveXObject) {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
} else {
return this._handleError(messages);
}
xhr.open('POST', href, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Pragma', 'no-cache');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
var headers = this._dispatcher.headers;
for (var key in headers) {
if (!headers.hasOwnProperty(key)) continue;
xhr.setRequestHeader(key, headers[key]);
}
var abort = function() { xhr.abort() };
if (global.onbeforeunload !== undefined)
browser.Event.on(global, 'beforeunload', abort);
xhr.onreadystatechange = function() {
if (!xhr || xhr.readyState !== 4) return;
var replies = null,
status = xhr.status,
text = xhr.responseText,
successful = (status >= 200 && status < 300) || status === 304 || status === 1223;
if (global.onbeforeunload !== undefined)
browser.Event.detach(global, 'beforeunload', abort);
xhr.onreadystatechange = function() {};
xhr = null;
if (!successful) return self._handleError(messages);
try {
replies = JSON.parse(text);
} catch (error) {}
if (replies)
self._receive(replies);
else
self._handleError(messages);
};
xhr.send(this.encode(messages));
return xhr;
}
}), {
isUsable: function(dispatcher, endpoint, callback, context) {
var usable = (navigator.product === 'ReactNative')
|| URI.isSameOrigin(endpoint);
callback.call(context, usable);
}
});
module.exports = XHR;