22
33const EventEmitter = require ( 'events' ) ;
44const crypto = require ( 'crypto' ) ;
5- const Ultron = require ( 'ultron' ) ;
65const https = require ( 'https' ) ;
76const http = require ( 'http' ) ;
87const url = require ( 'url' ) ;
@@ -50,7 +49,6 @@ class WebSocket extends EventEmitter {
5049 this . _receiver = null ;
5150 this . _sender = null ;
5251 this . _socket = null ;
53- this . _ultron = null ;
5452
5553 if ( address !== null ) {
5654 if ( ! protocols ) {
@@ -123,18 +121,17 @@ class WebSocket extends EventEmitter {
123121 socket . setTimeout ( 0 ) ;
124122 socket . setNoDelay ( ) ;
125123
124+ socket . on ( 'close' , this . _finalize ) ;
125+ socket . on ( 'error' , this . _finalize ) ;
126+ socket . on ( 'end' , this . _finalize ) ;
127+
126128 this . _receiver = new Receiver ( this . _extensions , maxPayload , this . binaryType ) ;
127129 this . _sender = new Sender ( socket , this . _extensions ) ;
128- this . _ultron = new Ultron ( socket ) ;
129130 this . _socket = socket ;
130131
131- this . _ultron . on ( 'close' , this . _finalize ) ;
132- this . _ultron . on ( 'error' , this . _finalize ) ;
133- this . _ultron . on ( 'end' , this . _finalize ) ;
134-
135132 if ( head . length > 0 ) socket . unshift ( head ) ;
136133
137- this . _ultron . on ( 'data' , ( data ) => this . _receiver . add ( data ) ) ;
134+ socket . on ( 'data' , this . _receiver . add ) ;
138135
139136 this . _receiver . onmessage = ( data ) => this . emit ( 'message' , data ) ;
140137 this . _receiver . onping = ( data ) => {
@@ -143,6 +140,11 @@ class WebSocket extends EventEmitter {
143140 } ;
144141 this . _receiver . onpong = ( data ) => this . emit ( 'pong' , data ) ;
145142 this . _receiver . onclose = ( code , reason ) => {
143+ //
144+ // Discard any additional data that is received on the socket.
145+ //
146+ this . _socket . removeListener ( 'data' , this . _receiver . add ) ;
147+
146148 this . _closeFrameReceived = true ;
147149 this . _closeMessage = reason ;
148150 this . _closeCode = code ;
@@ -182,41 +184,32 @@ class WebSocket extends EventEmitter {
182184 this . _finalized = true ;
183185
184186 if ( typeof error === 'object' ) this . emit ( 'error' , error ) ;
185- if ( ! this . _socket ) return this . emitClose ( ) ;
187+ if ( ! this . _socket ) {
188+ this . readyState = WebSocket . CLOSED ;
189+ this . emit ( 'close' , this . _closeCode , this . _closeMessage ) ;
190+ return ;
191+ }
186192
187193 clearTimeout ( this . _closeTimer ) ;
188- this . _closeTimer = null ;
189-
190- this . _ultron . destroy ( ) ;
191- this . _ultron = null ;
192194
195+ this . _socket . removeListener ( 'data' , this . _receiver . add ) ;
196+ this . _socket . removeListener ( 'close' , this . _finalize ) ;
197+ this . _socket . removeListener ( 'error' , this . _finalize ) ;
198+ this . _socket . removeListener ( 'end' , this . _finalize ) ;
193199 this . _socket . on ( 'error' , constants . NOOP ) ;
194200
195201 if ( ! error ) this . _socket . end ( ) ;
196202 else this . _socket . destroy ( ) ;
197203
198- this . _socket = null ;
199- this . _sender = null ;
204+ this . _receiver . cleanup ( ( ) => {
205+ this . readyState = WebSocket . CLOSED ;
200206
201- this . _receiver . cleanup ( ( ) => this . emitClose ( ) ) ;
202- this . _receiver = null ;
203- }
204-
205- /**
206- * Emit the `close` event.
207- *
208- * @private
209- */
210- emitClose ( ) {
211- this . readyState = WebSocket . CLOSED ;
212-
213- this . emit ( 'close' , this . _closeCode , this . _closeMessage ) ;
214-
215- if ( this . _extensions [ PerMessageDeflate . extensionName ] ) {
216- this . _extensions [ PerMessageDeflate . extensionName ] . cleanup ( ) ;
217- }
207+ if ( this . _extensions [ PerMessageDeflate . extensionName ] ) {
208+ this . _extensions [ PerMessageDeflate . extensionName ] . cleanup ( ) ;
209+ }
218210
219- this . removeAllListeners ( ) ;
211+ this . emit ( 'close' , this . _closeCode , this . _closeMessage ) ;
212+ } ) ;
220213 }
221214
222215 /**
0 commit comments