| 378 | Socket.priorWebsocketSuccess = false; |
| 379 | |
| 380 | function onTransportOpen() { |
| 381 | if (self.onlyBinaryUpgrades) { |
| 382 | var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary; |
| 383 | failed = failed || upgradeLosesBinary; |
| 384 | } |
| 385 | if (failed) |
| 386 | return; |
| 387 | |
| 388 | debug('probe transport "%s" opened', name); |
| 389 | transport.send([ |
| 390 | { |
| 391 | type: 'ping', |
| 392 | data: 'probe' |
| 393 | } |
| 394 | ]); |
| 395 | transport.once('packet', function(msg) { |
| 396 | if (failed) |
| 397 | return; |
| 398 | if ('pong' == msg.type && 'probe' == msg.data) { |
| 399 | debug('probe transport "%s" pong', name); |
| 400 | self.upgrading = true; |
| 401 | self.emit('upgrading', transport); |
| 402 | if (!transport) |
| 403 | return; |
| 404 | Socket.priorWebsocketSuccess = 'websocket' == transport.name; |
| 405 | |
| 406 | debug('pausing current transport "%s"', self.transport.name); |
| 407 | self.transport.pause(function() { |
| 408 | if (failed) |
| 409 | return; |
| 410 | if ('closed' == self.readyState) |
| 411 | return; |
| 412 | debug('changing transport and sending upgrade packet'); |
| 413 | |
| 414 | cleanup(); |
| 415 | |
| 416 | self.setTransport(transport); |
| 417 | transport.send([ |
| 418 | { |
| 419 | type: 'upgrade' |
| 420 | } |
| 421 | ]); |
| 422 | self.emit('upgrade', transport); |
| 423 | transport = null; |
| 424 | self.upgrading = false; |
| 425 | self.flush(); |
| 426 | }); |
| 427 | } else { |
| 428 | debug('probe transport "%s" failed', name); |
| 429 | var err = new Error('probe error'); |
| 430 | err.transport = transport.name; |
| 431 | self.emit('upgradeError', err); |
| 432 | } |
| 433 | }); |
| 434 | } |
| 435 | |
| 436 | function freezeTransport() { |
| 437 | if (failed) |