This commit is contained in:
Erik 2015-01-18 12:09:15 -05:00
parent 939273736c
commit 0fef6d88a1

View File

@ -34,7 +34,7 @@ private class EventHandler: NSObject {
} }
func executeCallback(args:AnyObject?) { func executeCallback(args:AnyObject?) {
if (args != nil) { if args != nil {
callback(data: args!) callback(data: args!)
} else { } else {
callback(data: nil) callback(data: nil)
@ -57,8 +57,9 @@ private class Event {
func createMessage() -> String { func createMessage() -> String {
var array = "42[" var array = "42["
array += "\"" + event + "\"" array += "\"" + event + "\""
if (args? != nil) {
if (args is NSDictionary) { if args? != nil {
if args is NSDictionary {
array += "," array += ","
var jsonSendError:NSError? var jsonSendError:NSError?
var jsonSend = NSJSONSerialization.dataWithJSONObject(args as NSDictionary, var jsonSend = NSJSONSerialization.dataWithJSONObject(args as NSDictionary,
@ -77,8 +78,8 @@ private class Event {
func createBinaryMessage() -> String { func createBinaryMessage() -> String {
var array = "45\(self.placeholders)-[" var array = "45\(self.placeholders)-["
array += "\"" + event + "\"" array += "\"" + event + "\""
if (args? != nil) { if args? != nil {
if (args is NSDictionary) { if args is NSDictionary {
array += "," array += ","
var jsonSendError:NSError? var jsonSendError:NSError?
var jsonSend = NSJSONSerialization.dataWithJSONObject(args as NSDictionary, var jsonSend = NSJSONSerialization.dataWithJSONObject(args as NSDictionary,
@ -96,14 +97,14 @@ private class Event {
func fillInPlaceHolder(data:NSData) -> Bool { func fillInPlaceHolder(data:NSData) -> Bool {
func checkDoEvent() -> Bool { func checkDoEvent() -> Bool {
if (self.placeholders == self.currentPlace) { if self.placeholders == self.currentPlace {
return true return true
} else { } else {
return false return false
} }
} }
if (checkDoEvent()) { if checkDoEvent() {
return true return true
} }
@ -137,7 +138,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
super.init() super.init()
var mutURL = RegexMutable(socketURL) var mutURL = RegexMutable(socketURL)
if (mutURL["https://"].matches().count != 0) { if mutURL["https://"].matches().count != 0 {
self.secure = true self.secure = true
} else { } else {
self.secure = false self.secure = false
@ -147,7 +148,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
self.socketURL = mutURL self.socketURL = mutURL
// Set options // Set options
if (opts != nil) { if opts != nil {
if let reconnects = opts!["reconnects"] as? Bool { if let reconnects = opts!["reconnects"] as? Bool {
self.reconnnects = reconnects self.reconnnects = reconnects
} }
@ -175,11 +176,13 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
func connect() { func connect() {
self.connecting = true self.connecting = true
var endpoint:String! var endpoint:String!
if (self.secure!) {
if self.secure! {
endpoint = "wss://\(self.socketURL)/socket.io/?EIO=2&transport=websocket" endpoint = "wss://\(self.socketURL)/socket.io/?EIO=2&transport=websocket"
} else { } else {
endpoint = "ws://\(self.socketURL)/socket.io/?EIO=2&transport=websocket" endpoint = "ws://\(self.socketURL)/socket.io/?EIO=2&transport=websocket"
} }
self.io = SRWebSocket(URL: NSURL(string: endpoint)) self.io = SRWebSocket(URL: NSURL(string: endpoint))
self.io?.delegate = self self.io?.delegate = self
self.io?.open() self.io?.open()
@ -196,23 +199,26 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
// Sends a message // Sends a message
func emit(event:String, args:AnyObject? = nil) { func emit(event:String, args:AnyObject? = nil) {
if (!self.connected) { if !self.connected {
return return
} }
var frame:Event! var frame:Event!
var str:String! var str:String!
if let dict = args as? NSDictionary { if let dict = args as? NSDictionary {
// Check for binary data // Check for binary data
let (newDict, hadBinary, binaryDatas) = self.parseNSDictionary(dict: dict) let (newDict, hadBinary, binaryDatas) = self.parseNSDictionary(dict: dict)
if (hadBinary) { if hadBinary {
frame = Event(event: event, args: newDict, placeholders: binaryDatas!.count) frame = Event(event: event, args: newDict, placeholders: binaryDatas!.count)
str = frame.createBinaryMessage() str = frame.createBinaryMessage()
self.io?.send(str) self.io?.send(str)
for data in binaryDatas! { for data in binaryDatas! {
let sendData = self.createBinaryDataForSend(data) let sendData = self.createBinaryDataForSend(data)
self.io?.send(sendData) self.io?.send(sendData)
} }
return return
} }
} else if let binaryData = args as? NSData { } else if let binaryData = args as? NSData {
@ -222,6 +228,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
self.io?.send(str) self.io?.send(str)
let sendData = self.createBinaryDataForSend(binaryData) let sendData = self.createBinaryDataForSend(binaryData)
self.io?.send(sendData) self.io?.send(sendData)
return return
} }
@ -237,11 +244,12 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
// println("Should do event: \(event) with data: \(data)") // println("Should do event: \(event) with data: \(data)")
// data = parseData(data as? String) // data = parseData(data as? String)
for handler in self.handlers { for handler in self.handlers {
if (handler.event == event) { if handler.event == event {
if (data == nil) { if data == nil {
handler.executeCallback(nil) handler.executeCallback(nil)
continue continue
} }
handler.executeCallback(data) handler.executeCallback(data)
} }
} }
@ -260,15 +268,16 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
// Parses data for events // Parses data for events
private func parseData(data:String?) -> AnyObject? { private func parseData(data:String?) -> AnyObject? {
if (data == nil) { if data == nil {
return nil return nil
} }
var err:NSError?
var err:NSError?
let stringData = data!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) let stringData = data!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!, let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!,
options: NSJSONReadingOptions.AllowFragments, error: &err) options: NSJSONReadingOptions.AllowFragments, error: &err)
if (err != nil) {
if err != nil {
// println(err) // println(err)
return nil return nil
} }
@ -292,7 +301,8 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
returnDict[key as String] = value returnDict[key as String] = value
} }
} }
if (containedData) {
if containedData {
return (returnDict, true, returnDatas) return (returnDict, true, returnDatas)
} else { } else {
return (returnDict, false, nil) return (returnDict, false, nil)
@ -301,7 +311,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
// Parses messages recieved // Parses messages recieved
private func parseSocketMessage(#message:AnyObject?) { private func parseSocketMessage(#message:AnyObject?) {
if (message == nil) { if message == nil {
return return
} }
@ -314,10 +324,11 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
var mutMessage = RegexMutable(stringMessage) var mutMessage = RegexMutable(stringMessage)
var setup:String! var setup:String!
let messageData = mutMessage["(\\d*)(\\{.*\\})?"].groups() let messageData = mutMessage["(\\d*)(\\{.*\\})?"].groups()
if (messageData != nil && messageData[1] == "0") { if messageData != nil && messageData[1] == "0" {
setup = messageData[2] setup = messageData[2]
let data = setup.dataUsingEncoding(NSUTF8StringEncoding)! let data = setup.dataUsingEncoding(NSUTF8StringEncoding)!
var jsonError:NSError? var jsonError:NSError?
if let json:AnyObject? = NSJSONSerialization.JSONObjectWithData(data, if let json:AnyObject? = NSJSONSerialization.JSONObjectWithData(data,
options: nil, error: &jsonError) { options: nil, error: &jsonError) {
self.startPingTimer(interval: (json!["pingInterval"] as Int) / 1000) self.startPingTimer(interval: (json!["pingInterval"] as Int) / 1000)
@ -332,13 +343,14 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
Begin check for message Begin check for message
**/ **/
let messageGroups = mutMessage["(\\d*)(\\[.*\\])?"].groups() let messageGroups = mutMessage["(\\d*)(\\[.*\\])?"].groups()
if (messageGroups.count == 3 && messageGroups[1] == "42") { if messageGroups.count == 3 && messageGroups[1] == "42" {
let messagePart = messageGroups[2] let messagePart = messageGroups[2]
let messageInternals = RegexMutable(messagePart)["\\[\"(.*?)\",(.*?)?\\]$"].groups() let messageInternals = RegexMutable(messagePart)["\\[\"(.*?)\",(.*?)?\\]$"].groups()
if (messageInternals != nil && messageInternals.count > 2) { if messageInternals != nil && messageInternals.count > 2 {
let event = messageInternals[1] let event = messageInternals[1]
var data:String? var data:String?
if (messageInternals[2] == "") {
if messageInternals[2] == "" {
data = nil data = nil
} else { } else {
data = messageInternals[2] data = messageInternals[2]
@ -371,12 +383,14 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
func parseBinaryMessage(#message:AnyObject) { func parseBinaryMessage(#message:AnyObject) {
if let stringMessage = message as? String { if let stringMessage = message as? String {
var mutMessage = RegexMutable(stringMessage) var mutMessage = RegexMutable(stringMessage)
/** /**
Begin check for binary placeholder Begin check for binary placeholder
**/ **/
let binaryGroup = mutMessage["(\\d*)-\\[\"(.*)\",(\\{.*\\})\\]$"].groups() let binaryGroup = mutMessage["(\\d*)-\\[\"(.*)\",(\\{.*\\})\\]$"].groups()
// println(binaryGroup) // println(binaryGroup)
if (binaryGroup != nil) { if binaryGroup != nil {
let messageType = RegexMutable(binaryGroup[1]) let messageType = RegexMutable(binaryGroup[1])
let numberOfPlaceholders = messageType["45"] ~= "" let numberOfPlaceholders = messageType["45"] ~= ""
let event = binaryGroup[2] let event = binaryGroup[2]
@ -395,7 +409,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
// Handles binary data // Handles binary data
func parseBinaryData(data:NSData) { func parseBinaryData(data:NSData) {
if (self.lastSocketMessage == nil) { if self.lastSocketMessage == nil {
return return
} }
@ -403,14 +417,14 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
var event = self.lastSocketMessage!.event var event = self.lastSocketMessage!.event
var args:AnyObject? = self.parseData(self.lastSocketMessage!.args as? String) var args:AnyObject? = self.parseData(self.lastSocketMessage!.args as? String)
if (shouldExecute != nil && shouldExecute!) { if shouldExecute != nil && shouldExecute! {
self.handleEvent(event: event, data: args) self.handleEvent(event: event, data: args)
} }
} }
// Sends ping // Sends ping
func sendPing() { func sendPing() {
if (self.connected) { if self.connected {
self.io?.send("2") self.io?.send("2")
} }
} }
@ -423,13 +437,13 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
// We lost connection and should attempt to reestablish // We lost connection and should attempt to reestablish
private func tryReconnect(var #triesLeft:Int) { private func tryReconnect(var #triesLeft:Int) {
if (triesLeft != -1 && triesLeft <= 0) { if triesLeft != -1 && triesLeft <= 0 {
self.connecting = false self.connecting = false
self.reconnnects = false self.reconnnects = false
self.reconnecting = false self.reconnecting = false
self.handleEvent(event: "disconnect", data: "Failed to reconnect") self.handleEvent(event: "disconnect", data: "Failed to reconnect")
return return
} else if (self.connected) { } else if self.connected {
self.connecting = false self.connecting = false
self.reconnecting = false self.reconnecting = false
return return
@ -443,11 +457,11 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
// Wait reconnectWait seconds and then check if connected. Repeat if not // Wait reconnectWait seconds and then check if connected. Repeat if not
dispatch_after(time, dispatch_get_main_queue()) {[weak self] in dispatch_after(time, dispatch_get_main_queue()) {[weak self] in
if (self == nil || self!.connected) { if self == nil || self!.connected {
return return
} }
if (triesLeft != -1) { if triesLeft != -1 {
triesLeft = triesLeft - 1 triesLeft = triesLeft - 1
} }
@ -476,7 +490,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.connected = false self.connected = false
self.connecting = false self.connecting = false
if (!self.reconnnects) { if !self.reconnnects {
self.handleEvent(event: "disconnect", data: reason) self.handleEvent(event: "disconnect", data: reason)
} else { } else {
self.handleEvent(event: "reconnect", data: reason) self.handleEvent(event: "reconnect", data: reason)
@ -489,9 +503,9 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.connected = false self.connected = false
self.connecting = false self.connecting = false
if (!self.reconnnects) { if !self.reconnnects {
self.handleEvent(event: "disconnect", data: error.localizedDescription) self.handleEvent(event: "disconnect", data: error.localizedDescription)
} else if (!self.reconnecting) { } else if !self.reconnecting {
self.handleEvent(event: "reconnect", data: error.localizedDescription) self.handleEvent(event: "reconnect", data: error.localizedDescription)
self.tryReconnect(triesLeft: self.reconnectAttempts) self.tryReconnect(triesLeft: self.reconnectAttempts)
} }