From 5b9537065ff934a4532e73c29adba8fbeb9a4159 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 24 Feb 2015 12:59:56 -0500 Subject: [PATCH] #15 add connectWithParams --- README.md | 1 + SwiftIO/SocketIOClient.swift | 55 +++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e227647..1bf447c 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Methods 3. `socket.emit(event:String, args:AnyObject...)` - Sends a message. Can send multiple args. 4. `socket.emitWithAck(event:String, args:AnyObject...) -> SocketAckHandler` - Sends a message that requests an acknoweldgement from the server. Returns a SocketAckHandler which you can use to add an onAck handler. See example. 5. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. +6. `socket.connectWithParams` - Establishes a connection to the server, passing the specified params. A "connect" event is fired upon successful connection. 6. `socket.close()` - Closes the socket. Once a socket is closed it should not be reopened. Events diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 2aa1197..214c30e 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -32,10 +32,12 @@ class SocketIOClient: NSObject, SRWebSocketDelegate { DISPATCH_QUEUE_SERIAL) let emitQueue = dispatch_queue_create("emitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) + private lazy var params:[String: AnyObject] = [String: AnyObject]() private var ackHandlers = [SocketAckHandler]() private var currentAck = -1 private var handlers = [SocketEventHandler]() private var lastSocketMessage:SocketEvent? + private var paramConnect = false private var pingTimer:NSTimer! private var secure = false var closed = false @@ -92,21 +94,41 @@ class SocketIOClient: NSObject, SRWebSocketDelegate { // Connects to the server func connect() { + self.connectWithURL(self.createConnectURL()) + } + + // Connect to the server using params + func connectWithParams(params:[String: AnyObject]) { + self.params = params + self.paramConnect = true + var endpoint = self.createConnectURL() + + for (key, value) in params { + let keyEsc = key.stringByAddingPercentEncodingWithAllowedCharacters( + NSCharacterSet.URLHostAllowedCharacterSet())! + endpoint += "&\(keyEsc)=" + + if value is String { + let valueEsc = (value as! String).stringByAddingPercentEncodingWithAllowedCharacters( + NSCharacterSet.URLHostAllowedCharacterSet())! + endpoint += "\(valueEsc)" + } else { + endpoint += "\(value)" + } + } + + self.connectWithURL(endpoint) + } + + private func connectWithURL(url:String) { if self.closed { println("Warning: This socket was previvously closed. Reopening could be dangerous. Be careful.") } self.connecting = true self.closed = false - var endpoint:String - if self.secure { - endpoint = "wss://\(self.socketURL)/socket.io/?transport=websocket" - } else { - endpoint = "ws://\(self.socketURL)/socket.io/?transport=websocket" - } - - self.io = SRWebSocket(URL: NSURL(string: endpoint)) + self.io = SRWebSocket(URL: NSURL(string: url)) self.io?.delegate = self self.io?.open() } @@ -120,6 +142,14 @@ class SocketIOClient: NSObject, SRWebSocketDelegate { return mutData } + private func createConnectURL() -> String { + if self.secure { + return "wss://\(self.socketURL)/socket.io/?transport=websocket" + } else { + return "ws://\(self.socketURL)/socket.io/?transport=websocket" + } + } + // Sends a message with multiple args // If a message contains binary we have to send those // seperately. @@ -286,7 +316,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate { } } - // Adds handler for single arg message + // Adds handler for an event func on(name:String, callback:NormalCallback) { let handler = SocketEventHandler(event: name, callback: callback) self.handlers.append(handler) @@ -794,7 +824,12 @@ class SocketIOClient: NSObject, SRWebSocketDelegate { self!.tryReconnect(triesLeft: triesLeft) } self.reconnecting = true - self.connect() + + if self.paramConnect { + self.connectWithParams(self.params) + } else { + self.connect() + } } // Called when a message is recieved