UNPKG

faye

Version:

Simple pub/sub messaging for the web

65 lines (52 loc) 1.73 kB
'use strict'; 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;