diff --git a/src/main/resources/static/common/js/sockjs.js b/src/main/resources/static/common/js/sockjs.js deleted file mode 100644 index ee4a359..0000000 --- a/src/main/resources/static/common/js/sockjs.js +++ /dev/null @@ -1,5232 +0,0 @@ -/* sockjs-client v1.6.1 | http://sockjs.org | MIT license */ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SockJS = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { - // Make a copy so as not to interfere with a current dispatchEvent. - this._listeners[eventType] = arr.slice(0, idx).concat(arr.slice(idx + 1)); - } else { - delete this._listeners[eventType]; - } - return; - } -}; - -EventTarget.prototype.dispatchEvent = function() { - var event = arguments[0]; - var t = event.type; - // equivalent of Array.prototype.slice.call(arguments, 0); - var args = arguments.length === 1 ? [event] : Array.apply(null, arguments); - // TODO: This doesn't match the real behavior; per spec, onfoo get - // their place in line from the /first/ time they're set from - // non-null. Although WebKit bumps it to the end every time it's - // set. - if (this['on' + t]) { - this['on' + t].apply(this, args); - } - if (t in this._listeners) { - // Grab a reference to the listeners list. removeEventListener may alter the list. - var listeners = this._listeners[t]; - for (var i = 0; i < listeners.length; i++) { - listeners[i].apply(this, args); - } - } -}; - -module.exports = EventTarget; - -},{}],6:[function(require,module,exports){ -'use strict'; - -var inherits = require('inherits') - , Event = require('./event') - ; - -function TransportMessageEvent(data) { - Event.call(this); - this.initEvent('message', false, false); - this.data = data; -} - -inherits(TransportMessageEvent, Event); - -module.exports = TransportMessageEvent; - -},{"./event":4,"inherits":57}],7:[function(require,module,exports){ -'use strict'; - -var iframeUtils = require('./utils/iframe') - ; - -function FacadeJS(transport) { - this._transport = transport; - transport.on('message', this._transportMessage.bind(this)); - transport.on('close', this._transportClose.bind(this)); -} - -FacadeJS.prototype._transportClose = function(code, reason) { - iframeUtils.postMessage('c', JSON.stringify([code, reason])); -}; -FacadeJS.prototype._transportMessage = function(frame) { - iframeUtils.postMessage('t', frame); -}; -FacadeJS.prototype._send = function(data) { - this._transport.send(data); -}; -FacadeJS.prototype._close = function() { - this._transport.close(); - this._transport.removeAllListeners(); -}; - -module.exports = FacadeJS; - -},{"./utils/iframe":47}],8:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var urlUtils = require('./utils/url') - , eventUtils = require('./utils/event') - , FacadeJS = require('./facade') - , InfoIframeReceiver = require('./info-iframe-receiver') - , iframeUtils = require('./utils/iframe') - , loc = require('./location') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:iframe-bootstrap'); -} - -module.exports = function(SockJS, availableTransports) { - var transportMap = {}; - availableTransports.forEach(function(at) { - if (at.facadeTransport) { - transportMap[at.facadeTransport.transportName] = at.facadeTransport; - } - }); - - // hard-coded for the info iframe - // TODO see if we can make this more dynamic - transportMap[InfoIframeReceiver.transportName] = InfoIframeReceiver; - var parentOrigin; - - /* eslint-disable camelcase */ - SockJS.bootstrap_iframe = function() { - /* eslint-enable camelcase */ - var facade; - iframeUtils.currentWindowId = loc.hash.slice(1); - var onMessage = function(e) { - if (e.source !== parent) { - return; - } - if (typeof parentOrigin === 'undefined') { - parentOrigin = e.origin; - } - if (e.origin !== parentOrigin) { - return; - } - - var iframeMessage; - try { - iframeMessage = JSON.parse(e.data); - } catch (ignored) { - debug('bad json', e.data); - return; - } - - if (iframeMessage.windowId !== iframeUtils.currentWindowId) { - return; - } - switch (iframeMessage.type) { - case 's': - var p; - try { - p = JSON.parse(iframeMessage.data); - } catch (ignored) { - debug('bad json', iframeMessage.data); - break; - } - var version = p[0]; - var transport = p[1]; - var transUrl = p[2]; - var baseUrl = p[3]; - debug(version, transport, transUrl, baseUrl); - // change this to semver logic - if (version !== SockJS.version) { - throw new Error('Incompatible SockJS! Main site uses:' + - ' "' + version + '", the iframe:' + - ' "' + SockJS.version + '".'); - } - - if (!urlUtils.isOriginEqual(transUrl, loc.href) || - !urlUtils.isOriginEqual(baseUrl, loc.href)) { - throw new Error('Can\'t connect to different domain from within an ' + - 'iframe. (' + loc.href + ', ' + transUrl + ', ' + baseUrl + ')'); - } - facade = new FacadeJS(new transportMap[transport](transUrl, baseUrl)); - break; - case 'm': - facade._send(iframeMessage.data); - break; - case 'c': - if (facade) { - facade._close(); - } - facade = null; - break; - } - }; - - eventUtils.attachEvent('message', onMessage); - - // Start - iframeUtils.postMessage('s'); - }; -}; - -}).call(this)}).call(this,{ env: {} }) - -},{"./facade":7,"./info-iframe-receiver":10,"./location":13,"./utils/event":46,"./utils/iframe":47,"./utils/url":52,"debug":55}],9:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var EventEmitter = require('events').EventEmitter - , inherits = require('inherits') - , objectUtils = require('./utils/object') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:info-ajax'); -} - -function InfoAjax(url, AjaxObject) { - EventEmitter.call(this); - - var self = this; - var t0 = +new Date(); - this.xo = new AjaxObject('GET', url); - - this.xo.once('finish', function(status, text) { - var info, rtt; - if (status === 200) { - rtt = (+new Date()) - t0; - if (text) { - try { - info = JSON.parse(text); - } catch (e) { - debug('bad json', text); - } - } - - if (!objectUtils.isObject(info)) { - info = {}; - } - } - self.emit('finish', info, rtt); - self.removeAllListeners(); - }); -} - -inherits(InfoAjax, EventEmitter); - -InfoAjax.prototype.close = function() { - this.removeAllListeners(); - this.xo.close(); -}; - -module.exports = InfoAjax; - -}).call(this)}).call(this,{ env: {} }) - -},{"./utils/object":49,"debug":55,"events":3,"inherits":57}],10:[function(require,module,exports){ -'use strict'; - -var inherits = require('inherits') - , EventEmitter = require('events').EventEmitter - , XHRLocalObject = require('./transport/sender/xhr-local') - , InfoAjax = require('./info-ajax') - ; - -function InfoReceiverIframe(transUrl) { - var self = this; - EventEmitter.call(this); - - this.ir = new InfoAjax(transUrl, XHRLocalObject); - this.ir.once('finish', function(info, rtt) { - self.ir = null; - self.emit('message', JSON.stringify([info, rtt])); - }); -} - -inherits(InfoReceiverIframe, EventEmitter); - -InfoReceiverIframe.transportName = 'iframe-info-receiver'; - -InfoReceiverIframe.prototype.close = function() { - if (this.ir) { - this.ir.close(); - this.ir = null; - } - this.removeAllListeners(); -}; - -module.exports = InfoReceiverIframe; - -},{"./info-ajax":9,"./transport/sender/xhr-local":37,"events":3,"inherits":57}],11:[function(require,module,exports){ -(function (process,global){(function (){ -'use strict'; - -var EventEmitter = require('events').EventEmitter - , inherits = require('inherits') - , utils = require('./utils/event') - , IframeTransport = require('./transport/iframe') - , InfoReceiverIframe = require('./info-iframe-receiver') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:info-iframe'); -} - -function InfoIframe(baseUrl, url) { - var self = this; - EventEmitter.call(this); - - var go = function() { - var ifr = self.ifr = new IframeTransport(InfoReceiverIframe.transportName, url, baseUrl); - - ifr.once('message', function(msg) { - if (msg) { - var d; - try { - d = JSON.parse(msg); - } catch (e) { - debug('bad json', msg); - self.emit('finish'); - self.close(); - return; - } - - var info = d[0], rtt = d[1]; - self.emit('finish', info, rtt); - } - self.close(); - }); - - ifr.once('close', function() { - self.emit('finish'); - self.close(); - }); - }; - - // TODO this seems the same as the 'needBody' from transports - if (!global.document.body) { - utils.attachEvent('load', go); - } else { - go(); - } -} - -inherits(InfoIframe, EventEmitter); - -InfoIframe.enabled = function() { - return IframeTransport.enabled(); -}; - -InfoIframe.prototype.close = function() { - if (this.ifr) { - this.ifr.close(); - } - this.removeAllListeners(); - this.ifr = null; -}; - -module.exports = InfoIframe; - -}).call(this)}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./info-iframe-receiver":10,"./transport/iframe":22,"./utils/event":46,"debug":55,"events":3,"inherits":57}],12:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var EventEmitter = require('events').EventEmitter - , inherits = require('inherits') - , urlUtils = require('./utils/url') - , XDR = require('./transport/sender/xdr') - , XHRCors = require('./transport/sender/xhr-cors') - , XHRLocal = require('./transport/sender/xhr-local') - , XHRFake = require('./transport/sender/xhr-fake') - , InfoIframe = require('./info-iframe') - , InfoAjax = require('./info-ajax') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:info-receiver'); -} - -function InfoReceiver(baseUrl, urlInfo) { - debug(baseUrl); - var self = this; - EventEmitter.call(this); - - setTimeout(function() { - self.doXhr(baseUrl, urlInfo); - }, 0); -} - -inherits(InfoReceiver, EventEmitter); - -// TODO this is currently ignoring the list of available transports and the whitelist - -InfoReceiver._getReceiver = function(baseUrl, url, urlInfo) { - // determine method of CORS support (if needed) - if (urlInfo.sameOrigin) { - return new InfoAjax(url, XHRLocal); - } - if (XHRCors.enabled) { - return new InfoAjax(url, XHRCors); - } - if (XDR.enabled && urlInfo.sameScheme) { - return new InfoAjax(url, XDR); - } - if (InfoIframe.enabled()) { - return new InfoIframe(baseUrl, url); - } - return new InfoAjax(url, XHRFake); -}; - -InfoReceiver.prototype.doXhr = function(baseUrl, urlInfo) { - var self = this - , url = urlUtils.addPath(baseUrl, '/info') - ; - debug('doXhr', url); - - this.xo = InfoReceiver._getReceiver(baseUrl, url, urlInfo); - - this.timeoutRef = setTimeout(function() { - debug('timeout'); - self._cleanup(false); - self.emit('finish'); - }, InfoReceiver.timeout); - - this.xo.once('finish', function(info, rtt) { - debug('finish', info, rtt); - self._cleanup(true); - self.emit('finish', info, rtt); - }); -}; - -InfoReceiver.prototype._cleanup = function(wasClean) { - debug('_cleanup'); - clearTimeout(this.timeoutRef); - this.timeoutRef = null; - if (!wasClean && this.xo) { - this.xo.close(); - } - this.xo = null; -}; - -InfoReceiver.prototype.close = function() { - debug('close'); - this.removeAllListeners(); - this._cleanup(false); -}; - -InfoReceiver.timeout = 8000; - -module.exports = InfoReceiver; - -}).call(this)}).call(this,{ env: {} }) - -},{"./info-ajax":9,"./info-iframe":11,"./transport/sender/xdr":34,"./transport/sender/xhr-cors":35,"./transport/sender/xhr-fake":36,"./transport/sender/xhr-local":37,"./utils/url":52,"debug":55,"events":3,"inherits":57}],13:[function(require,module,exports){ -(function (global){(function (){ -'use strict'; - -module.exports = global.location || { - origin: 'http://localhost:80' -, protocol: 'http:' -, host: 'localhost' -, port: 80 -, href: 'http://localhost/' -, hash: '' -}; - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],14:[function(require,module,exports){ -(function (process,global){(function (){ -'use strict'; - -require('./shims'); - -var URL = require('url-parse') - , inherits = require('inherits') - , random = require('./utils/random') - , escape = require('./utils/escape') - , urlUtils = require('./utils/url') - , eventUtils = require('./utils/event') - , transport = require('./utils/transport') - , objectUtils = require('./utils/object') - , browser = require('./utils/browser') - , log = require('./utils/log') - , Event = require('./event/event') - , EventTarget = require('./event/eventtarget') - , loc = require('./location') - , CloseEvent = require('./event/close') - , TransportMessageEvent = require('./event/trans-message') - , InfoReceiver = require('./info-receiver') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:main'); -} - -var transports; - -// follow constructor steps defined at http://dev.w3.org/html5/websockets/#the-websocket-interface -function SockJS(url, protocols, options) { - if (!(this instanceof SockJS)) { - return new SockJS(url, protocols, options); - } - if (arguments.length < 1) { - throw new TypeError("Failed to construct 'SockJS: 1 argument required, but only 0 present"); - } - EventTarget.call(this); - - this.readyState = SockJS.CONNECTING; - this.extensions = ''; - this.protocol = ''; - - // non-standard extension - options = options || {}; - if (options.protocols_whitelist) { - log.warn("'protocols_whitelist' is DEPRECATED. Use 'transports' instead."); - } - this._transportsWhitelist = options.transports; - this._transportOptions = options.transportOptions || {}; - this._timeout = options.timeout || 0; - - var sessionId = options.sessionId || 8; - if (typeof sessionId === 'function') { - this._generateSessionId = sessionId; - } else if (typeof sessionId === 'number') { - this._generateSessionId = function() { - return random.string(sessionId); - }; - } else { - throw new TypeError('If sessionId is used in the options, it needs to be a number or a function.'); - } - - this._server = options.server || random.numberString(1000); - - // Step 1 of WS spec - parse and validate the url. Issue #8 - var parsedUrl = new URL(url); - if (!parsedUrl.host || !parsedUrl.protocol) { - throw new SyntaxError("The URL '" + url + "' is invalid"); - } else if (parsedUrl.hash) { - throw new SyntaxError('The URL must not contain a fragment'); - } else if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') { - throw new SyntaxError("The URL's scheme must be either 'http:' or 'https:'. '" + parsedUrl.protocol + "' is not allowed."); - } - - var secure = parsedUrl.protocol === 'https:'; - // Step 2 - don't allow secure origin with an insecure protocol - if (loc.protocol === 'https:' && !secure) { - // exception is 127.0.0.0/8 and ::1 urls - if (!urlUtils.isLoopbackAddr(parsedUrl.hostname)) { - throw new Error('SecurityError: An insecure SockJS connection may not be initiated from a page loaded over HTTPS'); - } - } - - // Step 3 - check port access - no need here - // Step 4 - parse protocols argument - if (!protocols) { - protocols = []; - } else if (!Array.isArray(protocols)) { - protocols = [protocols]; - } - - // Step 5 - check protocols argument - var sortedProtocols = protocols.sort(); - sortedProtocols.forEach(function(proto, i) { - if (!proto) { - throw new SyntaxError("The protocols entry '" + proto + "' is invalid."); - } - if (i < (sortedProtocols.length - 1) && proto === sortedProtocols[i + 1]) { - throw new SyntaxError("The protocols entry '" + proto + "' is duplicated."); - } - }); - - // Step 6 - convert origin - var o = urlUtils.getOrigin(loc.href); - this._origin = o ? o.toLowerCase() : null; - - // remove the trailing slash - parsedUrl.set('pathname', parsedUrl.pathname.replace(/\/+$/, '')); - - // store the sanitized url - this.url = parsedUrl.href; - debug('using url', this.url); - - // Step 7 - start connection in background - // obtain server info - // http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-26 - this._urlInfo = { - nullOrigin: !browser.hasDomain() - , sameOrigin: urlUtils.isOriginEqual(this.url, loc.href) - , sameScheme: urlUtils.isSchemeEqual(this.url, loc.href) - }; - - this._ir = new InfoReceiver(this.url, this._urlInfo); - this._ir.once('finish', this._receiveInfo.bind(this)); -} - -inherits(SockJS, EventTarget); - -function userSetCode(code) { - return code === 1000 || (code >= 3000 && code <= 4999); -} - -SockJS.prototype.close = function(code, reason) { - // Step 1 - if (code && !userSetCode(code)) { - throw new Error('InvalidAccessError: Invalid code'); - } - // Step 2.4 states the max is 123 bytes, but we are just checking length - if (reason && reason.length > 123) { - throw new SyntaxError('reason argument has an invalid length'); - } - - // Step 3.1 - if (this.readyState === SockJS.CLOSING || this.readyState === SockJS.CLOSED) { - return; - } - - // TODO look at docs to determine how to set this - var wasClean = true; - this._close(code || 1000, reason || 'Normal closure', wasClean); -}; - -SockJS.prototype.send = function(data) { - // #13 - convert anything non-string to string - // TODO this currently turns objects into [object Object] - if (typeof data !== 'string') { - data = '' + data; - } - if (this.readyState === SockJS.CONNECTING) { - throw new Error('InvalidStateError: The connection has not been established yet'); - } - if (this.readyState !== SockJS.OPEN) { - return; - } - this._transport.send(escape.quote(data)); -}; - -SockJS.version = require('./version'); - -SockJS.CONNECTING = 0; -SockJS.OPEN = 1; -SockJS.CLOSING = 2; -SockJS.CLOSED = 3; - -SockJS.prototype._receiveInfo = function(info, rtt) { - debug('_receiveInfo', rtt); - this._ir = null; - if (!info) { - this._close(1002, 'Cannot connect to server'); - return; - } - - // establish a round-trip timeout (RTO) based on the - // round-trip time (RTT) - this._rto = this.countRTO(rtt); - // allow server to override url used for the actual transport - this._transUrl = info.base_url ? info.base_url : this.url; - info = objectUtils.extend(info, this._urlInfo); - debug('info', info); - // determine list of desired and supported transports - var enabledTransports = transports.filterToEnabled(this._transportsWhitelist, info); - this._transports = enabledTransports.main; - debug(this._transports.length + ' enabled transports'); - - this._connect(); -}; - -SockJS.prototype._connect = function() { - for (var Transport = this._transports.shift(); Transport; Transport = this._transports.shift()) { - debug('attempt', Transport.transportName); - if (Transport.needBody) { - if (!global.document.body || - (typeof global.document.readyState !== 'undefined' && - global.document.readyState !== 'complete' && - global.document.readyState !== 'interactive')) { - debug('waiting for body'); - this._transports.unshift(Transport); - eventUtils.attachEvent('load', this._connect.bind(this)); - return; - } - } - - // calculate timeout based on RTO and round trips. Default to 5s - var timeoutMs = Math.max(this._timeout, (this._rto * Transport.roundTrips) || 5000); - this._transportTimeoutId = setTimeout(this._transportTimeout.bind(this), timeoutMs); - debug('using timeout', timeoutMs); - - var transportUrl = urlUtils.addPath(this._transUrl, '/' + this._server + '/' + this._generateSessionId()); - var options = this._transportOptions[Transport.transportName]; - debug('transport url', transportUrl); - var transportObj = new Transport(transportUrl, this._transUrl, options); - transportObj.on('message', this._transportMessage.bind(this)); - transportObj.once('close', this._transportClose.bind(this)); - transportObj.transportName = Transport.transportName; - this._transport = transportObj; - - return; - } - this._close(2000, 'All transports failed', false); -}; - -SockJS.prototype._transportTimeout = function() { - debug('_transportTimeout'); - if (this.readyState === SockJS.CONNECTING) { - if (this._transport) { - this._transport.close(); - } - - this._transportClose(2007, 'Transport timed out'); - } -}; - -SockJS.prototype._transportMessage = function(msg) { - debug('_transportMessage', msg); - var self = this - , type = msg.slice(0, 1) - , content = msg.slice(1) - , payload - ; - - // first check for messages that don't need a payload - switch (type) { - case 'o': - this._open(); - return; - case 'h': - this.dispatchEvent(new Event('heartbeat')); - debug('heartbeat', this.transport); - return; - } - - if (content) { - try { - payload = JSON.parse(content); - } catch (e) { - debug('bad json', content); - } - } - - if (typeof payload === 'undefined') { - debug('empty payload', content); - return; - } - - switch (type) { - case 'a': - if (Array.isArray(payload)) { - payload.forEach(function(p) { - debug('message', self.transport, p); - self.dispatchEvent(new TransportMessageEvent(p)); - }); - } - break; - case 'm': - debug('message', this.transport, payload); - this.dispatchEvent(new TransportMessageEvent(payload)); - break; - case 'c': - if (Array.isArray(payload) && payload.length === 2) { - this._close(payload[0], payload[1], true); - } - break; - } -}; - -SockJS.prototype._transportClose = function(code, reason) { - debug('_transportClose', this.transport, code, reason); - if (this._transport) { - this._transport.removeAllListeners(); - this._transport = null; - this.transport = null; - } - - if (!userSetCode(code) && code !== 2000 && this.readyState === SockJS.CONNECTING) { - this._connect(); - return; - } - - this._close(code, reason); -}; - -SockJS.prototype._open = function() { - debug('_open', this._transport && this._transport.transportName, this.readyState); - if (this.readyState === SockJS.CONNECTING) { - if (this._transportTimeoutId) { - clearTimeout(this._transportTimeoutId); - this._transportTimeoutId = null; - } - this.readyState = SockJS.OPEN; - this.transport = this._transport.transportName; - this.dispatchEvent(new Event('open')); - debug('connected', this.transport); - } else { - // The server might have been restarted, and lost track of our - // connection. - this._close(1006, 'Server lost session'); - } -}; - -SockJS.prototype._close = function(code, reason, wasClean) { - debug('_close', this.transport, code, reason, wasClean, this.readyState); - var forceFail = false; - - if (this._ir) { - forceFail = true; - this._ir.close(); - this._ir = null; - } - if (this._transport) { - this._transport.close(); - this._transport = null; - this.transport = null; - } - - if (this.readyState === SockJS.CLOSED) { - throw new Error('InvalidStateError: SockJS has already been closed'); - } - - this.readyState = SockJS.CLOSING; - setTimeout(function() { - this.readyState = SockJS.CLOSED; - - if (forceFail) { - this.dispatchEvent(new Event('error')); - } - - var e = new CloseEvent('close'); - e.wasClean = wasClean || false; - e.code = code || 1000; - e.reason = reason; - - this.dispatchEvent(e); - this.onmessage = this.onclose = this.onerror = null; - debug('disconnected'); - }.bind(this), 0); -}; - -// See: http://www.erg.abdn.ac.uk/~gerrit/dccp/notes/ccid2/rto_estimator/ -// and RFC 2988. -SockJS.prototype.countRTO = function(rtt) { - // In a local environment, when using IE8/9 and the `jsonp-polling` - // transport the time needed to establish a connection (the time that pass - // from the opening of the transport to the call of `_dispatchOpen`) is - // around 200msec (the lower bound used in the article above) and this - // causes spurious timeouts. For this reason we calculate a value slightly - // larger than that used in the article. - if (rtt > 100) { - return 4 * rtt; // rto > 400msec - } - return 300 + rtt; // 300msec < rto <= 400msec -}; - -module.exports = function(availableTransports) { - transports = transport(availableTransports); - require('./iframe-bootstrap')(SockJS, availableTransports); - return SockJS; -}; - -}).call(this)}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./event/close":2,"./event/event":4,"./event/eventtarget":5,"./event/trans-message":6,"./iframe-bootstrap":8,"./info-receiver":12,"./location":13,"./shims":15,"./utils/browser":44,"./utils/escape":45,"./utils/event":46,"./utils/log":48,"./utils/object":49,"./utils/random":50,"./utils/transport":51,"./utils/url":52,"./version":53,"debug":55,"inherits":57,"url-parse":60}],15:[function(require,module,exports){ -/* eslint-disable */ -/* jscs: disable */ -'use strict'; - -// pulled specific shims from https://github.com/es-shims/es5-shim - -var ArrayPrototype = Array.prototype; -var ObjectPrototype = Object.prototype; -var FunctionPrototype = Function.prototype; -var StringPrototype = String.prototype; -var array_slice = ArrayPrototype.slice; - -var _toString = ObjectPrototype.toString; -var isFunction = function (val) { - return ObjectPrototype.toString.call(val) === '[object Function]'; -}; -var isArray = function isArray(obj) { - return _toString.call(obj) === '[object Array]'; -}; -var isString = function isString(obj) { - return _toString.call(obj) === '[object String]'; -}; - -var supportsDescriptors = Object.defineProperty && (function () { - try { - Object.defineProperty({}, 'x', {}); - return true; - } catch (e) { /* this is ES3 */ - return false; - } -}()); - -// Define configurable, writable and non-enumerable props -// if they don't exist. -var defineProperty; -if (supportsDescriptors) { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { return; } - Object.defineProperty(object, name, { - configurable: true, - enumerable: false, - writable: true, - value: method - }); - }; -} else { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { return; } - object[name] = method; - }; -} -var defineProperties = function (object, map, forceAssign) { - for (var name in map) { - if (ObjectPrototype.hasOwnProperty.call(map, name)) { - defineProperty(object, name, map[name], forceAssign); - } - } -}; - -var toObject = function (o) { - if (o == null) { // this matches both null and undefined - throw new TypeError("can't convert " + o + ' to object'); - } - return Object(o); -}; - -// -// Util -// ====== -// - -// ES5 9.4 -// http://es5.github.com/#x9.4 -// http://jsperf.com/to-integer - -function toInteger(num) { - var n = +num; - if (n !== n) { // isNaN - n = 0; - } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - return n; -} - -function ToUint32(x) { - return x >>> 0; -} - -// -// Function -// ======== -// - -// ES-5 15.3.4.5 -// http://es5.github.com/#x15.3.4.5 - -function Empty() {} - -defineProperties(FunctionPrototype, { - bind: function bind(that) { // .length is 1 - // 1. Let Target be the this value. - var target = this; - // 2. If IsCallable(Target) is false, throw a TypeError exception. - if (!isFunction(target)) { - throw new TypeError('Function.prototype.bind called on incompatible ' + target); - } - // 3. Let A be a new (possibly empty) internal list of all of the - // argument values provided after thisArg (arg1, arg2 etc), in order. - // XXX slicedArgs will stand in for "A" if used - var args = array_slice.call(arguments, 1); // for normal call - // 4. Let F be a new native ECMAScript object. - // 11. Set the [[Prototype]] internal property of F to the standard - // built-in Function prototype object as specified in 15.3.3.1. - // 12. Set the [[Call]] internal property of F as described in - // 15.3.4.5.1. - // 13. Set the [[Construct]] internal property of F as described in - // 15.3.4.5.2. - // 14. Set the [[HasInstance]] internal property of F as described in - // 15.3.4.5.3. - var binder = function () { - - if (this instanceof bound) { - // 15.3.4.5.2 [[Construct]] - // When the [[Construct]] internal method of a function object, - // F that was created using the bind function is called with a - // list of arguments ExtraArgs, the following steps are taken: - // 1. Let target be the value of F's [[TargetFunction]] - // internal property. - // 2. If target has no [[Construct]] internal method, a - // TypeError exception is thrown. - // 3. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Construct]] internal - // method of target providing args as the arguments. - - var result = target.apply( - this, - args.concat(array_slice.call(arguments)) - ); - if (Object(result) === result) { - return result; - } - return this; - - } else { - // 15.3.4.5.1 [[Call]] - // When the [[Call]] internal method of a function object, F, - // which was created using the bind function is called with a - // this value and a list of arguments ExtraArgs, the following - // steps are taken: - // 1. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 2. Let boundThis be the value of F's [[BoundThis]] internal - // property. - // 3. Let target be the value of F's [[TargetFunction]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Call]] internal method - // of target providing boundThis as the this value and - // providing args as the arguments. - - // equiv: target.call(this, ...boundArgs, ...args) - return target.apply( - that, - args.concat(array_slice.call(arguments)) - ); - - } - - }; - - // 15. If the [[Class]] internal property of Target is "Function", then - // a. Let L be the length property of Target minus the length of A. - // b. Set the length own property of F to either 0 or L, whichever is - // larger. - // 16. Else set the length own property of F to 0. - - var boundLength = Math.max(0, target.length - args.length); - - // 17. Set the attributes of the length own property of F to the values - // specified in 15.3.5.1. - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs.push('$' + i); - } - - // XXX Build a dynamic function with desired amount of arguments is the only - // way to set the length property of a function. - // In environments where Content Security Policies enabled (Chrome extensions, - // for ex.) all use of eval or Function costructor throws an exception. - // However in all of these environments Function.prototype.bind exists - // and so this code will never be executed. - var bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder); - - if (target.prototype) { - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - // Clean up dangling references. - Empty.prototype = null; - } - - // TODO - // 18. Set the [[Extensible]] internal property of F to true. - - // TODO - // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). - // 20. Call the [[DefineOwnProperty]] internal method of F with - // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: - // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and - // false. - // 21. Call the [[DefineOwnProperty]] internal method of F with - // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, - // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, - // and false. - - // TODO - // NOTE Function objects created using Function.prototype.bind do not - // have a prototype property or the [[Code]], [[FormalParameters]], and - // [[Scope]] internal properties. - // XXX can't delete prototype in pure-js. - - // 22. Return F. - return bound; - } -}); - -// -// Array -// ===== -// - -// ES5 15.4.3.2 -// http://es5.github.com/#x15.4.3.2 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray -defineProperties(Array, { isArray: isArray }); - - -var boxedString = Object('a'); -var splitString = boxedString[0] !== 'a' || !(0 in boxedString); - -var properlyBoxesContext = function properlyBoxed(method) { - // Check node 0.6.21 bug where third parameter is not boxed - var properlyBoxesNonStrict = true; - var properlyBoxesStrict = true; - if (method) { - method.call('foo', function (_, __, context) { - if (typeof context !== 'object') { properlyBoxesNonStrict = false; } - }); - - method.call([1], function () { - 'use strict'; - properlyBoxesStrict = typeof this === 'string'; - }, 'x'); - } - return !!method && properlyBoxesNonStrict && properlyBoxesStrict; -}; - -defineProperties(ArrayPrototype, { - forEach: function forEach(fun /*, thisp*/) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - thisp = arguments[1], - i = -1, - length = self.length >>> 0; - - // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(); // TODO message - } - - while (++i < length) { - if (i in self) { - // Invoke the callback function with call, passing arguments: - // context, property value, property key, thisArg object - // context - fun.call(thisp, self[i], i, object); - } - } - } -}, !properlyBoxesContext(ArrayPrototype.forEach)); - -// ES5 15.4.4.14 -// http://es5.github.com/#x15.4.4.14 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf -var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1; -defineProperties(ArrayPrototype, { - indexOf: function indexOf(sought /*, fromIndex */ ) { - var self = splitString && isString(this) ? this.split('') : toObject(this), - length = self.length >>> 0; - - if (!length) { - return -1; - } - - var i = 0; - if (arguments.length > 1) { - i = toInteger(arguments[1]); - } - - // handle negative indices - i = i >= 0 ? i : Math.max(0, length + i); - for (; i < length; i++) { - if (i in self && self[i] === sought) { - return i; - } - } - return -1; - } -}, hasFirefox2IndexOfBug); - -// -// String -// ====== -// - -// ES5 15.5.4.14 -// http://es5.github.com/#x15.5.4.14 - -// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] -// Many browsers do not split properly with regular expressions or they -// do not perform the split correctly under obscure conditions. -// See http://blog.stevenlevithan.com/archives/cross-browser-split -// I've tested in many browsers and this seems to cover the deviant ones: -// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] -// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] -// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not -// [undefined, "t", undefined, "e", ...] -// ''.split(/.?/) should be [], not [""] -// '.'.split(/()()/) should be ["."], not ["", "", "."] - -var string_split = StringPrototype.split; -if ( - 'ab'.split(/(?:ab)*/).length !== 2 || - '.'.split(/(.?)(.?)/).length !== 4 || - 'tesst'.split(/(s)*/)[1] === 't' || - 'test'.split(/(?:)/, -1).length !== 4 || - ''.split(/.?/).length || - '.'.split(/()()/).length > 1 -) { - (function () { - var compliantExecNpcg = /()??/.exec('')[1] === void 0; // NPCG: nonparticipating capturing group - - StringPrototype.split = function (separator, limit) { - var string = this; - if (separator === void 0 && limit === 0) { - return []; - } - - // If `separator` is not a regex, use native split - if (_toString.call(separator) !== '[object RegExp]') { - return string_split.call(this, separator, limit); - } - - var output = [], - flags = (separator.ignoreCase ? 'i' : '') + - (separator.multiline ? 'm' : '') + - (separator.extended ? 'x' : '') + // Proposed for ES6 - (separator.sticky ? 'y' : ''), // Firefox 3+ - lastLastIndex = 0, - // Make `global` and avoid `lastIndex` issues by working with a copy - separator2, match, lastIndex, lastLength; - separator = new RegExp(separator.source, flags + 'g'); - string += ''; // Type-convert - if (!compliantExecNpcg) { - // Doesn't need flags gy, but they don't hurt - separator2 = new RegExp('^' + separator.source + '$(?!\\s)', flags); - } - /* Values for `limit`, per the spec: - * If undefined: 4294967295 // Math.pow(2, 32) - 1 - * If 0, Infinity, or NaN: 0 - * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; - * If negative number: 4294967296 - Math.floor(Math.abs(limit)) - * If other: Type-convert, then use the above rules - */ - limit = limit === void 0 ? - -1 >>> 0 : // Math.pow(2, 32) - 1 - ToUint32(limit); - while (match = separator.exec(string)) { - // `separator.lastIndex` is not reliable cross-browser - lastIndex = match.index + match[0].length; - if (lastIndex > lastLastIndex) { - output.push(string.slice(lastLastIndex, match.index)); - // Fix browsers whose `exec` methods don't consistently return `undefined` for - // nonparticipating capturing groups - if (!compliantExecNpcg && match.length > 1) { - match[0].replace(separator2, function () { - for (var i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === void 0) { - match[i] = void 0; - } - } - }); - } - if (match.length > 1 && match.index < string.length) { - ArrayPrototype.push.apply(output, match.slice(1)); - } - lastLength = match[0].length; - lastLastIndex = lastIndex; - if (output.length >= limit) { - break; - } - } - if (separator.lastIndex === match.index) { - separator.lastIndex++; // Avoid an infinite loop - } - } - if (lastLastIndex === string.length) { - if (lastLength || !separator.test('')) { - output.push(''); - } - } else { - output.push(string.slice(lastLastIndex)); - } - return output.length > limit ? output.slice(0, limit) : output; - }; - }()); - -// [bugfix, chrome] -// If separator is undefined, then the result array contains just one String, -// which is the this value (converted to a String). If limit is not undefined, -// then the output array is truncated so that it contains no more than limit -// elements. -// "0".split(undefined, 0) -> [] -} else if ('0'.split(void 0, 0).length) { - StringPrototype.split = function split(separator, limit) { - if (separator === void 0 && limit === 0) { return []; } - return string_split.call(this, separator, limit); - }; -} - -// ECMA-262, 3rd B.2.3 -// Not an ECMAScript standard, although ECMAScript 3rd Edition has a -// non-normative section suggesting uniform semantics and it should be -// normalized across all browsers -// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE -var string_substr = StringPrototype.substr; -var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; -defineProperties(StringPrototype, { - substr: function substr(start, length) { - return string_substr.call( - this, - start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start, - length - ); - } -}, hasNegativeSubstrBug); - -},{}],16:[function(require,module,exports){ -'use strict'; - -module.exports = [ - // streaming transports - require('./transport/websocket') -, require('./transport/xhr-streaming') -, require('./transport/xdr-streaming') -, require('./transport/eventsource') -, require('./transport/lib/iframe-wrap')(require('./transport/eventsource')) - - // polling transports -, require('./transport/htmlfile') -, require('./transport/lib/iframe-wrap')(require('./transport/htmlfile')) -, require('./transport/xhr-polling') -, require('./transport/xdr-polling') -, require('./transport/lib/iframe-wrap')(require('./transport/xhr-polling')) -, require('./transport/jsonp-polling') -]; - -},{"./transport/eventsource":20,"./transport/htmlfile":21,"./transport/jsonp-polling":23,"./transport/lib/iframe-wrap":26,"./transport/websocket":38,"./transport/xdr-polling":39,"./transport/xdr-streaming":40,"./transport/xhr-polling":41,"./transport/xhr-streaming":42}],17:[function(require,module,exports){ -(function (process,global){(function (){ -'use strict'; - -var EventEmitter = require('events').EventEmitter - , inherits = require('inherits') - , utils = require('../../utils/event') - , urlUtils = require('../../utils/url') - , XHR = global.XMLHttpRequest - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:browser:xhr'); -} - -function AbstractXHRObject(method, url, payload, opts) { - debug(method, url); - var self = this; - EventEmitter.call(this); - - setTimeout(function () { - self._start(method, url, payload, opts); - }, 0); -} - -inherits(AbstractXHRObject, EventEmitter); - -AbstractXHRObject.prototype._start = function(method, url, payload, opts) { - var self = this; - - try { - this.xhr = new XHR(); - } catch (x) { - // intentionally empty - } - - if (!this.xhr) { - debug('no xhr'); - this.emit('finish', 0, 'no xhr support'); - this._cleanup(); - return; - } - - // several browsers cache POSTs - url = urlUtils.addQuery(url, 't=' + (+new Date())); - - // Explorer tends to keep connection open, even after the - // tab gets closed: http://bugs.jquery.com/ticket/5280 - this.unloadRef = utils.unloadAdd(function() { - debug('unload cleanup'); - self._cleanup(true); - }); - try { - this.xhr.open(method, url, true); - if (this.timeout && 'timeout' in this.xhr) { - this.xhr.timeout = this.timeout; - this.xhr.ontimeout = function() { - debug('xhr timeout'); - self.emit('finish', 0, ''); - self._cleanup(false); - }; - } - } catch (e) { - debug('exception', e); - // IE raises an exception on wrong port. - this.emit('finish', 0, ''); - this._cleanup(false); - return; - } - - if ((!opts || !opts.noCredentials) && AbstractXHRObject.supportsCORS) { - debug('withCredentials'); - // Mozilla docs says https://developer.mozilla.org/en/XMLHttpRequest : - // "This never affects same-site requests." - - this.xhr.withCredentials = true; - } - if (opts && opts.headers) { - for (var key in opts.headers) { - this.xhr.setRequestHeader(key, opts.headers[key]); - } - } - - this.xhr.onreadystatechange = function() { - if (self.xhr) { - var x = self.xhr; - var text, status; - debug('readyState', x.readyState); - switch (x.readyState) { - case 3: - // IE doesn't like peeking into responseText or status - // on Microsoft.XMLHTTP and readystate=3 - try { - status = x.status; - text = x.responseText; - } catch (e) { - // intentionally empty - } - debug('status', status); - // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450 - if (status === 1223) { - status = 204; - } - - // IE does return readystate == 3 for 404 answers. - if (status === 200 && text && text.length > 0) { - debug('chunk'); - self.emit('chunk', status, text); - } - break; - case 4: - status = x.status; - debug('status', status); - // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450 - if (status === 1223) { - status = 204; - } - // IE returns this for a bad port - // http://msdn.microsoft.com/en-us/library/windows/desktop/aa383770(v=vs.85).aspx - if (status === 12005 || status === 12029) { - status = 0; - } - - debug('finish', status, x.responseText); - self.emit('finish', status, x.responseText); - self._cleanup(false); - break; - } - } - }; - - try { - self.xhr.send(payload); - } catch (e) { - self.emit('finish', 0, ''); - self._cleanup(false); - } -}; - -AbstractXHRObject.prototype._cleanup = function(abort) { - debug('cleanup'); - if (!this.xhr) { - return; - } - this.removeAllListeners(); - utils.unloadDel(this.unloadRef); - - // IE needs this field to be a function - this.xhr.onreadystatechange = function() {}; - if (this.xhr.ontimeout) { - this.xhr.ontimeout = null; - } - - if (abort) { - try { - this.xhr.abort(); - } catch (x) { - // intentionally empty - } - } - this.unloadRef = this.xhr = null; -}; - -AbstractXHRObject.prototype.close = function() { - debug('close'); - this._cleanup(true); -}; - -AbstractXHRObject.enabled = !!XHR; -// override XMLHttpRequest for IE6/7 -// obfuscate to avoid firewalls -var axo = ['Active'].concat('Object').join('X'); -if (!AbstractXHRObject.enabled && (axo in global)) { - debug('overriding xmlhttprequest'); - XHR = function() { - try { - return new global[axo]('Microsoft.XMLHTTP'); - } catch (e) { - return null; - } - }; - AbstractXHRObject.enabled = !!new XHR(); -} - -var cors = false; -try { - cors = 'withCredentials' in new XHR(); -} catch (ignored) { - // intentionally empty -} - -AbstractXHRObject.supportsCORS = cors; - -module.exports = AbstractXHRObject; - -}).call(this)}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"../../utils/event":46,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],18:[function(require,module,exports){ -(function (global){(function (){ -module.exports = global.EventSource; - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],19:[function(require,module,exports){ -(function (global){(function (){ -'use strict'; - -var Driver = global.WebSocket || global.MozWebSocket; -if (Driver) { - module.exports = function WebSocketBrowserDriver(url) { - return new Driver(url); - }; -} else { - module.exports = undefined; -} - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],20:[function(require,module,exports){ -'use strict'; - -var inherits = require('inherits') - , AjaxBasedTransport = require('./lib/ajax-based') - , EventSourceReceiver = require('./receiver/eventsource') - , XHRCorsObject = require('./sender/xhr-cors') - , EventSourceDriver = require('eventsource') - ; - -function EventSourceTransport(transUrl) { - if (!EventSourceTransport.enabled()) { - throw new Error('Transport created when disabled'); - } - - AjaxBasedTransport.call(this, transUrl, '/eventsource', EventSourceReceiver, XHRCorsObject); -} - -inherits(EventSourceTransport, AjaxBasedTransport); - -EventSourceTransport.enabled = function() { - return !!EventSourceDriver; -}; - -EventSourceTransport.transportName = 'eventsource'; -EventSourceTransport.roundTrips = 2; - -module.exports = EventSourceTransport; - -},{"./lib/ajax-based":24,"./receiver/eventsource":29,"./sender/xhr-cors":35,"eventsource":18,"inherits":57}],21:[function(require,module,exports){ -'use strict'; - -var inherits = require('inherits') - , HtmlfileReceiver = require('./receiver/htmlfile') - , XHRLocalObject = require('./sender/xhr-local') - , AjaxBasedTransport = require('./lib/ajax-based') - ; - -function HtmlFileTransport(transUrl) { - if (!HtmlfileReceiver.enabled) { - throw new Error('Transport created when disabled'); - } - AjaxBasedTransport.call(this, transUrl, '/htmlfile', HtmlfileReceiver, XHRLocalObject); -} - -inherits(HtmlFileTransport, AjaxBasedTransport); - -HtmlFileTransport.enabled = function(info) { - return HtmlfileReceiver.enabled && info.sameOrigin; -}; - -HtmlFileTransport.transportName = 'htmlfile'; -HtmlFileTransport.roundTrips = 2; - -module.exports = HtmlFileTransport; - -},{"./lib/ajax-based":24,"./receiver/htmlfile":30,"./sender/xhr-local":37,"inherits":57}],22:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -// Few cool transports do work only for same-origin. In order to make -// them work cross-domain we shall use iframe, served from the -// remote domain. New browsers have capabilities to communicate with -// cross domain iframe using postMessage(). In IE it was implemented -// from IE 8+, but of course, IE got some details wrong: -// http://msdn.microsoft.com/en-us/library/cc197015(v=VS.85).aspx -// http://stevesouders.com/misc/test-postmessage.php - -var inherits = require('inherits') - , EventEmitter = require('events').EventEmitter - , version = require('../version') - , urlUtils = require('../utils/url') - , iframeUtils = require('../utils/iframe') - , eventUtils = require('../utils/event') - , random = require('../utils/random') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:transport:iframe'); -} - -function IframeTransport(transport, transUrl, baseUrl) { - if (!IframeTransport.enabled()) { - throw new Error('Transport created when disabled'); - } - EventEmitter.call(this); - - var self = this; - this.origin = urlUtils.getOrigin(baseUrl); - this.baseUrl = baseUrl; - this.transUrl = transUrl; - this.transport = transport; - this.windowId = random.string(8); - - var iframeUrl = urlUtils.addPath(baseUrl, '/iframe.html') + '#' + this.windowId; - debug(transport, transUrl, iframeUrl); - - this.iframeObj = iframeUtils.createIframe(iframeUrl, function(r) { - debug('err callback'); - self.emit('close', 1006, 'Unable to load an iframe (' + r + ')'); - self.close(); - }); - - this.onmessageCallback = this._message.bind(this); - eventUtils.attachEvent('message', this.onmessageCallback); -} - -inherits(IframeTransport, EventEmitter); - -IframeTransport.prototype.close = function() { - debug('close'); - this.removeAllListeners(); - if (this.iframeObj) { - eventUtils.detachEvent('message', this.onmessageCallback); - try { - // When the iframe is not loaded, IE raises an exception - // on 'contentWindow'. - this.postMessage('c'); - } catch (x) { - // intentionally empty - } - this.iframeObj.cleanup(); - this.iframeObj = null; - this.onmessageCallback = this.iframeObj = null; - } -}; - -IframeTransport.prototype._message = function(e) { - debug('message', e.data); - if (!urlUtils.isOriginEqual(e.origin, this.origin)) { - debug('not same origin', e.origin, this.origin); - return; - } - - var iframeMessage; - try { - iframeMessage = JSON.parse(e.data); - } catch (ignored) { - debug('bad json', e.data); - return; - } - - if (iframeMessage.windowId !== this.windowId) { - debug('mismatched window id', iframeMessage.windowId, this.windowId); - return; - } - - switch (iframeMessage.type) { - case 's': - this.iframeObj.loaded(); - // window global dependency - this.postMessage('s', JSON.stringify([ - version - , this.transport - , this.transUrl - , this.baseUrl - ])); - break; - case 't': - this.emit('message', iframeMessage.data); - break; - case 'c': - var cdata; - try { - cdata = JSON.parse(iframeMessage.data); - } catch (ignored) { - debug('bad json', iframeMessage.data); - return; - } - this.emit('close', cdata[0], cdata[1]); - this.close(); - break; - } -}; - -IframeTransport.prototype.postMessage = function(type, data) { - debug('postMessage', type, data); - this.iframeObj.post(JSON.stringify({ - windowId: this.windowId - , type: type - , data: data || '' - }), this.origin); -}; - -IframeTransport.prototype.send = function(message) { - debug('send', message); - this.postMessage('m', message); -}; - -IframeTransport.enabled = function() { - return iframeUtils.iframeEnabled; -}; - -IframeTransport.transportName = 'iframe'; -IframeTransport.roundTrips = 2; - -module.exports = IframeTransport; - -}).call(this)}).call(this,{ env: {} }) - -},{"../utils/event":46,"../utils/iframe":47,"../utils/random":50,"../utils/url":52,"../version":53,"debug":55,"events":3,"inherits":57}],23:[function(require,module,exports){ -(function (global){(function (){ -'use strict'; - -// The simplest and most robust transport, using the well-know cross -// domain hack - JSONP. This transport is quite inefficient - one -// message could use up to one http request. But at least it works almost -// everywhere. -// Known limitations: -// o you will get a spinning cursor -// o for Konqueror a dumb timer is needed to detect errors - -var inherits = require('inherits') - , SenderReceiver = require('./lib/sender-receiver') - , JsonpReceiver = require('./receiver/jsonp') - , jsonpSender = require('./sender/jsonp') - ; - -function JsonPTransport(transUrl) { - if (!JsonPTransport.enabled()) { - throw new Error('Transport created when disabled'); - } - SenderReceiver.call(this, transUrl, '/jsonp', jsonpSender, JsonpReceiver); -} - -inherits(JsonPTransport, SenderReceiver); - -JsonPTransport.enabled = function() { - return !!global.document; -}; - -JsonPTransport.transportName = 'jsonp-polling'; -JsonPTransport.roundTrips = 1; -JsonPTransport.needBody = true; - -module.exports = JsonPTransport; - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./lib/sender-receiver":28,"./receiver/jsonp":31,"./sender/jsonp":33,"inherits":57}],24:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var inherits = require('inherits') - , urlUtils = require('../../utils/url') - , SenderReceiver = require('./sender-receiver') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:ajax-based'); -} - -function createAjaxSender(AjaxObject) { - return function(url, payload, callback) { - debug('create ajax sender', url, payload); - var opt = {}; - if (typeof payload === 'string') { - opt.headers = {'Content-type': 'text/plain'}; - } - var ajaxUrl = urlUtils.addPath(url, '/xhr_send'); - var xo = new AjaxObject('POST', ajaxUrl, payload, opt); - xo.once('finish', function(status) { - debug('finish', status); - xo = null; - - if (status !== 200 && status !== 204) { - return callback(new Error('http status ' + status)); - } - callback(); - }); - return function() { - debug('abort'); - xo.close(); - xo = null; - - var err = new Error('Aborted'); - err.code = 1000; - callback(err); - }; - }; -} - -function AjaxBasedTransport(transUrl, urlSuffix, Receiver, AjaxObject) { - SenderReceiver.call(this, transUrl, urlSuffix, createAjaxSender(AjaxObject), Receiver, AjaxObject); -} - -inherits(AjaxBasedTransport, SenderReceiver); - -module.exports = AjaxBasedTransport; - -}).call(this)}).call(this,{ env: {} }) - -},{"../../utils/url":52,"./sender-receiver":28,"debug":55,"inherits":57}],25:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var inherits = require('inherits') - , EventEmitter = require('events').EventEmitter - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:buffered-sender'); -} - -function BufferedSender(url, sender) { - debug(url); - EventEmitter.call(this); - this.sendBuffer = []; - this.sender = sender; - this.url = url; -} - -inherits(BufferedSender, EventEmitter); - -BufferedSender.prototype.send = function(message) { - debug('send', message); - this.sendBuffer.push(message); - if (!this.sendStop) { - this.sendSchedule(); - } -}; - -// For polling transports in a situation when in the message callback, -// new message is being send. If the sending connection was started -// before receiving one, it is possible to saturate the network and -// timeout due to the lack of receiving socket. To avoid that we delay -// sending messages by some small time, in order to let receiving -// connection be started beforehand. This is only a halfmeasure and -// does not fix the big problem, but it does make the tests go more -// stable on slow networks. -BufferedSender.prototype.sendScheduleWait = function() { - debug('sendScheduleWait'); - var self = this; - var tref; - this.sendStop = function() { - debug('sendStop'); - self.sendStop = null; - clearTimeout(tref); - }; - tref = setTimeout(function() { - debug('timeout'); - self.sendStop = null; - self.sendSchedule(); - }, 25); -}; - -BufferedSender.prototype.sendSchedule = function() { - debug('sendSchedule', this.sendBuffer.length); - var self = this; - if (this.sendBuffer.length > 0) { - var payload = '[' + this.sendBuffer.join(',') + ']'; - this.sendStop = this.sender(this.url, payload, function(err) { - self.sendStop = null; - if (err) { - debug('error', err); - self.emit('close', err.code || 1006, 'Sending error: ' + err); - self.close(); - } else { - self.sendScheduleWait(); - } - }); - this.sendBuffer = []; - } -}; - -BufferedSender.prototype._cleanup = function() { - debug('_cleanup'); - this.removeAllListeners(); -}; - -BufferedSender.prototype.close = function() { - debug('close'); - this._cleanup(); - if (this.sendStop) { - this.sendStop(); - this.sendStop = null; - } -}; - -module.exports = BufferedSender; - -}).call(this)}).call(this,{ env: {} }) - -},{"debug":55,"events":3,"inherits":57}],26:[function(require,module,exports){ -(function (global){(function (){ -'use strict'; - -var inherits = require('inherits') - , IframeTransport = require('../iframe') - , objectUtils = require('../../utils/object') - ; - -module.exports = function(transport) { - - function IframeWrapTransport(transUrl, baseUrl) { - IframeTransport.call(this, transport.transportName, transUrl, baseUrl); - } - - inherits(IframeWrapTransport, IframeTransport); - - IframeWrapTransport.enabled = function(url, info) { - if (!global.document) { - return false; - } - - var iframeInfo = objectUtils.extend({}, info); - iframeInfo.sameOrigin = true; - return transport.enabled(iframeInfo) && IframeTransport.enabled(); - }; - - IframeWrapTransport.transportName = 'iframe-' + transport.transportName; - IframeWrapTransport.needBody = true; - IframeWrapTransport.roundTrips = IframeTransport.roundTrips + transport.roundTrips - 1; // html, javascript (2) + transport - no CORS (1) - - IframeWrapTransport.facadeTransport = transport; - - return IframeWrapTransport; -}; - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"../../utils/object":49,"../iframe":22,"inherits":57}],27:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var inherits = require('inherits') - , EventEmitter = require('events').EventEmitter - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:polling'); -} - -function Polling(Receiver, receiveUrl, AjaxObject) { - debug(receiveUrl); - EventEmitter.call(this); - this.Receiver = Receiver; - this.receiveUrl = receiveUrl; - this.AjaxObject = AjaxObject; - this._scheduleReceiver(); -} - -inherits(Polling, EventEmitter); - -Polling.prototype._scheduleReceiver = function() { - debug('_scheduleReceiver'); - var self = this; - var poll = this.poll = new this.Receiver(this.receiveUrl, this.AjaxObject); - - poll.on('message', function(msg) { - debug('message', msg); - self.emit('message', msg); - }); - - poll.once('close', function(code, reason) { - debug('close', code, reason, self.pollIsClosing); - self.poll = poll = null; - - if (!self.pollIsClosing) { - if (reason === 'network') { - self._scheduleReceiver(); - } else { - self.emit('close', code || 1006, reason); - self.removeAllListeners(); - } - } - }); -}; - -Polling.prototype.abort = function() { - debug('abort'); - this.removeAllListeners(); - this.pollIsClosing = true; - if (this.poll) { - this.poll.abort(); - } -}; - -module.exports = Polling; - -}).call(this)}).call(this,{ env: {} }) - -},{"debug":55,"events":3,"inherits":57}],28:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var inherits = require('inherits') - , urlUtils = require('../../utils/url') - , BufferedSender = require('./buffered-sender') - , Polling = require('./polling') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:sender-receiver'); -} - -function SenderReceiver(transUrl, urlSuffix, senderFunc, Receiver, AjaxObject) { - var pollUrl = urlUtils.addPath(transUrl, urlSuffix); - debug(pollUrl); - var self = this; - BufferedSender.call(this, transUrl, senderFunc); - - this.poll = new Polling(Receiver, pollUrl, AjaxObject); - this.poll.on('message', function(msg) { - debug('poll message', msg); - self.emit('message', msg); - }); - this.poll.once('close', function(code, reason) { - debug('poll close', code, reason); - self.poll = null; - self.emit('close', code, reason); - self.close(); - }); -} - -inherits(SenderReceiver, BufferedSender); - -SenderReceiver.prototype.close = function() { - BufferedSender.prototype.close.call(this); - debug('close'); - this.removeAllListeners(); - if (this.poll) { - this.poll.abort(); - this.poll = null; - } -}; - -module.exports = SenderReceiver; - -}).call(this)}).call(this,{ env: {} }) - -},{"../../utils/url":52,"./buffered-sender":25,"./polling":27,"debug":55,"inherits":57}],29:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var inherits = require('inherits') - , EventEmitter = require('events').EventEmitter - , EventSourceDriver = require('eventsource') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:receiver:eventsource'); -} - -function EventSourceReceiver(url) { - debug(url); - EventEmitter.call(this); - - var self = this; - var es = this.es = new EventSourceDriver(url); - es.onmessage = function(e) { - debug('message', e.data); - self.emit('message', decodeURI(e.data)); - }; - es.onerror = function(e) { - debug('error', es.readyState, e); - // ES on reconnection has readyState = 0 or 1. - // on network error it's CLOSED = 2 - var reason = (es.readyState !== 2 ? 'network' : 'permanent'); - self._cleanup(); - self._close(reason); - }; -} - -inherits(EventSourceReceiver, EventEmitter); - -EventSourceReceiver.prototype.abort = function() { - debug('abort'); - this._cleanup(); - this._close('user'); -}; - -EventSourceReceiver.prototype._cleanup = function() { - debug('cleanup'); - var es = this.es; - if (es) { - es.onmessage = es.onerror = null; - es.close(); - this.es = null; - } -}; - -EventSourceReceiver.prototype._close = function(reason) { - debug('close', reason); - var self = this; - // Safari and chrome < 15 crash if we close window before - // waiting for ES cleanup. See: - // https://code.google.com/p/chromium/issues/detail?id=89155 - setTimeout(function() { - self.emit('close', null, reason); - self.removeAllListeners(); - }, 200); -}; - -module.exports = EventSourceReceiver; - -}).call(this)}).call(this,{ env: {} }) - -},{"debug":55,"events":3,"eventsource":18,"inherits":57}],30:[function(require,module,exports){ -(function (process,global){(function (){ -'use strict'; - -var inherits = require('inherits') - , iframeUtils = require('../../utils/iframe') - , urlUtils = require('../../utils/url') - , EventEmitter = require('events').EventEmitter - , random = require('../../utils/random') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:receiver:htmlfile'); -} - -function HtmlfileReceiver(url) { - debug(url); - EventEmitter.call(this); - var self = this; - iframeUtils.polluteGlobalNamespace(); - - this.id = 'a' + random.string(6); - url = urlUtils.addQuery(url, 'c=' + decodeURIComponent(iframeUtils.WPrefix + '.' + this.id)); - - debug('using htmlfile', HtmlfileReceiver.htmlfileEnabled); - var constructFunc = HtmlfileReceiver.htmlfileEnabled ? - iframeUtils.createHtmlfile : iframeUtils.createIframe; - - global[iframeUtils.WPrefix][this.id] = { - start: function() { - debug('start'); - self.iframeObj.loaded(); - } - , message: function(data) { - debug('message', data); - self.emit('message', data); - } - , stop: function() { - debug('stop'); - self._cleanup(); - self._close('network'); - } - }; - this.iframeObj = constructFunc(url, function() { - debug('callback'); - self._cleanup(); - self._close('permanent'); - }); -} - -inherits(HtmlfileReceiver, EventEmitter); - -HtmlfileReceiver.prototype.abort = function() { - debug('abort'); - this._cleanup(); - this._close('user'); -}; - -HtmlfileReceiver.prototype._cleanup = function() { - debug('_cleanup'); - if (this.iframeObj) { - this.iframeObj.cleanup(); - this.iframeObj = null; - } - delete global[iframeUtils.WPrefix][this.id]; -}; - -HtmlfileReceiver.prototype._close = function(reason) { - debug('_close', reason); - this.emit('close', null, reason); - this.removeAllListeners(); -}; - -HtmlfileReceiver.htmlfileEnabled = false; - -// obfuscate to avoid firewalls -var axo = ['Active'].concat('Object').join('X'); -if (axo in global) { - try { - HtmlfileReceiver.htmlfileEnabled = !!new global[axo]('htmlfile'); - } catch (x) { - // intentionally empty - } -} - -HtmlfileReceiver.enabled = HtmlfileReceiver.htmlfileEnabled || iframeUtils.iframeEnabled; - -module.exports = HtmlfileReceiver; - -}).call(this)}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"../../utils/iframe":47,"../../utils/random":50,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],31:[function(require,module,exports){ -(function (process,global){(function (){ -'use strict'; - -var utils = require('../../utils/iframe') - , random = require('../../utils/random') - , browser = require('../../utils/browser') - , urlUtils = require('../../utils/url') - , inherits = require('inherits') - , EventEmitter = require('events').EventEmitter - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:receiver:jsonp'); -} - -function JsonpReceiver(url) { - debug(url); - var self = this; - EventEmitter.call(this); - - utils.polluteGlobalNamespace(); - - this.id = 'a' + random.string(6); - var urlWithId = urlUtils.addQuery(url, 'c=' + encodeURIComponent(utils.WPrefix + '.' + this.id)); - - global[utils.WPrefix][this.id] = this._callback.bind(this); - this._createScript(urlWithId); - - // Fallback mostly for Konqueror - stupid timer, 35 seconds shall be plenty. - this.timeoutId = setTimeout(function() { - debug('timeout'); - self._abort(new Error('JSONP script loaded abnormally (timeout)')); - }, JsonpReceiver.timeout); -} - -inherits(JsonpReceiver, EventEmitter); - -JsonpReceiver.prototype.abort = function() { - debug('abort'); - if (global[utils.WPrefix][this.id]) { - var err = new Error('JSONP user aborted read'); - err.code = 1000; - this._abort(err); - } -}; - -JsonpReceiver.timeout = 35000; -JsonpReceiver.scriptErrorTimeout = 1000; - -JsonpReceiver.prototype._callback = function(data) { - debug('_callback', data); - this._cleanup(); - - if (this.aborting) { - return; - } - - if (data) { - debug('message', data); - this.emit('message', data); - } - this.emit('close', null, 'network'); - this.removeAllListeners(); -}; - -JsonpReceiver.prototype._abort = function(err) { - debug('_abort', err); - this._cleanup(); - this.aborting = true; - this.emit('close', err.code, err.message); - this.removeAllListeners(); -}; - -JsonpReceiver.prototype._cleanup = function() { - debug('_cleanup'); - clearTimeout(this.timeoutId); - if (this.script2) { - this.script2.parentNode.removeChild(this.script2); - this.script2 = null; - } - if (this.script) { - var script = this.script; - // Unfortunately, you can't really abort script loading of - // the script. - script.parentNode.removeChild(script); - script.onreadystatechange = script.onerror = - script.onload = script.onclick = null; - this.script = null; - } - delete global[utils.WPrefix][this.id]; -}; - -JsonpReceiver.prototype._scriptError = function() { - debug('_scriptError'); - var self = this; - if (this.errorTimer) { - return; - } - - this.errorTimer = setTimeout(function() { - if (!self.loadedOkay) { - self._abort(new Error('JSONP script loaded abnormally (onerror)')); - } - }, JsonpReceiver.scriptErrorTimeout); -}; - -JsonpReceiver.prototype._createScript = function(url) { - debug('_createScript', url); - var self = this; - var script = this.script = global.document.createElement('script'); - var script2; // Opera synchronous load trick. - - script.id = 'a' + random.string(8); - script.src = url; - script.type = 'text/javascript'; - script.charset = 'UTF-8'; - script.onerror = this._scriptError.bind(this); - script.onload = function() { - debug('onload'); - self._abort(new Error('JSONP script loaded abnormally (onload)')); - }; - - // IE9 fires 'error' event after onreadystatechange or before, in random order. - // Use loadedOkay to determine if actually errored - script.onreadystatechange = function() { - debug('onreadystatechange', script.readyState); - if (/loaded|closed/.test(script.readyState)) { - if (script && script.htmlFor && script.onclick) { - self.loadedOkay = true; - try { - // In IE, actually execute the script. - script.onclick(); - } catch (x) { - // intentionally empty - } - } - if (script) { - self._abort(new Error('JSONP script loaded abnormally (onreadystatechange)')); - } - } - }; - // IE: event/htmlFor/onclick trick. - // One can't rely on proper order for onreadystatechange. In order to - // make sure, set a 'htmlFor' and 'event' properties, so that - // script code will be installed as 'onclick' handler for the - // script object. Later, onreadystatechange, manually execute this - // code. FF and Chrome doesn't work with 'event' and 'htmlFor' - // set. For reference see: - // http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html - // Also, read on that about script ordering: - // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order - if (typeof script.async === 'undefined' && global.document.attachEvent) { - // According to mozilla docs, in recent browsers script.async defaults - // to 'true', so we may use it to detect a good browser: - // https://developer.mozilla.org/en/HTML/Element/script - if (!browser.isOpera()) { - // Naively assume we're in IE - try { - script.htmlFor = script.id; - script.event = 'onclick'; - } catch (x) { - // intentionally empty - } - script.async = true; - } else { - // Opera, second sync script hack - script2 = this.script2 = global.document.createElement('script'); - script2.text = "try{var a = document.getElementById('" + script.id + "'); if(a)a.onerror();}catch(x){};"; - script.async = script2.async = false; - } - } - if (typeof script.async !== 'undefined') { - script.async = true; - } - - var head = global.document.getElementsByTagName('head')[0]; - head.insertBefore(script, head.firstChild); - if (script2) { - head.insertBefore(script2, head.firstChild); - } -}; - -module.exports = JsonpReceiver; - -}).call(this)}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"../../utils/browser":44,"../../utils/iframe":47,"../../utils/random":50,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],32:[function(require,module,exports){ -(function (process){(function (){ -'use strict'; - -var inherits = require('inherits') - , EventEmitter = require('events').EventEmitter - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:receiver:xhr'); -} - -function XhrReceiver(url, AjaxObject) { - debug(url); - EventEmitter.call(this); - var self = this; - - this.bufferPosition = 0; - - this.xo = new AjaxObject('POST', url, null); - this.xo.on('chunk', this._chunkHandler.bind(this)); - this.xo.once('finish', function(status, text) { - debug('finish', status, text); - self._chunkHandler(status, text); - self.xo = null; - var reason = status === 200 ? 'network' : 'permanent'; - debug('close', reason); - self.emit('close', null, reason); - self._cleanup(); - }); -} - -inherits(XhrReceiver, EventEmitter); - -XhrReceiver.prototype._chunkHandler = function(status, text) { - debug('_chunkHandler', status); - if (status !== 200 || !text) { - return; - } - - for (var idx = -1; ; this.bufferPosition += idx + 1) { - var buf = text.slice(this.bufferPosition); - idx = buf.indexOf('\n'); - if (idx === -1) { - break; - } - var msg = buf.slice(0, idx); - if (msg) { - debug('message', msg); - this.emit('message', msg); - } - } -}; - -XhrReceiver.prototype._cleanup = function() { - debug('_cleanup'); - this.removeAllListeners(); -}; - -XhrReceiver.prototype.abort = function() { - debug('abort'); - if (this.xo) { - this.xo.close(); - debug('close'); - this.emit('close', null, 'user'); - this.xo = null; - } - this._cleanup(); -}; - -module.exports = XhrReceiver; - -}).call(this)}).call(this,{ env: {} }) - -},{"debug":55,"events":3,"inherits":57}],33:[function(require,module,exports){ -(function (process,global){(function (){ -'use strict'; - -var random = require('../../utils/random') - , urlUtils = require('../../utils/url') - ; - -var debug = function() {}; -if (process.env.NODE_ENV !== 'production') { - debug = require('debug')('sockjs-client:sender:jsonp'); -} - -var form, area; - -function createIframe(id) { - debug('createIframe', id); - try { - // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) - return global.document.createElement('