socket.io-rails 1.0.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ae004a0e89d45dcf2aab359f03c9371f722ac8ea
4
- data.tar.gz: 9caad930a2db41dbd687fdebf23d58758dee98b8
3
+ metadata.gz: acd50b944e9b106826449319a56e8abb42babc3b
4
+ data.tar.gz: 26707ba9d3f949a928d364cb149e1a6346132e59
5
5
  SHA512:
6
- metadata.gz: 7589d32f8ad710d3cd080054f396ea949a7d08e09055c95218e48e700881261ea7a15b75498295fe9fab7935c061c26de84c4c06583c44f9be31eb1b5d3753de
7
- data.tar.gz: 78d7ffb75cb350a3b398e258ede2a457aef1d669a285e9fd5cb63351945f8dad964e1ec6d261a23ec550019f597809027967dc46e93cb8c185154b5237805956
6
+ metadata.gz: 86a259d2f72aab4a4f0b885edb4f55f5dc958e72610b67bd8371ea8f972ae23137b3b59a450464474b49dab34fd816072d36b9a2a421e8d9d75a7b39d67bf2d7
7
+ data.tar.gz: fb502bf4aeb5475bafa3e8ded80caf736c77a1a2731227a8150ffc162e728f6b376cd0951361f79bed58ba308aaf075f1367576c9c09f5772a1406914121907e
@@ -1,5 +1,5 @@
1
1
  module Socketio
2
2
  module Rails
