From 9a05f794f7251b4a1de617bfc64abe72b03c1275 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 30 Dec 2016 19:49:23 -0500 Subject: [PATCH] bump websocket --- Source/WebSocket.swift | 50 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index 3bdff34..34c7dd2 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -180,12 +180,11 @@ open class WebSocket : NSObject, StreamDelegate { /** Connect to the WebSocket server on a background thread. */ - public func connect() { + open func connect() { guard !isConnecting else { return } didDisconnect = false isConnecting = true createHTTPRequest() - isConnecting = false } /** @@ -195,7 +194,7 @@ open class WebSocket : NSObject, StreamDelegate { - Parameter forceTimeout: Maximum time to wait for the server to close the socket. - Parameter closeCode: The code to send on disconnect. The default is the normal close code for cleanly disconnecting a webSocket. */ - public func disconnect(forceTimeout: TimeInterval? = nil, closeCode: UInt16 = CloseCode.normal.rawValue) { + open func disconnect(forceTimeout: TimeInterval? = nil, closeCode: UInt16 = CloseCode.normal.rawValue) { switch forceTimeout { case .some(let seconds) where seconds > 0: let milliseconds = Int(seconds * 1_000) @@ -217,7 +216,7 @@ open class WebSocket : NSObject, StreamDelegate { - parameter string: The string to write. - parameter completion: The (optional) completion handler. */ - public func write(string: String, completion: (() -> ())? = nil) { + open func write(string: String, completion: (() -> ())? = nil) { guard isConnected else { return } dequeueWrite(string.data(using: String.Encoding.utf8)!, code: .textFrame, writeCompletion: completion) } @@ -228,7 +227,7 @@ open class WebSocket : NSObject, StreamDelegate { - parameter data: The data to write. - parameter completion: The (optional) completion handler. */ - public func write(data: Data, completion: (() -> ())? = nil) { + open func write(data: Data, completion: (() -> ())? = nil) { guard isConnected else { return } dequeueWrite(data, code: .binaryFrame, writeCompletion: completion) } @@ -237,7 +236,7 @@ open class WebSocket : NSObject, StreamDelegate { Write a ping to the websocket. This sends it as a control frame. Yodel a sound to the planet. This sends it as an astroid. http://youtu.be/Eu5ZJELRiJ8?t=42s */ - public func write(ping: Data, completion: (() -> ())? = nil) { + open func write(ping: Data, completion: (() -> ())? = nil) { guard isConnected else { return } dequeueWrite(ping, code: .ping, writeCompletion: completion) } @@ -306,6 +305,9 @@ open class WebSocket : NSObject, StreamDelegate { private func initStreamsWithData(_ data: Data, _ port: Int) { //higher level API we will cut over to at some point //NSStream.getStreamsToHostWithName(url.host, port: url.port.integerValue, inputStream: &inputStream, outputStream: &outputStream) + // Disconnect and clean up any existing streams before setting up a new pair + disconnectStream(nil) + var readStream: Unmanaged? var writeStream: Unmanaged? let h = url.host! as NSString @@ -378,7 +380,7 @@ open class WebSocket : NSObject, StreamDelegate { /** Delegate for the stream methods. Processes incoming bytes */ - public func stream(_ aStream: Stream, handle eventCode: Stream.Event) { + open func stream(_ aStream: Stream, handle eventCode: Stream.Event) { if let sec = security, !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { let trust = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) as! SecTrust let domain = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) as? String @@ -455,22 +457,24 @@ open class WebSocket : NSObject, StreamDelegate { */ private func dequeueInput() { while !inputQueue.isEmpty { - let data = inputQueue[0] - var work = data - if let fragBuffer = fragBuffer { - var combine = NSData(data: fragBuffer) as Data - combine.append(data) - work = combine - self.fragBuffer = nil + autoreleasepool { + let data = inputQueue[0] + var work = data + if let fragBuffer = fragBuffer { + var combine = NSData(data: fragBuffer) as Data + combine.append(data) + work = combine + self.fragBuffer = nil + } + let buffer = UnsafeRawPointer((work as NSData).bytes).assumingMemoryBound(to: UInt8.self) + let length = work.count + if !connected { + processTCPHandshake(buffer, bufferLen: length) + } else { + processRawMessagesInBuffer(buffer, bufferLen: length) + } + inputQueue = inputQueue.filter{ $0 != data } } - let buffer = UnsafeRawPointer((work as NSData).bytes).assumingMemoryBound(to: UInt8.self) - let length = work.count - if !connected { - processTCPHandshake(buffer, bufferLen: length) - } else { - processRawMessagesInBuffer(buffer, bufferLen: length) - } - inputQueue = inputQueue.filter{ $0 != data } } } @@ -481,6 +485,7 @@ open class WebSocket : NSObject, StreamDelegate { let code = processHTTP(buffer, bufferLen: bufferLen) switch code { case 0: + isConnecting = false connected = true guard canDispatch else {return} callbackQueue.async { [weak self] in @@ -893,6 +898,7 @@ open class WebSocket : NSObject, StreamDelegate { private func doDisconnect(_ error: NSError?) { guard !didDisconnect else { return } didDisconnect = true + isConnecting = false connected = false guard canDispatch else {return} callbackQueue.async { [weak self] in