Merge pull request #170 from NachoSoto/swift2-comments

Code improvements to Swift 2 branch
This commit is contained in:
Erik Little 2015-09-11 18:46:54 -04:00
commit 17444dd4a3
5 changed files with 147 additions and 174 deletions

View File

@ -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)
@ -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)
} }
} }
} }

View File

@ -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

View File

@ -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"

View File

@ -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: [])

View File

@ -378,16 +378,12 @@ 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
@ -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
} }
} }