Merge pull request #170 from NachoSoto/swift2-comments
Code improvements to Swift 2 branch
This commit is contained in:
commit
17444dd4a3
@ -350,8 +350,10 @@ public final class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
// We had packets waiting for send when we upgraded
|
// We had packets waiting for send when we upgraded
|
||||||
// Send them raw
|
// Send them raw
|
||||||
private func flushWaitingForPostToWebSocket() {
|
private func flushWaitingForPostToWebSocket() {
|
||||||
|
if let ws = ws {
|
||||||
for msg in postWait {
|
for msg in postWait {
|
||||||
ws?.writeString(msg)
|
ws.writeString(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
postWait.removeAll(keepCapacity: true)
|
postWait.removeAll(keepCapacity: true)
|
||||||
@ -495,7 +497,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
var n = 0
|
var n = 0
|
||||||
var msg = ""
|
var msg = ""
|
||||||
|
|
||||||
func testLength(length:String, inout n:Int) -> Bool {
|
func testLength(length: String, inout n: Int) -> Bool {
|
||||||
if let num = Int(length) {
|
if let num = Int(length) {
|
||||||
n = num
|
n = num
|
||||||
return false
|
return false
|
||||||
@ -525,8 +527,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
|
|
||||||
if msg.characters.count != 0 {
|
if msg.characters.count != 0 {
|
||||||
// Be sure to capture the value of the msg
|
// Be sure to capture the value of the msg
|
||||||
dispatch_async(handleQueue) {[weak self, msg] in
|
dispatch_async(handleQueue) {
|
||||||
self?.parseEngineMessage(msg, fromPolling: true)
|
self.parseEngineMessage(msg, fromPolling: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -549,7 +551,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
|
|
||||||
let type = PacketType(str: (message["^(\\d)"].groups()?[1]) ?? "") ?? {
|
let type = PacketType(str: (message["^(\\d)"].groups()?[1]) ?? "") ?? {
|
||||||
self.checkIfMessageIsBase64Binary(message)
|
self.checkIfMessageIsBase64Binary(message)
|
||||||
return PacketType.Noop
|
return .Noop
|
||||||
}()
|
}()
|
||||||
|
|
||||||
switch type {
|
switch type {
|
||||||
@ -608,13 +610,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
|
|
||||||
postWait.append(strMsg)
|
postWait.append(strMsg)
|
||||||
|
|
||||||
if let datas = datas {
|
for data in datas ?? [] {
|
||||||
for data in datas {
|
|
||||||
let (_, b64Data) = createBinaryDataForSend(data)
|
let (_, b64Data) = createBinaryDataForSend(data)
|
||||||
|
|
||||||
postWait.append(b64Data!)
|
postWait.append(b64Data!)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if !waitingForPost {
|
if !waitingForPost {
|
||||||
flushWaitingForPost()
|
flushWaitingForPost()
|
||||||
@ -629,26 +629,22 @@ public final class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
|
|
||||||
ws?.writeString("\(type.rawValue)\(str)")
|
ws?.writeString("\(type.rawValue)\(str)")
|
||||||
|
|
||||||
if let datas = datas {
|
for data in datas ?? [] {
|
||||||
for data in datas {
|
|
||||||
let (data, _) = createBinaryDataForSend(data)
|
let (data, _) = createBinaryDataForSend(data)
|
||||||
if data != nil {
|
if data != nil {
|
||||||
ws?.writeData(data!)
|
ws?.writeData(data!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Starts the ping timer
|
// Starts the ping timer
|
||||||
private func startPingTimer() {
|
private func startPingTimer() {
|
||||||
guard pingInterval != nil else {
|
if let pingInterval = pingInterval {
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
pingTimer?.invalidate()
|
pingTimer?.invalidate()
|
||||||
dispatch_async(dispatch_get_main_queue()) {[weak self] in
|
pingTimer = nil
|
||||||
if let this = self {
|
|
||||||
this.pingTimer = NSTimer.scheduledTimerWithTimeInterval(this.pingInterval!, target: this,
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
|
self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(pingInterval, target: self,
|
||||||
selector: Selector("sendPing"), userInfo: nil, repeats: true)
|
selector: Selector("sendPing"), userInfo: nil, repeats: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -672,16 +668,16 @@ public final class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
Write a message, independent of transport.
|
Write a message, independent of transport.
|
||||||
*/
|
*/
|
||||||
public func write(msg: String, withType type: PacketType, withData data: [NSData]?) {
|
public func write(msg: String, withType type: PacketType, withData data: [NSData]?) {
|
||||||
dispatch_async(emitQueue) {[weak self] in
|
dispatch_async(emitQueue) {
|
||||||
if let this = self where this.connected {
|
if self.connected {
|
||||||
if this.websocket {
|
if self.websocket {
|
||||||
Logger.log("Writing ws: %@ has data: %@", type: this.logType, args: msg,
|
Logger.log("Writing ws: %@ has data: %@", type: self.logType, args: msg,
|
||||||
data == nil ? false : true)
|
data == nil ? false : true)
|
||||||
this.sendWebSocketMessage(msg, withType: type, datas: data)
|
self.sendWebSocketMessage(msg, withType: type, datas: data)
|
||||||
} else {
|
} else {
|
||||||
Logger.log("Writing poll: %@ has data: %@", type: this.logType, args: msg,
|
Logger.log("Writing poll: %@ has data: %@", type: self.logType, args: msg,
|
||||||
data == nil ? false : true)
|
data == nil ? false : true)
|
||||||
this.sendPollMessage(msg, withType: type, datas: data)
|
self.sendPollMessage(msg, withType: type, datas: data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,8 +25,9 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public final class SocketIOClient: NSObject, SocketEngineClient {
|
public final class SocketIOClient: NSObject, SocketEngineClient {
|
||||||
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
|
private let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
|
||||||
public let handleQueue: dispatch_queue_t!
|
private let handleQueue: dispatch_queue_t!
|
||||||
|
|
||||||
public let socketURL: String
|
public let socketURL: String
|
||||||
|
|
||||||
public private(set) var engine: SocketEngine?
|
public private(set) var engine: SocketEngine?
|
||||||
@ -49,10 +50,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
private var connectParams: [String: AnyObject]?
|
private var connectParams: [String: AnyObject]?
|
||||||
private var reconnectTimer: NSTimer?
|
private var reconnectTimer: NSTimer?
|
||||||
|
|
||||||
let reconnectAttempts: Int!
|
private let reconnectAttempts: Int!
|
||||||
var ackHandlers = SocketAckManager()
|
private var ackHandlers = SocketAckManager()
|
||||||
var currentAck = -1
|
private var currentAck = -1
|
||||||
var waitingData = [SocketPacket]()
|
|
||||||
|
internal var waitingData = [SocketPacket]()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create a new SocketIOClient. opts can be omitted
|
Create a new SocketIOClient. opts can be omitted
|
||||||
@ -112,10 +114,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
engine?.close(fast: true)
|
engine?.close(fast: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func addEngine() {
|
private func addEngine() -> SocketEngine {
|
||||||
Logger.log("Adding engine", type: logType)
|
Logger.log("Adding engine", type: logType)
|
||||||
|
|
||||||
engine = SocketEngine(client: self, opts: opts)
|
let newEngine = SocketEngine(client: self, opts: opts)
|
||||||
|
|
||||||
|
engine = newEngine
|
||||||
|
return newEngine
|
||||||
}
|
}
|
||||||
|
|
||||||
private func clearReconnectTimer() {
|
private func clearReconnectTimer() {
|
||||||
@ -148,17 +153,19 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
*/
|
*/
|
||||||
public func connect(timeoutAfter timeoutAfter:Int,
|
public func connect(timeoutAfter timeoutAfter:Int,
|
||||||
withTimeoutHandler handler:(() -> Void)?) {
|
withTimeoutHandler handler:(() -> Void)?) {
|
||||||
guard status != SocketIOClientStatus.Connected else {
|
assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)")
|
||||||
|
|
||||||
|
guard status != .Connected else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if status == SocketIOClientStatus.Closed {
|
|
||||||
|
if status == .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!",
|
||||||
type: logType)
|
type: logType)
|
||||||
}
|
}
|
||||||
|
|
||||||
status = SocketIOClientStatus.Connecting
|
status = SocketIOClientStatus.Connecting
|
||||||
addEngine()
|
addEngine().open(connectParams)
|
||||||
engine?.open(connectParams)
|
|
||||||
|
|
||||||
guard timeoutAfter != 0 else {
|
guard timeoutAfter != 0 else {
|
||||||
return
|
return
|
||||||
@ -166,10 +173,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
|
|
||||||
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC))
|
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC))
|
||||||
|
|
||||||
dispatch_after(time, dispatch_get_main_queue()) {[weak self] in
|
dispatch_after(time, dispatch_get_main_queue()) {
|
||||||
if let this = self where this.status != SocketIOClientStatus.Connected {
|
if self.status != .Connected {
|
||||||
this.status = SocketIOClientStatus.Closed
|
self.status = .Closed
|
||||||
this.engine?.close(fast: true)
|
self.engine?.close(fast: true)
|
||||||
|
|
||||||
handler?()
|
handler?()
|
||||||
}
|
}
|
||||||
@ -181,15 +188,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
if let this = self {
|
if let this = self {
|
||||||
this.ackHandlers.addAck(ack, callback: callback)
|
this.ackHandlers.addAck(ack, callback: callback)
|
||||||
|
|
||||||
dispatch_async(this.emitQueue) {[weak this] in
|
dispatch_async(this.emitQueue) {
|
||||||
this?._emit(items, ack: ack)
|
this._emit(items, ack: ack)
|
||||||
}
|
}
|
||||||
|
|
||||||
if timeout != 0 {
|
if timeout != 0 {
|
||||||
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC))
|
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC))
|
||||||
|
|
||||||
dispatch_after(time, dispatch_get_main_queue()) {[weak this] in
|
dispatch_after(time, dispatch_get_main_queue()) {
|
||||||
this?.ackHandlers.timeoutAck(ack)
|
this.ackHandlers.timeoutAck(ack)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -198,7 +205,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
|
|
||||||
func didConnect() {
|
func didConnect() {
|
||||||
Logger.log("Socket connected", type: logType)
|
Logger.log("Socket connected", type: logType)
|
||||||
status = SocketIOClientStatus.Connected
|
status = .Connected
|
||||||
currentReconnectAttempt = 0
|
currentReconnectAttempt = 0
|
||||||
clearReconnectTimer()
|
clearReconnectTimer()
|
||||||
|
|
||||||
@ -208,13 +215,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func didDisconnect(reason: String) {
|
func didDisconnect(reason: String) {
|
||||||
guard status != SocketIOClientStatus.Closed else {
|
guard status != .Closed else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.log("Disconnected: %@", type: logType, args: reason)
|
Logger.log("Disconnected: %@", type: logType, args: reason)
|
||||||
|
|
||||||
status = SocketIOClientStatus.Closed
|
status = .Closed
|
||||||
|
|
||||||
reconnects = false
|
reconnects = false
|
||||||
|
|
||||||
@ -249,12 +256,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
Same as emit, but meant for Objective-C
|
Same as emit, but meant for Objective-C
|
||||||
*/
|
*/
|
||||||
public func emit(event: String, withItems items: [AnyObject]) {
|
public func emit(event: String, withItems items: [AnyObject]) {
|
||||||
guard status == SocketIOClientStatus.Connected else {
|
guard status == .Connected else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch_async(emitQueue) {[weak self] in
|
dispatch_async(emitQueue) {
|
||||||
self?._emit([event] + items)
|
self._emit([event] + items)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,7 +281,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func _emit(data: [AnyObject], ack: Int? = nil) {
|
private func _emit(data: [AnyObject], ack: Int? = nil) {
|
||||||
guard status == SocketIOClientStatus.Connected else {
|
guard status == .Connected else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,7 +290,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
|
|
||||||
Logger.log("Emitting: %@", type: logType, args: str)
|
Logger.log("Emitting: %@", type: logType, args: str)
|
||||||
|
|
||||||
if packet.type == SocketPacket.PacketType.BinaryEvent {
|
if packet.type == .BinaryEvent {
|
||||||
engine?.send(str, withData: packet.binary)
|
engine?.send(str, withData: packet.binary)
|
||||||
} else {
|
} else {
|
||||||
engine?.send(str, withData: nil)
|
engine?.send(str, withData: nil)
|
||||||
@ -292,17 +299,17 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
|
|
||||||
// If the server wants to know that the client received data
|
// If the server wants to know that the client received data
|
||||||
func emitAck(ack: Int, withItems items: [AnyObject]) {
|
func emitAck(ack: Int, withItems items: [AnyObject]) {
|
||||||
dispatch_async(emitQueue) {[weak self] in
|
dispatch_async(emitQueue) {
|
||||||
if let this = self where this.status == SocketIOClientStatus.Connected {
|
if self.status == .Connected {
|
||||||
let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true)
|
let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true)
|
||||||
let str = packet.packetString
|
let str = packet.packetString
|
||||||
|
|
||||||
Logger.log("Emitting Ack: %@", type: this.logType, args: str)
|
Logger.log("Emitting Ack: %@", type: self.logType, args: str)
|
||||||
|
|
||||||
if packet.type == SocketPacket.PacketType.BinaryAck {
|
if packet.type == SocketPacket.PacketType.BinaryAck {
|
||||||
this.engine?.send(str, withData: packet.binary)
|
self.engine?.send(str, withData: packet.binary)
|
||||||
} else {
|
} else {
|
||||||
this.engine?.send(str, withData: nil)
|
self.engine?.send(str, withData: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -312,10 +319,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
public func engineDidClose(reason: String) {
|
public func engineDidClose(reason: String) {
|
||||||
waitingData.removeAll()
|
waitingData.removeAll()
|
||||||
|
|
||||||
if status == SocketIOClientStatus.Closed || !reconnects {
|
if status == .Closed || !reconnects {
|
||||||
didDisconnect(reason)
|
didDisconnect(reason)
|
||||||
} else if status != SocketIOClientStatus.Reconnecting {
|
} else if status != .Reconnecting {
|
||||||
status = SocketIOClientStatus.Reconnecting
|
status = .Reconnecting
|
||||||
handleEvent("reconnect", data: [reason], isInternalMessage: true)
|
handleEvent("reconnect", data: [reason], isInternalMessage: true)
|
||||||
tryReconnect()
|
tryReconnect()
|
||||||
}
|
}
|
||||||
@ -334,22 +341,21 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
*/
|
*/
|
||||||
public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool,
|
public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool,
|
||||||
wantsAck ack: Int? = nil) {
|
wantsAck ack: Int? = nil) {
|
||||||
guard status == SocketIOClientStatus.Connected || isInternalMessage else {
|
guard status == .Connected || isInternalMessage else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// println("Should do event: \(event) with data: \(data)")
|
|
||||||
|
|
||||||
Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "")
|
Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "")
|
||||||
|
|
||||||
if anyHandler != nil {
|
if anyHandler != nil {
|
||||||
dispatch_async(handleQueue) {[weak self] in
|
dispatch_async(handleQueue) {
|
||||||
self?.anyHandler?(SocketAnyEvent(event: event, items: data))
|
self.anyHandler?(SocketAnyEvent(event: event, items: data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for handler in handlers where handler.event == event {
|
for handler in handlers where handler.event == event {
|
||||||
if let ack = ack {
|
if let ack = ack {
|
||||||
dispatch_async(handleQueue) {[weak self] in
|
dispatch_async(handleQueue) {
|
||||||
handler.executeCallback(data, withAck: ack, withSocket: self)
|
handler.executeCallback(data, withAck: ack, withSocket: self)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -395,7 +401,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
public func off(event: String) {
|
public func off(event: String) {
|
||||||
Logger.log("Removing handler for event: %@", type: logType, 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 })
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -441,18 +447,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func parseSocketMessage(msg: String) {
|
public func parseSocketMessage(msg: String) {
|
||||||
dispatch_async(handleQueue) {[weak self] in
|
dispatch_async(handleQueue) {
|
||||||
if let this = self {
|
SocketParser.parseSocketMessage(msg, socket: self)
|
||||||
SocketParser.parseSocketMessage(msg, socket: this)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parseBinaryData(data: NSData) {
|
public func parseBinaryData(data: NSData) {
|
||||||
dispatch_async(handleQueue) {[weak self] in
|
dispatch_async(handleQueue) {
|
||||||
if let this = self {
|
SocketParser.parseBinaryData(data, socket: self)
|
||||||
SocketParser.parseBinaryData(data, socket: this)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,19 +470,17 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
|
|||||||
if reconnectTimer == nil {
|
if reconnectTimer == nil {
|
||||||
Logger.log("Starting reconnect", type: logType)
|
Logger.log("Starting reconnect", type: logType)
|
||||||
|
|
||||||
status = SocketIOClientStatus.Reconnecting
|
status = .Reconnecting
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue()) {[weak self] in
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
if let this = self {
|
self.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(self.reconnectWait),
|
||||||
this.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(this.reconnectWait),
|
target: self, selector: "_tryReconnect", userInfo: nil, repeats: true)
|
||||||
target: this, selector: "_tryReconnect", userInfo: nil, repeats: true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func _tryReconnect() {
|
@objc private func _tryReconnect() {
|
||||||
if status == SocketIOClientStatus.Connected {
|
if status == .Connected {
|
||||||
clearReconnectTimer()
|
clearReconnectTimer()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
@ -28,6 +28,8 @@ struct SocketPacket {
|
|||||||
private let placeholders: Int
|
private let placeholders: Int
|
||||||
private var currentPlace = 0
|
private var currentPlace = 0
|
||||||
|
|
||||||
|
private static let logType = "SocketPacket"
|
||||||
|
|
||||||
let nsp: String
|
let nsp: String
|
||||||
let id: Int
|
let id: Int
|
||||||
let type: PacketType
|
let type: PacketType
|
||||||
@ -113,7 +115,7 @@ struct SocketPacket {
|
|||||||
|
|
||||||
message += jsonString! as String + ","
|
message += jsonString! as String + ","
|
||||||
} catch {
|
} catch {
|
||||||
print("Error creating JSON object in SocketPacket.completeMessage")
|
Logger.error("Error creating JSON object in SocketPacket.completeMessage", type: SocketPacket.logType)
|
||||||
}
|
}
|
||||||
} else if var str = arg as? String {
|
} else if var str = arg as? String {
|
||||||
str = str["\n"] ~= "\\\\n"
|
str = str["\n"] ~= "\\\\n"
|
||||||
|
|||||||
@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
var swiftRegexCache = [String: NSRegularExpression]()
|
private var swiftRegexCache = [String: NSRegularExpression]()
|
||||||
|
|
||||||
public class SwiftRegex: NSObject, BooleanType {
|
internal class SwiftRegex: NSObject, BooleanType {
|
||||||
var target:String
|
var target:String
|
||||||
var regex: NSRegularExpression
|
var regex: NSRegularExpression
|
||||||
|
|
||||||
@ -37,16 +37,15 @@ public class SwiftRegex: NSObject, BooleanType {
|
|||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
class func failure(message: String) {
|
private static func failure(message: String) {
|
||||||
print("SwiftRegex: "+message)
|
fatalError("SwiftRegex: \(message)")
|
||||||
//assert(false,"SwiftRegex: failed")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final var targetRange: NSRange {
|
private final var targetRange: NSRange {
|
||||||
return NSRange(location: 0,length: target.utf16.count)
|
return NSRange(location: 0,length: target.utf16.count)
|
||||||
}
|
}
|
||||||
|
|
||||||
final func substring(range: NSRange) -> String? {
|
private final func substring(range: NSRange) -> String? {
|
||||||
if ( range.location != NSNotFound ) {
|
if ( range.location != NSNotFound ) {
|
||||||
return (target as NSString).substringWithRange(range)
|
return (target as NSString).substringWithRange(range)
|
||||||
} else {
|
} else {
|
||||||
@ -54,24 +53,24 @@ public class SwiftRegex: NSObject, BooleanType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func doesMatch(options: NSMatchingOptions!) -> Bool {
|
func doesMatch(options: NSMatchingOptions!) -> Bool {
|
||||||
return range(options).location != NSNotFound
|
return range(options).location != NSNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
public func range(options: NSMatchingOptions) -> NSRange {
|
func range(options: NSMatchingOptions) -> NSRange {
|
||||||
return regex.rangeOfFirstMatchInString(target as String, options: [], range: targetRange)
|
return regex.rangeOfFirstMatchInString(target as String, options: [], range: targetRange)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func match(options: NSMatchingOptions) -> String? {
|
func match(options: NSMatchingOptions) -> String? {
|
||||||
return substring(range(options))
|
return substring(range(options))
|
||||||
}
|
}
|
||||||
|
|
||||||
public func groups() -> [String]? {
|
func groups() -> [String]? {
|
||||||
return groupsForMatch(regex.firstMatchInString(target as String, options:
|
return groupsForMatch(regex.firstMatchInString(target as String, options:
|
||||||
NSMatchingOptions.WithoutAnchoringBounds, range: targetRange))
|
NSMatchingOptions.WithoutAnchoringBounds, range: targetRange))
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupsForMatch(match: NSTextCheckingResult!) -> [String]? {
|
private func groupsForMatch(match: NSTextCheckingResult!) -> [String]? {
|
||||||
if match != nil {
|
if match != nil {
|
||||||
var groups = [String]()
|
var groups = [String]()
|
||||||
for groupno in 0...regex.numberOfCaptureGroups {
|
for groupno in 0...regex.numberOfCaptureGroups {
|
||||||
@ -87,7 +86,7 @@ public class SwiftRegex: NSObject, BooleanType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public subscript(groupno: Int) -> String? {
|
subscript(groupno: Int) -> String? {
|
||||||
get {
|
get {
|
||||||
return groups()?[groupno]
|
return groups()?[groupno]
|
||||||
}
|
}
|
||||||
@ -116,19 +115,19 @@ public class SwiftRegex: NSObject, BooleanType {
|
|||||||
return matches
|
return matches
|
||||||
}
|
}
|
||||||
|
|
||||||
public func ranges() -> [NSRange] {
|
func ranges() -> [NSRange] {
|
||||||
return matchResults().map { $0.range }
|
return matchResults().map { $0.range }
|
||||||
}
|
}
|
||||||
|
|
||||||
public func matches() -> [String] {
|
func matches() -> [String] {
|
||||||
return matchResults().map( { self.substring($0.range)!})
|
return matchResults().map( { self.substring($0.range)!})
|
||||||
}
|
}
|
||||||
|
|
||||||
public func allGroups() -> [[String]?] {
|
func allGroups() -> [[String]?] {
|
||||||
return matchResults().map {self.groupsForMatch($0)}
|
return matchResults().map {self.groupsForMatch($0)}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func dictionary(options: NSMatchingOptions!) -> Dictionary<String,String> {
|
func dictionary(options: NSMatchingOptions!) -> Dictionary<String,String> {
|
||||||
var out = Dictionary<String,String>()
|
var out = Dictionary<String,String>()
|
||||||
for match in matchResults() {
|
for match in matchResults() {
|
||||||
out[substring(match.rangeAtIndex(1))!] = substring(match.rangeAtIndex(2))!
|
out[substring(match.rangeAtIndex(1))!] = substring(match.rangeAtIndex(2))!
|
||||||
@ -153,31 +152,31 @@ public class SwiftRegex: NSObject, BooleanType {
|
|||||||
return out as String
|
return out as String
|
||||||
}
|
}
|
||||||
|
|
||||||
public var boolValue: Bool {
|
var boolValue: Bool {
|
||||||
return doesMatch(nil)
|
return doesMatch(nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension String {
|
extension String {
|
||||||
public subscript(pattern: String, options: NSRegularExpressionOptions) -> SwiftRegex {
|
subscript(pattern: String, options: NSRegularExpressionOptions) -> SwiftRegex {
|
||||||
return SwiftRegex(target: self, pattern: pattern, options: options)
|
return SwiftRegex(target: self, pattern: pattern, options: options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension String {
|
extension String {
|
||||||
public subscript(pattern: String) -> SwiftRegex {
|
subscript(pattern: String) -> SwiftRegex {
|
||||||
return SwiftRegex(target: self, pattern: pattern, options: nil)
|
return SwiftRegex(target: self, pattern: pattern, options: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func ~= (left: SwiftRegex, right: String) -> String {
|
func ~= (left: SwiftRegex, right: String) -> String {
|
||||||
return left.substituteMatches({match, stop in
|
return left.substituteMatches({match, stop in
|
||||||
return left.regex.replacementStringForResult( match,
|
return left.regex.replacementStringForResult( match,
|
||||||
inString: left.target as String, offset: 0, template: right )
|
inString: left.target as String, offset: 0, template: right )
|
||||||
}, options: [])
|
}, options: [])
|
||||||
}
|
}
|
||||||
|
|
||||||
public func ~= (left: SwiftRegex, right: [String]) -> String {
|
func ~= (left: SwiftRegex, right: [String]) -> String {
|
||||||
var matchNumber = 0
|
var matchNumber = 0
|
||||||
return left.substituteMatches({match, stop -> String in
|
return left.substituteMatches({match, stop -> String in
|
||||||
|
|
||||||
@ -190,7 +189,7 @@ public func ~= (left: SwiftRegex, right: [String]) -> String {
|
|||||||
}, options: [])
|
}, options: [])
|
||||||
}
|
}
|
||||||
|
|
||||||
public func ~= (left: SwiftRegex, right: (String) -> String) -> String {
|
func ~= (left: SwiftRegex, right: (String) -> String) -> String {
|
||||||
// return right(left.substring(match.range))
|
// return right(left.substring(match.range))
|
||||||
return left.substituteMatches(
|
return left.substituteMatches(
|
||||||
{match, stop -> String in
|
{match, stop -> String in
|
||||||
@ -198,7 +197,7 @@ public func ~= (left: SwiftRegex, right: (String) -> String) -> String {
|
|||||||
}, options: [])
|
}, options: [])
|
||||||
}
|
}
|
||||||
|
|
||||||
public func ~= (left: SwiftRegex, right: ([String]?) -> String) -> String {
|
func ~= (left: SwiftRegex, right: ([String]?) -> String) -> String {
|
||||||
return left.substituteMatches({match, stop -> String in
|
return left.substituteMatches({match, stop -> String in
|
||||||
return right(left.groupsForMatch(match))
|
return right(left.groupsForMatch(match))
|
||||||
}, options: [])
|
}, options: [])
|
||||||
|
|||||||
@ -378,21 +378,17 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
|||||||
}
|
}
|
||||||
if totalSize > 0 {
|
if totalSize > 0 {
|
||||||
if validateResponse(buffer, bufferLen: totalSize) {
|
if validateResponse(buffer, bufferLen: totalSize) {
|
||||||
dispatch_async(queue, { [weak self] in
|
dispatch_async(queue, {
|
||||||
guard let weakSelf = self else {
|
self.connected = true
|
||||||
return
|
if let connectBlock = self.onConnect {
|
||||||
}
|
|
||||||
|
|
||||||
weakSelf.connected = true
|
|
||||||
if let connectBlock = weakSelf.onConnect {
|
|
||||||
connectBlock()
|
connectBlock()
|
||||||
}
|
}
|
||||||
weakSelf.delegate?.websocketDidConnect(weakSelf)
|
self.delegate?.websocketDidConnect(self)
|
||||||
})
|
})
|
||||||
totalSize += 1 //skip the last \n
|
totalSize += 1 //skip the last \n
|
||||||
let restSize = bufferLen - totalSize
|
let restSize = bufferLen - totalSize
|
||||||
if restSize > 0 {
|
if restSize > 0 {
|
||||||
processRawMessage((buffer+totalSize),bufferLen: restSize)
|
processRawMessage((buffer+totalSize), bufferLen: restSize)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -525,15 +521,9 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
|||||||
data = NSData(bytes: UnsafePointer<UInt8>((buffer+offset)), length: Int(len))
|
data = NSData(bytes: UnsafePointer<UInt8>((buffer+offset)), length: Int(len))
|
||||||
}
|
}
|
||||||
if receivedOpcode == OpCode.Pong.rawValue {
|
if receivedOpcode == OpCode.Pong.rawValue {
|
||||||
dispatch_async(queue, { [weak self] in
|
dispatch_async(queue, {
|
||||||
guard let weakSelf = self else {
|
self.onPong?()
|
||||||
return
|
self.pongDelegate?.websocketDidReceivePong(self)
|
||||||
}
|
|
||||||
|
|
||||||
if let pongBlock = weakSelf.onPong {
|
|
||||||
pongBlock()
|
|
||||||
}
|
|
||||||
weakSelf.pongDelegate?.websocketDidReceivePong(weakSelf)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
let step = Int(offset+numericCast(len))
|
let step = Int(offset+numericCast(len))
|
||||||
@ -618,33 +608,24 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
|||||||
dequeueWrite(data, code: OpCode.Pong)
|
dequeueWrite(data, code: OpCode.Pong)
|
||||||
} else if response.code == .TextFrame {
|
} else if response.code == .TextFrame {
|
||||||
let str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding)
|
let str: NSString? = NSString(data: response.buffer!, encoding: NSUTF8StringEncoding)
|
||||||
if str == nil {
|
|
||||||
|
if let str = str as String? {
|
||||||
|
dispatch_async(queue, {
|
||||||
|
self.onText?(str)
|
||||||
|
self.delegate?.websocketDidReceiveMessage(self, text: str)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
writeError(CloseCode.Encoding.rawValue)
|
writeError(CloseCode.Encoding.rawValue)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
dispatch_async(queue, { [weak self] in
|
|
||||||
guard let weakSelf = self else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if let textBlock = weakSelf.onText {
|
|
||||||
textBlock(str! as String)
|
|
||||||
}
|
|
||||||
weakSelf.delegate?.websocketDidReceiveMessage(weakSelf, text: str! as String)
|
|
||||||
})
|
|
||||||
} else if response.code == .BinaryFrame {
|
} else if response.code == .BinaryFrame {
|
||||||
let data = response.buffer! //local copy so it is perverse for writing
|
let data = response.buffer! //local copy so it is perverse for writing
|
||||||
dispatch_async(queue, { [weak self] in
|
dispatch_async(queue) {
|
||||||
guard let weakSelf = self else {
|
self.onData?(data)
|
||||||
return
|
self.delegate?.websocketDidReceiveData(self, data: data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let dataBlock = weakSelf.onData {
|
|
||||||
dataBlock(data)
|
|
||||||
}
|
|
||||||
weakSelf.delegate?.websocketDidReceiveData(weakSelf, data: data)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
readStack.removeLast()
|
readStack.removeLast()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -745,17 +726,12 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
|||||||
///used to preform the disconnect delegate
|
///used to preform the disconnect delegate
|
||||||
private func doDisconnect(error: NSError?) {
|
private func doDisconnect(error: NSError?) {
|
||||||
if !self.didDisconnect {
|
if !self.didDisconnect {
|
||||||
dispatch_async(queue, { [weak self] in
|
dispatch_async(queue) {
|
||||||
guard let weakSelf = self else {
|
self.didDisconnect = true
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
weakSelf.didDisconnect = true
|
self.onDisconnect?(error)
|
||||||
if let disconnect = weakSelf.onDisconnect {
|
self.delegate?.websocketDidDisconnect(self, error: error)
|
||||||
disconnect(error)
|
|
||||||
}
|
}
|
||||||
weakSelf.delegate?.websocketDidDisconnect(weakSelf, error: error)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -774,7 +750,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
|||||||
import Foundation
|
import Foundation
|
||||||
import Security
|
import Security
|
||||||
|
|
||||||
public class SSLCert {
|
private class SSLCert {
|
||||||
var certData: NSData?
|
var certData: NSData?
|
||||||
var key: SecKeyRef?
|
var key: SecKeyRef?
|
||||||
|
|
||||||
@ -785,7 +761,7 @@ public class SSLCert {
|
|||||||
|
|
||||||
:returns: a representation security object to be used with
|
:returns: a representation security object to be used with
|
||||||
*/
|
*/
|
||||||
public init(data: NSData) {
|
init(data: NSData) {
|
||||||
self.certData = data
|
self.certData = data
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -796,7 +772,7 @@ public class SSLCert {
|
|||||||
|
|
||||||
:returns: a representation security object to be used with
|
:returns: a representation security object to be used with
|
||||||
*/
|
*/
|
||||||
public init(key: SecKeyRef) {
|
init(key: SecKeyRef) {
|
||||||
self.key = key
|
self.key = key
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user