| 4106 | Socket.priorWebsocketSuccess = false; |
| 4107 | |
| 4108 | function onTransportOpen () { |
| 4109 | if (self.onlyBinaryUpgrades) { |
| 4110 | var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary; |
| 4111 | failed = failed || upgradeLosesBinary; |
| 4112 | } |
| 4113 | if (failed) return; |
| 4114 | |
| 4115 | debug('probe transport "%s" opened', name); |
| 4116 | transport.send([{ type: 'ping', data: 'probe' }]); |
| 4117 | transport.once('packet', function (msg) { |
| 4118 | if (failed) return; |
| 4119 | if ('pong' === msg.type && 'probe' === msg.data) { |
| 4120 | debug('probe transport "%s" pong', name); |
| 4121 | self.upgrading = true; |
| 4122 | self.emit('upgrading', transport); |
| 4123 | if (!transport) return; |
| 4124 | Socket.priorWebsocketSuccess = 'websocket' === transport.name; |
| 4125 | |
| 4126 | debug('pausing current transport "%s"', self.transport.name); |
| 4127 | self.transport.pause(function () { |
| 4128 | if (failed) return; |
| 4129 | if ('closed' === self.readyState) return; |
| 4130 | debug('changing transport and sending upgrade packet'); |
| 4131 | |
| 4132 | cleanup(); |
| 4133 | |
| 4134 | self.setTransport(transport); |
| 4135 | transport.send([{ type: 'upgrade' }]); |
| 4136 | self.emit('upgrade', transport); |
| 4137 | transport = null; |
| 4138 | self.upgrading = false; |
| 4139 | self.flush(); |
| 4140 | }); |
| 4141 | } else { |
| 4142 | debug('probe transport "%s" failed', name); |
| 4143 | var err = new Error('probe error'); |
| 4144 | err.transport = transport.name; |
| 4145 | self.emit('upgradeError', err); |
| 4146 | } |
| 4147 | }); |
| 4148 | } |
| 4149 | |
| 4150 | function freezeTransport () { |
| 4151 | if (failed) return; |