| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- /**
- * socket.io
- * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
- * 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 () {
- if (this.websocket) 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
- );
|