Merge remote-tracking branch 'origin/socketio/swift-2' into more-tests
Conflicts: SocketIOClientSwift/SocketParser.swift
This commit is contained in:
commit
6f16694ed2
@ -9,7 +9,8 @@
|
|||||||
import XCTest
|
import XCTest
|
||||||
|
|
||||||
class AbstractSocketTest: XCTestCase {
|
class AbstractSocketTest: XCTestCase {
|
||||||
static let serverURL = "milkbartube.com:6979"
|
static let testLocal = false
|
||||||
|
static let serverURL = AbstractSocketTest.testLocal ? "localhost:6979" : "milkbartube.com:6979"
|
||||||
static let TEST_TIMEOUT = 8.0
|
static let TEST_TIMEOUT = 8.0
|
||||||
static var socket:SocketIOClient!
|
static var socket:SocketIOClient!
|
||||||
var testKind:TestKind?
|
var testKind:TestKind?
|
||||||
@ -22,6 +23,7 @@ class AbstractSocketTest: XCTestCase {
|
|||||||
XCTAssertTrue(AbstractSocketTest.socket.status == SocketIOClientStatus.NotConnected)
|
XCTAssertTrue(AbstractSocketTest.socket.status == SocketIOClientStatus.NotConnected)
|
||||||
AbstractSocketTest.socket.on("connect") {data, ack in
|
AbstractSocketTest.socket.on("connect") {data, ack in
|
||||||
XCTAssertEqual(AbstractSocketTest.socket.status, SocketIOClientStatus.Connected)
|
XCTAssertEqual(AbstractSocketTest.socket.status, SocketIOClientStatus.Connected)
|
||||||
|
XCTAssertFalse(AbstractSocketTest.socket.secure)
|
||||||
if let expection = expection {
|
if let expection = expection {
|
||||||
expection.fulfill()
|
expection.fulfill()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,8 @@ class SocketAcknowledgementTest: AbstractSocketTest {
|
|||||||
"forcePolling": false,
|
"forcePolling": false,
|
||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": ""])
|
"path": ""])
|
||||||
|
}else {
|
||||||
|
AbstractSocketTest.socket.leaveNamespace()
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
openConnection()
|
||||||
|
|||||||
@ -22,6 +22,8 @@ class SocketEmitTest: AbstractSocketTest {
|
|||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": ""]
|
"path": ""]
|
||||||
)
|
)
|
||||||
|
}else {
|
||||||
|
AbstractSocketTest.socket.leaveNamespace()
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
openConnection()
|
||||||
|
|||||||
@ -22,6 +22,8 @@ class SocketNamespaceAcknowledgementTest: AbstractSocketTest {
|
|||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": "",
|
"path": "",
|
||||||
"nsp": "/swift"])
|
"nsp": "/swift"])
|
||||||
|
}else {
|
||||||
|
AbstractSocketTest.socket.joinNamespace("/swift")
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
openConnection()
|
||||||
|
|||||||
@ -22,6 +22,8 @@ class SocketNamespaceEmitTest: AbstractSocketTest {
|
|||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": "",
|
"path": "",
|
||||||
"nsp": "/swift"])
|
"nsp": "/swift"])
|
||||||
|
}else {
|
||||||
|
AbstractSocketTest.socket.joinNamespace("/swift")
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
openConnection()
|
||||||
|
|||||||
@ -24,18 +24,17 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
public final class SocketEngine: NSObject, WebSocketDelegate {
|
||||||
public let logType = "SocketEngine"
|
|
||||||
|
|
||||||
private typealias Probe = (msg: String, type: PacketType, data: [NSData]?)
|
private typealias Probe = (msg: String, type: PacketType, data: [NSData]?)
|
||||||
private typealias ProbeWaitQueue = [Probe]
|
private typealias ProbeWaitQueue = [Probe]
|
||||||
|
|
||||||
private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet
|
private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet
|
||||||
private let workQueue = NSOperationQueue()
|
|
||||||
private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL)
|
private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
private let parseQueue = dispatch_queue_create("engineParseQueue", DISPATCH_QUEUE_SERIAL)
|
|
||||||
private let handleQueue = dispatch_queue_create("engineHandleQueue", DISPATCH_QUEUE_SERIAL)
|
private let handleQueue = dispatch_queue_create("engineHandleQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
|
private let logType = "SocketEngine"
|
||||||
|
private let parseQueue = dispatch_queue_create("engineParseQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
private let session: NSURLSession!
|
private let session: NSURLSession!
|
||||||
|
private let workQueue = NSOperationQueue()
|
||||||
|
|
||||||
private var closed = false
|
private var closed = false
|
||||||
private var extraHeaders: [String: String]?
|
private var extraHeaders: [String: String]?
|
||||||
@ -98,11 +97,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
Logger.log("Engine is being deinit", client: self, altType: nil)
|
Logger.log("Engine is being deinit", type: logType)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func close(fast fast: Bool) {
|
public func close(fast fast: Bool) {
|
||||||
Logger.log("Engine is being closed. Fast: %@", client: self, altType: nil, args: fast)
|
Logger.log("Engine is being closed. Fast: %@", type: logType, args: fast)
|
||||||
|
|
||||||
pingTimer?.invalidate()
|
pingTimer?.invalidate()
|
||||||
closed = true
|
closed = true
|
||||||
@ -199,8 +198,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
private func doFastUpgrade() {
|
private func doFastUpgrade() {
|
||||||
if waitingForPoll {
|
if waitingForPoll {
|
||||||
Logger.err("Outstanding poll when switched to WebSockets," +
|
Logger.error("Outstanding poll when switched to WebSockets," +
|
||||||
"we'll probably disconnect soon. You should report this.", client: self, altType: nil)
|
"we'll probably disconnect soon. You should report this.", type: logType)
|
||||||
}
|
}
|
||||||
|
|
||||||
sendWebSocketMessage("", withType: PacketType.Upgrade, datas: nil)
|
sendWebSocketMessage("", withType: PacketType.Upgrade, datas: nil)
|
||||||
@ -240,7 +239,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
req.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
|
req.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
|
||||||
|
|
||||||
Logger.log("Doing polling request", client: self, altType: nil)
|
Logger.log("Doing polling request", type: logType)
|
||||||
|
|
||||||
session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
||||||
if let this = self {
|
if let this = self {
|
||||||
@ -248,12 +247,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
if this.polling {
|
if this.polling {
|
||||||
this.handlePollingFailed(err?.localizedDescription ?? "Error")
|
this.handlePollingFailed(err?.localizedDescription ?? "Error")
|
||||||
} else {
|
} else {
|
||||||
Logger.err(err?.localizedDescription ?? "Error", client: this, altType: nil)
|
Logger.error(err?.localizedDescription ?? "Error", type: this.logType)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.log("Got polling response", client: this, altType: nil)
|
Logger.log("Got polling response", type: this.logType)
|
||||||
|
|
||||||
if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) as? String {
|
if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) as? String {
|
||||||
dispatch_async(this.parseQueue) {[weak this] in
|
dispatch_async(this.parseQueue) {[weak this] in
|
||||||
@ -272,7 +271,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func flushProbeWait() {
|
private func flushProbeWait() {
|
||||||
Logger.log("Flushing probe wait", client: self, altType: nil)
|
Logger.log("Flushing probe wait", type: logType)
|
||||||
|
|
||||||
dispatch_async(emitQueue) {[weak self] in
|
dispatch_async(emitQueue) {[weak self] in
|
||||||
if let this = self {
|
if let this = self {
|
||||||
@ -325,7 +324,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
waitingForPost = true
|
waitingForPost = true
|
||||||
|
|
||||||
Logger.log("POSTing: %@", client: self, altType: nil, args: postStr)
|
Logger.log("POSTing: %@", type: logType, args: postStr)
|
||||||
|
|
||||||
session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
||||||
if let this = self {
|
if let this = self {
|
||||||
@ -412,7 +411,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
Logger.err("Error parsing open packet", client: self, altType: nil)
|
Logger.error("Error parsing open packet", type: logType)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,14 +447,14 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
public func open(opts: [String: AnyObject]? = nil) {
|
public func open(opts: [String: AnyObject]? = nil) {
|
||||||
if connected {
|
if connected {
|
||||||
Logger.err("Tried to open while connected", client: self, altType: nil)
|
Logger.error("Tried to open while connected", type: logType)
|
||||||
client?.didError("Tried to open while connected")
|
client?.didError("Tried to open while connected")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.log("Starting engine", client: self, altType: nil)
|
Logger.log("Starting engine", type: logType)
|
||||||
Logger.log("Handshaking", client: self, altType: nil)
|
Logger.log("Handshaking", type: logType)
|
||||||
|
|
||||||
closed = false
|
closed = false
|
||||||
|
|
||||||
@ -512,7 +511,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
length += chr
|
length += chr
|
||||||
} else {
|
} else {
|
||||||
if length == "" || testLength(length, n: &n) {
|
if length == "" || testLength(length, n: &n) {
|
||||||
Logger.err("Parsing error: %@", client: self, altType: nil, args: str)
|
Logger.error("Parsing error: %@", type: logType, args: str)
|
||||||
handlePollingFailed("Error parsing XHR message")
|
handlePollingFailed("Error parsing XHR message")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -520,7 +519,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
msg = String(strArray[i+1...i+n])
|
msg = String(strArray[i+1...i+n])
|
||||||
|
|
||||||
if let lengthInt = Int(length) where lengthInt != msg.characters.count {
|
if let lengthInt = Int(length) where lengthInt != msg.characters.count {
|
||||||
Logger.err("Parsing error: %@", client: self, altType: nil, args: str)
|
Logger.error("Parsing error: %@", type: logType, args: str)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,7 +541,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func parseEngineMessage(var message: String, fromPolling: Bool) {
|
private func parseEngineMessage(var message: String, fromPolling: Bool) {
|
||||||
Logger.log("Got message: %@", client: self, altType: nil, args: message)
|
Logger.log("Got message: %@", type: logType, args: message)
|
||||||
|
|
||||||
if fromPolling {
|
if fromPolling {
|
||||||
fixDoubleUTF8(&message)
|
fixDoubleUTF8(&message)
|
||||||
@ -567,7 +566,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
case PacketType.Close:
|
case PacketType.Close:
|
||||||
handleClose()
|
handleClose()
|
||||||
default:
|
default:
|
||||||
Logger.log("Got unknown packet type", client: self, altType: nil)
|
Logger.log("Got unknown packet type", type: logType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -602,7 +601,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
/// Only call on emitQueue
|
/// Only call on emitQueue
|
||||||
private func sendPollMessage(var msg: String, withType type: PacketType,
|
private func sendPollMessage(var msg: String, withType type: PacketType,
|
||||||
datas:[NSData]? = nil) {
|
datas:[NSData]? = nil) {
|
||||||
Logger.log("Sending poll: %@ as type: %@", client: self, altType: nil, args: msg, type.rawValue)
|
Logger.log("Sending poll: %@ as type: %@", type: logType, args: msg, type.rawValue)
|
||||||
|
|
||||||
doubleEncodeUTF8(&msg)
|
doubleEncodeUTF8(&msg)
|
||||||
let strMsg = "\(type.rawValue)\(msg)"
|
let strMsg = "\(type.rawValue)\(msg)"
|
||||||
@ -626,7 +625,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
/// Only call on emitQueue
|
/// Only call on emitQueue
|
||||||
private func sendWebSocketMessage(str: String, withType type: PacketType,
|
private func sendWebSocketMessage(str: String, withType type: PacketType,
|
||||||
datas:[NSData]? = nil) {
|
datas:[NSData]? = nil) {
|
||||||
Logger.log("Sending ws: %@ as type: %@", client: self, altType: nil, args: str, type.rawValue)
|
Logger.log("Sending ws: %@ as type: %@", type: logType, args: str, type.rawValue)
|
||||||
|
|
||||||
ws?.writeString("\(type.rawValue)\(str)")
|
ws?.writeString("\(type.rawValue)\(str)")
|
||||||
|
|
||||||
@ -661,7 +660,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
|
|
||||||
private func upgradeTransport() {
|
private func upgradeTransport() {
|
||||||
if websocketConnected {
|
if websocketConnected {
|
||||||
Logger.log("Upgrading transport to WebSockets", client: self, altType: nil)
|
Logger.log("Upgrading transport to WebSockets", type: logType)
|
||||||
|
|
||||||
fastUpgrade = true
|
fastUpgrade = true
|
||||||
sendPollMessage("", withType: PacketType.Noop)
|
sendPollMessage("", withType: PacketType.Noop)
|
||||||
@ -676,12 +675,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
|
|||||||
dispatch_async(emitQueue) {[weak self] in
|
dispatch_async(emitQueue) {[weak self] in
|
||||||
if let this = self where this.connected {
|
if let this = self where this.connected {
|
||||||
if this.websocket {
|
if this.websocket {
|
||||||
Logger.log("Writing ws: %@ has data: %@", client: this, altType: nil,
|
Logger.log("Writing ws: %@ has data: %@", type: this.logType, args: msg,
|
||||||
args: msg, data == nil ? false : true)
|
data == nil ? false : true)
|
||||||
this.sendWebSocketMessage(msg, withType: type, datas: data)
|
this.sendWebSocketMessage(msg, withType: type, datas: data)
|
||||||
} else {
|
} else {
|
||||||
Logger.log("Writing poll: %@ has data: %@", client: this, altType: nil,
|
Logger.log("Writing poll: %@ has data: %@", type: this.logType, args: msg,
|
||||||
args: msg, data == nil ? false : true)
|
data == nil ? false : true)
|
||||||
this.sendPollMessage(msg, withType: type, datas: data)
|
this.sendPollMessage(msg, withType: type, datas: data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,21 +24,9 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient {
|
public final class SocketIOClient: NSObject, SocketEngineClient {
|
||||||
private var anyHandler: ((SocketAnyEvent) -> Void)?
|
|
||||||
private var currentReconnectAttempt = 0
|
|
||||||
private var handlers = ContiguousArray<SocketEventHandler>()
|
|
||||||
private var connectParams: [String: AnyObject]?
|
|
||||||
private var reconnectTimer: NSTimer?
|
|
||||||
|
|
||||||
let reconnectAttempts: Int!
|
|
||||||
var ackHandlers = SocketAckManager()
|
|
||||||
var currentAck = -1
|
|
||||||
var waitingData = [SocketPacket]()
|
|
||||||
|
|
||||||
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
|
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
public let handleQueue: dispatch_queue_t!
|
public let handleQueue: dispatch_queue_t!
|
||||||
public let logType = "SocketClient"
|
|
||||||
public let socketURL: String
|
public let socketURL: String
|
||||||
|
|
||||||
public private(set) var engine: SocketEngine?
|
public private(set) var engine: SocketEngine?
|
||||||
@ -53,6 +41,19 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
return engine?.sid
|
return engine?.sid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let logType = "SocketIOClient"
|
||||||
|
|
||||||
|
private var anyHandler: ((SocketAnyEvent) -> Void)?
|
||||||
|
private var currentReconnectAttempt = 0
|
||||||
|
private var handlers = ContiguousArray<SocketEventHandler>()
|
||||||
|
private var connectParams: [String: AnyObject]?
|
||||||
|
private var reconnectTimer: NSTimer?
|
||||||
|
|
||||||
|
let reconnectAttempts: Int!
|
||||||
|
var ackHandlers = SocketAckManager()
|
||||||
|
var currentAck = -1
|
||||||
|
var waitingData = [SocketPacket]()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create a new SocketIOClient. opts can be omitted
|
Create a new SocketIOClient. opts can be omitted
|
||||||
*/
|
*/
|
||||||
@ -107,12 +108,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
Logger.log("Client is being deinit", client: self, altType: nil)
|
Logger.log("Client is being deinit", type: logType)
|
||||||
engine?.close(fast: true)
|
engine?.close(fast: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func addEngine() {
|
private func addEngine() {
|
||||||
Logger.log("Adding engine", client: self, altType: nil)
|
Logger.log("Adding engine", type: logType)
|
||||||
|
|
||||||
engine = SocketEngine(client: self, opts: opts)
|
engine = SocketEngine(client: self, opts: opts)
|
||||||
}
|
}
|
||||||
@ -128,7 +129,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
Pass true to fast if you're closing from a background task
|
Pass true to fast if you're closing from a background task
|
||||||
*/
|
*/
|
||||||
public func close(fast fast: Bool) {
|
public func close(fast fast: Bool) {
|
||||||
Logger.log("Closing socket", client: self, altType: nil)
|
Logger.log("Closing socket", type: logType)
|
||||||
|
|
||||||
reconnects = false
|
reconnects = false
|
||||||
status = SocketIOClientStatus.Closed
|
status = SocketIOClientStatus.Closed
|
||||||
@ -152,7 +153,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
if status == SocketIOClientStatus.Closed {
|
if status == SocketIOClientStatus.Closed {
|
||||||
Logger.log("Warning! This socket was previously closed. This might be dangerous!",
|
Logger.log("Warning! This socket was previously closed. This might be dangerous!",
|
||||||
client: self, altType: nil)
|
type: logType)
|
||||||
}
|
}
|
||||||
|
|
||||||
status = SocketIOClientStatus.Connecting
|
status = SocketIOClientStatus.Connecting
|
||||||
@ -196,7 +197,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
func didConnect() {
|
func didConnect() {
|
||||||
Logger.log("Socket connected", client: self, altType: nil)
|
Logger.log("Socket connected", type: logType)
|
||||||
status = SocketIOClientStatus.Connected
|
status = SocketIOClientStatus.Connected
|
||||||
currentReconnectAttempt = 0
|
currentReconnectAttempt = 0
|
||||||
clearReconnectTimer()
|
clearReconnectTimer()
|
||||||
@ -211,7 +212,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.log("Disconnected: %@", client: self, altType: nil, args: reason)
|
Logger.log("Disconnected: %@", type: logType, args: reason)
|
||||||
|
|
||||||
status = SocketIOClientStatus.Closed
|
status = SocketIOClientStatus.Closed
|
||||||
|
|
||||||
@ -224,7 +225,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
|
|
||||||
/// error
|
/// error
|
||||||
public func didError(reason: AnyObject) {
|
public func didError(reason: AnyObject) {
|
||||||
Logger.err("%@", client: self, altType: nil, args: reason)
|
Logger.error("%@", type: logType, args: reason)
|
||||||
|
|
||||||
handleEvent("error", data: reason as? [AnyObject] ?? [reason],
|
handleEvent("error", data: reason as? [AnyObject] ?? [reason],
|
||||||
isInternalMessage: true)
|
isInternalMessage: true)
|
||||||
@ -280,7 +281,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false)
|
let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false)
|
||||||
let str = packet.packetString
|
let str = packet.packetString
|
||||||
|
|
||||||
Logger.log("Emitting: %@", client: self, altType: nil, args: str)
|
Logger.log("Emitting: %@", type: logType, args: str)
|
||||||
|
|
||||||
if packet.type == SocketPacket.PacketType.BinaryEvent {
|
if packet.type == SocketPacket.PacketType.BinaryEvent {
|
||||||
engine?.send(str, withData: packet.binary)
|
engine?.send(str, withData: packet.binary)
|
||||||
@ -296,7 +297,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true)
|
let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true)
|
||||||
let str = packet.packetString
|
let str = packet.packetString
|
||||||
|
|
||||||
Logger.log("Emitting Ack: %@", client: this, altType: nil, args: str)
|
Logger.log("Emitting Ack: %@", type: this.logType, args: str)
|
||||||
|
|
||||||
if packet.type == SocketPacket.PacketType.BinaryAck {
|
if packet.type == SocketPacket.PacketType.BinaryAck {
|
||||||
this.engine?.send(str, withData: packet.binary)
|
this.engine?.send(str, withData: packet.binary)
|
||||||
@ -322,8 +323,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
|
|
||||||
// Called when the socket gets an ack for something it sent
|
// Called when the socket gets an ack for something it sent
|
||||||
func handleAck(ack: Int, data: AnyObject?) {
|
func handleAck(ack: Int, data: AnyObject?) {
|
||||||
Logger.log("Handling ack: %@ with data: %@", client: self,
|
Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "")
|
||||||
altType: nil, args: ack, data ?? "")
|
|
||||||
|
|
||||||
ackHandlers.executeAck(ack,
|
ackHandlers.executeAck(ack,
|
||||||
items: (data as? [AnyObject]?) ?? (data != nil ? [data!] : nil))
|
items: (data as? [AnyObject]?) ?? (data != nil ? [data!] : nil))
|
||||||
@ -339,8 +339,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
}
|
}
|
||||||
// println("Should do event: \(event) with data: \(data)")
|
// println("Should do event: \(event) with data: \(data)")
|
||||||
|
|
||||||
Logger.log("Handling event: %@ with data: %@", client: self,
|
Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "")
|
||||||
altType: nil, args: event, data ?? "")
|
|
||||||
|
|
||||||
if anyHandler != nil {
|
if anyHandler != nil {
|
||||||
dispatch_async(handleQueue) {[weak self] in
|
dispatch_async(handleQueue) {[weak self] in
|
||||||
@ -375,7 +374,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
Joins nsp if it is not /
|
Joins nsp if it is not /
|
||||||
*/
|
*/
|
||||||
public func joinNamespace() {
|
public func joinNamespace() {
|
||||||
Logger.log("Joining namespace", client: self, altType: nil)
|
Logger.log("Joining namespace", type: logType)
|
||||||
|
|
||||||
if nsp != "/" {
|
if nsp != "/" {
|
||||||
engine?.send("0\(nsp)", withData: nil)
|
engine?.send("0\(nsp)", withData: nil)
|
||||||
@ -394,7 +393,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
Removes handler(s)
|
Removes handler(s)
|
||||||
*/
|
*/
|
||||||
public func off(event: String) {
|
public func off(event: String) {
|
||||||
Logger.log("Removing handler for event: %@", client: self, altType: nil, args: event)
|
Logger.log("Removing handler for event: %@", type: logType, args: event)
|
||||||
|
|
||||||
handlers = ContiguousArray(handlers.filter {!($0.event == event)})
|
handlers = ContiguousArray(handlers.filter {!($0.event == event)})
|
||||||
}
|
}
|
||||||
@ -403,7 +402,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
Adds a handler for an event.
|
Adds a handler for an event.
|
||||||
*/
|
*/
|
||||||
public func on(event: String, callback: NormalCallback) {
|
public func on(event: String, callback: NormalCallback) {
|
||||||
Logger.log("Adding handler for event: %@", client: self, altType: nil, args: event)
|
Logger.log("Adding handler for event: %@", type: logType, args: event)
|
||||||
|
|
||||||
let handler = SocketEventHandler(event: event, callback: callback)
|
let handler = SocketEventHandler(event: event, callback: callback)
|
||||||
handlers.append(handler)
|
handlers.append(handler)
|
||||||
@ -413,7 +412,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
Adds a handler for an event.
|
Adds a handler for an event.
|
||||||
*/
|
*/
|
||||||
public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) {
|
public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) {
|
||||||
Logger.log("Adding handler for event: %@", client: self, altType: nil, args: event)
|
Logger.log("Adding handler for event: %@", type: logType, args: event)
|
||||||
|
|
||||||
let handler = SocketEventHandler(event: event, callback: callback)
|
let handler = SocketEventHandler(event: event, callback: callback)
|
||||||
handlers.append(handler)
|
handlers.append(handler)
|
||||||
@ -467,7 +466,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
|
|
||||||
private func tryReconnect() {
|
private func tryReconnect() {
|
||||||
if reconnectTimer == nil {
|
if reconnectTimer == nil {
|
||||||
Logger.log("Starting reconnect", client: self, altType: nil)
|
Logger.log("Starting reconnect", type: logType)
|
||||||
|
|
||||||
status = SocketIOClientStatus.Reconnecting
|
status = SocketIOClientStatus.Reconnecting
|
||||||
|
|
||||||
@ -495,7 +494,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.log("Trying to reconnect", client: self, altType: nil)
|
Logger.log("Trying to reconnect", type: logType)
|
||||||
handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt],
|
handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt],
|
||||||
isInternalMessage: true)
|
isInternalMessage: true)
|
||||||
|
|
||||||
|
|||||||
@ -26,24 +26,18 @@ import Foundation
|
|||||||
|
|
||||||
@objc public enum SocketIOClientStatus: Int, CustomStringConvertible {
|
@objc public enum SocketIOClientStatus: Int, CustomStringConvertible {
|
||||||
public var description: String {
|
public var description: String {
|
||||||
let des: String
|
switch self {
|
||||||
|
case NotConnected:
|
||||||
switch rawValue {
|
return "Not Connected"
|
||||||
case 0:
|
case Closed:
|
||||||
des = "Not Connected"
|
return "Closed"
|
||||||
case 1:
|
case Connecting:
|
||||||
des = "Closed"
|
return "Connecting"
|
||||||
case 2:
|
case Connected:
|
||||||
des = "Connecting"
|
return "Connected"
|
||||||
case 3:
|
case Reconnecting:
|
||||||
des = "Connected"
|
return "Reconnecting"
|
||||||
case 4:
|
|
||||||
des = "Reconnecting"
|
|
||||||
default:
|
|
||||||
des = "Unknown State"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return des
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case NotConnected, Closed, Connecting, Connected, Reconnecting
|
case NotConnected, Closed, Connecting, Connected, Reconnecting
|
||||||
|
|||||||
@ -26,43 +26,34 @@ import Foundation
|
|||||||
|
|
||||||
var Logger: SocketLogger = DefaultSocketLogger()
|
var Logger: SocketLogger = DefaultSocketLogger()
|
||||||
|
|
||||||
public protocol SocketLogClient {
|
|
||||||
/// The type of object being logged
|
|
||||||
var logType: String {get}
|
|
||||||
}
|
|
||||||
|
|
||||||
public protocol SocketLogger {
|
public protocol SocketLogger {
|
||||||
/// Whether to log or not
|
/// Whether to log or not
|
||||||
var log: Bool {get set}
|
var log: Bool {get set}
|
||||||
|
|
||||||
/// Normal log messages
|
/// Normal log messages
|
||||||
func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...)
|
func log(message: String, type: String, args: AnyObject...)
|
||||||
|
|
||||||
/// Error Messages
|
/// Error Messages
|
||||||
func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...)
|
func error(message: String, type: String, args: AnyObject...)
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension SocketLogger {
|
public extension SocketLogger {
|
||||||
func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) {
|
func log(message: String, type: String, args: AnyObject...) {
|
||||||
if !log {
|
abstractLog("Log", message: message, type: type, args: args)
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let newArgs = args.map {arg -> CVarArgType in String(arg)}
|
|
||||||
let replaced = String(format: message, arguments: newArgs)
|
|
||||||
|
|
||||||
NSLog("%@: %@", altType ?? client.logType, replaced)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) {
|
func error(message: String, type: String, args: AnyObject...) {
|
||||||
if !log {
|
abstractLog("ERROR", message: message, type: type, args: args)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 -> CVarArgType in String(arg)}
|
||||||
let replaced = String(format: message, arguments: newArgs)
|
let replaced = String(format: message, arguments: newArgs)
|
||||||
|
|
||||||
NSLog("ERROR %@: %@", altType ?? client.logType, replaced)
|
NSLog("%@ %@: %@", logType, type, replaced)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -168,14 +168,14 @@ class SocketParser {
|
|||||||
static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) {
|
static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) {
|
||||||
guard !stringMessage.isEmpty else { return }
|
guard !stringMessage.isEmpty else { return }
|
||||||
|
|
||||||
Logger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage)
|
Logger.log("Parsing %@", type: "SocketParser", args: stringMessage)
|
||||||
|
|
||||||
guard let pack = parseString(stringMessage) else {
|
guard let pack = parseString(stringMessage) else {
|
||||||
socket.didError("Error parsing packet")
|
socket.didError("Error parsing packet")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: pack.description)
|
Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description)
|
||||||
|
|
||||||
switch pack.type {
|
switch pack.type {
|
||||||
case .Event:
|
case .Event:
|
||||||
@ -197,7 +197,7 @@ class SocketParser {
|
|||||||
|
|
||||||
static func parseBinaryData(data: NSData, socket: SocketIOClient) {
|
static func parseBinaryData(data: NSData, socket: SocketIOClient) {
|
||||||
if socket.waitingData.count == 0 {
|
if socket.waitingData.count == 0 {
|
||||||
Logger.err("Got data when not remaking packet", client: socket, altType: "SocketParser")
|
Logger.error("Got data when not remaking packet", type: "SocketParser")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user