faye
Version:
Simple pub/sub messaging for the web
65 lines (52 loc) • 1.73 kB
JavaScript
;
var Class = require('../util/class'),
URI = require('../util/uri'),
copyObject = require('../util/copy_object'),
assign = require('../util/assign'),
toJSON = require('../util/to_json'),
Transport = require('./transport');
var JSONP = assign(Class(Transport, {
encode: function(messages) {
var url = copyObject(this.endpoint);
url.query.message = toJSON(messages);
url.query.jsonp = '__jsonp' + JSONP._cbCount + '__';
return URI.stringify(url);
},
request: function(messages) {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script'),
callbackName = JSONP.getCallbackName(),
endpoint = copyObject(this.endpoint),
self = this;
endpoint.query.message = toJSON(messages);
endpoint.query.jsonp = callbackName;
var cleanup = function() {
if (!global[callbackName]) return false;
global[callbackName] = undefined;
try { delete global[callbackName] } catch (error) {}
script.parentNode.removeChild(script);
};
global[callbackName] = function(replies) {
cleanup();
self._receive(replies);
};
script.type = 'text/javascript';
script.src = URI.stringify(endpoint);
head.appendChild(script);
script.onerror = function() {
cleanup();
self._handleError(messages);
};
return { abort: cleanup };
}
}), {
_cbCount: 0,
getCallbackName: function() {
this._cbCount += 1;
return '__jsonp' + this._cbCount + '__';
},
isUsable: function(dispatcher, endpoint, callback, context) {
callback.call(context, true);
}
});
module.exports = JSONP;