/** * socket.io * Copyright(c) 2011 LearnBoost * MIT Licensed */ (function (exports, io, global) { /** * Expose constructor. */ exports.websocket = WS; /** * The WebSocket transport uses the HTML5 WebSocket API to establish an * persistent connection with the Socket.IO server. This transport will also * be inherited by the FlashSocket fallback as it provides a API compatible * polyfill for the WebSockets. * * @constructor * @extends {io.Transport} * @api public */ function WS (socket) { io.Transport.apply(this, arguments); }; /** * Inherits from Transport. */ io.util.inherit(WS, io.Transport); /** * Transport name * * @api public */ WS.prototype.name = 'websocket'; /** * Initializes a new `WebSocket` connection with the Socket.IO server. We attach * all the appropriate listeners to handle the responses from the server. * * @returns {Transport} * @api public */ WS.prototype.open = function () { var query = io.util.query(this.socket.options.query) , self = this , Socket // if node Socket = require('ws'); // end node if (!Socket) { Socket = global.MozWebSocket || global.WebSocket; } this.websocket = new Socket(this.prepareUrl() + query); this.websocket.onopen = function () { self.onOpen(); self.socket.setBuffer(false); }; this.websocket.onmessage = function (ev) { self.onData(ev.data); }; this.websocket.onclose = function () { self.onClose(); self.socket.setBuffer(true); }; this.websocket.onerror = function (e) { self.onError(e); }; return this; }; /** * Send a message to the Socket.IO server. The message will automatically be * encoded in the correct message format. * * @returns {Transport} * @api public */ // Do to a bug in the current IDevices browser, we need to wrap the send in a // setTimeout, when they resume from sleeping the browser will crash if // we don't allow the browser time to detect the socket has been closed if (io.util.ua.iDevice) { WS.prototype.send = function (data) { var self = this; setTimeout(function() { self.websocket.send(data); },0); return this; }; } else { WS.prototype.send = function (data) { this.websocket.send(data); return this; }; } /** * Payload * * @api private */ WS.prototype.payload = function (arr) { for (var i = 0, l = arr.length; i < l; i++) { this.packet(arr[i]); } return this; }; /** * Disconnect the established `WebSocket` connection. * * @returns {Transport} * @api public */ WS.prototype.close = function () { this.websocket.close(); return this; }; /** * Handle the errors that `WebSocket` might be giving when we * are attempting to connect or send messages. * * @param {Error} e The error. * @api private */ WS.prototype.onError = function (e) { this.socket.onError(e); }; /** * Returns the appropriate scheme for the URI generation. * * @api private */ WS.prototype.scheme = function () { return this.socket.options.secure ? 'wss' : 'ws'; }; /** * Checks if the browser has support for native `WebSockets` and that * it's not the polyfill created for the FlashSocket transport. * * @return {Boolean} * @api public */ WS.check = function () { // if node return true; // end node return ('WebSocket' in global && !('__addTask' in WebSocket)) || 'MozWebSocket' in global; }; /** * Check if the `WebSocket` transport support cross domain communications. * * @returns {Boolean} * @api public */ WS.xdomainCheck = function () { return true; }; /** * Add the transport to your public io.transports array. * * @api private */ io.transports.push('websocket'); })( 'undefined' != typeof io ? io.Transport : module.exports , 'undefined' != typeof io ? io : module.parent.exports , this );