From 4d4362b25080bddf353596bd61b8ae971600b1dc Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 25 Mar 2016 12:59:50 -0400 Subject: [PATCH 01/54] work on swift3 syntax --- .travis.yml | 3 + Source/SocketEngine.swift | 52 +++++----- Source/SocketEnginePollable.swift | 16 ++-- Source/SocketEngineSpec.swift | 18 ++-- Source/SocketIOClient.swift | 22 ++--- Source/SocketIOClientOption.swift | 152 +++++++++++++++--------------- Source/SocketLogger.swift | 2 +- Source/SocketPacket.swift | 4 +- Source/SocketParsable.swift | 8 +- Source/SocketStringReader.swift | 12 +-- Source/SwiftRegex.swift | 41 ++++---- Source/WebSocket.swift | 49 ++++++---- 12 files changed, 196 insertions(+), 183 deletions(-) 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 From 199b9962f09e1317b9616364404f486f5569b763 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 25 Mar 2016 13:11:28 -0400 Subject: [PATCH 02/54] swift3 naming --- Source/SocketAckEmitter.swift | 4 +-- Source/SocketEngine.swift | 24 ++++++------- Source/SocketEnginePacketType.swift | 2 +- Source/SocketEnginePollable.swift | 2 +- Source/SocketEngineSpec.swift | 2 +- Source/SocketEngineWebsocket.swift | 2 +- Source/SocketIOClient.swift | 54 ++++++++++++++--------------- Source/SocketIOClientStatus.swift | 10 +++--- 8 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Source/SocketAckEmitter.swift b/Source/SocketAckEmitter.swift index edb2522..aab2c84 100644 --- a/Source/SocketAckEmitter.swift +++ b/Source/SocketAckEmitter.swift @@ -36,12 +36,12 @@ public final class SocketAckEmitter : NSObject { public func with(items: AnyObject...) { guard ackNum != -1 else { return } - socket.emitAck(ackNum, withItems: items) + socket.emitAck(ackNum, with: items) } public func with(items: [AnyObject]) { guard ackNum != -1 else { return } - socket.emitAck(ackNum, withItems: items) + socket.emitAck(ackNum, with: items) } } diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index a26434d..978680d 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -290,15 +290,15 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } if websocket { - sendWebSocketMessage("", withType: .Close, withData: []) + sendWebSocketMessage("", withType: .close, withData: []) postSendClose(nil, nil, nil) } else { // We need to take special care when we're polling that we send it ASAP // Also make sure we're on the emitQueue since we're touching postWait dispatch_sync(emitQueue) { - self.postWait.append(String(SocketEnginePacketType.Close.rawValue)) + self.postWait.append(String(SocketEnginePacketType.close.rawValue)) let req = self.createRequestForPostWithPostWait() - self.doRequest(req, withCallback: postSendClose) + self.doRequest(req, callbackWith: postSendClose) } } } @@ -309,7 +309,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe "we'll probably disconnect soon. You should report this.", type: logType) } - sendWebSocketMessage("", withType: .Upgrade, withData: []) + sendWebSocketMessage("", withType: .upgrade, withData: []) websocket = true polling = false fastUpgrade = false @@ -425,22 +425,22 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe return } - if fromPolling && type != .Noop && doubleEncodeUTF8 { + if fromPolling && type != .noop && doubleEncodeUTF8 { fixedString = fixDoubleUTF8(message) } else { fixedString = message } switch type { - case .Message: + case .message: handleMessage(fixedString[fixedString.startIndex.successor().. Void) { + func doRequest(req: NSURLRequest, callbackWith callback: (NSData?, NSURLResponse?, NSError?) -> Void) { if !polling || closed || invalidated || fastUpgrade { DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEnginePolling") return diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index 2002c83..82485eb 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -109,6 +109,6 @@ extension SocketEngineSpec { /// Send an engine message (4) func send(msg: String, withData datas: [NSData]) { - write(msg, withType: .Message, withData: datas) + write(msg, withType: .message, withData: datas) } } diff --git a/Source/SocketEngineWebsocket.swift b/Source/SocketEngineWebsocket.swift index a173250..d6c777a 100644 --- a/Source/SocketEngineWebsocket.swift +++ b/Source/SocketEngineWebsocket.swift @@ -36,7 +36,7 @@ public protocol SocketEngineWebsocket : SocketEngineSpec, WebSocketDelegate { extension SocketEngineWebsocket { func probeWebSocket() { if ws?.isConnected ?? false { - sendWebSocketMessage("probe", withType: .Ping, withData: []) + sendWebSocketMessage("probe", withType: .ping, withData: []) } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index d593616..2e8bc18 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -28,10 +28,10 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public let socketURL: NSURL public private(set) var engine: SocketEngineSpec? - public private(set) var status = SocketIOClientStatus.NotConnected { + public private(set) var status = SocketIOClientStatus.notConnected { didSet { switch status { - case .Connected: + case .connected: reconnecting = false currentReconnectAttempt = 0 default: @@ -123,20 +123,20 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Connect to the server. public func connect() { - connect(timeoutAfter: 0, withTimeoutHandler: nil) + connect(timeoutAfter: 0, handleWith: nil) } /// Connect to the server. If we aren't connected after timeoutAfter, call handler - public func connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?) { + public func connect(timeoutAfter timeoutAfter: Int, handleWith handler: (() -> Void)?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") - guard status != .Connected else { + guard status != .connected else { DefaultSocketLogger.Logger.log("Tried connecting on an already connected socket", type: logType) return } - status = .Connecting + status = .connecting if engine == nil || forceNew { addEngine().connect() @@ -149,8 +149,8 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) dispatch_after(time, handleQueue) {[weak self] in - if let this = self where this.status != .Connected && this.status != .Closed { - this.status = .Closed + if let this = self where this.status != .connected && this.status != .closed { + this.status = .closed this.engine?.disconnect("Connect timeout") handler?() @@ -182,7 +182,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable func didConnect() { DefaultSocketLogger.Logger.log("Socket connected", type: logType) - status = .Connected + status = .connected // Don't handle as internal because something crazy could happen where // we disconnect before it's handled @@ -190,11 +190,11 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } func didDisconnect(reason: String) { - guard status != .Closed else { return } + guard status != .closed else { return } DefaultSocketLogger.Logger.log("Disconnected: %@", type: logType, args: reason) - status = .Closed + status = .closed reconnects = false // Make sure the engine is actually dead. @@ -213,12 +213,12 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Send a message to the server public func emit(event: String, _ items: AnyObject...) { - emit(event, withItems: items) + emit(event, with: items) } /// Same as emit, but meant for Objective-C - public func emit(event: String, withItems items: [AnyObject]) { - guard status == .Connected else { + public func emit(event: String, with items: [AnyObject]) { + guard status == .connected else { handleEvent("error", data: ["Tried emitting \(event) when not connected"], isInternalMessage: true) return } @@ -233,18 +233,18 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable an ack. */ public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { - return emitWithAck(event, withItems: items) + return emitWithAck(event, with: items) } /** Same as emitWithAck, but for Objective-C */ - public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { + public func emitWithAck(event: String, with items: [AnyObject]) -> OnAckCallback { return createOnAck([event] + items) } private func _emit(data: [AnyObject], ack: Int? = nil) { - guard status == .Connected else { + guard status == .connected else { handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true) return } @@ -258,9 +258,9 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } // If the server wants to know that the client received data - func emitAck(ack: Int, withItems items: [AnyObject]) { + func emitAck(ack: Int, with items: [AnyObject]) { dispatch_async(emitQueue) { - if self.status == .Connected { + if self.status == .connected { let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) let str = packet.packetString @@ -274,15 +274,15 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func engineDidClose(reason: String) { waitingPackets.removeAll() - if status != .Closed { - status = .NotConnected + if status != .closed { + status = .notConnected } - if status == .Closed || !reconnects { + if status == .closed || !reconnects { didDisconnect(reason) } else if !reconnecting { reconnecting = true - tryReconnectWithReason(reason) + tryReconnect(reason: reason) } } @@ -295,7 +295,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable // Called when the socket gets an ack for something it sent func handleAck(ack: Int, data: [AnyObject]) { - guard status == .Connected else {return} + guard status == .connected else {return} DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "") @@ -304,7 +304,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Causes an event to be handled. Only use if you know what you're doing. public func handleEvent(event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int = -1) { - guard status == .Connected || isInternalMessage else { + guard status == .connected || isInternalMessage else { return } @@ -412,7 +412,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handlers.removeAll(keepingCapacity: false) } - private func tryReconnectWithReason(reason: String) { + private func tryReconnect(reason reason: String) { if reconnecting { DefaultSocketLogger.Logger.log("Starting reconnect", type: logType) handleEvent("reconnect", data: [reason], isInternalMessage: true) @@ -452,7 +452,7 @@ extension SocketIOClient { } func setTestable() { - status = .Connected + status = .connected } func setTestEngine(engine: SocketEngineSpec?) { diff --git a/Source/SocketIOClientStatus.swift b/Source/SocketIOClientStatus.swift index 09626b8..7b91152 100644 --- a/Source/SocketIOClientStatus.swift +++ b/Source/SocketIOClientStatus.swift @@ -25,17 +25,17 @@ import Foundation @objc public enum SocketIOClientStatus : Int, CustomStringConvertible { - case NotConnected, Closed, Connecting, Connected + case notConnected, closed, connecting, connected public var description: String { switch self { - case NotConnected: + case notConnected: return "Not Connected" - case Closed: + case closed: return "Closed" - case Connecting: + case connecting: return "Connecting" - case Connected: + case connected: return "Connected" } } From e2db1a086d6ee7e65c3d873ee626ca1a38825e2d Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 16 Apr 2016 12:00:21 -0400 Subject: [PATCH 03/54] update for latest swift 3 --- SocketIO-MacTests/SocketBasicPacketTest.swift | 36 ++--- .../SocketNamespacePacketTest.swift | 34 ++--- SocketIO-MacTests/SocketObjectiveCTest.m | 2 +- SocketIO-MacTests/SocketParserTest.swift | 30 ++-- SocketIO-MacTests/SocketSideEffectTest.swift | 8 +- Source/SocketAckEmitter.swift | 4 +- Source/SocketAckManager.swift | 6 +- Source/SocketEngine.swift | 72 ++++----- Source/SocketEngineClient.swift | 4 +- Source/SocketEnginePollable.swift | 34 ++--- Source/SocketEngineSpec.swift | 14 +- Source/SocketEngineWebsocket.swift | 10 +- Source/SocketIOClient.swift | 60 ++++---- Source/SocketIOClientOption.swift | 4 +- Source/SocketIOClientSpec.swift | 6 +- Source/SocketLogger.swift | 10 +- Source/SocketPacket.swift | 12 +- Source/SocketParsable.swift | 30 ++-- Source/SocketStringReader.swift | 16 +- Source/SwiftRegex.swift | 26 ++-- Source/WebSocket.swift | 137 +++++++++--------- 21 files changed, 281 insertions(+), 274 deletions(-) diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index d9ed590..c8ef466 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -10,13 +10,13 @@ import XCTest @testable import SocketIOClientSwift class SocketBasicPacketTest: XCTestCase { - let data = "test".data(usingEncoding: NSUTF8StringEncoding)! - let data2 = "test2".data(usingEncoding: NSUTF8StringEncoding)! + let data = "test".data(using: NSUTF8StringEncoding)! + let data2 = "test2".data(using: NSUTF8StringEncoding)! func testEmpyEmit() { let expectedSendString = "2[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -24,7 +24,7 @@ class SocketBasicPacketTest: XCTestCase { func testNullEmit() { let expectedSendString = "2[\"test\",null]" let sendData = ["test", NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -32,7 +32,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmit() { let expectedSendString = "2[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -40,7 +40,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmitWithQuotes() { let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]" let sendData = ["test", "\"he\"llo world\""] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -48,7 +48,7 @@ class SocketBasicPacketTest: XCTestCase { func testJSONEmit() { let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -56,7 +56,7 @@ class SocketBasicPacketTest: XCTestCase { func testArrayEmit() { let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" let sendData = ["test", ["hello", 1, ["test": "test"]]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -64,7 +64,7 @@ class SocketBasicPacketTest: XCTestCase { func testBinaryEmit() { let expectedSendString = "51-[\"test\",{\"num\":0,\"_placeholder\":true}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -73,7 +73,7 @@ class SocketBasicPacketTest: XCTestCase { func testMultipleBinaryEmit() { let expectedSendString = "52-[\"test\",{\"data1\":{\"num\":0,\"_placeholder\":true},\"data2\":{\"num\":1,\"_placeholder\":true}}]" let sendData = ["test", ["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -82,7 +82,7 @@ class SocketBasicPacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "20[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -90,7 +90,7 @@ class SocketBasicPacketTest: XCTestCase { func testEmitDataWithAck() { let expectedSendString = "51-0[\"test\",{\"num\":0,\"_placeholder\":true}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -99,7 +99,7 @@ class SocketBasicPacketTest: XCTestCase { // Acks func testEmptyAck() { let expectedSendString = "30[]" - let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(items: [], id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -107,7 +107,7 @@ class SocketBasicPacketTest: XCTestCase { func testNullAck() { let expectedSendString = "30[null]" let sendData = [NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -115,7 +115,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringAck() { let expectedSendString = "30[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -123,7 +123,7 @@ class SocketBasicPacketTest: XCTestCase { func testJSONAck() { let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -131,7 +131,7 @@ class SocketBasicPacketTest: XCTestCase { func testBinaryAck() { let expectedSendString = "61-0[{\"num\":0,\"_placeholder\":true}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -140,7 +140,7 @@ class SocketBasicPacketTest: XCTestCase { func testMultipleBinaryAck() { let expectedSendString = "62-0[{\"data2\":{\"num\":0,\"_placeholder\":true},\"data1\":{\"num\":1,\"_placeholder\":true}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) diff --git a/SocketIO-MacTests/SocketNamespacePacketTest.swift b/SocketIO-MacTests/SocketNamespacePacketTest.swift index 54f72e9..4f5315b 100644 --- a/SocketIO-MacTests/SocketNamespacePacketTest.swift +++ b/SocketIO-MacTests/SocketNamespacePacketTest.swift @@ -10,13 +10,13 @@ import XCTest @testable import SocketIOClientSwift class SocketNamespacePacketTest: XCTestCase { - let data = "test".data(usingEncoding: NSUTF8StringEncoding)! - let data2 = "test2".data(usingEncoding: NSUTF8StringEncoding)! + let data = "test".data(using: NSUTF8StringEncoding)! + let data2 = "test2".data(using: NSUTF8StringEncoding)! func testEmpyEmit() { let expectedSendString = "2/swift,[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -24,7 +24,7 @@ class SocketNamespacePacketTest: XCTestCase { func testNullEmit() { let expectedSendString = "2/swift,[\"test\",null]" let sendData = ["test", NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -32,7 +32,7 @@ class SocketNamespacePacketTest: XCTestCase { func testStringEmit() { let expectedSendString = "2/swift,[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -40,7 +40,7 @@ class SocketNamespacePacketTest: XCTestCase { func testJSONEmit() { let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -48,7 +48,7 @@ class SocketNamespacePacketTest: XCTestCase { func testArrayEmit() { let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" let sendData = ["test", ["hello", 1, ["test": "test"]]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -56,7 +56,7 @@ class SocketNamespacePacketTest: XCTestCase { func testBinaryEmit() { let expectedSendString = "51-/swift,[\"test\",{\"num\":0,\"_placeholder\":true}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -65,7 +65,7 @@ class SocketNamespacePacketTest: XCTestCase { func testMultipleBinaryEmit() { let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"num\":0,\"_placeholder\":true},\"data2\":{\"num\":1,\"_placeholder\":true}}]" let sendData = ["test", ["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -74,7 +74,7 @@ class SocketNamespacePacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "2/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -82,7 +82,7 @@ class SocketNamespacePacketTest: XCTestCase { func testEmitDataWithAck() { let expectedSendString = "51-/swift,0[\"test\",{\"num\":0,\"_placeholder\":true}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -91,7 +91,7 @@ class SocketNamespacePacketTest: XCTestCase { // Acks func testEmptyAck() { let expectedSendString = "3/swift,0[]" - let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(items: [], id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -99,7 +99,7 @@ class SocketNamespacePacketTest: XCTestCase { func testNullAck() { let expectedSendString = "3/swift,0[null]" let sendData = [NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -107,7 +107,7 @@ class SocketNamespacePacketTest: XCTestCase { func testStringAck() { let expectedSendString = "3/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -115,7 +115,7 @@ class SocketNamespacePacketTest: XCTestCase { func testJSONAck() { let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -123,7 +123,7 @@ class SocketNamespacePacketTest: XCTestCase { func testBinaryAck() { let expectedSendString = "61-/swift,0[{\"num\":0,\"_placeholder\":true}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -132,7 +132,7 @@ class SocketNamespacePacketTest: XCTestCase { func testMultipleBinaryAck() { let expectedSendString = "62-/swift,0[{\"data2\":{\"num\":0,\"_placeholder\":true},\"data1\":{\"num\":1,\"_placeholder\":true}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) diff --git a/SocketIO-MacTests/SocketObjectiveCTest.m b/SocketIO-MacTests/SocketObjectiveCTest.m index 6fbbcbe..95b49be 100644 --- a/SocketIO-MacTests/SocketObjectiveCTest.m +++ b/SocketIO-MacTests/SocketObjectiveCTest.m @@ -39,7 +39,7 @@ } - (void)testOffSyntax { - [self.socket off:@"test"]; + [self.socket offWithEvent:@"test"]; } @end diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index 7cbe982..44a8fca 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -30,72 +30,72 @@ class SocketParserTest: XCTestCase { func testDisconnect() { let message = "1" - validateParseResult(message) + validateParseResult(message: message) } func testConnect() { let message = "0" - validateParseResult(message) + validateParseResult(message: message) } func testDisconnectNameSpace() { let message = "1/swift" - validateParseResult(message) + validateParseResult(message: message) } func testConnecttNameSpace() { let message = "0/swift" - validateParseResult(message) + validateParseResult(message: message) } func testIdEvent() { let message = "25[\"test\"]" - validateParseResult(message) + validateParseResult(message: message) } func testBinaryPlaceholderAsString() { let message = "2[\"test\",\"~~0\"]" - validateParseResult(message) + validateParseResult(message: message) } func testNameSpaceArrayParse() { let message = "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]" - validateParseResult(message) + validateParseResult(message: message) } func testNameSpaceArrayAckParse() { let message = "3/swift,0[[\"test3\",\"test4\"]]" - validateParseResult(message) + validateParseResult(message: message) } func testNameSpaceBinaryEventParse() { let message = "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" - validateParseResult(message) + validateParseResult(message: message) } func testNameSpaceBinaryAckParse() { let message = "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" - validateParseResult(message) + validateParseResult(message: message) } func testNamespaceErrorParse() { let message = "4/swift," - validateParseResult(message) + validateParseResult(message: message) } func testErrorTypeString() { let message = "4\"ERROR\"" - validateParseResult(message) + validateParseResult(message: message) } func testErrorTypeDictionary() { let message = "4{\"test\":2}" - validateParseResult(message) + validateParseResult(message: message) } func testErrorTypeInt() { let message = "41" - validateParseResult(message) + validateParseResult(message: message) } func testInvalidInput() { @@ -110,7 +110,7 @@ class SocketParserTest: XCTestCase { func testGenericParser() { var parser = SocketStringReader(message: "61-/swift,") - XCTAssertEqual(parser.read(1), "6") + XCTAssertEqual(parser.read(length: 1), "6") XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") XCTAssertEqual(parser.currentCharacter, "/") diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 2f3db98..a536693 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -10,8 +10,8 @@ import XCTest @testable import SocketIOClientSwift class SocketSideEffectTest: XCTestCase { - let data = "test".data(usingEncoding: NSUTF8StringEncoding)! - let data2 = "test2".data(usingEncoding: NSUTF8StringEncoding)! + let data = "test".data(using: NSUTF8StringEncoding)! + let data2 = "test2".data(using: NSUTF8StringEncoding)! private var socket: SocketIOClient! override func setUp() { @@ -83,7 +83,7 @@ class SocketSideEffectTest: XCTestCase { func testHandleOnceEvent() { let expect = expectation(withDescription: "handled event") - socket.once("test") {data, ack in + socket.once(event: "test") {data, ack in XCTAssertEqual(data[0] as? String, "hello world") XCTAssertEqual(self.socket.testHandlers.count, 0) expect.fulfill() @@ -98,7 +98,7 @@ class SocketSideEffectTest: XCTestCase { XCTAssertEqual(socket.testHandlers.count, 1) socket.on("test") {data, ack in } XCTAssertEqual(socket.testHandlers.count, 2) - socket.off("test") + socket.off(event: "test") XCTAssertEqual(socket.testHandlers.count, 0) } diff --git a/Source/SocketAckEmitter.swift b/Source/SocketAckEmitter.swift index aab2c84..980a678 100644 --- a/Source/SocketAckEmitter.swift +++ b/Source/SocketAckEmitter.swift @@ -33,13 +33,13 @@ public final class SocketAckEmitter : NSObject { self.ackNum = ackNum } - public func with(items: AnyObject...) { + public func with(_ items: AnyObject...) { guard ackNum != -1 else { return } socket.emitAck(ackNum, with: items) } - public func with(items: [AnyObject]) { + public func with(_ items: [AnyObject]) { guard ackNum != -1 else { return } socket.emitAck(ackNum, with: items) diff --git a/Source/SocketAckManager.swift b/Source/SocketAckManager.swift index 972e1da..341013c 100644 --- a/Source/SocketAckManager.swift +++ b/Source/SocketAckManager.swift @@ -52,11 +52,11 @@ private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool { struct SocketAckManager { private var acks = Set(minimumCapacity: 1) - mutating func addAck(ack: Int, callback: AckCallback) { + mutating func addAck(_ ack: Int, callback: AckCallback) { acks.insert(SocketAck(ack: ack, callback: callback)) } - mutating func executeAck(ack: Int, items: [AnyObject]) { + mutating func executeAck(_ ack: Int, items: [AnyObject]) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { @@ -64,7 +64,7 @@ struct SocketAckManager { } } - mutating func timeoutAck(ack: Int) { + mutating func timeoutAck(_ ack: Int) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 978680d..1583792 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -128,8 +128,8 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe stopPolling() } - private func checkAndHandleEngineError(msg: String) { - guard let stringData = msg.data(usingEncoding: NSUTF8StringEncoding, + private func checkAndHandleEngineError(_ msg: String) { + guard let stringData = msg.data(using: NSUTF8StringEncoding, allowLossyConversion: false) else { return } do { @@ -140,28 +140,28 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe switch code { case 0: // Unknown transport - didError(error) + didError(error: error) case 1: // Unknown sid. - didError(error) + didError(error: error) case 2: // Bad handshake request - didError(error) + didError(error: error) case 3: // Bad request - didError(error) + didError(error: error) default: - didError(error) + didError(error: error) } } } catch { - didError("Got unknown error from server \(msg)") + didError(error: "Got unknown error from server \(msg)") } } - private func checkIfMessageIsBase64Binary(message: String) -> Bool { + private func checkIfMessageIsBase64Binary(_ message: String) -> Bool { if message.hasPrefix("b4") { // binary in base64 string let noPrefix = message[message.startIndex.advanced(by: 2).. (NSURL, NSURL) { @@ -267,12 +267,12 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe public func didError(error: String) { DefaultSocketLogger.Logger.error(error, type: logType) - client?.engineDidError(error) - disconnect(error) + client?.engineDidError(reason: error) + disconnect(reason: error) } public func disconnect(reason: String) { - func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) { + func postSendClose(_ data: NSData?, _ res: NSURLResponse?, _ err: NSError?) { sid = "" closed = true invalidated = true @@ -280,7 +280,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe ws?.disconnect() stopPolling() - client?.engineDidClose(reason) + client?.engineDidClose(reason: reason) } DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) @@ -298,7 +298,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe dispatch_sync(emitQueue) { self.postWait.append(String(SocketEnginePacketType.close.rawValue)) let req = self.createRequestForPostWithPostWait() - self.doRequest(req, callbackWith: postSendClose) + self.doRequest(for: req, callbackWith: postSendClose) } } } @@ -339,17 +339,17 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe guard let ws = self.ws else { return } for msg in postWait { - ws.writeString(fixDoubleUTF8(msg)) + ws.writeString(str: fixDoubleUTF8(string: msg)) } postWait.removeAll(keepingCapacity: true) } private func handleClose(reason: String) { - client?.engineDidClose(reason) + client?.engineDidClose(reason: reason) } - private func handleMessage(message: String) { + private func handleMessage(_ message: String) { client?.parseEngineMessage(message) } @@ -357,8 +357,8 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe doPoll() } - private func handleOpen(openData: String) { - let mesData = openData.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false)! + private func handleOpen(openMessage: String) { + let mesData = openMessage.data(using: NSUTF8StringEncoding, allowLossyConversion: false)! do { let json = try NSJSONSerialization.jsonObject(with: mesData, options: NSJSONReadingOptions.allowFragments) as? NSDictionary @@ -389,10 +389,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe doPoll() } - client?.engineDidOpen?("Connect") + client?.engineDidOpen?(reason: "Connect") } } catch { - didError("Error parsing open packet") + didError(error: "Error parsing open packet") return } } @@ -406,12 +406,12 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } } - public func parseEngineData(data: NSData) { + public func parseEngineData(_ data: NSData) { DefaultSocketLogger.Logger.log("Got binary data: %@", type: "SocketEngine", args: data) client?.parseEngineBinaryData(data.subdata(with: NSMakeRange(1, data.length - 1))) } - public func parseEngineMessage(message: String, fromPolling: Bool) { + public func parseEngineMessage(_ message: String, fromPolling: Bool) { DefaultSocketLogger.Logger.log("Got message: %@", type: logType, args: message) let reader = SocketStringReader(message: message) @@ -426,7 +426,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } if fromPolling && type != .noop && doubleEncodeUTF8 { - fixedString = fixDoubleUTF8(message) + fixedString = fixDoubleUTF8(string: message) } else { fixedString = message } @@ -437,11 +437,11 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe case .noop: handleNOOP() case .pong: - handlePong(fixedString) + handlePong(pongMessage: fixedString) case .open: - handleOpen(fixedString[fixedString.startIndex.successor().. pongsMissedMax { - client?.engineDidClose("Ping timeout") + client?.engineDidClose(reason: "Ping timeout") return } @@ -498,7 +498,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } /// Write a message, independent of transport. - public func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) { + public func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) { dispatch_async(emitQueue) { guard self.connected else { return } @@ -532,7 +532,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe probing = false if closed { - client?.engineDidClose("Disconnect") + client?.engineDidClose(reason: "Disconnect") return } @@ -543,10 +543,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe let reason = error?.localizedDescription ?? "Socket Disconnected" if error != nil { - didError(reason) + didError(error: reason) } - client?.engineDidClose(reason) + client?.engineDidClose(reason: reason) } else { flushProbeWait() } diff --git a/Source/SocketEngineClient.swift b/Source/SocketEngineClient.swift index a1db7f6..76f22de 100644 --- a/Source/SocketEngineClient.swift +++ b/Source/SocketEngineClient.swift @@ -29,6 +29,6 @@ import Foundation func engineDidError(reason: String) func engineDidClose(reason: String) optional func engineDidOpen(reason: String) - func parseEngineMessage(msg: String) - func parseEngineBinaryData(data: NSData) + func parseEngineMessage(_ msg: String) + func parseEngineBinaryData(_ data: NSData) } diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 5fe3c1c..022d8f9 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -39,13 +39,13 @@ public protocol SocketEnginePollable : SocketEngineSpec { var waitingForPost: Bool { get set } func doPoll() - func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) + func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) func stopPolling() } // Default polling methods extension SocketEnginePollable { - private func addHeaders(req: NSMutableURLRequest) { + private func addHeaders(for req: NSMutableURLRequest) { if cookies != nil { let headers = NSHTTPCookie.requestHeaderFields(with: cookies!) req.allHTTPHeaderFields = headers @@ -73,12 +73,12 @@ extension SocketEnginePollable { let req = NSMutableURLRequest(url: urlPollingWithSid) - addHeaders(req) + addHeaders(for: req) req.httpMethod = "POST" req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type") - let postData = postStr.data(usingEncoding: NSUTF8StringEncoding, + let postData = postStr.data(using: NSUTF8StringEncoding, allowLossyConversion: false)! req.httpBody = postData @@ -95,11 +95,11 @@ extension SocketEnginePollable { waitingForPoll = true let req = NSMutableURLRequest(url: urlPollingWithSid) - addHeaders(req) - doLongPoll(req) + addHeaders(for: req) + doLongPoll(for: req) } - func doRequest(req: NSURLRequest, callbackWith callback: (NSData?, NSURLResponse?, NSError?) -> Void) { + func doRequest(for req: NSURLRequest, callbackWith callback: (NSData?, NSURLResponse?, NSError?) -> Void) { if !polling || closed || invalidated || fastUpgrade { DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEnginePolling") return @@ -110,15 +110,15 @@ extension SocketEnginePollable { session?.dataTask(with: req, completionHandler: callback).resume() } - func doLongPoll(req: NSURLRequest) { - doRequest(req) {[weak self] data, res, err in + func doLongPoll(for req: NSURLRequest) { + doRequest(for: req) {[weak self] data, res, err in guard let this = self where this.polling else { return } if err != nil || data == nil { DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { - this.didError(err?.localizedDescription ?? "Error") + this.didError(error: err?.localizedDescription ?? "Error") } return @@ -156,14 +156,14 @@ extension SocketEnginePollable { DefaultSocketLogger.Logger.log("POSTing", type: "SocketEnginePolling") - doRequest(req) {[weak self] data, res, err in + doRequest(for: req) {[weak self] data, res, err in guard let this = self else { return } if err != nil { DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { - this.didError(err?.localizedDescription ?? "Error") + this.didError(error: err?.localizedDescription ?? "Error") } return @@ -180,14 +180,14 @@ extension SocketEnginePollable { } } - func parsePollingMessage(str: String) { + func parsePollingMessage(_ str: String) { guard str.characters.count != 1 else { return } var reader = SocketStringReader(message: str) while reader.hasNext { if let n = Int(reader.readUntilStringOccurence(":")) { - let str = reader.read(n) + let str = reader.read(length: n) dispatch_async(handleQueue) { self.parseEngineMessage(str, fromPolling: true) @@ -203,12 +203,12 @@ extension SocketEnginePollable { /// Send polling message. /// Only call on emitQueue - public func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { + public func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEnginePolling", args: message, type.rawValue) let fixedMessage: String if doubleEncodeUTF8 { - fixedMessage = doubleEncodeUTF8(message) + fixedMessage = doubleEncodeUTF8(string: message) } else { fixedMessage = message } @@ -218,7 +218,7 @@ extension SocketEnginePollable { postWait.append(strMsg) for data in datas { - if case let .Right(bin) = createBinaryDataForSend(data) { + if case let .Right(bin) = createBinaryDataForSend(using: data) { postWait.append(bin) } } diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index 418400d..f1224bd 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -55,9 +55,9 @@ import Foundation func disconnect(reason: String) func doFastUpgrade() func flushWaitingForPostToWebSocket() - func parseEngineData(data: NSData) - func parseEngineMessage(message: String, fromPolling: Bool) - func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) + func parseEngineData(_ data: NSData) + func parseEngineMessage(_ message: String, fromPolling: Bool) + func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) } extension SocketEngineSpec { @@ -75,7 +75,7 @@ extension SocketEngineSpec { return com.url! } - func createBinaryDataForSend(data: NSData) -> Either { + func createBinaryDataForSend(using data: NSData) -> Either { if websocket { var byteArray = [UInt8](repeating: 0x4, count: 1) let mutData = NSMutableData(bytes: &byteArray, length: 1) @@ -91,7 +91,7 @@ extension SocketEngineSpec { } func doubleEncodeUTF8(string: String) -> String { - if let latin1 = string.data(usingEncoding: NSUTF8StringEncoding), + if let latin1 = string.data(using: NSUTF8StringEncoding), utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding) { return utf8 as String } else { @@ -100,7 +100,7 @@ extension SocketEngineSpec { } func fixDoubleUTF8(string: String) -> String { - if let utf8 = string.data(usingEncoding: NSISOLatin1StringEncoding), + if let utf8 = string.data(using: NSISOLatin1StringEncoding), latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding) { return latin1 as String } else { @@ -109,7 +109,7 @@ extension SocketEngineSpec { } /// Send an engine message (4) - func send(msg: String, withData datas: [NSData]) { + func send(_ msg: String, withData datas: [NSData]) { write(msg, withType: .message, withData: datas) } } diff --git a/Source/SocketEngineWebsocket.swift b/Source/SocketEngineWebsocket.swift index d6c777a..1360a67 100644 --- a/Source/SocketEngineWebsocket.swift +++ b/Source/SocketEngineWebsocket.swift @@ -29,7 +29,7 @@ import Foundation public protocol SocketEngineWebsocket : SocketEngineSpec, WebSocketDelegate { var ws: WebSocket? { get } - func sendWebSocketMessage(str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) + func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) } // WebSocket methods @@ -42,14 +42,14 @@ extension SocketEngineWebsocket { /// Send message on WebSockets /// Only call on emitQueue - public func sendWebSocketMessage(str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { + public func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { DefaultSocketLogger.Logger.log("Sending ws: %@ as type: %@", type: "SocketEngine", args: str, type.rawValue) - ws?.writeString("\(type.rawValue)\(str)") + ws?.writeString(str: "\(type.rawValue)\(str)") for data in datas { - if case let .Left(bin) = createBinaryDataForSend(data) { - ws?.writeData(bin) + if case let .Left(bin) = createBinaryDataForSend(using: data) { + ws?.writeData(data: bin) } } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 9e3f3d4..cc5fa0e 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -71,7 +71,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable self.socketURL = socketURL if socketURL.absoluteString.hasPrefix("https://") { - self.options.insertIgnore(.secure(true)) + self.options.insertIgnore(element: .secure(true)) } for option in options { @@ -97,7 +97,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } } - self.options.insertIgnore(.path("/socket.io/")) + self.options.insertIgnore(element: .path("/socket.io/")) super.init() } @@ -110,7 +110,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable deinit { DefaultSocketLogger.Logger.log("Client is being released", type: logType) - engine?.disconnect("Client Deinit") + engine?.disconnect(reason: "Client Deinit") } private func addEngine() -> SocketEngineSpec { @@ -127,7 +127,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Connect to the server. If we aren't connected after timeoutAfter, call handler - public func connect(timeoutAfter timeoutAfter: Int, handleWith handler: (() -> Void)?) { + public func connect(timeoutAfter: Int, handleWith handler: (() -> Void)?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") guard status != .connected else { @@ -151,7 +151,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable dispatch_after(time, handleQueue) {[weak self] in if let this = self where this.status != .connected && this.status != .closed { this.status = .closed - this.engine?.disconnect("Connect timeout") + this.engine?.disconnect(reason: "Connect timeout") handler?() } @@ -164,7 +164,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return {[weak self, ack = currentAck] timeout, callback in if let this = self { this.ackHandlers.addAck(ack, callback: callback) - this._emit(items, ack: ack) + this._emit(data: items, ack: ack) if timeout != 0 { let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) @@ -195,7 +195,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable reconnects = false // Make sure the engine is actually dead. - engine?.disconnect(reason) + engine?.disconnect(reason: reason) handleEvent("disconnect", data: [reason], isInternalMessage: true) } @@ -205,33 +205,33 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DefaultSocketLogger.Logger.log("Closing socket", type: logType) reconnects = false - didDisconnect("Disconnect") + didDisconnect(reason: "Disconnect") } /// Send a message to the server - public func emit(event: String, _ items: AnyObject...) { + public func emit(_ event: String, _ items: AnyObject...) { emit(event, with: items) } /// Same as emit, but meant for Objective-C - public func emit(event: String, with items: [AnyObject]) { + public func emit(_ event: String, with items: [AnyObject]) { guard status == .connected else { handleEvent("error", data: ["Tried emitting \(event) when not connected"], isInternalMessage: true) return } - _emit([event] + items) + _emit(data: [event] + items) } /// Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add /// an ack. - public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { + public func emitWithAck(_ event: String, _ items: AnyObject...) -> OnAckCallback { return emitWithAck(event, with: items) } /// Same as emitWithAck, but for Objective-C - public func emitWithAck(event: String, with items: [AnyObject]) -> OnAckCallback { - return createOnAck([event] + items) + public func emitWithAck(_ event: String, with items: [AnyObject]) -> OnAckCallback { + return createOnAck(items: [event] + items) } private func _emit(data: [AnyObject], ack: Int? = nil) { @@ -241,7 +241,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return } - let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: self.nsp, ack: false) + let packet = SocketPacket.packetFromEmit(items: data, id: ack ?? -1, nsp: self.nsp, ack: false) let str = packet.packetString DefaultSocketLogger.Logger.log("Emitting: %@", type: self.logType, args: str) @@ -251,10 +251,10 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } // If the server wants to know that the client received data - func emitAck(ack: Int, with items: [AnyObject]) { + func emitAck(_ ack: Int, with items: [AnyObject]) { dispatch_async(emitQueue) { if self.status == .connected { - let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) + let packet = SocketPacket.packetFromEmit(items: items, id: ack ?? -1, nsp: self.nsp, ack: true) let str = packet.packetString DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str) @@ -272,7 +272,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } if status == .closed || !reconnects { - didDisconnect(reason) + didDisconnect(reason: reason) } else if !reconnecting { reconnecting = true tryReconnect(reason: reason) @@ -287,7 +287,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } // Called when the socket gets an ack for something it sent - func handleAck(ack: Int, data: [AnyObject]) { + func handleAck(_ ack: Int, data: [AnyObject]) { guard status == .connected else { return } DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "") @@ -296,7 +296,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Causes an event to be handled. Only use if you know what you're doing. - public func handleEvent(event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int = -1) { + public func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int = -1) { guard status == .connected || isInternalMessage else { return } @@ -307,7 +307,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable self.anyHandler?(SocketAnyEvent(event: event, items: data)) for handler in self.handlers where handler.event == event { - handler.executeCallback(data, withAck: ack, withSocket: self) + handler.executeCallback(items: data, withAck: ack, withSocket: self) } } } @@ -321,7 +321,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Joins namespace - public func joinNamespace(namespace: String) { + public func joinNamespace(_ namespace: String) { nsp = namespace if nsp != "/" { @@ -338,7 +338,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Removes a handler with the specified UUID gotten from an `on` or `once` - public func off(id id: NSUUID) { + public func off(id: NSUUID) { DefaultSocketLogger.Logger.log("Removing handler with id: %@", type: logType, args: id) handlers = handlers.filter { $0.id != id } @@ -346,7 +346,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Adds a handler for an event. /// Returns: A unique id for the handler - public func on(event: String, callback: NormalCallback) -> NSUUID { + public func on(_ event: String, callback: NormalCallback) -> NSUUID { DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event) let handler = SocketEventHandler(event: event, id: NSUUID(), callback: callback) @@ -378,7 +378,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable anyHandler = handler } - public func parseEngineMessage(msg: String) { + public func parseEngineMessage(_ msg: String) { DefaultSocketLogger.Logger.log("Should parse message: %@", type: "SocketIOClient", args: msg) dispatch_async(parseQueue) { @@ -386,7 +386,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } } - public func parseEngineBinaryData(data: NSData) { + public func parseEngineBinaryData(_ data: NSData) { dispatch_async(parseQueue) { self.parseBinaryData(data) } @@ -396,7 +396,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func reconnect() { guard !reconnecting else { return } - engine?.disconnect("manual reconnect") + engine?.disconnect(reason: "manual reconnect") } /// Removes all handlers. @@ -405,7 +405,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handlers.removeAll(keepingCapacity: false) } - private func tryReconnect(reason reason: String) { + private func tryReconnect(reason: String) { if reconnecting { DefaultSocketLogger.Logger.log("Starting reconnect", type: logType) handleEvent("reconnect", data: [reason], isInternalMessage: true) @@ -420,7 +420,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { - return didDisconnect("Reconnect Failed") + return didDisconnect(reason: "Reconnect Failed") } DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType) @@ -451,6 +451,6 @@ extension SocketIOClient { } func emitTest(event: String, _ data: AnyObject...) { - self._emit([event] + data) + self._emit(data: [event] + data) } } diff --git a/Source/SocketIOClientOption.swift b/Source/SocketIOClientOption.swift index 70d572b..6142e88 100644 --- a/Source/SocketIOClientOption.swift +++ b/Source/SocketIOClientOption.swift @@ -210,8 +210,8 @@ extension NSDictionary { var options = Set() for (rawKey, value) in self { - if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { - options.insertIgnore(opt) + if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key: key, value: value) { + options.insertIgnore(element: opt) } } diff --git a/Source/SocketIOClientSpec.swift b/Source/SocketIOClientSpec.swift index 8b33cf9..f3dd863 100644 --- a/Source/SocketIOClientSpec.swift +++ b/Source/SocketIOClientSpec.swift @@ -29,9 +29,9 @@ protocol SocketIOClientSpec : class { func didConnect() func didDisconnect(reason: String) func didError(reason: String) - func handleAck(ack: Int, data: [AnyObject]) - func handleEvent(event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int) - func joinNamespace(namespace: String) + func handleAck(_ ack: Int, data: [AnyObject]) + func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int) + func joinNamespace(_ namespace: String) } extension SocketIOClientSpec { diff --git a/Source/SocketLogger.swift b/Source/SocketLogger.swift index c0f205a..bc4cf37 100644 --- a/Source/SocketLogger.swift +++ b/Source/SocketLogger.swift @@ -29,22 +29,22 @@ public protocol SocketLogger : class { var log: Bool { get set } /// Normal log messages - func log(message: String, type: String, args: AnyObject...) + func log(_ message: String, type: String, args: AnyObject...) /// Error Messages - func error(message: String, type: String, args: AnyObject...) + func error(_ message: String, type: String, args: AnyObject...) } public extension SocketLogger { - func log(message: String, type: String, args: AnyObject...) { + func log(_ message: String, type: String, args: AnyObject...) { abstractLog("LOG", message: message, type: type, args: args) } - func error(message: String, type: String, args: AnyObject...) { + func error(_ message: String, type: String, args: AnyObject...) { abstractLog("ERROR", message: message, type: type, args: args) } - private func abstractLog(logType: String, message: String, type: String, args: [AnyObject]) { + private func abstractLog(_ logType: String, message: String, type: String, args: [AnyObject]) { guard log else { return } let newArgs = args.map({arg -> CVarArg in String(arg)}) diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index 0cc436e..8008909 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -71,7 +71,7 @@ struct SocketPacket { self.binary = binary } - mutating func addData(data: NSData) -> Bool { + mutating func addData(_ data: NSData) -> Bool { if placeholders == binary.count { return true } @@ -86,7 +86,7 @@ struct SocketPacket { } } - private func completeMessage(message: String) -> String { + private func completeMessage(_ message: String) -> String { let restOfMessage: String if data.count == 0 { @@ -191,7 +191,7 @@ struct SocketPacket { // If object is a collection it will recurse // Returns the object if it is not a placeholder string or the corresponding // binary data - private func _fillInPlaceholders(object: AnyObject) -> AnyObject { + private func _fillInPlaceholders(_ object: AnyObject) -> AnyObject { switch object { case let string as String where string["~~(\\d)"].groups() != nil: return binary[Int(string["~~(\\d)"].groups()![1])!] @@ -226,7 +226,7 @@ extension SocketPacket { static func packetFromEmit(items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket { let (parsedData, binary) = deconstructData(items) - let packet = SocketPacket(type: findType(binary.count, ack: ack), data: parsedData, + let packet = SocketPacket(type: findType(binCount: binary.count, ack: ack), data: parsedData, id: id, nsp: nsp, placeholders: -1, binary: binary) return packet @@ -235,7 +235,7 @@ extension SocketPacket { private extension SocketPacket { // Recursive function that looks for NSData in collections - static func shred(data: AnyObject, binary: inout [NSData]) -> AnyObject { + static func shred(_ data: AnyObject, binary: inout [NSData]) -> AnyObject { let placeholder = ["_placeholder": true, "num": binary.count] switch data { @@ -256,7 +256,7 @@ private extension SocketPacket { // Removes binary data from emit data // Returns a type containing the de-binaryed data and the binary - static func deconstructData(data: [AnyObject]) -> ([AnyObject], [NSData]) { + static func deconstructData(_ data: [AnyObject]) -> ([AnyObject], [NSData]) { var binary = [NSData]() return (data.map({shred($0, binary: &binary)}), binary) diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index a890fe9..2f93895 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -23,16 +23,16 @@ import Foundation protocol SocketParsable : SocketIOClientSpec { - func parseBinaryData(data: NSData) - func parseSocketMessage(message: String) + func parseBinaryData(_ data: NSData) + func parseSocketMessage(_ message: String) } extension SocketParsable { - private func isCorrectNamespace(nsp: String) -> Bool { + private func isCorrectNamespace(_ nsp: String) -> Bool { return nsp == self.nsp } - private func handleConnect(p: SocketPacket) { + private func handleConnect(_ p: SocketPacket) { if p.nsp == "/" && nsp != "/" { joinNamespace(nsp) } else if p.nsp != "/" && nsp == "/" { @@ -42,7 +42,7 @@ extension SocketParsable { } } - private func handlePacket(pack: SocketPacket) { + private func handlePacket(_ pack: SocketPacket) { switch pack.type { case .Event where isCorrectNamespace(pack.nsp): handleEvent(pack.event, data: pack.args, isInternalMessage: false, withAck: pack.id) @@ -55,7 +55,7 @@ extension SocketParsable { case .Connect: handleConnect(pack) case .Disconnect: - didDisconnect("Got Disconnect") + didDisconnect(reason: "Got Disconnect") case .Error: handleEvent("error", data: pack.data, isInternalMessage: true, withAck: pack.id) default: @@ -64,10 +64,10 @@ extension SocketParsable { } /// Parses a messsage from the engine. Returning either a string error or a complete SocketPacket - func parseString(message: String) -> Either { + func parseString(_ message: String) -> Either { var parser = SocketStringReader(message: message) - guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(1)) ?? -1) else { + guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(length: 1)) ?? -1) else { return .Left("Invalid packet type") } @@ -98,14 +98,14 @@ extension SocketParsable { var idString = "" if type == .Error { - parser.advanceIndexBy(-1) + parser.advance(by: -1) } while parser.hasNext && type != .Error { - if let int = Int(parser.read(1)) { + if let int = Int(parser.read(length: 1)) { idString += String(int) } else { - parser.advanceIndexBy(-2) + parser.advance(by: -2) break } } @@ -129,8 +129,8 @@ extension SocketParsable { } // Parses data for events - private func parseData(data: String) -> Either { - let stringData = data.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false) + private func parseData(_ data: String) -> Either { + let stringData = data.data(using: NSUTF8StringEncoding, allowLossyConversion: false) do { if let arr = try NSJSONSerialization.jsonObject(with: stringData!, options: NSJSONReadingOptions.mutableContainers) as? [AnyObject] { @@ -144,7 +144,7 @@ extension SocketParsable { } // Parses messages recieved - func parseSocketMessage(message: String) { + func parseSocketMessage(_ message: String) { guard !message.isEmpty else { return } DefaultSocketLogger.Logger.log("Parsing %@", type: "SocketParser", args: message) @@ -158,7 +158,7 @@ extension SocketParsable { } } - func parseBinaryData(data: NSData) { + func parseBinaryData(_ data: NSData) { guard !waitingPackets.isEmpty else { DefaultSocketLogger.Logger.error("Got data when not remaking packet", type: "SocketParser") return diff --git a/Source/SocketStringReader.swift b/Source/SocketStringReader.swift index 26883ac..7bea0f4 100644 --- a/Source/SocketStringReader.swift +++ b/Source/SocketStringReader.swift @@ -38,18 +38,18 @@ struct SocketStringReader { currentIndex = message.startIndex } - mutating func advanceIndexBy(n: Int) { - currentIndex = currentIndex.advanced(by: n) + mutating func advance(by: Int) { + currentIndex = currentIndex.advanced(by: by) } - mutating func read(readLength: Int) -> String { - let readString = message[currentIndex.. String { + let readString = message[currentIndex.. String { + mutating func readUntilStringOccurence(_ string: String) -> String { let substring = message[currentIndex.. String { - return read(currentIndex.distance(to: message.endIndex)) + return read(length: currentIndex.distance(to: message.endIndex)) } } diff --git a/Source/SwiftRegex.swift b/Source/SwiftRegex.swift index 8668179..67c6f13 100644 --- a/Source/SwiftRegex.swift +++ b/Source/SwiftRegex.swift @@ -31,7 +31,7 @@ internal final class SwiftRegex : NSObject, Boolean { NSRegularExpressionOptions.dotMatchesLineSeparators) self.regex = regex } catch let error as NSError { - SwiftRegex.failure("Error in pattern: \(pattern) - \(error)") + SwiftRegex.failure(message: "Error in pattern: \(pattern) - \(error)") self.regex = NSRegularExpression() } @@ -48,7 +48,7 @@ internal final class SwiftRegex : NSObject, Boolean { swiftRegexCache[pattern] = regex self.regex = regex } catch let error as NSError { - SwiftRegex.failure("Error in pattern: \(pattern) - \(error)") + SwiftRegex.failure(message: "Error in pattern: \(pattern) - \(error)") self.regex = NSRegularExpression() } } @@ -73,7 +73,7 @@ internal final class SwiftRegex : NSObject, Boolean { } func doesMatch(options: NSMatchingOptions!) -> Bool { - return range(options).location != NSNotFound + return range(options: options).location != NSNotFound } func range(options: NSMatchingOptions) -> NSRange { @@ -81,11 +81,11 @@ internal final class SwiftRegex : NSObject, Boolean { } func match(options: NSMatchingOptions) -> String? { - return substring(range(options)) + return substring(range: range(options: options)) } func groups() -> [String]? { - return groupsForMatch(regex.firstMatch(in: target as String, options: + return groupsForMatch(match: regex.firstMatch(in: target as String, options: NSMatchingOptions.withoutAnchoringBounds, range: targetRange)) } @@ -95,7 +95,7 @@ internal final class SwiftRegex : NSObject, Boolean { } var groups = [String]() for groupno in 0...regex.numberOfCaptureGroups { - if let group = substring(match.range(at: groupno)) { + if let group = substring(range: match.range(at: groupno)) { groups += [group] } else { groups += ["_"] // avoids bridging problems @@ -138,17 +138,17 @@ internal final class SwiftRegex : NSObject, Boolean { } func matches() -> [String] { - return matchResults().map( { self.substring($0.range)!}) + return matchResults().map( { self.substring(range: $0.range)!}) } func allGroups() -> [[String]?] { - return matchResults().map { self.groupsForMatch($0) } + return matchResults().map { self.groupsForMatch(match: $0) } } func dictionary(options: NSMatchingOptions!) -> Dictionary { var out = Dictionary() for match in matchResults() { - out[substring(match.range(at: 1))!] = substring(match.range(at: 2))! + out[substring(range: match.range(at: 1))!] = substring(range: match.range(at: 2))! } return out } @@ -160,18 +160,18 @@ internal final class SwiftRegex : NSObject, Boolean { regex.enumerateMatches(in: target as String, options: options, range: targetRange ) {match, flags, stop in let matchRange = match!.range - out.append( self.substring(NSRange(location:pos, length:matchRange.location-pos))!) + out.append( self.substring(range: NSRange(location:pos, length:matchRange.location-pos))!) out.append( substitution(match!, stop) ) pos = matchRange.location + matchRange.length } - out.append(substring(NSRange(location:pos, length:targetRange.length-pos))!) + out.append(substring(range: NSRange(location:pos, length:targetRange.length-pos))!) return out as String } var boolValue: Bool { - return doesMatch(nil) + return doesMatch(options: nil) } } @@ -188,7 +188,7 @@ extension String { } func <~ (left: SwiftRegex, right: String) -> String { - return left.substituteMatches({match, stop in + return left.substituteMatches(substitution: {match, stop in 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 ed3642c..c91ec04 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -60,7 +60,10 @@ public class WebSocket : NSObject, NSStreamDelegate { case MessageTooBig = 1009 } + #if swift(>=3) + #else public static let ErrorDomain = "WebSocket" + #endif enum InternalErrorCode : UInt16 { // 0-999 WebSocket status codes not used @@ -167,18 +170,18 @@ public class WebSocket : NSObject, NSStreamDelegate { - Parameter forceTimeout: Maximum time to wait for the server to close the socket. */ - public func disconnect(forceTimeout forceTimeout: NSTimeInterval? = nil) { + public func disconnect(forceTimeout: NSTimeInterval? = nil) { switch forceTimeout { 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) + self?.disconnectStream(error: nil) } fallthrough case .none: - writeError(CloseCode.Normal.rawValue) + writeError(code: CloseCode.Normal.rawValue) default: - self.disconnectStream(nil) + self.disconnectStream(error: nil) break } } @@ -192,7 +195,7 @@ public class WebSocket : NSObject, NSStreamDelegate { */ public func writeString(str: String, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(str.data(usingEncoding: NSUTF8StringEncoding)!, code: .TextFrame, writeCompletion: completion) + dequeueWrite(data: str.data(using: NSUTF8StringEncoding)!, code: .TextFrame, writeCompletion: completion) } /** @@ -204,14 +207,14 @@ public class WebSocket : NSObject, NSStreamDelegate { */ public func writeData(data: NSData, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(data, code: .BinaryFrame, writeCompletion: completion) + dequeueWrite(data: data, code: .BinaryFrame, writeCompletion: completion) } //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 writePing(data: NSData, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(data, code: .Ping, writeCompletion: completion) + dequeueWrite(data: data, code: .Ping, writeCompletion: completion) } //private method that starts the connection @@ -228,23 +231,23 @@ public class WebSocket : NSObject, NSStreamDelegate { port = 80 } } - addHeader(urlRequest, key: headerWSUpgradeName, val: headerWSUpgradeValue) - addHeader(urlRequest, key: headerWSConnectionName, val: headerWSConnectionValue) + addHeader(urlRequest: urlRequest, key: headerWSUpgradeName, val: headerWSUpgradeValue) + addHeader(urlRequest: urlRequest, key: headerWSConnectionName, val: headerWSConnectionValue) if let protocols = optionalProtocols { - addHeader(urlRequest, key: headerWSProtocolName, val: protocols.joined(separator: ",")) + addHeader(urlRequest: urlRequest, key: headerWSProtocolName, val: protocols.joined(separator: ",")) } - addHeader(urlRequest, key: headerWSVersionName, val: headerWSVersionValue) - addHeader(urlRequest, key: headerWSKeyName, val: generateWebSocketKey()) + addHeader(urlRequest: urlRequest, key: headerWSVersionName, val: headerWSVersionValue) + addHeader(urlRequest: urlRequest, key: headerWSKeyName, val: generateWebSocketKey()) if let origin = origin { - addHeader(urlRequest, key: headerOriginName, val: origin) + addHeader(urlRequest: urlRequest, key: headerOriginName, val: origin) } - addHeader(urlRequest, key: headerWSHostName, val: "\(url.host!):\(port!)") + addHeader(urlRequest: urlRequest, key: headerWSHostName, val: "\(url.host!):\(port!)") for (key,value) in headers { - addHeader(urlRequest, key: key, val: value) + addHeader(urlRequest: urlRequest, key: key, val: value) } if let cfHTTPMessage = CFHTTPMessageCopySerializedMessage(urlRequest) { let serializedRequest = cfHTTPMessage.takeRetainedValue() - initStreamsWithData(serializedRequest, Int(port!)) + initStreamsWithData(data: serializedRequest, Int(port!)) } } @@ -261,7 +264,7 @@ public class WebSocket : NSObject, NSStreamDelegate { let uni = UnicodeScalar(UInt32(97 + arc4random_uniform(25))) key += "\(Character(uni))" } - let data = key.data(usingEncoding: NSUTF8StringEncoding) + let data = key.data(using: NSUTF8StringEncoding) let baseKey = data?.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0)) return baseKey! } @@ -291,7 +294,7 @@ public class WebSocket : NSObject, NSStreamDelegate { outStream.setProperty(NSStreamNetworkServiceTypeVoIP, forKey: NSStreamNetworkServiceType) } if selfSignedSSL { - let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(bool:false), kCFStreamSSLPeerName: kCFNull] + let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull] inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) } @@ -332,7 +335,7 @@ public class WebSocket : NSObject, NSStreamDelegate { timeout -= 100 if timeout < 0 { self?.cleanupStream() - self?.doDisconnect(self?.errorWithDetail("write wait timed out", code: 2)) + self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2)) return } else if outStream.streamError != nil { return //disconnectStream will be called. @@ -364,9 +367,9 @@ public class WebSocket : NSObject, NSStreamDelegate { processInputStream() } } else if eventCode == .errorOccurred { - disconnectStream(aStream.streamError) + disconnectStream(error: aStream.streamError) } else if eventCode == .endEncountered { - disconnectStream(nil) + disconnectStream(error: nil) } } //disconnect the stream object @@ -377,7 +380,7 @@ public class WebSocket : NSObject, NSStreamDelegate { writeQueue.cancelAllOperations() } cleanupStream() - doDisconnect(error) + doDisconnect(error: error) } private func cleanupStream() { @@ -426,9 +429,9 @@ public class WebSocket : NSObject, NSStreamDelegate { let buffer = UnsafePointer(work.bytes) let length = work.length if !connected { - processTCPHandshake(buffer, bufferLen: length) + processTCPHandshake(buffer: buffer, bufferLen: length) } else { - processRawMessage(buffer, bufferLen: length) + processRawMessage(buffer: buffer, bufferLen: length) } inputQueue = inputQueue.filter{$0 != data} dequeueInput() @@ -436,7 +439,7 @@ public class WebSocket : NSObject, NSStreamDelegate { //handle checking the inital connection status private func processTCPHandshake(buffer: UnsafePointer, bufferLen: Int) { - let code = processHTTP(buffer, bufferLen: bufferLen) + let code = processHTTP(buffer: buffer, bufferLen: bufferLen) switch code { case 0: connected = true @@ -444,13 +447,13 @@ public class WebSocket : NSObject, NSStreamDelegate { dispatch_async(queue) { [weak self] in guard let s = self else { return } s.onConnect?() - s.delegate?.websocketDidConnect(s) + s.delegate?.websocketDidConnect(socket: s) } case -1: fragBuffer = NSData(bytes: buffer, length: bufferLen) break //do nothing, we are going to collect more data default: - doDisconnect(errorWithDetail("Invalid HTTP upgrade", code: UInt16(code))) + doDisconnect(error: errorWithDetail(detail: "Invalid HTTP upgrade", code: UInt16(code))) } } ///Finds the HTTP Packet in the TCP stream, by looking for the CRLF. @@ -470,14 +473,14 @@ public class WebSocket : NSObject, NSStreamDelegate { } } if totalSize > 0 { - let code = validateResponse(buffer, bufferLen: totalSize) + let code = validateResponse(buffer: buffer, bufferLen: totalSize) if code != 0 { return code } totalSize += 1 //skip the last \n let restSize = bufferLen - totalSize if restSize > 0 { - processRawMessage((buffer+totalSize),bufferLen: restSize) + processRawMessage(buffer: (buffer+totalSize),bufferLen: restSize) } return 0 //success } @@ -546,10 +549,10 @@ public class WebSocket : NSObject, NSStreamDelegate { } response.bytesLeft -= len response.buffer?.append(NSData(bytes: buffer, length: len)) - processResponse(response) + processResponse(response: response) let offset = bufferLen - extra if extra > 0 { - processExtra((buffer+offset), bufferLen: extra) + processExtra(buffer: (buffer+offset), bufferLen: extra) } return } else { @@ -560,22 +563,22 @@ public class WebSocket : NSObject, NSStreamDelegate { var offset = 2 if (isMasked > 0 || (RSVMask & buffer[0]) > 0) && receivedOpcode != .Pong { let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(errorWithDetail("masked and rsv data is not currently supported", code: errCode)) - writeError(errCode) + doDisconnect(error: errorWithDetail(detail: "masked and rsv data is not currently supported", code: errCode)) + writeError(code: errCode) return } let isControlFrame = (receivedOpcode == .ConnectionClose || receivedOpcode == .Ping) if !isControlFrame && (receivedOpcode != .BinaryFrame && receivedOpcode != .ContinueFrame && receivedOpcode != .TextFrame && receivedOpcode != .Pong) { let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(errorWithDetail("unknown opcode: \(receivedOpcode)", code: errCode)) - writeError(errCode) + doDisconnect(error: errorWithDetail(detail: "unknown opcode: \(receivedOpcode)", code: errCode)) + writeError(code: errCode) return } if isControlFrame && isFin == 0 { let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(errorWithDetail("control frames can't be fragmented", code: errCode)) - writeError(errCode) + doDisconnect(error: errorWithDetail(detail: "control frames can't be fragmented", code: errCode)) + writeError(code: errCode) return } if receivedOpcode == .ConnectionClose { @@ -583,7 +586,7 @@ public class WebSocket : NSObject, NSStreamDelegate { if payloadLen == 1 { code = CloseCode.ProtocolError.rawValue } else if payloadLen > 1 { - code = WebSocket.readUint16(buffer, offset: offset) + code = WebSocket.readUint16(buffer: buffer, offset: offset) if code < 1000 || (code > 1003 && code < 1007) || (code > 1011 && code < 3000) { code = CloseCode.ProtocolError.rawValue } @@ -599,20 +602,20 @@ public class WebSocket : NSObject, NSStreamDelegate { } } } - doDisconnect(errorWithDetail("connection closed by server", code: code)) - writeError(code) + doDisconnect(error: errorWithDetail(detail: "connection closed by server", code: code)) + writeError(code: code) return } if isControlFrame && payloadLen > 125 { - writeError(CloseCode.ProtocolError.rawValue) + writeError(code: CloseCode.ProtocolError.rawValue) return } var dataLength = UInt64(payloadLen) if dataLength == 127 { - dataLength = WebSocket.readUint64(buffer, offset: offset) + dataLength = WebSocket.readUint64(buffer: buffer, offset: offset) offset += sizeof(UInt64) } else if dataLength == 126 { - dataLength = UInt64(WebSocket.readUint16(buffer, offset: offset)) + dataLength = UInt64(WebSocket.readUint16(buffer: buffer, offset: offset)) offset += sizeof(UInt16) } if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { @@ -635,13 +638,13 @@ public class WebSocket : NSObject, NSStreamDelegate { dispatch_async(queue) { [weak self] in guard let s = self else { return } s.onPong?() - s.pongDelegate?.websocketDidReceivePong(s) + s.pongDelegate?.websocketDidReceivePong(socket: s) } } let step = Int(offset+numericCast(len)) let extra = bufferLen-step if extra > 0 { - processRawMessage((buffer+step), bufferLen: extra) + processRawMessage(buffer: (buffer+step), bufferLen: extra) } return } @@ -651,17 +654,17 @@ public class WebSocket : NSObject, NSStreamDelegate { } if isFin == 0 && receivedOpcode == .ContinueFrame && response == nil { let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(errorWithDetail("continue frame before a binary or text frame", code: errCode)) - writeError(errCode) + doDisconnect(error: errorWithDetail(detail: "continue frame before a binary or text frame", code: errCode)) + writeError(code: errCode) return } var isNew = false if response == nil { if receivedOpcode == .ContinueFrame { let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(errorWithDetail("first frame can't be a continue frame", + doDisconnect(error: errorWithDetail(detail: "first frame can't be a continue frame", code: errCode)) - writeError(errCode) + writeError(code: errCode) return } isNew = true @@ -674,9 +677,9 @@ public class WebSocket : NSObject, NSStreamDelegate { response!.bytesLeft = Int(dataLength) } else { let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(errorWithDetail("second and beyond of fragment message must be a continue frame", + doDisconnect(error: errorWithDetail(detail: "second and beyond of fragment message must be a continue frame", code: errCode)) - writeError(errCode) + writeError(code: errCode) return } response!.buffer!.append(data) @@ -688,13 +691,13 @@ public class WebSocket : NSObject, NSStreamDelegate { if isNew { readStack.append(response) } - processResponse(response) + processResponse(response: response) } let step = Int(offset+numericCast(len)) let extra = bufferLen-step if extra > 0 { - processExtra((buffer+step), bufferLen: extra) + processExtra(buffer: (buffer+step), bufferLen: extra) } } @@ -705,7 +708,7 @@ public class WebSocket : NSObject, NSStreamDelegate { if bufferLen < 2 { fragBuffer = NSData(bytes: buffer, length: bufferLen) } else { - processRawMessage(buffer, bufferLen: bufferLen) + processRawMessage(buffer: buffer, bufferLen: bufferLen) } } @@ -714,18 +717,18 @@ public class WebSocket : NSObject, NSStreamDelegate { if response.isFin && response.bytesLeft <= 0 { if response.code == .Ping { let data = response.buffer! //local copy so it is perverse for writing - dequeueWrite(data, code: OpCode.Pong) + dequeueWrite(data: data, code: OpCode.Pong) } else if response.code == .TextFrame { let str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding) if str == nil { - writeError(CloseCode.Encoding.rawValue) + writeError(code: CloseCode.Encoding.rawValue) return false } if canDispatch { dispatch_async(queue) { [weak self] in guard let s = self else { return } s.onText?(str! as String) - s.delegate?.websocketDidReceiveMessage(s, text: str! as String) + s.delegate?.websocketDidReceiveMessage(socket: s, text: str! as String) } } } else if response.code == .BinaryFrame { @@ -734,7 +737,7 @@ public class WebSocket : NSObject, NSStreamDelegate { dispatch_async(queue) { [weak self] in guard let s = self else { return } s.onData?(data) - s.delegate?.websocketDidReceiveData(s, data: data) + s.delegate?.websocketDidReceiveData(socket: s, data: data) } } } @@ -748,15 +751,19 @@ public class WebSocket : NSObject, NSStreamDelegate { private func errorWithDetail(detail: String, code: UInt16) -> NSError { var details = [String: String]() details[NSLocalizedDescriptionKey] = detail + #if swift(>=3) + return NSError(domain: "April 12 build of Swift 3 broke this property", code: Int(code), userInfo: details) + #else return NSError(domain: WebSocket.ErrorDomain, code: Int(code), userInfo: details) + #endif } ///write a an error to the socket private func writeError(code: UInt16) { let buf = NSMutableData(capacity: sizeof(UInt16)) let buffer = UnsafeMutablePointer(buf!.bytes) - WebSocket.writeUint16(buffer, offset: 0, value: code) - dequeueWrite(NSData(bytes: buffer, length: sizeof(UInt16)), code: .ConnectionClose) + WebSocket.writeUint16(buffer: buffer, offset: 0, value: code) + dequeueWrite(data: NSData(bytes: buffer, length: sizeof(UInt16)), code: .ConnectionClose) } ///used to write things to the stream private func dequeueWrite(data: NSData, code: OpCode, writeCompletion: (() -> ())? = nil) { @@ -773,11 +780,11 @@ public class WebSocket : NSObject, NSStreamDelegate { buffer[1] = CUnsignedChar(dataLength) } else if dataLength <= Int(UInt16.max) { buffer[1] = 126 - WebSocket.writeUint16(buffer, offset: offset, value: UInt16(dataLength)) + WebSocket.writeUint16(buffer: buffer, offset: offset, value: UInt16(dataLength)) offset += sizeof(UInt16) } else { buffer[1] = 127 - WebSocket.writeUint64(buffer, offset: offset, value: UInt64(dataLength)) + WebSocket.writeUint64(buffer: buffer, offset: offset, value: UInt64(dataLength)) offset += sizeof(UInt64) } buffer[1] |= s.MaskMask @@ -800,9 +807,9 @@ public class WebSocket : NSObject, NSStreamDelegate { error = streamError } else { let errCode = InternalErrorCode.OutputStreamWriteError.rawValue - error = s.errorWithDetail("output stream error during write", code: errCode) + error = s.errorWithDetail(detail: "output stream error during write", code: errCode) } - s.doDisconnect(error) + s.doDisconnect(error: error) break } else { total += len @@ -830,7 +837,7 @@ public class WebSocket : NSObject, NSStreamDelegate { dispatch_async(queue) { [weak self] in guard let s = self else { return } s.onDisconnect?(error) - s.delegate?.websocketDidDisconnect(s, error: error) + s.delegate?.websocketDidDisconnect(socket: s, error: error) } } From 95cd24a124f5319c781fd3f120de213da89b7604 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 5 May 2016 13:36:34 -0400 Subject: [PATCH 04/54] remove swiftregex --- Source/SwiftRegex.swift | 194 ---------------------------------------- 1 file changed, 194 deletions(-) delete mode 100644 Source/SwiftRegex.swift diff --git a/Source/SwiftRegex.swift b/Source/SwiftRegex.swift deleted file mode 100644 index 67c6f13..0000000 --- a/Source/SwiftRegex.swift +++ /dev/null @@ -1,194 +0,0 @@ -// -// SwiftRegex.swift -// SwiftRegex -// -// Created by John Holdsworth on 26/06/2014. -// Copyright (c) 2014 John Holdsworth. -// -// $Id: //depot/SwiftRegex/SwiftRegex.swift#37 $ -// -// This code is in the public domain from: -// https://github.com/johnno1962/SwiftRegex -// - -import Foundation - -infix operator <~ { associativity none precedence 130 } - -private let lock = dispatch_semaphore_create(1) -private var swiftRegexCache = [String: NSRegularExpression]() - -internal final class SwiftRegex : NSObject, Boolean { - var target: String - var regex: NSRegularExpression - - init(target:String, pattern:String, options:NSRegularExpressionOptions?) { - self.target = target - - 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) - self.regex = regex - } catch let error as NSError { - SwiftRegex.failure(message: "Error in pattern: \(pattern) - \(error)") - self.regex = NSRegularExpression() - } - - super.init() - return - } - - if let regex = swiftRegexCache[pattern] { - self.regex = regex - } else { - do { - let regex = try NSRegularExpression(pattern: pattern, options: - NSRegularExpressionOptions.dotMatchesLineSeparators) - swiftRegexCache[pattern] = regex - self.regex = regex - } catch let error as NSError { - SwiftRegex.failure(message: "Error in pattern: \(pattern) - \(error)") - self.regex = NSRegularExpression() - } - } - dispatch_semaphore_signal(lock) - super.init() - } - - private static func failure(message: String) { - fatalError("SwiftRegex: \(message)") - } - - private var targetRange: NSRange { - return NSRange(location: 0,length: target.utf16.count) - } - - private func substring(range: NSRange) -> String? { - if range.location != NSNotFound { - return (target as NSString).substring(with: range) - } else { - return nil - } - } - - func doesMatch(options: NSMatchingOptions!) -> Bool { - return range(options: options).location != NSNotFound - } - - func range(options: NSMatchingOptions) -> NSRange { - return regex.rangeOfFirstMatch(in: target as String, options: [], range: targetRange) - } - - func match(options: NSMatchingOptions) -> String? { - return substring(range: range(options: options)) - } - - func groups() -> [String]? { - return groupsForMatch(match: regex.firstMatch(in: target as String, options: - NSMatchingOptions.withoutAnchoringBounds, range: targetRange)) - } - - private func groupsForMatch(match: NSTextCheckingResult?) -> [String]? { - guard let match = match else { - return nil - } - var groups = [String]() - for groupno in 0...regex.numberOfCaptureGroups { - if let group = substring(range: match.range(at: groupno)) { - groups += [group] - } else { - groups += ["_"] // avoids bridging problems - } - } - return groups - } - - subscript(groupno: Int) -> String? { - get { - return groups()?[groupno] - } - - set(newValue) { - if newValue == nil { - return - } - - 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.replaceCharacters(in: match.range(at: groupno), with: replacement) - - target = mut as String - } - } - } - - func matchResults() -> [NSTextCheckingResult] { - let matches = regex.matches(in: target as String, options: - NSMatchingOptions.withoutAnchoringBounds, range: targetRange) - as [NSTextCheckingResult] - - return matches - } - - func ranges() -> [NSRange] { - return matchResults().map { $0.range } - } - - func matches() -> [String] { - return matchResults().map( { self.substring(range: $0.range)!}) - } - - func allGroups() -> [[String]?] { - return matchResults().map { self.groupsForMatch(match: $0) } - } - - func dictionary(options: NSMatchingOptions!) -> Dictionary { - var out = Dictionary() - for match in matchResults() { - out[substring(range: match.range(at: 1))!] = substring(range: match.range(at: 2))! - } - return out - } - - func substituteMatches(substitution: ((NSTextCheckingResult, UnsafeMutablePointer) -> String), - options:NSMatchingOptions) -> String { - let out = NSMutableString() - var pos = 0 - - regex.enumerateMatches(in: target as String, options: options, range: targetRange ) {match, flags, stop in - let matchRange = match!.range - out.append( self.substring(range: NSRange(location:pos, length:matchRange.location-pos))!) - out.append( substitution(match!, stop) ) - pos = matchRange.location + matchRange.length - } - - out.append(substring(range: NSRange(location:pos, length:targetRange.length-pos))!) - - return out as String - } - - var boolValue: Bool { - return doesMatch(options: nil) - } -} - -extension String { - subscript(pattern: String, options: NSRegularExpressionOptions) -> SwiftRegex { - return SwiftRegex(target: self, pattern: pattern, options: options) - } -} - -extension String { - subscript(pattern: String) -> SwiftRegex { - return SwiftRegex(target: self, pattern: pattern, options: nil) - } -} - -func <~ (left: SwiftRegex, right: String) -> String { - return left.substituteMatches(substitution: {match, stop in - return left.regex.replacementString(for: match, in: left.target as String, offset: 0, template: right ) - }, options: []) -} From 593db4cd8dd50a197d71151484ae3a59ca84e0af Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 21 May 2016 11:59:16 -0400 Subject: [PATCH 05/54] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de43c9d..b20610f 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ socket.on("connect") {data, ack in socket.on("currentAmount") {data, ack in if let cur = data[0] as? Double { - socket.emitWithAck("canUpdate", cur)(timeoutAfter: 0) {data in - socket.emit("update", ["amount": cur + 2.50]) + socket.emitWithAck("canUpdate", cur as AnyObject)(timeoutAfter: 0) {data in + socket.emit("update", ["amount": cur + 2.50] as AnyObject) } ack.with("Got your currentAmount", "dude") From 044d9c0746fb8b0e3128bc1f850604b1d022dec4 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 21 May 2016 12:41:08 -0400 Subject: [PATCH 06/54] remove --- Source/SocketEngineSpec.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index f2d8185..1b0ee4e 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -36,11 +36,11 @@ import Foundation var fastUpgrade: Bool { get } var forcePolling: Bool { get } var forceWebsockets: Bool { get } - var parseQueue: dispatch_queue_t! { get } + var parseQueue: dispatch_queue_t { get } var polling: Bool { get } var probing: Bool { get } - var emitQueue: dispatch_queue_t! { get } - var handleQueue: dispatch_queue_t! { get } + var emitQueue: dispatch_queue_t { get } + var handleQueue: dispatch_queue_t { get } var sid: String { get } var socketPath: String { get } var urlPolling: NSURL { get } From 51ee4d3d1d95a6c7a31ac98fcfbb4b722aedcc33 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 22 May 2016 14:05:01 -0400 Subject: [PATCH 07/54] try and avoid a bunch of as AnyObject nonsense --- Source/SocketIOClient.swift | 8 ++++---- Source/SocketIOClientSpec.swift | 4 ++++ Source/SocketTypes.swift | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 9f2503b..5c8c380 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -208,8 +208,8 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Send a message to the server - public func emit(_ event: String, _ items: AnyObject...) { - emit(event, with: items) + public func emit(_ event: String, _ items: SocketData...) { + emit(event, with: socketDataToAnyObject(data: items)) } /// Same as emit, but meant for Objective-C @@ -224,8 +224,8 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add /// an ack. - public func emitWithAck(_ event: String, _ items: AnyObject...) -> OnAckCallback { - return emitWithAck(event, with: items) + public func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback { + return emitWithAck(event, with: socketDataToAnyObject(data: items)) } /// Same as emitWithAck, but for Objective-C diff --git a/Source/SocketIOClientSpec.swift b/Source/SocketIOClientSpec.swift index 1e2051c..17be36c 100644 --- a/Source/SocketIOClientSpec.swift +++ b/Source/SocketIOClientSpec.swift @@ -40,4 +40,8 @@ extension SocketIOClientSpec { handleEvent("error", data: [reason as AnyObject], isInternalMessage: true, withAck: -1) } + + func socketDataToAnyObject(data: [SocketData]) -> [AnyObject] { + return data.flatMap({$0 as? AnyObject}) + } } diff --git a/Source/SocketTypes.swift b/Source/SocketTypes.swift index 7f27c42..595d5e5 100644 --- a/Source/SocketTypes.swift +++ b/Source/SocketTypes.swift @@ -24,6 +24,20 @@ import Foundation +public protocol SocketData {} + +extension Array : SocketData {} +extension Bool : SocketData {} +extension Dictionary : SocketData {} +extension Double : SocketData {} +extension Int : SocketData {} +extension NSArray : SocketData {} +extension NSData : SocketData {} +extension NSDictionary : SocketData {} +extension NSString : SocketData {} +extension NSNull : SocketData {} +extension String : SocketData {} + public typealias AckCallback = ([AnyObject]) -> Void public typealias NormalCallback = ([AnyObject], SocketAckEmitter) -> Void public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void From c6d000972e385b9533fdde424580b54647b4d6b5 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 22 May 2016 14:10:43 -0400 Subject: [PATCH 08/54] add test --- SocketIO-MacTests/SocketSideEffectTest.swift | 6 ++++++ Source/SocketIOClient.swift | 4 ++++ Source/SocketIOClientSpec.swift | 4 ---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index a536693..5e5e8d8 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -137,6 +137,12 @@ class SocketSideEffectTest: XCTestCase { waitForExpectations(withTimeout: 3, handler: nil) } + func testSocketDataToAnyObject() { + let data = ["test", 1, 2.2, ["Hello": 2, "bob": 2.2], true, [1, 2], [1.1, 2]] as [SocketData] + + XCTAssertEqual(data.count, socket.socketDataToAnyObject(data: data).count) + } + func testHandleMultipleBinaryEvent() { let expect = expectation(withDescription: "handled multiple binary event") socket.on("test") {data, ack in diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 5c8c380..72320a8 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -405,6 +405,10 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func removeAllHandlers() { handlers.removeAll(keepingCapacity: false) } + + func socketDataToAnyObject(data: [SocketData]) -> [AnyObject] { + return data.flatMap({$0 as? AnyObject}) + } private func tryReconnect(reason: String) { if reconnecting { diff --git a/Source/SocketIOClientSpec.swift b/Source/SocketIOClientSpec.swift index 17be36c..1e2051c 100644 --- a/Source/SocketIOClientSpec.swift +++ b/Source/SocketIOClientSpec.swift @@ -40,8 +40,4 @@ extension SocketIOClientSpec { handleEvent("error", data: [reason as AnyObject], isInternalMessage: true, withAck: -1) } - - func socketDataToAnyObject(data: [SocketData]) -> [AnyObject] { - return data.flatMap({$0 as? AnyObject}) - } } From 3b4a3828ba12a5748eec3b8f1f427bcf572a3701 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 22 May 2016 14:17:01 -0400 Subject: [PATCH 09/54] fix for ackemitter --- README.md | 4 ++-- Source/SocketAckEmitter.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b20610f..de43c9d 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ socket.on("connect") {data, ack in socket.on("currentAmount") {data, ack in if let cur = data[0] as? Double { - socket.emitWithAck("canUpdate", cur as AnyObject)(timeoutAfter: 0) {data in - socket.emit("update", ["amount": cur + 2.50] as AnyObject) + socket.emitWithAck("canUpdate", cur)(timeoutAfter: 0) {data in + socket.emit("update", ["amount": cur + 2.50]) } ack.with("Got your currentAmount", "dude") diff --git a/Source/SocketAckEmitter.swift b/Source/SocketAckEmitter.swift index 980a678..165fb76 100644 --- a/Source/SocketAckEmitter.swift +++ b/Source/SocketAckEmitter.swift @@ -33,10 +33,10 @@ public final class SocketAckEmitter : NSObject { self.ackNum = ackNum } - public func with(_ items: AnyObject...) { + public func with(_ items: SocketData...) { guard ackNum != -1 else { return } - socket.emitAck(ackNum, with: items) + socket.emitAck(ackNum, with: socket.socketDataToAnyObject(data: items)) } public func with(_ items: [AnyObject]) { From d88bb43d9c38e456edd8d46f10df12f1776b4614 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 1 Jun 2016 11:13:05 -0400 Subject: [PATCH 10/54] some methods have discardableresults --- Source/SocketIOClient.swift | 2 ++ Source/SocketStringReader.swift | 1 + 2 files changed, 3 insertions(+) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 72320a8..88e2499 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -347,6 +347,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Adds a handler for an event. /// Returns: A unique id for the handler + @discardableResult public func on(_ event: String, callback: NormalCallback) -> NSUUID { DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event) @@ -358,6 +359,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Adds a single-use handler for an event. /// Returns: A unique id for the handler + @discardableResult public func once(event: String, callback: NormalCallback) -> NSUUID { DefaultSocketLogger.Logger.log("Adding once handler for event: %@", type: logType, args: event) diff --git a/Source/SocketStringReader.swift b/Source/SocketStringReader.swift index a9d4a7a..6e4a7db 100644 --- a/Source/SocketStringReader.swift +++ b/Source/SocketStringReader.swift @@ -38,6 +38,7 @@ struct SocketStringReader { currentIndex = message.startIndex } + @discardableResult mutating func advance(by: Int) -> String.Index { currentIndex = message.characters.index(currentIndex, offsetBy: by) From 9a4ec5a82a3890d1060d9c6f77bacd2b2b711a3c Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 14 Jun 2016 20:41:59 -0400 Subject: [PATCH 11/54] xcode 8 --- .../project.pbxproj | 6 + SocketIO-MacTests/SocketAckManagerTest.swift | 2 +- SocketIO-MacTests/SocketBasicPacketTest.swift | 40 +- SocketIO-MacTests/SocketEngineTest.swift | 4 +- .../SocketNamespacePacketTest.swift | 34 +- SocketIO-MacTests/SocketObjectiveCTest.m | 2 +- SocketIO-MacTests/SocketParserTest.swift | 42 +- SocketIO-MacTests/SocketSideEffectTest.swift | 12 +- Source/NSCharacterSet.swift | 6 +- Source/SocketAckEmitter.swift | 2 +- Source/SocketAckManager.swift | 4 +- Source/SocketClientManager.swift | 4 +- Source/SocketEngine.swift | 122 +++--- Source/SocketEngineClient.swift | 8 +- Source/SocketEnginePollable.swift | 46 +-- Source/SocketEngineSpec.swift | 52 +-- Source/SocketEngineWebsocket.swift | 14 +- Source/SocketEventHandler.swift | 4 +- Source/SocketIOClient.swift | 116 +++--- Source/SocketIOClientOption.swift | 20 +- Source/SocketIOClientSpec.swift | 6 +- Source/SocketPacket.swift | 38 +- Source/SocketParsable.swift | 72 ++-- Source/SocketStringReader.swift | 10 +- Source/SocketTypes.swift | 8 +- Source/WebSocket/SSLSecurity.swift | 52 +-- Source/WebSocket/WebSocket.swift | 371 +++++++++--------- 27 files changed, 552 insertions(+), 545 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 7d543f1..2403b7d 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -536,9 +536,11 @@ }; 572EF2371B51F18A00EEBB58 = { CreatedOnToolsVersion = 6.4; + LastSwiftMigration = 0800; }; 572EF2411B51F18A00EEBB58 = { CreatedOnToolsVersion = 6.4; + LastSwiftMigration = 0800; }; }; }; @@ -1081,6 +1083,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -1132,6 +1135,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; SDKROOT = macosx; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -1188,6 +1192,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -1234,6 +1239,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/SocketIO-MacTests/SocketAckManagerTest.swift b/SocketIO-MacTests/SocketAckManagerTest.swift index 0515625..de88465 100644 --- a/SocketIO-MacTests/SocketAckManagerTest.swift +++ b/SocketIO-MacTests/SocketAckManagerTest.swift @@ -15,7 +15,7 @@ class SocketAckManagerTest: XCTestCase { func testAddAcks() { let callbackExpection = self.expectation(withDescription: "callbackExpection") let itemsArray = ["Hi", "ho"] - func callback(items: [AnyObject]) { + func callback(_ items: [AnyObject]) { callbackExpection.fulfill() } ackManager.addAck(1, callback: callback) diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index 25c5670..78a04eb 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -10,13 +10,13 @@ import XCTest @testable import SocketIOClientSwift class SocketBasicPacketTest: XCTestCase { - let data = "test".data(using: NSUTF8StringEncoding)! - let data2 = "test2".data(using: NSUTF8StringEncoding)! + let data = "test".data(using: String.Encoding.utf8)! + let data2 = "test2".data(using: String.Encoding.utf8)! func testEmpyEmit() { let expectedSendString = "2[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -24,7 +24,7 @@ class SocketBasicPacketTest: XCTestCase { func testNullEmit() { let expectedSendString = "2[\"test\",null]" let sendData = ["test", NSNull()] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -32,7 +32,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmit() { let expectedSendString = "2[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -40,7 +40,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmitWithQuotes() { let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]" let sendData = ["test", "\"he\"llo world\""] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -48,7 +48,7 @@ class SocketBasicPacketTest: XCTestCase { func testJSONEmit() { let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -56,7 +56,7 @@ class SocketBasicPacketTest: XCTestCase { func testArrayEmit() { let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" let sendData = ["test", ["hello", 1, ["test": "test"]]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -64,7 +64,7 @@ class SocketBasicPacketTest: XCTestCase { func testBinaryEmit() { let expectedSendString = "51-[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -73,7 +73,7 @@ class SocketBasicPacketTest: XCTestCase { func testMultipleBinaryEmit() { let expectedSendString = "52-[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" let sendData = ["test", ["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -82,7 +82,7 @@ class SocketBasicPacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "20[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -90,7 +90,7 @@ class SocketBasicPacketTest: XCTestCase { func testEmitDataWithAck() { let expectedSendString = "51-0[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -99,7 +99,7 @@ class SocketBasicPacketTest: XCTestCase { // Acks func testEmptyAck() { let expectedSendString = "30[]" - let packet = SocketPacket.packetFromEmit(items: [], id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -107,7 +107,7 @@ class SocketBasicPacketTest: XCTestCase { func testNullAck() { let expectedSendString = "30[null]" let sendData = [NSNull()] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -115,7 +115,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringAck() { let expectedSendString = "30[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -123,7 +123,7 @@ class SocketBasicPacketTest: XCTestCase { func testJSONAck() { let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -131,7 +131,7 @@ class SocketBasicPacketTest: XCTestCase { func testBinaryAck() { let expectedSendString = "61-0[{\"_placeholder\":true,\"num\":0}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -140,7 +140,7 @@ class SocketBasicPacketTest: XCTestCase { func testMultipleBinaryAck() { let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) @@ -148,10 +148,10 @@ class SocketBasicPacketTest: XCTestCase { func testBinaryStringPlaceholderInMessage() { let engineString = "52-[\"test\",\"~~0\",{\"num\":0,\"_placeholder\":true},{\"_placeholder\":true,\"num\":1}]" - let socket = SocketIOClient(socketURL: NSURL()) + let socket = SocketIOClient(socketURL: URL(string: "http://localhost/")!) socket.setTestable() - if case let .Right(packet) = socket.parseString(engineString) { + if case let .right(packet) = socket.parseString(engineString) { var packet = packet XCTAssertEqual(packet.event, "test") packet.addData(data) diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 38c08aa..005623c 100644 --- a/SocketIO-MacTests/SocketEngineTest.swift +++ b/SocketIO-MacTests/SocketEngineTest.swift @@ -15,8 +15,8 @@ class SocketEngineTest: XCTestCase { override func setUp() { super.setUp() - client = SocketIOClient(socketURL: NSURL(string: "http://localhost")!) - engine = SocketEngine(client: client, url: NSURL(string: "http://localhost")!, options: nil) + client = SocketIOClient(socketURL: URL(string: "http://localhost")!) + engine = SocketEngine(client: client, url: URL(string: "http://localhost")!, options: nil) client.setTestable() } diff --git a/SocketIO-MacTests/SocketNamespacePacketTest.swift b/SocketIO-MacTests/SocketNamespacePacketTest.swift index 29dbeac..9cbb909 100644 --- a/SocketIO-MacTests/SocketNamespacePacketTest.swift +++ b/SocketIO-MacTests/SocketNamespacePacketTest.swift @@ -10,13 +10,13 @@ import XCTest @testable import SocketIOClientSwift class SocketNamespacePacketTest: XCTestCase { - let data = "test".data(using: NSUTF8StringEncoding)! - let data2 = "test2".data(using: NSUTF8StringEncoding)! + let data = "test".data(using: String.Encoding.utf8)! + let data2 = "test2".data(using: String.Encoding.utf8)! func testEmpyEmit() { let expectedSendString = "2/swift,[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -24,7 +24,7 @@ class SocketNamespacePacketTest: XCTestCase { func testNullEmit() { let expectedSendString = "2/swift,[\"test\",null]" let sendData = ["test", NSNull()] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -32,7 +32,7 @@ class SocketNamespacePacketTest: XCTestCase { func testStringEmit() { let expectedSendString = "2/swift,[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -40,7 +40,7 @@ class SocketNamespacePacketTest: XCTestCase { func testJSONEmit() { let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -48,7 +48,7 @@ class SocketNamespacePacketTest: XCTestCase { func testArrayEmit() { let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" let sendData = ["test", ["hello", 1, ["test": "test"]]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -56,7 +56,7 @@ class SocketNamespacePacketTest: XCTestCase { func testBinaryEmit() { let expectedSendString = "51-/swift,[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -65,7 +65,7 @@ class SocketNamespacePacketTest: XCTestCase { func testMultipleBinaryEmit() { let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" let sendData = ["test", ["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -74,7 +74,7 @@ class SocketNamespacePacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "2/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -82,7 +82,7 @@ class SocketNamespacePacketTest: XCTestCase { func testEmitDataWithAck() { let expectedSendString = "51-/swift,0[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test", data] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -91,7 +91,7 @@ class SocketNamespacePacketTest: XCTestCase { // Acks func testEmptyAck() { let expectedSendString = "3/swift,0[]" - let packet = SocketPacket.packetFromEmit(items: [], id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -99,7 +99,7 @@ class SocketNamespacePacketTest: XCTestCase { func testNullAck() { let expectedSendString = "3/swift,0[null]" let sendData = [NSNull()] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -107,7 +107,7 @@ class SocketNamespacePacketTest: XCTestCase { func testStringAck() { let expectedSendString = "3/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -115,7 +115,7 @@ class SocketNamespacePacketTest: XCTestCase { func testJSONAck() { let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -123,7 +123,7 @@ class SocketNamespacePacketTest: XCTestCase { func testBinaryAck() { let expectedSendString = "61-/swift,0[{\"_placeholder\":true,\"num\":0}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -132,7 +132,7 @@ class SocketNamespacePacketTest: XCTestCase { func testMultipleBinaryAck() { let expectedSendString = "62-/swift,0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) diff --git a/SocketIO-MacTests/SocketObjectiveCTest.m b/SocketIO-MacTests/SocketObjectiveCTest.m index a896585..423ac61 100644 --- a/SocketIO-MacTests/SocketObjectiveCTest.m +++ b/SocketIO-MacTests/SocketObjectiveCTest.m @@ -46,7 +46,7 @@ - (void)testSocketManager { SocketClientManager* manager = [SocketClientManager sharedManager]; - [manager addSocketWithSocket:self.socket labeledAs:@"test"]; + [manager addSocket:self.socket labeledAs:@"test"]; [manager removeSocketWithLabel:@"test"]; } diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index bb495b9..22ab7a0 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -10,10 +10,10 @@ import XCTest @testable import SocketIOClientSwift class SocketParserTest: XCTestCase { - let testSocket = SocketIOClient(socketURL: NSURL()) + let testSocket = SocketIOClient(socketURL: URL(string: "http://localhost/")!) //Format key: message; namespace-data-binary-id - static let packetTypes: [String: (String, [AnyObject], [NSData], Int)] = [ + static let packetTypes: [String: (String, [AnyObject], [Data], Int)] = [ "0": ("/", [], [], -1), "1": ("/", [], [], -1), "25[\"test\"]": ("/", ["test"], [], 5), "2[\"test\",\"~~0\"]": ("/", ["test", "~~0"], [], -1), @@ -31,97 +31,97 @@ class SocketParserTest: XCTestCase { func testDisconnect() { let message = "1" - validateParseResult(message: message) + validateParseResult(message) } func testConnect() { let message = "0" - validateParseResult(message: message) + validateParseResult(message) } func testDisconnectNameSpace() { let message = "1/swift" - validateParseResult(message: message) + validateParseResult(message) } func testConnecttNameSpace() { let message = "0/swift" - validateParseResult(message: message) + validateParseResult(message) } func testIdEvent() { let message = "25[\"test\"]" - validateParseResult(message: message) + validateParseResult(message) } func testBinaryPlaceholderAsString() { let message = "2[\"test\",\"~~0\"]" - validateParseResult(message: message) + validateParseResult(message) } func testNameSpaceArrayParse() { let message = "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]" - validateParseResult(message: message) + validateParseResult(message) } func testNameSpaceArrayAckParse() { let message = "3/swift,0[[\"test3\",\"test4\"]]" - validateParseResult(message: message) + validateParseResult(message) } func testNameSpaceBinaryEventParse() { let message = "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" - validateParseResult(message: message) + validateParseResult(message) } func testNameSpaceBinaryAckParse() { let message = "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" - validateParseResult(message: message) + validateParseResult(message) } func testNamespaceErrorParse() { let message = "4/swift," - validateParseResult(message: message) + validateParseResult(message) } func testErrorTypeString() { let message = "4\"ERROR\"" - validateParseResult(message: message) + validateParseResult(message) } func testErrorTypeDictionary() { let message = "4{\"test\":2}" - validateParseResult(message: message) + validateParseResult(message) } func testErrorTypeInt() { let message = "41" - validateParseResult(message: message) + validateParseResult(message) } func testInvalidInput() { let message = "8" switch testSocket.parseString(message) { - case .Left(_): + case .left(_): return - case .Right(_): + case .right(_): XCTFail("Created packet when shouldn't have") } } func testGenericParser() { var parser = SocketStringReader(message: "61-/swift,") - XCTAssertEqual(parser.read(length: 1), "6") + XCTAssertEqual(parser.read(1), "6") XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") XCTAssertEqual(parser.currentCharacter, "/") } - func validateParseResult(message: String) { + func validateParseResult(_ message: String) { let validValues = SocketParserTest.packetTypes[message]! let packet = testSocket.parseString(message) let type = message.substring(with: Range(message.startIndex.. SocketIOClient? { + public func removeSocket(_ socket: SocketIOClient) -> SocketIOClient? { var returnSocket: SocketIOClient? for (label, dictSocket) in sockets where dictSocket === socket { diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index f30ecc9..d48e75b 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -25,9 +25,9 @@ import Foundation public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWebsocket { - public let emitQueue = dispatch_queue_create("com.socketio.engineEmitQueue", DISPATCH_QUEUE_SERIAL)! - public let handleQueue = dispatch_queue_create("com.socketio.engineHandleQueue", DISPATCH_QUEUE_SERIAL)! - public let parseQueue = dispatch_queue_create("com.socketio.engineParseQueue", DISPATCH_QUEUE_SERIAL)! + public let emitQueue = DispatchQueue(label: "com.socketio.engineEmitQueue", attributes: DispatchQueueAttributes.serial) + public let handleQueue = DispatchQueue(label: "com.socketio.engineHandleQueue", attributes: DispatchQueueAttributes.serial) + public let parseQueue = DispatchQueue(label: "com.socketio.engineParseQueue", attributes: DispatchQueueAttributes.serial) public var connectParams: [String: AnyObject]? { didSet { @@ -41,7 +41,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe public private(set) var closed = false public private(set) var connected = false - public private(set) var cookies: [NSHTTPCookie]? + public private(set) var cookies: [HTTPCookie]? public private(set) var doubleEncodeUTF8 = true public private(set) var extraHeaders: [String: String]? public private(set) var fastUpgrade = false @@ -50,20 +50,20 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe public private(set) var invalidated = false public private(set) var polling = true public private(set) var probing = false - public private(set) var session: NSURLSession? + public private(set) var session: URLSession? public private(set) var sid = "" public private(set) var socketPath = "/engine.io/" - public private(set) var urlPolling = NSURL() - public private(set) var urlWebSocket = NSURL() + public private(set) var urlPolling = URL(string: "http://localhost/")! + public private(set) var urlWebSocket = URL(string: "http://localhost/")! public private(set) var websocket = false public private(set) var ws: WebSocket? public weak var client: SocketEngineClient? - private weak var sessionDelegate: NSURLSessionDelegate? + private weak var sessionDelegate: URLSessionDelegate? private let logType = "SocketEngine" - private let url: NSURL + private let url: URL private var pingInterval: Double? private var pingTimeout = 0.0 { @@ -80,7 +80,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe private var selfSigned = false private var voipEnabled = false - public init(client: SocketEngineClient, url: NSURL, options: Set) { + public init(client: SocketEngineClient, url: URL, options: Set) { self.client = client self.url = url @@ -120,7 +120,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe (urlPolling, urlWebSocket) = createURLs() } - public convenience init(client: SocketEngineClient, url: NSURL, options: NSDictionary?) { + public convenience init(client: SocketEngineClient, url: URL, options: NSDictionary?) { self.init(client: client, url: url, options: options?.toSocketOptionsSet() ?? []) } @@ -131,11 +131,11 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } private func checkAndHandleEngineError(_ msg: String) { - guard let stringData = msg.data(using: NSUTF8StringEncoding, + guard let stringData = msg.data(using: String.Encoding.utf8, allowLossyConversion: false) else { return } do { - if let dict = try NSJSONSerialization.jsonObject(with: stringData, options: .mutableContainers) as? NSDictionary { + if let dict = try JSONSerialization.jsonObject(with: stringData, options: .mutableContainers) as? NSDictionary { guard let error = dict["message"] as? String else { return } /* @@ -144,10 +144,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe 2: Bad handshake request 3: Bad request */ - didError(error: error) + didError(error) } } catch { - didError(error: "Got unknown error from server \(msg)") + didError("Got unknown error from server \(msg)") } } @@ -156,7 +156,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe // binary in base64 string let noPrefix = message[message.characters.index(message.startIndex, offsetBy: 2).. (NSURL, NSURL) { + private func createURLs() -> (URL, URL) { if client == nil { - return (NSURL(), NSURL()) + return (URL(string: "http://localhost/")!, URL(string: "http://localhost/")!) } - let urlPolling = NSURLComponents(string: url.absoluteString)! - let urlWebSocket = NSURLComponents(string: url.absoluteString)! + var urlPolling = URLComponents(string: url.absoluteString!)! + var urlWebSocket = URLComponents(string: url.absoluteString!)! var queryString = "" urlWebSocket.path = socketPath @@ -252,7 +252,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe ws = WebSocket(url: urlWebSocketWithSid) if cookies != nil { - let headers = NSHTTPCookie.requestHeaderFields(with: cookies!) + let headers = HTTPCookie.requestHeaderFields(with: cookies!) for (key, value) in headers { ws?.headers[key] = value } @@ -273,20 +273,20 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe ws?.connect() } - public func didError(error: String) { + public func didError(_ error: String) { DefaultSocketLogger.Logger.error("%@", type: logType, args: error) - client?.engineDidError(reason: error) - disconnect(reason: error) + client?.engineDidError(error) + disconnect(error) } - public func disconnect(reason: String) { + public func disconnect(_ reason: String) { guard connected else { return closeOutEngine() } DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) if closed { closeOutEngine() - client?.engineDidClose(reason: reason) + client?.engineDidClose(reason) return } @@ -301,7 +301,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe // We need to take special care when we're polling that we send it ASAP // Also make sure we're on the emitQueue since we're touching postWait private func disconnectPolling() { - dispatch_sync(emitQueue) { + emitQueue.sync { self.postWait.append(String(SocketEnginePacketType.close.rawValue)) let req = self.createRequestForPostWithPostWait() self.doRequest(for: req) {_, _, _ in } @@ -326,7 +326,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe private func flushProbeWait() { DefaultSocketLogger.Logger.log("Flushing probe wait", type: logType) - dispatch_async(emitQueue) { + emitQueue.async { for waiter in self.probeWait { self.write(waiter.msg, withType: waiter.type, withData: waiter.data) } @@ -345,14 +345,14 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe guard let ws = self.ws else { return } for msg in postWait { - ws.writeString(str: msg) + ws.writeString(msg) } postWait.removeAll(keepingCapacity: true) } - private func handleClose(reason: String) { - client?.engineDidClose(reason: reason) + private func handleClose(_ reason: String) { + client?.engineDidClose(reason) } private func handleMessage(_ message: String) { @@ -363,11 +363,11 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe doPoll() } - private func handleOpen(openMessage: String) { - let mesData = openMessage.data(using: NSUTF8StringEncoding, allowLossyConversion: false)! + private func handleOpen(_ openMessage: String) { + let mesData = openMessage.data(using: String.Encoding.utf8, allowLossyConversion: false)! do { - let json = try NSJSONSerialization.jsonObject(with: mesData, - options: NSJSONReadingOptions.allowFragments) as? NSDictionary + let json = try JSONSerialization.jsonObject(with: mesData, + options: JSONSerialization.ReadingOptions.allowFragments) as? NSDictionary if let sid = json?["sid"] as? String { let upgradeWs: Bool @@ -395,14 +395,14 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe doPoll() } - client?.engineDidOpen(reason: "Connect") + client?.engineDidOpen("Connect") } } catch { - didError(error: "Error parsing open packet") + didError("Error parsing open packet") } } - private func handlePong(pongMessage: String) { + private func handlePong(_ pongMessage: String) { pongsMissed = 0 // We should upgrade @@ -411,9 +411,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } } - public func parseEngineData(_ data: NSData) { + public func parseEngineData(_ data: Data) { DefaultSocketLogger.Logger.log("Got binary data: %@", type: "SocketEngine", args: data) - client?.parseEngineBinaryData(data.subdata(with: NSMakeRange(1, data.length - 1))) + + client?.parseEngineBinaryData(data.subdata(in: Range(uncheckedBounds: (1, data.count - 1)))) } public func parseEngineMessage(_ message: String, fromPolling: Bool) { @@ -431,7 +432,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } if fromPolling && type != .noop && doubleEncodeUTF8 { - fixedString = fixDoubleUTF8(string: message) + fixedString = fixDoubleUTF8(message) } else { fixedString = message } @@ -443,12 +444,11 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe case .noop: handleNOOP() case .pong: - handlePong(pongMessage: fixedString) + handlePong(fixedString) case .open: - handleOpen(openMessage: - fixedString[fixedString.characters.index(after: fixedString.characters.startIndex).. pongsMissedMax { - client?.engineDidClose(reason: "Ping timeout") + client?.engineDidClose("Ping timeout") return } @@ -486,8 +486,8 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe pongsMissed += 1 write("", withType: .ping, withData: []) - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(pingInterval * Double(NSEC_PER_SEC))) - dispatch_after(time, dispatch_get_main_queue()) {[weak self] in + let time = DispatchTime.now() + Double(Int64(pingInterval * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) + DispatchQueue.main.after(when: time) {[weak self] in self?.sendPing() } } @@ -505,8 +505,8 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } /// Write a message, independent of transport. - public func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) { - dispatch_async(emitQueue) { + public func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data]) { + emitQueue.async { guard self.connected else { return } if self.websocket { @@ -524,7 +524,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } // Delegate methods - public func websocketDidConnect(socket: WebSocket) { + public func websocketDidConnect(_ socket: WebSocket) { if !forceWebsockets { probing = true probeWebSocket() @@ -535,11 +535,11 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } } - public func websocketDidDisconnect(socket: WebSocket, error: NSError?) { + public func websocketDidDisconnect(_ socket: WebSocket, error: NSError?) { probing = false if closed { - client?.engineDidClose(reason: "Disconnect") + client?.engineDidClose("Disconnect") return } @@ -548,9 +548,9 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe websocket = false if let reason = error?.localizedDescription { - didError(error: reason) + didError(reason) } else { - client?.engineDidClose(reason: "Socket Disconnected") + client?.engineDidClose("Socket Disconnected") } } else { flushProbeWait() diff --git a/Source/SocketEngineClient.swift b/Source/SocketEngineClient.swift index 62c04b7..8f77d51 100644 --- a/Source/SocketEngineClient.swift +++ b/Source/SocketEngineClient.swift @@ -26,9 +26,9 @@ import Foundation @objc public protocol SocketEngineClient { - func engineDidError(reason: String) - func engineDidClose(reason: String) - func engineDidOpen(reason: String) + func engineDidError(_ reason: String) + func engineDidClose(_ reason: String) + func engineDidOpen(_ reason: String) func parseEngineMessage(_ msg: String) - func parseEngineBinaryData(_ data: NSData) + func parseEngineBinaryData(_ data: Data) } diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 76f3abf..b0cc50b 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -30,7 +30,7 @@ public protocol SocketEnginePollable : SocketEngineSpec { /// Holds strings waiting to be sent over polling. /// You shouldn't need to mess with this. var postWait: [String] { get set } - var session: NSURLSession? { get } + var session: URLSession? { get } /// Because socket.io doesn't let you send two polling request at the same time /// we have to keep track if there's an outstanding poll var waitingForPoll: Bool { get set } @@ -39,7 +39,7 @@ public protocol SocketEnginePollable : SocketEngineSpec { var waitingForPost: Bool { get set } func doPoll() - func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) + func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [Data]) func stopPolling() } @@ -47,7 +47,7 @@ public protocol SocketEnginePollable : SocketEngineSpec { extension SocketEnginePollable { private func addHeaders(for req: NSMutableURLRequest) { if cookies != nil { - let headers = NSHTTPCookie.requestHeaderFields(with: cookies!) + let headers = HTTPCookie.requestHeaderFields(with: cookies!) req.allHTTPHeaderFields = headers } @@ -58,7 +58,7 @@ extension SocketEnginePollable { } } - func createRequestForPostWithPostWait() -> NSURLRequest { + func createRequestForPostWithPostWait() -> URLRequest { var postStr = "" for packet in postWait { @@ -71,20 +71,20 @@ extension SocketEnginePollable { postWait.removeAll(keepingCapacity: false) - let req = NSMutableURLRequest(url: urlPollingWithSid) + let req = NSMutableURLRequest(url: urlPollingWithSid as URL) addHeaders(for: req) req.httpMethod = "POST" req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type") - let postData = postStr.data(using: NSUTF8StringEncoding, + let postData = postStr.data(using: String.Encoding.utf8, allowLossyConversion: false)! req.httpBody = postData - req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length") + req.setValue(String(postData.count), forHTTPHeaderField: "Content-Length") - return req + return req as URLRequest } public func doPoll() { @@ -93,13 +93,13 @@ extension SocketEnginePollable { } waitingForPoll = true - let req = NSMutableURLRequest(url: urlPollingWithSid) + let req = NSMutableURLRequest(url: urlPollingWithSid as URL) addHeaders(for: req) - doLongPoll(for: req) + doLongPoll(for: req as URLRequest) } - func doRequest(for req: NSURLRequest, callbackWith callback: (NSData?, NSURLResponse?, NSError?) -> Void) { + func doRequest(for req: URLRequest, callbackWith callback: (Data?, URLResponse?, NSError?) -> Void) { if !polling || closed || invalidated || fastUpgrade { DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEnginePolling") return @@ -110,7 +110,7 @@ extension SocketEnginePollable { session?.dataTask(with: req, completionHandler: callback).resume() } - func doLongPoll(for req: NSURLRequest) { + func doLongPoll(for req: URLRequest) { doRequest(for: req) {[weak self] data, res, err in guard let this = self where this.polling else { return } @@ -118,7 +118,7 @@ extension SocketEnginePollable { DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { - this.didError(error: err?.localizedDescription ?? "Error") + this.didError(err?.localizedDescription ?? "Error") } return @@ -126,8 +126,8 @@ extension SocketEnginePollable { DefaultSocketLogger.Logger.log("Got polling response", type: "SocketEnginePolling") - if let str = String(data: data!, encoding: NSUTF8StringEncoding) { - dispatch_async(this.parseQueue) { + if let str = String(data: data!, encoding: String.Encoding.utf8) { + this.parseQueue.async { this.parsePollingMessage(str) } } @@ -163,7 +163,7 @@ extension SocketEnginePollable { DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { - this.didError(error: err?.localizedDescription ?? "Error") + this.didError(err?.localizedDescription ?? "Error") } return @@ -171,7 +171,7 @@ extension SocketEnginePollable { this.waitingForPost = false - dispatch_async(this.emitQueue) { + this.emitQueue.async { if !this.fastUpgrade { this.flushWaitingForPost() this.doPoll() @@ -187,13 +187,13 @@ extension SocketEnginePollable { while reader.hasNext { if let n = Int(reader.readUntilStringOccurence(":")) { - let str = reader.read(length: n) + let str = reader.read(n) - dispatch_async(handleQueue) { + (handleQueue).async { self.parseEngineMessage(str, fromPolling: true) } } else { - dispatch_async(handleQueue) { + handleQueue.async { self.parseEngineMessage(str, fromPolling: true) } break @@ -203,12 +203,12 @@ extension SocketEnginePollable { /// Send polling message. /// Only call on emitQueue - public func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { + public func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [Data]) { DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEnginePolling", args: message, type.rawValue) let fixedMessage: String if doubleEncodeUTF8 { - fixedMessage = doubleEncodeUTF8(string: message) + fixedMessage = doubleEncodeUTF8(message) } else { fixedMessage = message } @@ -216,7 +216,7 @@ extension SocketEnginePollable { postWait.append(String(type.rawValue) + fixedMessage) for data in datas { - if case let .Right(bin) = createBinaryDataForSend(using: data) { + if case let .right(bin) = createBinaryDataForSend(using: data) { postWait.append(bin) } } diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index 1b0ee4e..d78cc1c 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -31,77 +31,77 @@ import Foundation var connected: Bool { get } var connectParams: [String: AnyObject]? { get set } var doubleEncodeUTF8: Bool { get } - var cookies: [NSHTTPCookie]? { get } + var cookies: [HTTPCookie]? { get } var extraHeaders: [String: String]? { get } var fastUpgrade: Bool { get } var forcePolling: Bool { get } var forceWebsockets: Bool { get } - var parseQueue: dispatch_queue_t { get } + var parseQueue: DispatchQueue { get } var polling: Bool { get } var probing: Bool { get } - var emitQueue: dispatch_queue_t { get } - var handleQueue: dispatch_queue_t { get } + var emitQueue: DispatchQueue { get } + var handleQueue: DispatchQueue { get } var sid: String { get } var socketPath: String { get } - var urlPolling: NSURL { get } - var urlWebSocket: NSURL { get } + var urlPolling: URL { get } + var urlWebSocket: URL { get } var websocket: Bool { get } var ws: WebSocket? { get } - init(client: SocketEngineClient, url: NSURL, options: NSDictionary?) + init(client: SocketEngineClient, url: URL, options: NSDictionary?) func connect() - func didError(error: String) - func disconnect(reason: String) + func didError(_ error: String) + func disconnect(_ reason: String) func doFastUpgrade() func flushWaitingForPostToWebSocket() - func parseEngineData(_ data: NSData) + func parseEngineData(_ data: Data) func parseEngineMessage(_ message: String, fromPolling: Bool) - func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) + func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [Data]) } extension SocketEngineSpec { - var urlPollingWithSid: NSURL { - let com = NSURLComponents(url: urlPolling, resolvingAgainstBaseURL: false)! + var urlPollingWithSid: URL { + var com = URLComponents(url: urlPolling, resolvingAgainstBaseURL: false)! com.percentEncodedQuery = com.percentEncodedQuery! + "&sid=\(sid.urlEncode()!)" return com.url! } - var urlWebSocketWithSid: NSURL { - let com = NSURLComponents(url: urlWebSocket, resolvingAgainstBaseURL: false)! + var urlWebSocketWithSid: URL { + var com = URLComponents(url: urlWebSocket, resolvingAgainstBaseURL: false)! com.percentEncodedQuery = com.percentEncodedQuery! + (sid == "" ? "" : "&sid=\(sid.urlEncode()!)") return com.url! } - func createBinaryDataForSend(using data: NSData) -> Either { + func createBinaryDataForSend(using data: Data) -> Either { if websocket { var byteArray = [UInt8](repeating: 0x4, count: 1) let mutData = NSMutableData(bytes: &byteArray, length: 1) mutData.append(data) - return .Left(mutData) + return .left(mutData as Data) } else { - let str = "b4" + data.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0)) + let str = "b4" + data.base64EncodedString(NSData.Base64EncodingOptions(rawValue: 0)) - return .Right(str) + return .right(str) } } - func doubleEncodeUTF8(string: String) -> String { - if let latin1 = string.data(using: NSUTF8StringEncoding), - utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding) { + func doubleEncodeUTF8(_ string: String) -> String { + if let latin1 = string.data(using: String.Encoding.utf8), + utf8 = NSString(data: latin1, encoding: String.Encoding.isoLatin1.rawValue) { return utf8 as String } else { return string } } - func fixDoubleUTF8(string: String) -> String { - if let utf8 = string.data(using: NSISOLatin1StringEncoding), - latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding) { + func fixDoubleUTF8(_ string: String) -> String { + if let utf8 = string.data(using: String.Encoding.isoLatin1), + latin1 = NSString(data: utf8, encoding: String.Encoding.utf8.rawValue) { return latin1 as String } else { return string @@ -109,7 +109,7 @@ extension SocketEngineSpec { } /// Send an engine message (4) - func send(_ msg: String, withData datas: [NSData]) { + func send(_ msg: String, withData datas: [Data]) { write(msg, withType: .message, withData: datas) } } diff --git a/Source/SocketEngineWebsocket.swift b/Source/SocketEngineWebsocket.swift index 8132ed6..ef7ee4d 100644 --- a/Source/SocketEngineWebsocket.swift +++ b/Source/SocketEngineWebsocket.swift @@ -27,7 +27,7 @@ import Foundation /// Protocol that is used to implement socket.io WebSocket support public protocol SocketEngineWebsocket : SocketEngineSpec, WebSocketDelegate { - func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) + func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [Data]) } // WebSocket methods @@ -40,23 +40,23 @@ extension SocketEngineWebsocket { /// Send message on WebSockets /// Only call on emitQueue - public func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { + public func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [Data]) { DefaultSocketLogger.Logger.log("Sending ws: %@ as type: %@", type: "SocketEngine", args: str, type.rawValue) - ws?.writeString(str: "\(type.rawValue)\(str)") + ws?.writeString("\(type.rawValue)\(str)") for data in datas { - if case let .Left(bin) = createBinaryDataForSend(using: data) { - ws?.writeData(data: bin) + if case let .left(bin) = createBinaryDataForSend(using: data) { + ws?.writeData(bin) } } } - public func websocketDidReceiveMessage(socket: WebSocket, text: String) { + public func websocketDidReceiveMessage(_ socket: WebSocket, text: String) { parseEngineMessage(text, fromPolling: false) } - public func websocketDidReceiveData(socket: WebSocket, data: NSData) { + public func websocketDidReceiveData(_ socket: WebSocket, data: Data) { parseEngineData(data) } } diff --git a/Source/SocketEventHandler.swift b/Source/SocketEventHandler.swift index 41774a9..367d214 100644 --- a/Source/SocketEventHandler.swift +++ b/Source/SocketEventHandler.swift @@ -26,10 +26,10 @@ import Foundation struct SocketEventHandler { let event: String - let id: NSUUID + let id: UUID let callback: NormalCallback - func executeCallback(items: [AnyObject], withAck ack: Int, withSocket socket: SocketIOClient) { + func executeCallback(_ items: [AnyObject], withAck ack: Int, withSocket socket: SocketIOClient) { callback(items, SocketAckEmitter(socket: socket, ackNum: ack)) } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 44a0272..56031f3 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable { - public let socketURL: NSURL + public let socketURL: URL public private(set) var engine: SocketEngineSpec? public private(set) var status = SocketIOClientStatus.notConnected { @@ -49,9 +49,9 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return nsp + "#" + (engine?.sid ?? "") } - private let emitQueue = dispatch_queue_create("com.socketio.emitQueue", DISPATCH_QUEUE_SERIAL)! + private let emitQueue = DispatchQueue(label: "com.socketio.emitQueue", attributes: DispatchQueueAttributes.serial) private let logType = "SocketIOClient" - private let parseQueue = dispatch_queue_create("com.socketio.parseQueue", DISPATCH_QUEUE_SERIAL)! + private let parseQueue = DispatchQueue(label: "com.socketio.parseQueue", attributes: DispatchQueueAttributes.serial) private var anyHandler: ((SocketAnyEvent) -> Void)? private var currentReconnectAttempt = 0 @@ -60,18 +60,18 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable private var reconnecting = false private(set) var currentAck = -1 - private(set) var handleQueue = dispatch_get_main_queue()! + private(set) var handleQueue = DispatchQueue.main private(set) var reconnectAttempts = -1 var waitingPackets = [SocketPacket]() /// Type safe way to create a new SocketIOClient. opts can be omitted - public init(socketURL: NSURL, options: Set = []) { + public init(socketURL: URL, options: Set = []) { self.options = options self.socketURL = socketURL - if socketURL.absoluteString.hasPrefix("https://") { - self.options.insertIgnore(element: .secure(true)) + if ((socketURL.absoluteString?.hasPrefix("https://")) != nil) { + self.options.insertIgnore(.secure(true)) } for option in options { @@ -97,20 +97,20 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } } - self.options.insertIgnore(element: .path("/socket.io/")) + self.options.insertIgnore(.path("/socket.io/")) super.init() } /// Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity. /// If using Swift it's recommended to use `init(socketURL: NSURL, options: Set)` - public convenience init(socketURL: NSURL, options: NSDictionary?) { + public convenience init(socketURL: URL, options: NSDictionary?) { self.init(socketURL: socketURL, options: options?.toSocketOptionsSet() ?? []) } deinit { DefaultSocketLogger.Logger.log("Client is being released", type: logType) - engine?.disconnect(reason: "Client Deinit") + engine?.disconnect("Client Deinit") } private func addEngine() -> SocketEngineSpec { @@ -123,11 +123,11 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Connect to the server. public func connect() { - connect(timeoutAfter: 0, handleWith: nil) + connect(0, handleWith: nil) } /// Connect to the server. If we aren't connected after timeoutAfter, call handler - public func connect(timeoutAfter: Int, handleWith handler: (() -> Void)?) { + public func connect(_ timeoutAfter: Int, handleWith handler: (() -> Void)?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") guard status != .connected else { @@ -145,30 +145,30 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable guard timeoutAfter != 0 else { return } - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) + let time = DispatchTime.now() + Double(Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - dispatch_after(time, handleQueue) {[weak self] in + handleQueue.after(when: time) {[weak self] in if let this = self where this.status != .connected && this.status != .disconnected { this.status = .disconnected - this.engine?.disconnect(reason: "Connect timeout") + this.engine?.disconnect("Connect timeout") handler?() } } } - private func createOnAck(items: [AnyObject]) -> OnAckCallback { + private func createOnAck(_ items: [AnyObject]) -> OnAckCallback { currentAck += 1 return {[weak self, ack = currentAck] timeout, callback in if let this = self { this.ackHandlers.addAck(ack, callback: callback) - this._emit(data: items, ack: ack) + this._emit(items, ack: ack) if timeout != 0 { - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) + let time = DispatchTime.now() + Double(Int64(timeout * NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - dispatch_after(time, this.handleQueue) { + this.handleQueue.after(when: time) { this.ackHandlers.timeoutAck(ack) } } @@ -185,7 +185,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handleEvent("connect", data: [], isInternalMessage: false) } - func didDisconnect(reason: String) { + func didDisconnect(_ reason: String) { guard status != .disconnected else { return } DefaultSocketLogger.Logger.log("Disconnected: %@", type: logType, args: reason) @@ -193,7 +193,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable status = .disconnected // Make sure the engine is actually dead. - engine?.disconnect(reason: reason) + engine?.disconnect(reason) handleEvent("disconnect", data: [reason as AnyObject], isInternalMessage: true) } @@ -203,12 +203,12 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DefaultSocketLogger.Logger.log("Closing socket", type: logType) - didDisconnect(reason: "Disconnect") + didDisconnect("Disconnect") } /// Send a message to the server public func emit(_ event: String, _ items: SocketData...) { - emit(event, with: socketDataToAnyObject(data: items)) + emit(event, with: socketDataToAnyObject(items)) } /// Same as emit, but meant for Objective-C @@ -218,28 +218,28 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return } - _emit(data: [event as AnyObject] + items) + _emit([event as AnyObject] + items) } /// Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add /// an ack. public func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback { - return emitWithAck(event, with: socketDataToAnyObject(data: items)) + return emitWithAck(event, with: socketDataToAnyObject(items)) } /// Same as emitWithAck, but for Objective-C public func emitWithAck(_ event: String, with items: [AnyObject]) -> OnAckCallback { - return createOnAck(items: [event as AnyObject] + items) + return createOnAck([event as AnyObject] + items) } - private func _emit(data: [AnyObject], ack: Int? = nil) { - dispatch_async(emitQueue) { + private func _emit(_ data: [AnyObject], ack: Int? = nil) { + emitQueue.async { guard self.status == .connected else { self.handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true) return } - let packet = SocketPacket.packetFromEmit(items: data, id: ack ?? -1, nsp: self.nsp, ack: false) + let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: self.nsp, ack: false) let str = packet.packetString DefaultSocketLogger.Logger.log("Emitting: %@", type: self.logType, args: str) @@ -250,9 +250,9 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable // If the server wants to know that the client received data func emitAck(_ ack: Int, with items: [AnyObject]) { - dispatch_async(emitQueue) { + emitQueue.async { if self.status == .connected { - let packet = SocketPacket.packetFromEmit(items: items, id: ack ?? -1, nsp: self.nsp, ack: true) + let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) let str = packet.packetString DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str) @@ -262,7 +262,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } } - public func engineDidClose(reason: String) { + public func engineDidClose(_ reason: String) { waitingPackets.removeAll() if status != .disconnected { @@ -270,21 +270,21 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } if status == .disconnected || !reconnects { - didDisconnect(reason: reason) + didDisconnect(reason) } else if !reconnecting { reconnecting = true - tryReconnect(reason: reason) + tryReconnect(reason) } } /// error - public func engineDidError(reason: String) { + public func engineDidError(_ reason: String) { DefaultSocketLogger.Logger.error("%@", type: logType, args: reason) handleEvent("error", data: [reason as AnyObject], isInternalMessage: true) } - public func engineDidOpen(reason: String) { + public func engineDidOpen(_ reason: String) { DefaultSocketLogger.Logger.log(reason, type: "SocketEngineClient") } @@ -303,11 +303,11 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DefaultSocketLogger.Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "") - dispatch_async(handleQueue) { + handleQueue.async { self.anyHandler?(SocketAnyEvent(event: event, items: data)) for handler in self.handlers where handler.event == event { - handler.executeCallback(items: data, withAck: ack, withSocket: self) + handler.executeCallback(data, withAck: ack, withSocket: self) } } } @@ -338,7 +338,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Removes a handler with the specified UUID gotten from an `on` or `once` - public func off(id: NSUUID) { + public func off(id: UUID) { DefaultSocketLogger.Logger.log("Removing handler with id: %@", type: logType, args: id) handlers = handlers.filter({ $0.id != id }) @@ -347,22 +347,22 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Adds a handler for an event. /// Returns: A unique id for the handler @discardableResult - public func on(_ event: String, callback: NormalCallback) -> NSUUID { + public func on(_ event: String, callback: NormalCallback) -> UUID { DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event, id: NSUUID(), callback: callback) + let handler = SocketEventHandler(event: event, id: UUID(), callback: callback) handlers.append(handler) - return handler.id + return handler.id as UUID } /// Adds a single-use handler for an event. /// Returns: A unique id for the handler @discardableResult - public func once(event: String, callback: NormalCallback) -> NSUUID { + public func once(_ event: String, callback: NormalCallback) -> UUID { DefaultSocketLogger.Logger.log("Adding once handler for event: %@", type: logType, args: event) - let id = NSUUID() + let id = UUID() let handler = SocketEventHandler(event: event, id: id) {[weak self] data, ack in guard let this = self else { return } @@ -372,24 +372,24 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handlers.append(handler) - return handler.id + return handler.id as UUID } /// Adds a handler that will be called on every event. - public func onAny(handler: (SocketAnyEvent) -> Void) { + public func onAny(_ handler: (SocketAnyEvent) -> Void) { anyHandler = handler } public func parseEngineMessage(_ msg: String) { DefaultSocketLogger.Logger.log("Should parse message: %@", type: "SocketIOClient", args: msg) - dispatch_async(parseQueue) { + parseQueue.async { self.parseSocketMessage(msg) } } - public func parseEngineBinaryData(_ data: NSData) { - dispatch_async(parseQueue) { + public func parseEngineBinaryData(_ data: Data) { + parseQueue.async { self.parseBinaryData(data) } } @@ -398,7 +398,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func reconnect() { guard !reconnecting else { return } - engine?.disconnect(reason: "manual reconnect") + engine?.disconnect("manual reconnect") } /// Removes all handlers. @@ -407,11 +407,11 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handlers.removeAll(keepingCapacity: false) } - func socketDataToAnyObject(data: [SocketData]) -> [AnyObject] { + func socketDataToAnyObject(_ data: [SocketData]) -> [AnyObject] { return data.flatMap({$0 as? AnyObject}) } - private func tryReconnect(reason: String) { + private func tryReconnect(_ reason: String) { if reconnecting { DefaultSocketLogger.Logger.log("Starting reconnect", type: logType) handleEvent("reconnect", data: [reason as AnyObject], isInternalMessage: true) @@ -426,7 +426,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { - return didDisconnect(reason: "Reconnect Failed") + return didDisconnect("Reconnect Failed") } DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType) @@ -436,9 +436,9 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable currentReconnectAttempt += 1 connect() - let dispatchAfter = dispatch_time(DISPATCH_TIME_NOW, Int64(UInt64(reconnectWait) * NSEC_PER_SEC)) + let dispatchAfter = DispatchTime.now() + Double(Int64(UInt64(reconnectWait) * NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - dispatch_after(dispatchAfter, dispatch_get_main_queue(), _tryReconnect) + DispatchQueue.main.after(when: dispatchAfter, execute: _tryReconnect) } } @@ -452,11 +452,11 @@ extension SocketIOClient { status = .connected } - func setTestEngine(engine: SocketEngineSpec?) { + func setTestEngine(_ engine: SocketEngineSpec?) { self.engine = engine } - func emitTest(event: String, _ data: AnyObject...) { - self._emit(data: [event as AnyObject] + data) + func emitTest(_ event: String, _ data: AnyObject...) { + self._emit([event as AnyObject] + data) } } diff --git a/Source/SocketIOClientOption.swift b/Source/SocketIOClientOption.swift index 96133cb..c06a245 100644 --- a/Source/SocketIOClientOption.swift +++ b/Source/SocketIOClientOption.swift @@ -30,13 +30,13 @@ protocol ClientOption : CustomStringConvertible, Hashable { public enum SocketIOClientOption : ClientOption { case connectParams([String: AnyObject]) - case cookies([NSHTTPCookie]) + case cookies([HTTPCookie]) case doubleEncodeUTF8(Bool) case extraHeaders([String: String]) case forceNew(Bool) case forcePolling(Bool) case forceWebsockets(Bool) - case handleQueue(dispatch_queue_t) + case handleQueue(DispatchQueue) case log(Bool) case logger(SocketLogger) case nsp(String) @@ -47,7 +47,7 @@ public enum SocketIOClientOption : ClientOption { case secure(Bool) case security(SSLSecurity) case selfSigned(Bool) - case sessionDelegate(NSURLSessionDelegate) + case sessionDelegate(URLSessionDelegate) case voipEnabled(Bool) public var description: String { @@ -158,7 +158,7 @@ public func ==(lhs: SocketIOClientOption, rhs: SocketIOClientOption) -> Bool { } extension Set where Element : ClientOption { - mutating func insertIgnore(element: Element) { + mutating func insertIgnore(_ element: Element) { if !contains(element) { insert(element) } @@ -166,11 +166,11 @@ extension Set where Element : ClientOption { } extension NSDictionary { - private static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? { + private static func keyValueToSocketIOClientOption(_ key: String, value: AnyObject) -> SocketIOClientOption? { switch (key, value) { case let ("connectParams", params as [String: AnyObject]): return .connectParams(params) - case let ("cookies", cookies as [NSHTTPCookie]): + case let ("cookies", cookies as [HTTPCookie]): return .cookies(cookies) case let ("doubleEncodeUTF8", encode as Bool): return .doubleEncodeUTF8(encode) @@ -182,7 +182,7 @@ extension NSDictionary { return .forcePolling(force) case let ("forceWebsockets", force as Bool): return .forceWebsockets(force) - case let ("handleQueue", queue as dispatch_queue_t): + case let ("handleQueue", queue as DispatchQueue): return .handleQueue(queue) case let ("log", log as Bool): return .log(log) @@ -204,7 +204,7 @@ extension NSDictionary { return .security(security) case let ("selfSigned", selfSigned as Bool): return .selfSigned(selfSigned) - case let ("sessionDelegate", delegate as NSURLSessionDelegate): + case let ("sessionDelegate", delegate as URLSessionDelegate): return .sessionDelegate(delegate) case let ("voipEnabled", enable as Bool): return .voipEnabled(enable) @@ -217,8 +217,8 @@ extension NSDictionary { var options = Set() for (rawKey, value) in self { - if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key: key, value: value) { - options.insertIgnore(element: opt) + if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { + options.insertIgnore(opt) } } diff --git a/Source/SocketIOClientSpec.swift b/Source/SocketIOClientSpec.swift index 1e2051c..183089e 100644 --- a/Source/SocketIOClientSpec.swift +++ b/Source/SocketIOClientSpec.swift @@ -27,15 +27,15 @@ protocol SocketIOClientSpec : class { var waitingPackets: [SocketPacket] { get set } func didConnect() - func didDisconnect(reason: String) - func didError(reason: String) + func didDisconnect(_ reason: String) + func didError(_ reason: String) func handleAck(_ ack: Int, data: [AnyObject]) func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int) func joinNamespace(_ namespace: String) } extension SocketIOClientSpec { - func didError(reason: String) { + func didError(_ reason: String) { DefaultSocketLogger.Logger.error("%@", type: "SocketIOClient", args: reason) handleEvent("error", data: [reason as AnyObject], isInternalMessage: true, withAck: -1) diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index a48c60f..58a0fa1 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -35,18 +35,18 @@ struct SocketPacket { let type: PacketType enum PacketType: Int { - case Connect, Disconnect, Event, Ack, Error, BinaryEvent, BinaryAck + case connect, disconnect, event, ack, error, binaryEvent, binaryAck } var args: [AnyObject] { - if type == .Event || type == .BinaryEvent && data.count != 0 { + if type == .event || type == .binaryEvent && data.count != 0 { return Array(data.dropFirst()) } else { return data } } - var binary: [NSData] + var binary: [Data] var data: [AnyObject] var description: String { return "SocketPacket {type: \(String(type.rawValue)); data: " + @@ -62,7 +62,7 @@ struct SocketPacket { } init(type: PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1, - nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) { + nsp: String, placeholders: Int = 0, binary: [Data] = [Data]()) { self.data = data self.id = id self.nsp = nsp @@ -71,7 +71,7 @@ struct SocketPacket { self.binary = binary } - mutating func addData(_ data: NSData) -> Bool { + mutating func addData(_ data: Data) -> Bool { if placeholders == binary.count { return true } @@ -94,9 +94,9 @@ struct SocketPacket { } do { - let jsonSend = try NSJSONSerialization.data(withJSONObject: data as AnyObject, - options: NSJSONWritingOptions(rawValue: 0)) - guard let jsonString = String(data: jsonSend, encoding: NSUTF8StringEncoding) else { + let jsonSend = try JSONSerialization.data(withJSONObject: data as AnyObject, + options: JSONSerialization.WritingOptions(rawValue: 0)) + guard let jsonString = String(data: jsonSend, encoding: String.Encoding.utf8) else { return message + "[]" } @@ -117,7 +117,7 @@ struct SocketPacket { let nspString: String let idString: String - if type == .BinaryEvent || type == .BinaryAck { + if type == .binaryEvent || type == .binaryAck { binaryCountString = typeString + String(binary.count) + "-" } else { binaryCountString = typeString @@ -172,19 +172,19 @@ extension SocketPacket { private static func findType(_ binCount: Int, ack: Bool) -> PacketType { switch binCount { case 0 where !ack: - return .Event + return .event case 0 where ack: - return .Ack + return .ack case _ where !ack: - return .BinaryEvent + return .binaryEvent case _ where ack: - return .BinaryAck + return .binaryAck default: - return .Error + return .error } } - static func packetFromEmit(items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket { + static func packetFromEmit(_ items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket { let (parsedData, binary) = deconstructData(items) let packet = SocketPacket(type: findType(binary.count, ack: ack), data: parsedData, id: id, nsp: nsp, binary: binary) @@ -195,11 +195,11 @@ extension SocketPacket { private extension SocketPacket { // Recursive function that looks for NSData in collections - static func shred(_ data: AnyObject, binary: inout [NSData]) -> AnyObject { + static func shred(_ data: AnyObject, binary: inout [Data]) -> AnyObject { let placeholder = ["_placeholder": true, "num": binary.count as AnyObject] switch data { - case let bin as NSData: + case let bin as Data: binary.append(bin) return placeholder as AnyObject case let arr as [AnyObject]: @@ -216,8 +216,8 @@ private extension SocketPacket { // Removes binary data from emit data // Returns a type containing the de-binaryed data and the binary - static func deconstructData(_ data: [AnyObject]) -> ([AnyObject], [NSData]) { - var binary = [NSData]() + static func deconstructData(_ data: [AnyObject]) -> ([AnyObject], [Data]) { + var binary = [Data]() return (data.map({shred($0, binary: &binary)}), binary) } diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index 2e5a797..e3e66c5 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -23,7 +23,7 @@ import Foundation protocol SocketParsable : SocketIOClientSpec { - func parseBinaryData(_ data: NSData) + func parseBinaryData(_ data: Data) func parseSocketMessage(_ message: String) } @@ -42,19 +42,19 @@ extension SocketParsable { private func handlePacket(_ pack: SocketPacket) { switch pack.type { - case .Event where isCorrectNamespace(pack.nsp): + case .event where isCorrectNamespace(pack.nsp): handleEvent(pack.event, data: pack.args, isInternalMessage: false, withAck: pack.id) - case .Ack where isCorrectNamespace(pack.nsp): + case .ack where isCorrectNamespace(pack.nsp): handleAck(pack.id, data: pack.data) - case .BinaryEvent where isCorrectNamespace(pack.nsp): + case .binaryEvent where isCorrectNamespace(pack.nsp): waitingPackets.append(pack) - case .BinaryAck where isCorrectNamespace(pack.nsp): + case .binaryAck where isCorrectNamespace(pack.nsp): waitingPackets.append(pack) - case .Connect: + case .connect: handleConnect(pack) - case .Disconnect: - didDisconnect(reason: "Got Disconnect") - case .Error: + case .disconnect: + didDisconnect("Got Disconnect") + case .error: handleEvent("error", data: pack.data, isInternalMessage: true, withAck: pack.id) default: DefaultSocketLogger.Logger.log("Got invalid packet: %@", type: "SocketParser", args: pack.description) @@ -65,22 +65,22 @@ extension SocketParsable { func parseString(_ message: String) -> Either { var parser = SocketStringReader(message: message) - guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(length: 1)) ?? -1) else { - return .Left("Invalid packet type") + guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(1)) ?? -1) else { + return .left("Invalid packet type") } if !parser.hasNext { - return .Right(SocketPacket(type: type, nsp: "/")) + return .right(SocketPacket(type: type, nsp: "/")) } var namespace = "/" var placeholders = -1 - if type == .BinaryEvent || type == .BinaryAck { + if type == .binaryEvent || type == .binaryAck { if let holders = Int(parser.readUntilStringOccurence("-")) { placeholders = holders } else { - return .Left("Invalid packet") + return .left("Invalid packet") } } @@ -89,53 +89,53 @@ extension SocketParsable { } if !parser.hasNext { - return .Right(SocketPacket(type: type, nsp: namespace, placeholders: placeholders)) + return .right(SocketPacket(type: type, nsp: namespace, placeholders: placeholders)) } var idString = "" - if type == .Error { - parser.advance(by: -1) + if type == .error { + parser.advance(-1) } else { while parser.hasNext { - if let int = Int(parser.read(length: 1)) { + if let int = Int(parser.read(1)) { idString += String(int) } else { - parser.advance(by: -2) + parser.advance(-2) break } } } - let d = message[parser.advance(by: 1).. Either { - let stringData = data.data(using: NSUTF8StringEncoding, allowLossyConversion: false) + let stringData = data.data(using: String.Encoding.utf8, allowLossyConversion: false) do { - if let arr = try NSJSONSerialization.jsonObject(with: stringData!, - options: NSJSONReadingOptions.mutableContainers) as? [AnyObject] { - return .Right(arr) + if let arr = try JSONSerialization.jsonObject(with: stringData!, + options: JSONSerialization.ReadingOptions.mutableContainers) as? [AnyObject] { + return .right(arr) } else { - return .Left("Expected data array") + return .left("Expected data array") } } catch { - return .Left("Error parsing data for packet") + return .left("Error parsing data for packet") } } @@ -146,15 +146,15 @@ extension SocketParsable { DefaultSocketLogger.Logger.log("Parsing %@", type: "SocketParser", args: message) switch parseString(message) { - case let .Left(err): + case let .left(err): DefaultSocketLogger.Logger.error("\(err): %@", type: "SocketParser", args: message) - case let .Right(pack): + case let .right(pack): DefaultSocketLogger.Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) handlePacket(pack) } } - func parseBinaryData(_ data: NSData) { + func parseBinaryData(_ data: Data) { guard !waitingPackets.isEmpty else { DefaultSocketLogger.Logger.error("Got data when not remaking packet", type: "SocketParser") return @@ -165,7 +165,7 @@ extension SocketParsable { let packet = waitingPackets.removeLast() - if packet.type != .BinaryAck { + if packet.type != .binaryAck { handleEvent(packet.event, data: packet.args ?? [], isInternalMessage: false, withAck: packet.id) } else { diff --git a/Source/SocketStringReader.swift b/Source/SocketStringReader.swift index 6e4a7db..5437801 100644 --- a/Source/SocketStringReader.swift +++ b/Source/SocketStringReader.swift @@ -39,15 +39,15 @@ struct SocketStringReader { } @discardableResult - mutating func advance(by: Int) -> String.Index { + mutating func advance(_ by: Int) -> String.Index { currentIndex = message.characters.index(currentIndex, offsetBy: by) return currentIndex } - mutating func read(length: Int) -> String { + mutating func read(_ length: Int) -> String { let readString = message[currentIndex.. String { - return read(length: message.characters.distance(from: currentIndex, to: message.endIndex)) + return read(message.characters.distance(from: currentIndex, to: message.endIndex)) } } diff --git a/Source/SocketTypes.swift b/Source/SocketTypes.swift index 595d5e5..2409e26 100644 --- a/Source/SocketTypes.swift +++ b/Source/SocketTypes.swift @@ -32,7 +32,7 @@ extension Dictionary : SocketData {} extension Double : SocketData {} extension Int : SocketData {} extension NSArray : SocketData {} -extension NSData : SocketData {} +extension Data : SocketData {} extension NSDictionary : SocketData {} extension NSString : SocketData {} extension NSNull : SocketData {} @@ -42,10 +42,10 @@ public typealias AckCallback = ([AnyObject]) -> Void public typealias NormalCallback = ([AnyObject], SocketAckEmitter) -> Void public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void -typealias Probe = (msg: String, type: SocketEnginePacketType, data: [NSData]) +typealias Probe = (msg: String, type: SocketEnginePacketType, data: [Data]) typealias ProbeWaitQueue = [Probe] enum Either { - case Left(E) - case Right(V) + case left(E) + case right(V) } diff --git a/Source/WebSocket/SSLSecurity.swift b/Source/WebSocket/SSLSecurity.swift index 67553d8..18d77ae 100644 --- a/Source/WebSocket/SSLSecurity.swift +++ b/Source/WebSocket/SSLSecurity.swift @@ -24,7 +24,7 @@ import Foundation import Security public class SSLCert : NSObject { - var certData: NSData? + var certData: Data? var key: SecKey? /** @@ -34,7 +34,7 @@ public class SSLCert : NSObject { - returns: a representation security object to be used with */ - public init(data: NSData) { + public init(data: Data) { self.certData = data } @@ -54,7 +54,7 @@ public class SSLSecurity : NSObject { public var validatedDN = true //should the domain name be validated? var isReady = false //is the key processing done? - var certificates: [NSData]? //the certificates + var certificates: [Data]? //the certificates var pubKeys: [SecKey]? //the public keys var usePublicKeys = false //use public keys or certificate validation? @@ -66,12 +66,12 @@ public class SSLSecurity : NSObject { - returns: a representation security object to be used with */ public convenience init(usePublicKeys: Bool = false) { - let paths = NSBundle.main().pathsForResources(ofType: "cer", inDirectory: ".") + let paths = Bundle.main().pathsForResources(ofType: "cer", inDirectory: ".") let certs = paths.reduce([SSLCert]()) { (certs: [SSLCert], path: String) -> [SSLCert] in var certs = certs if let data = NSData(contentsOfFile: path) { - certs.append(SSLCert(data: data)) + certs.append(SSLCert(data: data as Data)) } return certs } @@ -93,11 +93,11 @@ public class SSLSecurity : NSObject { self.usePublicKeys = usePublicKeys if self.usePublicKeys { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)) { + DispatchQueue.global(attributes: DispatchQueue.GlobalAttributes.qosDefault).async { let pubKeys = certs.reduce([SecKey]()) { (pubKeys: [SecKey], cert: SSLCert) -> [SecKey] in var pubKeys = pubKeys if let data = cert.certData where cert.key == nil { - cert.key = self.extractPublicKey(data: data) + cert.key = self.extractPublicKey(data) } if let key = cert.key { pubKeys.append(key) @@ -109,7 +109,7 @@ public class SSLSecurity : NSObject { self.isReady = true } } else { - let certificates = certs.reduce([NSData]()) { (certificates: [NSData], cert: SSLCert) -> [NSData] in + let certificates = certs.reduce([Data]()) { (certificates: [Data], cert: SSLCert) -> [Data] in var certificates = certificates if let data = cert.certData { certificates.append(data) @@ -129,7 +129,7 @@ public class SSLSecurity : NSObject { - returns: if the key was successfully validated */ - public func isValid(trust: SecTrust, domain: String?) -> Bool { + public func isValid(_ trust: SecTrust, domain: String?) -> Bool { var tries = 0 while(!self.isReady) { @@ -141,14 +141,14 @@ public class SSLSecurity : NSObject { } var policy: SecPolicy if self.validatedDN { - policy = SecPolicyCreateSSL(true, domain) + policy = SecPolicyCreateSSL(true, domain)! } else { - policy = SecPolicyCreateBasicX509() + policy = SecPolicyCreateBasicX509()! } SecTrustSetPolicies(trust,policy) if self.usePublicKeys { if let keys = self.pubKeys { - let serverPubKeys = publicKeyChainForTrust(trust: trust) + let serverPubKeys = publicKeyChainForTrust(trust) for serverKey in serverPubKeys as [AnyObject] { for key in keys as [AnyObject] { if serverKey.isEqual(key) { @@ -158,16 +158,16 @@ public class SSLSecurity : NSObject { } } } else if let certs = self.certificates { - let serverCerts = certificateChainForTrust(trust: trust) + let serverCerts = certificateChainForTrust(trust) var collect = [SecCertificate]() for cert in certs { collect.append(SecCertificateCreateWithData(nil,cert)!) } SecTrustSetAnchorCertificates(trust,collect) - var result: SecTrustResultType = 0 + var result = SecTrustResultType(rawValue: 0)! SecTrustEvaluate(trust,&result) - let r = Int(result) - if r == kSecTrustResultUnspecified || r == kSecTrustResultProceed { + let r = Int(result.rawValue) + if r == Int(SecTrustResultType.unspecified.rawValue) || r == Int(SecTrustResultType.proceed.rawValue) { var trustedCount = 0 for serverCert in serverCerts { for cert in certs { @@ -192,10 +192,10 @@ public class SSLSecurity : NSObject { - returns: a public key */ - func extractPublicKey(data: NSData) -> SecKey? { + func extractPublicKey(_ data: Data) -> SecKey? { guard let cert = SecCertificateCreateWithData(nil, data) else { return nil } - return extractPublicKeyFromCert(cert: cert, policy: SecPolicyCreateBasicX509()) + return extractPublicKeyFromCert(cert, policy: SecPolicyCreateBasicX509()!) } /** @@ -205,13 +205,13 @@ public class SSLSecurity : NSObject { - returns: a public key */ - func extractPublicKeyFromCert(cert: SecCertificate, policy: SecPolicy) -> SecKey? { + func extractPublicKeyFromCert(_ cert: SecCertificate, policy: SecPolicy) -> SecKey? { var possibleTrust: SecTrust? SecTrustCreateWithCertificates(cert, policy, &possibleTrust) guard let trust = possibleTrust else { return nil } - var result: SecTrustResultType = 0 + var result = SecTrustResultType(rawValue: 0)! SecTrustEvaluate(trust, &result) return SecTrustCopyPublicKey(trust) } @@ -223,11 +223,11 @@ public class SSLSecurity : NSObject { - returns: the certificate chain for the trust */ - func certificateChainForTrust(trust: SecTrust) -> [NSData] { - let certificates = (0.. [NSData] in + func certificateChainForTrust(_ trust: SecTrust) -> [Data] { + let certificates = (0.. [Data] in var certificates = certificates let cert = SecTrustGetCertificateAtIndex(trust, index) - certificates.append(SecCertificateCopyData(cert!)) + certificates.append(SecCertificateCopyData(cert!) as Data) return certificates } @@ -241,12 +241,12 @@ public class SSLSecurity : NSObject { - returns: the public keys from the certifcate chain for the trust */ - func publicKeyChainForTrust(trust: SecTrust) -> [SecKey] { + func publicKeyChainForTrust(_ trust: SecTrust) -> [SecKey] { let policy = SecPolicyCreateBasicX509() let keys = (0.. [SecKey] in var keys = keys let cert = SecTrustGetCertificateAtIndex(trust, index) - if let key = extractPublicKeyFromCert(cert: cert!, policy: policy) { + if let key = extractPublicKeyFromCert(cert!, policy: policy!) { keys.append(key) } @@ -257,4 +257,4 @@ public class SSLSecurity : NSObject { } -} \ No newline at end of file +} diff --git a/Source/WebSocket/WebSocket.swift b/Source/WebSocket/WebSocket.swift index 208ebf2..0f8d1c3 100644 --- a/Source/WebSocket/WebSocket.swift +++ b/Source/WebSocket/WebSocket.swift @@ -28,40 +28,40 @@ public let WebsocketDidDisconnectNotification = "WebsocketDidDisconnectNotificat public let WebsocketDisconnectionErrorKeyName = "WebsocketDisconnectionErrorKeyName" public protocol WebSocketDelegate: class { - func websocketDidConnect(socket: WebSocket) - func websocketDidDisconnect(socket: WebSocket, error: NSError?) - func websocketDidReceiveMessage(socket: WebSocket, text: String) - func websocketDidReceiveData(socket: WebSocket, data: NSData) + func websocketDidConnect(_ socket: WebSocket) + func websocketDidDisconnect(_ socket: WebSocket, error: NSError?) + func websocketDidReceiveMessage(_ socket: WebSocket, text: String) + func websocketDidReceiveData(_ socket: WebSocket, data: Data) } public protocol WebSocketPongDelegate: class { - func websocketDidReceivePong(socket: WebSocket) + func websocketDidReceivePong(_ socket: WebSocket) } -public class WebSocket : NSObject, NSStreamDelegate { +public class WebSocket : NSObject, StreamDelegate { enum OpCode : UInt8 { - case ContinueFrame = 0x0 - case TextFrame = 0x1 - case BinaryFrame = 0x2 + case continueFrame = 0x0 + case textFrame = 0x1 + case binaryFrame = 0x2 //3-7 are reserved. - case ConnectionClose = 0x8 - case Ping = 0x9 - case Pong = 0xA + case connectionClose = 0x8 + case ping = 0x9 + case pong = 0xA //B-F reserved. } public enum CloseCode : UInt16 { - case Normal = 1000 - case GoingAway = 1001 - case ProtocolError = 1002 - case ProtocolUnhandledType = 1003 + case normal = 1000 + case goingAway = 1001 + case protocolError = 1002 + case protocolUnhandledType = 1003 // 1004 reserved. - case NoStatusReceived = 1005 + case noStatusReceived = 1005 //1006 reserved. - case Encoding = 1007 - case PolicyViolated = 1008 - case MessageTooBig = 1009 + case encoding = 1007 + case policyViolated = 1008 + case messageTooBig = 1009 } #if swift(>=3) @@ -71,11 +71,11 @@ public class WebSocket : NSObject, NSStreamDelegate { enum InternalErrorCode : UInt16 { // 0-999 WebSocket status codes not used - case OutputStreamWriteError = 1 + case outputStreamWriteError = 1 } //Where the callback is executed. It defaults to the main UI thread queue. - public var queue = dispatch_get_main_queue() + public var queue = DispatchQueue.main var optionalProtocols : [String]? //Constant Values. @@ -100,7 +100,7 @@ public class WebSocket : NSObject, NSStreamDelegate { class WSResponse { var isFin = false - var code: OpCode = .ContinueFrame + var code: OpCode = .continueFrame var bytesLeft = 0 var frameCount = 0 var buffer: NSMutableData? @@ -111,7 +111,7 @@ public class WebSocket : NSObject, NSStreamDelegate { public var onConnect: ((Void) -> Void)? public var onDisconnect: ((NSError?) -> Void)? public var onText: ((String) -> Void)? - public var onData: ((NSData) -> Void)? + public var onData: ((Data) -> Void)? public var onPong: ((Void) -> Void)? public var headers = [String: String]() public var voipEnabled = false @@ -123,21 +123,21 @@ public class WebSocket : NSObject, NSStreamDelegate { public var isConnected :Bool { return connected } - public var currentURL: NSURL {return url} - private var url: NSURL - private var inputStream: NSInputStream? + public var currentURL: URL {return url} + private var url: URL + private var inputStream: InputStream? private var outputStream: NSOutputStream? private var connected = false private var isCreated = false - private var writeQueue = NSOperationQueue() + private var writeQueue = OperationQueue() private var readStack = [WSResponse]() - private var inputQueue = [NSData]() - private var fragBuffer: NSData? + private var inputQueue = [Data]() + private var fragBuffer: Data? private var certValidated = false private var didDisconnect = false private var readyToWrite = false - private let mutex = NSLock() - private let notificationCenter = NSNotificationCenter.default() + private let mutex = Lock() + private let notificationCenter = NotificationCenter.default() private var canDispatch: Bool { mutex.lock() let canWork = readyToWrite @@ -145,10 +145,10 @@ public class WebSocket : NSObject, NSStreamDelegate { return canWork } //the shared processing queue used for all websocket - private static let sharedWorkQueue = dispatch_queue_create("com.vluxe.starscream.websocket", DISPATCH_QUEUE_SERIAL) + private static let sharedWorkQueue = DispatchQueue(label: "com.vluxe.starscream.websocket", attributes: DispatchQueueAttributes.serial) //used for setting protocols. - public init(url: NSURL, protocols: [String]? = nil) { + public init(url: URL, protocols: [String]? = nil) { self.url = url self.origin = url.absoluteString writeQueue.maxConcurrentOperationCount = 1 @@ -173,18 +173,18 @@ public class WebSocket : NSObject, NSStreamDelegate { - Parameter forceTimeout: Maximum time to wait for the server to close the socket. */ - public func disconnect(forceTimeout: NSTimeInterval? = nil) { + public func disconnect(_ forceTimeout: TimeInterval? = nil) { switch forceTimeout { 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(error: nil) + queue.after(when: DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) { [weak self] in + self?.disconnectStream(nil) } fallthrough case .none: - writeError(code: CloseCode.Normal.rawValue) + writeError(CloseCode.normal.rawValue) default: - self.disconnectStream(error: nil) + self.disconnectStream(nil) break } } @@ -197,9 +197,9 @@ public class WebSocket : NSObject, NSStreamDelegate { - parameter str: The string to write. - parameter completion: The (optional) completion handler. */ - public func writeString(str: String, completion: (() -> ())? = nil) { + public func writeString(_ str: String, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(data: str.data(using: NSUTF8StringEncoding)!, code: .TextFrame, writeCompletion: completion) + dequeueWrite(str.data(using: String.Encoding.utf8)!, code: .textFrame, writeCompletion: completion) } /** @@ -210,16 +210,16 @@ public class WebSocket : NSObject, NSStreamDelegate { - parameter data: The data to write. - parameter completion: The (optional) completion handler. */ - public func writeData(data: NSData, completion: (() -> ())? = nil) { + public func writeData(_ data: Data, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(data: data, code: .BinaryFrame, writeCompletion: completion) + dequeueWrite(data, code: .binaryFrame, writeCompletion: completion) } //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 writePing(data: NSData, completion: (() -> ())? = nil) { + public func writePing(_ data: Data, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(data: data, code: .Ping, writeCompletion: completion) + dequeueWrite(data, code: .ping, writeCompletion: completion) } //private method that starts the connection @@ -230,34 +230,34 @@ public class WebSocket : NSObject, NSStreamDelegate { var port = url.port if port == nil { - if ["wss", "https"].contains(url.scheme) { + if ["wss", "https"].contains(url.scheme!) { port = 443 } else { port = 80 } } - addHeader(urlRequest: urlRequest, key: headerWSUpgradeName as NSString, val: headerWSUpgradeValue as NSString) - addHeader(urlRequest: urlRequest, key: headerWSConnectionName as NSString, val: headerWSConnectionValue as NSString) + addHeader(urlRequest, key: headerWSUpgradeName as NSString, val: headerWSUpgradeValue as NSString) + addHeader(urlRequest, key: headerWSConnectionName as NSString, val: headerWSConnectionValue as NSString) if let protocols = optionalProtocols { - addHeader(urlRequest: urlRequest, key: headerWSProtocolName as NSString, val: protocols.joined(separator: ",") as NSString) + addHeader(urlRequest, key: headerWSProtocolName as NSString, val: protocols.joined(separator: ",") as NSString) } - addHeader(urlRequest: urlRequest, key: headerWSVersionName as NSString, val: headerWSVersionValue as NSString) - addHeader(urlRequest: urlRequest, key: headerWSKeyName as NSString, val: generateWebSocketKey() as NSString) + addHeader(urlRequest, key: headerWSVersionName as NSString, val: headerWSVersionValue as NSString) + addHeader(urlRequest, key: headerWSKeyName as NSString, val: generateWebSocketKey() as NSString) if let origin = origin { - addHeader(urlRequest: urlRequest, key: headerOriginName as NSString, val: origin as NSString) + addHeader(urlRequest, key: headerOriginName as NSString, val: origin as NSString) } - addHeader(urlRequest: urlRequest, key: headerWSHostName as NSString, val: "\(url.host!):\(port!)" as NSString) + addHeader(urlRequest, key: headerWSHostName as NSString, val: "\(url.host!):\(port!)" as NSString) for (key,value) in headers { - addHeader(urlRequest: urlRequest, key: key as NSString, val: value as NSString) + addHeader(urlRequest, key: key as NSString, val: value as NSString) } if let cfHTTPMessage = CFHTTPMessageCopySerializedMessage(urlRequest) { let serializedRequest = cfHTTPMessage.takeRetainedValue() - initStreamsWithData(data: serializedRequest, Int(port!)) + initStreamsWithData(serializedRequest as Data, Int(port!)) } } //Add a header to the CFHTTPMessage by using the NSString bridges to CFString - private func addHeader(urlRequest: CFHTTPMessage, key: NSString, val: NSString) { + private func addHeader(_ urlRequest: CFHTTPMessage, key: NSString, val: NSString) { CFHTTPMessageSetHeaderFieldValue(urlRequest, key, val) } @@ -269,13 +269,13 @@ public class WebSocket : NSObject, NSStreamDelegate { let uni = UnicodeScalar(UInt32(97 + arc4random_uniform(25))) key += "\(Character(uni))" } - let data = key.data(using: NSUTF8StringEncoding) - let baseKey = data?.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0)) + let data = key.data(using: String.Encoding.utf8) + let baseKey = data?.base64EncodedString(NSData.Base64EncodingOptions(rawValue: 0)) return baseKey! } //Start the stream connection and write the data to the output stream - private func initStreamsWithData(data: NSData, _ port: Int) { + 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) @@ -288,15 +288,15 @@ public class WebSocket : NSObject, NSStreamDelegate { guard let inStream = inputStream, let outStream = outputStream else { return } inStream.delegate = self outStream.delegate = self - if ["wss", "https"].contains(url.scheme) { - inStream.setProperty(NSStreamSocketSecurityLevelNegotiatedSSL as NSString, forKey: NSStreamSocketSecurityLevelKey) - outStream.setProperty(NSStreamSocketSecurityLevelNegotiatedSSL as NSString, forKey: NSStreamSocketSecurityLevelKey) + if ["wss", "https"].contains(url.scheme!) { + inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as NSString, forKey: Stream.PropertyKey.socketSecurityLevelKey.rawValue) + outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as NSString, forKey: Stream.PropertyKey.socketSecurityLevelKey.rawValue) } else { certValidated = true //not a https session, so no need to check SSL pinning } if voipEnabled { - inStream.setProperty(NSStreamNetworkServiceTypeVoIP as NSString, forKey: NSStreamNetworkServiceType) - outStream.setProperty(NSStreamNetworkServiceTypeVoIP as NSString, forKey: NSStreamNetworkServiceType) + inStream.setProperty(StreamNetworkServiceTypeValue.voip as NSString, forKey: Stream.PropertyKey.networkServiceType.rawValue) + outStream.setProperty(StreamNetworkServiceTypeValue.voip as NSString, forKey: Stream.PropertyKey.networkServiceType.rawValue) } if selfSignedSSL { let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull] @@ -304,18 +304,18 @@ public class WebSocket : NSObject, NSStreamDelegate { outStream.setProperty(settings as AnyObject?, forKey: kCFStreamPropertySSLSettings as String) } if let cipherSuites = self.enabledSSLCipherSuites { - if let sslContextIn = CFReadStreamCopyProperty(inputStream, kCFStreamPropertySSLContext) as! SSLContext?, - sslContextOut = CFWriteStreamCopyProperty(outputStream, kCFStreamPropertySSLContext) as! SSLContext? { + if let sslContextIn = CFReadStreamCopyProperty(inputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext?, + sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) if resIn != errSecSuccess { - let error = self.errorWithDetail(detail: "Error setting ingoing cypher suites", code: UInt16(resIn)) - disconnectStream(error: error) + let error = self.errorWithDetail("Error setting ingoing cypher suites", code: UInt16(resIn)) + disconnectStream(error) return } if resOut != errSecSuccess { - let error = self.errorWithDetail(detail: "Error setting outgoing cypher suites", code: UInt16(resOut)) - disconnectStream(error: error) + let error = self.errorWithDetail("Error setting outgoing cypher suites", code: UInt16(resOut)) + disconnectStream(error) return } } @@ -329,7 +329,7 @@ public class WebSocket : NSObject, NSStreamDelegate { self.readyToWrite = true self.mutex.unlock() - let bytes = UnsafePointer(data.bytes) + let bytes = UnsafePointer((data as NSData).bytes) var out = timeout * 1000000 //wait 5 seconds before giving up writeQueue.addOperation { [weak self] in while !outStream.hasSpaceAvailable { @@ -337,27 +337,27 @@ public class WebSocket : NSObject, NSStreamDelegate { out -= 100 if out < 0 { self?.cleanupStream() - self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2)) + self?.doDisconnect(self?.errorWithDetail("write wait timed out", code: 2)) return } else if outStream.streamError != nil { return //disconnectStream will be called. } } - outStream.write(bytes, maxLength: data.length) + outStream.write(bytes, maxLength: data.count) } } //delegate for the stream methods. Processes incoming bytes - public func stream(aStream: NSStream, handle eventCode: NSStreamEvent) { + public func stream(_ aStream: Stream, handle eventCode: Stream.Event) { if let sec = security where !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { let possibleTrust: AnyObject? = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as String) if let trust: AnyObject = possibleTrust { let domain: AnyObject? = aStream.property(forKey: kCFStreamSSLPeerName as String) - if sec.isValid(trust: trust as! SecTrust, domain: domain as! String?) { + if sec.isValid(trust as! SecTrust, domain: domain as! String?) { certValidated = true } else { - let error = errorWithDetail(detail: "Invalid SSL certificate", code: 1) - disconnectStream(error: error) + let error = errorWithDetail("Invalid SSL certificate", code: 1) + disconnectStream(error) return } } @@ -367,20 +367,20 @@ public class WebSocket : NSObject, NSStreamDelegate { processInputStream() } } else if eventCode == .errorOccurred { - disconnectStream(error: aStream.streamError) + disconnectStream(aStream.streamError) } else if eventCode == .endEncountered { - disconnectStream(error: nil) + disconnectStream(nil) } } //disconnect the stream object - private func disconnectStream(error: NSError?) { + private func disconnectStream(_ error: NSError?) { if error == nil { writeQueue.waitUntilAllOperationsAreFinished() } else { writeQueue.cancelAllOperations() } cleanupStream() - doDisconnect(error: error) + doDisconnect(error) } private func cleanupStream() { @@ -409,7 +409,7 @@ public class WebSocket : NSObject, NSStreamDelegate { if inputQueue.count == 0 { process = true } - inputQueue.append(NSData(bytes: buffer, length: length)) + inputQueue.append(Data(bytes: UnsafePointer(buffer), count: length)) if process { dequeueInput() } @@ -420,44 +420,44 @@ public class WebSocket : NSObject, NSStreamDelegate { let data = inputQueue[0] var work = data if let fragBuffer = fragBuffer { - let combine = NSMutableData(data: fragBuffer) + var combine = NSData(data: fragBuffer) as Data combine.append(data) work = combine self.fragBuffer = nil } - let buffer = UnsafePointer(work.bytes) - let length = work.length + let buffer = UnsafePointer((work as NSData).bytes) + let length = work.count if !connected { - processTCPHandshake(buffer: buffer, bufferLen: length) + processTCPHandshake(buffer, bufferLen: length) } else { - processRawMessagesInBuffer(pointer: buffer, bufferLen: length) + processRawMessagesInBuffer(buffer, bufferLen: length) } inputQueue = inputQueue.filter{$0 != data} } } //handle checking the inital connection status - private func processTCPHandshake(buffer: UnsafePointer, bufferLen: Int) { - let code = processHTTP(buffer: buffer, bufferLen: bufferLen) + private func processTCPHandshake(_ buffer: UnsafePointer, bufferLen: Int) { + let code = processHTTP(buffer, bufferLen: bufferLen) switch code { case 0: connected = true guard canDispatch else {return} - dispatch_async(queue!) { [weak self] in + queue.async { [weak self] in guard let s = self else { return } s.onConnect?() - s.delegate?.websocketDidConnect(socket: s) - s.notificationCenter.post(name: WebsocketDidConnectNotification, object: self) + s.delegate?.websocketDidConnect(s) + s.notificationCenter.post(name: NSNotification.Name(WebsocketDidConnectNotification), object: self) } case -1: - fragBuffer = NSData(bytes: buffer, length: bufferLen) + fragBuffer = Data(bytes: UnsafePointer(buffer), count: bufferLen) break //do nothing, we are going to collect more data default: - doDisconnect(error: errorWithDetail(detail: "Invalid HTTP upgrade", code: UInt16(code))) + doDisconnect(errorWithDetail("Invalid HTTP upgrade", code: UInt16(code))) } } ///Finds the HTTP Packet in the TCP stream, by looking for the CRLF. - private func processHTTP(buffer: UnsafePointer, bufferLen: Int) -> Int { + private func processHTTP(_ buffer: UnsafePointer, bufferLen: Int) -> Int { let CRLFBytes = [UInt8(ascii: "\r"), UInt8(ascii: "\n"), UInt8(ascii: "\r"), UInt8(ascii: "\n")] var k = 0 var totalSize = 0 @@ -473,14 +473,14 @@ public class WebSocket : NSObject, NSStreamDelegate { } } if totalSize > 0 { - let code = validateResponse(buffer: buffer, bufferLen: totalSize) + let code = validateResponse(buffer, bufferLen: totalSize) if code != 0 { return code } totalSize += 1 //skip the last \n let restSize = bufferLen - totalSize if restSize > 0 { - processRawMessagesInBuffer(pointer: buffer + totalSize, bufferLen: restSize) + processRawMessagesInBuffer(buffer + totalSize, bufferLen: restSize) } return 0 //success } @@ -488,7 +488,7 @@ public class WebSocket : NSObject, NSStreamDelegate { } ///validates the HTTP is a 101 as per the RFC spec - private func validateResponse(buffer: UnsafePointer, bufferLen: Int) -> Int { + private func validateResponse(_ buffer: UnsafePointer, bufferLen: Int) -> Int { let response = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, false).takeRetainedValue() CFHTTPMessageAppendBytes(response, buffer, bufferLen) let code = CFHTTPMessageGetResponseStatusCode(response) @@ -507,12 +507,12 @@ public class WebSocket : NSObject, NSStreamDelegate { } ///read a 16 bit big endian value from a buffer - private static func readUint16(buffer: UnsafePointer, offset: Int) -> UInt16 { + private static func readUint16(_ buffer: UnsafePointer, offset: Int) -> UInt16 { return (UInt16(buffer[offset + 0]) << 8) | UInt16(buffer[offset + 1]) } ///read a 64 bit big endian value from a buffer - private static func readUint64(buffer: UnsafePointer, offset: Int) -> UInt64 { + private static func readUint64(_ buffer: UnsafePointer, offset: Int) -> UInt64 { var value = UInt64(0) for i in 0...7 { value = (value << 8) | UInt64(buffer[offset + i]) @@ -521,13 +521,13 @@ public class WebSocket : NSObject, NSStreamDelegate { } ///write a 16 bit big endian value to a buffer - private static func writeUint16(buffer: UnsafeMutablePointer, offset: Int, value: UInt16) { + private static func writeUint16(_ buffer: UnsafeMutablePointer, offset: Int, value: UInt16) { buffer[offset + 0] = UInt8(value >> 8) buffer[offset + 1] = UInt8(value & 0xff) } ///write a 64 bit big endian value to a buffer - private static func writeUint64(buffer: UnsafeMutablePointer, offset: Int, value: UInt64) { + private static func writeUint64(_ buffer: UnsafeMutablePointer, offset: Int, value: UInt64) { for i in 0...7 { buffer[offset + i] = UInt8((value >> (8*UInt64(7 - i))) & 0xff) } @@ -540,7 +540,7 @@ public class WebSocket : NSObject, NSStreamDelegate { guard let baseAddress = buffer.baseAddress else { fatalError("") } let bufferLen = buffer.count if response != nil && bufferLen < 2 { - fragBuffer = NSData(buffer: buffer) + fragBuffer = Data(buffer: buffer) return emptyBuffer } if let response = response where response.bytesLeft > 0 { @@ -551,43 +551,43 @@ public class WebSocket : NSObject, NSStreamDelegate { extra = 0 } response.bytesLeft -= len - response.buffer?.append(NSData(bytes: baseAddress, length: len)) - processResponse(response: response) - return buffer.fromOffset(offset: bufferLen - extra) + response.buffer?.append(Data(bytes: baseAddress, count: len)) + processResponse(response) + return buffer.fromOffset(bufferLen - extra) } else { let isFin = (FinMask & baseAddress[0]) let receivedOpcode = OpCode(rawValue: (OpCodeMask & baseAddress[0])) let isMasked = (MaskMask & baseAddress[1]) let payloadLen = (PayloadLenMask & baseAddress[1]) var offset = 2 - if (isMasked > 0 || (RSVMask & baseAddress[0]) > 0) && receivedOpcode != .Pong { - let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "masked and rsv data is not currently supported", code: errCode)) - writeError(code: errCode) + if (isMasked > 0 || (RSVMask & baseAddress[0]) > 0) && receivedOpcode != .pong { + let errCode = CloseCode.protocolError.rawValue + doDisconnect(errorWithDetail("masked and rsv data is not currently supported", code: errCode)) + writeError(errCode) return emptyBuffer } - let isControlFrame = (receivedOpcode == .ConnectionClose || receivedOpcode == .Ping) - if !isControlFrame && (receivedOpcode != .BinaryFrame && receivedOpcode != .ContinueFrame && - receivedOpcode != .TextFrame && receivedOpcode != .Pong) { - let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "unknown opcode: \(receivedOpcode)", code: errCode)) - writeError(code: errCode) + let isControlFrame = (receivedOpcode == .connectionClose || receivedOpcode == .ping) + if !isControlFrame && (receivedOpcode != .binaryFrame && receivedOpcode != .continueFrame && + receivedOpcode != .textFrame && receivedOpcode != .pong) { + let errCode = CloseCode.protocolError.rawValue + doDisconnect(errorWithDetail("unknown opcode: \(receivedOpcode)", code: errCode)) + writeError(errCode) return emptyBuffer } if isControlFrame && isFin == 0 { - let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "control frames can't be fragmented", code: errCode)) - writeError(code: errCode) + let errCode = CloseCode.protocolError.rawValue + doDisconnect(errorWithDetail("control frames can't be fragmented", code: errCode)) + writeError(errCode) return emptyBuffer } - if receivedOpcode == .ConnectionClose { - var code = CloseCode.Normal.rawValue + if receivedOpcode == .connectionClose { + var code = CloseCode.normal.rawValue if payloadLen == 1 { - code = CloseCode.ProtocolError.rawValue + code = CloseCode.protocolError.rawValue } else if payloadLen > 1 { - code = WebSocket.readUint16(buffer: baseAddress, offset: offset) + code = WebSocket.readUint16(baseAddress, offset: offset) if code < 1000 || (code > 1003 && code < 1007) || (code > 1011 && code < 3000) { - code = CloseCode.ProtocolError.rawValue + code = CloseCode.protocolError.rawValue } offset += 2 } @@ -595,70 +595,70 @@ public class WebSocket : NSObject, NSStreamDelegate { let len = Int(payloadLen-2) if len > 0 { let bytes = baseAddress + offset - let str: NSString? = NSString(data: NSData(bytes: bytes, length: len), encoding: NSUTF8StringEncoding) + let str: NSString? = NSString(data: Data(bytes: bytes, count: len), encoding: String.Encoding.utf8.rawValue) if str == nil { - code = CloseCode.ProtocolError.rawValue + code = CloseCode.protocolError.rawValue } } } - doDisconnect(error: errorWithDetail(detail: "connection closed by server", code: code)) - writeError(code: code) + doDisconnect(errorWithDetail("connection closed by server", code: code)) + writeError(code) return emptyBuffer } if isControlFrame && payloadLen > 125 { - writeError(code: CloseCode.ProtocolError.rawValue) + writeError(CloseCode.protocolError.rawValue) return emptyBuffer } var dataLength = UInt64(payloadLen) if dataLength == 127 { - dataLength = WebSocket.readUint64(buffer: baseAddress, offset: offset) + dataLength = WebSocket.readUint64(baseAddress, offset: offset) offset += sizeof(UInt64) } else if dataLength == 126 { - dataLength = UInt64(WebSocket.readUint16(buffer: baseAddress, offset: offset)) + dataLength = UInt64(WebSocket.readUint16(baseAddress, offset: offset)) offset += sizeof(UInt16) } if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { - fragBuffer = NSData(bytes: baseAddress, length: bufferLen) + fragBuffer = Data(bytes: baseAddress, count: bufferLen) return emptyBuffer } var len = dataLength if dataLength > UInt64(bufferLen) { len = UInt64(bufferLen-offset) } - let data: NSData + let data: Data if len < 0 { len = 0 - data = NSData() + data = Data() } else { - data = NSData(bytes: baseAddress+offset, length: Int(len)) + data = Data(bytes: baseAddress+offset, count: Int(len)) } - if receivedOpcode == .Pong { + if receivedOpcode == .pong { if canDispatch { - dispatch_async(queue!) { [weak self] in + queue.async { [weak self] in guard let s = self else { return } s.onPong?() - s.pongDelegate?.websocketDidReceivePong(socket: s) + s.pongDelegate?.websocketDidReceivePong(s) } } - return buffer.fromOffset(offset: offset + Int(len)) + return buffer.fromOffset(offset + Int(len)) } var response = readStack.last if isControlFrame { response = nil //don't append pings } - if isFin == 0 && receivedOpcode == .ContinueFrame && response == nil { - let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "continue frame before a binary or text frame", code: errCode)) - writeError(code: errCode) + if isFin == 0 && receivedOpcode == .continueFrame && response == nil { + let errCode = CloseCode.protocolError.rawValue + doDisconnect(errorWithDetail("continue frame before a binary or text frame", code: errCode)) + writeError(errCode) return emptyBuffer } var isNew = false if response == nil { - if receivedOpcode == .ContinueFrame { - let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "first frame can't be a continue frame", + if receivedOpcode == .continueFrame { + let errCode = CloseCode.protocolError.rawValue + doDisconnect(errorWithDetail("first frame can't be a continue frame", code: errCode)) - writeError(code: errCode) + writeError(errCode) return emptyBuffer } isNew = true @@ -667,13 +667,13 @@ public class WebSocket : NSObject, NSStreamDelegate { response!.bytesLeft = Int(dataLength) response!.buffer = NSMutableData(data: data) } else { - if receivedOpcode == .ContinueFrame { + if receivedOpcode == .continueFrame { response!.bytesLeft = Int(dataLength) } else { - let errCode = CloseCode.ProtocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "second and beyond of fragment message must be a continue frame", + let errCode = CloseCode.protocolError.rawValue + doDisconnect(errorWithDetail("second and beyond of fragment message must be a continue frame", code: errCode)) - writeError(code: errCode) + writeError(errCode) return emptyBuffer } response!.buffer!.append(data) @@ -685,51 +685,52 @@ public class WebSocket : NSObject, NSStreamDelegate { if isNew { readStack.append(response) } - processResponse(response: response) + processResponse(response) } let step = Int(offset+numericCast(len)) - return buffer.fromOffset(offset: step) + return buffer.fromOffset(step) } } /// Process all messages in the buffer if possible. - private func processRawMessagesInBuffer(pointer: UnsafePointer, bufferLen: Int) { + private func processRawMessagesInBuffer(_ pointer: UnsafePointer, bufferLen: Int) { var buffer = UnsafeBufferPointer(start: pointer, count: bufferLen) repeat { buffer = processOneRawMessage(inBuffer: buffer) } while buffer.count >= 2 if buffer.count > 0 { - fragBuffer = NSData(buffer: buffer) + fragBuffer = Data(buffer: buffer) } } ///process the finished response of a buffer - private func processResponse(response: WSResponse) -> Bool { + @discardableResult + private func processResponse(_ response: WSResponse) -> Bool { if response.isFin && response.bytesLeft <= 0 { - if response.code == .Ping { + if response.code == .ping { let data = response.buffer! //local copy so it is perverse for writing - dequeueWrite(data: data, code: OpCode.Pong) - } else if response.code == .TextFrame { - let str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding) + dequeueWrite(data as Data, code: .pong) + } else if response.code == .textFrame { + let str: NSString? = NSString(data: response.buffer! as Data, encoding: String.Encoding.utf8.rawValue) if str == nil { - writeError(code: CloseCode.Encoding.rawValue) + writeError(CloseCode.encoding.rawValue) return false } if canDispatch { - dispatch_async(queue!) { [weak self] in + queue.async { [weak self] in guard let s = self else { return } s.onText?(str! as String) - s.delegate?.websocketDidReceiveMessage(socket: s, text: str! as String) + s.delegate?.websocketDidReceiveMessage(s, text: str! as String) } } - } else if response.code == .BinaryFrame { + } else if response.code == .binaryFrame { if canDispatch { let data = response.buffer! //local copy so it is perverse for writing - dispatch_async(queue!) { [weak self] in + queue.async { [weak self] in guard let s = self else { return } - s.onData?(data) - s.delegate?.websocketDidReceiveData(socket: s, data: data) + s.onData?(data as Data) + s.delegate?.websocketDidReceiveData(s, data: data as Data) } } } @@ -740,7 +741,7 @@ public class WebSocket : NSObject, NSStreamDelegate { } ///Create an error - private func errorWithDetail(detail: String, code: UInt16) -> NSError { + private func errorWithDetail(_ detail: String, code: UInt16) -> NSError { var details = [String: String]() details[NSLocalizedDescriptionKey] = detail @@ -752,20 +753,20 @@ public class WebSocket : NSObject, NSStreamDelegate { } ///write a an error to the socket - private func writeError(code: UInt16) { + private func writeError(_ code: UInt16) { let buf = NSMutableData(capacity: sizeof(UInt16)) let buffer = UnsafeMutablePointer(buf!.bytes) - WebSocket.writeUint16(buffer: buffer, offset: 0, value: code) - dequeueWrite(data: NSData(bytes: buffer, length: sizeof(UInt16)), code: .ConnectionClose) + WebSocket.writeUint16(buffer, offset: 0, value: code) + dequeueWrite(Data(bytes: buffer, count: sizeof(UInt16)), code: .connectionClose) } ///used to write things to the stream - private func dequeueWrite(data: NSData, code: OpCode, writeCompletion: (() -> ())? = nil) { + private func dequeueWrite(_ data: Data, code: OpCode, writeCompletion: (() -> ())? = nil) { writeQueue.addOperation { [weak self] in //stream isn't ready, let's wait guard let s = self else { return } var offset = 2 - let bytes = UnsafeMutablePointer(data.bytes) - let dataLength = data.length + let bytes = UnsafeMutablePointer((data as NSData).bytes) + let dataLength = data.count let frame = NSMutableData(capacity: dataLength + s.MaxFrameSize) let buffer = UnsafeMutablePointer(frame!.mutableBytes) buffer[0] = s.FinMask | code.rawValue @@ -773,11 +774,11 @@ public class WebSocket : NSObject, NSStreamDelegate { buffer[1] = CUnsignedChar(dataLength) } else if dataLength <= Int(UInt16.max) { buffer[1] = 126 - WebSocket.writeUint16(buffer: buffer, offset: offset, value: UInt16(dataLength)) + WebSocket.writeUint16(buffer, offset: offset, value: UInt16(dataLength)) offset += sizeof(UInt16) } else { buffer[1] = 127 - WebSocket.writeUint64(buffer: buffer, offset: offset, value: UInt64(dataLength)) + WebSocket.writeUint64(buffer, offset: offset, value: UInt64(dataLength)) offset += sizeof(UInt64) } buffer[1] |= s.MaskMask @@ -799,17 +800,17 @@ public class WebSocket : NSObject, NSStreamDelegate { if let streamError = outStream.streamError { error = streamError } else { - let errCode = InternalErrorCode.OutputStreamWriteError.rawValue - error = s.errorWithDetail(detail: "output stream error during write", code: errCode) + let errCode = InternalErrorCode.outputStreamWriteError.rawValue + error = s.errorWithDetail("output stream error during write", code: errCode) } - s.doDisconnect(error: error) + s.doDisconnect(error) break } else { total += len } if total >= offset { if let queue = self?.queue, callback = writeCompletion { - dispatch_async(queue) { + queue.asynchronously() { callback() } } @@ -822,17 +823,17 @@ public class WebSocket : NSObject, NSStreamDelegate { } ///used to preform the disconnect delegate - private func doDisconnect(error: NSError?) { + private func doDisconnect(_ error: NSError?) { guard !didDisconnect else { return } didDisconnect = true connected = false guard canDispatch else {return} - dispatch_async(queue!) { [weak self] in + queue.async { [weak self] in guard let s = self else { return } s.onDisconnect?(error) - s.delegate?.websocketDidDisconnect(socket: s, error: error) + s.delegate?.websocketDidDisconnect(s, error: error) let userInfo = error.map({ [WebsocketDisconnectionErrorKeyName: $0] }) - s.notificationCenter.post(name: WebsocketDidDisconnectNotification, object: self, userInfo: userInfo) + s.notificationCenter.post(name: NSNotification.Name(rawValue: WebsocketDidDisconnectNotification), object: self, userInfo: userInfo) } } @@ -855,7 +856,7 @@ private extension NSData { private extension UnsafeBufferPointer { - func fromOffset(offset: Int) -> UnsafeBufferPointer { + func fromOffset(_ offset: Int) -> UnsafeBufferPointer { return UnsafeBufferPointer(start: baseAddress!.advanced(by: offset), count: count - offset) } From 2adcf2d35dec701d4b328cd9c43fedf758672365 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 15 Jun 2016 09:32:47 -0400 Subject: [PATCH 12/54] more xcode 8 stuff --- SocketIO-MacTests/SocketSideEffectTest.swift | 2 +- Source/SocketEngine.swift | 2 +- Source/SocketEngineSpec.swift | 2 +- Source/SocketIOClient.swift | 2 +- Source/SocketTypes.swift | 1 + Source/WebSocket/WebSocket.swift | 6 +++--- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 7f53b51..7f4bba6 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -98,7 +98,7 @@ class SocketSideEffectTest: XCTestCase { XCTAssertEqual(socket.testHandlers.count, 1) socket.on("test") {data, ack in } XCTAssertEqual(socket.testHandlers.count, 2) - socket.off(event: "test") + socket.off("test") XCTAssertEqual(socket.testHandlers.count, 0) } diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index d48e75b..610b832 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -156,7 +156,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe // binary in base64 string let noPrefix = message[message.characters.index(message.startIndex, offsetBy: 2)..((work as NSData).bytes) From 7c3de9f30a8fddd5fb63a7c68e06e634d9078e56 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 15 Jun 2016 10:13:44 -0400 Subject: [PATCH 13/54] even more xcode 8 stuff. style changes --- .../project.pbxproj | 32 ++++++++++++++- .../xcschemes/SocketIO-Mac.xcscheme | 2 +- .../xcschemes/SocketIO-iOS.xcscheme | 2 +- .../xcschemes/SocketIO-tvOS.xcscheme | 2 +- SocketIO-MacTests/SocketObjectiveCTest.m | 2 +- SocketIO-MacTests/SocketParserTest.swift | 4 +- Source/SocketEngine.swift | 40 +++++++++---------- Source/SocketEngineClient.swift | 6 +-- Source/SocketEnginePollable.swift | 16 +++----- Source/SocketEngineSpec.swift | 4 +- Source/SocketIOClient.swift | 30 ++++++-------- Source/SocketIOClientSpec.swift | 6 +-- Source/SocketParsable.swift | 16 ++++---- Source/SocketStringReader.swift | 14 +++---- 14 files changed, 97 insertions(+), 79 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 2403b7d..de9c093 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -526,7 +526,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0800; TargetAttributes = { 572EF2181B51F16C00EEBB58 = { CreatedOnToolsVersion = 6.4; @@ -799,10 +799,25 @@ isa = XCBuildConfiguration; buildSettings = { BITCODE_GENERATION_MODE = bitcode; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Developer ID Application"; ENABLE_BITCODE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MACOSX_DEPLOYMENT_TARGET = 10.10; ONLY_ACTIVE_ARCH = YES; @@ -817,8 +832,23 @@ isa = XCBuildConfiguration; buildSettings = { BITCODE_GENERATION_MODE = bitcode; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Developer ID Application"; ENABLE_BITCODE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_NAME = SocketIOClientSwift; diff --git a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme index 64047b1..c03a4b1 100644 --- a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme @@ -1,6 +1,6 @@ (URL, URL) { @@ -273,20 +271,20 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe ws?.connect() } - public func didError(_ error: String) { - DefaultSocketLogger.Logger.error("%@", type: logType, args: error) - client?.engineDidError(error) - disconnect(error) + public func didError(reason: String) { + DefaultSocketLogger.Logger.error("%@", type: logType, args: reason) + client?.engineDidError(reason: reason) + disconnect(reason: reason) } - public func disconnect(_ reason: String) { + public func disconnect(reason: String) { guard connected else { return closeOutEngine() } DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) if closed { closeOutEngine() - client?.engineDidClose(reason) + client?.engineDidClose(reason: reason) return } @@ -352,7 +350,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } private func handleClose(_ reason: String) { - client?.engineDidClose(reason) + client?.engineDidClose(reason: reason) } private func handleMessage(_ message: String) { @@ -395,10 +393,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe doPoll() } - client?.engineDidOpen("Connect") + client?.engineDidOpen(reason: "Connect") } } catch { - didError("Error parsing open packet") + didError(reason: "Error parsing open packet") } } @@ -478,7 +476,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe //Server is not responding if pongsMissed > pongsMissedMax { - client?.engineDidClose("Ping timeout") + client?.engineDidClose(reason: "Ping timeout") return } @@ -487,9 +485,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe write("", withType: .ping, withData: []) let time = DispatchTime.now() + Double(Int64(pingInterval * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) - DispatchQueue.main.after(when: time) {[weak self] in - self?.sendPing() - } + DispatchQueue.main.after(when: time) {[weak self] in self?.sendPing() } } } @@ -539,7 +535,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe probing = false if closed { - client?.engineDidClose("Disconnect") + client?.engineDidClose(reason: "Disconnect") return } @@ -548,9 +544,9 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe websocket = false if let reason = error?.localizedDescription { - didError(reason) + didError(reason: reason) } else { - client?.engineDidClose("Socket Disconnected") + client?.engineDidClose(reason: "Socket Disconnected") } } else { flushProbeWait() diff --git a/Source/SocketEngineClient.swift b/Source/SocketEngineClient.swift index 8f77d51..49cac7c 100644 --- a/Source/SocketEngineClient.swift +++ b/Source/SocketEngineClient.swift @@ -26,9 +26,9 @@ import Foundation @objc public protocol SocketEngineClient { - func engineDidError(_ reason: String) - func engineDidClose(_ reason: String) - func engineDidOpen(_ reason: String) + func engineDidError(reason: String) + func engineDidClose(reason: String) + func engineDidOpen(reason: String) func parseEngineMessage(_ msg: String) func parseEngineBinaryData(_ data: Data) } diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index b0cc50b..b25686b 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -118,7 +118,7 @@ extension SocketEnginePollable { DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { - this.didError(err?.localizedDescription ?? "Error") + this.didError(reason: err?.localizedDescription ?? "Error") } return @@ -163,7 +163,7 @@ extension SocketEnginePollable { DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { - this.didError(err?.localizedDescription ?? "Error") + this.didError(reason: err?.localizedDescription ?? "Error") } return @@ -186,16 +186,12 @@ extension SocketEnginePollable { var reader = SocketStringReader(message: str) while reader.hasNext { - if let n = Int(reader.readUntilStringOccurence(":")) { - let str = reader.read(n) + if let n = Int(reader.readUntilOccurence(of: ":")) { + let str = reader.read(count: n) - (handleQueue).async { - self.parseEngineMessage(str, fromPolling: true) - } + handleQueue.async { self.parseEngineMessage(str, fromPolling: true) } } else { - handleQueue.async { - self.parseEngineMessage(str, fromPolling: true) - } + handleQueue.async { self.parseEngineMessage(str, fromPolling: true) } break } } diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index d39d463..b83d480 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -51,8 +51,8 @@ import Foundation init(client: SocketEngineClient, url: URL, options: NSDictionary?) func connect() - func didError(_ error: String) - func disconnect(_ reason: String) + func didError(reason: String) + func disconnect(reason: String) func doFastUpgrade() func flushWaitingForPostToWebSocket() func parseEngineData(_ data: Data) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index d56cfb0..48b3627 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -110,7 +110,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable deinit { DefaultSocketLogger.Logger.log("Client is being released", type: logType) - engine?.disconnect("Client Deinit") + engine?.disconnect(reason: "Client Deinit") } private func addEngine() -> SocketEngineSpec { @@ -150,7 +150,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handleQueue.after(when: time) {[weak self] in if let this = self where this.status != .connected && this.status != .disconnected { this.status = .disconnected - this.engine?.disconnect("Connect timeout") + this.engine?.disconnect(reason: "Connect timeout") handler?() } @@ -185,7 +185,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handleEvent("connect", data: [], isInternalMessage: false) } - func didDisconnect(_ reason: String) { + func didDisconnect(reason: String) { guard status != .disconnected else { return } DefaultSocketLogger.Logger.log("Disconnected: %@", type: logType, args: reason) @@ -193,7 +193,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable status = .disconnected // Make sure the engine is actually dead. - engine?.disconnect(reason) + engine?.disconnect(reason: reason) handleEvent("disconnect", data: [reason as AnyObject], isInternalMessage: true) } @@ -203,7 +203,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DefaultSocketLogger.Logger.log("Closing socket", type: logType) - didDisconnect("Disconnect") + didDisconnect(reason: "Disconnect") } /// Send a message to the server @@ -262,7 +262,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } } - public func engineDidClose(_ reason: String) { + public func engineDidClose(reason: String) { waitingPackets.removeAll() if status != .disconnected { @@ -270,7 +270,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } if status == .disconnected || !reconnects { - didDisconnect(reason) + didDisconnect(reason: reason) } else if !reconnecting { reconnecting = true tryReconnect(reason) @@ -278,13 +278,13 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// error - public func engineDidError(_ reason: String) { + public func engineDidError(reason: String) { DefaultSocketLogger.Logger.error("%@", type: logType, args: reason) handleEvent("error", data: [reason as AnyObject], isInternalMessage: true) } - public func engineDidOpen(_ reason: String) { + public func engineDidOpen(reason: String) { DefaultSocketLogger.Logger.log(reason, type: "SocketEngineClient") } @@ -383,22 +383,18 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func parseEngineMessage(_ msg: String) { DefaultSocketLogger.Logger.log("Should parse message: %@", type: "SocketIOClient", args: msg) - parseQueue.async { - self.parseSocketMessage(msg) - } + parseQueue.async { self.parseSocketMessage(msg) } } public func parseEngineBinaryData(_ data: Data) { - parseQueue.async { - self.parseBinaryData(data) - } + parseQueue.async { self.parseBinaryData(data) } } /// Tries to reconnect to the server. public func reconnect() { guard !reconnecting else { return } - engine?.disconnect("manual reconnect") + engine?.disconnect(reason: "manual reconnect") } /// Removes all handlers. @@ -426,7 +422,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { - return didDisconnect("Reconnect Failed") + return didDisconnect(reason: "Reconnect Failed") } DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType) diff --git a/Source/SocketIOClientSpec.swift b/Source/SocketIOClientSpec.swift index 183089e..1e2051c 100644 --- a/Source/SocketIOClientSpec.swift +++ b/Source/SocketIOClientSpec.swift @@ -27,15 +27,15 @@ protocol SocketIOClientSpec : class { var waitingPackets: [SocketPacket] { get set } func didConnect() - func didDisconnect(_ reason: String) - func didError(_ reason: String) + func didDisconnect(reason: String) + func didError(reason: String) func handleAck(_ ack: Int, data: [AnyObject]) func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int) func joinNamespace(_ namespace: String) } extension SocketIOClientSpec { - func didError(_ reason: String) { + func didError(reason: String) { DefaultSocketLogger.Logger.error("%@", type: "SocketIOClient", args: reason) handleEvent("error", data: [reason as AnyObject], isInternalMessage: true, withAck: -1) diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index e3e66c5..5b32c10 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -53,7 +53,7 @@ extension SocketParsable { case .connect: handleConnect(pack) case .disconnect: - didDisconnect("Got Disconnect") + didDisconnect(reason: "Got Disconnect") case .error: handleEvent("error", data: pack.data, isInternalMessage: true, withAck: pack.id) default: @@ -65,7 +65,7 @@ extension SocketParsable { func parseString(_ message: String) -> Either { var parser = SocketStringReader(message: message) - guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(1)) ?? -1) else { + guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(count: 1)) ?? -1) else { return .left("Invalid packet type") } @@ -77,7 +77,7 @@ extension SocketParsable { var placeholders = -1 if type == .binaryEvent || type == .binaryAck { - if let holders = Int(parser.readUntilStringOccurence("-")) { + if let holders = Int(parser.readUntilOccurence(of: "-")) { placeholders = holders } else { return .left("Invalid packet") @@ -85,7 +85,7 @@ extension SocketParsable { } if parser.currentCharacter == "/" { - namespace = parser.readUntilStringOccurence(",") ?? parser.readUntilEnd() + namespace = parser.readUntilOccurence(of: ",") ?? parser.readUntilEnd() } if !parser.hasNext { @@ -95,19 +95,19 @@ extension SocketParsable { var idString = "" if type == .error { - parser.advance(-1) + parser.advance(by: -1) } else { while parser.hasNext { - if let int = Int(parser.read(1)) { + if let int = Int(parser.read(count: 1)) { idString += String(int) } else { - parser.advance(-2) + parser.advance(by: -2) break } } } - let d = message[parser.advance(1).. String.Index { + mutating func advance(by: Int) -> String.Index { currentIndex = message.characters.index(currentIndex, offsetBy: by) return currentIndex } - mutating func read(_ length: Int) -> String { - let readString = message[currentIndex.. String { + let readString = message[currentIndex.. String { + mutating func readUntilOccurence(of string: String) -> String { let substring = message[currentIndex.. String { - return read(message.characters.distance(from: currentIndex, to: message.endIndex)) + return read(count: message.characters.distance(from: currentIndex, to: message.endIndex)) } } From bddc9dc6aa12b67bdefeaf76b085151a63c8c10e Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 15 Jun 2016 11:00:21 -0400 Subject: [PATCH 14/54] fix logging --- Source/SocketLogger.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/SocketLogger.swift b/Source/SocketLogger.swift index d40d121..5db0902 100644 --- a/Source/SocketLogger.swift +++ b/Source/SocketLogger.swift @@ -47,7 +47,10 @@ public extension SocketLogger { private func abstractLog(_ logType: String, message: String, type: String, args: [Any]) { guard log else { return } - NSLog("\(logType) \(type): \(args)") + let newArgs = args.map({arg -> CVarArg in String(arg)}) + let messageFormat = String(format: message, arguments: newArgs) ?? "" + + NSLog("\(logType) \(type): %@", messageFormat) } } From 2a0ce727926a5425eb337edd9c074c82d0f74911 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 22 Jun 2016 10:04:27 -0400 Subject: [PATCH 15/54] small swift 3 changes --- Source/SocketIOClient.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 48b3627..793af06 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -49,9 +49,9 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return nsp + "#" + (engine?.sid ?? "") } - private let emitQueue = DispatchQueue(label: "com.socketio.emitQueue", attributes: DispatchQueueAttributes.serial) + private let emitQueue = DispatchQueue(label: "com.socketio.emitQueue", attributes: .serial) private let logType = "SocketIOClient" - private let parseQueue = DispatchQueue(label: "com.socketio.parseQueue", attributes: DispatchQueueAttributes.serial) + private let parseQueue = DispatchQueue(label: "com.socketio.parseQueue", attributes: .serial) private var anyHandler: ((SocketAnyEvent) -> Void)? private var currentReconnectAttempt = 0 @@ -70,7 +70,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable self.options = options self.socketURL = socketURL - if ((socketURL.absoluteString?.hasPrefix("https://")) != nil) { + if socketURL.absoluteString?.hasPrefix("https://") ?? false { self.options.insertIgnore(.secure(true)) } @@ -353,7 +353,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable let handler = SocketEventHandler(event: event, id: UUID(), callback: callback) handlers.append(handler) - return handler.id as UUID + return handler.id } /// Adds a single-use handler for an event. @@ -372,7 +372,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handlers.append(handler) - return handler.id as UUID + return handler.id } /// Adds a handler that will be called on every event. From 382821144685dd16271a3713690da01782918fb4 Mon Sep 17 00:00:00 2001 From: Adam Putinski Date: Wed, 13 Jul 2016 06:34:02 -0400 Subject: [PATCH 16/54] Enable APPLICATION_EXTENSION_API_ONLY --- Socket.IO-Client-Swift.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 6760c64..9ce273a 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -846,6 +846,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -902,6 +903,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; From f3d771641d9b854f2303c7ee5b6ec5fe6ce4b3c5 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 14 Jul 2016 19:54:09 -0400 Subject: [PATCH 17/54] some swift3 changes --- Source/SocketIOClient.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 15ce86e..c7bf771 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -124,11 +124,12 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Connect to the server. public func connect() { - connect(0, handleWith: nil) + connect(timeoutAfter: 0, withHandler: nil) } - /// Connect to the server. If we aren't connected after timeoutAfter, call handler - public func connect(_ timeoutAfter: Int, handleWith handler: (() -> Void)?) { + /// Connect to the server. If we aren't connected after timeoutAfter, call withHandler + /// 0 Never times out + public func connect(timeoutAfter: Int, withHandler handler: (() -> Void)?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") guard status != .connected else { @@ -410,6 +411,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable handlers.removeAll(keepingCapacity: false) } + /// Because Swift 3 removes a lot of implicit briding so we have to perform more casts func socketDataToAnyObject(_ data: [SocketData]) -> [AnyObject] { return data.flatMap({$0 as? AnyObject}) } From afa27e4173fe49427401094ca6a59dbaf1d84d6c Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 16 Jul 2016 21:06:22 -0400 Subject: [PATCH 18/54] get readme ready for swift3 --- README.md | 68 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 1db6a38..54f9000 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Socket.IO-client for iOS/OS X. ##Example ```swift -let socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080")!, options: [.Log(true), .ForcePolling(true)]) +let socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080")!, options: [.log(true), .forcePolling(true)]) socket.on("connect") {data, ack in print("socket connected") @@ -55,13 +55,15 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:url options:@ - Can be used from Objective-C ##Installation -Requires Swift 2.2/Xcode 7.3 +Requires Swift 3/Xcode 8.x -If you need Swift 2.1/Xcode 7.2 use v5.5.0 (Pre-Swift 2.2 support is no longer maintained) +If you need swift 2.2 use 6.x (Pre-Swift 3 support is no longer maintained) -If you need Swift 1.2/Xcode 6.3/4 use v2.4.5 (Pre-Swift 2 support is no longer maintained) +If you need Swift 2.1 use v5.5.0 (Pre-Swift 2.2 support is no longer maintained) -If you need Swift 1.1/Xcode 6.2 use v1.5.2. (Pre-Swift 1.2 support is no longer maintained) +If you need Swift 1.2 use v2.4.5 (Pre-Swift 2 support is no longer maintained) + +If you need Swift 1.1 use v1.5.2. (Pre-Swift 1.2 support is no longer maintained) Manually (iOS 7+) ----------------- @@ -148,43 +150,43 @@ Options All options are a case of SocketIOClientOption. To get the Objective-C Option, convert the name to lowerCamelCase. ```swift -case ConnectParams([String: AnyObject]) // Dictionary whose contents will be passed with the connection. -case Cookies([NSHTTPCookie]) // An array of NSHTTPCookies. Passed during the handshake. Default is nil. -case DoubleEncodeUTF8(Bool) // Whether or not to double encode utf8. If using the node based server this should be true. Default is true. -case ExtraHeaders([String: String]) // Adds custom headers to the initial request. Default is nil. -case ForcePolling(Bool) // `true` forces the client to use xhr-polling. Default is `false` -case ForceNew(Bool) // Will a create a new engine for each connect. Useful if you find a bug in the engine related to reconnects -case ForceWebsockets(Bool) // `true` forces the client to use WebSockets. Default is `false` -case HandleQueue(dispatch_queue_t) // The dispatch queue that handlers are run on. Default is the main queue. -case Log(Bool) // If `true` socket will log debug messages. Default is false. -case Logger(SocketLogger) // Custom logger that conforms to SocketLogger. Will use the default logging otherwise. -case Nsp(String) // The namespace to connect to. Must begin with /. Default is `/` -case Path(String) // If the server uses a custom path. ex: `"/swift/"`. Default is `""` -case Reconnects(Bool) // Whether to reconnect on server lose. Default is `true` -case ReconnectAttempts(Int) // How many times to reconnect. Default is `-1` (infinite tries) -case ReconnectWait(Int) // Amount of time to wait between reconnects. Default is `10` -case SessionDelegate(NSURLSessionDelegate) // Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs. Default is nil. -case Secure(Bool) // If the connection should use TLS. Default is false. -case Security(SSLSecurity) // Allows you to set which certs are valid. Useful for SSL pinning. -case SelfSigned(Bool) // Sets WebSocket.selfSignedSSL. Use this if you're using self-signed certs. -case VoipEnabled(Bool) // Only use this option if you're using the client with VoIP services. Changes the way the WebSocket is created. Default is false +case connectParams([String: AnyObject]) // Dictionary whose contents will be passed with the connection. +case cookies([NSHTTPCookie]) // An array of NSHTTPCookies. Passed during the handshake. Default is nil. +case doubleEncodeUTF8(Bool) // Whether or not to double encode utf8. If using the node based server this should be true. Default is true. +case extraHeaders([String: String]) // Adds custom headers to the initial request. Default is nil. +case forcePolling(Bool) // `true` forces the client to use xhr-polling. Default is `false` +case forceNew(Bool) // Will a create a new engine for each connect. Useful if you find a bug in the engine related to reconnects +case forceWebsockets(Bool) // `true` forces the client to use WebSockets. Default is `false` +case handleQueue(dispatch_queue_t) // The dispatch queue that handlers are run on. Default is the main queue. +case log(Bool) // If `true` socket will log debug messages. Default is false. +case logger(SocketLogger) // Custom logger that conforms to SocketLogger. Will use the default logging otherwise. +case nsp(String) // The namespace to connect to. Must begin with /. Default is `/` +case path(String) // If the server uses a custom path. ex: `"/swift/"`. Default is `""` +case reconnects(Bool) // Whether to reconnect on server lose. Default is `true` +case reconnectAttempts(Int) // How many times to reconnect. Default is `-1` (infinite tries) +case reconnectWait(Int) // Amount of time to wait between reconnects. Default is `10` +case sessionDelegate(NSURLSessionDelegate) // Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs. Default is nil. +case secure(Bool) // If the connection should use TLS. Default is false. +case security(SSLSecurity) // Allows you to set which certs are valid. Useful for SSL pinning. +case selfSigned(Bool) // Sets WebSocket.selfSignedSSL. Use this if you're using self-signed certs. +case voipEnabled(Bool) // Only use this option if you're using the client with VoIP services. Changes the way the WebSocket is created. Default is false ``` Methods ------- -1. `on(event: String, callback: NormalCallback) -> NSUUID` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. Returns a unique id for the handler. -2. `once(event: String, callback: NormalCallback) -> NSUUID` - Adds a handler that will only be executed once. Returns a unique id for the handler. +1. `on(_ event: String, callback: NormalCallback) -> NSUUID` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. Returns a unique id for the handler. +2. `once(_ event: String, callback: NormalCallback) -> NSUUID` - Adds a handler that will only be executed once. Returns a unique id for the handler. 3. `onAny(callback:((event: String, items: AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. -4. `emit(event: String, _ items: AnyObject...)` - Sends a message. Can send multiple items. -5. `emit(event: String, withItems items: [AnyObject])` - `emit` for Objective-C -6. `emitWithAck(event: String, _ items: AnyObject...) -> (timeoutAfter: UInt64, callback: (NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. -7. `emitWithAck(event: String, withItems items: [AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. +4. `emit(_ event: String, _ items: AnyObject...)` - Sends a message. Can send multiple items. +5. `emit(_ event: String, withItems items: [AnyObject])` - `emit` for Objective-C +6. `emitWithAck(_ event: String, _ items: AnyObject...) -> (timeoutAfter: UInt64, callback: (NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. +7. `emitWithAck(_ event: String, withItems items: [AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. 8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 9. `connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. 10. `disconnect()` - Closes the socket. Reopening a disconnected socket is not fully tested. 11. `reconnect()` - Causes the client to reconnect to the server. -12. `joinNamespace(namespace: String)` - Causes the client to join namespace. Shouldn't need to be called unless you change namespaces manually. +12. `joinNamespace(_ namespace: String)` - Causes the client to join namespace. Shouldn't need to be called unless you change namespaces manually. 13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / -14. `off(event: String)` - Removes all event handlers for event. +14. `off(_ event: String)` - Removes all event handlers for event. 15. `off(id id: NSUUID)` - Removes the event that corresponds to id. 16. `removeAllHandlers()` - Removes all handlers. From f140d7979ef32951a2dcb3d2aad3e90dd308f7c0 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 16 Jul 2016 21:27:18 -0400 Subject: [PATCH 19/54] change method name --- Source/SocketEngine.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index f040bb1..4ca63a6 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -394,11 +394,11 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe } } - private func handlePong(_ pongMessage: String) { + private func handlePong(with message: String) { pongsMissed = 0 // We should upgrade - if pongMessage == "3probe" { + if message == "3probe" { upgradeTransport() } } @@ -436,7 +436,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe case .noop: handleNOOP() case .pong: - handlePong(fixedString) + handlePong(with: fixedString) case .open: handleOpen(openData: fixedString[fixedString.characters.index(after: fixedString.characters.startIndex).. Date: Sat, 16 Jul 2016 22:27:50 -0400 Subject: [PATCH 20/54] change another method name --- Source/SocketEventHandler.swift | 2 +- Source/SocketIOClient.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/SocketEventHandler.swift b/Source/SocketEventHandler.swift index 367d214..bb82abf 100644 --- a/Source/SocketEventHandler.swift +++ b/Source/SocketEventHandler.swift @@ -29,7 +29,7 @@ struct SocketEventHandler { let id: UUID let callback: NormalCallback - func executeCallback(_ items: [AnyObject], withAck ack: Int, withSocket socket: SocketIOClient) { + func executeCallback(with items: [AnyObject], withAck ack: Int, withSocket socket: SocketIOClient) { callback(items, SocketAckEmitter(socket: socket, ackNum: ack)) } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index c7bf771..fdc2a2f 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -315,7 +315,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable self.anyHandler?(SocketAnyEvent(event: event, items: data)) for handler in self.handlers where handler.event == event { - handler.executeCallback(data, withAck: ack, withSocket: self) + handler.executeCallback(with: data, withAck: ack, withSocket: self) } } } From f214de14073cf21d3e98cd80a51e2ed3d60924ba Mon Sep 17 00:00:00 2001 From: Adam Putinski Date: Tue, 19 Jul 2016 22:37:56 -0400 Subject: [PATCH 21/54] Use Legacy Swift Language Version --- Socket.IO-Client-Swift.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 9ce273a..3211562 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -893,6 +893,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -943,6 +944,7 @@ PRODUCT_BUNDLE_IDENTIFIER = io.socket.SocketIOClientSwift; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; From 777fa30c764ced09b7a280413a0b636f437b8516 Mon Sep 17 00:00:00 2001 From: Adam Putinski Date: Tue, 19 Jul 2016 23:01:59 -0400 Subject: [PATCH 22/54] Fix Xcode 8 Beta 3 issues/warnings --- Source/SocketEngine.swift | 5 ++--- Source/SocketEnginePollable.swift | 2 +- Source/SocketEngineSpec.swift | 4 ++-- Source/SocketIOClient.swift | 2 +- Source/SocketIOClientOption.swift | 2 +- Source/WebSocket/SSLSecurity.swift | 2 +- Source/WebSocket/WebSocket.swift | 28 ++++++++++++++-------------- 7 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 4ca63a6..b01a2e4 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -151,8 +151,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe if message.hasPrefix("b4") { // binary in base64 string let noPrefix = message[message.characters.index(message.startIndex, offsetBy: 2).. String { if let latin1 = string.data(using: String.Encoding.utf8), - utf8 = NSString(data: latin1, encoding: String.Encoding.isoLatin1.rawValue) { + let utf8 = NSString(data: latin1, encoding: String.Encoding.isoLatin1.rawValue) { return utf8 as String } else { return string @@ -101,7 +101,7 @@ extension SocketEngineSpec { func fixDoubleUTF8(_ string: String) -> String { if let utf8 = string.data(using: String.Encoding.isoLatin1), - latin1 = NSString(data: utf8, encoding: String.Encoding.utf8.rawValue) { + let latin1 = NSString(data: utf8, encoding: String.Encoding.utf8.rawValue) { return latin1 as String } else { return string diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index fdc2a2f..478790b 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -150,7 +150,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable let time = DispatchTime.now() + Double(Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) / Double(NSEC_PER_SEC) handleQueue.after(when: time) {[weak self] in - if let this = self where this.status != .connected && this.status != .disconnected { + if let this = self, this.status != .connected && this.status != .disconnected { this.status = .disconnected this.engine?.disconnect(reason: "Connect timeout") diff --git a/Source/SocketIOClientOption.swift b/Source/SocketIOClientOption.swift index c06a245..db860c9 100644 --- a/Source/SocketIOClientOption.swift +++ b/Source/SocketIOClientOption.swift @@ -217,7 +217,7 @@ extension NSDictionary { var options = Set() for (rawKey, value) in self { - if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { + if let key = rawKey as? String, let opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { options.insertIgnore(opt) } } diff --git a/Source/WebSocket/SSLSecurity.swift b/Source/WebSocket/SSLSecurity.swift index b93e55b..7ed067e 100644 --- a/Source/WebSocket/SSLSecurity.swift +++ b/Source/WebSocket/SSLSecurity.swift @@ -96,7 +96,7 @@ public class SSLSecurity : NSObject { DispatchQueue.global(attributes: DispatchQueue.GlobalAttributes.qosDefault).async { let pubKeys = certs.reduce([SecKey]()) { (pubKeys: [SecKey], cert: SSLCert) -> [SecKey] in var pubKeys = pubKeys - if let data = cert.certData where cert.key == nil { + if let data = cert.certData, cert.key == nil { cert.key = self.extractPublicKey(data) } if let key = cert.key { diff --git a/Source/WebSocket/WebSocket.swift b/Source/WebSocket/WebSocket.swift index 5dce627..2c45b73 100644 --- a/Source/WebSocket/WebSocket.swift +++ b/Source/WebSocket/WebSocket.swift @@ -305,7 +305,7 @@ public class WebSocket : NSObject, StreamDelegate { } if let cipherSuites = self.enabledSSLCipherSuites { if let sslContextIn = CFReadStreamCopyProperty(inputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext?, - sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { + let sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) if resIn != errSecSuccess { @@ -349,7 +349,7 @@ public class WebSocket : NSObject, StreamDelegate { //delegate for the stream methods. Processes incoming bytes public func stream(_ aStream: Stream, handle eventCode: Stream.Event) { - if let sec = security where !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { + if let sec = security, !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { let possibleTrust: AnyObject? = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) if let trust: AnyObject = possibleTrust { let domain: AnyObject? = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) @@ -534,7 +534,7 @@ public class WebSocket : NSObject, StreamDelegate { } /// Process one message at the start of `buffer`. Return another buffer (sharing storage) that contains the leftover contents of `buffer` that I didn't process. - @warn_unused_result + private func processOneRawMessage(inBuffer buffer: UnsafeBufferPointer) -> UnsafeBufferPointer { let response = readStack.last guard let baseAddress = buffer.baseAddress else { fatalError("") } @@ -543,7 +543,7 @@ public class WebSocket : NSObject, StreamDelegate { fragBuffer = Data(buffer: buffer) return emptyBuffer } - if let response = response where response.bytesLeft > 0 { + if let response = response, response.bytesLeft > 0 { var len = response.bytesLeft var extra = bufferLen - response.bytesLeft if response.bytesLeft > bufferLen { @@ -612,10 +612,10 @@ public class WebSocket : NSObject, StreamDelegate { var dataLength = UInt64(payloadLen) if dataLength == 127 { dataLength = WebSocket.readUint64(baseAddress, offset: offset) - offset += sizeof(UInt64) + offset += sizeof(UInt64.self) } else if dataLength == 126 { dataLength = UInt64(WebSocket.readUint16(baseAddress, offset: offset)) - offset += sizeof(UInt16) + offset += sizeof(UInt16.self) } if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { fragBuffer = Data(bytes: baseAddress, count: bufferLen) @@ -754,10 +754,10 @@ public class WebSocket : NSObject, StreamDelegate { ///write a an error to the socket private func writeError(_ code: UInt16) { - let buf = NSMutableData(capacity: sizeof(UInt16)) + let buf = NSMutableData(capacity: sizeof(UInt16.self)) let buffer = UnsafeMutablePointer(buf!.bytes) WebSocket.writeUint16(buffer, offset: 0, value: code) - dequeueWrite(Data(bytes: buffer, count: sizeof(UInt16)), code: .connectionClose) + dequeueWrite(Data(bytes: buffer, count: sizeof(UInt16.self)), code: .connectionClose) } ///used to write things to the stream private func dequeueWrite(_ data: Data, code: OpCode, writeCompletion: (() -> ())? = nil) { @@ -775,19 +775,19 @@ public class WebSocket : NSObject, StreamDelegate { } else if dataLength <= Int(UInt16.max) { buffer[1] = 126 WebSocket.writeUint16(buffer, offset: offset, value: UInt16(dataLength)) - offset += sizeof(UInt16) + offset += sizeof(UInt16.self) } else { buffer[1] = 127 WebSocket.writeUint64(buffer, offset: offset, value: UInt64(dataLength)) - offset += sizeof(UInt64) + offset += sizeof(UInt64.self) } buffer[1] |= s.MaskMask let maskKey = UnsafeMutablePointer(buffer + offset) - SecRandomCopyBytes(kSecRandomDefault, Int(sizeof(UInt32)), maskKey) - offset += sizeof(UInt32) + _ = SecRandomCopyBytes(kSecRandomDefault, Int(sizeof(UInt32.self)), maskKey) + offset += sizeof(UInt32.self) for i in 0..= offset { - if let queue = self?.queue, callback = writeCompletion { + if let queue = self?.queue, let callback = writeCompletion { queue.asynchronously() { callback() } From 4ad5025c77a02c8935ee8035678f91d37f6db836 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 20 Jul 2016 11:07:37 -0400 Subject: [PATCH 23/54] update tests, add test for base64 --- SocketIO-MacTests/SocketAckManagerTest.swift | 4 +- SocketIO-MacTests/SocketBasicPacketTest.swift | 4 +- SocketIO-MacTests/SocketEngineTest.swift | 43 +++++++++++++------ SocketIO-MacTests/SocketParserTest.swift | 2 +- SocketIO-MacTests/SocketSideEffectTest.swift | 40 ++++++++--------- Source/WebSocket/WebSocket.swift | 2 +- 6 files changed, 57 insertions(+), 38 deletions(-) diff --git a/SocketIO-MacTests/SocketAckManagerTest.swift b/SocketIO-MacTests/SocketAckManagerTest.swift index fab681a..a90db13 100644 --- a/SocketIO-MacTests/SocketAckManagerTest.swift +++ b/SocketIO-MacTests/SocketAckManagerTest.swift @@ -13,14 +13,14 @@ class SocketAckManagerTest: XCTestCase { var ackManager = SocketAckManager() func testAddAcks() { - let callbackExpection = self.expectation(withDescription: "callbackExpection") + let callbackExpection = self.expectation(description: "callbackExpection") let itemsArray = ["Hi", "ho"] func callback(_ items: [AnyObject]) { callbackExpection.fulfill() } ackManager.addAck(1, callback: callback) ackManager.executeAck(1, with: itemsArray, onQueue: DispatchQueue.main) - waitForExpectations(withTimeout: 3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) } } diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index 78a04eb..7526fe7 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -154,8 +154,8 @@ class SocketBasicPacketTest: XCTestCase { if case let .right(packet) = socket.parseString(engineString) { var packet = packet XCTAssertEqual(packet.event, "test") - packet.addData(data) - packet.addData(data2) + _ = packet.addData(data) + _ = packet.addData(data2) XCTAssertEqual(packet.args[0] as? String, "~~0") } else { XCTFail() diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 005623c..4c54833 100644 --- a/SocketIO-MacTests/SocketEngineTest.swift +++ b/SocketIO-MacTests/SocketEngineTest.swift @@ -22,17 +22,17 @@ class SocketEngineTest: XCTestCase { } func testBasicPollingMessage() { - let expect = expectation(withDescription: "Basic polling test") + let expect = expectation(description: "Basic polling test") client.on("blankTest") {data, ack in expect.fulfill() } engine.parsePollingMessage("15:42[\"blankTest\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testTwoPacketsInOnePollTest() { - let finalExpectation = expectation(withDescription: "Final packet in poll test") + let finalExpectation = expectation(description: "Final packet in poll test") var gotBlank = false client.on("blankTest") {data, ack in @@ -40,7 +40,7 @@ class SocketEngineTest: XCTestCase { } client.on("stringTest") {data, ack in - if let str = data[0] as? String where gotBlank { + if let str = data[0] as? String, gotBlank { if str == "hello" { finalExpectation.fulfill() } @@ -48,35 +48,35 @@ class SocketEngineTest: XCTestCase { } engine.parsePollingMessage("15:42[\"blankTest\"]24:42[\"stringTest\",\"hello\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEngineDoesErrorOnUnknownTransport() { - let finalExpectation = expectation(withDescription: "Unknown Transport") + let finalExpectation = expectation(description: "Unknown Transport") client.on("error") {data, ack in - if let error = data[0] as? String where error == "Unknown transport" { + if let error = data[0] as? String, error == "Unknown transport" { finalExpectation.fulfill() } } engine.parseEngineMessage("{\"code\": 0, \"message\": \"Unknown transport\"}", fromPolling: false) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEngineDoesErrorOnUnknownMessage() { - let finalExpectation = expectation(withDescription: "Engine Errors") + let finalExpectation = expectation(description: "Engine Errors") client.on("error") {data, ack in finalExpectation.fulfill() } engine.parseEngineMessage("afafafda", fromPolling: false) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEngineDecodesUTF8Properly() { - let expect = expectation(withDescription: "Engine Decodes utf8") + let expect = expectation(description: "Engine Decodes utf8") client.on("stringTest") {data, ack in XCTAssertEqual(data[0] as? String, "lïne one\nlīne \rtwo", "Failed string test") @@ -84,7 +84,7 @@ class SocketEngineTest: XCTestCase { } engine.parsePollingMessage("41:42[\"stringTest\",\"lïne one\\nlÄ«ne \\rtwo\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEncodeURLProperly() { @@ -102,4 +102,23 @@ class SocketEngineTest: XCTestCase { XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D") XCTAssertEqual(engine.urlWebSocket.query, "transport=websocket&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D") } + + func testBase64Data() { + let expect = expectation(description: "Engine Decodes base64 data") + let b64String = "b4aGVsbG8NCg==" + let packetString = "451-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0}}]" + + client.on("test") {data, ack in + if let data = data[0] as? Data, let string = String(data: data, encoding: .utf8) { + XCTAssertEqual(string, "hello") + } + + expect.fulfill() + } + + engine.parseEngineMessage(packetString, fromPolling: false) + engine.parseEngineMessage(b64String, fromPolling: false) + + waitForExpectations(timeout: 3, handler: nil) + } } diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index 62e1d1f..cb1e8d0 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -136,7 +136,7 @@ class SocketParserTest: XCTestCase { let keys = Array(SocketParserTest.packetTypes.keys) measure { for item in keys.enumerated() { - self.testSocket.parseString(item.element) + _ = self.testSocket.parseString(item.element) } } } diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 7f4bba6..8b5f611 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -37,18 +37,18 @@ class SocketSideEffectTest: XCTestCase { } func testHandleAck() { - let expect = expectation(withDescription: "handled ack") + let expect = expectation(description: "handled ack") socket.emitWithAck("test")(timeoutAfter: 0) {data in XCTAssertEqual(data[0] as? String, "hello world") expect.fulfill() } socket.parseSocketMessage("30[\"hello world\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleAck2() { - let expect = expectation(withDescription: "handled ack2") + let expect = expectation(description: "handled ack2") socket.emitWithAck("test")(timeoutAfter: 0) {data in XCTAssertTrue(data.count == 2, "Wrong number of ack items") expect.fulfill() @@ -56,33 +56,33 @@ class SocketSideEffectTest: XCTestCase { socket.parseSocketMessage("61-0[{\"_placeholder\":true,\"num\":0},{\"test\":true}]") socket.parseBinaryData(Data()) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleEvent() { - let expect = expectation(withDescription: "handled event") + let expect = expectation(description: "handled event") socket.on("test") {data, ack in XCTAssertEqual(data[0] as? String, "hello world") expect.fulfill() } socket.parseSocketMessage("2[\"test\",\"hello world\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleStringEventWithQuotes() { - let expect = expectation(withDescription: "handled event") + let expect = expectation(description: "handled event") socket.on("test") {data, ack in XCTAssertEqual(data[0] as? String, "\"hello world\"") expect.fulfill() } socket.parseSocketMessage("2[\"test\",\"\\\"hello world\\\"\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleOnceEvent() { - let expect = expectation(withDescription: "handled event") + let expect = expectation(description: "handled event") socket.once("test") {data, ack in XCTAssertEqual(data[0] as? String, "hello world") XCTAssertEqual(self.socket.testHandlers.count, 0) @@ -90,7 +90,7 @@ class SocketSideEffectTest: XCTestCase { } socket.parseSocketMessage("2[\"test\",\"hello world\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testOffWithEvent() { @@ -112,21 +112,21 @@ class SocketSideEffectTest: XCTestCase { } func testHandlesErrorPacket() { - let expect = expectation(withDescription: "Handled error") + let expect = expectation(description: "Handled error") socket.on("error") {data, ack in - if let error = data[0] as? String where error == "test error" { + if let error = data[0] as? String, error == "test error" { expect.fulfill() } } socket.parseSocketMessage("4\"test error\"") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleBinaryEvent() { - let expect = expectation(withDescription: "handled binary event") + let expect = expectation(description: "handled binary event") socket.on("test") {data, ack in - if let dict = data[0] as? NSDictionary, data = dict["test"] as? NSData { + if let dict = data[0] as? NSDictionary, let data = dict["test"] as? NSData { XCTAssertEqual(data, self.data) expect.fulfill() } @@ -134,7 +134,7 @@ class SocketSideEffectTest: XCTestCase { socket.parseSocketMessage("51-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0}}]") socket.parseBinaryData(data) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testSocketDataToAnyObject() { @@ -144,10 +144,10 @@ class SocketSideEffectTest: XCTestCase { } func testHandleMultipleBinaryEvent() { - let expect = expectation(withDescription: "handled multiple binary event") + let expect = expectation(description: "handled multiple binary event") socket.on("test") {data, ack in - if let dict = data[0] as? NSDictionary, data = dict["test"] as? NSData, - data2 = dict["test2"] as? NSData { + if let dict = data[0] as? NSDictionary, let data = dict["test"] as? NSData, + let data2 = dict["test2"] as? NSData { XCTAssertEqual(data, self.data) XCTAssertEqual(data2, self.data2) expect.fulfill() @@ -157,7 +157,7 @@ class SocketSideEffectTest: XCTestCase { socket.parseSocketMessage("52-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0},\"test2\":{\"_placeholder\":true,\"num\":1}}]") socket.parseBinaryData(data) socket.parseBinaryData(data2) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testSocketManager() { diff --git a/Source/WebSocket/WebSocket.swift b/Source/WebSocket/WebSocket.swift index 2c45b73..73fc664 100644 --- a/Source/WebSocket/WebSocket.swift +++ b/Source/WebSocket/WebSocket.swift @@ -810,7 +810,7 @@ public class WebSocket : NSObject, StreamDelegate { } if total >= offset { if let queue = self?.queue, let callback = writeCompletion { - queue.asynchronously() { + queue.async { callback() } } From 4c8bfb91eb01265501913211a2350b6dd28f43c7 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 21 Jul 2016 10:44:51 -0400 Subject: [PATCH 24/54] use a whitelist --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d1e6457..17b777a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,4 @@ 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 From 61a20cf27ed0d9d9e3327dda8cda362a7d504ad3 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 2 Aug 2016 19:38:08 -0400 Subject: [PATCH 25/54] update for beta 4 --- Source/SSLSecurity.swift | 4 ++-- Source/SocketEngine.swift | 12 ++++++------ Source/SocketEnginePollable.swift | 2 +- Source/SocketExtensions.swift | 2 +- Source/SocketIOClient.swift | 14 +++++++------- Source/SocketPacket.swift | 4 ++-- Source/WebSocket.swift | 8 ++++---- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Source/SSLSecurity.swift b/Source/SSLSecurity.swift index 93490ca..60c7ecb 100644 --- a/Source/SSLSecurity.swift +++ b/Source/SSLSecurity.swift @@ -66,7 +66,7 @@ public class SSLSecurity : NSObject { - returns: a representation security object to be used with */ public convenience init(usePublicKeys: Bool = false) { - let paths = Bundle.main.pathsForResources(ofType: "cer", inDirectory: ".") + let paths = Bundle.main.paths(forResourcesOfType: "cer", inDirectory: ".") let certs = paths.reduce([SSLCert]()) { (certs: [SSLCert], path: String) -> [SSLCert] in var certs = certs @@ -93,7 +93,7 @@ public class SSLSecurity : NSObject { self.usePublicKeys = usePublicKeys if self.usePublicKeys { - DispatchQueue.global(attributes: DispatchQueue.GlobalAttributes.qosDefault).async { + DispatchQueue.global(qos: .default).async { let pubKeys = certs.reduce([SecKey]()) { (pubKeys: [SecKey], cert: SSLCert) -> [SecKey] in var pubKeys = pubKeys if let data = cert.certData, cert.key == nil { diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index fd397c6..3445282 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -25,9 +25,9 @@ import Foundation public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, SocketEngineWebsocket { - public let emitQueue = DispatchQueue(label: "com.socketio.engineEmitQueue", attributes: DispatchQueueAttributes.serial) - public let handleQueue = DispatchQueue(label: "com.socketio.engineHandleQueue", attributes: DispatchQueueAttributes.serial) - public let parseQueue = DispatchQueue(label: "com.socketio.engineParseQueue", attributes: DispatchQueueAttributes.serial) + public let emitQueue = DispatchQueue(label: "com.socketio.engineEmitQueue", attributes: []) + public let handleQueue = DispatchQueue(label: "com.socketio.engineHandleQueue", attributes: []) + public let parseQueue = DispatchQueue(label: "com.socketio.engineParseQueue", attributes: []) public var connectParams: [String: AnyObject]? { didSet { @@ -218,8 +218,8 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll return (URL(string: "http://localhost/")!, URL(string: "http://localhost/")!) } - var urlPolling = URLComponents(string: url.absoluteString!)! - var urlWebSocket = URLComponents(string: url.absoluteString!)! + var urlPolling = URLComponents(string: url.absoluteString)! + var urlWebSocket = URLComponents(string: url.absoluteString)! var queryString = "" urlWebSocket.path = socketPath @@ -482,7 +482,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll write("", withType: .ping, withData: []) let time = DispatchTime.now() + Double(Int64(pingInterval * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) - DispatchQueue.main.after(when: time) {[weak self] in self?.sendPing() } + DispatchQueue.main.asyncAfter(deadline: time) {[weak self] in self?.sendPing() } } } diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 0521b85..155aab1 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -100,7 +100,7 @@ extension SocketEnginePollable { doLongPoll(for: req ) } - func doRequest(for req: URLRequest, callbackWith callback: (Data?, URLResponse?, NSError?) -> Void) { + func doRequest(for req: URLRequest, callbackWith callback: (Data?, URLResponse?, Error?) -> Void) { if !polling || closed || invalidated || fastUpgrade { return } diff --git a/Source/SocketExtensions.swift b/Source/SocketExtensions.swift index 4080a24..f75033f 100644 --- a/Source/SocketExtensions.swift +++ b/Source/SocketExtensions.swift @@ -24,7 +24,7 @@ import Foundation -enum JSONError : ErrorProtocol { +enum JSONError : Error { case notArray case notNSDictionary } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 478790b..465b1b1 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -49,10 +49,10 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return nsp + "#" + (engine?.sid ?? "") } - private let ackQueue = DispatchQueue(label: "com.socketio.ackQueue", attributes: .serial) - private let emitQueue = DispatchQueue(label: "com.socketio.emitQueue", attributes: .serial) + private let ackQueue = DispatchQueue(label: "com.socketio.ackQueue", attributes: []) + private let emitQueue = DispatchQueue(label: "com.socketio.emitQueue", attributes: []) private let logType = "SocketIOClient" - private let parseQueue = DispatchQueue(label: "com.socketio.parseQueue", attributes: .serial) + private let parseQueue = DispatchQueue(label: "com.socketio.parseQueue", attributes: []) private var anyHandler: ((SocketAnyEvent) -> Void)? private var currentReconnectAttempt = 0 @@ -71,7 +71,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable self.options = options self.socketURL = socketURL - if socketURL.absoluteString?.hasPrefix("https://") ?? false { + if socketURL.absoluteString.hasPrefix("https://") ?? false { self.options.insertIgnore(.secure(true)) } @@ -149,7 +149,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable let time = DispatchTime.now() + Double(Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - handleQueue.after(when: time) {[weak self] in + handleQueue.asyncAfter(deadline: time) {[weak self] in if let this = self, this.status != .connected && this.status != .disconnected { this.status = .disconnected this.engine?.disconnect(reason: "Connect timeout") @@ -174,7 +174,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable if timeout != 0 { let time = DispatchTime.now() + Double(Int64(timeout * NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - this.handleQueue.after(when: time) { + this.handleQueue.asyncAfter(deadline: time) { this.ackHandlers.timeoutAck(ack, onQueue: this.handleQueue) } } @@ -443,7 +443,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable let dispatchAfter = DispatchTime.now() + Double(Int64(UInt64(reconnectWait) * NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - DispatchQueue.main.after(when: dispatchAfter, execute: _tryReconnect) + DispatchQueue.main.asyncAfter(deadline: dispatchAfter, execute: _tryReconnect) } } diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index 3e9e4f5..3fb2e6a 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -152,7 +152,7 @@ struct SocketPacket { if dict["_placeholder"] as? Bool ?? false { return binary[dict["num"] as! Int] } else { - return dict.reduce(NSMutableDictionary(), combine: {cur, keyValue in + return dict.reduce(NSMutableDictionary(), {cur, keyValue in cur[keyValue.0 as! NSCopying] = _fillInPlaceholders(keyValue.1) return cur }) @@ -202,7 +202,7 @@ private extension SocketPacket { case let arr as [AnyObject]: return arr.map({shred($0, binary: &binary)}) as AnyObject case let dict as NSDictionary: - return dict.reduce(NSMutableDictionary(), combine: {cur, keyValue in + return dict.reduce(NSMutableDictionary(), {cur, keyValue in cur[keyValue.0 as! NSCopying] = shred(keyValue.1, binary: &binary) return cur }) diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index 73fc664..e54b9a8 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -136,7 +136,7 @@ public class WebSocket : NSObject, StreamDelegate { private var certValidated = false private var didDisconnect = false private var readyToWrite = false - private let mutex = Lock() + private let mutex = NSLock() private let notificationCenter = NotificationCenter.default private var canDispatch: Bool { mutex.lock() @@ -145,7 +145,7 @@ public class WebSocket : NSObject, StreamDelegate { return canWork } //the shared processing queue used for all websocket - private static let sharedWorkQueue = DispatchQueue(label: "com.vluxe.starscream.websocket", attributes: DispatchQueueAttributes.serial) + private static let sharedWorkQueue = DispatchQueue(label: "com.vluxe.starscream.websocket", attributes: []) //used for setting protocols. public init(url: URL, protocols: [String]? = nil) { @@ -176,7 +176,7 @@ public class WebSocket : NSObject, StreamDelegate { public func disconnect(_ forceTimeout: TimeInterval? = nil) { switch forceTimeout { case .some(let seconds) where seconds > 0: - queue.after(when: DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) { [weak self] in + queue.asyncAfter(deadline: DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) { [weak self] in self?.disconnectStream(nil) } fallthrough @@ -798,7 +798,7 @@ public class WebSocket : NSObject, StreamDelegate { if len < 0 { var error: NSError? if let streamError = outStream.streamError { - error = streamError + error = streamError as NSError } else { let errCode = InternalErrorCode.outputStreamWriteError.rawValue error = s.errorWithDetail("output stream error during write", code: errCode) From 81dfabbe153e4ad815e54f69901560b3620bceb4 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 8 Aug 2016 17:45:10 -0400 Subject: [PATCH 26/54] Remove old files --- Source/NSCharacterSet.swift | 31 ------------------------------- Source/String.swift | 31 ------------------------------- 2 files changed, 62 deletions(-) delete mode 100644 Source/NSCharacterSet.swift delete mode 100644 Source/String.swift diff --git a/Source/NSCharacterSet.swift b/Source/NSCharacterSet.swift deleted file mode 100644 index 5ebdbc5..0000000 --- a/Source/NSCharacterSet.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// NSCharacterSet.swift -// Socket.IO-Client-Swift -// -// Created by Yannick Loriot on 5/4/16. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Foundation - -extension CharacterSet { - static var allowedURLCharacterSet: CharacterSet { - return CharacterSet(charactersIn: "!*'();:@&=+$,/?%#[]\" {}").inverted - } -} diff --git a/Source/String.swift b/Source/String.swift deleted file mode 100644 index 398fc5f..0000000 --- a/Source/String.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// String.swift -// Socket.IO-Client-Swift -// -// Created by Yannick Loriot on 5/4/16. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Foundation - -extension String { - func urlEncode() -> String? { - return addingPercentEncoding(withAllowedCharacters: .allowedURLCharacterSet) - } -} From 64b9774c8302472e223c691a41e83260143582b7 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 13 Aug 2016 13:32:14 -0400 Subject: [PATCH 27/54] Move helper method --- SocketIO-MacTests/SocketSideEffectTest.swift | 2 +- Source/SocketAckEmitter.swift | 2 +- Source/SocketExtensions.swift | 7 +++++++ Source/SocketIOClient.swift | 9 ++------- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 8b5f611..4312415 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -140,7 +140,7 @@ class SocketSideEffectTest: XCTestCase { func testSocketDataToAnyObject() { let data = ["test", 1, 2.2, ["Hello": 2, "bob": 2.2], true, [1, 2], [1.1, 2]] as [SocketData] - XCTAssertEqual(data.count, socket.socketDataToAnyObject(data).count) + XCTAssertEqual(data.count, data.toAnyObjectArray().count) } func testHandleMultipleBinaryEvent() { diff --git a/Source/SocketAckEmitter.swift b/Source/SocketAckEmitter.swift index 901e9b1..409bcd9 100644 --- a/Source/SocketAckEmitter.swift +++ b/Source/SocketAckEmitter.swift @@ -36,7 +36,7 @@ public final class SocketAckEmitter : NSObject { public func with(_ items: SocketData...) { guard ackNum != -1 else { return } - socket.emitAck(ackNum, with: socket.socketDataToAnyObject(items)) + socket.emitAck(ackNum, with: items.toAnyObjectArray()) } public func with(_ items: [AnyObject]) { diff --git a/Source/SocketExtensions.swift b/Source/SocketExtensions.swift index 86b5f85..71e14d2 100644 --- a/Source/SocketExtensions.swift +++ b/Source/SocketExtensions.swift @@ -29,6 +29,13 @@ enum JSONError : Error { case notNSDictionary } +extension Array { + /// Because Swift 3 removes a lot of implicit briding so we have to perform more casts + func toAnyObjectArray() -> [AnyObject] { + return flatMap({$0 as? AnyObject}) + } +} + extension Array where Element: AnyObject { func toJSON() throws -> Data { return try JSONSerialization.data(withJSONObject: self as NSArray, options: JSONSerialization.WritingOptions(rawValue: 0)) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 60d42a7..4d9b645 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -214,7 +214,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Send a message to the server public func emit(_ event: String, _ items: SocketData...) { - emit(event, with: socketDataToAnyObject(items)) + emit(event, with: items.toAnyObjectArray()) } /// Same as emit, but meant for Objective-C @@ -230,7 +230,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add /// an ack. public func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback { - return emitWithAck(event, with: socketDataToAnyObject(items)) + return emitWithAck(event, with: items.toAnyObjectArray()) } /// Same as emitWithAck, but for Objective-C @@ -410,11 +410,6 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func removeAllHandlers() { handlers.removeAll(keepingCapacity: false) } - - /// Because Swift 3 removes a lot of implicit briding so we have to perform more casts - func socketDataToAnyObject(_ data: [SocketData]) -> [AnyObject] { - return data.flatMap({$0 as? AnyObject}) - } private func tryReconnect(reason: String) { guard reconnecting else { return } From d2cb8f2d9a5444d10d1d4e57e6055f40ae033ec7 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 14 Aug 2016 10:53:16 -0400 Subject: [PATCH 28/54] fix conflict --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index e5bfa51..5f375e9 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,7 @@ Socket.IO-client for iOS/OS X. ##Example ```swift -<<<<<<< HEAD -let socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080")!, options: [.log(true), .forcePolling(true)]) -======= -let socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080")!, config: [.Log(true), .ForcePolling(true)]) ->>>>>>> development +let socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080")!, config: [.log(true), .forcePolling(true)]) socket.on("connect") {data, ack in print("socket connected") From 3bf7a09f9890f4b3ede4e9f5d199b06566d53c12 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 15 Aug 2016 18:52:25 -0400 Subject: [PATCH 29/54] Swift 3 beta6. Doesn't work, something in websocket.swift is segfaulting the compiler --- Source/SSLSecurity.swift | 10 +++--- Source/SocketAckManager.swift | 2 +- Source/SocketEngine.swift | 2 +- Source/SocketEnginePollable.swift | 2 +- Source/SocketExtensions.swift | 2 +- Source/SocketIOClient.swift | 25 +++++++------- Source/SocketLogger.swift | 4 +-- Source/SocketPacket.swift | 12 +++---- Source/SocketParsable.swift | 5 ++- Source/SocketTypes.swift | 2 +- Source/WebSocket.swift | 54 +++++++++++++++---------------- 11 files changed, 58 insertions(+), 62 deletions(-) diff --git a/Source/SSLSecurity.swift b/Source/SSLSecurity.swift index 636c585..267f6e9 100644 --- a/Source/SSLSecurity.swift +++ b/Source/SSLSecurity.swift @@ -116,7 +116,7 @@ public class SSLSecurity : NSObject { } return certificates } - self.certificates = certificates + self.certificates = certificates as [NSData] self.isReady = true } } @@ -141,7 +141,7 @@ public class SSLSecurity : NSObject { } var policy: SecPolicy if self.validatedDN { - policy = SecPolicyCreateSSL(true, domain) + policy = SecPolicyCreateSSL(true, domain as CFString?) } else { policy = SecPolicyCreateBasicX509() } @@ -163,7 +163,7 @@ public class SSLSecurity : NSObject { for cert in certs { collect.append(SecCertificateCreateWithData(nil,cert)!) } - SecTrustSetAnchorCertificates(trust,collect) + SecTrustSetAnchorCertificates(trust,collect as CFArray) var result = SecTrustResultType(rawValue: 0)! SecTrustEvaluate(trust,&result) let r = Int(result.rawValue) @@ -171,7 +171,7 @@ public class SSLSecurity : NSObject { var trustedCount = 0 for serverCert in serverCerts { for cert in certs { - if cert == serverCert { + if cert as Data == serverCert { trustedCount += 1 break } @@ -193,7 +193,7 @@ public class SSLSecurity : NSObject { - returns: a public key */ func extractPublicKey(_ data: Data) -> SecKey? { - guard let cert = SecCertificateCreateWithData(nil, data) else { return nil } + guard let cert = SecCertificateCreateWithData(nil, data as CFData) else { return nil } return extractPublicKeyFromCert(cert, policy: SecPolicyCreateBasicX509()) } diff --git a/Source/SocketAckManager.swift b/Source/SocketAckManager.swift index d2d0dfc..c32dc04 100644 --- a/Source/SocketAckManager.swift +++ b/Source/SocketAckManager.swift @@ -67,6 +67,6 @@ struct SocketAckManager { mutating func timeoutAck(_ ack: Int, onQueue: DispatchQueue) { let ack = acks.remove(SocketAck(ack: ack)) - onQueue.async() { ack?.callback(["NO ACK"]) } + onQueue.async() { ack?.callback?(["NO ACK" as AnyObject]) } } } diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 5c7ce23..e84c20a 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -244,7 +244,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll } private func createWebsocketAndConnect() { - ws = WebSocket(url: urlWebSocketWithSid) + ws = WebSocket(url: urlWebSocketWithSid as NSURL) if cookies != nil { let headers = HTTPCookie.requestHeaderFields(with: cookies!) diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 155aab1..e0d02be 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -100,7 +100,7 @@ extension SocketEnginePollable { doLongPoll(for: req ) } - func doRequest(for req: URLRequest, callbackWith callback: (Data?, URLResponse?, Error?) -> Void) { + func doRequest(for req: URLRequest, callbackWith callback: @escaping (Data?, URLResponse?, Error?) -> Void) { if !polling || closed || invalidated || fastUpgrade { return } diff --git a/Source/SocketExtensions.swift b/Source/SocketExtensions.swift index 10de6ad..4a47074 100644 --- a/Source/SocketExtensions.swift +++ b/Source/SocketExtensions.swift @@ -100,7 +100,7 @@ extension NSDictionary { var options = [] as SocketIOClientConfiguration for (rawKey, value) in self { - if let key = rawKey as? String, let opt = NSDictionary.keyValueToSocketIOClientOption(key: key, value: value) { + if let key = rawKey as? String, let opt = NSDictionary.keyValueToSocketIOClientOption(key: key, value: value as AnyObject) { options.insert(opt) } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 4c918ac..156baee 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -242,7 +242,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable private func _emit(_ data: [AnyObject], ack: Int? = nil) { emitQueue.async { guard self.status == .connected else { - self.handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true) + self.handleEvent("error", data: ["Tried emitting when not connected" as AnyObject], isInternalMessage: true) return } @@ -259,7 +259,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable func emitAck(_ ack: Int, with items: [AnyObject]) { emitQueue.async { if self.status == .connected { - let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) + let packet = SocketPacket.packetFromEmit(items, id: ack, nsp: self.nsp, ack: true) let str = packet.packetString DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str) @@ -310,7 +310,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int = -1) { guard status == .connected || isInternalMessage else { return } - DefaultSocketLogger.Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "") + DefaultSocketLogger.Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data) handleQueue.async { self.anyHandler?(SocketAnyEvent(event: event, items: data)) @@ -385,7 +385,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Adds a handler that will be called on every event. - public func onAny(_ handler: (SocketAnyEvent) -> Void) { + public func onAny(_ handler: @escaping (SocketAnyEvent) -> Void) { anyHandler = handler } @@ -416,7 +416,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable guard reconnecting else { return } DefaultSocketLogger.Logger.log("Starting reconnect", type: logType) - handleEvent("reconnect", data: [reason], isInternalMessage: true) + handleEvent("reconnect", data: [reason as AnyObject], isInternalMessage: true) _tryReconnect() } @@ -439,23 +439,22 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DispatchQueue.main.asyncAfter(deadline: deadline, execute: _tryReconnect) } -} - -// Test extensions -extension SocketIOClient { + + // Test properties + var testHandlers: [SocketEventHandler] { return handlers } - + func setTestable() { status = .connected } - + func setTestEngine(_ engine: SocketEngineSpec?) { self.engine = engine } - + func emitTest(event: String, _ data: AnyObject...) { - _emit([event] + data) + _emit([event as AnyObject] + data) } } diff --git a/Source/SocketLogger.swift b/Source/SocketLogger.swift index 5db0902..640d344 100644 --- a/Source/SocketLogger.swift +++ b/Source/SocketLogger.swift @@ -47,8 +47,8 @@ public extension SocketLogger { private func abstractLog(_ logType: String, message: String, type: String, args: [Any]) { guard log else { return } - let newArgs = args.map({arg -> CVarArg in String(arg)}) - let messageFormat = String(format: message, arguments: newArgs) ?? "" + let newArgs = args.map({arg -> CVarArg in String(describing: arg)}) + let messageFormat = String(format: message, arguments: newArgs) NSLog("\(logType) \(type): %@", messageFormat) } diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index b98c695..aa333eb 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -51,11 +51,11 @@ struct SocketPacket { var description: String { return "SocketPacket {type: \(String(type.rawValue)); data: " + - "\(String(data)); id: \(id); placeholders: \(placeholders); nsp: \(nsp)}" + "\(String(describing: data)); id: \(id); placeholders: \(placeholders); nsp: \(nsp)}" } var event: String { - return String(data[0]) + return String(describing: data[0]) } var packetString: String { @@ -136,10 +136,10 @@ struct SocketPacket { switch object { case let dict as NSDictionary: if dict["_placeholder"] as? Bool ?? false { - return binary[dict["num"] as! Int] + return binary[dict["num"] as! Int] as AnyObject } else { return dict.reduce(NSMutableDictionary(), {cur, keyValue in - cur[keyValue.0 as! NSCopying] = _fillInPlaceholders(keyValue.1) + cur[keyValue.0 as! NSCopying] = _fillInPlaceholders(keyValue.1 as AnyObject) return cur }) } @@ -179,7 +179,7 @@ extension SocketPacket { private extension SocketPacket { // Recursive function that looks for NSData in collections static func shred(_ data: AnyObject, binary: inout [Data]) -> AnyObject { - let placeholder = ["_placeholder": true, "num": binary.count as AnyObject] + let placeholder = ["_placeholder": true, "num": binary.count as AnyObject] as [String : Any] switch data { case let bin as Data: @@ -189,7 +189,7 @@ private extension SocketPacket { return arr.map({shred($0, binary: &binary)}) as AnyObject case let dict as NSDictionary: return dict.reduce(NSMutableDictionary(), {cur, keyValue in - cur[keyValue.0 as! NSCopying] = shred(keyValue.1, binary: &binary) + cur[keyValue.0 as! NSCopying] = shred(keyValue.1 as AnyObject, binary: &binary) return cur }) default: diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index b051b16..bac3f20 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -85,7 +85,7 @@ extension SocketParsable { } if reader.currentCharacter == "/" { - namespace = reader.readUntilOccurence(of: ",") ?? reader.readUntilEnd() + namespace = reader.readUntilOccurence(of: ",") } if !reader.hasNext { @@ -160,8 +160,7 @@ extension SocketParsable { let packet = waitingPackets.removeLast() if packet.type != .binaryAck { - handleEvent(packet.event, data: packet.args ?? [], - isInternalMessage: false, withAck: packet.id) + handleEvent(packet.event, data: packet.args, isInternalMessage: false, withAck: packet.id) } else { handleAck(packet.id, data: packet.args) } diff --git a/Source/SocketTypes.swift b/Source/SocketTypes.swift index 6e569a8..b2f04e0 100644 --- a/Source/SocketTypes.swift +++ b/Source/SocketTypes.swift @@ -41,7 +41,7 @@ extension String : SocketData {} public typealias AckCallback = ([AnyObject]) -> Void public typealias NormalCallback = ([AnyObject], SocketAckEmitter) -> Void -public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void +public typealias OnAckCallback = (_ timeoutAfter: UInt64, _ callback: AckCallback) -> Void typealias Probe = (msg: String, type: SocketEnginePacketType, data: [Data]) typealias ProbeWaitQueue = [Probe] diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index c46e14e..8d6ee6a 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -142,7 +142,7 @@ public class WebSocket: NSObject, StreamDelegate { private var url: NSURL private var inputStream: InputStream? - private var outputStream: NSOutputStream? + private var outputStream: OutputStream? private var connected = false private var isConnecting = false private var writeQueue = OperationQueue() @@ -216,7 +216,7 @@ public class WebSocket: NSObject, StreamDelegate { */ public func writeString(_ str: String, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(data: str.data(using: String.Encoding.utf8)!, code: .textFrame, writeCompletion: completion) + dequeueWrite(data: str.data(using: String.Encoding.utf8)! as NSData, code: .textFrame, writeCompletion: completion) } /** @@ -229,7 +229,7 @@ public class WebSocket: NSObject, StreamDelegate { */ public func writeData(_ data: Data, completion: (() -> ())? = nil) { guard isConnected else { return } - dequeueWrite(data: data, code: .binaryFrame, writeCompletion: completion) + dequeueWrite(data: data as NSData, code: .binaryFrame, writeCompletion: completion) } // Write a ping to the websocket. This sends it as a control frame. @@ -242,7 +242,7 @@ public class WebSocket: NSObject, StreamDelegate { /// Private method that starts the connection. private func createHTTPRequest() { - let urlRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET", + let urlRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET" as CFString, url, kCFHTTPVersion1_1).takeRetainedValue() var port = url.port @@ -269,7 +269,7 @@ public class WebSocket: NSObject, StreamDelegate { } if let cfHTTPMessage = CFHTTPMessageCopySerializedMessage(urlRequest) { let serializedRequest = cfHTTPMessage.takeRetainedValue() - initStreamsWithData(data: serializedRequest as Data, Int(port!)) + initStreamsWithData(data: serializedRequest as NSData, Int(port!)) } } @@ -284,7 +284,7 @@ public class WebSocket: NSObject, StreamDelegate { let seed = 16 for _ in 0..(data.bytes) + let bytes = UnsafeRawPointer(data.bytes).assumingMemoryBound(to: UInt8.self) var out = timeout * 1000000 // wait 5 seconds before giving up writeQueue.addOperation { [weak self] in while !outStream.hasSpaceAvailable { @@ -368,24 +368,22 @@ public class WebSocket: NSObject, StreamDelegate { public func stream(aStream: Stream, handleEvent eventCode: Stream.Event) { if let sec = security , !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { - let possibleTrust: AnyObject? = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) - if let trust: AnyObject = possibleTrust { - let domain: AnyObject? = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) - if sec.isValid(trust as! SecTrust, domain: domain as! String?) { + let possibleTrust = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) as AnyObject + let domain = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) as? String + if sec.isValid(possibleTrust as! SecTrust, domain: domain) { certValidated = true } else { let error = errorWithDetail(detail: "Invalid SSL certificate", code: 1) disconnectStream(error: error) return } - } } if eventCode == .hasBytesAvailable { if aStream == inputStream { processInputStream() } } else if eventCode == .errorOccurred { - disconnectStream(error: aStream.streamError) + disconnectStream(error: aStream.streamError as NSError?) } else if eventCode == .endEncountered { disconnectStream(error: nil) } @@ -420,7 +418,7 @@ public class WebSocket: NSObject, StreamDelegate { /// Handles the incoming bytes and sending them to the proper processing method. private func processInputStream() { let buf = NSMutableData(capacity: BUFFER_MAX) - let buffer = UnsafeMutablePointer(buf!.bytes) + let buffer = UnsafeMutableRawPointer(mutating: buf!.bytes).assumingMemoryBound(to: UInt8.self) let length = inputStream!.read(buffer, maxLength: BUFFER_MAX) guard length > 0 else { return } @@ -445,7 +443,7 @@ public class WebSocket: NSObject, StreamDelegate { work = combine as Data self.fragBuffer = nil } - let buffer = UnsafePointer((work as NSData).bytes) + let buffer = UnsafeRawPointer((work as NSData).bytes).assumingMemoryBound(to: UInt8.self) let length = work.count if !connected { processTCPHandshake(buffer: buffer, bufferLen: length) @@ -635,10 +633,10 @@ public class WebSocket: NSObject, StreamDelegate { var dataLength = UInt64(payloadLen) if dataLength == 127 { dataLength = WebSocket.readUint64(buffer: baseAddress, offset: offset) - offset += sizeof(UInt64.self) + offset += MemoryLayout.size } else if dataLength == 126 { dataLength = UInt64(WebSocket.readUint16(buffer: baseAddress, offset: offset)) - offset += sizeof(UInt16.self) + offset += MemoryLayout.size } if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { fragBuffer = Data(bytes: baseAddress, count: bufferLen) @@ -776,10 +774,10 @@ public class WebSocket: NSObject, StreamDelegate { /// Write a an error to the socket. private func writeError(code: UInt16) { - let buf = NSMutableData(capacity: sizeof(UInt16.self)) - let buffer = UnsafeMutablePointer(buf!.bytes) + let buf = NSMutableData(capacity: MemoryLayout.size) + let buffer = UnsafeMutableRawPointer(mutating: buf!.bytes).assumingMemoryBound(to: UInt8.self) WebSocket.writeUint16(buffer: buffer, offset: 0, value: code) - dequeueWrite(data: Data(bytes: buffer, count: sizeof(UInt16.self)), code: .connectionClose) + dequeueWrite(data: Data(bytes: buffer, count: MemoryLayout.size) as NSData, code: .connectionClose) } /// Used to write things to the stream. @@ -788,35 +786,35 @@ public class WebSocket: NSObject, StreamDelegate { //stream isn't ready, let's wait guard let s = self else { return } var offset = 2 - let bytes = UnsafeMutablePointer((data as NSData).bytes) + let bytes = UnsafeMutableRawPointer(mutating: (data as NSData).bytes).assumingMemoryBound(to: UInt8.self) let dataLength = data.length let frame = NSMutableData(capacity: dataLength + s.MaxFrameSize) - let buffer = UnsafeMutablePointer(frame!.mutableBytes) + let buffer = UnsafeMutableRawPointer(frame!.mutableBytes).assumingMemoryBound(to: UInt8.self) buffer[0] = s.FinMask | code.rawValue if dataLength < 126 { buffer[1] = CUnsignedChar(dataLength) } else if dataLength <= Int(UInt16.max) { buffer[1] = 126 WebSocket.writeUint16(buffer: buffer, offset: offset, value: UInt16(dataLength)) - offset += sizeof(UInt16.self) + offset += MemoryLayout.size } else { buffer[1] = 127 WebSocket.writeUint64(buffer: buffer, offset: offset, value: UInt64(dataLength)) - offset += sizeof(UInt64.self) + offset += MemoryLayout.size } buffer[1] |= s.MaskMask let maskKey = UnsafeMutablePointer(buffer + offset) - _ = SecRandomCopyBytes(kSecRandomDefault, Int(sizeof(UInt32.self)), maskKey) - offset += sizeof(UInt32.self) + _ = SecRandomCopyBytes(kSecRandomDefault, Int(MemoryLayout.size), maskKey) + offset += MemoryLayout.size for i in 0...size] offset += 1 } var total = 0 while true { guard let outStream = s.outputStream else { break } - let writeBuffer = UnsafePointer(frame!.bytes+total) + let writeBuffer = UnsafeRawPointer(frame!.bytes+total).assumingMemoryBound(to: UInt8.self) let len = outStream.write(writeBuffer, maxLength: offset-total) if len < 0 { var error: NSError? From 0233f383bb21082454bc1164f0ebfaedd9d94cd0 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 15 Aug 2016 19:24:10 -0400 Subject: [PATCH 30/54] Fix tests, this is broken for obvious reasons --- SocketIO-MacTests/SocketAckManagerTest.swift | 2 +- SocketIO-MacTests/SocketBasicPacketTest.swift | 54 +++---- SocketIO-MacTests/SocketEngineTest.swift | 4 +- .../SocketNamespacePacketTest.swift | 49 +++---- SocketIO-MacTests/SocketParserTest.swift | 18 +-- SocketIO-MacTests/SocketSideEffectTest.swift | 16 +-- Source/WebSocket.swift | 132 +++++++++--------- 7 files changed, 139 insertions(+), 136 deletions(-) diff --git a/SocketIO-MacTests/SocketAckManagerTest.swift b/SocketIO-MacTests/SocketAckManagerTest.swift index 490c51f..dd3094d 100644 --- a/SocketIO-MacTests/SocketAckManagerTest.swift +++ b/SocketIO-MacTests/SocketAckManagerTest.swift @@ -19,7 +19,7 @@ class SocketAckManagerTest: XCTestCase { callbackExpection.fulfill() } ackManager.addAck(1, callback: callback) - ackManager.executeAck(1, with: itemsArray, onQueue: DispatchQueue.main) + ackManager.executeAck(1, with: itemsArray as [AnyObject], onQueue: DispatchQueue.main) waitForExpectations(timeout: 3.0, handler: nil) } diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index 7526fe7..d22116a 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -16,15 +16,15 @@ class SocketBasicPacketTest: XCTestCase { func testEmpyEmit() { let expectedSendString = "2[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testNullEmit() { let expectedSendString = "2[\"test\",null]" - let sendData = ["test", NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let sendData = ["test", NSNull()] as [Any] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -32,7 +32,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmit() { let expectedSendString = "2[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -40,30 +40,30 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmitWithQuotes() { let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]" let sendData = ["test", "\"he\"llo world\""] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testJSONEmit() { - let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" - let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" + let sendData = ["test" as AnyObject, ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] as [AnyObject] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testArrayEmit() { let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" - let sendData = ["test", ["hello", 1, ["test": "test"]]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let sendData = ["test", ["hello", 1, ["test": "test"]]] as [Any] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testBinaryEmit() { - let expectedSendString = "51-[\"test\",{\"_placeholder\":true,\"num\":0}]" - let sendData = ["test", data] + let expectedSendString = "51-[\"test\",{\"_placeholder\":1,\"num\":0}]" + let sendData = ["test", data] as [Any] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) @@ -71,9 +71,9 @@ class SocketBasicPacketTest: XCTestCase { } func testMultipleBinaryEmit() { - let expectedSendString = "52-[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" - let sendData = ["test", ["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let expectedSendString = "52-[\"test\",{\"data1\":{\"_placeholder\":1,\"num\":0},\"data2\":{\"_placeholder\":1,\"num\":1}}]" + let sendData = ["test" as AnyObject, ["data1": data, "data2": data2] as NSDictionary] as [AnyObject] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -82,14 +82,16 @@ class SocketBasicPacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "20[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: false) - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(packet.packetString, + + expectedSendString) } func testEmitDataWithAck() { - let expectedSendString = "51-0[\"test\",{\"_placeholder\":true,\"num\":0}]" - let sendData = ["test", data] + let expectedSendString = "51-0[\"test\",{\"_placeholder\":1,\"num\":0}]" + let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) @@ -115,32 +117,32 @@ class SocketBasicPacketTest: XCTestCase { func testStringAck() { let expectedSendString = "30[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } func testJSONAck() { - let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" + let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } func testBinaryAck() { - let expectedSendString = "61-0[{\"_placeholder\":true,\"num\":0}]" + let expectedSendString = "61-0[{\"_placeholder\":1,\"num\":0}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) } func testMultipleBinaryAck() { - let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" + let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":1,\"num\":0},\"data1\":{\"_placeholder\":1,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 4c54833..1880fd4 100644 --- a/SocketIO-MacTests/SocketEngineTest.swift +++ b/SocketIO-MacTests/SocketEngineTest.swift @@ -89,14 +89,14 @@ class SocketEngineTest: XCTestCase { func testEncodeURLProperly() { engine.connectParams = [ - "created": "2016-05-04T18:31:15+0200" + "created": "2016-05-04T18:31:15+0200" as AnyObject ] XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&created=2016-05-04T18%3A31%3A15%2B0200") XCTAssertEqual(engine.urlWebSocket.query, "transport=websocket&created=2016-05-04T18%3A31%3A15%2B0200") engine.connectParams = [ - "forbidden": "!*'();:@&=+$,/?%#[]\" {}" + "forbidden": "!*'();:@&=+$,/?%#[]\" {}" as AnyObject ] XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D") diff --git a/SocketIO-MacTests/SocketNamespacePacketTest.swift b/SocketIO-MacTests/SocketNamespacePacketTest.swift index 9cbb909..e1144a1 100644 --- a/SocketIO-MacTests/SocketNamespacePacketTest.swift +++ b/SocketIO-MacTests/SocketNamespacePacketTest.swift @@ -16,15 +16,15 @@ class SocketNamespacePacketTest: XCTestCase { func testEmpyEmit() { let expectedSendString = "2/swift,[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testNullEmit() { let expectedSendString = "2/swift,[\"test\",null]" - let sendData = ["test", NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let sendData = ["test", NSNull()] as [Any] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -32,30 +32,31 @@ class SocketNamespacePacketTest: XCTestCase { func testStringEmit() { let expectedSendString = "2/swift,[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testJSONEmit() { - let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" - let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" + let sendData = ["test" as AnyObject, ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] as [AnyObject] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testArrayEmit() { let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" - let sendData = ["test", ["hello", 1, ["test": "test"]]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let sendData = ["test", ["hello", 1, ["test": "test"]]] as [Any] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + XCTAssertEqual(packet.packetString, expectedSendString) } func testBinaryEmit() { - let expectedSendString = "51-/swift,[\"test\",{\"_placeholder\":true,\"num\":0}]" - let sendData = ["test", data] + let expectedSendString = "51-/swift,[\"test\",{\"_placeholder\":1,\"num\":0}]" + let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) @@ -63,9 +64,9 @@ class SocketNamespacePacketTest: XCTestCase { } func testMultipleBinaryEmit() { - let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" - let sendData = ["test", ["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) + let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"_placeholder\":1,\"num\":0},\"data2\":{\"_placeholder\":1,\"num\":1}}]" + let sendData = ["test" as AnyObject, ["data1": data, "data2": data2] as NSDictionary] as [AnyObject] + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -74,14 +75,14 @@ class SocketNamespacePacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "2/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testEmitDataWithAck() { - let expectedSendString = "51-/swift,0[\"test\",{\"_placeholder\":true,\"num\":0}]" - let sendData = ["test", data] + let expectedSendString = "51-/swift,0[\"test\",{\"_placeholder\":1,\"num\":0}]" + let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) @@ -107,32 +108,32 @@ class SocketNamespacePacketTest: XCTestCase { func testStringAck() { let expectedSendString = "3/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } func testJSONAck() { - let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" + let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } func testBinaryAck() { - let expectedSendString = "61-/swift,0[{\"_placeholder\":true,\"num\":0}]" + let expectedSendString = "61-/swift,0[{\"_placeholder\":1,\"num\":0}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) } func testMultipleBinaryAck() { - let expectedSendString = "62-/swift,0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" + let expectedSendString = "62-/swift,0[{\"data2\":{\"_placeholder\":1,\"num\":0},\"data1\":{\"_placeholder\":1,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index cb1e8d0..841057a 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -15,19 +15,19 @@ class SocketParserTest: XCTestCase { //Format key: message; namespace-data-binary-id static let packetTypes: [String: (String, [AnyObject], [Data], Int)] = [ "0": ("/", [], [], -1), "1": ("/", [], [], -1), - "25[\"test\"]": ("/", ["test"], [], 5), - "2[\"test\",\"~~0\"]": ("/", ["test", "~~0"], [], -1), - "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn", ["test3", "test4"]], [], -1), - "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", ["_placeholder": true, "num": 0]], [], -1), - "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), + "25[\"test\"]": ("/", ["test" as AnyObject], [], 5), + "2[\"test\",\"~~0\"]": ("/", ["test" as AnyObject, "~~0" as AnyObject], [], -1), + "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn" as AnyObject, ["test3" as AnyObject, "test4" as AnyObject] as NSArray], [], -1), + "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn" as AnyObject, [1, 2] as NSArray, ["test": "bob"] as NSDictionary, 25 as AnyObject, "polo" as AnyObject, ["_placeholder": true, "num": 0] as NSDictionary], [], -1), + "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"] as NSArray], [], 0), "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": - ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", ["_placeholder": true, "num": 0]], [], 19), + ("/swift", [ [1, 2] as NSArray, ["test": "bob"] as NSDictionary, 25 as AnyObject, "polo" as AnyObject, ["_placeholder": true, "num": 0] as NSDictionary], [], 19), "4/swift,": ("/swift", [], [], -1), "0/swift": ("/swift", [], [], -1), "1/swift": ("/swift", [], [], -1), - "4\"ERROR\"": ("/", ["ERROR"], [], -1), - "4{\"test\":2}": ("/", [["test": 2]], [], -1), - "41": ("/", [1], [], -1)] + "4\"ERROR\"": ("/", ["ERROR" as AnyObject], [], -1), + "4{\"test\":2}": ("/", [["test": 2] as NSDictionary], [], -1), + "41": ("/", [1 as AnyObject], [], -1)] func testDisconnect() { let message = "1" diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 4312415..dae9333 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -25,20 +25,20 @@ class SocketSideEffectTest: XCTestCase { } func testFirstAck() { - socket.emitWithAck("test")(timeoutAfter: 0) {data in} + socket.emitWithAck("test")(0) {data in} XCTAssertEqual(socket.currentAck, 0) } func testSecondAck() { - socket.emitWithAck("test")(timeoutAfter: 0) {data in} - socket.emitWithAck("test")(timeoutAfter: 0) {data in} + socket.emitWithAck("test")(0) {data in} + socket.emitWithAck("test")(0) {data in} XCTAssertEqual(socket.currentAck, 1) } func testHandleAck() { let expect = expectation(description: "handled ack") - socket.emitWithAck("test")(timeoutAfter: 0) {data in + socket.emitWithAck("test")(0) {data in XCTAssertEqual(data[0] as? String, "hello world") expect.fulfill() } @@ -49,7 +49,7 @@ class SocketSideEffectTest: XCTestCase { func testHandleAck2() { let expect = expectation(description: "handled ack2") - socket.emitWithAck("test")(timeoutAfter: 0) {data in + socket.emitWithAck("test")(0) {data in XCTAssertTrue(data.count == 2, "Wrong number of ack items") expect.fulfill() } @@ -127,7 +127,7 @@ class SocketSideEffectTest: XCTestCase { let expect = expectation(description: "handled binary event") socket.on("test") {data, ack in if let dict = data[0] as? NSDictionary, let data = dict["test"] as? NSData { - XCTAssertEqual(data, self.data) + XCTAssertEqual(data as Data, self.data) expect.fulfill() } } @@ -148,8 +148,8 @@ class SocketSideEffectTest: XCTestCase { socket.on("test") {data, ack in if let dict = data[0] as? NSDictionary, let data = dict["test"] as? NSData, let data2 = dict["test2"] as? NSData { - XCTAssertEqual(data, self.data) - XCTAssertEqual(data2, self.data2) + XCTAssertEqual(data as Data, self.data) + XCTAssertEqual(data2 as Data, self.data2) expect.fulfill() } } diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index 8d6ee6a..52ab6dc 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -296,72 +296,72 @@ public class WebSocket: NSObject, StreamDelegate { //higher level API we will cut over to at some point //NSStream.getStreamsToHostWithName(url.host, port: url.port.integerValue, inputStream: &inputStream, outputStream: &outputStream) - var readStream: Unmanaged? - var writeStream: Unmanaged? - let h = url.host! - CFStreamCreatePairWithSocketToHost(nil, h as NSString, UInt32(port), &readStream, &writeStream) - inputStream = readStream!.takeRetainedValue() - outputStream = writeStream!.takeRetainedValue() - guard let inStream = inputStream, let outStream = outputStream else { return } - inStream.delegate = self - outStream.delegate = self - if supportedSSLSchemes.contains(url.scheme!) { - inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) - outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) - } else { - certValidated = true //not a https session, so no need to check SSL pinning - } - if voipEnabled { - inStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) - outStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) - } - if selfSignedSSL { - let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull] - inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) - outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) - } - if let cipherSuites = self.enabledSSLCipherSuites { - if let sslContextIn = CFReadStreamCopyProperty(inputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext?, - let sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { - let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) - let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) - if resIn != errSecSuccess { - let error = self.errorWithDetail(detail: "Error setting ingoing cypher suites", code: UInt16(resIn)) - disconnectStream(error: error) - return - } - if resOut != errSecSuccess { - let error = self.errorWithDetail(detail: "Error setting outgoing cypher suites", code: UInt16(resOut)) - disconnectStream(error: error) - return - } - } - } - CFReadStreamSetDispatchQueue(inStream, WebSocket.sharedWorkQueue) - CFWriteStreamSetDispatchQueue(outStream, WebSocket.sharedWorkQueue) - inStream.open() - outStream.open() - - self.mutex.lock() - self.readyToWrite = true - self.mutex.unlock() - - let bytes = UnsafeRawPointer(data.bytes).assumingMemoryBound(to: UInt8.self) - var out = timeout * 1000000 // wait 5 seconds before giving up - writeQueue.addOperation { [weak self] in - while !outStream.hasSpaceAvailable { - usleep(100) // wait until the socket is ready - out -= 100 - if out < 0 { - self?.cleanupStream() - self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2)) - return - } else if outStream.streamError != nil { - return // disconnectStream will be called. - } - } - outStream.write(bytes, maxLength: data.length) - } +// var readStream: Unmanaged? +// var writeStream: Unmanaged? +// let h = url.host! +// CFStreamCreatePairWithSocketToHost(nil, h as NSString, UInt32(port), &readStream, &writeStream) +// inputStream = readStream!.takeRetainedValue() +// outputStream = writeStream!.takeRetainedValue() +// guard let inStream = inputStream, let outStream = outputStream else { return } +// inStream.delegate = self +// outStream.delegate = self +// if supportedSSLSchemes.contains(url.scheme!) { +// inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) +// outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) +// } else { +// certValidated = true //not a https session, so no need to check SSL pinning +// } +// if voipEnabled { +// inStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) +// outStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) +// } +// if selfSignedSSL { +// let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull] +// inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) +// outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) +// } +// if let cipherSuites = self.enabledSSLCipherSuites { +// if let sslContextIn = CFReadStreamCopyProperty(inputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext?, +// let sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { +// let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) +// let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) +// if resIn != errSecSuccess { +// let error = self.errorWithDetail(detail: "Error setting ingoing cypher suites", code: UInt16(resIn)) +// disconnectStream(error: error) +// return +// } +// if resOut != errSecSuccess { +// let error = self.errorWithDetail(detail: "Error setting outgoing cypher suites", code: UInt16(resOut)) +// disconnectStream(error: error) +// return +// } +// } +// } +// CFReadStreamSetDispatchQueue(inStream, WebSocket.sharedWorkQueue) +// CFWriteStreamSetDispatchQueue(outStream, WebSocket.sharedWorkQueue) +// inStream.open() +// outStream.open() +// +// self.mutex.lock() +// self.readyToWrite = true +// self.mutex.unlock() +// +// let bytes = UnsafeRawPointer(data.bytes).assumingMemoryBound(to: UInt8.self) +// var out = timeout * 1000000 // wait 5 seconds before giving up +// writeQueue.addOperation { [weak self] in +// while !outStream.hasSpaceAvailable { +// usleep(100) // wait until the socket is ready +// out -= 100 +// if out < 0 { +// self?.cleanupStream() +// self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2)) +// return +// } else if outStream.streamError != nil { +// return // disconnectStream will be called. +// } +// } +// outStream.write(bytes, maxLength: data.length) +// } } // Delegate for the stream methods. Processes incoming bytes. From 9acae3b15428ed4b2679a1a3cf170631720ce1c5 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 18 Aug 2016 19:09:26 -0400 Subject: [PATCH 31/54] I'm not convinced this is right --- SocketIO-MacTests/SocketBasicPacketTest.swift | 14 +++++++------- .../SocketNamespacePacketTest.swift | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index d22116a..b533d6a 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -46,7 +46,7 @@ class SocketBasicPacketTest: XCTestCase { } func testJSONEmit() { - let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" + let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = ["test" as AnyObject, ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) @@ -62,7 +62,7 @@ class SocketBasicPacketTest: XCTestCase { } func testBinaryEmit() { - let expectedSendString = "51-[\"test\",{\"_placeholder\":1,\"num\":0}]" + let expectedSendString = "51-[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test", data] as [Any] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) @@ -71,7 +71,7 @@ class SocketBasicPacketTest: XCTestCase { } func testMultipleBinaryEmit() { - let expectedSendString = "52-[\"test\",{\"data1\":{\"_placeholder\":1,\"num\":0},\"data2\":{\"_placeholder\":1,\"num\":1}}]" + let expectedSendString = "52-[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" let sendData = ["test" as AnyObject, ["data1": data, "data2": data2] as NSDictionary] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) @@ -90,7 +90,7 @@ class SocketBasicPacketTest: XCTestCase { } func testEmitDataWithAck() { - let expectedSendString = "51-0[\"test\",{\"_placeholder\":1,\"num\":0}]" + let expectedSendString = "51-0[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: false) @@ -123,7 +123,7 @@ class SocketBasicPacketTest: XCTestCase { } func testJSONAck() { - let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" + let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) @@ -131,7 +131,7 @@ class SocketBasicPacketTest: XCTestCase { } func testBinaryAck() { - let expectedSendString = "61-0[{\"_placeholder\":1,\"num\":0}]" + let expectedSendString = "61-0[{\"_placeholder\":true,\"num\":0}]" let sendData = [data] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) @@ -140,7 +140,7 @@ class SocketBasicPacketTest: XCTestCase { } func testMultipleBinaryAck() { - let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":1,\"num\":0},\"data1\":{\"_placeholder\":1,\"num\":1}}]" + let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) diff --git a/SocketIO-MacTests/SocketNamespacePacketTest.swift b/SocketIO-MacTests/SocketNamespacePacketTest.swift index e1144a1..435e9e3 100644 --- a/SocketIO-MacTests/SocketNamespacePacketTest.swift +++ b/SocketIO-MacTests/SocketNamespacePacketTest.swift @@ -38,7 +38,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testJSONEmit() { - let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" + let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = ["test" as AnyObject, ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) @@ -46,7 +46,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testArrayEmit() { - let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" + let expectedSendString = "2/swift,[\"test\",[\"hello\",true,{\"test\":\"test\"}]]" let sendData = ["test", ["hello", 1, ["test": "test"]]] as [Any] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) @@ -55,7 +55,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testBinaryEmit() { - let expectedSendString = "51-/swift,[\"test\",{\"_placeholder\":1,\"num\":0}]" + let expectedSendString = "51-/swift,[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) @@ -64,7 +64,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testMultipleBinaryEmit() { - let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"_placeholder\":1,\"num\":0},\"data2\":{\"_placeholder\":1,\"num\":1}}]" + let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" let sendData = ["test" as AnyObject, ["data1": data, "data2": data2] as NSDictionary] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) @@ -81,7 +81,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testEmitDataWithAck() { - let expectedSendString = "51-/swift,0[\"test\",{\"_placeholder\":1,\"num\":0}]" + let expectedSendString = "51-/swift,0[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: false) @@ -114,7 +114,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testJSONAck() { - let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" + let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) @@ -122,7 +122,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testBinaryAck() { - let expectedSendString = "61-/swift,0[{\"_placeholder\":1,\"num\":0}]" + let expectedSendString = "61-/swift,0[{\"_placeholder\":true,\"num\":0}]" let sendData = [data] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) @@ -131,7 +131,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testMultipleBinaryAck() { - let expectedSendString = "62-/swift,0[{\"data2\":{\"_placeholder\":1,\"num\":0},\"data1\":{\"_placeholder\":1,\"num\":1}}]" + let expectedSendString = "62-/swift,0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) From 1232c34817eb1eed0a94862bd0846ffa73bf8115 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 18 Aug 2016 19:22:19 -0400 Subject: [PATCH 32/54] narrow down what's causing compiler crashes --- Source/WebSocket.swift | 128 ++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index 52ab6dc..a0181a6 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -296,72 +296,72 @@ public class WebSocket: NSObject, StreamDelegate { //higher level API we will cut over to at some point //NSStream.getStreamsToHostWithName(url.host, port: url.port.integerValue, inputStream: &inputStream, outputStream: &outputStream) -// var readStream: Unmanaged? -// var writeStream: Unmanaged? -// let h = url.host! -// CFStreamCreatePairWithSocketToHost(nil, h as NSString, UInt32(port), &readStream, &writeStream) -// inputStream = readStream!.takeRetainedValue() -// outputStream = writeStream!.takeRetainedValue() -// guard let inStream = inputStream, let outStream = outputStream else { return } -// inStream.delegate = self -// outStream.delegate = self -// if supportedSSLSchemes.contains(url.scheme!) { + var readStream: Unmanaged? + var writeStream: Unmanaged? + let h = url.host! + CFStreamCreatePairWithSocketToHost(nil, h as NSString, UInt32(port), &readStream, &writeStream) + inputStream = readStream!.takeRetainedValue() + outputStream = writeStream!.takeRetainedValue() + guard let inStream = inputStream, let outStream = outputStream else { return } + inStream.delegate = self + outStream.delegate = self + if supportedSSLSchemes.contains(url.scheme!) { // inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) // outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) -// } else { -// certValidated = true //not a https session, so no need to check SSL pinning -// } -// if voipEnabled { -// inStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) -// outStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) -// } -// if selfSignedSSL { -// let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull] -// inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) -// outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) -// } -// if let cipherSuites = self.enabledSSLCipherSuites { -// if let sslContextIn = CFReadStreamCopyProperty(inputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext?, -// let sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { -// let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) -// let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) -// if resIn != errSecSuccess { -// let error = self.errorWithDetail(detail: "Error setting ingoing cypher suites", code: UInt16(resIn)) -// disconnectStream(error: error) -// return -// } -// if resOut != errSecSuccess { -// let error = self.errorWithDetail(detail: "Error setting outgoing cypher suites", code: UInt16(resOut)) -// disconnectStream(error: error) -// return -// } -// } -// } -// CFReadStreamSetDispatchQueue(inStream, WebSocket.sharedWorkQueue) -// CFWriteStreamSetDispatchQueue(outStream, WebSocket.sharedWorkQueue) -// inStream.open() -// outStream.open() -// -// self.mutex.lock() -// self.readyToWrite = true -// self.mutex.unlock() -// -// let bytes = UnsafeRawPointer(data.bytes).assumingMemoryBound(to: UInt8.self) -// var out = timeout * 1000000 // wait 5 seconds before giving up -// writeQueue.addOperation { [weak self] in -// while !outStream.hasSpaceAvailable { -// usleep(100) // wait until the socket is ready -// out -= 100 -// if out < 0 { -// self?.cleanupStream() -// self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2)) -// return -// } else if outStream.streamError != nil { -// return // disconnectStream will be called. -// } -// } -// outStream.write(bytes, maxLength: data.length) -// } + } else { + certValidated = true //not a https session, so no need to check SSL pinning + } + if voipEnabled { + inStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) + outStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) + } + if selfSignedSSL { + let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull] + inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) + outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey) + } + if let cipherSuites = self.enabledSSLCipherSuites { + if let sslContextIn = CFReadStreamCopyProperty(inputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext?, + let sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { + let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) + let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) + if resIn != errSecSuccess { + let error = self.errorWithDetail(detail: "Error setting ingoing cypher suites", code: UInt16(resIn)) + disconnectStream(error: error) + return + } + if resOut != errSecSuccess { + let error = self.errorWithDetail(detail: "Error setting outgoing cypher suites", code: UInt16(resOut)) + disconnectStream(error: error) + return + } + } + } + CFReadStreamSetDispatchQueue(inStream, WebSocket.sharedWorkQueue) + CFWriteStreamSetDispatchQueue(outStream, WebSocket.sharedWorkQueue) + inStream.open() + outStream.open() + + self.mutex.lock() + self.readyToWrite = true + self.mutex.unlock() + + let bytes = UnsafeRawPointer(data.bytes).assumingMemoryBound(to: UInt8.self) + var out = timeout * 1000000 // wait 5 seconds before giving up + writeQueue.addOperation { [weak self] in + while !outStream.hasSpaceAvailable { + usleep(100) // wait until the socket is ready + out -= 100 + if out < 0 { + self?.cleanupStream() + self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2)) + return + } else if outStream.streamError != nil { + return // disconnectStream will be called. + } + } + outStream.write(bytes, maxLength: data.length) + } } // Delegate for the stream methods. Processes incoming bytes. From 70b870690efbe4d83c6862bee28db3b4c7f3dfe6 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 20 Aug 2016 15:30:07 -0400 Subject: [PATCH 33/54] Fix websocket --- Source/WebSocket.swift | 98 ++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 52 deletions(-) diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index a0181a6..c4d5315 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -38,9 +38,9 @@ public protocol WebSocketPongDelegate: class { func websocketDidReceivePong(_ socket: WebSocket) } -public class WebSocket: NSObject, StreamDelegate { +public class WebSocket : NSObject, StreamDelegate { - enum OpCode: UInt8 { + enum OpCode : UInt8 { case continueFrame = 0x0 case textFrame = 0x1 case binaryFrame = 0x2 @@ -51,7 +51,7 @@ public class WebSocket: NSObject, StreamDelegate { // B-F reserved. } - public enum CloseCode: UInt16 { + public enum CloseCode : UInt16 { case normal = 1000 case goingAway = 1001 case protocolError = 1002 @@ -66,7 +66,7 @@ public class WebSocket: NSObject, StreamDelegate { public static let ErrorDomain = "WebSocket" - enum InternalErrorCode: UInt16 { + enum InternalErrorCode : UInt16 { // 0-999 WebSocket status codes not used case outputStreamWriteError = 1 } @@ -135,7 +135,7 @@ public class WebSocket: NSObject, StreamDelegate { public var isConnected :Bool { return connected } - + public var currentURL: NSURL { return url } // MARK: - Private @@ -190,7 +190,7 @@ public class WebSocket: NSObject, StreamDelegate { - Parameter forceTimeout: Maximum time to wait for the server to close the socket. */ - public func disconnect(_ forceTimeout: TimeInterval? = nil) { + public func disconnect(forceTimeout: TimeInterval? = nil) { switch forceTimeout { case .some(let seconds) where seconds > 0: callbackQueue.asyncAfter(deadline: DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) { [weak self] in @@ -253,19 +253,19 @@ public class WebSocket: NSObject, StreamDelegate { port = 80 } } - addHeader(urlRequest: urlRequest, key: headerWSUpgradeName as NSString, val: headerWSUpgradeValue as NSString) - addHeader(urlRequest: urlRequest, key: headerWSConnectionName as NSString, val: headerWSConnectionValue as NSString) + addHeader(urlRequest, key: headerWSUpgradeName as NSString, val: headerWSUpgradeValue as NSString) + addHeader(urlRequest, key: headerWSConnectionName as NSString, val: headerWSConnectionValue as NSString) if let protocols = optionalProtocols { - addHeader(urlRequest: urlRequest, key: headerWSProtocolName as NSString, val: protocols.joined(separator: ",") as NSString) + addHeader(urlRequest, key: headerWSProtocolName as NSString, val: protocols.joined(separator: ",") as NSString) } - addHeader(urlRequest: urlRequest, key: headerWSVersionName as NSString, val: headerWSVersionValue as NSString) - addHeader(urlRequest: urlRequest, key: headerWSKeyName as NSString, val: generateWebSocketKey() as NSString) + addHeader(urlRequest, key: headerWSVersionName as NSString, val: headerWSVersionValue as NSString) + addHeader(urlRequest, key: headerWSKeyName as NSString, val: generateWebSocketKey() as NSString) if let origin = origin { - addHeader(urlRequest: urlRequest, key: headerOriginName as NSString, val: origin as NSString) + addHeader(urlRequest, key: headerOriginName as NSString, val: origin as NSString) } - addHeader(urlRequest: urlRequest, key: headerWSHostName as NSString, val: "\(url.host!):\(port!)" as NSString) + addHeader(urlRequest, key: headerWSHostName as NSString, val: "\(url.host!):\(port!)" as NSString) for (key,value) in headers { - addHeader(urlRequest: urlRequest, key: key as NSString, val: value as NSString) + addHeader(urlRequest, key: key as NSString, val: value as NSString) } if let cfHTTPMessage = CFHTTPMessageCopySerializedMessage(urlRequest) { let serializedRequest = cfHTTPMessage.takeRetainedValue() @@ -274,7 +274,7 @@ public class WebSocket: NSObject, StreamDelegate { } /// Add a header to the CFHTTPMessage by using the NSString bridges to CFString. - private func addHeader(urlRequest: CFHTTPMessage, key: NSString, val: NSString) { + private func addHeader(_ urlRequest: CFHTTPMessage, key: NSString, val: NSString) { CFHTTPMessageSetHeaderFieldValue(urlRequest, key, val) } @@ -306,8 +306,8 @@ public class WebSocket: NSObject, StreamDelegate { inStream.delegate = self outStream.delegate = self if supportedSSLSchemes.contains(url.scheme!) { -// inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) -// outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) + // inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) + // outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) } else { certValidated = true //not a https session, so no need to check SSL pinning } @@ -326,12 +326,12 @@ public class WebSocket: NSObject, StreamDelegate { let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) if resIn != errSecSuccess { - let error = self.errorWithDetail(detail: "Error setting ingoing cypher suites", code: UInt16(resIn)) + let error = self.errorWithDetail("Error setting ingoing cypher suites", code: UInt16(resIn)) disconnectStream(error: error) return } if resOut != errSecSuccess { - let error = self.errorWithDetail(detail: "Error setting outgoing cypher suites", code: UInt16(resOut)) + let error = self.errorWithDetail("Error setting outgoing cypher suites", code: UInt16(resOut)) disconnectStream(error: error) return } @@ -354,7 +354,7 @@ public class WebSocket: NSObject, StreamDelegate { out -= 100 if out < 0 { self?.cleanupStream() - self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2)) + self?.doDisconnect(error: self?.errorWithDetail("write wait timed out", code: 2)) return } else if outStream.streamError != nil { return // disconnectStream will be called. @@ -365,18 +365,17 @@ public class WebSocket: NSObject, StreamDelegate { } // Delegate for the stream methods. Processes incoming bytes. - public func stream(aStream: Stream, handleEvent eventCode: Stream.Event) { - + public func stream(_ aStream: Stream, handle eventCode: Stream.Event) { if let sec = security , !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { let possibleTrust = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) as AnyObject - let domain = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) as? String - if sec.isValid(possibleTrust as! SecTrust, domain: domain) { - certValidated = true - } else { - let error = errorWithDetail(detail: "Invalid SSL certificate", code: 1) - disconnectStream(error: error) - return - } + let domain = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) as? String + if sec.isValid(possibleTrust as! SecTrust, domain: domain) { + certValidated = true + } else { + let error = errorWithDetail("Invalid SSL certificate", code: 1) + disconnectStream(error: error) + return + } } if eventCode == .hasBytesAvailable { if aStream == inputStream { @@ -426,7 +425,7 @@ public class WebSocket: NSObject, StreamDelegate { if inputQueue.count == 0 { process = true } - inputQueue.append(Data(bytes: UnsafePointer(buffer), count: length)) + inputQueue.append(Data(bytes: UnsafeRawPointer(buffer).assumingMemoryBound(to: UInt8.self), count: length)) if process { dequeueInput() } @@ -471,7 +470,7 @@ public class WebSocket: NSObject, StreamDelegate { fragBuffer = NSData(bytes: buffer, length: bufferLen) as Data break // do nothing, we are going to collect more data default: - doDisconnect(error: errorWithDetail(detail: "Invalid HTTP upgrade", code: UInt16(code))) + doDisconnect(error: errorWithDetail("Invalid HTTP upgrade", code: UInt16(code))) } } @@ -544,7 +543,7 @@ public class WebSocket: NSObject, StreamDelegate { buffer[offset + 0] = UInt8(value >> 8) buffer[offset + 1] = UInt8(value & 0xff) } - + /// Write a 64-bit big endian value to a buffer. private static func writeUint64(buffer: UnsafeMutablePointer, offset: Int, value: UInt64) { for i in 0...7 { @@ -571,7 +570,7 @@ public class WebSocket: NSObject, StreamDelegate { } response.bytesLeft -= len response.buffer?.append(Data(bytes: baseAddress, count: len)) - processResponse(response: response) + _ = processResponse(response) return buffer.fromOffset(bufferLen - extra) } else { let isFin = (FinMask & baseAddress[0]) @@ -581,7 +580,7 @@ public class WebSocket: NSObject, StreamDelegate { var offset = 2 if (isMasked > 0 || (RSVMask & baseAddress[0]) > 0) && receivedOpcode != .pong { let errCode = CloseCode.protocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "masked and rsv data is not currently supported", code: errCode)) + doDisconnect(error: errorWithDetail("masked and rsv data is not currently supported", code: errCode)) writeError(code: errCode) return emptyBuffer } @@ -589,13 +588,13 @@ public class WebSocket: NSObject, StreamDelegate { if !isControlFrame && (receivedOpcode != .binaryFrame && receivedOpcode != .continueFrame && receivedOpcode != .textFrame && receivedOpcode != .pong) { let errCode = CloseCode.protocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "unknown opcode: \(receivedOpcode)", code: errCode)) + doDisconnect(error: errorWithDetail("unknown opcode: \(receivedOpcode)", code: errCode)) writeError(code: errCode) return emptyBuffer } if isControlFrame && isFin == 0 { let errCode = CloseCode.protocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "control frames can't be fragmented", code: errCode)) + doDisconnect(error: errorWithDetail("control frames can't be fragmented", code: errCode)) writeError(code: errCode) return emptyBuffer } @@ -622,7 +621,7 @@ public class WebSocket: NSObject, StreamDelegate { } } } - doDisconnect(error: errorWithDetail(detail: closeReason, code: code)) + doDisconnect(error: errorWithDetail(closeReason, code: code)) writeError(code: code) return emptyBuffer } @@ -669,7 +668,7 @@ public class WebSocket: NSObject, StreamDelegate { } if isFin == 0 && receivedOpcode == .continueFrame && response == nil { let errCode = CloseCode.protocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "continue frame before a binary or text frame", code: errCode)) + doDisconnect(error: errorWithDetail("continue frame before a binary or text frame", code: errCode)) writeError(code: errCode) return emptyBuffer } @@ -677,8 +676,8 @@ public class WebSocket: NSObject, StreamDelegate { if response == nil { if receivedOpcode == .continueFrame { let errCode = CloseCode.protocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "first frame can't be a continue frame", - code: errCode)) + doDisconnect(error: errorWithDetail("first frame can't be a continue frame", + code: errCode)) writeError(code: errCode) return emptyBuffer } @@ -692,8 +691,8 @@ public class WebSocket: NSObject, StreamDelegate { response!.bytesLeft = Int(dataLength) } else { let errCode = CloseCode.protocolError.rawValue - doDisconnect(error: errorWithDetail(detail: "second and beyond of fragment message must be a continue frame", - code: errCode)) + doDisconnect(error: errorWithDetail("second and beyond of fragment message must be a continue frame", + code: errCode)) writeError(code: errCode) return emptyBuffer } @@ -706,7 +705,7 @@ public class WebSocket: NSObject, StreamDelegate { if isNew { readStack.append(response) } - processResponse(response: response) + _ = processResponse(response) } let step = Int(offset + numericCast(len)) @@ -726,7 +725,7 @@ public class WebSocket: NSObject, StreamDelegate { } /// Process the finished response of a buffer. - private func processResponse(response: WSResponse) -> Bool { + private func processResponse(_ response: WSResponse) -> Bool { if response.isFin && response.bytesLeft <= 0 { if response.code == .ping { let data = response.buffer! // local copy so it's not perverse for writing @@ -761,15 +760,10 @@ public class WebSocket: NSObject, StreamDelegate { } /// Create an error. - private func errorWithDetail(detail: String, code: UInt16) -> NSError { + private func errorWithDetail(_ detail: String, code: UInt16) -> NSError { var details = [String: String]() details[NSLocalizedDescriptionKey] = detail - - #if swift(>=3) - return NSError(domain: "This is still broken", code: Int(code), userInfo: details) - #else return NSError(domain: WebSocket.ErrorDomain, code: Int(code), userInfo: details) - #endif } /// Write a an error to the socket. @@ -822,7 +816,7 @@ public class WebSocket: NSObject, StreamDelegate { error = streamError as NSError } else { let errCode = InternalErrorCode.outputStreamWriteError.rawValue - error = s.errorWithDetail(detail: "output stream error during write", code: errCode) + error = s.errorWithDetail("output stream error during write", code: errCode) } s.doDisconnect(error: error) break From 29670af4d366289491e2312891bf31bec4eadc39 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 20 Aug 2016 16:16:57 -0400 Subject: [PATCH 34/54] fix crash --- Source/WebSocket.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index c4d5315..6fd2178 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -306,14 +306,14 @@ public class WebSocket : NSObject, StreamDelegate { inStream.delegate = self outStream.delegate = self if supportedSSLSchemes.contains(url.scheme!) { - // inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) - // outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL, forKey: Stream.PropertyKey.socketSecurityLevelKey) + inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as AnyObject, forKey: Stream.PropertyKey.socketSecurityLevelKey) + outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as AnyObject, forKey: Stream.PropertyKey.socketSecurityLevelKey) } else { certValidated = true //not a https session, so no need to check SSL pinning } if voipEnabled { - inStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) - outStream.setProperty(StreamNetworkServiceTypeValue.voIP as NSString, forKey: Stream.PropertyKey(rawValue: Stream.PropertyKey.networkServiceType.rawValue)) + inStream.setProperty(StreamNetworkServiceTypeValue.voIP as AnyObject, forKey: Stream.PropertyKey.networkServiceType) + outStream.setProperty(StreamNetworkServiceTypeValue.voIP as AnyObject, forKey: Stream.PropertyKey.networkServiceType) } if selfSignedSSL { let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull] @@ -863,10 +863,10 @@ public class WebSocket : NSObject, StreamDelegate { } -private extension NSData { +private extension Data { - convenience init(buffer: UnsafeBufferPointer) { - self.init(bytes: buffer.baseAddress, length: buffer.count) + init(buffer: UnsafeBufferPointer) { + self.init(bytes: buffer.baseAddress!, count: buffer.count) } } From f982e756c238245712963b9fa67182b21e70f873 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 20 Aug 2016 17:58:52 -0400 Subject: [PATCH 35/54] varios tweaks --- Source/SocketExtensions.swift | 4 ++-- Source/SocketPacket.swift | 15 +++++++++------ Source/SocketStringReader.swift | 2 ++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Source/SocketExtensions.swift b/Source/SocketExtensions.swift index 4a47074..7280bba 100644 --- a/Source/SocketExtensions.swift +++ b/Source/SocketExtensions.swift @@ -30,9 +30,9 @@ enum JSONError : Error { } extension Array { - /// Because Swift 3 removes a lot of implicit briding so we have to perform more casts + /// Because Swift 3 removes a lot of implicit briding so we have to perform more explicit bridging func toAnyObjectArray() -> [AnyObject] { - return flatMap({$0 as? AnyObject}) + return flatMap({ $0 as AnyObject }) } } diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index aa333eb..71a79d8 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -134,7 +134,7 @@ struct SocketPacket { // binary data private func _fillInPlaceholders(_ object: AnyObject) -> AnyObject { switch object { - case let dict as NSDictionary: + case let dict as [AnyHashable: AnyObject]: if dict["_placeholder"] as? Bool ?? false { return binary[dict["num"] as! Int] as AnyObject } else { @@ -187,11 +187,14 @@ private extension SocketPacket { return placeholder as AnyObject case let arr as [AnyObject]: return arr.map({shred($0, binary: &binary)}) as AnyObject - case let dict as NSDictionary: - return dict.reduce(NSMutableDictionary(), {cur, keyValue in - cur[keyValue.0 as! NSCopying] = shred(keyValue.1 as AnyObject, binary: &binary) - return cur - }) + case let dict as [AnyHashable: AnyObject]: + return dict.reduce([AnyHashable: AnyObject](), {cur, keyValue in + var mutCur = cur + + mutCur[keyValue.0] = shred(keyValue.1 as AnyObject, binary: &binary) + + return mutCur + }) as AnyObject default: return data } diff --git a/Source/SocketStringReader.swift b/Source/SocketStringReader.swift index b0fbcd8..8bdb4d4 100644 --- a/Source/SocketStringReader.swift +++ b/Source/SocketStringReader.swift @@ -47,6 +47,7 @@ struct SocketStringReader { mutating func read(count: Int) -> String { let readString = message[currentIndex.. String { let substring = message[currentIndex.. Date: Tue, 23 Aug 2016 10:10:33 -0700 Subject: [PATCH 36/54] Switch to using Any instead of AnyObject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In Swift 3 AnyObject is rarely what you want to use. Objective-C API gets imported as Any and while types like Array and Dictionary can be coerced to AnyObject, they prefer Any, which doesn’t require a manual cast. --- .../project.pbxproj | 2 + SocketIO-MacTests/SocketAckManagerTest.swift | 4 +- SocketIO-MacTests/SocketBasicPacketTest.swift | 40 ++++++++-------- SocketIO-MacTests/SocketEngineTest.swift | 4 +- .../SocketNamespacePacketTest.swift | 42 ++++++++--------- SocketIO-MacTests/SocketParserTest.swift | 18 ++++---- SocketIO-MacTests/SocketSideEffectTest.swift | 6 --- Source/SSLSecurity.swift | 6 +-- Source/SocketAckEmitter.swift | 4 +- Source/SocketAckManager.swift | 4 +- Source/SocketAnyEvent.swift | 4 +- Source/SocketEngine.swift | 2 +- Source/SocketEngineSpec.swift | 2 +- Source/SocketEventHandler.swift | 2 +- Source/SocketExtensions.swift | 17 ++----- Source/SocketIOClient.swift | 38 +++++++-------- Source/SocketIOClientOption.swift | 46 +++++++++---------- Source/SocketIOClientSpec.swift | 6 +-- Source/SocketPacket.swift | 32 ++++++------- Source/SocketParsable.swift | 6 +-- Source/SocketTypes.swift | 4 +- Source/WebSocket.swift | 2 +- 22 files changed, 140 insertions(+), 151 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 9821a8c..fe1d271 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -819,6 +819,7 @@ ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = SocketIOClientSwift; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TVOS_DEPLOYMENT_TARGET = 9.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; @@ -849,6 +850,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_NAME = SocketIOClientSwift; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; TVOS_DEPLOYMENT_TARGET = 9.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; diff --git a/SocketIO-MacTests/SocketAckManagerTest.swift b/SocketIO-MacTests/SocketAckManagerTest.swift index dd3094d..b710241 100644 --- a/SocketIO-MacTests/SocketAckManagerTest.swift +++ b/SocketIO-MacTests/SocketAckManagerTest.swift @@ -15,11 +15,11 @@ class SocketAckManagerTest: XCTestCase { func testAddAcks() { let callbackExpection = self.expectation(description: "callbackExpection") let itemsArray = ["Hi", "ho"] - func callback(_ items: [AnyObject]) { + func callback(_ items: [Any]) { callbackExpection.fulfill() } ackManager.addAck(1, callback: callback) - ackManager.executeAck(1, with: itemsArray as [AnyObject], onQueue: DispatchQueue.main) + ackManager.executeAck(1, with: itemsArray, onQueue: DispatchQueue.main) waitForExpectations(timeout: 3.0, handler: nil) } diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index d22116a..7919f1d 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -16,15 +16,15 @@ class SocketBasicPacketTest: XCTestCase { func testEmpyEmit() { let expectedSendString = "2[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testNullEmit() { let expectedSendString = "2[\"test\",null]" - let sendData = ["test", NSNull()] as [Any] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let sendData: [Any] = ["test", NSNull()] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -32,7 +32,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmit() { let expectedSendString = "2[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -40,31 +40,31 @@ class SocketBasicPacketTest: XCTestCase { func testStringEmitWithQuotes() { let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]" let sendData = ["test", "\"he\"llo world\""] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testJSONEmit() { let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" - let sendData = ["test" as AnyObject, ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] as [AnyObject] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let sendData: [Any] = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testArrayEmit() { let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" - let sendData = ["test", ["hello", 1, ["test": "test"]]] as [Any] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let sendData: [Any] = ["test", ["hello", 1, ["test": "test"]]] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testBinaryEmit() { let expectedSendString = "51-[\"test\",{\"_placeholder\":1,\"num\":0}]" - let sendData = ["test", data] as [Any] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let sendData: [Any] = ["test", data] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -72,8 +72,8 @@ class SocketBasicPacketTest: XCTestCase { func testMultipleBinaryEmit() { let expectedSendString = "52-[\"test\",{\"data1\":{\"_placeholder\":1,\"num\":0},\"data2\":{\"_placeholder\":1,\"num\":1}}]" - let sendData = ["test" as AnyObject, ["data1": data, "data2": data2] as NSDictionary] as [AnyObject] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/", ack: false) + let sendData: [Any] = ["test", ["data1": data, "data2": data2] as NSDictionary] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -82,7 +82,7 @@ class SocketBasicPacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "20[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, @@ -91,8 +91,8 @@ class SocketBasicPacketTest: XCTestCase { func testEmitDataWithAck() { let expectedSendString = "51-0[\"test\",{\"_placeholder\":1,\"num\":0}]" - let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: false) + let sendData: [Any] = ["test", data] + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -117,7 +117,7 @@ class SocketBasicPacketTest: XCTestCase { func testStringAck() { let expectedSendString = "30[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -125,7 +125,7 @@ class SocketBasicPacketTest: XCTestCase { func testJSONAck() { let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -133,7 +133,7 @@ class SocketBasicPacketTest: XCTestCase { func testBinaryAck() { let expectedSendString = "61-0[{\"_placeholder\":1,\"num\":0}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -142,7 +142,7 @@ class SocketBasicPacketTest: XCTestCase { func testMultipleBinaryAck() { let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":1,\"num\":0},\"data1\":{\"_placeholder\":1,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 1880fd4..4c54833 100644 --- a/SocketIO-MacTests/SocketEngineTest.swift +++ b/SocketIO-MacTests/SocketEngineTest.swift @@ -89,14 +89,14 @@ class SocketEngineTest: XCTestCase { func testEncodeURLProperly() { engine.connectParams = [ - "created": "2016-05-04T18:31:15+0200" as AnyObject + "created": "2016-05-04T18:31:15+0200" ] XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&created=2016-05-04T18%3A31%3A15%2B0200") XCTAssertEqual(engine.urlWebSocket.query, "transport=websocket&created=2016-05-04T18%3A31%3A15%2B0200") engine.connectParams = [ - "forbidden": "!*'();:@&=+$,/?%#[]\" {}" as AnyObject + "forbidden": "!*'();:@&=+$,/?%#[]\" {}" ] XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D") diff --git a/SocketIO-MacTests/SocketNamespacePacketTest.swift b/SocketIO-MacTests/SocketNamespacePacketTest.swift index e1144a1..0bd3976 100644 --- a/SocketIO-MacTests/SocketNamespacePacketTest.swift +++ b/SocketIO-MacTests/SocketNamespacePacketTest.swift @@ -15,40 +15,40 @@ class SocketNamespacePacketTest: XCTestCase { func testEmpyEmit() { let expectedSendString = "2/swift,[\"test\"]" - let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + let sendData: [Any] = ["test"] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testNullEmit() { let expectedSendString = "2/swift,[\"test\",null]" - let sendData = ["test", NSNull()] as [Any] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + let sendData: [Any] = ["test", NSNull()] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testStringEmit() { let expectedSendString = "2/swift,[\"test\",\"foo bar\"]" - let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + let sendData: [Any] = ["test", "foo bar"] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testJSONEmit() { let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" - let sendData = ["test" as AnyObject, ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] as [AnyObject] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + let sendData: [Any] = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testArrayEmit() { let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" - let sendData = ["test", ["hello", 1, ["test": "test"]]] as [Any] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + let sendData: [Any] = ["test", ["hello", 1, ["test": "test"]]] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) @@ -56,8 +56,8 @@ class SocketNamespacePacketTest: XCTestCase { func testBinaryEmit() { let expectedSendString = "51-/swift,[\"test\",{\"_placeholder\":1,\"num\":0}]" - let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + let sendData: [Any] = ["test", data] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -65,8 +65,8 @@ class SocketNamespacePacketTest: XCTestCase { func testMultipleBinaryEmit() { let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"_placeholder\":1,\"num\":0},\"data2\":{\"_placeholder\":1,\"num\":1}}]" - let sendData = ["test" as AnyObject, ["data1": data, "data2": data2] as NSDictionary] as [AnyObject] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: -1, nsp: "/swift", ack: false) + let sendData: [Any] = ["test", ["data1": data, "data2": data2] as NSDictionary] + let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data, data2]) @@ -75,15 +75,15 @@ class SocketNamespacePacketTest: XCTestCase { func testEmitWithAck() { let expectedSendString = "2/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: false) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) } func testEmitDataWithAck() { let expectedSendString = "51-/swift,0[\"test\",{\"_placeholder\":1,\"num\":0}]" - let sendData = ["test" as AnyObject, data as AnyObject] as [AnyObject] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: false) + let sendData: [Any] = ["test", data] + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -108,7 +108,7 @@ class SocketNamespacePacketTest: XCTestCase { func testStringAck() { let expectedSendString = "3/swift,0[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -116,7 +116,7 @@ class SocketNamespacePacketTest: XCTestCase { func testJSONAck() { let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":1,\"null\":null}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) } @@ -124,7 +124,7 @@ class SocketNamespacePacketTest: XCTestCase { func testBinaryAck() { let expectedSendString = "61-/swift,0[{\"_placeholder\":1,\"num\":0}]" let sendData = [data] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data]) @@ -133,7 +133,7 @@ class SocketNamespacePacketTest: XCTestCase { func testMultipleBinaryAck() { let expectedSendString = "62-/swift,0[{\"data2\":{\"_placeholder\":1,\"num\":0},\"data1\":{\"_placeholder\":1,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] - let packet = SocketPacket.packetFromEmit(sendData as [AnyObject], id: 0, nsp: "/swift", ack: true) + let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index 841057a..3a1d656 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -13,21 +13,21 @@ class SocketParserTest: XCTestCase { let testSocket = SocketIOClient(socketURL: URL(string: "http://localhost/")!) //Format key: message; namespace-data-binary-id - static let packetTypes: [String: (String, [AnyObject], [Data], Int)] = [ + static let packetTypes: [String: (String, [Any], [Data], Int)] = [ "0": ("/", [], [], -1), "1": ("/", [], [], -1), - "25[\"test\"]": ("/", ["test" as AnyObject], [], 5), - "2[\"test\",\"~~0\"]": ("/", ["test" as AnyObject, "~~0" as AnyObject], [], -1), - "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn" as AnyObject, ["test3" as AnyObject, "test4" as AnyObject] as NSArray], [], -1), - "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn" as AnyObject, [1, 2] as NSArray, ["test": "bob"] as NSDictionary, 25 as AnyObject, "polo" as AnyObject, ["_placeholder": true, "num": 0] as NSDictionary], [], -1), + "25[\"test\"]": ("/", ["test"], [], 5), + "2[\"test\",\"~~0\"]": ("/", ["test", "~~0"], [], -1), + "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn", ["test3", "test4"] as NSArray], [], -1), + "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2] as NSArray, ["test": "bob"] as NSDictionary, 25, "polo", ["_placeholder": true, "num": 0] as NSDictionary], [], -1), "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"] as NSArray], [], 0), "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": - ("/swift", [ [1, 2] as NSArray, ["test": "bob"] as NSDictionary, 25 as AnyObject, "polo" as AnyObject, ["_placeholder": true, "num": 0] as NSDictionary], [], 19), + ("/swift", [ [1, 2] as NSArray, ["test": "bob"] as NSDictionary, 25, "polo", ["_placeholder": true, "num": 0] as NSDictionary], [], 19), "4/swift,": ("/swift", [], [], -1), "0/swift": ("/swift", [], [], -1), "1/swift": ("/swift", [], [], -1), - "4\"ERROR\"": ("/", ["ERROR" as AnyObject], [], -1), + "4\"ERROR\"": ("/", ["ERROR"], [], -1), "4{\"test\":2}": ("/", [["test": 2] as NSDictionary], [], -1), - "41": ("/", [1 as AnyObject], [], -1)] + "41": ("/", [1], [], -1)] func testDisconnect() { let message = "1" @@ -120,7 +120,7 @@ class SocketParserTest: XCTestCase { func validateParseResult(_ message: String) { let validValues = SocketParserTest.packetTypes[message]! let packet = testSocket.parseString(message) - let type = message.substring(with: Range(message.startIndex.. [AnyObject] { - return flatMap({$0 as? AnyObject}) - } -} - -extension Array where Element: AnyObject { func toJSON() throws -> Data { return try JSONSerialization.data(withJSONObject: self as NSArray, options: JSONSerialization.WritingOptions(rawValue: 0)) } @@ -49,9 +42,9 @@ extension CharacterSet { } extension NSDictionary { - private static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? { + private static func keyValueToSocketIOClientOption(key: String, value: Any) -> SocketIOClientOption? { switch (key, value) { - case let ("connectParams", params as [String: AnyObject]): + case let ("connectParams", params as [String: Any]): return .connectParams(params) case let ("cookies", cookies as [HTTPCookie]): return .cookies(cookies) @@ -100,7 +93,7 @@ extension NSDictionary { var options = [] as SocketIOClientConfiguration for (rawKey, value) in self { - if let key = rawKey as? String, let opt = NSDictionary.keyValueToSocketIOClientOption(key: key, value: value as AnyObject) { + if let key = rawKey as? String, let opt = NSDictionary.keyValueToSocketIOClientOption(key: key, value: value) { options.insert(opt) } } @@ -110,9 +103,9 @@ extension NSDictionary { } extension String { - func toArray() throws -> [AnyObject] { + func toArray() throws -> [Any] { guard let stringData = data(using: .utf8, allowLossyConversion: false) else { return [] } - guard let array = try JSONSerialization.jsonObject(with: stringData, options: .mutableContainers) as? [AnyObject] else { + guard let array = try JSONSerialization.jsonObject(with: stringData, options: .mutableContainers) as? [Any] else { throw JSONError.notArray } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 156baee..36356a0 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -160,7 +160,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } } - private func createOnAck(_ items: [AnyObject]) -> OnAckCallback { + private func createOnAck(_ items: [Any]) -> OnAckCallback { currentAck += 1 return {[weak self, ack = currentAck] timeout, callback in @@ -201,7 +201,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable // Make sure the engine is actually dead. engine?.disconnect(reason: reason) - handleEvent("disconnect", data: [reason as AnyObject], isInternalMessage: true) + handleEvent("disconnect", data: [reason], isInternalMessage: true) } /// Disconnects the socket. @@ -215,34 +215,34 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Send a message to the server public func emit(_ event: String, _ items: SocketData...) { - emit(event, with: items.toAnyObjectArray()) + emit(event, with: items) } /// Same as emit, but meant for Objective-C - public func emit(_ event: String, with items: [AnyObject]) { + public func emit(_ event: String, with items: [Any]) { guard status == .connected else { - handleEvent("error", data: ["Tried emitting \(event) when not connected" as AnyObject], isInternalMessage: true) + handleEvent("error", data: ["Tried emitting \(event) when not connected"], isInternalMessage: true) return } - _emit([event as AnyObject] + items) + _emit([event] + items) } /// Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add /// an ack. public func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback { - return emitWithAck(event, with: items.toAnyObjectArray()) + return emitWithAck(event, with: items) } /// Same as emitWithAck, but for Objective-C - public func emitWithAck(_ event: String, with items: [AnyObject]) -> OnAckCallback { - return createOnAck([event as AnyObject] + items) + public func emitWithAck(_ event: String, with items: [Any]) -> OnAckCallback { + return createOnAck([event] + items) } - private func _emit(_ data: [AnyObject], ack: Int? = nil) { + private func _emit(_ data: [Any], ack: Int? = nil) { emitQueue.async { guard self.status == .connected else { - self.handleEvent("error", data: ["Tried emitting when not connected" as AnyObject], isInternalMessage: true) + self.handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true) return } @@ -256,7 +256,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } // If the server wants to know that the client received data - func emitAck(_ ack: Int, with items: [AnyObject]) { + func emitAck(_ ack: Int, with items: [Any]) { emitQueue.async { if self.status == .connected { let packet = SocketPacket.packetFromEmit(items, id: ack, nsp: self.nsp, ack: true) @@ -288,7 +288,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable public func engineDidError(reason: String) { DefaultSocketLogger.Logger.error("%@", type: logType, args: reason) - handleEvent("error", data: [reason as AnyObject], isInternalMessage: true) + handleEvent("error", data: [reason], isInternalMessage: true) } public func engineDidOpen(reason: String) { @@ -296,7 +296,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } // Called when the socket gets an ack for something it sent - func handleAck(_ ack: Int, data: [AnyObject]) { + func handleAck(_ ack: Int, data: [Any]) { guard status == .connected else { return } DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data) @@ -307,7 +307,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } /// Causes an event to be handled. Only use if you know what you're doing. - public func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int = -1) { + public func handleEvent(_ event: String, data: [Any], isInternalMessage: Bool, withAck ack: Int = -1) { guard status == .connected || isInternalMessage else { return } DefaultSocketLogger.Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data) @@ -416,7 +416,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable guard reconnecting else { return } DefaultSocketLogger.Logger.log("Starting reconnect", type: logType) - handleEvent("reconnect", data: [reason as AnyObject], isInternalMessage: true) + handleEvent("reconnect", data: [reason], isInternalMessage: true) _tryReconnect() } @@ -429,7 +429,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType) - handleEvent("reconnectAttempt", data: [(reconnectAttempts - currentReconnectAttempt) as AnyObject], + handleEvent("reconnectAttempt", data: [(reconnectAttempts - currentReconnectAttempt)], isInternalMessage: true) currentReconnectAttempt += 1 @@ -454,7 +454,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable self.engine = engine } - func emitTest(event: String, _ data: AnyObject...) { - _emit([event as AnyObject] + data) + func emitTest(event: String, _ data: Any...) { + _emit([event] + data) } } diff --git a/Source/SocketIOClientOption.swift b/Source/SocketIOClientOption.swift index b20c438..dd723f4 100644 --- a/Source/SocketIOClientOption.swift +++ b/Source/SocketIOClientOption.swift @@ -25,11 +25,11 @@ import Foundation protocol ClientOption : CustomStringConvertible, Equatable { - func getSocketIOOptionValue() -> AnyObject + func getSocketIOOptionValue() -> Any } public enum SocketIOClientOption : ClientOption { - case connectParams([String: AnyObject]) + case connectParams([String: Any]) case cookies([HTTPCookie]) case doubleEncodeUTF8(Bool) case extraHeaders([String: String]) @@ -99,50 +99,50 @@ public enum SocketIOClientOption : ClientOption { return description } - func getSocketIOOptionValue() -> AnyObject { - let value: AnyObject + func getSocketIOOptionValue() -> Any { + let value: Any switch self { case let .connectParams(params): - value = params as AnyObject + value = params case let .cookies(cookies): - value = cookies as AnyObject + value = cookies case let .doubleEncodeUTF8(encode): - value = encode as AnyObject + value = encode case let .extraHeaders(headers): - value = headers as AnyObject + value = headers case let .forceNew(force): - value = force as AnyObject + value = force case let .forcePolling(force): - value = force as AnyObject + value = force case let .forceWebsockets(force): - value = force as AnyObject + value = force case let .handleQueue(queue): - value = queue as AnyObject + value = queue case let .log(log): - value = log as AnyObject + value = log case let .logger(logger): - value = logger as AnyObject + value = logger case let .nsp(nsp): - value = nsp as AnyObject + value = nsp case let .path(path): - value = path as AnyObject + value = path case let .reconnects(reconnects): - value = reconnects as AnyObject + value = reconnects case let .reconnectAttempts(attempts): - value = attempts as AnyObject + value = attempts case let .reconnectWait(wait): - value = wait as AnyObject + value = wait case let .secure(secure): - value = secure as AnyObject + value = secure case let .security(security): value = security case let .selfSigned(signed): - value = signed as AnyObject + value = signed case let .sessionDelegate(delegate): - value = delegate as AnyObject + value = delegate case let .voipEnabled(enabled): - value = enabled as AnyObject + value = enabled } return value diff --git a/Source/SocketIOClientSpec.swift b/Source/SocketIOClientSpec.swift index 1e2051c..e91c840 100644 --- a/Source/SocketIOClientSpec.swift +++ b/Source/SocketIOClientSpec.swift @@ -29,8 +29,8 @@ protocol SocketIOClientSpec : class { func didConnect() func didDisconnect(reason: String) func didError(reason: String) - func handleAck(_ ack: Int, data: [AnyObject]) - func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int) + func handleAck(_ ack: Int, data: [Any]) + func handleEvent(_ event: String, data: [Any], isInternalMessage: Bool, withAck ack: Int) func joinNamespace(_ namespace: String) } @@ -38,6 +38,6 @@ extension SocketIOClientSpec { func didError(reason: String) { DefaultSocketLogger.Logger.error("%@", type: "SocketIOClient", args: reason) - handleEvent("error", data: [reason as AnyObject], isInternalMessage: true, withAck: -1) + handleEvent("error", data: [reason], isInternalMessage: true, withAck: -1) } } diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index aa333eb..1eb4f3e 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -39,9 +39,9 @@ struct SocketPacket { let type: PacketType var binary: [Data] - var data: [AnyObject] + var data: [Any] - var args: [AnyObject] { + var args: [Any] { if type == .event || type == .binaryEvent && data.count != 0 { return Array(data.dropFirst()) } else { @@ -62,7 +62,7 @@ struct SocketPacket { return createPacketString() } - init(type: PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1, + init(type: PacketType, data: [Any] = [Any](), id: Int = -1, nsp: String, placeholders: Int = 0, binary: [Data] = [Data]()) { self.data = data self.id = id @@ -132,19 +132,19 @@ struct SocketPacket { // If object is a collection it will recurse // Returns the object if it is not a placeholder or the corresponding // binary data - private func _fillInPlaceholders(_ object: AnyObject) -> AnyObject { + private func _fillInPlaceholders(_ object: Any) -> Any { switch object { case let dict as NSDictionary: if dict["_placeholder"] as? Bool ?? false { - return binary[dict["num"] as! Int] as AnyObject + return binary[dict["num"] as! Int] } else { return dict.reduce(NSMutableDictionary(), {cur, keyValue in - cur[keyValue.0 as! NSCopying] = _fillInPlaceholders(keyValue.1 as AnyObject) + cur[keyValue.0 as! NSCopying] = _fillInPlaceholders(keyValue.1) return cur }) } - case let arr as [AnyObject]: - return arr.map(_fillInPlaceholders) as AnyObject + case let arr as [Any]: + return arr.map(_fillInPlaceholders) default: return object } @@ -167,7 +167,7 @@ extension SocketPacket { } } - static func packetFromEmit(_ items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket { + static func packetFromEmit(_ items: [Any], id: Int, nsp: String, ack: Bool) -> SocketPacket { let (parsedData, binary) = deconstructData(items) let packet = SocketPacket(type: findType(binary.count, ack: ack), data: parsedData, id: id, nsp: nsp, binary: binary) @@ -178,18 +178,18 @@ extension SocketPacket { private extension SocketPacket { // Recursive function that looks for NSData in collections - static func shred(_ data: AnyObject, binary: inout [Data]) -> AnyObject { - let placeholder = ["_placeholder": true, "num": binary.count as AnyObject] as [String : Any] + static func shred(_ data: Any, binary: inout [Data]) -> Any { + let placeholder = ["_placeholder": true, "num": binary.count] as [String : Any] switch data { case let bin as Data: binary.append(bin) - return placeholder as AnyObject - case let arr as [AnyObject]: - return arr.map({shred($0, binary: &binary)}) as AnyObject + return placeholder + case let arr as [Any]: + return arr.map({shred($0, binary: &binary)}) case let dict as NSDictionary: return dict.reduce(NSMutableDictionary(), {cur, keyValue in - cur[keyValue.0 as! NSCopying] = shred(keyValue.1 as AnyObject, binary: &binary) + cur[keyValue.0 as! NSCopying] = shred(keyValue.1, binary: &binary) return cur }) default: @@ -199,7 +199,7 @@ private extension SocketPacket { // Removes binary data from emit data // Returns a type containing the de-binaryed data and the binary - static func deconstructData(_ data: [AnyObject]) -> ([AnyObject], [Data]) { + static func deconstructData(_ data: [Any]) -> ([Any], [Data]) { var binary = [Data]() return (data.map({shred($0, binary: &binary)}), binary) diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index bac3f20..ac52177 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -65,7 +65,7 @@ extension SocketParsable { func parseString(_ message: String) -> Either { var reader = SocketStringReader(message: message) - guard let type = SocketPacket.PacketType(rawValue: Int(reader.read(count: 1)) ?? -1) else { + guard let type = Int(reader.read(count: 1)).flatMap({ SocketPacket.PacketType(rawValue: $0) }) else { return .left("Invalid packet type") } @@ -112,7 +112,7 @@ extension SocketParsable { switch parseData(d) { case let .left(err): // Errors aren't always enclosed in an array - if case let .right(data) = parseData("\([d as AnyObject])") { + if case let .right(data) = parseData("[\(d)]") { return .right(SocketPacket(type: type, data: data, id: Int(idString) ?? -1, nsp: namespace, placeholders: placeholders)) } else { @@ -125,7 +125,7 @@ extension SocketParsable { } // Parses data for events - private func parseData(_ data: String) -> Either { + private func parseData(_ data: String) -> Either { do { return .right(try data.toArray()) } catch { diff --git a/Source/SocketTypes.swift b/Source/SocketTypes.swift index b2f04e0..b01730a 100644 --- a/Source/SocketTypes.swift +++ b/Source/SocketTypes.swift @@ -39,8 +39,8 @@ extension NSString : SocketData {} extension NSNull : SocketData {} extension String : SocketData {} -public typealias AckCallback = ([AnyObject]) -> Void -public typealias NormalCallback = ([AnyObject], SocketAckEmitter) -> Void +public typealias AckCallback = ([Any]) -> Void +public typealias NormalCallback = ([Any], SocketAckEmitter) -> Void public typealias OnAckCallback = (_ timeoutAfter: UInt64, _ callback: AckCallback) -> Void typealias Probe = (msg: String, type: SocketEnginePacketType, data: [Data]) diff --git a/Source/WebSocket.swift b/Source/WebSocket.swift index 52ab6dc..8ef2187 100644 --- a/Source/WebSocket.swift +++ b/Source/WebSocket.swift @@ -368,7 +368,7 @@ public class WebSocket: NSObject, StreamDelegate { public func stream(aStream: Stream, handleEvent eventCode: Stream.Event) { if let sec = security , !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { - let possibleTrust = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) as AnyObject + let possibleTrust = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) let domain = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) as? String if sec.isValid(possibleTrust as! SecTrust, domain: domain) { certValidated = true From f5cf2b8de5328aabe836e25b88214b74c78a9cd0 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 31 Aug 2016 18:19:24 -0400 Subject: [PATCH 37/54] Fix swift3 errors that happened during merge --- Source/SocketEngine.swift | 6 +++--- Source/SocketIOClient.swift | 2 +- Source/SocketParsable.swift | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index bac32ab..a38aa16 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -359,7 +359,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll do { let json = try openData.toNSDictionary() guard let sid = json["sid"] as? String else { - client?.engineDidError("Open packet contained no sid") + client?.engineDidError(reason: "Open packet contained no sid") return } @@ -374,7 +374,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll upgradeWs = false } - if let pingInterval = json["pingInterval"] as? Double, pingTimeout = json["pingTimeout"] as? Double { + if let pingInterval = json["pingInterval"] as? Double, let pingTimeout = json["pingTimeout"] as? Double { self.pingInterval = pingInterval / 1000.0 self.pingTimeout = pingTimeout / 1000.0 } @@ -389,7 +389,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll doPoll() } - client?.engineDidOpen("Connect") + client?.engineDidOpen(reason: "Connect") } catch { didError(reason: "Error parsing open packet") } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index de61de0..2a8713c 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -151,7 +151,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable let time = DispatchTime.now() + Double(Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) / Double(NSEC_PER_SEC) handleQueue.asyncAfter(deadline: time) {[weak self] in - guard let this = self where this.status != .Connected && this.status != .Disconnected else { return } + guard let this = self, this.status != .connected && this.status != .disconnected else { return } this.status = .disconnected this.engine?.disconnect(reason: "Connect timeout") diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index ae71388..c046893 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -32,7 +32,7 @@ extension SocketParsable { return nsp == self.nsp } - private func handleConnect(packetNamespace: String) { + private func handleConnect(_ packetNamespace: String) { if packetNamespace == "/" && nsp != "/" { joinNamespace(nsp) } else { @@ -53,7 +53,7 @@ extension SocketParsable { case .connect: handleConnect(pack.nsp) case .disconnect: - didDisconnect("Got Disconnect") + didDisconnect(reason: "Got Disconnect") case .error: handleEvent("error", data: pack.data, isInternalMessage: true, withAck: pack.id) default: From c7d75b6b8300269da9c68d2fd1a08efd4f52d772 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 31 Aug 2016 19:58:40 -0400 Subject: [PATCH 38/54] refactor --- Source/SocketEngine.swift | 70 +++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index a38aa16..9415f51 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -356,43 +356,43 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll } private func handleOpen(openData: String) { - do { - let json = try openData.toNSDictionary() - guard let sid = json["sid"] as? String else { - client?.engineDidError(reason: "Open packet contained no sid") - return - } - - let upgradeWs: Bool - - self.sid = sid - connected = true - - if let upgrades = json["upgrades"] as? [String] { - upgradeWs = upgrades.contains("websocket") - } else { - upgradeWs = false - } - - if let pingInterval = json["pingInterval"] as? Double, let pingTimeout = json["pingTimeout"] as? Double { - self.pingInterval = pingInterval / 1000.0 - self.pingTimeout = pingTimeout / 1000.0 - } - - if !forcePolling && !forceWebsockets && upgradeWs { - createWebsocketAndConnect() - } - - sendPing() - - if !forceWebsockets { - doPoll() - } - - client?.engineDidOpen(reason: "Connect") - } catch { + guard let json = try? openData.toNSDictionary() else { didError(reason: "Error parsing open packet") + return } + + guard let sid = json["sid"] as? String else { + didError(reason: "Open packet contained no sid") + return + } + + let upgradeWs: Bool + + self.sid = sid + connected = true + + if let upgrades = json["upgrades"] as? [String] { + upgradeWs = upgrades.contains("websocket") + } else { + upgradeWs = false + } + + if let pingInterval = json["pingInterval"] as? Double, let pingTimeout = json["pingTimeout"] as? Double { + self.pingInterval = pingInterval / 1000.0 + self.pingTimeout = pingTimeout / 1000.0 + } + + if !forcePolling && !forceWebsockets && upgradeWs { + createWebsocketAndConnect() + } + + sendPing() + + if !forceWebsockets { + doPoll() + } + + client?.engineDidOpen(reason: "Connect") } private func handlePong(with message: String) { From a950656112dcdfaee49f1ff026259db5a0d78ac9 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 31 Aug 2016 20:45:15 -0400 Subject: [PATCH 39/54] open socket manager --- Source/SocketClientManager.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/SocketClientManager.swift b/Source/SocketClientManager.swift index 3ae3747..e230272 100644 --- a/Source/SocketClientManager.swift +++ b/Source/SocketClientManager.swift @@ -43,12 +43,12 @@ import Foundation manager["room1"]?.emit("hello") ``` */ -public final class SocketClientManager : NSObject { - public static let sharedManager = SocketClientManager() +open class SocketClientManager : NSObject { + open static let sharedManager = SocketClientManager() private var sockets = [String: SocketIOClient]() - public subscript(string: String) -> SocketIOClient? { + open subscript(string: String) -> SocketIOClient? { get { return sockets[string] } @@ -58,15 +58,15 @@ public final class SocketClientManager : NSObject { } } - public func addSocket(_ socket: SocketIOClient, labeledAs label: String) { + open func addSocket(_ socket: SocketIOClient, labeledAs label: String) { sockets[label] = socket } - public func removeSocket(withLabel label: String) -> SocketIOClient? { + open func removeSocket(withLabel label: String) -> SocketIOClient? { return sockets.removeValue(forKey: label) } - public func removeSocket(_ socket: SocketIOClient) -> SocketIOClient? { + open func removeSocket(_ socket: SocketIOClient) -> SocketIOClient? { var returnSocket: SocketIOClient? for (label, dictSocket) in sockets where dictSocket === socket { @@ -76,7 +76,7 @@ public final class SocketClientManager : NSObject { return returnSocket } - public func removeSockets() { + open func removeSockets() { sockets.removeAll() } } From d3500d38ba8bdd61abefb3a3db924c6c373f2759 Mon Sep 17 00:00:00 2001 From: Kobe Date: Fri, 2 Sep 2016 10:46:39 +0800 Subject: [PATCH 40/54] Modify mac version base mac os 10.9 --- Socket.IO-Client-Swift.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 47c0b88..b7e4897 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.license = { :type => 'MIT' } s.author = { "Erik" => "nuclear.ace@gmail.com" } s.ios.deployment_target = '8.0' - s.osx.deployment_target = '10.10' + s.osx.deployment_target = '10.9' s.tvos.deployment_target = '9.0' s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v7.0.3' } s.source_files = "Source/**/*.swift" From 923103dec8be5bb00895c27404f3ac90ef9aeaa3 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 2 Sep 2016 17:33:12 -0400 Subject: [PATCH 41/54] change spm name --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index f7d8304..04e8fbb 100644 --- a/Package.swift +++ b/Package.swift @@ -1,5 +1,5 @@ import PackageDescription let package = Package( - name: "SocketIOClientSwift" + name: "SocketIO" ) From 49dfd7432cc8c104d37a6c350c4642e878ec6626 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 2 Sep 2016 17:57:26 -0400 Subject: [PATCH 42/54] use guarded try --- Source/SocketEngine.swift | 72 +++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 753f750..6c3910e 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -355,45 +355,45 @@ public final class SocketEngine : NSObject, NSURLSessionDelegate, SocketEnginePo private func handleNOOP() { doPoll() } - + private func handleOpen(openData: String) { - do { - let json = try openData.toNSDictionary() - guard let sid = json["sid"] as? String else { - client?.engineDidError("Open packet contained no sid") - return - } - - let upgradeWs: Bool - - self.sid = sid - connected = true - - if let upgrades = json["upgrades"] as? [String] { - upgradeWs = upgrades.contains("websocket") - } else { - upgradeWs = false - } - - if let pingInterval = json["pingInterval"] as? Double, pingTimeout = json["pingTimeout"] as? Double { - self.pingInterval = pingInterval / 1000.0 - self.pingTimeout = pingTimeout / 1000.0 - } - - if !forcePolling && !forceWebsockets && upgradeWs { - createWebsocketAndConnect() - } - - sendPing() - - if !forceWebsockets { - doPoll() - } - - client?.engineDidOpen("Connect") - } catch { + guard let json = try? openData.toNSDictionary() else { didError("Error parsing open packet") + return } + + guard let sid = json["sid"] as? String else { + didError("Open packet contained no sid") + return + } + + let upgradeWs: Bool + + self.sid = sid + connected = true + + if let upgrades = json["upgrades"] as? [String] { + upgradeWs = upgrades.contains("websocket") + } else { + upgradeWs = false + } + + if let pingInterval = json["pingInterval"] as? Double, pingTimeout = json["pingTimeout"] as? Double { + self.pingInterval = pingInterval / 1000.0 + self.pingTimeout = pingTimeout / 1000.0 + } + + if !forcePolling && !forceWebsockets && upgradeWs { + createWebsocketAndConnect() + } + + sendPing() + + if !forceWebsockets { + doPoll() + } + + client?.engineDidOpen("Connect") } private func handlePong(pongMessage: String) { From 16eefa4abfa0bdc097ca3a649f3c208ab3ab7d21 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 2 Sep 2016 18:03:15 -0400 Subject: [PATCH 43/54] Don't parse twice for errors --- SocketIO-MacTests/SocketParserTest.swift | 10 ++++++++-- Source/SocketParsable.swift | 16 +++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index a43fdaf..319c931 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -27,7 +27,8 @@ class SocketParserTest: XCTestCase { "1/swift": ("/swift", [], [], -1), "4\"ERROR\"": ("/", ["ERROR"], [], -1), "4{\"test\":2}": ("/", [["test": 2]], [], -1), - "41": ("/", [1], [], -1)] + "41": ("/", [1], [], -1), + "4[1, \"hello\"]": ("/", [1, "hello"], [], -1)] func testDisconnect() { let message = "1" @@ -99,6 +100,11 @@ class SocketParserTest: XCTestCase { validateParseResult(message) } + func testErrorTypeArray() { + let message = "4[1, \"hello\"]" + validateParseResult(message) + } + func testInvalidInput() { let message = "8" switch testSocket.parseString(message) { @@ -120,7 +126,7 @@ class SocketParserTest: XCTestCase { func validateParseResult(message: String) { let validValues = SocketParserTest.packetTypes[message]! let packet = testSocket.parseString(message) - let type = message.substringWithRange(Range(message.startIndex.. Date: Wed, 7 Sep 2016 14:19:53 -0700 Subject: [PATCH 44/54] Update for Xcode 8 GM --- Source/SocketAckManager.swift | 4 ++-- Source/SocketIOClient.swift | 4 ++-- Source/SocketTypes.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/SocketAckManager.swift b/Source/SocketAckManager.swift index c32dc04..c00797a 100644 --- a/Source/SocketAckManager.swift +++ b/Source/SocketAckManager.swift @@ -35,7 +35,7 @@ private struct SocketAck : Hashable { self.ack = ack } - init(ack: Int, callback: AckCallback) { + init(ack: Int, callback: @escaping AckCallback) { self.ack = ack self.callback = callback } @@ -52,7 +52,7 @@ private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool { struct SocketAckManager { private var acks = Set(minimumCapacity: 1) - mutating func addAck(_ ack: Int, callback: AckCallback) { + mutating func addAck(_ ack: Int, callback: @escaping AckCallback) { acks.insert(SocketAck(ack: ack, callback: callback)) } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 156baee..22a5e88 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -356,7 +356,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Adds a handler for an event. /// Returns: A unique id for the handler @discardableResult - public func on(_ event: String, callback: NormalCallback) -> UUID { + public func on(_ event: String, callback: @escaping NormalCallback) -> UUID { DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event) let handler = SocketEventHandler(event: event, id: UUID(), callback: callback) @@ -368,7 +368,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable /// Adds a single-use handler for an event. /// Returns: A unique id for the handler @discardableResult - public func once(_ event: String, callback: NormalCallback) -> UUID { + public func once(_ event: String, callback: @escaping NormalCallback) -> UUID { DefaultSocketLogger.Logger.log("Adding once handler for event: %@", type: logType, args: event) let id = UUID() diff --git a/Source/SocketTypes.swift b/Source/SocketTypes.swift index b2f04e0..25cb8f7 100644 --- a/Source/SocketTypes.swift +++ b/Source/SocketTypes.swift @@ -41,7 +41,7 @@ extension String : SocketData {} public typealias AckCallback = ([AnyObject]) -> Void public typealias NormalCallback = ([AnyObject], SocketAckEmitter) -> Void -public typealias OnAckCallback = (_ timeoutAfter: UInt64, _ callback: AckCallback) -> Void +public typealias OnAckCallback = (_ timeoutAfter: UInt64, _ callback: @escaping AckCallback) -> Void typealias Probe = (msg: String, type: SocketEnginePacketType, data: [Data]) typealias ProbeWaitQueue = [Probe] From d808d8f157ef24f9bdbf70d773000db046397e94 Mon Sep 17 00:00:00 2001 From: Kevin Cassidy Jr Date: Wed, 7 Sep 2016 20:19:55 -0700 Subject: [PATCH 45/54] Fix truncation of binary data, use range operator for clarity --- Source/SocketEngine.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 9415f51..a834645 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -407,7 +407,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll public func parseEngineData(_ data: Data) { DefaultSocketLogger.Logger.log("Got binary data: %@", type: "SocketEngine", args: data) - client?.parseEngineBinaryData(data.subdata(in: Range(uncheckedBounds: (1, data.count - 1)))) + client?.parseEngineBinaryData(data.subdata(in: 1.. Date: Thu, 8 Sep 2016 07:23:00 -0400 Subject: [PATCH 46/54] Fix tests --- SocketIO-MacTests/SocketBasicPacketTest.swift | 8 ++++---- SocketIO-MacTests/SocketNamespacePacketTest.swift | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index 6766c74..d2614fb 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -46,7 +46,7 @@ class SocketBasicPacketTest: XCTestCase { } func testJSONEmit() { - let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" + let expectedSendString = "2[\"test\",{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]" let sendData: [Any] = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) @@ -71,12 +71,12 @@ class SocketBasicPacketTest: XCTestCase { } func testMultipleBinaryEmit() { - let expectedSendString = "52-[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" + let expectedSendString = "52-[\"test\",{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData: [Any] = ["test", ["data1": data, "data2": data2] as NSDictionary] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data, data2]) + XCTAssertEqual(packet.binary, [data2, data]) } func testEmitWithAck() { @@ -123,7 +123,7 @@ class SocketBasicPacketTest: XCTestCase { } func testJSONAck() { - let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" + let expectedSendString = "30[{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) diff --git a/SocketIO-MacTests/SocketNamespacePacketTest.swift b/SocketIO-MacTests/SocketNamespacePacketTest.swift index 6b0a474..51a7ba4 100644 --- a/SocketIO-MacTests/SocketNamespacePacketTest.swift +++ b/SocketIO-MacTests/SocketNamespacePacketTest.swift @@ -38,7 +38,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testJSONEmit() { - let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" + let expectedSendString = "2/swift,[\"test\",{\"null\":null,\"test\":\"hello\",\"hello\":1,\"foobar\":true}]" let sendData: [Any] = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) @@ -46,8 +46,8 @@ class SocketNamespacePacketTest: XCTestCase { } func testArrayEmit() { - let expectedSendString = "2/swift,[\"test\",[\"hello\",true,{\"test\":\"test\"}]]" - let sendData: [Any] = ["test", ["hello", 1, ["test": "test"]]] + let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"},true]]" + let sendData: [Any] = ["test", ["hello", 1, ["test": "test"], true]] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) @@ -64,12 +64,12 @@ class SocketNamespacePacketTest: XCTestCase { } func testMultipleBinaryEmit() { - let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"_placeholder\":true,\"num\":0},\"data2\":{\"_placeholder\":true,\"num\":1}}]" + let expectedSendString = "52-/swift,[\"test\",{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData: [Any] = ["test", ["data1": data, "data2": data2] as NSDictionary] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data, data2]) + XCTAssertEqual(packet.binary, [data2, data]) } func testEmitWithAck() { @@ -114,7 +114,7 @@ class SocketNamespacePacketTest: XCTestCase { } func testJSONAck() { - let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" + let expectedSendString = "3/swift,0[{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) From 6016129562e73a9aaffa172e64799c578fb1a9a6 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 8 Sep 2016 07:31:17 -0400 Subject: [PATCH 47/54] Turn off travis until it's updated --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6afadee..5918e2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ language: objective-c xcode_project: Socket.IO-Client-Swift.xcodeproj # path to your xcodeproj folder xcode_scheme: SocketIO-iOS -osx_image: xcode7.3 +osx_image: xcode8 branches: only: - master - - development script: xctool -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build test -parallelize From a1376861633155d20d2cc439493540f744fa5478 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 8 Sep 2016 07:33:17 -0400 Subject: [PATCH 48/54] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f28ce34..95a6b8d 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{ ##Installation Requires Swift 3/Xcode 8.x -If you need swift 2.2 use 6.x (Pre-Swift 3 support is no longer maintained) +If you need swift 2.2 use 7.x (Pre-Swift 3 support is no longer maintained) If you need Swift 2.1 use v5.5.0 (Pre-Swift 2.2 support is no longer maintained) From db999a58f2314adf1eb9a363f41190d6d87d2e5a Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 8 Sep 2016 13:13:24 -0400 Subject: [PATCH 49/54] travis supports the gm --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5918e2f..6edb703 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,5 @@ osx_image: xcode8 branches: only: - master + - development script: xctool -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build test -parallelize From 9d0c03be10423d6ffdc3e7bf6d000f8a9eac454b Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 9 Sep 2016 20:38:33 -0400 Subject: [PATCH 50/54] Use xcodebuild until xctool is updated --- .travis.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6edb703..c0de76b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,4 +6,9 @@ branches: only: - master - development -script: xctool -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build test -parallelize + - travis-test +before_install: + - brew update + - brew outdated xctool || brew upgrade xctool +# script: xctool -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build test -parallelize +script: xcodebuild -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build test From fa4346cbc877de8a41f0eeb4bd3a104e65bb1bb8 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 10 Sep 2016 08:27:44 -0400 Subject: [PATCH 51/54] remove testing of test branch --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c0de76b..ef88eb6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,6 @@ branches: only: - master - development - - travis-test before_install: - brew update - brew outdated xctool || brew upgrade xctool From 31adcd4728d2e09285b4dea3d7aadde22866fdea Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 10 Sep 2016 09:17:50 -0400 Subject: [PATCH 52/54] clean up some things before xcode8 release --- Source/SocketEngine.swift | 8 ++++---- Source/SocketEnginePollable.swift | 4 +++- Source/SocketExtensions.swift | 2 +- Source/SocketIOClient.swift | 19 +++++++++---------- Source/SocketPacket.swift | 9 ++++----- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 994d799..1baed43 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -340,7 +340,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll ws.writeString(msg) } - postWait.removeAll(keepingCapacity: true) + postWait.removeAll(keepingCapacity: false) } private func handleClose(_ reason: String) { @@ -364,6 +364,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll guard let sid = json["sid"] as? String else { didError(reason: "Open packet contained no sid") + return } @@ -435,14 +436,13 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll switch type { case .message: - handleMessage( - fixedString[fixedString.characters.index(after: fixedString.characters.startIndex).. Data { - return try JSONSerialization.data(withJSONObject: self as NSArray, options: JSONSerialization.WritingOptions(rawValue: 0)) + return try JSONSerialization.data(withJSONObject: self, options: JSONSerialization.WritingOptions(rawValue: 0)) } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 7d27377..0a51bd0 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -257,14 +257,14 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable // If the server wants to know that the client received data func emitAck(_ ack: Int, with items: [Any]) { emitQueue.async { - if self.status == .connected { - let packet = SocketPacket.packetFromEmit(items, id: ack, nsp: self.nsp, ack: true) - let str = packet.packetString - - DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str) - - self.engine?.send(str, withData: packet.binary) - } + guard self.status == .connected else { return } + + let packet = SocketPacket.packetFromEmit(items, id: ack, nsp: self.nsp, ack: true) + let str = packet.packetString + + DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str) + + self.engine?.send(str, withData: packet.binary) } } @@ -428,8 +428,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable } DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType) - handleEvent("reconnectAttempt", data: [(reconnectAttempts - currentReconnectAttempt)], - isInternalMessage: true) + handleEvent("reconnectAttempt", data: [(reconnectAttempts - currentReconnectAttempt)], isInternalMessage: true) currentReconnectAttempt += 1 connect() diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index 99437a9..68e7a1e 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -40,7 +40,6 @@ struct SocketPacket { var binary: [Data] var data: [Any] - var args: [Any] { if type == .event || type == .binaryEvent && data.count != 0 { return Array(data.dropFirst()) @@ -62,8 +61,8 @@ struct SocketPacket { return createPacketString() } - init(type: PacketType, data: [Any] = [Any](), id: Int = -1, - nsp: String, placeholders: Int = 0, binary: [Data] = [Data]()) { + init(type: PacketType, data: [Any] = [Any](), id: Int = -1, nsp: String, placeholders: Int = 0, + binary: [Data] = [Data]()) { self.data = data self.id = id self.nsp = nsp @@ -112,9 +111,9 @@ struct SocketPacket { private func createPacketString() -> String { let typeString = String(type.rawValue) // Binary count? - let binaryCountString = typeString + (type == .binaryEvent || type == .binaryAck ? String(binary.count) + "-" : "") + let binaryCountString = typeString + (type == .binaryEvent || type == .binaryAck ? "\(String(binary.count))-" : "") // Namespace? - let nspString = binaryCountString + (nsp != "/" ? nsp + "," : "") + let nspString = binaryCountString + (nsp != "/" ? "\(nsp)," : "") // Ack number? let idString = nspString + (id != -1 ? String(id) : "") From 72b65655108e78b233f559bfbed9bf387ee89ca5 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 10 Sep 2016 10:12:37 -0400 Subject: [PATCH 53/54] refactors --- Source/SocketEngine.swift | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 1baed43..1919f57 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -466,23 +466,22 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll } private func sendPing() { - if !connected { - return - } + guard connected else { return } - //Server is not responding + // Server is not responding if pongsMissed > pongsMissedMax { client?.engineDidClose(reason: "Ping timeout") + return } - if let pingInterval = pingInterval { - pongsMissed += 1 - write("", withType: .ping, withData: []) - - let time = DispatchTime.now() + Double(Int64(pingInterval * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) - DispatchQueue.main.asyncAfter(deadline: time) {[weak self] in self?.sendPing() } - } + guard let pingInterval = pingInterval else { return } + + pongsMissed += 1 + write("", withType: .ping, withData: []) + + let time = DispatchTime.now() + Double(Int64(pingInterval * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) + DispatchQueue.main.asyncAfter(deadline: time) {[weak self] in self?.sendPing() } } // Moves from long-polling to websockets @@ -532,6 +531,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll if closed { client?.engineDidClose(reason: "Disconnect") + return } From 723129b6394f58fb8bf958ebe0b6bf1e18faba57 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 14 Sep 2016 07:16:22 -0400 Subject: [PATCH 54/54] refactor --- Source/SocketPacket.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index 68e7a1e..95b3218 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -137,8 +137,11 @@ struct SocketPacket { if dict["_placeholder"] as? Bool ?? false { return binary[dict["num"] as! Int] } else { - return dict.reduce(NSMutableDictionary(), {cur, keyValue in + return dict.reduce([String: Any](), {cur, keyValue in + var cur = cur + cur[keyValue.0] = _fillInPlaceholders(keyValue.1) + return cur }) } @@ -183,6 +186,7 @@ private extension SocketPacket { switch data { case let bin as Data: binary.append(bin) + return placeholder case let arr as [Any]: return arr.map({shred($0, binary: &binary)})