/** * socket.io * Copyright(c) 2011 LearnBoost * MIT Licensed */ (function (exports, io) { /** * Expose constructor. */ exports.flashsocket = Flashsocket; /** * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket * specification. It uses a .swf file to communicate with the server. If you want * to serve the .swf file from a other server than where the Socket.IO script is * coming from you need to use the insecure version of the .swf. More information * about this can be found on the github page. * * @constructor * @extends {io.Transport.websocket} * @api public */ function Flashsocket () { io.Transport.websocket.apply(this, arguments); }; /** * Inherits from Transport. */ io.util.inherit(Flashsocket, io.Transport.websocket); /** * Transport name * * @api public */ Flashsocket.prototype.name = 'flashsocket'; /** * Disconnect the established `FlashSocket` connection. This is done by adding a * new task to the FlashSocket. The rest will be handled off by the `WebSocket` * transport. * * @returns {Transport} * @api public */ Flashsocket.prototype.open = function () { var self = this , args = arguments; WebSocket.__addTask(function () { io.Transport.websocket.prototype.open.apply(self, args); }); return this; }; /** * Sends a message to the Socket.IO server. This is done by adding a new * task to the FlashSocket. The rest will be handled off by the `WebSocket` * transport. * * @returns {Transport} * @api public */ Flashsocket.prototype.send = function () { var self = this, args = arguments; WebSocket.__addTask(function () { io.Transport.websocket.prototype.send.apply(self, args); }); return this; }; /** * Disconnects the established `FlashSocket` connection. * * @returns {Transport} * @api public */ Flashsocket.prototype.close = function () { WebSocket.__tasks.length = 0; io.Transport.websocket.prototype.close.call(this); return this; }; /** * The WebSocket fall back needs to append the flash container to the body * element, so we need to make sure we have access to it. Or defer the call * until we are sure there is a body element. * * @param {Socket} socket The socket instance that needs a transport * @param {Function} fn The callback * @api private */ Flashsocket.prototype.ready = function (socket, fn) { function init () { var options = socket.options , port = options['flash policy port'] , path = [ 'http' + (options.secure ? 's' : '') + ':/' , options.host + ':' + options.port , options.resource , 'static/flashsocket' , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' ]; // Only start downloading the swf file when the checked that this browser // actually supports it if (!Flashsocket.loaded) { if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { // Set the correct file based on the XDomain settings WEB_SOCKET_SWF_LOCATION = path.join('/'); } if (port !== 843) { WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); } WebSocket.__initialize(); Flashsocket.loaded = true; } fn.call(self); } var self = this; if (document.body) return init(); io.util.load(init); }; /** * Check if the FlashSocket transport is supported as it requires that the Adobe * Flash Player plug-in version `10.0.0` or greater is installed. And also check if * the polyfill is correctly loaded. * * @returns {Boolean} * @api public */ Flashsocket.check = function () { if ( typeof WebSocket == 'undefined' || !('__initialize' in WebSocket) || !swfobject ) return false; return swfobject.getFlashPlayerVersion().major >= 10; }; /** * Check if the FlashSocket transport can be used as cross domain / cross origin * transport. Because we can't see which type (secure or insecure) of .swf is used * we will just return true. * * @returns {Boolean} * @api public */ Flashsocket.xdomainCheck = function () { return true; }; /** * Disable AUTO_INITIALIZATION */ if (typeof window != 'undefined') { WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; } /** * Add the transport to your public io.transports array. * * @api private */ io.transports.push('flashsocket'); })( 'undefined' != typeof io ? io.Transport : module.exports , 'undefined' != typeof io ? io : module.parent.exports );