mirror of
https://github.com/viq/NewsBlur.git
synced 2025-08-05 16:49:45 +00:00
191 lines
4.7 KiB
JavaScript
191 lines
4.7 KiB
JavaScript
|
|
/**
|
|
* socket.io
|
|
* Copyright(c) 2011 LearnBoost <dev@learnboost.com>
|
|
* 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
|
|
);
|