diff --git a/.travis.yml b/.travis.yml index c37d53c..1fdd2cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,7 @@ language: objective-c +branches: + except: + - swift3 xcode_project: Socket.IO-Client-Swift.xcodeproj # path to your xcodeproj folder xcode_scheme: SocketIO-iOS osx_image: xcode7.3 diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index e886cad..a26434d 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -86,27 +86,27 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe for option in options { switch option { - case let .ConnectParams(params): + case let .connectParams(params): connectParams = params - case let .Cookies(cookies): + case let .cookies(cookies): self.cookies = cookies - case let .DoubleEncodeUTF8(encode): + case let .doubleEncodeUTF8(encode): doubleEncodeUTF8 = encode - case let .ExtraHeaders(headers): + case let .extraHeaders(headers): extraHeaders = headers - case let .SessionDelegate(delegate): + case let .sessionDelegate(delegate): sessionDelegate = delegate - case let .ForcePolling(force): + case let .forcePolling(force): forcePolling = force - case let .ForceWebsockets(force): + case let .forceWebsockets(force): forceWebsockets = force - case let .Path(path): + case let .path(path): socketPath = path - case let .VoipEnabled(enable): + case let .voipEnabled(enable): voipEnabled = enable - case let .Secure(secure): + case let .secure(secure): self.secure = secure - case let .SelfSigned(selfSigned): + case let .selfSigned(selfSigned): self.selfSigned = selfSigned default: continue @@ -129,12 +129,12 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } private func checkAndHandleEngineError(msg: String) { - guard let stringData = msg.dataUsingEncoding(NSUTF8StringEncoding, + guard let stringData = msg.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false) else { return } do { - if let dict = try NSJSONSerialization.JSONObjectWithData(stringData, - options: NSJSONReadingOptions.MutableContainers) as? NSDictionary { + if let dict = try NSJSONSerialization.jsonObject(with: stringData, + options: NSJSONReadingOptions.mutableContainers) as? NSDictionary { guard let code = dict["code"] as? Int else { return } guard let error = dict["message"] as? String else { return } @@ -159,10 +159,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe private func checkIfMessageIsBase64Binary(message: String) -> Bool { if message.hasPrefix("b4") { // binary in base64 string - let noPrefix = message[message.startIndex.advancedBy(2).. Either { if websocket { - var byteArray = [UInt8](count: 1, repeatedValue: 0x4) + var byteArray = [UInt8](repeating: 0x4, count: 1) let mutData = NSMutableData(bytes: &byteArray, length: 1) - mutData.appendData(data) + mutData.append(data) return .Left(mutData) } else { - let str = "b4" + data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) + let str = "b4" + data.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0)) return .Right(str) } } func doubleEncodeUTF8(string: String) -> String { - if let latin1 = string.dataUsingEncoding(NSUTF8StringEncoding), + if let latin1 = string.data(usingEncoding: NSUTF8StringEncoding), utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding) { return utf8 as String } else { @@ -99,7 +99,7 @@ extension SocketEngineSpec { } func fixDoubleUTF8(string: String) -> String { - if let utf8 = string.dataUsingEncoding(NSISOLatin1StringEncoding), + if let utf8 = string.data(usingEncoding: NSISOLatin1StringEncoding), latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding) { return latin1 as String } else { diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 12bd49d..d593616 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -71,33 +71,33 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable self.socketURL = socketURL if socketURL.absoluteString.hasPrefix("https://") { - self.options.insertIgnore(.Secure(true)) + self.options.insertIgnore(.secure(true)) } for option in options { switch option { - case let .Reconnects(reconnects): + case let .reconnects(reconnects): self.reconnects = reconnects - case let .ReconnectAttempts(attempts): + case let .reconnectAttempts(attempts): reconnectAttempts = attempts - case let .ReconnectWait(wait): + case let .reconnectWait(wait): reconnectWait = abs(wait) - case let .Nsp(nsp): + case let .nsp(nsp): self.nsp = nsp - case let .Log(log): + case let .log(log): DefaultSocketLogger.Logger.log = log - case let .Logger(logger): + case let .logger(logger): DefaultSocketLogger.Logger = logger - case let .HandleQueue(queue): + case let .handleQueue(queue): handleQueue = queue - case let .ForceNew(force): + case let .forceNew(force): forceNew = force default: continue } } - self.options.insertIgnore(.Path("/socket.io/")) + self.options.insertIgnore(.path("/socket.io/")) super.init() } @@ -409,7 +409,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Removes all handlers. /// Can be used after disconnecting to break any potential remaining retain cycles. public func removeAllHandlers() { - handlers.removeAll(keepCapacity: false) + handlers.removeAll(keepingCapacity: false) } private func tryReconnectWithReason(reason: String) { diff --git a/Source/SocketIOClientOption.swift b/Source/SocketIOClientOption.swift index 93626f5..70d572b 100644 --- a/Source/SocketIOClientOption.swift +++ b/Source/SocketIOClientOption.swift @@ -29,67 +29,67 @@ protocol ClientOption : CustomStringConvertible, Hashable { } public enum SocketIOClientOption : ClientOption { - case ConnectParams([String: AnyObject]) - case Cookies([NSHTTPCookie]) - case DoubleEncodeUTF8(Bool) - case ExtraHeaders([String: String]) - case ForceNew(Bool) - case ForcePolling(Bool) - case ForceWebsockets(Bool) - case HandleQueue(dispatch_queue_t) - case Log(Bool) - case Logger(SocketLogger) - case Nsp(String) - case Path(String) - case Reconnects(Bool) - case ReconnectAttempts(Int) - case ReconnectWait(Int) - case Secure(Bool) - case SelfSigned(Bool) - case SessionDelegate(NSURLSessionDelegate) - case VoipEnabled(Bool) + case connectParams([String: AnyObject]) + case cookies([NSHTTPCookie]) + case doubleEncodeUTF8(Bool) + case extraHeaders([String: String]) + case forceNew(Bool) + case forcePolling(Bool) + case forceWebsockets(Bool) + case handleQueue(dispatch_queue_t) + case log(Bool) + case logger(SocketLogger) + case nsp(String) + case path(String) + case reconnects(Bool) + case reconnectAttempts(Int) + case reconnectWait(Int) + case secure(Bool) + case selfSigned(Bool) + case sessionDelegate(NSURLSessionDelegate) + case voipEnabled(Bool) public var description: String { let description: String switch self { - case .ConnectParams: + case .connectParams: description = "connectParams" - case .Cookies: + case .cookies: description = "cookies" - case .DoubleEncodeUTF8: + case .doubleEncodeUTF8: description = "doubleEncodeUTF8" - case .ExtraHeaders: + case .extraHeaders: description = "extraHeaders" - case .ForceNew: + case .forceNew: description = "forceNew" - case .ForcePolling: + case .forcePolling: description = "forcePolling" - case .ForceWebsockets: + case .forceWebsockets: description = "forceWebsockets" - case .HandleQueue: + case .handleQueue: description = "handleQueue" - case .Log: + case .log: description = "log" - case .Logger: + case .logger: description = "logger" - case .Nsp: + case .nsp: description = "nsp" - case .Path: + case .path: description = "path" - case .Reconnects: + case .reconnects: description = "reconnects" - case .ReconnectAttempts: + case .reconnectAttempts: description = "reconnectAttempts" - case .ReconnectWait: + case .reconnectWait: description = "reconnectWait" - case .Secure: + case .secure: description = "secure" - case .SelfSigned: + case .selfSigned: description = "selfSigned" - case .SessionDelegate: + case .sessionDelegate: description = "sessionDelegate" - case .VoipEnabled: + case .voipEnabled: description = "voipEnabled" } @@ -104,43 +104,43 @@ public enum SocketIOClientOption : ClientOption { let value: AnyObject switch self { - case let .ConnectParams(params): + case let .connectParams(params): value = params - case let .Cookies(cookies): + case let .cookies(cookies): value = cookies - case let .DoubleEncodeUTF8(encode): + case let .doubleEncodeUTF8(encode): value = encode - case let .ExtraHeaders(headers): + case let .extraHeaders(headers): value = headers - case let .ForceNew(force): + case let .forceNew(force): value = force - case let .ForcePolling(force): + case let .forcePolling(force): value = force - case let .ForceWebsockets(force): + case let .forceWebsockets(force): value = force - case let .HandleQueue(queue): + case let .handleQueue(queue): value = queue - case let .Log(log): + case let .log(log): value = log - case let .Logger(logger): + case let .logger(logger): value = logger - case let .Nsp(nsp): + case let .nsp(nsp): value = nsp - case let .Path(path): + case let .path(path): value = path - case let .Reconnects(reconnects): + case let .reconnects(reconnects): value = reconnects - case let .ReconnectAttempts(attempts): + case let .reconnectAttempts(attempts): value = attempts - case let .ReconnectWait(wait): + case let .reconnectWait(wait): value = wait - case let .Secure(secure): + case let .secure(secure): value = secure - case let .SelfSigned(signed): + case let .selfSigned(signed): value = signed - case let .SessionDelegate(delegate): + case let .sessionDelegate(delegate): value = delegate - case let .VoipEnabled(enabled): + case let .voipEnabled(enabled): value = enabled } @@ -164,43 +164,43 @@ extension NSDictionary { private static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? { switch (key, value) { case let ("connectParams", params as [String: AnyObject]): - return .ConnectParams(params) + return .connectParams(params) case let ("cookies", cookies as [NSHTTPCookie]): - return .Cookies(cookies) + return .cookies(cookies) case let ("doubleEncodeUTF8", encode as Bool): - return .DoubleEncodeUTF8(encode) + return .doubleEncodeUTF8(encode) case let ("extraHeaders", headers as [String: String]): - return .ExtraHeaders(headers) + return .extraHeaders(headers) case let ("forceNew", force as Bool): - return .ForceNew(force) + return .forceNew(force) case let ("forcePolling", force as Bool): - return .ForcePolling(force) + return .forcePolling(force) case let ("forceWebsockets", force as Bool): - return .ForceWebsockets(force) + return .forceWebsockets(force) case let ("handleQueue", queue as dispatch_queue_t): - return .HandleQueue(queue) + return .handleQueue(queue) case let ("log", log as Bool): - return .Log(log) + return .log(log) case let ("logger", logger as SocketLogger): - return .Logger(logger) + return .logger(logger) case let ("nsp", nsp as String): - return .Nsp(nsp) + return .nsp(nsp) case let ("path", path as String): - return .Path(path) + return .path(path) case let ("reconnects", reconnects as Bool): - return .Reconnects(reconnects) + return .reconnects(reconnects) case let ("reconnectAttempts", attempts as Int): - return .ReconnectAttempts(attempts) + return .reconnectAttempts(attempts) case let ("reconnectWait", wait as Int): - return .ReconnectWait(wait) + return .reconnectWait(wait) case let ("secure", secure as Bool): - return .Secure(secure) + return .secure(secure) case let ("selfSigned", selfSigned as Bool): - return .SelfSigned(selfSigned) + return .selfSigned(selfSigned) case let ("sessionDelegate", delegate as NSURLSessionDelegate): - return .SessionDelegate(delegate) + return .sessionDelegate(delegate) case let ("voipEnabled", enable as Bool): - return .VoipEnabled(enable) + return .voipEnabled(enable) default: return nil } diff --git a/Source/SocketLogger.swift b/Source/SocketLogger.swift index 9ba7d34..fe9720d 100644 --- a/Source/SocketLogger.swift +++ b/Source/SocketLogger.swift @@ -47,7 +47,7 @@ public extension SocketLogger { private func abstractLog(logType: String, message: String, type: String, args: [AnyObject]) { guard log else { return } - let newArgs = args.map({arg -> CVarArgType in String(arg)}) + let newArgs = args.map({arg -> CVarArg in String(arg)}) let replaced = String(format: message, arguments: newArgs) NSLog("%@ %@: %@", logType, type, replaced) diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index 52de38a..0cc436e 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -94,7 +94,7 @@ struct SocketPacket { } do { - let jsonSend = try NSJSONSerialization.dataWithJSONObject(data, + let jsonSend = try NSJSONSerialization.data(withJSONObject: data, options: NSJSONWritingOptions(rawValue: 0)) guard let jsonString = String(data: jsonSend, encoding: NSUTF8StringEncoding) else { return "[]" @@ -235,7 +235,7 @@ extension SocketPacket { private extension SocketPacket { // Recursive function that looks for NSData in collections - static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject { + static func shred(data: AnyObject, binary: inout [NSData]) -> AnyObject { let placeholder = ["_placeholder": true, "num": binary.count] switch data { diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index 537a614..8e802a8 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -111,7 +111,7 @@ extension SocketParsable { } } - let d = message[parser.currentIndex.advancedBy(1).. Either { - let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) + let stringData = data.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false) do { - if let arr = try NSJSONSerialization.JSONObjectWithData(stringData!, - options: NSJSONReadingOptions.MutableContainers) as? [AnyObject] { + if let arr = try NSJSONSerialization.jsonObject(with: stringData!, + options: NSJSONReadingOptions.mutableContainers) as? [AnyObject] { return .Right(arr) } else { return .Left("Expected data array") diff --git a/Source/SocketStringReader.swift b/Source/SocketStringReader.swift index d1e2b59..26883ac 100644 --- a/Source/SocketStringReader.swift +++ b/Source/SocketStringReader.swift @@ -39,11 +39,11 @@ struct SocketStringReader { } mutating func advanceIndexBy(n: Int) { - currentIndex = currentIndex.advancedBy(n) + currentIndex = currentIndex.advanced(by: n) } mutating func read(readLength: Int) -> String { - let readString = message[currentIndex.. String { let substring = message[currentIndex.. String { - return read(currentIndex.distanceTo(message.endIndex)) + return read(currentIndex.distance(to: message.endIndex)) } } diff --git a/Source/SwiftRegex.swift b/Source/SwiftRegex.swift index b704afd..8668179 100644 --- a/Source/SwiftRegex.swift +++ b/Source/SwiftRegex.swift @@ -18,7 +18,7 @@ infix operator <~ { associativity none precedence 130 } private let lock = dispatch_semaphore_create(1) private var swiftRegexCache = [String: NSRegularExpression]() -internal final class SwiftRegex : NSObject, BooleanType { +internal final class SwiftRegex : NSObject, Boolean { var target: String var regex: NSRegularExpression @@ -28,7 +28,7 @@ internal final class SwiftRegex : NSObject, BooleanType { if dispatch_semaphore_wait(lock, dispatch_time(DISPATCH_TIME_NOW, Int64(10 * NSEC_PER_MSEC))) != 0 { do { let regex = try NSRegularExpression(pattern: pattern, options: - NSRegularExpressionOptions.DotMatchesLineSeparators) + NSRegularExpressionOptions.dotMatchesLineSeparators) self.regex = regex } catch let error as NSError { SwiftRegex.failure("Error in pattern: \(pattern) - \(error)") @@ -44,7 +44,7 @@ internal final class SwiftRegex : NSObject, BooleanType { } else { do { let regex = try NSRegularExpression(pattern: pattern, options: - NSRegularExpressionOptions.DotMatchesLineSeparators) + NSRegularExpressionOptions.dotMatchesLineSeparators) swiftRegexCache[pattern] = regex self.regex = regex } catch let error as NSError { @@ -66,7 +66,7 @@ internal final class SwiftRegex : NSObject, BooleanType { private func substring(range: NSRange) -> String? { if range.location != NSNotFound { - return (target as NSString).substringWithRange(range) + return (target as NSString).substring(with: range) } else { return nil } @@ -77,7 +77,7 @@ internal final class SwiftRegex : NSObject, BooleanType { } func range(options: NSMatchingOptions) -> NSRange { - return regex.rangeOfFirstMatchInString(target as String, options: [], range: targetRange) + return regex.rangeOfFirstMatch(in: target as String, options: [], range: targetRange) } func match(options: NSMatchingOptions) -> String? { @@ -85,8 +85,8 @@ internal final class SwiftRegex : NSObject, BooleanType { } func groups() -> [String]? { - return groupsForMatch(regex.firstMatchInString(target as String, options: - NSMatchingOptions.WithoutAnchoringBounds, range: targetRange)) + return groupsForMatch(regex.firstMatch(in: target as String, options: + NSMatchingOptions.withoutAnchoringBounds, range: targetRange)) } private func groupsForMatch(match: NSTextCheckingResult?) -> [String]? { @@ -95,7 +95,7 @@ internal final class SwiftRegex : NSObject, BooleanType { } var groups = [String]() for groupno in 0...regex.numberOfCaptureGroups { - if let group = substring(match.rangeAtIndex(groupno)) { + if let group = substring(match.range(at: groupno)) { groups += [group] } else { groups += ["_"] // avoids bridging problems @@ -114,11 +114,11 @@ internal final class SwiftRegex : NSObject, BooleanType { return } - for match in Array(matchResults().reverse()) { - let replacement = regex.replacementStringForResult(match, - inString: target as String, offset: 0, template: newValue!) + for match in Array(matchResults().reversed()) { + let replacement = regex.replacementString(for: match, + in: target as String, offset: 0, template: newValue!) let mut = NSMutableString(string: target) - mut.replaceCharactersInRange(match.rangeAtIndex(groupno), withString: replacement) + mut.replaceCharacters(in: match.range(at: groupno), with: replacement) target = mut as String } @@ -126,8 +126,8 @@ internal final class SwiftRegex : NSObject, BooleanType { } func matchResults() -> [NSTextCheckingResult] { - let matches = regex.matchesInString(target as String, options: - NSMatchingOptions.WithoutAnchoringBounds, range: targetRange) + let matches = regex.matches(in: target as String, options: + NSMatchingOptions.withoutAnchoringBounds, range: targetRange) as [NSTextCheckingResult] return matches @@ -148,7 +148,7 @@ internal final class SwiftRegex : NSObject, BooleanType { func dictionary(options: NSMatchingOptions!) -> Dictionary { var out = Dictionary() for match in matchResults() { - out[substring(match.rangeAtIndex(1))!] = substring(match.rangeAtIndex(2))! + out[substring(match.range(at: 1))!] = substring(match.range(at: 2))! } return out } @@ -158,14 +158,14 @@ internal final class SwiftRegex : NSObject, BooleanType { let out = NSMutableString() var pos = 0 - regex.enumerateMatchesInString(target as String, options: options, range: targetRange ) {match, flags, stop in + regex.enumerateMatches(in: target as String, options: options, range: targetRange ) {match, flags, stop in let matchRange = match!.range - out.appendString( self.substring(NSRange(location:pos, length:matchRange.location-pos))!) - out.appendString( substitution(match!, stop) ) + out.append( self.substring(NSRange(location:pos, length:matchRange.location-pos))!) + out.append( substitution(match!, stop) ) pos = matchRange.location + matchRange.length } - out.appendString(substring(NSRange(location:pos, length:targetRange.length-pos))!) + out.append(substring(NSRange(location:pos, length:targetRange.length-pos))!) return out as String } @@ -189,7 +189,6 @@ extension String { func <~ (left: SwiftRegex, right: String) -> String { return left.substituteMatches({match, stop in - return left.regex.replacementStringForResult( match, - inString: left.target as String, offset: 0, template: right ) + return left.regex.replacementString(for: match, in: left.target as String, offset: 0, template: right ) }, options: []) } diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index 163ce7a..a440c80 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -109,7 +109,10 @@ public class WebSocket : NSObject, NSStreamDelegate { public var headers = [String: String]() public var voipEnabled = false public var selfSignedSSL = false + #if swift(>=3) + #else public var security: SSLSecurity? + #endif public var enabledSSLCipherSuites: [SSLCipherSuite]? public var origin: String? public var isConnected :Bool { @@ -166,12 +169,12 @@ public class WebSocket : NSObject, NSStreamDelegate { */ public func disconnect(forceTimeout forceTimeout: NSTimeInterval? = nil) { switch forceTimeout { - case .Some(let seconds) where seconds > 0: + case .some(let seconds) where seconds > 0: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))), queue) { [weak self] in self?.disconnectStream(nil) } fallthrough - case .None: + case .none: writeError(CloseCode.Normal.rawValue) default: @@ -183,7 +186,7 @@ public class WebSocket : NSObject, NSStreamDelegate { ///write a string to the websocket. This sends it as a text frame. public func writeString(str: String) { guard isConnected else { return } - dequeueWrite(str.dataUsingEncoding(NSUTF8StringEncoding)!, code: .TextFrame) + dequeueWrite(str.data(usingEncoding: NSUTF8StringEncoding)!, code: .TextFrame) } ///write binary data to the websocket. This sends it as a binary frame. @@ -216,7 +219,7 @@ public class WebSocket : NSObject, NSStreamDelegate { addHeader(urlRequest, key: headerWSUpgradeName, val: headerWSUpgradeValue) addHeader(urlRequest, key: headerWSConnectionName, val: headerWSConnectionValue) if let protocols = optionalProtocols { - addHeader(urlRequest, key: headerWSProtocolName, val: protocols.joinWithSeparator(",")) + addHeader(urlRequest, key: headerWSProtocolName, val: protocols.joined(separator: ",")) } addHeader(urlRequest, key: headerWSVersionName, val: headerWSVersionValue) addHeader(urlRequest, key: headerWSKeyName, val: generateWebSocketKey()) @@ -246,8 +249,8 @@ public class WebSocket : NSObject, NSStreamDelegate { let uni = UnicodeScalar(UInt32(97 + arc4random_uniform(25))) key += "\(Character(uni))" } - let data = key.dataUsingEncoding(NSUTF8StringEncoding) - let baseKey = data?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) + let data = key.data(usingEncoding: NSUTF8StringEncoding) + let baseKey = data?.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0)) return baseKey! } @@ -280,6 +283,8 @@ public class WebSocket : NSObject, NSStreamDelegate { inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) } + #if swift(>=3) + #else if let cipherSuites = self.enabledSSLCipherSuites { if let sslContextIn = CFReadStreamCopyProperty(inputStream, kCFStreamPropertySSLContext) as! SSLContextRef?, sslContextOut = CFWriteStreamCopyProperty(outputStream, kCFStreamPropertySSLContext) as! SSLContextRef? { @@ -297,6 +302,7 @@ public class WebSocket : NSObject, NSStreamDelegate { } } } + #endif CFReadStreamSetDispatchQueue(inStream, WebSocket.sharedWorkQueue) CFWriteStreamSetDispatchQueue(outStream, WebSocket.sharedWorkQueue) inStream.open() @@ -308,7 +314,7 @@ public class WebSocket : NSObject, NSStreamDelegate { let bytes = UnsafePointer(data.bytes) var timeout = 5000000 //wait 5 seconds before giving up - writeQueue.addOperationWithBlock { [weak self] in + writeQueue.addOperation { [weak self] in while !outStream.hasSpaceAvailable { usleep(100) //wait until the socket is ready timeout -= 100 @@ -324,12 +330,13 @@ public class WebSocket : NSObject, NSStreamDelegate { } } //delegate for the stream methods. Processes incoming bytes - public func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { - + public func stream(aStream: NSStream, handle eventCode: NSStreamEvent) { + #if swift(>=3) + #else if let sec = security where !certValidated && [.HasBytesAvailable, .HasSpaceAvailable].contains(eventCode) { - let possibleTrust: AnyObject? = aStream.propertyForKey(kCFStreamPropertySSLPeerTrust as String) + let possibleTrust: AnyObject? = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as String) if let trust: AnyObject = possibleTrust { - let domain: AnyObject? = aStream.propertyForKey(kCFStreamSSLPeerName as String) + let domain: AnyObject? = aStream.property(forKey: kCFStreamSSLPeerName as String) if sec.isValid(trust as! SecTrustRef, domain: domain as! String?) { certValidated = true } else { @@ -339,13 +346,14 @@ public class WebSocket : NSObject, NSStreamDelegate { } } } - if eventCode == .HasBytesAvailable { + #endif + if eventCode == .hasBytesAvailable { if aStream == inputStream { processInputStream() } - } else if eventCode == .ErrorOccurred { + } else if eventCode == .errorOccurred { disconnectStream(aStream.streamError) - } else if eventCode == .EndEncountered { + } else if eventCode == .endEncountered { disconnectStream(nil) } } @@ -399,7 +407,7 @@ public class WebSocket : NSObject, NSStreamDelegate { var work = data if let fragBuffer = fragBuffer { let combine = NSMutableData(data: fragBuffer) - combine.appendData(data) + combine.append(data) work = combine self.fragBuffer = nil } @@ -525,7 +533,7 @@ public class WebSocket : NSObject, NSStreamDelegate { extra = 0 } response.bytesLeft -= len - response.buffer?.appendData(NSData(bytes: buffer, length: len)) + response.buffer?.append(NSData(bytes: buffer, length: len)) processResponse(response) let offset = bufferLen - extra if extra > 0 { @@ -659,7 +667,7 @@ public class WebSocket : NSObject, NSStreamDelegate { writeError(errCode) return } - response!.buffer!.appendData(data) + response!.buffer!.append(data) } if let response = response { response.bytesLeft -= Int(len) @@ -740,7 +748,7 @@ public class WebSocket : NSObject, NSStreamDelegate { } ///used to write things to the stream private func dequeueWrite(data: NSData, code: OpCode) { - writeQueue.addOperationWithBlock { [weak self] in + writeQueue.addOperation { [weak self] in //stream isn't ready, let's wait guard let s = self else { return } var offset = 2 @@ -817,6 +825,8 @@ public class WebSocket : NSObject, NSStreamDelegate { } +#if swift(>=3) +#else public class SSLCert { var certData: NSData? var key: SecKeyRef? @@ -1049,4 +1059,5 @@ public class SSLSecurity { } -} \ No newline at end of file +} +#endif \ No newline at end of file