3
- VERSION = "1.0.6"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
@@ -1,18 +1,17 @@
1
- !function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.io=e():"undefined"!=typeof global?global.io=e():"undefined"!=typeof self&&(self.io=e())}(function(){var define,module,exports;
2
- return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
1
+ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.io=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
3
2
 
4
- module.exports = require('./lib/');
3
+ module.exports = _dereq_('./lib/');
5
4
 
6
- },{"./lib/":2}],2:[function(require,module,exports){
5
+ },{"./lib/":2}],2:[function(_dereq_,module,exports){
7
6
 
8
7
  /**
9
8
  * Module dependencies.
10
9
  */
11
10
 
12
- var url = require('./url');
13
- var parser = require('socket.io-parser');
14
- var Manager = require('./manager');
15
- var debug = require('debug')('socket.io-client');
11
+ var url = _dereq_('./url');
12
+ var parser = _dereq_('socket.io-parser');
13
+ var Manager = _dereq_('./manager');
14
+ var debug = _dereq_('debug')('socket.io-client');
16
15
 
17
16
  /**
18
17
  * Module exports.
@@ -89,24 +88,25 @@ exports.connect = lookup;
89
88
  * @api public
90
89
  */
91
90
 
92
- exports.Manager = require('./manager');
93
- exports.Socket = require('./socket');
91
+ exports.Manager = _dereq_('./manager');
92
+ exports.Socket = _dereq_('./socket');
94
93
 
95
- },{"./manager":3,"./socket":5,"./url":6,"debug":9,"socket.io-parser":40}],3:[function(require,module,exports){
94
+ },{"./manager":3,"./socket":5,"./url":6,"debug":9,"socket.io-parser":40}],3:[function(_dereq_,module,exports){
96
95
 
97
96
  /**
98
97
  * Module dependencies.
99
98
  */
100
99
 
101
- var url = require('./url');
102
- var eio = require('engine.io-client');
103
- var Socket = require('./socket');
104
- var Emitter = require('component-emitter');
105
- var parser = require('socket.io-parser');
106
- var on = require('./on');
107
- var bind = require('component-bind');
108
- var object = require('object-component');
109
- var debug = require('debug')('socket.io-client:manager');
100
+ var url = _dereq_('./url');
101
+ var eio = _dereq_('engine.io-client');
102
+ var Socket = _dereq_('./socket');
103
+ var Emitter = _dereq_('component-emitter');
104
+ var parser = _dereq_('socket.io-parser');
105
+ var on = _dereq_('./on');
106
+ var bind = _dereq_('component-bind');
107
+ var object = _dereq_('object-component');
108
+ var debug = _dereq_('debug')('socket.io-client:manager');
109
+ var indexOf = _dereq_('indexof');
110
110
 
111
111
  /**
112
112
  * Module exports
@@ -141,13 +141,14 @@ function Manager(uri, opts){
141
141
  this.timeout(null == opts.timeout ? 20000 : opts.timeout);
142
142
  this.readyState = 'closed';
143
143
  this.uri = uri;
144
- this.connected = 0;
144
+ this.connected = [];
145
145
  this.attempts = 0;
146
146
  this.encoding = false;
147
147
  this.packetBuffer = [];
148
148
  this.encoder = new parser.Encoder();
149
149
  this.decoder = new parser.Decoder();
150
- this.open();
150
+ this.autoConnect = opts.autoConnect !== false;
151
+ if (this.autoConnect) this.open();
151
152
  }
152
153
 
153
154
  /**
@@ -246,7 +247,8 @@ Manager.prototype.timeout = function(v){
246
247
  */
247
248
 
248
249
  Manager.prototype.maybeReconnectOnOpen = function() {
249
- if (!this.openReconnect && !this.reconnecting && this._reconnection) {
250
+ // Only try to reconnect if it's the first time we're connecting
251
+ if (!this.openReconnect && !this.reconnecting && this._reconnection && this.attempts === 0) {
250
252
  // keeps reconnection from firing twice for the same reconnection loop
251
253
  this.openReconnect = true;
252
254
  this.reconnect();
@@ -272,6 +274,7 @@ Manager.prototype.connect = function(fn){
272
274
  var socket = this.engine;
273
275
  var self = this;
274
276
  this.readyState = 'opening';
277
+ this.skipReconnect = false;
275
278
 
276
279
  // emit `open`
277
280
  var openSub = on(socket, 'open', function() {
@@ -390,7 +393,9 @@ Manager.prototype.socket = function(nsp){
390
393
  this.nsps[nsp] = socket;
391
394
  var self = this;
392
395
  socket.on('connect', function(){
393
- self.connected++;
396
+ if (!~indexOf(self.connected, socket)) {
397
+ self.connected.push(socket);
398
+ }
394
399
  });
395
400
  }
396
401
  return socket;
@@ -403,7 +408,11 @@ Manager.prototype.socket = function(nsp){
403
408
  */
404
409
 
405
410
  Manager.prototype.destroy = function(socket){
406
- --this.connected || this.close();
411
+ var index = indexOf(this.connected, socket);
412
+ if (~index) this.connected.splice(index, 1);
413
+ if (this.connected.length) return;
414
+
415
+ this.close();
407
416
  };
408
417
 
409
418
  /**
@@ -471,7 +480,8 @@ Manager.prototype.cleanup = function(){
471
480
  Manager.prototype.close =
472
481
  Manager.prototype.disconnect = function(){
473
482
  this.skipReconnect = true;
474
- this.engine.close();
483
+ this.readyState = 'closed';
484
+ this.engine && this.engine.close();
475
485
  };
476
486
 
477
487
  /**
@@ -497,7 +507,7 @@ Manager.prototype.onclose = function(reason){
497
507
  */
498
508
 
499
509
  Manager.prototype.reconnect = function(){
500
- if (this.reconnecting) return this;
510
+ if (this.reconnecting || this.skipReconnect) return this;
501
511
 
502
512
  var self = this;
503
513
  this.attempts++;
@@ -513,9 +523,15 @@ Manager.prototype.reconnect = function(){
513
523
 
514
524
  this.reconnecting = true;
515
525
  var timer = setTimeout(function(){
526
+ if (self.skipReconnect) return;
527
+
516
528
  debug('attempting reconnect');
517
529
  self.emitAll('reconnect_attempt', self.attempts);
518
530
  self.emitAll('reconnecting', self.attempts);
531
+
532
+ // check again for the case socket closed in above events
533
+ if (self.skipReconnect) return;
534
+
519
535
  self.open(function(err){
520
536
  if (err) {
521
537
  debug('reconnect attempt error');
@@ -550,7 +566,7 @@ Manager.prototype.onreconnect = function(){
550
566
  this.emitAll('reconnect', attempt);
551
567
  };
552
568
 
553
- },{"./on":4,"./socket":5,"./url":6,"component-bind":7,"component-emitter":8,"debug":9,"engine.io-client":11,"object-component":37,"socket.io-parser":40}],4:[function(require,module,exports){
569
+ },{"./on":4,"./socket":5,"./url":6,"component-bind":7,"component-emitter":8,"debug":9,"engine.io-client":10,"indexof":36,"object-component":37,"socket.io-parser":40}],4:[function(_dereq_,module,exports){
554
570
 
555
571
  /**
556
572
  * Module exports.
@@ -576,20 +592,19 @@ function on(obj, ev, fn) {
576
592
  };
577
593
  }
578
594
 
579
- },{}],5:[function(require,module,exports){
595
+ },{}],5:[function(_dereq_,module,exports){
580
596
 
581
597
  /**
582
598
  * Module dependencies.
583
599
  */
584
600
 
585
- var parser = require('socket.io-parser');
586
- var Emitter = require('component-emitter');
587
- var toArray = require('to-array');
588
- var on = require('./on');
589
- var bind = require('component-bind');
590
- var debug = require('debug')('socket.io-client:socket');
591
- var hasBin = require('has-binary-data');
592
- var indexOf = require('indexof');
601
+ var parser = _dereq_('socket.io-parser');
602
+ var Emitter = _dereq_('component-emitter');
603
+ var toArray = _dereq_('to-array');
604
+ var on = _dereq_('./on');
605
+ var bind = _dereq_('component-bind');
606
+ var debug = _dereq_('debug')('socket.io-client:socket');
607
+ var hasBin = _dereq_('has-binary');
593
608
 
594
609
  /**
595
610
  * Module exports.
@@ -635,12 +650,11 @@ function Socket(io, nsp){
635
650
  this.json = this; // compat
636
651
  this.ids = 0;
637
652
  this.acks = {};
638
- this.open();
653
+ if (this.io.autoConnect) this.open();
639
654
  this.receiveBuffer = [];
640
655
  this.sendBuffer = [];
641
656
  this.connected = false;
642
657
  this.disconnected = true;
643
- this.subEvents();
644
658
  }
645
659
 
646
660
  /**
@@ -656,6 +670,8 @@ Emitter(Socket.prototype);
656
670
  */
657
671
 
658
672
  Socket.prototype.subEvents = function() {
673
+ if (this.subs) return;
674
+
659
675
  var io = this.io;
660
676
  this.subs = [
661
677
  on(io, 'open', bind(this, 'onopen')),
@@ -665,15 +681,16 @@ Socket.prototype.subEvents = function() {
665
681
  };
666
682
 
667
683
  /**
668
- * Called upon engine `open`.
684
+ * "Opens" the socket.
669
685
  *
670
- * @api private
686
+ * @api public
671
687
  */
672
688
 
673
689
  Socket.prototype.open =
674
690
  Socket.prototype.connect = function(){
675
691
  if (this.connected) return this;
676
692
 
693
+ this.subEvents();
677
694
  this.io.open(); // ensure open
678
695
  if ('open' == this.io.readyState) this.onopen();
679
696
  return this;
@@ -742,7 +759,7 @@ Socket.prototype.packet = function(packet){
742
759
  };
743
760
 
744
761
  /**
745
- * "Opens" the socket.
762
+ * Called upon engine `open`.
746
763
  *
747
764
  * @api private
748
765
  */
@@ -926,9 +943,12 @@ Socket.prototype.ondisconnect = function(){
926
943
  */
927
944
 
928
945
  Socket.prototype.destroy = function(){
929
- // clean subscriptions to avoid reconnections
930
- for (var i = 0; i < this.subs.length; i++) {
931
- this.subs[i].destroy();
946
+ if (this.subs) {
947
+ // clean subscriptions to avoid reconnections
948
+ for (var i = 0; i < this.subs.length; i++) {
949
+ this.subs[i].destroy();
950
+ }
951
+ this.subs = null;
932
952
  }
933
953
 
934
954
  this.io.destroy(this);
@@ -943,27 +963,30 @@ Socket.prototype.destroy = function(){
943
963
 
944
964
  Socket.prototype.close =
945
965
  Socket.prototype.disconnect = function(){
946
- if (!this.connected) return this;
947
-
948
- debug('performing disconnect (%s)', this.nsp);
949
- this.packet({ type: parser.DISCONNECT });
966
+ if (this.connected) {
967
+ debug('performing disconnect (%s)', this.nsp);
968
+ this.packet({ type: parser.DISCONNECT });
969
+ }
950
970
 
951
971
  // remove socket from pool
952
972
  this.destroy();
953
973
 
954
- // fire events
955
- this.onclose('io client disconnect');
974
+ if (this.connected) {
975
+ // fire events
976
+ this.onclose('io client disconnect');
977
+ }
956
978
  return this;
957
979
  };
958
980
 
959
- },{"./on":4,"component-bind":7,"component-emitter":8,"debug":9,"has-binary-data":32,"indexof":36,"socket.io-parser":40,"to-array":43}],6:[function(require,module,exports){
960
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
981
+ },{"./on":4,"component-bind":7,"component-emitter":8,"debug":9,"has-binary":32,"socket.io-parser":40,"to-array":44}],6:[function(_dereq_,module,exports){
982
+ (function (global){
983
+
961
984
  /**
962
985
  * Module dependencies.
963
986
  */
964
987
 
965
- var parseuri = require('parseuri');
966
- var debug = require('debug')('socket.io-client:url');
988
+ var parseuri = _dereq_('parseuri');
989
+ var debug = _dereq_('debug')('socket.io-client:url');
967
990
 
968
991
  /**
969
992
  * Module exports.
@@ -990,7 +1013,9 @@ function url(uri, loc){
990
1013
  // relative path support
991
1014
  if ('string' == typeof uri) {
992
1015
  if ('/' == uri.charAt(0)) {
993
- if ('undefined' != typeof loc) {
1016
+ if ('/' == uri.charAt(1)) {
1017
+ uri = loc.protocol + uri;
1018
+ } else {
994
1019
  uri = loc.hostname + uri;
995
1020
  }
996
1021
  }
@@ -1029,7 +1054,8 @@ function url(uri, loc){
1029
1054
  return obj;
1030
1055
  }
1031
1056
 
1032
- },{"debug":9,"parseuri":38}],7:[function(require,module,exports){
1057
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1058
+ },{"debug":9,"parseuri":38}],7:[function(_dereq_,module,exports){
1033
1059
  /**
1034
1060
  * Slice reference.
1035
1061
  */
@@ -1054,7 +1080,7 @@ module.exports = function(obj, fn){
1054
1080
  }
1055
1081
  };
1056
1082
 
1057
- },{}],8:[function(require,module,exports){
1083
+ },{}],8:[function(_dereq_,module,exports){
1058
1084
 
1059
1085
  /**
1060
1086
  * Expose `Emitter`.
@@ -1220,7 +1246,7 @@ Emitter.prototype.hasListeners = function(event){
1220
1246
  return !! this.listeners(event).length;
1221
1247
  };
1222
1248
 
1223
- },{}],9:[function(require,module,exports){
1249
+ },{}],9:[function(_dereq_,module,exports){
1224
1250
 
1225
1251
  /**
1226
1252
  * Expose `debug()` as the module.
@@ -1359,177 +1385,13 @@ try {
1359
1385
  if (window.localStorage) debug.enable(localStorage.debug);
1360
1386
  } catch(e){}
1361
1387
 
1362
- },{}],10:[function(require,module,exports){
1363
-
1364
- /**
1365
- * Module dependencies.
1366
- */
1367
-
1368
- var index = require('indexof');
1369
-
1370
- /**
1371
- * Expose `Emitter`.
1372
- */
1373
-
1374
- module.exports = Emitter;
1375
-
1376
- /**
1377
- * Initialize a new `Emitter`.
1378
- *
1379
- * @api public
1380
- */
1381
-
1382
- function Emitter(obj) {
1383
- if (obj) return mixin(obj);
1384
- };
1385
-
1386
- /**
1387
- * Mixin the emitter properties.
1388
- *
1389
- * @param {Object} obj
1390
- * @return {Object}
1391
- * @api private
1392
- */
1393
-
1394
- function mixin(obj) {
1395
- for (var key in Emitter.prototype) {
1396
- obj[key] = Emitter.prototype[key];
1397
- }
1398
- return obj;
1399
- }
1400
-
1401
- /**
1402
- * Listen on the given `event` with `fn`.
1403
- *
1404
- * @param {String} event
1405
- * @param {Function} fn
1406
- * @return {Emitter}
1407
- * @api public
1408
- */
1409
-
1410
- Emitter.prototype.on = function(event, fn){
1411
- this._callbacks = this._callbacks || {};
1412
- (this._callbacks[event] = this._callbacks[event] || [])
1413
- .push(fn);
1414
- return this;
1415
- };
1416
-
1417
- /**
1418
- * Adds an `event` listener that will be invoked a single
1419
- * time then automatically removed.
1420
- *
1421
- * @param {String} event
1422
- * @param {Function} fn
1423
- * @return {Emitter}
1424
- * @api public
1425
- */
1388
+ },{}],10:[function(_dereq_,module,exports){
1426
1389
 
1427
- Emitter.prototype.once = function(event, fn){
1428
- var self = this;
1429
- this._callbacks = this._callbacks || {};
1390
+ module.exports = _dereq_('./lib/');
1430
1391
 
1431
- function on() {
1432
- self.off(event, on);
1433
- fn.apply(this, arguments);
1434
- }
1392
+ },{"./lib/":11}],11:[function(_dereq_,module,exports){
1435
1393
 
1436
- fn._off = on;
1437
- this.on(event, on);
1438
- return this;
1439
- };
1440
-
1441
- /**
1442
- * Remove the given callback for `event` or all
1443
- * registered callbacks.
1444
- *
1445
- * @param {String} event
1446
- * @param {Function} fn
1447
- * @return {Emitter}
1448
- * @api public
1449
- */
1450
-
1451
- Emitter.prototype.off =
1452
- Emitter.prototype.removeListener =
1453
- Emitter.prototype.removeAllListeners = function(event, fn){
1454
- this._callbacks = this._callbacks || {};
1455
-
1456
- // all
1457
- if (0 == arguments.length) {
1458
- this._callbacks = {};
1459
- return this;
1460
- }
1461
-
1462
- // specific event
1463
- var callbacks = this._callbacks[event];
1464
- if (!callbacks) return this;
1465
-
1466
- // remove all handlers
1467
- if (1 == arguments.length) {
1468
- delete this._callbacks[event];
1469
- return this;
1470
- }
1471
-
1472
- // remove specific handler
1473
- var i = index(callbacks, fn._off || fn);
1474
- if (~i) callbacks.splice(i, 1);
1475
- return this;
1476
- };
1477
-
1478
- /**
1479
- * Emit `event` with the given args.
1480
- *
1481
- * @param {String} event
1482
- * @param {Mixed} ...
1483
- * @return {Emitter}
1484
- */
1485
-
1486
- Emitter.prototype.emit = function(event){
1487
- this._callbacks = this._callbacks || {};
1488
- var args = [].slice.call(arguments, 1)
1489
- , callbacks = this._callbacks[event];
1490
-
1491
- if (callbacks) {
1492
- callbacks = callbacks.slice(0);
1493
- for (var i = 0, len = callbacks.length; i < len; ++i) {
1494
- callbacks[i].apply(this, args);
1495
- }
1496
- }
1497
-
1498
- return this;
1499
- };
1500
-
1501
- /**
1502
- * Return array of callbacks for `event`.
1503
- *
1504
- * @param {String} event
1505
- * @return {Array}
1506
- * @api public
1507
- */
1508
-
1509
- Emitter.prototype.listeners = function(event){
1510
- this._callbacks = this._callbacks || {};
1511
- return this._callbacks[event] || [];
1512
- };
1513
-
1514
- /**
1515
- * Check if this emitter has `event` handlers.
1516
- *
1517
- * @param {String} event
1518
- * @return {Boolean}
1519
- * @api public
1520
- */
1521
-
1522
- Emitter.prototype.hasListeners = function(event){
1523
- return !! this.listeners(event).length;
1524
- };
1525
-
1526
- },{"indexof":36}],11:[function(require,module,exports){
1527
-
1528
- module.exports = require('./lib/');
1529
-
1530
- },{"./lib/":12}],12:[function(require,module,exports){
1531
-
1532
- module.exports = require('./socket');
1394
+ module.exports = _dereq_('./socket');
1533
1395
 
1534
1396
  /**
1535
1397
  * Exports parser
@@ -1537,21 +1399,22 @@ module.exports = require('./socket');
1537
1399
  * @api public
1538
1400
  *
1539
1401
  */
1540
- module.exports.parser = require('engine.io-parser');
1402
+ module.exports.parser = _dereq_('engine.io-parser');
1541
1403
 
1542
- },{"./socket":13,"engine.io-parser":22}],13:[function(require,module,exports){
1543
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/**
1404
+ },{"./socket":12,"engine.io-parser":21}],12:[function(_dereq_,module,exports){
1405
+ (function (global){
1406
+ /**
1544
1407
  * Module dependencies.
1545
1408
  */
1546
1409
 
1547
- var transports = require('./transports');
1548
- var Emitter = require('component-emitter');
1549
- var debug = require('debug')('engine.io-client:socket');
1550
- var index = require('indexof');
1551
- var parser = require('engine.io-parser');
1552
- var parseuri = require('parseuri');
1553
- var parsejson = require('parsejson');
1554
- var parseqs = require('parseqs');
1410
+ var transports = _dereq_('./transports');
1411
+ var Emitter = _dereq_('component-emitter');
1412
+ var debug = _dereq_('debug')('engine.io-client:socket');
1413
+ var index = _dereq_('indexof');
1414
+ var parser = _dereq_('engine.io-parser');
1415
+ var parseuri = _dereq_('parseuri');
1416
+ var parsejson = _dereq_('parsejson');
1417
+ var parseqs = _dereq_('parseqs');
1555
1418
 
1556
1419
  /**
1557
1420
  * Module exports.
@@ -1613,7 +1476,9 @@ function Socket(uri, opts){
1613
1476
  this.upgrade = false !== opts.upgrade;
1614
1477
  this.path = (opts.path || '/engine.io').replace(/\/$/, '') + '/';
1615
1478
  this.forceJSONP = !!opts.forceJSONP;
1479
+ this.jsonp = false !== opts.jsonp;
1616
1480
  this.forceBase64 = !!opts.forceBase64;
1481
+ this.enablesXDR = !!opts.enablesXDR;
1617
1482
  this.timestampParam = opts.timestampParam || 't';
1618
1483
  this.timestampRequests = opts.timestampRequests;
1619
1484
  this.transports = opts.transports || ['polling', 'websocket'];
@@ -1649,9 +1514,9 @@ Socket.protocol = parser.protocol; // this is an int
1649
1514
  */
1650
1515
 
1651
1516
  Socket.Socket = Socket;
1652
- Socket.Transport = require('./transport');
1653
- Socket.transports = require('./transports');
1654
- Socket.parser = require('engine.io-parser');
1517
+ Socket.Transport = _dereq_('./transport');
1518
+ Socket.transports = _dereq_('./transports');
1519
+ Socket.parser = _dereq_('engine.io-parser');
1655
1520
 
1656
1521
  /**
1657
1522
  * Creates transport of the given type.
@@ -1682,7 +1547,9 @@ Socket.prototype.createTransport = function (name) {
1682
1547
  path: this.path,
1683
1548
  query: query,
1684
1549
  forceJSONP: this.forceJSONP,
1550
+ jsonp: this.jsonp,
1685
1551
  forceBase64: this.forceBase64,
1552
+ enablesXDR: this.enablesXDR,
1686
1553
  timestampRequests: this.timestampRequests,
1687
1554
  timestampParam: this.timestampParam,
1688
1555
  policyPort: this.policyPort,
@@ -1711,11 +1578,28 @@ Socket.prototype.open = function () {
1711
1578
  var transport;
1712
1579
  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') != -1) {
1713
1580
  transport = 'websocket';
1581
+ } else if (0 == this.transports.length) {
1582
+ // Emit error on next tick so it can be listened to
1583
+ var self = this;
1584
+ setTimeout(function() {
1585
+ self.emit('error', 'No transports available');
1586
+ }, 0);
1587
+ return;
1714
1588
  } else {
1715
1589
  transport = this.transports[0];
1716
1590
  }
1717
1591
  this.readyState = 'opening';
1718
- var transport = this.createTransport(transport);
1592
+
1593
+ // Retry with the next transport if the transport is disabled (jsonp: false)
1594
+ var transport;
1595
+ try {
1596
+ transport = this.createTransport(transport);
1597
+ } catch (e) {
1598
+ this.transports.shift();
1599
+ this.open();
1600
+ return;
1601
+ }
1602
+
1719
1603
  transport.open();
1720
1604
  this.setTransport(transport);
1721
1605
  };
@@ -1784,14 +1668,13 @@ Socket.prototype.probe = function (name) {
1784
1668
  debug('probe transport "%s" pong', name);
1785
1669
  self.upgrading = true;
1786
1670
  self.emit('upgrading', transport);
1671
+ if (!transport) return;
1787
1672
  Socket.priorWebsocketSuccess = 'websocket' == transport.name;
1788
1673
 
1789
1674
  debug('pausing current transport "%s"', self.transport.name);
1790
1675
  self.transport.pause(function () {
1791
1676
  if (failed) return;
1792
- if ('closed' == self.readyState || 'closing' == self.readyState) {
1793
- return;
1794
- }
1677
+ if ('closed' == self.readyState) return;
1795
1678
  debug('changing transport and sending upgrade packet');
1796
1679
 
1797
1680
  cleanup();
@@ -2073,6 +1956,10 @@ Socket.prototype.send = function (msg, fn) {
2073
1956
  */
2074
1957
 
2075
1958
  Socket.prototype.sendPacket = function (type, data, fn) {
1959
+ if ('closing' == this.readyState || 'closed' == this.readyState) {
1960
+ return;
1961
+ }
1962
+
2076
1963
  var packet = { type: type, data: data };
2077
1964
  this.emit('packetCreate', packet);
2078
1965
  this.writeBuffer.push(packet);
@@ -2088,9 +1975,41 @@ Socket.prototype.sendPacket = function (type, data, fn) {
2088
1975
 
2089
1976
  Socket.prototype.close = function () {
2090
1977
  if ('opening' == this.readyState || 'open' == this.readyState) {
2091
- this.onClose('forced close');
2092
- debug('socket closing - telling transport to close');
2093
- this.transport.close();
1978
+ this.readyState = 'closing';
1979
+
1980
+ var self = this;
1981
+
1982
+ function close() {
1983
+ self.onClose('forced close');
1984
+ debug('socket closing - telling transport to close');
1985
+ self.transport.close();
1986
+ }
1987
+
1988
+ function cleanupAndClose() {
1989
+ self.removeListener('upgrade', cleanupAndClose);
1990
+ self.removeListener('upgradeError', cleanupAndClose);
1991
+ close();
1992
+ }
1993
+
1994
+ function waitForUpgrade() {
1995
+ // wait for upgrade to finish since we can't send packets while pausing a transport
1996
+ self.once('upgrade', cleanupAndClose);
1997
+ self.once('upgradeError', cleanupAndClose);
1998
+ }
1999
+
2000
+ if (this.writeBuffer.length) {
2001
+ this.once('drain', function() {
2002
+ if (this.upgrading) {
2003
+ waitForUpgrade();
2004
+ } else {
2005
+ close();
2006
+ }
2007
+ });
2008
+ } else if (this.upgrading) {
2009
+ waitForUpgrade();
2010
+ } else {
2011
+ close();
2012
+ }
2094
2013
  }
2095
2014
 
2096
2015
  return this;
@@ -2116,7 +2035,7 @@ Socket.prototype.onError = function (err) {
2116
2035
  */
2117
2036
 
2118
2037
  Socket.prototype.onClose = function (reason, desc) {
2119
- if ('opening' == this.readyState || 'open' == this.readyState) {
2038
+ if ('opening' == this.readyState || 'open' == this.readyState || 'closing' == this.readyState) {
2120
2039
  debug('socket close with reason: "%s"', reason);
2121
2040
  var self = this;
2122
2041
 
@@ -2168,13 +2087,14 @@ Socket.prototype.filterUpgrades = function (upgrades) {
2168
2087
  return filteredUpgrades;
2169
2088
  };
2170
2089
 
2171
- },{"./transport":14,"./transports":15,"component-emitter":8,"debug":9,"engine.io-parser":22,"indexof":36,"parsejson":29,"parseqs":30,"parseuri":38}],14:[function(require,module,exports){
2090
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2091
+ },{"./transport":13,"./transports":14,"component-emitter":8,"debug":9,"engine.io-parser":21,"indexof":36,"parsejson":28,"parseqs":29,"parseuri":30}],13:[function(_dereq_,module,exports){
2172
2092
  /**
2173
2093
  * Module dependencies.
2174
2094
  */
2175
2095
 
2176
- var parser = require('engine.io-parser');
2177
- var Emitter = require('component-emitter');
2096
+ var parser = _dereq_('engine.io-parser');
2097
+ var Emitter = _dereq_('component-emitter');
2178
2098
 
2179
2099
  /**
2180
2100
  * Module exports.
@@ -2200,6 +2120,7 @@ function Transport (opts) {
2200
2120
  this.readyState = '';
2201
2121
  this.agent = opts.agent || false;
2202
2122
  this.socket = opts.socket;
2123
+ this.enablesXDR = opts.enablesXDR;
2203
2124
  }
2204
2125
 
2205
2126
  /**
@@ -2296,13 +2217,8 @@ Transport.prototype.onOpen = function () {
2296
2217
  */
2297
2218
 
2298
2219
  Transport.prototype.onData = function(data){
2299
- try {
2300
- var packet = parser.decodePacket(data, this.socket.binaryType);
2301
- this.onPacket(packet);
2302
- } catch(e){
2303
- e.data = data;
2304
- this.onError('parser decode error', e);
2305
- }
2220
+ var packet = parser.decodePacket(data, this.socket.binaryType);
2221
+ this.onPacket(packet);
2306
2222
  };
2307
2223
 
2308
2224
  /**
@@ -2324,15 +2240,16 @@ Transport.prototype.onClose = function () {
2324
2240
  this.emit('close');
2325
2241
  };
2326
2242
 
2327
- },{"component-emitter":8,"engine.io-parser":22}],15:[function(require,module,exports){
2328
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/**
2243
+ },{"component-emitter":8,"engine.io-parser":21}],14:[function(_dereq_,module,exports){
2244
+ (function (global){
2245
+ /**
2329
2246
  * Module dependencies
2330
2247
  */
2331
2248
 
2332
- var XMLHttpRequest = require('xmlhttprequest');
2333
- var XHR = require('./polling-xhr');
2334
- var JSONP = require('./polling-jsonp');
2335
- var websocket = require('./websocket');
2249
+ var XMLHttpRequest = _dereq_('xmlhttprequest');
2250
+ var XHR = _dereq_('./polling-xhr');
2251
+ var JSONP = _dereq_('./polling-jsonp');
2252
+ var websocket = _dereq_('./websocket');
2336
2253
 
2337
2254
  /**
2338
2255
  * Export transports.
@@ -2351,6 +2268,8 @@ exports.websocket = websocket;
2351
2268
  function polling(opts){
2352
2269
  var xhr;
2353
2270
  var xd = false;
2271
+ var xs = false;
2272
+ var jsonp = false !== opts.jsonp;
2354
2273
 
2355
2274
  if (global.location) {
2356
2275
  var isSSL = 'https:' == location.protocol;
@@ -2362,26 +2281,31 @@ function polling(opts){
2362
2281
  }
2363
2282
 
2364
2283
  xd = opts.hostname != location.hostname || port != opts.port;
2284
+ xs = opts.secure != isSSL;
2365
2285
  }
2366
2286
 
2367
2287
  opts.xdomain = xd;
2288
+ opts.xscheme = xs;
2368
2289
  xhr = new XMLHttpRequest(opts);
2369
2290
 
2370
2291
  if ('open' in xhr && !opts.forceJSONP) {
2371
2292
  return new XHR(opts);
2372
2293
  } else {
2294
+ if (!jsonp) throw new Error('JSONP disabled');
2373
2295
  return new JSONP(opts);
2374
2296
  }
2375
2297
  }
2376
2298
 
2377
- },{"./polling-jsonp":16,"./polling-xhr":17,"./websocket":19,"xmlhttprequest":20}],16:[function(require,module,exports){
2378
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
2299
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2300
+ },{"./polling-jsonp":15,"./polling-xhr":16,"./websocket":18,"xmlhttprequest":19}],15:[function(_dereq_,module,exports){
2301
+ (function (global){
2302
+
2379
2303
  /**
2380
2304
  * Module requirements.
2381
2305
  */
2382
2306
 
2383
- var Polling = require('./polling');
2384
- var inherit = require('component-inherit');
2307
+ var Polling = _dereq_('./polling');
2308
+ var inherit = _dereq_('component-inherit');
2385
2309
 
2386
2310
  /**
2387
2311
  * Module exports.
@@ -2481,6 +2405,7 @@ JSONPPolling.prototype.doClose = function () {
2481
2405
  if (this.form) {
2482
2406
  this.form.parentNode.removeChild(this.form);
2483
2407
  this.form = null;
2408
+ this.iframe = null;
2484
2409
  }
2485
2410
 
2486
2411
  Polling.prototype.doClose.call(this);
@@ -2512,7 +2437,7 @@ JSONPPolling.prototype.doPoll = function () {
2512
2437
  this.script = script;
2513
2438
 
2514
2439
  var isUAgecko = 'undefined' != typeof navigator && /gecko/i.test(navigator.userAgent);
2515
-
2440
+
2516
2441
  if (isUAgecko) {
2517
2442
  setTimeout(function () {
2518
2443
  var iframe = document.createElement('iframe');
@@ -2608,16 +2533,18 @@ JSONPPolling.prototype.doWrite = function (data, fn) {
2608
2533
  }
2609
2534
  };
2610
2535
 
2611
- },{"./polling":18,"component-inherit":21}],17:[function(require,module,exports){
2612
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/**
2536
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2537
+ },{"./polling":17,"component-inherit":20}],16:[function(_dereq_,module,exports){
2538
+ (function (global){
2539
+ /**
2613
2540
  * Module requirements.
2614
2541
  */
2615
2542
 
2616
- var XMLHttpRequest = require('xmlhttprequest');
2617
- var Polling = require('./polling');
2618
- var Emitter = require('component-emitter');
2619
- var inherit = require('component-inherit');
2620
- var debug = require('debug')('engine.io-client:polling-xhr');
2543
+ var XMLHttpRequest = _dereq_('xmlhttprequest');
2544
+ var Polling = _dereq_('./polling');
2545
+ var Emitter = _dereq_('component-emitter');
2546
+ var inherit = _dereq_('component-inherit');
2547
+ var debug = _dereq_('debug')('engine.io-client:polling-xhr');
2621
2548
 
2622
2549
  /**
2623
2550
  * Module exports.
@@ -2653,6 +2580,7 @@ function XHR(opts){
2653
2580
 
2654
2581
  this.xd = opts.hostname != global.location.hostname ||
2655
2582
  port != opts.port;
2583
+ this.xs = opts.secure != isSSL;
2656
2584
  }
2657
2585
  }
2658
2586
 
@@ -2679,8 +2607,10 @@ XHR.prototype.request = function(opts){
2679
2607
  opts = opts || {};
2680
2608
  opts.uri = this.uri();
2681
2609
  opts.xd = this.xd;
2610
+ opts.xs = this.xs;
2682
2611
  opts.agent = this.agent || false;
2683
2612
  opts.supportsBinary = this.supportsBinary;
2613
+ opts.enablesXDR = this.enablesXDR;
2684
2614
  return new Request(opts);
2685
2615
  };
2686
2616
 
@@ -2733,10 +2663,14 @@ function Request(opts){
2733
2663
  this.method = opts.method || 'GET';
2734
2664
  this.uri = opts.uri;
2735
2665
  this.xd = !!opts.xd;
2666
+ this.xs = !!opts.xs;
2736
2667
  this.async = false !== opts.async;
2737
2668
  this.data = undefined != opts.data ? opts.data : null;
2738
2669
  this.agent = opts.agent;
2739
- this.create(opts.isBinary, opts.supportsBinary);
2670
+ this.isBinary = opts.isBinary;
2671
+ this.supportsBinary = opts.supportsBinary;
2672
+ this.enablesXDR = opts.enablesXDR;
2673
+ this.create();
2740
2674
  }
2741
2675
 
2742
2676
  /**
@@ -2751,14 +2685,14 @@ Emitter(Request.prototype);
2751
2685
  * @api private
2752
2686
  */
2753
2687
 
2754
- Request.prototype.create = function(isBinary, supportsBinary){
2755
- var xhr = this.xhr = new XMLHttpRequest({ agent: this.agent, xdomain: this.xd });
2688
+ Request.prototype.create = function(){
2689
+ var xhr = this.xhr = new XMLHttpRequest({ agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR });
2756
2690
  var self = this;
2757
2691
 
2758
2692
  try {
2759
2693
  debug('xhr open %s: %s', this.method, this.uri);
2760
2694
  xhr.open(this.method, this.uri, this.async);
2761
- if (supportsBinary) {
2695
+ if (this.supportsBinary) {
2762
2696
  // This has to be done after open because Firefox is stupid
2763
2697
  // http://stackoverflow.com/questions/13216903/get-binary-data-with-xmlhttprequest-in-a-firefox-extension
2764
2698
  xhr.responseType = 'arraybuffer';
@@ -2766,7 +2700,7 @@ Request.prototype.create = function(isBinary, supportsBinary){
2766
2700
 
2767
2701
  if ('POST' == this.method) {
2768
2702
  try {
2769
- if (isBinary) {
2703
+ if (this.isBinary) {
2770
2704
  xhr.setRequestHeader('Content-type', 'application/octet-stream');
2771
2705
  } else {
2772
2706
  xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');
@@ -2779,22 +2713,18 @@ Request.prototype.create = function(isBinary, supportsBinary){
2779
2713
  xhr.withCredentials = true;
2780
2714
  }
2781
2715
 
2782
- xhr.onreadystatechange = function(){
2783
- var data;
2784
-
2785
- try {
2716
+ if (this.hasXDR()) {
2717
+ xhr.onload = function(){
2718
+ self.onLoad();
2719
+ };
2720
+ xhr.onerror = function(){
2721
+ self.onError(xhr.responseText);
2722
+ };
2723
+ } else {
2724
+ xhr.onreadystatechange = function(){
2786
2725
  if (4 != xhr.readyState) return;
2787
2726
  if (200 == xhr.status || 1223 == xhr.status) {
2788
- var contentType = xhr.getResponseHeader('Content-Type');
2789
- if (contentType === 'application/octet-stream') {
2790
- data = xhr.response;
2791
- } else {
2792
- if (!supportsBinary) {
2793
- data = xhr.responseText;
2794
- } else {
2795
- data = 'ok';
2796
- }
2797
- }
2727
+ self.onLoad();
2798
2728
  } else {
2799
2729
  // make sure the `error` event handler that's user-set
2800
2730
  // does not throw in the same tick and gets caught here
@@ -2802,14 +2732,8 @@ Request.prototype.create = function(isBinary, supportsBinary){
2802
2732
  self.onError(xhr.status);
2803
2733
  }, 0);
2804
2734
  }
2805
- } catch (e) {
2806
- self.onError(e);
2807
- }
2808
-
2809
- if (null != data) {
2810
- self.onData(data);
2811
- }
2812
- };
2735
+ };
2736
+ }
2813
2737
 
2814
2738
  debug('xhr data %s', this.data);
2815
2739
  xhr.send(this.data);
@@ -2873,7 +2797,11 @@ Request.prototype.cleanup = function(){
2873
2797
  return;
2874
2798
  }
2875
2799
  // xmlhttprequest
2876
- this.xhr.onreadystatechange = empty;
2800
+ if (this.hasXDR()) {
2801
+ this.xhr.onload = this.xhr.onerror = empty;
2802
+ } else {
2803
+ this.xhr.onreadystatechange = empty;
2804
+ }
2877
2805
 
2878
2806
  try {
2879
2807
  this.xhr.abort();
@@ -2886,6 +2814,46 @@ Request.prototype.cleanup = function(){
2886
2814
  this.xhr = null;
2887
2815
  };
2888
2816
 
2817
+ /**
2818
+ * Called upon load.
2819
+ *
2820
+ * @api private
2821
+ */
2822
+
2823
+ Request.prototype.onLoad = function(){
2824
+ var data;
2825
+ try {
2826
+ var contentType;
2827
+ try {
2828
+ contentType = this.xhr.getResponseHeader('Content-Type').split(';')[0];
2829
+ } catch (e) {}
2830
+ if (contentType === 'application/octet-stream') {
2831
+ data = this.xhr.response;
2832
+ } else {
2833
+ if (!this.supportsBinary) {
2834
+ data = this.xhr.responseText;
2835
+ } else {
2836
+ data = 'ok';
2837
+ }
2838
+ }
2839
+ } catch (e) {
2840
+ this.onError(e);
2841
+ }
2842
+ if (null != data) {
2843
+ this.onData(data);
2844
+ }
2845
+ };
2846
+
2847
+ /**
2848
+ * Check if it has XDomainRequest.
2849
+ *
2850
+ * @api private
2851
+ */
2852
+
2853
+ Request.prototype.hasXDR = function(){
2854
+ return 'undefined' !== typeof global.XDomainRequest && !this.xs && this.enablesXDR;
2855
+ };
2856
+
2889
2857
  /**
2890
2858
  * Aborts the request.
2891
2859
  *
@@ -2920,16 +2888,17 @@ function unloadHandler() {
2920
2888
  }
2921
2889
  }
2922
2890
 
2923
- },{"./polling":18,"component-emitter":8,"component-inherit":21,"debug":9,"xmlhttprequest":20}],18:[function(require,module,exports){
2891
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2892
+ },{"./polling":17,"component-emitter":8,"component-inherit":20,"debug":9,"xmlhttprequest":19}],17:[function(_dereq_,module,exports){
2924
2893
  /**
2925
2894
  * Module dependencies.
2926
2895
  */
2927
2896
 
2928
- var Transport = require('../transport');
2929
- var parseqs = require('parseqs');
2930
- var parser = require('engine.io-parser');
2931
- var inherit = require('component-inherit');
2932
- var debug = require('debug')('engine.io-client:polling');
2897
+ var Transport = _dereq_('../transport');
2898
+ var parseqs = _dereq_('parseqs');
2899
+ var parser = _dereq_('engine.io-parser');
2900
+ var inherit = _dereq_('component-inherit');
2901
+ var debug = _dereq_('debug')('engine.io-client:polling');
2933
2902
 
2934
2903
  /**
2935
2904
  * Module exports.
@@ -2942,8 +2911,8 @@ module.exports = Polling;
2942
2911
  */
2943
2912
 
2944
2913
  var hasXHR2 = (function() {
2945
- var XMLHttpRequest = require('xmlhttprequest');
2946
- var xhr = new XMLHttpRequest({ agent: this.agent, xdomain: false });
2914
+ var XMLHttpRequest = _dereq_('xmlhttprequest');
2915
+ var xhr = new XMLHttpRequest({ xdomain: false });
2947
2916
  return null != xhr.responseType;
2948
2917
  })();
2949
2918
 
@@ -3167,16 +3136,16 @@ Polling.prototype.uri = function(){
3167
3136
  return schema + '://' + this.hostname + port + this.path + query;
3168
3137
  };
3169
3138
 
3170
- },{"../transport":14,"component-inherit":21,"debug":9,"engine.io-parser":22,"parseqs":30,"xmlhttprequest":20}],19:[function(require,module,exports){
3139
+ },{"../transport":13,"component-inherit":20,"debug":9,"engine.io-parser":21,"parseqs":29,"xmlhttprequest":19}],18:[function(_dereq_,module,exports){
3171
3140
  /**
3172
3141
  * Module dependencies.
3173
3142
  */
3174
3143
 
3175
- var Transport = require('../transport');
3176
- var parser = require('engine.io-parser');
3177
- var parseqs = require('parseqs');
3178
- var inherit = require('component-inherit');
3179
- var debug = require('debug')('engine.io-client:websocket');
3144
+ var Transport = _dereq_('../transport');
3145
+ var parser = _dereq_('engine.io-parser');
3146
+ var parseqs = _dereq_('parseqs');
3147
+ var inherit = _dereq_('component-inherit');
3148
+ var debug = _dereq_('debug')('engine.io-client:websocket');
3180
3149
 
3181
3150
  /**
3182
3151
  * `ws` exposes a WebSocket-compatible interface in
@@ -3184,7 +3153,7 @@ var debug = require('debug')('engine.io-client:websocket');
3184
3153
  * in the browser.
3185
3154
  */
3186
3155
 
3187
- var WebSocket = require('ws');
3156
+ var WebSocket = _dereq_('ws');
3188
3157
 
3189
3158
  /**
3190
3159
  * Module exports.
@@ -3398,13 +3367,21 @@ WS.prototype.check = function(){
3398
3367
  return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name);
3399
3368
  };
3400
3369
 
3401
- },{"../transport":14,"component-inherit":21,"debug":9,"engine.io-parser":22,"parseqs":30,"ws":31}],20:[function(require,module,exports){
3370
+ },{"../transport":13,"component-inherit":20,"debug":9,"engine.io-parser":21,"parseqs":29,"ws":31}],19:[function(_dereq_,module,exports){
3402
3371
  // browser shim for xmlhttprequest module
3403
- var hasCORS = require('has-cors');
3372
+ var hasCORS = _dereq_('has-cors');
3404
3373
 
3405
3374
  module.exports = function(opts) {
3406
3375
  var xdomain = opts.xdomain;
3407
3376
 
3377
+ // scheme must be same when usign XDomainRequest
3378
+ // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
3379
+ var xscheme = opts.xscheme;
3380
+
3381
+ // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.
3382
+ // https://github.com/Automattic/engine.io-client/pull/217
3383
+ var enablesXDR = opts.enablesXDR;
3384
+
3408
3385
  // XMLHttpRequest can be disabled on IE
3409
3386
  try {
3410
3387
  if ('undefined' != typeof XMLHttpRequest && (!xdomain || hasCORS)) {
@@ -3412,6 +3389,15 @@ module.exports = function(opts) {
3412
3389
  }
3413
3390
  } catch (e) { }
3414
3391
 
3392
+ // Use XDomainRequest for IE8 if enablesXDR is true
3393
+ // because loading bar keeps flashing when using jsonp-polling
3394
+ // https://github.com/yujiosaka/socke.io-ie8-loading-example
3395
+ try {
3396
+ if ('undefined' != typeof XDomainRequest && !xscheme && enablesXDR) {
3397
+ return new XDomainRequest();
3398
+ }
3399
+ } catch (e) { }
3400
+
3415
3401
  if (!xdomain) {
3416
3402
  try {
3417
3403
  return new ActiveXObject('Microsoft.XMLHTTP');
@@ -3419,7 +3405,7 @@ module.exports = function(opts) {
3419
3405
  }
3420
3406
  }
3421
3407
 
3422
- },{"has-cors":34}],21:[function(require,module,exports){
3408
+ },{"has-cors":34}],20:[function(_dereq_,module,exports){
3423
3409
 
3424
3410
  module.exports = function(a, b){
3425
3411
  var fn = function(){};
@@ -3427,16 +3413,17 @@ module.exports = function(a, b){
3427
3413
  a.prototype = new fn;
3428
3414
  a.prototype.constructor = a;
3429
3415
  };
3430
- },{}],22:[function(require,module,exports){
3431
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/**
3416
+ },{}],21:[function(_dereq_,module,exports){
3417
+ (function (global){
3418
+ /**
3432
3419
  * Module dependencies.
3433
3420
  */
3434
3421
 
3435
- var keys = require('./keys');
3436
- var sliceBuffer = require('arraybuffer.slice');
3437
- var base64encoder = require('base64-arraybuffer');
3438
- var after = require('after');
3439
- var utf8 = require('utf8');
3422
+ var keys = _dereq_('./keys');
3423
+ var sliceBuffer = _dereq_('arraybuffer.slice');
3424
+ var base64encoder = _dereq_('base64-arraybuffer');
3425
+ var after = _dereq_('after');
3426
+ var utf8 = _dereq_('utf8');
3440
3427
 
3441
3428
  /**
3442
3429
  * Check if we are running an android browser. That requires us to use
@@ -3451,7 +3438,7 @@ var isAndroid = navigator.userAgent.match(/Android/i);
3451
3438
  * Current protocol version.
3452
3439
  */
3453
3440
 
3454
- exports.protocol = 2;
3441
+ exports.protocol = 3;
3455
3442
 
3456
3443
  /**
3457
3444
  * Packet types.
@@ -3479,7 +3466,7 @@ var err = { type: 'error', data: 'parser error' };
3479
3466
  * Create a blob api even for blob builder when vendor prefixes exist
3480
3467
  */
3481
3468
 
3482
- var Blob = require('blob');
3469
+ var Blob = _dereq_('blob');
3483
3470
 
3484
3471
  /**
3485
3472
  * Encodes a packet.
@@ -3497,12 +3484,17 @@ var Blob = require('blob');
3497
3484
  * @api private
3498
3485
  */
3499
3486
 
3500
- exports.encodePacket = function (packet, supportsBinary, callback) {
3501
- if (typeof supportsBinary == 'function') {
3487
+ exports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {
3488
+ if ('function' == typeof supportsBinary) {
3502
3489
  callback = supportsBinary;
3503
3490
  supportsBinary = false;
3504
3491
  }
3505
3492
 
3493
+ if ('function' == typeof utf8encode) {
3494
+ callback = utf8encode;
3495
+ utf8encode = null;
3496
+ }
3497
+
3506
3498
  var data = (packet.data === undefined)
3507
3499
  ? undefined
3508
3500
  : packet.data.buffer || packet.data;
@@ -3518,7 +3510,7 @@ exports.encodePacket = function (packet, supportsBinary, callback) {
3518
3510
 
3519
3511
  // data fragment is optional
3520
3512
  if (undefined !== packet.data) {
3521
- encoded += utf8.encode(String(packet.data));
3513
+ encoded += utf8encode ? utf8.encode(String(packet.data)) : String(packet.data);
3522
3514
  }
3523
3515
 
3524
3516
  return callback('' + encoded);
@@ -3554,7 +3546,7 @@ function encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {
3554
3546
  var fr = new FileReader();
3555
3547
  fr.onload = function() {
3556
3548
  packet.data = fr.result;
3557
- exports.encodePacket(packet, supportsBinary, callback);
3549
+ exports.encodePacket(packet, supportsBinary, true, callback);
3558
3550
  };
3559
3551
  return fr.readAsArrayBuffer(packet.data);
3560
3552
  }
@@ -3616,14 +3608,20 @@ exports.encodeBase64Packet = function(packet, callback) {
3616
3608
  * @api private
3617
3609
  */
3618
3610
 
3619
- exports.decodePacket = function (data, binaryType) {
3611
+ exports.decodePacket = function (data, binaryType, utf8decode) {
3620
3612
  // String data
3621
3613
  if (typeof data == 'string' || data === undefined) {
3622
3614
  if (data.charAt(0) == 'b') {
3623
3615
  return exports.decodeBase64Packet(data.substr(1), binaryType);
3624
3616
  }
3625
3617
 
3626
- data = utf8.decode(data);
3618
+ if (utf8decode) {
3619
+ try {
3620
+ data = utf8.decode(data);
3621
+ } catch (e) {
3622
+ return err;
3623
+ }
3624
+ }
3627
3625
  var type = data.charAt(0);
3628
3626
 
3629
3627
  if (Number(type) != type || !packetslist[type]) {
@@ -3707,7 +3705,7 @@ exports.encodePayload = function (packets, supportsBinary, callback) {
3707
3705
  }
3708
3706
 
3709
3707
  function encodeOne(packet, doneCallback) {
3710
- exports.encodePacket(packet, supportsBinary, function(message) {
3708
+ exports.encodePacket(packet, supportsBinary, true, function(message) {
3711
3709
  doneCallback(null, setLengthHeader(message));
3712
3710
  });
3713
3711
  }
@@ -3783,7 +3781,7 @@ exports.decodePayload = function (data, binaryType, callback) {
3783
3781
  }
3784
3782
 
3785
3783
  if (msg.length) {
3786
- packet = exports.decodePacket(msg, binaryType);
3784
+ packet = exports.decodePacket(msg, binaryType, true);
3787
3785
 
3788
3786
  if (err.type == packet.type && err.data == packet.data) {
3789
3787
  // parser error in individual packet - ignoring payload
@@ -3827,7 +3825,7 @@ exports.encodePayloadAsArrayBuffer = function(packets, callback) {
3827
3825
  }
3828
3826
 
3829
3827
  function encodeOne(packet, doneCallback) {
3830
- exports.encodePacket(packet, true, function(data) {
3828
+ exports.encodePacket(packet, true, true, function(data) {
3831
3829
  return doneCallback(null, data);
3832
3830
  });
3833
3831
  }
@@ -3885,7 +3883,7 @@ exports.encodePayloadAsArrayBuffer = function(packets, callback) {
3885
3883
 
3886
3884
  exports.encodePayloadAsBlob = function(packets, callback) {
3887
3885
  function encodeOne(packet, doneCallback) {
3888
- exports.encodePacket(packet, true, function(encoded) {
3886
+ exports.encodePacket(packet, true, true, function(encoded) {
3889
3887
  var binaryIdentifier = new Uint8Array(1);
3890
3888
  binaryIdentifier[0] = 1;
3891
3889
  if (typeof encoded === 'string') {
@@ -3938,14 +3936,25 @@ exports.decodePayloadAsBinary = function (data, binaryType, callback) {
3938
3936
  var bufferTail = data;
3939
3937
  var buffers = [];
3940
3938
 
3939
+ var numberTooLong = false;
3941
3940
  while (bufferTail.byteLength > 0) {
3942
3941
  var tailArray = new Uint8Array(bufferTail);
3943
3942
  var isString = tailArray[0] === 0;
3944
3943
  var msgLength = '';
3944
+
3945
3945
  for (var i = 1; ; i++) {
3946
3946
  if (tailArray[i] == 255) break;
3947
+
3948
+ if (msgLength.length > 310) {
3949
+ numberTooLong = true;
3950
+ break;
3951
+ }
3952
+
3947
3953
  msgLength += tailArray[i];
3948
3954
  }
3955
+
3956
+ if(numberTooLong) return callback(err, 0, 1);
3957
+
3949
3958
  bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);
3950
3959
  msgLength = parseInt(msgLength);
3951
3960
 
@@ -3962,17 +3971,19 @@ exports.decodePayloadAsBinary = function (data, binaryType, callback) {
3962
3971
  }
3963
3972
  }
3964
3973
  }
3974
+
3965
3975
  buffers.push(msg);
3966
3976
  bufferTail = sliceBuffer(bufferTail, msgLength);
3967
3977
  }
3968
3978
 
3969
3979
  var total = buffers.length;
3970
3980
  buffers.forEach(function(buffer, i) {
3971
- callback(exports.decodePacket(buffer, binaryType), i, total);
3981
+ callback(exports.decodePacket(buffer, binaryType, true), i, total);
3972
3982
  });
3973
3983
  };
3974
3984
 
3975
- },{"./keys":23,"after":24,"arraybuffer.slice":25,"base64-arraybuffer":26,"blob":27,"utf8":28}],23:[function(require,module,exports){
3985
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
3986
+ },{"./keys":22,"after":23,"arraybuffer.slice":24,"base64-arraybuffer":25,"blob":26,"utf8":27}],22:[function(_dereq_,module,exports){
3976
3987
 
3977
3988
  /**
3978
3989
  * Gets the keys for an object.
@@ -3993,7 +4004,7 @@ module.exports = Object.keys || function keys (obj){
3993
4004
  return arr;
3994
4005
  };
3995
4006
 
3996
- },{}],24:[function(require,module,exports){
4007
+ },{}],23:[function(_dereq_,module,exports){
3997
4008
  module.exports = after
3998
4009
 
3999
4010
  function after(count, callback, err_cb) {
@@ -4023,7 +4034,7 @@ function after(count, callback, err_cb) {
4023
4034
 
4024
4035
  function noop() {}
4025
4036
 
4026
- },{}],25:[function(require,module,exports){
4037
+ },{}],24:[function(_dereq_,module,exports){
4027
4038
  /**
4028
4039
  * An abstraction for slicing an arraybuffer even when
4029
4040
  * ArrayBuffer.prototype.slice is not supported
@@ -4054,7 +4065,7 @@ module.exports = function(arraybuffer, start, end) {
4054
4065
  return result.buffer;
4055
4066
  };
4056
4067
 
4057
- },{}],26:[function(require,module,exports){
4068
+ },{}],25:[function(_dereq_,module,exports){
4058
4069
  /*
4059
4070
  * base64-arraybuffer
4060
4071
  * https://github.com/niklasvh/base64-arraybuffer
@@ -4115,8 +4126,9 @@ module.exports = function(arraybuffer, start, end) {
4115
4126
  };
4116
4127
  })("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
4117
4128
 
4118
- },{}],27:[function(require,module,exports){
4119
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/**
4129
+ },{}],26:[function(_dereq_,module,exports){
4130
+ (function (global){
4131
+ /**
4120
4132
  * Create a blob builder even when vendor prefixes exist
4121
4133
  */
4122
4134
 
@@ -4166,249 +4178,253 @@ module.exports = (function() {
4166
4178
  }
4167
4179
  })();
4168
4180
 
4169
- },{}],28:[function(require,module,exports){
4170
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/*! http://mths.be/utf8js v2.0.0 by @mathias */
4181
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
4182
+ },{}],27:[function(_dereq_,module,exports){
4183
+ (function (global){
4184
+ /*! http://mths.be/utf8js v2.0.0 by @mathias */
4171
4185
  ;(function(root) {
4172
4186
 
4173
- // Detect free variables `exports`
4174
- var freeExports = typeof exports == 'object' && exports;
4175
-
4176
- // Detect free variable `module`
4177
- var freeModule = typeof module == 'object' && module &&
4178
- module.exports == freeExports && module;
4179
-
4180
- // Detect free variable `global`, from Node.js or Browserified code,
4181
- // and use it as `root`
4182
- var freeGlobal = typeof global == 'object' && global;
4183
- if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
4184
- root = freeGlobal;
4185
- }
4186
-
4187
- /*--------------------------------------------------------------------------*/
4188
-
4189
- var stringFromCharCode = String.fromCharCode;
4190
-
4191
- // Taken from http://mths.be/punycode
4192
- function ucs2decode(string) {
4193
- var output = [];
4194
- var counter = 0;
4195
- var length = string.length;
4196
- var value;
4197
- var extra;
4198
- while (counter < length) {
4199
- value = string.charCodeAt(counter++);
4200
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
4201
- // high surrogate, and there is a next character
4202
- extra = string.charCodeAt(counter++);
4203
- if ((extra & 0xFC00) == 0xDC00) { // low surrogate
4204
- output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
4205
- } else {
4206
- // unmatched surrogate; only append this code unit, in case the next
4207
- // code unit is the high surrogate of a surrogate pair
4208
- output.push(value);
4209
- counter--;
4210
- }
4211
- } else {
4212
- output.push(value);
4213
- }
4214
- }
4215
- return output;
4216
- }
4217
-
4218
- // Taken from http://mths.be/punycode
4219
- function ucs2encode(array) {
4220
- var length = array.length;
4221
- var index = -1;
4222
- var value;
4223
- var output = '';
4224
- while (++index < length) {
4225
- value = array[index];
4226
- if (value > 0xFFFF) {
4227
- value -= 0x10000;
4228
- output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
4229
- value = 0xDC00 | value & 0x3FF;
4230
- }
4231
- output += stringFromCharCode(value);
4232
- }
4233
- return output;
4234
- }
4235
-
4236
- /*--------------------------------------------------------------------------*/
4237
-
4238
- function createByte(codePoint, shift) {
4239
- return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
4240
- }
4241
-
4242
- function encodeCodePoint(codePoint) {
4243
- if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
4244
- return stringFromCharCode(codePoint);
4245
- }
4246
- var symbol = '';
4247
- if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
4248
- symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
4249
- }
4250
- else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
4251
- symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
4252
- symbol += createByte(codePoint, 6);
4253
- }
4254
- else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
4255
- symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
4256
- symbol += createByte(codePoint, 12);
4257
- symbol += createByte(codePoint, 6);
4258
- }
4259
- symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
4260
- return symbol;
4261
- }
4262
-
4263
- function utf8encode(string) {
4264
- var codePoints = ucs2decode(string);
4265
-
4266
- // console.log(JSON.stringify(codePoints.map(function(x) {
4267
- // return 'U+' + x.toString(16).toUpperCase();
4268
- // })));
4269
-
4270
- var length = codePoints.length;
4271
- var index = -1;
4272
- var codePoint;
4273
- var byteString = '';
4274
- while (++index < length) {
4275
- codePoint = codePoints[index];
4276
- byteString += encodeCodePoint(codePoint);
4277
- }
4278
- return byteString;
4279
- }
4280
-
4281
- /*--------------------------------------------------------------------------*/
4282
-
4283
- function readContinuationByte() {
4284
- if (byteIndex >= byteCount) {
4285
- throw Error('Invalid byte index');
4286
- }
4287
-
4288
- var continuationByte = byteArray[byteIndex] & 0xFF;
4289
- byteIndex++;
4290
-
4291
- if ((continuationByte & 0xC0) == 0x80) {
4292
- return continuationByte & 0x3F;
4293
- }
4294
-
4295
- // If we end up here, it’s not a continuation byte
4296
- throw Error('Invalid continuation byte');
4297
- }
4298
-
4299
- function decodeSymbol() {
4300
- var byte1;
4301
- var byte2;
4302
- var byte3;
4303
- var byte4;
4304
- var codePoint;
4305
-
4306
- if (byteIndex > byteCount) {
4307
- throw Error('Invalid byte index');
4308
- }
4309
-
4310
- if (byteIndex == byteCount) {
4311
- return false;
4312
- }
4313
-
4314
- // Read first byte
4315
- byte1 = byteArray[byteIndex] & 0xFF;
4316
- byteIndex++;
4317
-
4318
- // 1-byte sequence (no continuation bytes)
4319
- if ((byte1 & 0x80) == 0) {
4320
- return byte1;
4321
- }
4322
-
4323
- // 2-byte sequence
4324
- if ((byte1 & 0xE0) == 0xC0) {
4325
- var byte2 = readContinuationByte();
4326
- codePoint = ((byte1 & 0x1F) << 6) | byte2;
4327
- if (codePoint >= 0x80) {
4328
- return codePoint;
4329
- } else {
4330
- throw Error('Invalid continuation byte');
4331
- }
4332
- }
4333
-
4334
- // 3-byte sequence (may include unpaired surrogates)
4335
- if ((byte1 & 0xF0) == 0xE0) {
4336
- byte2 = readContinuationByte();
4337
- byte3 = readContinuationByte();
4338
- codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
4339
- if (codePoint >= 0x0800) {
4340
- return codePoint;
4341
- } else {
4342
- throw Error('Invalid continuation byte');
4343
- }
4344
- }
4345
-
4346
- // 4-byte sequence
4347
- if ((byte1 & 0xF8) == 0xF0) {
4348
- byte2 = readContinuationByte();
4349
- byte3 = readContinuationByte();
4350
- byte4 = readContinuationByte();
4351
- codePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) |
4352
- (byte3 << 0x06) | byte4;
4353
- if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
4354
- return codePoint;
4355
- }
4356
- }
4357
-
4358
- throw Error('Invalid UTF-8 detected');
4359
- }
4360
-
4361
- var byteArray;
4362
- var byteCount;
4363
- var byteIndex;
4364
- function utf8decode(byteString) {
4365
- byteArray = ucs2decode(byteString);
4366
- byteCount = byteArray.length;
4367
- byteIndex = 0;
4368
- var codePoints = [];
4369
- var tmp;
4370
- while ((tmp = decodeSymbol()) !== false) {
4371
- codePoints.push(tmp);
4372
- }
4373
- return ucs2encode(codePoints);
4374
- }
4375
-
4376
- /*--------------------------------------------------------------------------*/
4377
-
4378
- var utf8 = {
4379
- 'version': '2.0.0',
4380
- 'encode': utf8encode,
4381
- 'decode': utf8decode
4382
- };
4383
-
4384
- // Some AMD build optimizers, like r.js, check for specific condition patterns
4385
- // like the following:
4386
- if (
4387
- typeof define == 'function' &&
4388
- typeof define.amd == 'object' &&
4389
- define.amd
4390
- ) {
4391
- define(function() {
4392
- return utf8;
4393
- });
4394
- } else if (freeExports && !freeExports.nodeType) {
4395
- if (freeModule) { // in Node.js or RingoJS v0.8.0+
4396
- freeModule.exports = utf8;
4397
- } else { // in Narwhal or RingoJS v0.7.0-
4398
- var object = {};
4399
- var hasOwnProperty = object.hasOwnProperty;
4400
- for (var key in utf8) {
4401
- hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
4402
- }
4403
- }
4404
- } else { // in Rhino or a web browser
4405
- root.utf8 = utf8;
4406
- }
4187
+ // Detect free variables `exports`
4188
+ var freeExports = typeof exports == 'object' && exports;
4189
+
4190
+ // Detect free variable `module`
4191
+ var freeModule = typeof module == 'object' && module &&
4192
+ module.exports == freeExports && module;
4193
+
4194
+ // Detect free variable `global`, from Node.js or Browserified code,
4195
+ // and use it as `root`
4196
+ var freeGlobal = typeof global == 'object' && global;
4197
+ if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
4198
+ root = freeGlobal;
4199
+ }
4200
+
4201
+ /*--------------------------------------------------------------------------*/
4202
+
4203
+ var stringFromCharCode = String.fromCharCode;
4204
+
4205
+ // Taken from http://mths.be/punycode
4206
+ function ucs2decode(string) {
4207
+ var output = [];
4208
+ var counter = 0;
4209
+ var length = string.length;
4210
+ var value;
4211
+ var extra;
4212
+ while (counter < length) {
4213
+ value = string.charCodeAt(counter++);
4214
+ if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
4215
+ // high surrogate, and there is a next character
4216
+ extra = string.charCodeAt(counter++);
4217
+ if ((extra & 0xFC00) == 0xDC00) { // low surrogate
4218
+ output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
4219
+ } else {
4220
+ // unmatched surrogate; only append this code unit, in case the next
4221
+ // code unit is the high surrogate of a surrogate pair
4222
+ output.push(value);
4223
+ counter--;
4224
+ }
4225
+ } else {
4226
+ output.push(value);
4227
+ }
4228
+ }
4229
+ return output;
4230
+ }
4231
+
4232
+ // Taken from http://mths.be/punycode
4233
+ function ucs2encode(array) {
4234
+ var length = array.length;
4235
+ var index = -1;
4236
+ var value;
4237
+ var output = '';
4238
+ while (++index < length) {
4239
+ value = array[index];
4240
+ if (value > 0xFFFF) {
4241
+ value -= 0x10000;
4242
+ output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
4243
+ value = 0xDC00 | value & 0x3FF;
4244
+ }
4245
+ output += stringFromCharCode(value);
4246
+ }
4247
+ return output;
4248
+ }
4249
+
4250
+ /*--------------------------------------------------------------------------*/
4251
+
4252
+ function createByte(codePoint, shift) {
4253
+ return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
4254
+ }
4255
+
4256
+ function encodeCodePoint(codePoint) {
4257
+ if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
4258
+ return stringFromCharCode(codePoint);
4259
+ }
4260
+ var symbol = '';
4261
+ if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
4262
+ symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
4263
+ }
4264
+ else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
4265
+ symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
4266
+ symbol += createByte(codePoint, 6);
4267
+ }
4268
+ else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
4269
+ symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
4270
+ symbol += createByte(codePoint, 12);
4271
+ symbol += createByte(codePoint, 6);
4272
+ }
4273
+ symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
4274
+ return symbol;
4275
+ }
4276
+
4277
+ function utf8encode(string) {
4278
+ var codePoints = ucs2decode(string);
4279
+
4280
+ // console.log(JSON.stringify(codePoints.map(function(x) {
4281
+ // return 'U+' + x.toString(16).toUpperCase();
4282
+ // })));
4283
+
4284
+ var length = codePoints.length;
4285
+ var index = -1;
4286
+ var codePoint;
4287
+ var byteString = '';
4288
+ while (++index < length) {
4289
+ codePoint = codePoints[index];
4290
+ byteString += encodeCodePoint(codePoint);
4291
+ }
4292
+ return byteString;
4293
+ }
4294
+
4295
+ /*--------------------------------------------------------------------------*/
4296
+
4297
+ function readContinuationByte() {
4298
+ if (byteIndex >= byteCount) {
4299
+ throw Error('Invalid byte index');
4300
+ }
4301
+
4302
+ var continuationByte = byteArray[byteIndex] & 0xFF;
4303
+ byteIndex++;
4304
+
4305
+ if ((continuationByte & 0xC0) == 0x80) {
4306
+ return continuationByte & 0x3F;
4307
+ }
4308
+
4309
+ // If we end up here, it’s not a continuation byte
4310
+ throw Error('Invalid continuation byte');
4311
+ }
4312
+
4313
+ function decodeSymbol() {
4314
+ var byte1;
4315
+ var byte2;
4316
+ var byte3;
4317
+ var byte4;
4318
+ var codePoint;
4319
+
4320
+ if (byteIndex > byteCount) {
4321
+ throw Error('Invalid byte index');
4322
+ }
4323
+
4324
+ if (byteIndex == byteCount) {
4325
+ return false;
4326
+ }
4327
+
4328
+ // Read first byte
4329
+ byte1 = byteArray[byteIndex] & 0xFF;
4330
+ byteIndex++;
4331
+
4332
+ // 1-byte sequence (no continuation bytes)
4333
+ if ((byte1 & 0x80) == 0) {
4334
+ return byte1;
4335
+ }
4336
+
4337
+ // 2-byte sequence
4338
+ if ((byte1 & 0xE0) == 0xC0) {
4339
+ var byte2 = readContinuationByte();
4340
+ codePoint = ((byte1 & 0x1F) << 6) | byte2;
4341
+ if (codePoint >= 0x80) {
4342
+ return codePoint;
4343
+ } else {
4344
+ throw Error('Invalid continuation byte');
4345
+ }
4346
+ }
4347
+
4348
+ // 3-byte sequence (may include unpaired surrogates)
4349
+ if ((byte1 & 0xF0) == 0xE0) {
4350
+ byte2 = readContinuationByte();
4351
+ byte3 = readContinuationByte();
4352
+ codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
4353
+ if (codePoint >= 0x0800) {
4354
+ return codePoint;
4355
+ } else {
4356
+ throw Error('Invalid continuation byte');
4357
+ }
4358
+ }
4359
+
4360
+ // 4-byte sequence
4361
+ if ((byte1 & 0xF8) == 0xF0) {
4362
+ byte2 = readContinuationByte();
4363
+ byte3 = readContinuationByte();
4364
+ byte4 = readContinuationByte();
4365
+ codePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) |
4366
+ (byte3 << 0x06) | byte4;
4367
+ if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
4368
+ return codePoint;
4369
+ }
4370
+ }
4371
+
4372
+ throw Error('Invalid UTF-8 detected');
4373
+ }
4374
+
4375
+ var byteArray;
4376
+ var byteCount;
4377
+ var byteIndex;
4378
+ function utf8decode(byteString) {
4379
+ byteArray = ucs2decode(byteString);
4380
+ byteCount = byteArray.length;
4381
+ byteIndex = 0;
4382
+ var codePoints = [];
4383
+ var tmp;
4384
+ while ((tmp = decodeSymbol()) !== false) {
4385
+ codePoints.push(tmp);
4386
+ }
4387
+ return ucs2encode(codePoints);
4388
+ }
4389
+
4390
+ /*--------------------------------------------------------------------------*/
4391
+
4392
+ var utf8 = {
4393
+ 'version': '2.0.0',
4394
+ 'encode': utf8encode,
4395
+ 'decode': utf8decode
4396
+ };
4397
+
4398
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
4399
+ // like the following:
4400
+ if (
4401
+ typeof define == 'function' &&
4402
+ typeof define.amd == 'object' &&
4403
+ define.amd
4404
+ ) {
4405
+ define(function() {
4406
+ return utf8;
4407
+ });
4408
+ } else if (freeExports && !freeExports.nodeType) {
4409
+ if (freeModule) { // in Node.js or RingoJS v0.8.0+
4410
+ freeModule.exports = utf8;
4411
+ } else { // in Narwhal or RingoJS v0.7.0-
4412
+ var object = {};
4413
+ var hasOwnProperty = object.hasOwnProperty;
4414
+ for (var key in utf8) {
4415
+ hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
4416
+ }
4417
+ }
4418
+ } else { // in Rhino or a web browser
4419
+ root.utf8 = utf8;
4420
+ }
4407
4421
 
4408
4422
  }(this));
4409
4423
 
4410
- },{}],29:[function(require,module,exports){
4411
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/**
4424
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
4425
+ },{}],28:[function(_dereq_,module,exports){
4426
+ (function (global){
4427
+ /**
4412
4428
  * JSON parse.
4413
4429
  *
4414
4430
  * @see Based on jQuery#parseJSON (MIT) and JSON2
@@ -4440,7 +4456,8 @@ module.exports = function parsejson(data) {
4440
4456
  return (new Function('return ' + data))();
4441
4457
  }
4442
4458
  };
4443
- },{}],30:[function(require,module,exports){
4459
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
4460
+ },{}],29:[function(_dereq_,module,exports){
4444
4461
  /**
4445
4462
  * Compiles a querystring
4446
4463
  * Returns string representation of the object
@@ -4479,7 +4496,48 @@ exports.decode = function(qs){
4479
4496
  return qry;
4480
4497
  };
4481
4498
 
4482
- },{}],31:[function(require,module,exports){
4499
+ },{}],30:[function(_dereq_,module,exports){
4500
+ /**
4501
+ * Parses an URI
4502
+ *
4503
+ * @author Steven Levithan <stevenlevithan.com> (MIT license)
4504
+ * @api private
4505
+ */
4506
+
4507
+ var re = /^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;
4508
+
4509
+ var parts = [
4510
+ 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'
4511
+ ];
4512
+
4513
+ module.exports = function parseuri(str) {
4514
+ var src = str,
4515
+ b = str.indexOf('['),
4516
+ e = str.indexOf(']');
4517
+
4518
+ if (b != -1 && e != -1) {
4519
+ str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);
4520
+ }
4521
+
4522
+ var m = re.exec(str || ''),
4523
+ uri = {},
4524
+ i = 14;
4525
+
4526
+ while (i--) {
4527
+ uri[parts[i]] = m[i] || '';
4528
+ }
4529
+
4530
+ if (b != -1 && e != -1) {
4531
+ uri.source = src;
4532
+ uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');
4533
+ uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');
4534
+ uri.ipv6uri = true;
4535
+ }
4536
+
4537
+ return uri;
4538
+ };
4539
+
4540
+ },{}],31:[function(_dereq_,module,exports){
4483
4541
 
4484
4542
  /**
4485
4543
  * Module dependencies.
@@ -4524,12 +4582,14 @@ function ws(uri, protocols, opts) {
4524
4582
 
4525
4583
  if (WebSocket) ws.prototype = WebSocket.prototype;
4526
4584
 
4527
- },{}],32:[function(require,module,exports){
4528
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/*
4585
+ },{}],32:[function(_dereq_,module,exports){
4586
+ (function (global){
4587
+
4588
+ /*
4529
4589
  * Module requirements.
4530
4590
  */
4531
4591
 
4532
- var isArray = require('isarray');
4592
+ var isArray = _dereq_('isarray');
4533
4593
 
4534
4594
  /**
4535
4595
  * Module exports.
@@ -4548,10 +4608,10 @@ module.exports = hasBinary;
4548
4608
 
4549
4609
  function hasBinary(data) {
4550
4610
 
4551
- function recursiveCheckForBinary(obj) {
4611
+ function _hasBinary(obj) {
4552
4612
  if (!obj) return false;
4553
4613
 
4554
- if ( (global.Buffer && Buffer.isBuffer(obj)) ||
4614
+ if ( (global.Buffer && global.Buffer.isBuffer(obj)) ||
4555
4615
  (global.ArrayBuffer && obj instanceof ArrayBuffer) ||
4556
4616
  (global.Blob && obj instanceof Blob) ||
4557
4617
  (global.File && obj instanceof File)
@@ -4561,7 +4621,7 @@ function hasBinary(data) {
4561
4621
 
4562
4622
  if (isArray(obj)) {
4563
4623
  for (var i = 0; i < obj.length; i++) {
4564
- if (recursiveCheckForBinary(obj[i])) {
4624
+ if (_hasBinary(obj[i])) {
4565
4625
  return true;
4566
4626
  }
4567
4627
  }
@@ -4571,7 +4631,7 @@ function hasBinary(data) {
4571
4631
  }
4572
4632
 
4573
4633
  for (var key in obj) {
4574
- if (recursiveCheckForBinary(obj[key])) {
4634
+ if (obj.hasOwnProperty(key) && _hasBinary(obj[key])) {
4575
4635
  return true;
4576
4636
  }
4577
4637
  }
@@ -4580,21 +4640,22 @@ function hasBinary(data) {
4580
4640
  return false;
4581
4641
  }
4582
4642
 
4583
- return recursiveCheckForBinary(data);
4643
+ return _hasBinary(data);
4584
4644
  }
4585
4645
 
4586
- },{"isarray":33}],33:[function(require,module,exports){
4646
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
4647
+ },{"isarray":33}],33:[function(_dereq_,module,exports){
4587
4648
  module.exports = Array.isArray || function (arr) {
4588
4649
  return Object.prototype.toString.call(arr) == '[object Array]';
4589
4650
  };
4590
4651
 
4591
- },{}],34:[function(require,module,exports){
4652
+ },{}],34:[function(_dereq_,module,exports){
4592
4653
 
4593
4654
  /**
4594
4655
  * Module dependencies.
4595
4656
  */
4596
4657
 
4597
- var global = require('global');
4658
+ var global = _dereq_('global');
4598
4659
 
4599
4660
  /**
4600
4661
  * Module exports.
@@ -4613,7 +4674,7 @@ try {
4613
4674
  module.exports = false;
4614
4675
  }
4615
4676
 
4616
- },{"global":35}],35:[function(require,module,exports){
4677
+ },{"global":35}],35:[function(_dereq_,module,exports){
4617
4678
 
4618
4679
  /**
4619
4680
  * Returns `this`. Execute this without a "context" (i.e. without it being
@@ -4623,7 +4684,7 @@ try {
4623
4684
 
4624
4685
  module.exports = (function () { return this; })();
4625
4686
 
4626
- },{}],36:[function(require,module,exports){
4687
+ },{}],36:[function(_dereq_,module,exports){
4627
4688
 
4628
4689
  var indexOf = [].indexOf;
4629
4690
 
@@ -4634,7 +4695,7 @@ module.exports = function(arr, obj){
4634
4695
  }
4635
4696
  return -1;
4636
4697
  };
4637
- },{}],37:[function(require,module,exports){
4698
+ },{}],37:[function(_dereq_,module,exports){
4638
4699
 
4639
4700
  /**
4640
4701
  * HOP ref.
@@ -4719,7 +4780,7 @@ exports.length = function(obj){
4719
4780
  exports.isEmpty = function(obj){
4720
4781
  return 0 == exports.length(obj);
4721
4782
  };
4722
- },{}],38:[function(require,module,exports){
4783
+ },{}],38:[function(_dereq_,module,exports){
4723
4784
  /**
4724
4785
  * Parses an URI
4725
4786
  *
@@ -4746,12 +4807,16 @@ module.exports = function parseuri(str) {
4746
4807
  return uri;
4747
4808
  };
4748
4809
 
4749
- },{}],39:[function(require,module,exports){
4750
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};/**
4751
- * Modle requirements
4810
+ },{}],39:[function(_dereq_,module,exports){
4811
+ (function (global){
4812
+ /*global Blob,File*/
4813
+
4814
+ /**
4815
+ * Module requirements
4752
4816
  */
4753
4817
 
4754
- var isArray = require('isarray');
4818
+ var isArray = _dereq_('isarray');
4819
+ var isBuf = _dereq_('./is-buffer');
4755
4820
 
4756
4821
  /**
4757
4822
  * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.
@@ -4763,39 +4828,38 @@ var isArray = require('isarray');
4763
4828
  * @api public
4764
4829
  */
4765
4830
 
4766
- exports.deconstructPacket = function(packet) {
4767
- var buffers = [];
4768
- var packetData = packet.data;
4769
-
4770
- function deconstructBinPackRecursive(data) {
4771
- if (!data) return data;
4772
-
4773
- if ((global.Buffer && Buffer.isBuffer(data)) ||
4774
- (global.ArrayBuffer && data instanceof ArrayBuffer)) { // replace binary
4775
- var placeholder = {_placeholder: true, num: buffers.length};
4776
- buffers.push(data);
4777
- return placeholder;
4778
- } else if (isArray(data)) {
4779
- var newData = new Array(data.length);
4780
- for (var i = 0; i < data.length; i++) {
4781
- newData[i] = deconstructBinPackRecursive(data[i]);
4782
- }
4783
- return newData;
4784
- } else if ('object' == typeof data && !(data instanceof Date)) {
4785
- var newData = {};
4786
- for (var key in data) {
4787
- newData[key] = deconstructBinPackRecursive(data[key]);
4788
- }
4789
- return newData;
4790
- }
4791
- return data;
4831
+ exports.deconstructPacket = function(packet){
4832
+ var buffers = [];
4833
+ var packetData = packet.data;
4834
+
4835
+ function _deconstructPacket(data) {
4836
+ if (!data) return data;
4837
+
4838
+ if (isBuf(data)) {
4839
+ var placeholder = { _placeholder: true, num: buffers.length };
4840
+ buffers.push(data);
4841
+ return placeholder;
4842
+ } else if (isArray(data)) {
4843
+ var newData = new Array(data.length);
4844
+ for (var i = 0; i < data.length; i++) {
4845
+ newData[i] = _deconstructPacket(data[i]);
4846
+ }
4847
+ return newData;
4848
+ } else if ('object' == typeof data && !(data instanceof Date)) {
4849
+ var newData = {};
4850
+ for (var key in data) {
4851
+ newData[key] = _deconstructPacket(data[key]);
4852
+ }
4853
+ return newData;
4792
4854
  }
4855
+ return data;
4856
+ }
4793
4857
 
4794
- var pack = packet;
4795
- pack.data = deconstructBinPackRecursive(packetData);
4796
- pack.attachments = buffers.length; // number of binary 'attachments'
4797
- return {packet: pack, buffers: buffers};
4798
- }
4858
+ var pack = packet;
4859
+ pack.data = _deconstructPacket(packetData);
4860
+ pack.attachments = buffers.length; // number of binary 'attachments'
4861
+ return {packet: pack, buffers: buffers};
4862
+ };
4799
4863
 
4800
4864
  /**
4801
4865
  * Reconstructs a binary packet from its placeholder packet and buffers
@@ -4806,31 +4870,31 @@ exports.deconstructPacket = function(packet) {
4806
4870
  * @api public
4807
4871
  */
4808
4872
 
4809
- exports.reconstructPacket = function(packet, buffers) {
4810
- var curPlaceHolder = 0;
4873
+ exports.reconstructPacket = function(packet, buffers) {
4874
+ var curPlaceHolder = 0;
4811
4875
 
4812
- function reconstructBinPackRecursive(data) {
4813
- if (data && data._placeholder) {
4814
- var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway)
4815
- return buf;
4816
- } else if (isArray(data)) {
4817
- for (var i = 0; i < data.length; i++) {
4818
- data[i] = reconstructBinPackRecursive(data[i]);
4819
- }
4820
- return data;
4821
- } else if (data && 'object' == typeof data) {
4822
- for (var key in data) {
4823
- data[key] = reconstructBinPackRecursive(data[key]);
4824
- }
4825
- return data;
4826
- }
4827
- return data;
4876
+ function _reconstructPacket(data) {
4877
+ if (data && data._placeholder) {
4878
+ var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway)
4879
+ return buf;
4880
+ } else if (isArray(data)) {
4881
+ for (var i = 0; i < data.length; i++) {
4882
+ data[i] = _reconstructPacket(data[i]);
4883
+ }
4884
+ return data;
4885
+ } else if (data && 'object' == typeof data) {
4886
+ for (var key in data) {
4887
+ data[key] = _reconstructPacket(data[key]);
4888
+ }
4889
+ return data;
4828
4890
  }
4891
+ return data;
4892
+ }
4829
4893
 
4830
- packet.data = reconstructBinPackRecursive(packet.data);
4831
- packet.attachments = undefined; // no longer useful
4832
- return packet;
4833
- }
4894
+ packet.data = _reconstructPacket(packet.data);
4895
+ packet.attachments = undefined; // no longer useful
4896
+ return packet;
4897
+ };
4834
4898
 
4835
4899
  /**
4836
4900
  * Asynchronously removes Blobs or Files from data via
@@ -4843,8 +4907,7 @@ exports.deconstructPacket = function(packet) {
4843
4907
  */
4844
4908
 
4845
4909
  exports.removeBlobs = function(data, callback) {
4846
-
4847
- function removeBlobsRecursive(obj, curKey, containingObject) {
4910
+ function _removeBlobs(obj, curKey, containingObject) {
4848
4911
  if (!obj) return obj;
4849
4912
 
4850
4913
  // convert any blob
@@ -4869,48 +4932,38 @@ exports.removeBlobs = function(data, callback) {
4869
4932
  };
4870
4933
 
4871
4934
  fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer
4872
- }
4873
-
4874
- if (isArray(obj)) { // handle array
4935
+ } else if (isArray(obj)) { // handle array
4875
4936
  for (var i = 0; i < obj.length; i++) {
4876
- removeBlobsRecursive(obj[i], i, obj);
4937
+ _removeBlobs(obj[i], i, obj);
4877
4938
  }
4878
4939
  } else if (obj && 'object' == typeof obj && !isBuf(obj)) { // and object
4879
4940
  for (var key in obj) {
4880
- removeBlobsRecursive(obj[key], key, obj);
4941
+ _removeBlobs(obj[key], key, obj);
4881
4942
  }
4882
4943
  }
4883
4944
  }
4884
4945
 
4885
4946
  var pendingBlobs = 0;
4886
4947
  var bloblessData = data;
4887
- removeBlobsRecursive(bloblessData);
4948
+ _removeBlobs(bloblessData);
4888
4949
  if (!pendingBlobs) {
4889
4950
  callback(bloblessData);
4890
4951
  }
4891
- }
4952
+ };
4892
4953
 
4893
- /**
4894
- * Returns true if obj is a buffer or an arraybuffer.
4895
- *
4896
- * @api private
4897
- */
4898
- function isBuf(obj) {
4899
- return (global.Buffer && Buffer.isBuffer(obj)) ||
4900
- (global.ArrayBuffer && obj instanceof ArrayBuffer);
4901
- }
4954
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
4955
+ },{"./is-buffer":41,"isarray":42}],40:[function(_dereq_,module,exports){
4902
4956
 
4903
- },{"isarray":41}],40:[function(require,module,exports){
4904
- var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
4905
4957
  /**
4906
4958
  * Module dependencies.
4907
4959
  */
4908
4960
 
4909
- var debug = require('debug')('socket.io-parser');
4910
- var json = require('json3');
4911
- var isArray = require('isarray');
4912
- var Emitter = require('emitter');
4913
- var binary = require('./binary');
4961
+ var debug = _dereq_('debug')('socket.io-parser');
4962
+ var json = _dereq_('json3');
4963
+ var isArray = _dereq_('isarray');
4964
+ var Emitter = _dereq_('component-emitter');
4965
+ var binary = _dereq_('./binary');
4966
+ var isBuf = _dereq_('./is-buffer');
4914
4967
 
4915
4968
  /**
4916
4969
  * Protocol version.
@@ -4918,7 +4971,7 @@ var binary = require('./binary');
4918
4971
  * @api public
4919
4972
  */
4920
4973
 
4921
- exports.protocol = 3;
4974
+ exports.protocol = 4;
4922
4975
 
4923
4976
  /**
4924
4977
  * Packet types.
@@ -4992,14 +5045,29 @@ exports.BINARY_EVENT = 5;
4992
5045
 
4993
5046
  exports.BINARY_ACK = 6;
4994
5047
 
4995
- exports.Encoder = Encoder
5048
+ /**
5049
+ * Encoder constructor.
5050
+ *
5051
+ * @api public
5052
+ */
5053
+
5054
+ exports.Encoder = Encoder;
5055
+
5056
+ /**
5057
+ * Decoder constructor.
5058
+ *
5059
+ * @api public
5060
+ */
5061
+
5062
+ exports.Decoder = Decoder;
4996
5063
 
4997
5064
  /**
4998
5065
  * A socket.io Encoder instance
4999
5066
  *
5000
5067
  * @api public
5001
5068
  */
5002
- function Encoder() {};
5069
+
5070
+ function Encoder() {}
5003
5071
 
5004
5072
  /**
5005
5073
  * Encode a packet as a single string if non-binary, or as a
@@ -5094,8 +5162,6 @@ function encodeAsBinary(obj, callback) {
5094
5162
  binary.removeBlobs(obj, writeEncoding);
5095
5163
  }
5096
5164
 
5097
- exports.Decoder = Decoder
5098
-
5099
5165
  /**
5100
5166
  * A socket.io Decoder instance
5101
5167
  *
@@ -5136,9 +5202,7 @@ Decoder.prototype.add = function(obj) {
5136
5202
  this.emit('decoded', packet);
5137
5203
  }
5138
5204
  }
5139
- else if ((global.Buffer && Buffer.isBuffer(obj)) ||
5140
- (global.ArrayBuffer && obj instanceof ArrayBuffer) ||
5141
- obj.base64) { // raw binary data
5205
+ else if (isBuf(obj) || obj.base64) { // raw binary data
5142
5206
  if (!this.reconstructor) {
5143
5207
  throw new Error('got binary data when not reconstructing a packet');
5144
5208
  } else {
@@ -5152,7 +5216,7 @@ Decoder.prototype.add = function(obj) {
5152
5216
  else {
5153
5217
  throw new Error('Unknown type: ' + obj);
5154
5218
  }
5155
- }
5219
+ };
5156
5220
 
5157
5221
  /**
5158
5222
  * Decode a packet String (JSON data)
@@ -5219,7 +5283,7 @@ function decodeString(str) {
5219
5283
 
5220
5284
  debug('decoded %s as %j', str, p);
5221
5285
  return p;
5222
- };
5286
+ }
5223
5287
 
5224
5288
  /**
5225
5289
  * Deallocates a parser's resources
@@ -5231,7 +5295,7 @@ Decoder.prototype.destroy = function() {
5231
5295
  if (this.reconstructor) {
5232
5296
  this.reconstructor.finishedReconstruction();
5233
5297
  }
5234
- }
5298
+ };
5235
5299
 
5236
5300
  /**
5237
5301
  * A manager of a binary event's 'buffer sequence'. Should
@@ -5266,7 +5330,7 @@ BinaryReconstructor.prototype.takeBinaryData = function(binData) {
5266
5330
  return packet;
5267
5331
  }
5268
5332
  return null;
5269
- }
5333
+ };
5270
5334
 
5271
5335
  /**
5272
5336
  * Cleans up binary packet reconstruction variables.
@@ -5277,7 +5341,7 @@ BinaryReconstructor.prototype.takeBinaryData = function(binData) {
5277
5341
  BinaryReconstructor.prototype.finishedReconstruction = function() {
5278
5342
  this.reconPack = null;
5279
5343
  this.buffers = [];
5280
- }
5344
+ };
5281
5345
 
5282
5346
  function error(data){
5283
5347
  return {
@@ -5286,9 +5350,26 @@ function error(data){
5286
5350
  };
5287
5351
  }
5288
5352
 
5289
- },{"./binary":39,"debug":9,"emitter":10,"isarray":41,"json3":42}],41:[function(require,module,exports){
5290
- module.exports=require(33)
5291
- },{}],42:[function(require,module,exports){
5353
+ },{"./binary":39,"./is-buffer":41,"component-emitter":8,"debug":9,"isarray":42,"json3":43}],41:[function(_dereq_,module,exports){
5354
+ (function (global){
5355
+
5356
+ module.exports = isBuf;
5357
+
5358
+ /**
5359
+ * Returns true if obj is a buffer or an arraybuffer.
5360
+ *
5361
+ * @api private
5362
+ */
5363
+
5364
+ function isBuf(obj) {
5365
+ return (global.Buffer && global.Buffer.isBuffer(obj)) ||
5366
+ (global.ArrayBuffer && obj instanceof ArrayBuffer);
5367
+ }
5368
+
5369
+ }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
5370
+ },{}],42:[function(_dereq_,module,exports){
5371
+ module.exports=_dereq_(33)
5372
+ },{}],43:[function(_dereq_,module,exports){
5292
5373
  /*! JSON v3.2.6 | http://bestiejs.github.io/json3 | Copyright 2012-2013, Kit Cambridge | http://kit.mit-license.org */
5293
5374
  ;(function (window) {
5294
5375
  // Convenience aliases.
@@ -6151,7 +6232,7 @@ module.exports=require(33)
6151
6232
  }
6152
6233
  }(this));
6153
6234
 
6154
- },{}],43:[function(require,module,exports){
6235
+ },{}],44:[function(_dereq_,module,exports){
6155
6236
  module.exports = toArray
6156
6237
 
6157
6238
  function toArray(list, index) {
@@ -6169,4 +6250,3 @@ function toArray(list, index) {
6169
6250
  },{}]},{},[1])
6170
6251
  (1)
6171
6252
  });
6172
- ;