@@ -20,6 +20,7 @@ module.exports = Socket;
20
20
function Socket ( id , server , transport , req ) {
21
21
this . id = id ;
22
22
this . server = server ;
23
+ this . upgrading = false ;
23
24
this . upgraded = false ;
24
25
this . readyState = 'opening' ;
25
26
this . writeBuffer = [ ] ;
@@ -161,13 +162,14 @@ Socket.prototype.maybeUpgrade = function (transport) {
161
162
debug ( 'might upgrade socket transport from "%s" to "%s"'
162
163
, this . transport . name , transport . name ) ;
163
164
165
+ this . upgrading = true ;
166
+
164
167
var self = this ;
165
168
166
169
// set transport upgrade timer
167
170
self . upgradeTimeoutTimer = setTimeout ( function ( ) {
168
171
debug ( 'client did not complete upgrade - closing transport' ) ;
169
- clearInterval ( self . checkIntervalTimer ) ;
170
- self . checkIntervalTimer = null ;
172
+ cleanup ( ) ;
171
173
if ( 'open' == transport . readyState ) {
172
174
transport . close ( ) ;
173
175
}
@@ -180,22 +182,20 @@ Socket.prototype.maybeUpgrade = function (transport) {
180
182
self . checkIntervalTimer = setInterval ( check , 100 ) ;
181
183
} else if ( 'upgrade' == packet . type && self . readyState != 'closed' ) {
182
184
debug ( 'got upgrade packet - upgrading' ) ;
185
+ cleanup ( ) ;
183
186
self . upgraded = true ;
184
187
self . clearTransport ( ) ;
185
188
self . setTransport ( transport ) ;
186
189
self . emit ( 'upgrade' , transport ) ;
187
190
self . setPingTimeout ( ) ;
188
191
self . flush ( ) ;
189
- clearInterval ( self . checkIntervalTimer ) ;
190
- self . checkIntervalTimer = null ;
191
- clearTimeout ( self . upgradeTimeoutTimer ) ;
192
- transport . removeListener ( 'packet' , onPacket ) ;
193
192
if ( self . readyState == 'closing' ) {
194
193
transport . close ( function ( ) {
195
194
self . onClose ( 'forced close' ) ;
196
195
} ) ;
197
196
}
198
197
} else {
198
+ cleanup ( ) ;
199
199
transport . close ( ) ;
200
200
}
201
201
}
@@ -208,7 +208,41 @@ Socket.prototype.maybeUpgrade = function (transport) {
208
208
}
209
209
}
210
210
211
+ function cleanup ( ) {
212
+ self . upgrading = false ;
213
+
214
+ clearInterval ( self . checkIntervalTimer ) ;
215
+ self . checkIntervalTimer = null ;
216
+
217
+ clearTimeout ( self . upgradeTimeoutTimer ) ;
218
+ self . upgradeTimeoutTimer = null ;
219
+
220
+ transport . removeListener ( 'packet' , onPacket ) ;
221
+ transport . removeListener ( 'close' , onTransportClose ) ;
222
+ transport . removeListener ( 'error' , onError ) ;
223
+ self . removeListener ( 'close' , onClose ) ;
224
+ }
225
+
226
+ function onError ( err ) {
227
+ debug ( 'client did not complete upgrade - %s' , err ) ;
228
+ cleanup ( ) ;
229
+ transport . close ( ) ;
230
+ transport = null ;
231
+ }
232
+
233
+ function onTransportClose ( ) {
234
+ onError ( "transport closed" ) ;
235
+ }
236
+
237
+ function onClose ( ) {
238
+ onError ( "socket closed" ) ;
239
+ }
240
+
211
241
transport . on ( 'packet' , onPacket ) ;
242
+ transport . once ( 'close' , onTransportClose ) ;
243
+ transport . once ( 'error' , onError ) ;
244
+
245
+ self . once ( 'close' , onClose ) ;
212
246
} ;
213
247
214
248
/**
0 commit comments