From 7f22dc8f422f905b7d4cef77bc6b41016cee176f Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 4 Mar 2015 10:04:26 -0500 Subject: [PATCH] send connect event on polling connect --- SwiftIO/SocketEngine.swift | 46 +++++++++++++++++++++--------------- SwiftIO/SocketIOClient.swift | 10 ++++---- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index ecd6f77..1efdfbf 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -72,7 +72,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate { var url = "\(self.client.socketURL)/socket.io/?transport=" var urlPolling:String var urlWebSocket:String - let time = Int(NSDate().timeIntervalSince1970 * 1000) if self.client.secure { urlPolling = "https://" + url + "polling" @@ -115,9 +114,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate { NSURLConnection.sendAsynchronousRequest(req, queue: self.pollingQueue) {[weak self] res, data, err in if self == nil { return - } - - if err != nil { + } else if err != nil { println(err) return } @@ -125,6 +122,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate { let str = NSString(data: data, encoding: NSUTF8StringEncoding) println(str) + + // TODO parse packets } } @@ -169,10 +168,12 @@ class SocketEngine: NSObject, SRWebSocketDelegate { options: NSJSONReadingOptions.AllowFragments, error: &err) as? NSDictionary { if let sid = json["sid"] as? String { self?.sid = sid - + self?.client.didConnect() + self?.client.handleEvent("connect", data: nil, isInternalMessage: false) + self?.ws = SRWebSocket(URL: NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!) self?.ws?.delegate = self - //self?.ws?.open() + self?.ws?.open() } else { NSLog("Error handshaking") @@ -208,7 +209,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate { // We should upgrade if strMessage == "3probe" { self.upgradeTransport() - self.pollingTimer?.invalidate() return } @@ -246,7 +246,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate { self.ws?.send(PacketType.PING.rawValue) } else { let time = Int(NSDate().timeIntervalSince1970) - var req = NSMutableURLRequest(URL: NSURL(string: self.urlPolling! + "&t=\(time)-0&b64=1" + "&sid=\(self.sid)")!) + var req = NSMutableURLRequest(URL: NSURL(string: + self.urlPolling! + "&t=\(time)-0&b64=1" + "&sid=\(self.sid)")!) let postStr = "1:\(PacketType.PING.rawValue)" let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! let postLength = "\(postData.length)" @@ -256,17 +257,20 @@ class SocketEngine: NSObject, SRWebSocketDelegate { req.setValue("application/html-text", forHTTPHeaderField: "Content-Type") req.HTTPBody = postData - NSURLConnection.sendAsynchronousRequest(req, queue: self.pollingQueue) {[weak self] res, data, err in - if err != nil { - println(err) - self?.pingTimer?.invalidate() - if !self!.client.reconnecting { - self?.client.tryReconnect(triesLeft: self!.client.reconnectAttempts) + NSURLConnection.sendAsynchronousRequest(req, + queue: self.pollingQueue) {[weak self] res, data, err in + if self == nil { + return + } else if err != nil { + println(err) + self?.pingTimer?.invalidate() + if !self!.client.reconnecting { + self?.client.tryReconnect(triesLeft: self!.client.reconnectAttempts) + } + return } - return - } - - self?.doPoll() + + self?.doPoll() } } } @@ -292,6 +296,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate { if self.websocketConnected { self._websocket = true self._polling = false + self.pollingTimer?.invalidate() self.ws?.send(PacketType.UPGRADE.rawValue) } } @@ -306,7 +311,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate { // Called when the socket is opened func webSocketDidOpen(webSocket:SRWebSocket!) { println("socket opened") - self.startPingTimer() self.websocketConnected = true self.probeWebSocket() } @@ -316,6 +320,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate { println("socket closed") self.pingTimer?.invalidate() self.websocketConnected = false + self._websocket = false + self._polling = true // Temp self.client.webSocket(webSocket, didCloseWithCode: code, reason: reason, wasClean: wasClean) @@ -325,6 +331,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate { func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) { self.pingTimer?.invalidate() self.websocketConnected = false + self._websocket = false + self._polling = true // Temp self.client.webSocket(webSocket, didFailWithError: error) diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index ff3f622..3e54dcb 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -39,7 +39,6 @@ class SocketIOClient: NSObject { private var handlers = [SocketEventHandler]() private var lastSocketMessage:SocketEvent? private var paramConnect = false - private var pingTimer:NSTimer! private var _secure = false var closed = false var connected = false @@ -92,7 +91,6 @@ class SocketIOClient: NSObject { // Closes the socket func close() { - self.pingTimer?.invalidate() self.closed = true self.connecting = false self.connected = false @@ -121,6 +119,12 @@ class SocketIOClient: NSObject { return mutData } + func didConnect() { + self.connected = true + self.connecting = false + self.reconnecting = false + } + // Sends a message with multiple args // If a message contains binary we have to send those // seperately. @@ -821,7 +825,6 @@ class SocketIOClient: NSObject { // Called when the socket is closed func webSocket(webSocket:SRWebSocket!, didCloseWithCode code:Int, reason:String!, wasClean:Bool) { - self.pingTimer?.invalidate() self.connected = false self.connecting = false if self.closed || !self.reconnects { @@ -835,7 +838,6 @@ class SocketIOClient: NSObject { // Called when an error occurs. func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) { - self.pingTimer?.invalidate() self.connected = false self.connecting = false self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true)