@@ -180,12 +180,11 @@ open class WebSocket : NSObject, StreamDelegate {
180180 /**
181181 Connect to the WebSocket server on a background thread.
182182 */
183- public func connect( ) {
183+ open func connect( ) {
184184 guard !isConnecting else { return }
185185 didDisconnect = false
186186 isConnecting = true
187187 createHTTPRequest ( )
188- isConnecting = false
189188 }
190189
191190 /**
@@ -195,7 +194,7 @@ open class WebSocket : NSObject, StreamDelegate {
195194 - Parameter forceTimeout: Maximum time to wait for the server to close the socket.
196195 - Parameter closeCode: The code to send on disconnect. The default is the normal close code for cleanly disconnecting a webSocket.
197196 */
198- public func disconnect( forceTimeout: TimeInterval ? = nil , closeCode: UInt16 = CloseCode . normal. rawValue) {
197+ open func disconnect( forceTimeout: TimeInterval ? = nil , closeCode: UInt16 = CloseCode . normal. rawValue) {
199198 switch forceTimeout {
200199 case . some( let seconds) where seconds > 0 :
201200 let milliseconds = Int ( seconds * 1_000 )
@@ -217,7 +216,7 @@ open class WebSocket : NSObject, StreamDelegate {
217216 - parameter string: The string to write.
218217 - parameter completion: The (optional) completion handler.
219218 */
220- public func write( string: String , completion: ( ( ) -> ( ) ) ? = nil ) {
219+ open func write( string: String , completion: ( ( ) -> ( ) ) ? = nil ) {
221220 guard isConnected else { return }
222221 dequeueWrite ( string. data ( using: String . Encoding. utf8) !, code: . textFrame, writeCompletion: completion)
223222 }
@@ -228,7 +227,7 @@ open class WebSocket : NSObject, StreamDelegate {
228227 - parameter data: The data to write.
229228 - parameter completion: The (optional) completion handler.
230229 */
231- public func write( data: Data , completion: ( ( ) -> ( ) ) ? = nil ) {
230+ open func write( data: Data , completion: ( ( ) -> ( ) ) ? = nil ) {
232231 guard isConnected else { return }
233232 dequeueWrite ( data, code: . binaryFrame, writeCompletion: completion)
234233 }
@@ -237,7 +236,7 @@ open class WebSocket : NSObject, StreamDelegate {
237236 Write a ping to the websocket. This sends it as a control frame.
238237 Yodel a sound to the planet. This sends it as an astroid. http://youtu.be/Eu5ZJELRiJ8?t=42s
239238 */
240- public func write( ping: Data , completion: ( ( ) -> ( ) ) ? = nil ) {
239+ open func write( ping: Data , completion: ( ( ) -> ( ) ) ? = nil ) {
241240 guard isConnected else { return }
242241 dequeueWrite ( ping, code: . ping, writeCompletion: completion)
243242 }
@@ -306,6 +305,9 @@ open class WebSocket : NSObject, StreamDelegate {
306305 private func initStreamsWithData( _ data: Data , _ port: Int ) {
307306 //higher level API we will cut over to at some point
308307 //NSStream.getStreamsToHostWithName(url.host, port: url.port.integerValue, inputStream: &inputStream, outputStream: &outputStream)
308+ // Disconnect and clean up any existing streams before setting up a new pair
309+ disconnectStream ( nil )
310+
309311 var readStream : Unmanaged < CFReadStream > ?
310312 var writeStream : Unmanaged < CFWriteStream > ?
311313 let h = url. host! as NSString
@@ -378,7 +380,7 @@ open class WebSocket : NSObject, StreamDelegate {
378380 /**
379381 Delegate for the stream methods. Processes incoming bytes
380382 */
381- public func stream( _ aStream: Stream , handle eventCode: Stream . Event ) {
383+ open func stream( _ aStream: Stream , handle eventCode: Stream . Event ) {
382384 if let sec = security, !certValidated && [ . hasBytesAvailable, . hasSpaceAvailable] . contains ( eventCode) {
383385 let trust = aStream. property ( forKey: kCFStreamPropertySSLPeerTrust as Stream . PropertyKey ) as! SecTrust
384386 let domain = aStream. property ( forKey: kCFStreamSSLPeerName as Stream . PropertyKey ) as? String
@@ -455,22 +457,24 @@ open class WebSocket : NSObject, StreamDelegate {
455457 */
456458 private func dequeueInput( ) {
457459 while !inputQueue. isEmpty {
458- let data = inputQueue [ 0 ]
459- var work = data
460- if let fragBuffer = fragBuffer {
461- var combine = NSData ( data: fragBuffer) as Data
462- combine. append ( data)
463- work = combine
464- self . fragBuffer = nil
465- }
466- let buffer = UnsafeRawPointer ( ( work as NSData ) . bytes) . assumingMemoryBound ( to: UInt8 . self)
467- let length = work. count
468- if !connected {
469- processTCPHandshake ( buffer, bufferLen: length)
470- } else {
471- processRawMessagesInBuffer ( buffer, bufferLen: length)
460+ autoreleasepool {
461+ let data = inputQueue [ 0 ]
462+ var work = data
463+ if let fragBuffer = fragBuffer {
464+ var combine = NSData ( data: fragBuffer) as Data
465+ combine. append ( data)
466+ work = combine
467+ self . fragBuffer = nil
468+ }
469+ let buffer = UnsafeRawPointer ( ( work as NSData ) . bytes) . assumingMemoryBound ( to: UInt8 . self)
470+ let length = work. count
471+ if !connected {
472+ processTCPHandshake ( buffer, bufferLen: length)
473+ } else {
474+ processRawMessagesInBuffer ( buffer, bufferLen: length)
475+ }
476+ inputQueue = inputQueue. filter { $0 != data }
472477 }
473- inputQueue = inputQueue. filter { $0 != data }
474478 }
475479 }
476480
@@ -481,6 +485,7 @@ open class WebSocket : NSObject, StreamDelegate {
481485 let code = processHTTP ( buffer, bufferLen: bufferLen)
482486 switch code {
483487 case 0 :
488+ isConnecting = false
484489 connected = true
485490 guard canDispatch else { return }
486491 callbackQueue. async { [ weak self] in
@@ -893,6 +898,7 @@ open class WebSocket : NSObject, StreamDelegate {
893898 private func doDisconnect( _ error: NSError ? ) {
894899 guard !didDisconnect else { return }
895900 didDisconnect = true
901+ isConnecting = false
896902 connected = false
897903 guard canDispatch else { return }
898904 callbackQueue. async { [ weak self] in
0 commit comments