update for latest swift 3

This commit is contained in:
Erik 2016-04-16 12:00:21 -04:00
parent 9f8db42584
commit e2db1a086d
21 changed files with 281 additions and 274 deletions

View File

@ -10,13 +10,13 @@ import XCTest
@testable import SocketIOClientSwift @testable import SocketIOClientSwift
class SocketBasicPacketTest: XCTestCase { class SocketBasicPacketTest: XCTestCase {
let data = "test".data(usingEncoding: NSUTF8StringEncoding)! let data = "test".data(using: NSUTF8StringEncoding)!
let data2 = "test2".data(usingEncoding: NSUTF8StringEncoding)! let data2 = "test2".data(using: NSUTF8StringEncoding)!
func testEmpyEmit() { func testEmpyEmit() {
let expectedSendString = "2[\"test\"]" let expectedSendString = "2[\"test\"]"
let sendData = ["test"] let sendData = ["test"]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -24,7 +24,7 @@ class SocketBasicPacketTest: XCTestCase {
func testNullEmit() { func testNullEmit() {
let expectedSendString = "2[\"test\",null]" let expectedSendString = "2[\"test\",null]"
let sendData = ["test", NSNull()] let sendData = ["test", NSNull()]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -32,7 +32,7 @@ class SocketBasicPacketTest: XCTestCase {
func testStringEmit() { func testStringEmit() {
let expectedSendString = "2[\"test\",\"foo bar\"]" let expectedSendString = "2[\"test\",\"foo bar\"]"
let sendData = ["test", "foo bar"] let sendData = ["test", "foo bar"]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -40,7 +40,7 @@ class SocketBasicPacketTest: XCTestCase {
func testStringEmitWithQuotes() { func testStringEmitWithQuotes() {
let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]" let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]"
let sendData = ["test", "\"he\"llo world\""] let sendData = ["test", "\"he\"llo world\""]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -48,7 +48,7 @@ class SocketBasicPacketTest: XCTestCase {
func testJSONEmit() { func testJSONEmit() {
let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let expectedSendString = "2[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]"
let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -56,7 +56,7 @@ class SocketBasicPacketTest: XCTestCase {
func testArrayEmit() { func testArrayEmit() {
let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]"
let sendData = ["test", ["hello", 1, ["test": "test"]]] let sendData = ["test", ["hello", 1, ["test": "test"]]]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -64,7 +64,7 @@ class SocketBasicPacketTest: XCTestCase {
func testBinaryEmit() { func testBinaryEmit() {
let expectedSendString = "51-[\"test\",{\"num\":0,\"_placeholder\":true}]" let expectedSendString = "51-[\"test\",{\"num\":0,\"_placeholder\":true}]"
let sendData = ["test", data] let sendData = ["test", data]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data]) XCTAssertEqual(packet.binary, [data])
@ -73,7 +73,7 @@ class SocketBasicPacketTest: XCTestCase {
func testMultipleBinaryEmit() { func testMultipleBinaryEmit() {
let expectedSendString = "52-[\"test\",{\"data1\":{\"num\":0,\"_placeholder\":true},\"data2\":{\"num\":1,\"_placeholder\":true}}]" let expectedSendString = "52-[\"test\",{\"data1\":{\"num\":0,\"_placeholder\":true},\"data2\":{\"num\":1,\"_placeholder\":true}}]"
let sendData = ["test", ["data1": data, "data2": data2]] let sendData = ["test", ["data1": data, "data2": data2]]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data, data2]) XCTAssertEqual(packet.binary, [data, data2])
@ -82,7 +82,7 @@ class SocketBasicPacketTest: XCTestCase {
func testEmitWithAck() { func testEmitWithAck() {
let expectedSendString = "20[\"test\"]" let expectedSendString = "20[\"test\"]"
let sendData = ["test"] let sendData = ["test"]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -90,7 +90,7 @@ class SocketBasicPacketTest: XCTestCase {
func testEmitDataWithAck() { func testEmitDataWithAck() {
let expectedSendString = "51-0[\"test\",{\"num\":0,\"_placeholder\":true}]" let expectedSendString = "51-0[\"test\",{\"num\":0,\"_placeholder\":true}]"
let sendData = ["test", data] let sendData = ["test", data]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data]) XCTAssertEqual(packet.binary, [data])
@ -99,7 +99,7 @@ class SocketBasicPacketTest: XCTestCase {
// Acks // Acks
func testEmptyAck() { func testEmptyAck() {
let expectedSendString = "30[]" let expectedSendString = "30[]"
let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/", ack: true) let packet = SocketPacket.packetFromEmit(items: [], id: 0, nsp: "/", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -107,7 +107,7 @@ class SocketBasicPacketTest: XCTestCase {
func testNullAck() { func testNullAck() {
let expectedSendString = "30[null]" let expectedSendString = "30[null]"
let sendData = [NSNull()] let sendData = [NSNull()]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -115,7 +115,7 @@ class SocketBasicPacketTest: XCTestCase {
func testStringAck() { func testStringAck() {
let expectedSendString = "30[\"test\"]" let expectedSendString = "30[\"test\"]"
let sendData = ["test"] let sendData = ["test"]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -123,7 +123,7 @@ class SocketBasicPacketTest: XCTestCase {
func testJSONAck() { func testJSONAck() {
let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let expectedSendString = "30[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]"
let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -131,7 +131,7 @@ class SocketBasicPacketTest: XCTestCase {
func testBinaryAck() { func testBinaryAck() {
let expectedSendString = "61-0[{\"num\":0,\"_placeholder\":true}]" let expectedSendString = "61-0[{\"num\":0,\"_placeholder\":true}]"
let sendData = [data] let sendData = [data]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data]) XCTAssertEqual(packet.binary, [data])
@ -140,7 +140,7 @@ class SocketBasicPacketTest: XCTestCase {
func testMultipleBinaryAck() { func testMultipleBinaryAck() {
let expectedSendString = "62-0[{\"data2\":{\"num\":0,\"_placeholder\":true},\"data1\":{\"num\":1,\"_placeholder\":true}}]" let expectedSendString = "62-0[{\"data2\":{\"num\":0,\"_placeholder\":true},\"data1\":{\"num\":1,\"_placeholder\":true}}]"
let sendData = [["data1": data, "data2": data2]] let sendData = [["data1": data, "data2": data2]]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data2, data]) XCTAssertEqual(packet.binary, [data2, data])

View File

@ -10,13 +10,13 @@ import XCTest
@testable import SocketIOClientSwift @testable import SocketIOClientSwift
class SocketNamespacePacketTest: XCTestCase { class SocketNamespacePacketTest: XCTestCase {
let data = "test".data(usingEncoding: NSUTF8StringEncoding)! let data = "test".data(using: NSUTF8StringEncoding)!
let data2 = "test2".data(usingEncoding: NSUTF8StringEncoding)! let data2 = "test2".data(using: NSUTF8StringEncoding)!
func testEmpyEmit() { func testEmpyEmit() {
let expectedSendString = "2/swift,[\"test\"]" let expectedSendString = "2/swift,[\"test\"]"
let sendData = ["test"] let sendData = ["test"]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -24,7 +24,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testNullEmit() { func testNullEmit() {
let expectedSendString = "2/swift,[\"test\",null]" let expectedSendString = "2/swift,[\"test\",null]"
let sendData = ["test", NSNull()] let sendData = ["test", NSNull()]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -32,7 +32,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testStringEmit() { func testStringEmit() {
let expectedSendString = "2/swift,[\"test\",\"foo bar\"]" let expectedSendString = "2/swift,[\"test\",\"foo bar\"]"
let sendData = ["test", "foo bar"] let sendData = ["test", "foo bar"]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -40,7 +40,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testJSONEmit() { func testJSONEmit() {
let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let expectedSendString = "2/swift,[\"test\",{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]"
let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let sendData = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -48,7 +48,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testArrayEmit() { func testArrayEmit() {
let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"}]]"
let sendData = ["test", ["hello", 1, ["test": "test"]]] let sendData = ["test", ["hello", 1, ["test": "test"]]]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -56,7 +56,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testBinaryEmit() { func testBinaryEmit() {
let expectedSendString = "51-/swift,[\"test\",{\"num\":0,\"_placeholder\":true}]" let expectedSendString = "51-/swift,[\"test\",{\"num\":0,\"_placeholder\":true}]"
let sendData = ["test", data] let sendData = ["test", data]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data]) XCTAssertEqual(packet.binary, [data])
@ -65,7 +65,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testMultipleBinaryEmit() { func testMultipleBinaryEmit() {
let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"num\":0,\"_placeholder\":true},\"data2\":{\"num\":1,\"_placeholder\":true}}]" let expectedSendString = "52-/swift,[\"test\",{\"data1\":{\"num\":0,\"_placeholder\":true},\"data2\":{\"num\":1,\"_placeholder\":true}}]"
let sendData = ["test", ["data1": data, "data2": data2]] let sendData = ["test", ["data1": data, "data2": data2]]
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: -1, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data, data2]) XCTAssertEqual(packet.binary, [data, data2])
@ -74,7 +74,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testEmitWithAck() { func testEmitWithAck() {
let expectedSendString = "2/swift,0[\"test\"]" let expectedSendString = "2/swift,0[\"test\"]"
let sendData = ["test"] let sendData = ["test"]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -82,7 +82,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testEmitDataWithAck() { func testEmitDataWithAck() {
let expectedSendString = "51-/swift,0[\"test\",{\"num\":0,\"_placeholder\":true}]" let expectedSendString = "51-/swift,0[\"test\",{\"num\":0,\"_placeholder\":true}]"
let sendData = ["test", data] let sendData = ["test", data]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: false)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data]) XCTAssertEqual(packet.binary, [data])
@ -91,7 +91,7 @@ class SocketNamespacePacketTest: XCTestCase {
// Acks // Acks
func testEmptyAck() { func testEmptyAck() {
let expectedSendString = "3/swift,0[]" let expectedSendString = "3/swift,0[]"
let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/swift", ack: true) let packet = SocketPacket.packetFromEmit(items: [], id: 0, nsp: "/swift", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -99,7 +99,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testNullAck() { func testNullAck() {
let expectedSendString = "3/swift,0[null]" let expectedSendString = "3/swift,0[null]"
let sendData = [NSNull()] let sendData = [NSNull()]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -107,7 +107,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testStringAck() { func testStringAck() {
let expectedSendString = "3/swift,0[\"test\"]" let expectedSendString = "3/swift,0[\"test\"]"
let sendData = ["test"] let sendData = ["test"]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -115,7 +115,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testJSONAck() { func testJSONAck() {
let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]" let expectedSendString = "3/swift,0[{\"test\":\"hello\",\"hello\":1,\"foobar\":true,\"null\":null}]"
let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
} }
@ -123,7 +123,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testBinaryAck() { func testBinaryAck() {
let expectedSendString = "61-/swift,0[{\"num\":0,\"_placeholder\":true}]" let expectedSendString = "61-/swift,0[{\"num\":0,\"_placeholder\":true}]"
let sendData = [data] let sendData = [data]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data]) XCTAssertEqual(packet.binary, [data])
@ -132,7 +132,7 @@ class SocketNamespacePacketTest: XCTestCase {
func testMultipleBinaryAck() { func testMultipleBinaryAck() {
let expectedSendString = "62-/swift,0[{\"data2\":{\"num\":0,\"_placeholder\":true},\"data1\":{\"num\":1,\"_placeholder\":true}}]" let expectedSendString = "62-/swift,0[{\"data2\":{\"num\":0,\"_placeholder\":true},\"data1\":{\"num\":1,\"_placeholder\":true}}]"
let sendData = [["data1": data, "data2": data2]] let sendData = [["data1": data, "data2": data2]]
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) let packet = SocketPacket.packetFromEmit(items: sendData, id: 0, nsp: "/swift", ack: true)
XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.packetString, expectedSendString)
XCTAssertEqual(packet.binary, [data2, data]) XCTAssertEqual(packet.binary, [data2, data])

View File

@ -39,7 +39,7 @@
} }
- (void)testOffSyntax { - (void)testOffSyntax {
[self.socket off:@"test"]; [self.socket offWithEvent:@"test"];
} }
@end @end

View File

@ -30,72 +30,72 @@ class SocketParserTest: XCTestCase {
func testDisconnect() { func testDisconnect() {
let message = "1" let message = "1"
validateParseResult(message) validateParseResult(message: message)
} }
func testConnect() { func testConnect() {
let message = "0" let message = "0"
validateParseResult(message) validateParseResult(message: message)
} }
func testDisconnectNameSpace() { func testDisconnectNameSpace() {
let message = "1/swift" let message = "1/swift"
validateParseResult(message) validateParseResult(message: message)
} }
func testConnecttNameSpace() { func testConnecttNameSpace() {
let message = "0/swift" let message = "0/swift"
validateParseResult(message) validateParseResult(message: message)
} }
func testIdEvent() { func testIdEvent() {
let message = "25[\"test\"]" let message = "25[\"test\"]"
validateParseResult(message) validateParseResult(message: message)
} }
func testBinaryPlaceholderAsString() { func testBinaryPlaceholderAsString() {
let message = "2[\"test\",\"~~0\"]" let message = "2[\"test\",\"~~0\"]"
validateParseResult(message) validateParseResult(message: message)
} }
func testNameSpaceArrayParse() { func testNameSpaceArrayParse() {
let message = "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]" let message = "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]"
validateParseResult(message) validateParseResult(message: message)
} }
func testNameSpaceArrayAckParse() { func testNameSpaceArrayAckParse() {
let message = "3/swift,0[[\"test3\",\"test4\"]]" let message = "3/swift,0[[\"test3\",\"test4\"]]"
validateParseResult(message) validateParseResult(message: message)
} }
func testNameSpaceBinaryEventParse() { func testNameSpaceBinaryEventParse() {
let message = "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" let message = "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]"
validateParseResult(message) validateParseResult(message: message)
} }
func testNameSpaceBinaryAckParse() { func testNameSpaceBinaryAckParse() {
let message = "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" let message = "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]"
validateParseResult(message) validateParseResult(message: message)
} }
func testNamespaceErrorParse() { func testNamespaceErrorParse() {
let message = "4/swift," let message = "4/swift,"
validateParseResult(message) validateParseResult(message: message)
} }
func testErrorTypeString() { func testErrorTypeString() {
let message = "4\"ERROR\"" let message = "4\"ERROR\""
validateParseResult(message) validateParseResult(message: message)
} }
func testErrorTypeDictionary() { func testErrorTypeDictionary() {
let message = "4{\"test\":2}" let message = "4{\"test\":2}"
validateParseResult(message) validateParseResult(message: message)
} }
func testErrorTypeInt() { func testErrorTypeInt() {
let message = "41" let message = "41"
validateParseResult(message) validateParseResult(message: message)
} }
func testInvalidInput() { func testInvalidInput() {
@ -110,7 +110,7 @@ class SocketParserTest: XCTestCase {
func testGenericParser() { func testGenericParser() {
var parser = SocketStringReader(message: "61-/swift,") var parser = SocketStringReader(message: "61-/swift,")
XCTAssertEqual(parser.read(1), "6") XCTAssertEqual(parser.read(length: 1), "6")
XCTAssertEqual(parser.currentCharacter, "1") XCTAssertEqual(parser.currentCharacter, "1")
XCTAssertEqual(parser.readUntilStringOccurence("-"), "1") XCTAssertEqual(parser.readUntilStringOccurence("-"), "1")
XCTAssertEqual(parser.currentCharacter, "/") XCTAssertEqual(parser.currentCharacter, "/")

View File

@ -10,8 +10,8 @@ import XCTest
@testable import SocketIOClientSwift @testable import SocketIOClientSwift
class SocketSideEffectTest: XCTestCase { class SocketSideEffectTest: XCTestCase {
let data = "test".data(usingEncoding: NSUTF8StringEncoding)! let data = "test".data(using: NSUTF8StringEncoding)!
let data2 = "test2".data(usingEncoding: NSUTF8StringEncoding)! let data2 = "test2".data(using: NSUTF8StringEncoding)!
private var socket: SocketIOClient! private var socket: SocketIOClient!
override func setUp() { override func setUp() {
@ -83,7 +83,7 @@ class SocketSideEffectTest: XCTestCase {
func testHandleOnceEvent() { func testHandleOnceEvent() {
let expect = expectation(withDescription: "handled event") let expect = expectation(withDescription: "handled event")
socket.once("test") {data, ack in socket.once(event: "test") {data, ack in
XCTAssertEqual(data[0] as? String, "hello world") XCTAssertEqual(data[0] as? String, "hello world")
XCTAssertEqual(self.socket.testHandlers.count, 0) XCTAssertEqual(self.socket.testHandlers.count, 0)
expect.fulfill() expect.fulfill()
@ -98,7 +98,7 @@ class SocketSideEffectTest: XCTestCase {
XCTAssertEqual(socket.testHandlers.count, 1) XCTAssertEqual(socket.testHandlers.count, 1)
socket.on("test") {data, ack in } socket.on("test") {data, ack in }
XCTAssertEqual(socket.testHandlers.count, 2) XCTAssertEqual(socket.testHandlers.count, 2)
socket.off("test") socket.off(event: "test")
XCTAssertEqual(socket.testHandlers.count, 0) XCTAssertEqual(socket.testHandlers.count, 0)
} }

View File

@ -33,13 +33,13 @@ public final class SocketAckEmitter : NSObject {
self.ackNum = ackNum self.ackNum = ackNum
} }
public func with(items: AnyObject...) { public func with(_ items: AnyObject...) {
guard ackNum != -1 else { return } guard ackNum != -1 else { return }
socket.emitAck(ackNum, with: items) socket.emitAck(ackNum, with: items)
} }
public func with(items: [AnyObject]) { public func with(_ items: [AnyObject]) {
guard ackNum != -1 else { return } guard ackNum != -1 else { return }
socket.emitAck(ackNum, with: items) socket.emitAck(ackNum, with: items)

View File

@ -52,11 +52,11 @@ private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool {
struct SocketAckManager { struct SocketAckManager {
private var acks = Set<SocketAck>(minimumCapacity: 1) private var acks = Set<SocketAck>(minimumCapacity: 1)
mutating func addAck(ack: Int, callback: AckCallback) { mutating func addAck(_ ack: Int, callback: AckCallback) {
acks.insert(SocketAck(ack: ack, callback: callback)) acks.insert(SocketAck(ack: ack, callback: callback))
} }
mutating func executeAck(ack: Int, items: [AnyObject]) { mutating func executeAck(_ ack: Int, items: [AnyObject]) {
let callback = acks.remove(SocketAck(ack: ack)) let callback = acks.remove(SocketAck(ack: ack))
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {
@ -64,7 +64,7 @@ struct SocketAckManager {
} }
} }
mutating func timeoutAck(ack: Int) { mutating func timeoutAck(_ ack: Int) {
let callback = acks.remove(SocketAck(ack: ack)) let callback = acks.remove(SocketAck(ack: ack))
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {

View File

@ -128,8 +128,8 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
stopPolling() stopPolling()
} }
private func checkAndHandleEngineError(msg: String) { private func checkAndHandleEngineError(_ msg: String) {
guard let stringData = msg.data(usingEncoding: NSUTF8StringEncoding, guard let stringData = msg.data(using: NSUTF8StringEncoding,
allowLossyConversion: false) else { return } allowLossyConversion: false) else { return }
do { do {
@ -140,28 +140,28 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
switch code { switch code {
case 0: // Unknown transport case 0: // Unknown transport
didError(error) didError(error: error)
case 1: // Unknown sid. case 1: // Unknown sid.
didError(error) didError(error: error)
case 2: // Bad handshake request case 2: // Bad handshake request
didError(error) didError(error: error)
case 3: // Bad request case 3: // Bad request
didError(error) didError(error: error)
default: default:
didError(error) didError(error: error)
} }
} }
} catch { } catch {
didError("Got unknown error from server \(msg)") didError(error: "Got unknown error from server \(msg)")
} }
} }
private func checkIfMessageIsBase64Binary(message: String) -> Bool { private func checkIfMessageIsBase64Binary(_ message: String) -> Bool {
if message.hasPrefix("b4") { if message.hasPrefix("b4") {
// binary in base64 string // binary in base64 string
let noPrefix = message[message.startIndex.advanced(by: 2)..<message.endIndex] let noPrefix = message[message.startIndex.advanced(by: 2)..<message.endIndex]
if let data = NSData(base64EncodedString: noPrefix, if let data = NSData(base64Encoded: noPrefix,
options: .ignoreUnknownCharacters) { options: .ignoreUnknownCharacters) {
client?.parseEngineBinaryData(data) client?.parseEngineBinaryData(data)
} }
@ -176,7 +176,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
public func connect() { public func connect() {
if connected { if connected {
DefaultSocketLogger.Logger.error("Engine tried opening while connected. Assuming this was a reconnect", type: logType) DefaultSocketLogger.Logger.error("Engine tried opening while connected. Assuming this was a reconnect", type: logType)
disconnect("reconnect") disconnect(reason: "reconnect")
} }
DefaultSocketLogger.Logger.log("Starting engine", type: logType) DefaultSocketLogger.Logger.log("Starting engine", type: logType)
@ -204,7 +204,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
} }
} }
doLongPoll(reqPolling) doLongPoll(for: reqPolling)
} }
private func createURLs() -> (NSURL, NSURL) { private func createURLs() -> (NSURL, NSURL) {
@ -267,12 +267,12 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
public func didError(error: String) { public func didError(error: String) {
DefaultSocketLogger.Logger.error(error, type: logType) DefaultSocketLogger.Logger.error(error, type: logType)
client?.engineDidError(error) client?.engineDidError(reason: error)
disconnect(error) disconnect(reason: error)
} }
public func disconnect(reason: String) { public func disconnect(reason: String) {
func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) { func postSendClose(_ data: NSData?, _ res: NSURLResponse?, _ err: NSError?) {
sid = "" sid = ""
closed = true closed = true
invalidated = true invalidated = true
@ -280,7 +280,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
ws?.disconnect() ws?.disconnect()
stopPolling() stopPolling()
client?.engineDidClose(reason) client?.engineDidClose(reason: reason)
} }
DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType)
@ -298,7 +298,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
dispatch_sync(emitQueue) { dispatch_sync(emitQueue) {
self.postWait.append(String(SocketEnginePacketType.close.rawValue)) self.postWait.append(String(SocketEnginePacketType.close.rawValue))
let req = self.createRequestForPostWithPostWait() let req = self.createRequestForPostWithPostWait()
self.doRequest(req, callbackWith: postSendClose) self.doRequest(for: req, callbackWith: postSendClose)
} }
} }
} }
@ -339,17 +339,17 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
guard let ws = self.ws else { return } guard let ws = self.ws else { return }
for msg in postWait { for msg in postWait {
ws.writeString(fixDoubleUTF8(msg)) ws.writeString(str: fixDoubleUTF8(string: msg))
} }
postWait.removeAll(keepingCapacity: true) postWait.removeAll(keepingCapacity: true)
} }
private func handleClose(reason: String) { private func handleClose(reason: String) {
client?.engineDidClose(reason) client?.engineDidClose(reason: reason)
} }
private func handleMessage(message: String) { private func handleMessage(_ message: String) {
client?.parseEngineMessage(message) client?.parseEngineMessage(message)
} }
@ -357,8 +357,8 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
doPoll() doPoll()
} }
private func handleOpen(openData: String) { private func handleOpen(openMessage: String) {
let mesData = openData.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false)! let mesData = openMessage.data(using: NSUTF8StringEncoding, allowLossyConversion: false)!
do { do {
let json = try NSJSONSerialization.jsonObject(with: mesData, let json = try NSJSONSerialization.jsonObject(with: mesData,
options: NSJSONReadingOptions.allowFragments) as? NSDictionary options: NSJSONReadingOptions.allowFragments) as? NSDictionary
@ -389,10 +389,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
doPoll() doPoll()
} }
client?.engineDidOpen?("Connect") client?.engineDidOpen?(reason: "Connect")
} }
} catch { } catch {
didError("Error parsing open packet") didError(error: "Error parsing open packet")
return return
} }
} }
@ -406,12 +406,12 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
} }
} }
public func parseEngineData(data: NSData) { public func parseEngineData(_ data: NSData) {
DefaultSocketLogger.Logger.log("Got binary data: %@", type: "SocketEngine", args: data) DefaultSocketLogger.Logger.log("Got binary data: %@", type: "SocketEngine", args: data)
client?.parseEngineBinaryData(data.subdata(with: NSMakeRange(1, data.length - 1))) client?.parseEngineBinaryData(data.subdata(with: NSMakeRange(1, data.length - 1)))
} }
public func parseEngineMessage(message: String, fromPolling: Bool) { public func parseEngineMessage(_ message: String, fromPolling: Bool) {
DefaultSocketLogger.Logger.log("Got message: %@", type: logType, args: message) DefaultSocketLogger.Logger.log("Got message: %@", type: logType, args: message)
let reader = SocketStringReader(message: message) let reader = SocketStringReader(message: message)
@ -426,7 +426,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
} }
if fromPolling && type != .noop && doubleEncodeUTF8 { if fromPolling && type != .noop && doubleEncodeUTF8 {
fixedString = fixDoubleUTF8(message) fixedString = fixDoubleUTF8(string: message)
} else { } else {
fixedString = message fixedString = message
} }
@ -437,11 +437,11 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
case .noop: case .noop:
handleNOOP() handleNOOP()
case .pong: case .pong:
handlePong(fixedString) handlePong(pongMessage: fixedString)
case .open: case .open:
handleOpen(fixedString[fixedString.startIndex.successor()..<fixedString.endIndex]) handleOpen(openMessage: fixedString[fixedString.startIndex.successor()..<fixedString.endIndex])
case .close: case .close:
handleClose(fixedString) handleClose(reason: fixedString)
default: default:
DefaultSocketLogger.Logger.log("Got unknown packet type", type: logType) DefaultSocketLogger.Logger.log("Got unknown packet type", type: logType)
} }
@ -471,7 +471,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
//Server is not responding //Server is not responding
if pongsMissed > pongsMissedMax { if pongsMissed > pongsMissedMax {
client?.engineDidClose("Ping timeout") client?.engineDidClose(reason: "Ping timeout")
return return
} }
@ -498,7 +498,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
} }
/// Write a message, independent of transport. /// Write a message, independent of transport.
public func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) { public func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) {
dispatch_async(emitQueue) { dispatch_async(emitQueue) {
guard self.connected else { return } guard self.connected else { return }
@ -532,7 +532,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
probing = false probing = false
if closed { if closed {
client?.engineDidClose("Disconnect") client?.engineDidClose(reason: "Disconnect")
return return
} }
@ -543,10 +543,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
let reason = error?.localizedDescription ?? "Socket Disconnected" let reason = error?.localizedDescription ?? "Socket Disconnected"
if error != nil { if error != nil {
didError(reason) didError(error: reason)
} }
client?.engineDidClose(reason) client?.engineDidClose(reason: reason)
} else { } else {
flushProbeWait() flushProbeWait()
} }

View File

@ -29,6 +29,6 @@ import Foundation
func engineDidError(reason: String) func engineDidError(reason: String)
func engineDidClose(reason: String) func engineDidClose(reason: String)
optional func engineDidOpen(reason: String) optional func engineDidOpen(reason: String)
func parseEngineMessage(msg: String) func parseEngineMessage(_ msg: String)
func parseEngineBinaryData(data: NSData) func parseEngineBinaryData(_ data: NSData)
} }

View File

@ -39,13 +39,13 @@ public protocol SocketEnginePollable : SocketEngineSpec {
var waitingForPost: Bool { get set } var waitingForPost: Bool { get set }
func doPoll() func doPoll()
func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [NSData])
func stopPolling() func stopPolling()
} }
// Default polling methods // Default polling methods
extension SocketEnginePollable { extension SocketEnginePollable {
private func addHeaders(req: NSMutableURLRequest) { private func addHeaders(for req: NSMutableURLRequest) {
if cookies != nil { if cookies != nil {
let headers = NSHTTPCookie.requestHeaderFields(with: cookies!) let headers = NSHTTPCookie.requestHeaderFields(with: cookies!)
req.allHTTPHeaderFields = headers req.allHTTPHeaderFields = headers
@ -73,12 +73,12 @@ extension SocketEnginePollable {
let req = NSMutableURLRequest(url: urlPollingWithSid) let req = NSMutableURLRequest(url: urlPollingWithSid)
addHeaders(req) addHeaders(for: req)
req.httpMethod = "POST" req.httpMethod = "POST"
req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type") req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
let postData = postStr.data(usingEncoding: NSUTF8StringEncoding, let postData = postStr.data(using: NSUTF8StringEncoding,
allowLossyConversion: false)! allowLossyConversion: false)!
req.httpBody = postData req.httpBody = postData
@ -95,11 +95,11 @@ extension SocketEnginePollable {
waitingForPoll = true waitingForPoll = true
let req = NSMutableURLRequest(url: urlPollingWithSid) let req = NSMutableURLRequest(url: urlPollingWithSid)
addHeaders(req) addHeaders(for: req)
doLongPoll(req) doLongPoll(for: req)
} }
func doRequest(req: NSURLRequest, callbackWith callback: (NSData?, NSURLResponse?, NSError?) -> Void) { func doRequest(for req: NSURLRequest, callbackWith callback: (NSData?, NSURLResponse?, NSError?) -> Void) {
if !polling || closed || invalidated || fastUpgrade { if !polling || closed || invalidated || fastUpgrade {
DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEnginePolling") DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEnginePolling")
return return
@ -110,15 +110,15 @@ extension SocketEnginePollable {
session?.dataTask(with: req, completionHandler: callback).resume() session?.dataTask(with: req, completionHandler: callback).resume()
} }
func doLongPoll(req: NSURLRequest) { func doLongPoll(for req: NSURLRequest) {
doRequest(req) {[weak self] data, res, err in doRequest(for: req) {[weak self] data, res, err in
guard let this = self where this.polling else { return } guard let this = self where this.polling else { return }
if err != nil || data == nil { if err != nil || data == nil {
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling")
if this.polling { if this.polling {
this.didError(err?.localizedDescription ?? "Error") this.didError(error: err?.localizedDescription ?? "Error")
} }
return return
@ -156,14 +156,14 @@ extension SocketEnginePollable {
DefaultSocketLogger.Logger.log("POSTing", type: "SocketEnginePolling") DefaultSocketLogger.Logger.log("POSTing", type: "SocketEnginePolling")
doRequest(req) {[weak self] data, res, err in doRequest(for: req) {[weak self] data, res, err in
guard let this = self else { return } guard let this = self else { return }
if err != nil { if err != nil {
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling")
if this.polling { if this.polling {
this.didError(err?.localizedDescription ?? "Error") this.didError(error: err?.localizedDescription ?? "Error")
} }
return return
@ -180,14 +180,14 @@ extension SocketEnginePollable {
} }
} }
func parsePollingMessage(str: String) { func parsePollingMessage(_ str: String) {
guard str.characters.count != 1 else { return } guard str.characters.count != 1 else { return }
var reader = SocketStringReader(message: str) var reader = SocketStringReader(message: str)
while reader.hasNext { while reader.hasNext {
if let n = Int(reader.readUntilStringOccurence(":")) { if let n = Int(reader.readUntilStringOccurence(":")) {
let str = reader.read(n) let str = reader.read(length: n)
dispatch_async(handleQueue) { dispatch_async(handleQueue) {
self.parseEngineMessage(str, fromPolling: true) self.parseEngineMessage(str, fromPolling: true)
@ -203,12 +203,12 @@ extension SocketEnginePollable {
/// Send polling message. /// Send polling message.
/// Only call on emitQueue /// Only call on emitQueue
public func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { public func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) {
DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEnginePolling", args: message, type.rawValue) DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEnginePolling", args: message, type.rawValue)
let fixedMessage: String let fixedMessage: String
if doubleEncodeUTF8 { if doubleEncodeUTF8 {
fixedMessage = doubleEncodeUTF8(message) fixedMessage = doubleEncodeUTF8(string: message)
} else { } else {
fixedMessage = message fixedMessage = message
} }
@ -218,7 +218,7 @@ extension SocketEnginePollable {
postWait.append(strMsg) postWait.append(strMsg)
for data in datas { for data in datas {
if case let .Right(bin) = createBinaryDataForSend(data) { if case let .Right(bin) = createBinaryDataForSend(using: data) {
postWait.append(bin) postWait.append(bin)
} }
} }

View File

@ -55,9 +55,9 @@ import Foundation
func disconnect(reason: String) func disconnect(reason: String)
func doFastUpgrade() func doFastUpgrade()
func flushWaitingForPostToWebSocket() func flushWaitingForPostToWebSocket()
func parseEngineData(data: NSData) func parseEngineData(_ data: NSData)
func parseEngineMessage(message: String, fromPolling: Bool) func parseEngineMessage(_ message: String, fromPolling: Bool)
func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) func write(_ msg: String, withType type: SocketEnginePacketType, withData data: [NSData])
} }
extension SocketEngineSpec { extension SocketEngineSpec {
@ -75,7 +75,7 @@ extension SocketEngineSpec {
return com.url! return com.url!
} }
func createBinaryDataForSend(data: NSData) -> Either<NSData, String> { func createBinaryDataForSend(using data: NSData) -> Either<NSData, String> {
if websocket { if websocket {
var byteArray = [UInt8](repeating: 0x4, count: 1) var byteArray = [UInt8](repeating: 0x4, count: 1)
let mutData = NSMutableData(bytes: &byteArray, length: 1) let mutData = NSMutableData(bytes: &byteArray, length: 1)
@ -91,7 +91,7 @@ extension SocketEngineSpec {
} }
func doubleEncodeUTF8(string: String) -> String { func doubleEncodeUTF8(string: String) -> String {
if let latin1 = string.data(usingEncoding: NSUTF8StringEncoding), if let latin1 = string.data(using: NSUTF8StringEncoding),
utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding) { utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding) {
return utf8 as String return utf8 as String
} else { } else {
@ -100,7 +100,7 @@ extension SocketEngineSpec {
} }
func fixDoubleUTF8(string: String) -> String { func fixDoubleUTF8(string: String) -> String {
if let utf8 = string.data(usingEncoding: NSISOLatin1StringEncoding), if let utf8 = string.data(using: NSISOLatin1StringEncoding),
latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding) { latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding) {
return latin1 as String return latin1 as String
} else { } else {
@ -109,7 +109,7 @@ extension SocketEngineSpec {
} }
/// Send an engine message (4) /// Send an engine message (4)
func send(msg: String, withData datas: [NSData]) { func send(_ msg: String, withData datas: [NSData]) {
write(msg, withType: .message, withData: datas) write(msg, withType: .message, withData: datas)
} }
} }

View File

@ -29,7 +29,7 @@ import Foundation
public protocol SocketEngineWebsocket : SocketEngineSpec, WebSocketDelegate { public protocol SocketEngineWebsocket : SocketEngineSpec, WebSocketDelegate {
var ws: WebSocket? { get } var ws: WebSocket? { get }
func sendWebSocketMessage(str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [NSData])
} }
// WebSocket methods // WebSocket methods
@ -42,14 +42,14 @@ extension SocketEngineWebsocket {
/// Send message on WebSockets /// Send message on WebSockets
/// Only call on emitQueue /// Only call on emitQueue
public func sendWebSocketMessage(str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { public func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [NSData]) {
DefaultSocketLogger.Logger.log("Sending ws: %@ as type: %@", type: "SocketEngine", args: str, type.rawValue) DefaultSocketLogger.Logger.log("Sending ws: %@ as type: %@", type: "SocketEngine", args: str, type.rawValue)
ws?.writeString("\(type.rawValue)\(str)") ws?.writeString(str: "\(type.rawValue)\(str)")
for data in datas { for data in datas {
if case let .Left(bin) = createBinaryDataForSend(data) { if case let .Left(bin) = createBinaryDataForSend(using: data) {
ws?.writeData(bin) ws?.writeData(data: bin)
} }
} }
} }

View File

@ -71,7 +71,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
self.socketURL = socketURL self.socketURL = socketURL
if socketURL.absoluteString.hasPrefix("https://") { if socketURL.absoluteString.hasPrefix("https://") {
self.options.insertIgnore(.secure(true)) self.options.insertIgnore(element: .secure(true))
} }
for option in options { for option in options {
@ -97,7 +97,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
} }
self.options.insertIgnore(.path("/socket.io/")) self.options.insertIgnore(element: .path("/socket.io/"))
super.init() super.init()
} }
@ -110,7 +110,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
deinit { deinit {
DefaultSocketLogger.Logger.log("Client is being released", type: logType) DefaultSocketLogger.Logger.log("Client is being released", type: logType)
engine?.disconnect("Client Deinit") engine?.disconnect(reason: "Client Deinit")
} }
private func addEngine() -> SocketEngineSpec { private func addEngine() -> SocketEngineSpec {
@ -127,7 +127,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
/// Connect to the server. If we aren't connected after timeoutAfter, call handler /// Connect to the server. If we aren't connected after timeoutAfter, call handler
public func connect(timeoutAfter timeoutAfter: Int, handleWith handler: (() -> Void)?) { public func connect(timeoutAfter: Int, handleWith handler: (() -> Void)?) {
assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)")
guard status != .connected else { guard status != .connected else {
@ -151,7 +151,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
dispatch_after(time, handleQueue) {[weak self] in dispatch_after(time, handleQueue) {[weak self] in
if let this = self where this.status != .connected && this.status != .closed { if let this = self where this.status != .connected && this.status != .closed {
this.status = .closed this.status = .closed
this.engine?.disconnect("Connect timeout") this.engine?.disconnect(reason: "Connect timeout")
handler?() handler?()
} }
@ -164,7 +164,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
return {[weak self, ack = currentAck] timeout, callback in return {[weak self, ack = currentAck] timeout, callback in
if let this = self { if let this = self {
this.ackHandlers.addAck(ack, callback: callback) this.ackHandlers.addAck(ack, callback: callback)
this._emit(items, ack: ack) this._emit(data: 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))
@ -195,7 +195,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
reconnects = false reconnects = false
// Make sure the engine is actually dead. // Make sure the engine is actually dead.
engine?.disconnect(reason) engine?.disconnect(reason: reason)
handleEvent("disconnect", data: [reason], isInternalMessage: true) handleEvent("disconnect", data: [reason], isInternalMessage: true)
} }
@ -205,33 +205,33 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
DefaultSocketLogger.Logger.log("Closing socket", type: logType) DefaultSocketLogger.Logger.log("Closing socket", type: logType)
reconnects = false reconnects = false
didDisconnect("Disconnect") didDisconnect(reason: "Disconnect")
} }
/// Send a message to the server /// Send a message to the server
public func emit(event: String, _ items: AnyObject...) { public func emit(_ event: String, _ items: AnyObject...) {
emit(event, with: items) emit(event, with: items)
} }
/// Same as emit, but meant for Objective-C /// Same as emit, but meant for Objective-C
public func emit(event: String, with items: [AnyObject]) { public func emit(_ event: String, with items: [AnyObject]) {
guard status == .connected else { guard status == .connected else {
handleEvent("error", data: ["Tried emitting \(event) when not connected"], isInternalMessage: true) handleEvent("error", data: ["Tried emitting \(event) when not connected"], isInternalMessage: true)
return return
} }
_emit([event] + items) _emit(data: [event] + items)
} }
/// Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add /// Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add
/// an ack. /// an ack.
public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { public func emitWithAck(_ event: String, _ items: AnyObject...) -> OnAckCallback {
return emitWithAck(event, with: items) return emitWithAck(event, with: items)
} }
/// Same as emitWithAck, but for Objective-C /// Same as emitWithAck, but for Objective-C
public func emitWithAck(event: String, with items: [AnyObject]) -> OnAckCallback { public func emitWithAck(_ event: String, with items: [AnyObject]) -> OnAckCallback {
return createOnAck([event] + items) return createOnAck(items: [event] + items)
} }
private func _emit(data: [AnyObject], ack: Int? = nil) { private func _emit(data: [AnyObject], ack: Int? = nil) {
@ -241,7 +241,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
return return
} }
let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: self.nsp, ack: false) let packet = SocketPacket.packetFromEmit(items: data, id: ack ?? -1, nsp: self.nsp, ack: false)
let str = packet.packetString let str = packet.packetString
DefaultSocketLogger.Logger.log("Emitting: %@", type: self.logType, args: str) DefaultSocketLogger.Logger.log("Emitting: %@", type: self.logType, args: str)
@ -251,10 +251,10 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
// 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, with items: [AnyObject]) { func emitAck(_ ack: Int, with items: [AnyObject]) {
dispatch_async(emitQueue) { dispatch_async(emitQueue) {
if self.status == .connected { if self.status == .connected {
let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) let packet = SocketPacket.packetFromEmit(items: items, id: ack ?? -1, nsp: self.nsp, ack: true)
let str = packet.packetString let str = packet.packetString
DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str) DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str)
@ -272,7 +272,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
if status == .closed || !reconnects { if status == .closed || !reconnects {
didDisconnect(reason) didDisconnect(reason: reason)
} else if !reconnecting { } else if !reconnecting {
reconnecting = true reconnecting = true
tryReconnect(reason: reason) tryReconnect(reason: reason)
@ -287,7 +287,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
// 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]) {
guard status == .connected else { return } guard status == .connected else { return }
DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "") DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "")
@ -296,7 +296,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
/// Causes an event to be handled. Only use if you know what you're doing. /// Causes an event to be handled. Only use if you know what you're doing.
public func handleEvent(event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int = -1) { public func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int = -1) {
guard status == .connected || isInternalMessage else { guard status == .connected || isInternalMessage else {
return return
} }
@ -307,7 +307,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
self.anyHandler?(SocketAnyEvent(event: event, items: data)) self.anyHandler?(SocketAnyEvent(event: event, items: data))
for handler in self.handlers where handler.event == event { for handler in self.handlers where handler.event == event {
handler.executeCallback(data, withAck: ack, withSocket: self) handler.executeCallback(items: data, withAck: ack, withSocket: self)
} }
} }
} }
@ -321,7 +321,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
/// Joins namespace /// Joins namespace
public func joinNamespace(namespace: String) { public func joinNamespace(_ namespace: String) {
nsp = namespace nsp = namespace
if nsp != "/" { if nsp != "/" {
@ -338,7 +338,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
/// Removes a handler with the specified UUID gotten from an `on` or `once` /// Removes a handler with the specified UUID gotten from an `on` or `once`
public func off(id id: NSUUID) { public func off(id: NSUUID) {
DefaultSocketLogger.Logger.log("Removing handler with id: %@", type: logType, args: id) DefaultSocketLogger.Logger.log("Removing handler with id: %@", type: logType, args: id)
handlers = handlers.filter { $0.id != id } handlers = handlers.filter { $0.id != id }
@ -346,7 +346,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
/// Adds a handler for an event. /// Adds a handler for an event.
/// Returns: A unique id for the handler /// Returns: A unique id for the handler
public func on(event: String, callback: NormalCallback) -> NSUUID { public func on(_ event: String, callback: NormalCallback) -> NSUUID {
DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event) DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event)
let handler = SocketEventHandler(event: event, id: NSUUID(), callback: callback) let handler = SocketEventHandler(event: event, id: NSUUID(), callback: callback)
@ -378,7 +378,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
anyHandler = handler anyHandler = handler
} }
public func parseEngineMessage(msg: String) { public func parseEngineMessage(_ msg: String) {
DefaultSocketLogger.Logger.log("Should parse message: %@", type: "SocketIOClient", args: msg) DefaultSocketLogger.Logger.log("Should parse message: %@", type: "SocketIOClient", args: msg)
dispatch_async(parseQueue) { dispatch_async(parseQueue) {
@ -386,7 +386,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
} }
public func parseEngineBinaryData(data: NSData) { public func parseEngineBinaryData(_ data: NSData) {
dispatch_async(parseQueue) { dispatch_async(parseQueue) {
self.parseBinaryData(data) self.parseBinaryData(data)
} }
@ -396,7 +396,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
public func reconnect() { public func reconnect() {
guard !reconnecting else { return } guard !reconnecting else { return }
engine?.disconnect("manual reconnect") engine?.disconnect(reason: "manual reconnect")
} }
/// Removes all handlers. /// Removes all handlers.
@ -405,7 +405,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
handlers.removeAll(keepingCapacity: false) handlers.removeAll(keepingCapacity: false)
} }
private func tryReconnect(reason reason: String) { private func tryReconnect(reason: String) {
if reconnecting { if reconnecting {
DefaultSocketLogger.Logger.log("Starting reconnect", type: logType) DefaultSocketLogger.Logger.log("Starting reconnect", type: logType)
handleEvent("reconnect", data: [reason], isInternalMessage: true) handleEvent("reconnect", data: [reason], isInternalMessage: true)
@ -420,7 +420,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
} }
if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects {
return didDisconnect("Reconnect Failed") return didDisconnect(reason: "Reconnect Failed")
} }
DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType) DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType)
@ -451,6 +451,6 @@ extension SocketIOClient {
} }
func emitTest(event: String, _ data: AnyObject...) { func emitTest(event: String, _ data: AnyObject...) {
self._emit([event] + data) self._emit(data: [event] + data)
} }
} }

View File

@ -210,8 +210,8 @@ extension NSDictionary {
var options = Set<SocketIOClientOption>() var options = Set<SocketIOClientOption>()
for (rawKey, value) in self { for (rawKey, value) in self {
if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key: key, value: value) {
options.insertIgnore(opt) options.insertIgnore(element: opt)
} }
} }

View File

@ -29,9 +29,9 @@ protocol SocketIOClientSpec : class {
func didConnect() func didConnect()
func didDisconnect(reason: String) func didDisconnect(reason: String)
func didError(reason: String) func didError(reason: String)
func handleAck(ack: Int, data: [AnyObject]) func handleAck(_ ack: Int, data: [AnyObject])
func handleEvent(event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int) func handleEvent(_ event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int)
func joinNamespace(namespace: String) func joinNamespace(_ namespace: String)
} }
extension SocketIOClientSpec { extension SocketIOClientSpec {

View File

@ -29,22 +29,22 @@ public protocol SocketLogger : class {
var log: Bool { get set } var log: Bool { get set }
/// Normal log messages /// Normal log messages
func log(message: String, type: String, args: AnyObject...) func log(_ message: String, type: String, args: AnyObject...)
/// Error Messages /// Error Messages
func error(message: String, type: String, args: AnyObject...) func error(_ message: String, type: String, args: AnyObject...)
} }
public extension SocketLogger { public extension SocketLogger {
func log(message: String, type: String, args: AnyObject...) { func log(_ message: String, type: String, args: AnyObject...) {
abstractLog("LOG", message: message, type: type, args: args) abstractLog("LOG", message: message, type: type, args: args)
} }
func error(message: String, type: String, args: AnyObject...) { func error(_ message: String, type: String, args: AnyObject...) {
abstractLog("ERROR", message: message, type: type, args: args) abstractLog("ERROR", message: message, type: type, args: args)
} }
private func abstractLog(logType: String, message: String, type: String, args: [AnyObject]) { private func abstractLog(_ logType: String, message: String, type: String, args: [AnyObject]) {
guard log else { return } guard log else { return }
let newArgs = args.map({arg -> CVarArg in String(arg)}) let newArgs = args.map({arg -> CVarArg in String(arg)})

View File

@ -71,7 +71,7 @@ struct SocketPacket {
self.binary = binary self.binary = binary
} }
mutating func addData(data: NSData) -> Bool { mutating func addData(_ data: NSData) -> Bool {
if placeholders == binary.count { if placeholders == binary.count {
return true return true
} }
@ -86,7 +86,7 @@ struct SocketPacket {
} }
} }
private func completeMessage(message: String) -> String { private func completeMessage(_ message: String) -> String {
let restOfMessage: String let restOfMessage: String
if data.count == 0 { if data.count == 0 {
@ -191,7 +191,7 @@ struct SocketPacket {
// If object is a collection it will recurse // If object is a collection it will recurse
// Returns the object if it is not a placeholder string or the corresponding // Returns the object if it is not a placeholder string or the corresponding
// binary data // binary data
private func _fillInPlaceholders(object: AnyObject) -> AnyObject { private func _fillInPlaceholders(_ object: AnyObject) -> AnyObject {
switch object { switch object {
case let string as String where string["~~(\\d)"].groups() != nil: case let string as String where string["~~(\\d)"].groups() != nil:
return binary[Int(string["~~(\\d)"].groups()![1])!] return binary[Int(string["~~(\\d)"].groups()![1])!]
@ -226,7 +226,7 @@ extension SocketPacket {
static func packetFromEmit(items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket { static func packetFromEmit(items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket {
let (parsedData, binary) = deconstructData(items) let (parsedData, binary) = deconstructData(items)
let packet = SocketPacket(type: findType(binary.count, ack: ack), data: parsedData, let packet = SocketPacket(type: findType(binCount: binary.count, ack: ack), data: parsedData,
id: id, nsp: nsp, placeholders: -1, binary: binary) id: id, nsp: nsp, placeholders: -1, binary: binary)
return packet return packet
@ -235,7 +235,7 @@ extension SocketPacket {
private extension SocketPacket { private extension SocketPacket {
// Recursive function that looks for NSData in collections // Recursive function that looks for NSData in collections
static func shred(data: AnyObject, binary: inout [NSData]) -> AnyObject { static func shred(_ data: AnyObject, binary: inout [NSData]) -> AnyObject {
let placeholder = ["_placeholder": true, "num": binary.count] let placeholder = ["_placeholder": true, "num": binary.count]
switch data { switch data {
@ -256,7 +256,7 @@ private extension SocketPacket {
// Removes binary data from emit data // Removes binary data from emit data
// Returns a type containing the de-binaryed data and the binary // Returns a type containing the de-binaryed data and the binary
static func deconstructData(data: [AnyObject]) -> ([AnyObject], [NSData]) { static func deconstructData(_ data: [AnyObject]) -> ([AnyObject], [NSData]) {
var binary = [NSData]() var binary = [NSData]()
return (data.map({shred($0, binary: &binary)}), binary) return (data.map({shred($0, binary: &binary)}), binary)

View File

@ -23,16 +23,16 @@
import Foundation import Foundation
protocol SocketParsable : SocketIOClientSpec { protocol SocketParsable : SocketIOClientSpec {
func parseBinaryData(data: NSData) func parseBinaryData(_ data: NSData)
func parseSocketMessage(message: String) func parseSocketMessage(_ message: String)
} }
extension SocketParsable { extension SocketParsable {
private func isCorrectNamespace(nsp: String) -> Bool { private func isCorrectNamespace(_ nsp: String) -> Bool {
return nsp == self.nsp return nsp == self.nsp
} }
private func handleConnect(p: SocketPacket) { private func handleConnect(_ p: SocketPacket) {
if p.nsp == "/" && nsp != "/" { if p.nsp == "/" && nsp != "/" {
joinNamespace(nsp) joinNamespace(nsp)
} else if p.nsp != "/" && nsp == "/" { } else if p.nsp != "/" && nsp == "/" {
@ -42,7 +42,7 @@ extension SocketParsable {
} }
} }
private func handlePacket(pack: SocketPacket) { private func handlePacket(_ pack: SocketPacket) {
switch pack.type { switch pack.type {
case .Event where isCorrectNamespace(pack.nsp): case .Event where isCorrectNamespace(pack.nsp):
handleEvent(pack.event, data: pack.args, isInternalMessage: false, withAck: pack.id) handleEvent(pack.event, data: pack.args, isInternalMessage: false, withAck: pack.id)
@ -55,7 +55,7 @@ extension SocketParsable {
case .Connect: case .Connect:
handleConnect(pack) handleConnect(pack)
case .Disconnect: case .Disconnect:
didDisconnect("Got Disconnect") didDisconnect(reason: "Got Disconnect")
case .Error: case .Error:
handleEvent("error", data: pack.data, isInternalMessage: true, withAck: pack.id) handleEvent("error", data: pack.data, isInternalMessage: true, withAck: pack.id)
default: default:
@ -64,10 +64,10 @@ extension SocketParsable {
} }
/// Parses a messsage from the engine. Returning either a string error or a complete SocketPacket /// Parses a messsage from the engine. Returning either a string error or a complete SocketPacket
func parseString(message: String) -> Either<String, SocketPacket> { func parseString(_ message: String) -> Either<String, SocketPacket> {
var parser = SocketStringReader(message: message) var parser = SocketStringReader(message: message)
guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(1)) ?? -1) else { guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(length: 1)) ?? -1) else {
return .Left("Invalid packet type") return .Left("Invalid packet type")
} }
@ -98,14 +98,14 @@ extension SocketParsable {
var idString = "" var idString = ""
if type == .Error { if type == .Error {
parser.advanceIndexBy(-1) parser.advance(by: -1)
} }
while parser.hasNext && type != .Error { while parser.hasNext && type != .Error {
if let int = Int(parser.read(1)) { if let int = Int(parser.read(length: 1)) {
idString += String(int) idString += String(int)
} else { } else {
parser.advanceIndexBy(-2) parser.advance(by: -2)
break break
} }
} }
@ -129,8 +129,8 @@ extension SocketParsable {
} }
// Parses data for events // Parses data for events
private func parseData(data: String) -> Either<String, [AnyObject]> { private func parseData(_ data: String) -> Either<String, [AnyObject]> {
let stringData = data.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false) let stringData = data.data(using: NSUTF8StringEncoding, allowLossyConversion: false)
do { do {
if let arr = try NSJSONSerialization.jsonObject(with: stringData!, if let arr = try NSJSONSerialization.jsonObject(with: stringData!,
options: NSJSONReadingOptions.mutableContainers) as? [AnyObject] { options: NSJSONReadingOptions.mutableContainers) as? [AnyObject] {
@ -144,7 +144,7 @@ extension SocketParsable {
} }
// Parses messages recieved // Parses messages recieved
func parseSocketMessage(message: String) { func parseSocketMessage(_ message: String) {
guard !message.isEmpty else { return } guard !message.isEmpty else { return }
DefaultSocketLogger.Logger.log("Parsing %@", type: "SocketParser", args: message) DefaultSocketLogger.Logger.log("Parsing %@", type: "SocketParser", args: message)
@ -158,7 +158,7 @@ extension SocketParsable {
} }
} }
func parseBinaryData(data: NSData) { func parseBinaryData(_ data: NSData) {
guard !waitingPackets.isEmpty else { guard !waitingPackets.isEmpty else {
DefaultSocketLogger.Logger.error("Got data when not remaking packet", type: "SocketParser") DefaultSocketLogger.Logger.error("Got data when not remaking packet", type: "SocketParser")
return return

View File

@ -38,18 +38,18 @@ struct SocketStringReader {
currentIndex = message.startIndex currentIndex = message.startIndex
} }
mutating func advanceIndexBy(n: Int) { mutating func advance(by: Int) {
currentIndex = currentIndex.advanced(by: n) currentIndex = currentIndex.advanced(by: by)
} }
mutating func read(readLength: Int) -> String { mutating func read(length: Int) -> String {
let readString = message[currentIndex..<currentIndex.advanced(by: readLength)] let readString = message[currentIndex..<currentIndex.advanced(by: length)]
advanceIndexBy(readLength) advance(by: length)
return readString return readString
} }
mutating func readUntilStringOccurence(string: String) -> String { mutating func readUntilStringOccurence(_ string: String) -> String {
let substring = message[currentIndex..<message.endIndex] let substring = message[currentIndex..<message.endIndex]
guard let foundRange = substring.range(of: string) else { guard let foundRange = substring.range(of: string) else {
currentIndex = message.endIndex currentIndex = message.endIndex
@ -57,12 +57,12 @@ struct SocketStringReader {
return substring return substring
} }
advanceIndexBy(message.startIndex.distance(to: foundRange.startIndex) + 1) advance(by: message.startIndex.distance(to: foundRange.startIndex) + 1)
return substring.substring(to: foundRange.startIndex) return substring.substring(to: foundRange.startIndex)
} }
mutating func readUntilEnd() -> String { mutating func readUntilEnd() -> String {
return read(currentIndex.distance(to: message.endIndex)) return read(length: currentIndex.distance(to: message.endIndex))
} }
} }

View File

@ -31,7 +31,7 @@ internal final class SwiftRegex : NSObject, Boolean {
NSRegularExpressionOptions.dotMatchesLineSeparators) NSRegularExpressionOptions.dotMatchesLineSeparators)
self.regex = regex self.regex = regex
} catch let error as NSError { } catch let error as NSError {
SwiftRegex.failure("Error in pattern: \(pattern) - \(error)") SwiftRegex.failure(message: "Error in pattern: \(pattern) - \(error)")
self.regex = NSRegularExpression() self.regex = NSRegularExpression()
} }
@ -48,7 +48,7 @@ internal final class SwiftRegex : NSObject, Boolean {
swiftRegexCache[pattern] = regex swiftRegexCache[pattern] = regex
self.regex = regex self.regex = regex
} catch let error as NSError { } catch let error as NSError {
SwiftRegex.failure("Error in pattern: \(pattern) - \(error)") SwiftRegex.failure(message: "Error in pattern: \(pattern) - \(error)")
self.regex = NSRegularExpression() self.regex = NSRegularExpression()
} }
} }
@ -73,7 +73,7 @@ internal final class SwiftRegex : NSObject, Boolean {
} }
func doesMatch(options: NSMatchingOptions!) -> Bool { func doesMatch(options: NSMatchingOptions!) -> Bool {
return range(options).location != NSNotFound return range(options: options).location != NSNotFound
} }
func range(options: NSMatchingOptions) -> NSRange { func range(options: NSMatchingOptions) -> NSRange {
@ -81,11 +81,11 @@ internal final class SwiftRegex : NSObject, Boolean {
} }
func match(options: NSMatchingOptions) -> String? { func match(options: NSMatchingOptions) -> String? {
return substring(range(options)) return substring(range: range(options: options))
} }
func groups() -> [String]? { func groups() -> [String]? {
return groupsForMatch(regex.firstMatch(in: target as String, options: return groupsForMatch(match: regex.firstMatch(in: target as String, options:
NSMatchingOptions.withoutAnchoringBounds, range: targetRange)) NSMatchingOptions.withoutAnchoringBounds, range: targetRange))
} }
@ -95,7 +95,7 @@ internal final class SwiftRegex : NSObject, Boolean {
} }
var groups = [String]() var groups = [String]()
for groupno in 0...regex.numberOfCaptureGroups { for groupno in 0...regex.numberOfCaptureGroups {
if let group = substring(match.range(at: groupno)) { if let group = substring(range: match.range(at: groupno)) {
groups += [group] groups += [group]
} else { } else {
groups += ["_"] // avoids bridging problems groups += ["_"] // avoids bridging problems
@ -138,17 +138,17 @@ internal final class SwiftRegex : NSObject, Boolean {
} }
func matches() -> [String] { func matches() -> [String] {
return matchResults().map( { self.substring($0.range)!}) return matchResults().map( { self.substring(range: $0.range)!})
} }
func allGroups() -> [[String]?] { func allGroups() -> [[String]?] {
return matchResults().map { self.groupsForMatch($0) } return matchResults().map { self.groupsForMatch(match: $0) }
} }
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.range(at: 1))!] = substring(match.range(at: 2))! out[substring(range: match.range(at: 1))!] = substring(range: match.range(at: 2))!
} }
return out return out
} }
@ -160,18 +160,18 @@ internal final class SwiftRegex : NSObject, Boolean {
regex.enumerateMatches(in: target as String, options: options, range: targetRange ) {match, flags, stop in regex.enumerateMatches(in: target as String, options: options, range: targetRange ) {match, flags, stop in
let matchRange = match!.range let matchRange = match!.range
out.append( self.substring(NSRange(location:pos, length:matchRange.location-pos))!) out.append( self.substring(range: NSRange(location:pos, length:matchRange.location-pos))!)
out.append( substitution(match!, stop) ) out.append( substitution(match!, stop) )
pos = matchRange.location + matchRange.length pos = matchRange.location + matchRange.length
} }
out.append(substring(NSRange(location:pos, length:targetRange.length-pos))!) out.append(substring(range: NSRange(location:pos, length:targetRange.length-pos))!)
return out as String return out as String
} }
var boolValue: Bool { var boolValue: Bool {
return doesMatch(nil) return doesMatch(options: nil)
} }
} }
@ -188,7 +188,7 @@ extension String {
} }
func <~ (left: SwiftRegex, right: String) -> String { func <~ (left: SwiftRegex, right: String) -> String {
return left.substituteMatches({match, stop in return left.substituteMatches(substitution: {match, stop in
return left.regex.replacementString(for: match, in: left.target as String, offset: 0, template: right ) return left.regex.replacementString(for: match, in: left.target as String, offset: 0, template: right )
}, options: []) }, options: [])
} }

View File

@ -60,7 +60,10 @@ public class WebSocket : NSObject, NSStreamDelegate {
case MessageTooBig = 1009 case MessageTooBig = 1009
} }
#if swift(>=3)
#else
public static let ErrorDomain = "WebSocket" public static let ErrorDomain = "WebSocket"
#endif
enum InternalErrorCode : UInt16 { enum InternalErrorCode : UInt16 {
// 0-999 WebSocket status codes not used // 0-999 WebSocket status codes not used
@ -167,18 +170,18 @@ public class WebSocket : NSObject, NSStreamDelegate {
- Parameter forceTimeout: Maximum time to wait for the server to close the socket. - Parameter forceTimeout: Maximum time to wait for the server to close the socket.
*/ */
public func disconnect(forceTimeout forceTimeout: NSTimeInterval? = nil) { public func disconnect(forceTimeout: NSTimeInterval? = nil) {
switch forceTimeout { switch forceTimeout {
case .some(let seconds) where seconds > 0: case .some(let seconds) where seconds > 0:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))), queue) { [weak self] in dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))), queue) { [weak self] in
self?.disconnectStream(nil) self?.disconnectStream(error: nil)
} }
fallthrough fallthrough
case .none: case .none:
writeError(CloseCode.Normal.rawValue) writeError(code: CloseCode.Normal.rawValue)
default: default:
self.disconnectStream(nil) self.disconnectStream(error: nil)
break break
} }
} }
@ -192,7 +195,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
*/ */
public func writeString(str: String, completion: (() -> ())? = nil) { public func writeString(str: String, completion: (() -> ())? = nil) {
guard isConnected else { return } guard isConnected else { return }
dequeueWrite(str.data(usingEncoding: NSUTF8StringEncoding)!, code: .TextFrame, writeCompletion: completion) dequeueWrite(data: str.data(using: NSUTF8StringEncoding)!, code: .TextFrame, writeCompletion: completion)
} }
/** /**
@ -204,14 +207,14 @@ public class WebSocket : NSObject, NSStreamDelegate {
*/ */
public func writeData(data: NSData, completion: (() -> ())? = nil) { public func writeData(data: NSData, completion: (() -> ())? = nil) {
guard isConnected else { return } guard isConnected else { return }
dequeueWrite(data, code: .BinaryFrame, writeCompletion: completion) dequeueWrite(data: data, code: .BinaryFrame, writeCompletion: completion)
} }
//write a ping to the websocket. This sends it as a control frame. //write a ping to the websocket. This sends it as a control frame.
//yodel a sound to the planet. This sends it as an astroid. http://youtu.be/Eu5ZJELRiJ8?t=42s //yodel a sound to the planet. This sends it as an astroid. http://youtu.be/Eu5ZJELRiJ8?t=42s
public func writePing(data: NSData, completion: (() -> ())? = nil) { public func writePing(data: NSData, completion: (() -> ())? = nil) {
guard isConnected else { return } guard isConnected else { return }
dequeueWrite(data, code: .Ping, writeCompletion: completion) dequeueWrite(data: data, code: .Ping, writeCompletion: completion)
} }
//private method that starts the connection //private method that starts the connection
@ -228,23 +231,23 @@ public class WebSocket : NSObject, NSStreamDelegate {
port = 80 port = 80
} }
} }
addHeader(urlRequest, key: headerWSUpgradeName, val: headerWSUpgradeValue) addHeader(urlRequest: urlRequest, key: headerWSUpgradeName, val: headerWSUpgradeValue)
addHeader(urlRequest, key: headerWSConnectionName, val: headerWSConnectionValue) addHeader(urlRequest: urlRequest, key: headerWSConnectionName, val: headerWSConnectionValue)
if let protocols = optionalProtocols { if let protocols = optionalProtocols {
addHeader(urlRequest, key: headerWSProtocolName, val: protocols.joined(separator: ",")) addHeader(urlRequest: urlRequest, key: headerWSProtocolName, val: protocols.joined(separator: ","))
} }
addHeader(urlRequest, key: headerWSVersionName, val: headerWSVersionValue) addHeader(urlRequest: urlRequest, key: headerWSVersionName, val: headerWSVersionValue)
addHeader(urlRequest, key: headerWSKeyName, val: generateWebSocketKey()) addHeader(urlRequest: urlRequest, key: headerWSKeyName, val: generateWebSocketKey())
if let origin = origin { if let origin = origin {
addHeader(urlRequest, key: headerOriginName, val: origin) addHeader(urlRequest: urlRequest, key: headerOriginName, val: origin)
} }
addHeader(urlRequest, key: headerWSHostName, val: "\(url.host!):\(port!)") addHeader(urlRequest: urlRequest, key: headerWSHostName, val: "\(url.host!):\(port!)")
for (key,value) in headers { for (key,value) in headers {
addHeader(urlRequest, key: key, val: value) addHeader(urlRequest: urlRequest, key: key, val: value)
} }
if let cfHTTPMessage = CFHTTPMessageCopySerializedMessage(urlRequest) { if let cfHTTPMessage = CFHTTPMessageCopySerializedMessage(urlRequest) {
let serializedRequest = cfHTTPMessage.takeRetainedValue() let serializedRequest = cfHTTPMessage.takeRetainedValue()
initStreamsWithData(serializedRequest, Int(port!)) initStreamsWithData(data: serializedRequest, Int(port!))
} }
} }
@ -261,7 +264,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
let uni = UnicodeScalar(UInt32(97 + arc4random_uniform(25))) let uni = UnicodeScalar(UInt32(97 + arc4random_uniform(25)))
key += "\(Character(uni))" key += "\(Character(uni))"
} }
let data = key.data(usingEncoding: NSUTF8StringEncoding) let data = key.data(using: NSUTF8StringEncoding)
let baseKey = data?.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0)) let baseKey = data?.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0))
return baseKey! return baseKey!
} }
@ -291,7 +294,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
outStream.setProperty(NSStreamNetworkServiceTypeVoIP, forKey: NSStreamNetworkServiceType) outStream.setProperty(NSStreamNetworkServiceTypeVoIP, forKey: NSStreamNetworkServiceType)
} }
if selfSignedSSL { if selfSignedSSL {
let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(bool:false), kCFStreamSSLPeerName: kCFNull] let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false), kCFStreamSSLPeerName: kCFNull]
inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String)
outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String) outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String)
} }
@ -332,7 +335,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
timeout -= 100 timeout -= 100
if timeout < 0 { if timeout < 0 {
self?.cleanupStream() self?.cleanupStream()
self?.doDisconnect(self?.errorWithDetail("write wait timed out", code: 2)) self?.doDisconnect(error: self?.errorWithDetail(detail: "write wait timed out", code: 2))
return return
} else if outStream.streamError != nil { } else if outStream.streamError != nil {
return //disconnectStream will be called. return //disconnectStream will be called.
@ -364,9 +367,9 @@ public class WebSocket : NSObject, NSStreamDelegate {
processInputStream() processInputStream()
} }
} else if eventCode == .errorOccurred { } else if eventCode == .errorOccurred {
disconnectStream(aStream.streamError) disconnectStream(error: aStream.streamError)
} else if eventCode == .endEncountered { } else if eventCode == .endEncountered {
disconnectStream(nil) disconnectStream(error: nil)
} }
} }
//disconnect the stream object //disconnect the stream object
@ -377,7 +380,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
writeQueue.cancelAllOperations() writeQueue.cancelAllOperations()
} }
cleanupStream() cleanupStream()
doDisconnect(error) doDisconnect(error: error)
} }
private func cleanupStream() { private func cleanupStream() {
@ -426,9 +429,9 @@ public class WebSocket : NSObject, NSStreamDelegate {
let buffer = UnsafePointer<UInt8>(work.bytes) let buffer = UnsafePointer<UInt8>(work.bytes)
let length = work.length let length = work.length
if !connected { if !connected {
processTCPHandshake(buffer, bufferLen: length) processTCPHandshake(buffer: buffer, bufferLen: length)
} else { } else {
processRawMessage(buffer, bufferLen: length) processRawMessage(buffer: buffer, bufferLen: length)
} }
inputQueue = inputQueue.filter{$0 != data} inputQueue = inputQueue.filter{$0 != data}
dequeueInput() dequeueInput()
@ -436,7 +439,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
//handle checking the inital connection status //handle checking the inital connection status
private func processTCPHandshake(buffer: UnsafePointer<UInt8>, bufferLen: Int) { private func processTCPHandshake(buffer: UnsafePointer<UInt8>, bufferLen: Int) {
let code = processHTTP(buffer, bufferLen: bufferLen) let code = processHTTP(buffer: buffer, bufferLen: bufferLen)
switch code { switch code {
case 0: case 0:
connected = true connected = true
@ -444,13 +447,13 @@ public class WebSocket : NSObject, NSStreamDelegate {
dispatch_async(queue) { [weak self] in dispatch_async(queue) { [weak self] in
guard let s = self else { return } guard let s = self else { return }
s.onConnect?() s.onConnect?()
s.delegate?.websocketDidConnect(s) s.delegate?.websocketDidConnect(socket: s)
} }
case -1: case -1:
fragBuffer = NSData(bytes: buffer, length: bufferLen) fragBuffer = NSData(bytes: buffer, length: bufferLen)
break //do nothing, we are going to collect more data break //do nothing, we are going to collect more data
default: default:
doDisconnect(errorWithDetail("Invalid HTTP upgrade", code: UInt16(code))) doDisconnect(error: errorWithDetail(detail: "Invalid HTTP upgrade", code: UInt16(code)))
} }
} }
///Finds the HTTP Packet in the TCP stream, by looking for the CRLF. ///Finds the HTTP Packet in the TCP stream, by looking for the CRLF.
@ -470,14 +473,14 @@ public class WebSocket : NSObject, NSStreamDelegate {
} }
} }
if totalSize > 0 { if totalSize > 0 {
let code = validateResponse(buffer, bufferLen: totalSize) let code = validateResponse(buffer: buffer, bufferLen: totalSize)
if code != 0 { if code != 0 {
return code return code
} }
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: (buffer+totalSize),bufferLen: restSize)
} }
return 0 //success return 0 //success
} }
@ -546,10 +549,10 @@ public class WebSocket : NSObject, NSStreamDelegate {
} }
response.bytesLeft -= len response.bytesLeft -= len
response.buffer?.append(NSData(bytes: buffer, length: len)) response.buffer?.append(NSData(bytes: buffer, length: len))
processResponse(response) processResponse(response: response)
let offset = bufferLen - extra let offset = bufferLen - extra
if extra > 0 { if extra > 0 {
processExtra((buffer+offset), bufferLen: extra) processExtra(buffer: (buffer+offset), bufferLen: extra)
} }
return return
} else { } else {
@ -560,22 +563,22 @@ public class WebSocket : NSObject, NSStreamDelegate {
var offset = 2 var offset = 2
if (isMasked > 0 || (RSVMask & buffer[0]) > 0) && receivedOpcode != .Pong { if (isMasked > 0 || (RSVMask & buffer[0]) > 0) && receivedOpcode != .Pong {
let errCode = CloseCode.ProtocolError.rawValue let errCode = CloseCode.ProtocolError.rawValue
doDisconnect(errorWithDetail("masked and rsv data is not currently supported", code: errCode)) doDisconnect(error: errorWithDetail(detail: "masked and rsv data is not currently supported", code: errCode))
writeError(errCode) writeError(code: errCode)
return return
} }
let isControlFrame = (receivedOpcode == .ConnectionClose || receivedOpcode == .Ping) let isControlFrame = (receivedOpcode == .ConnectionClose || receivedOpcode == .Ping)
if !isControlFrame && (receivedOpcode != .BinaryFrame && receivedOpcode != .ContinueFrame && if !isControlFrame && (receivedOpcode != .BinaryFrame && receivedOpcode != .ContinueFrame &&
receivedOpcode != .TextFrame && receivedOpcode != .Pong) { receivedOpcode != .TextFrame && receivedOpcode != .Pong) {
let errCode = CloseCode.ProtocolError.rawValue let errCode = CloseCode.ProtocolError.rawValue
doDisconnect(errorWithDetail("unknown opcode: \(receivedOpcode)", code: errCode)) doDisconnect(error: errorWithDetail(detail: "unknown opcode: \(receivedOpcode)", code: errCode))
writeError(errCode) writeError(code: errCode)
return return
} }
if isControlFrame && isFin == 0 { if isControlFrame && isFin == 0 {
let errCode = CloseCode.ProtocolError.rawValue let errCode = CloseCode.ProtocolError.rawValue
doDisconnect(errorWithDetail("control frames can't be fragmented", code: errCode)) doDisconnect(error: errorWithDetail(detail: "control frames can't be fragmented", code: errCode))
writeError(errCode) writeError(code: errCode)
return return
} }
if receivedOpcode == .ConnectionClose { if receivedOpcode == .ConnectionClose {
@ -583,7 +586,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
if payloadLen == 1 { if payloadLen == 1 {
code = CloseCode.ProtocolError.rawValue code = CloseCode.ProtocolError.rawValue
} else if payloadLen > 1 { } else if payloadLen > 1 {
code = WebSocket.readUint16(buffer, offset: offset) code = WebSocket.readUint16(buffer: buffer, offset: offset)
if code < 1000 || (code > 1003 && code < 1007) || (code > 1011 && code < 3000) { if code < 1000 || (code > 1003 && code < 1007) || (code > 1011 && code < 3000) {
code = CloseCode.ProtocolError.rawValue code = CloseCode.ProtocolError.rawValue
} }
@ -599,20 +602,20 @@ public class WebSocket : NSObject, NSStreamDelegate {
} }
} }
} }
doDisconnect(errorWithDetail("connection closed by server", code: code)) doDisconnect(error: errorWithDetail(detail: "connection closed by server", code: code))
writeError(code) writeError(code: code)
return return
} }
if isControlFrame && payloadLen > 125 { if isControlFrame && payloadLen > 125 {
writeError(CloseCode.ProtocolError.rawValue) writeError(code: CloseCode.ProtocolError.rawValue)
return return
} }
var dataLength = UInt64(payloadLen) var dataLength = UInt64(payloadLen)
if dataLength == 127 { if dataLength == 127 {
dataLength = WebSocket.readUint64(buffer, offset: offset) dataLength = WebSocket.readUint64(buffer: buffer, offset: offset)
offset += sizeof(UInt64) offset += sizeof(UInt64)
} else if dataLength == 126 { } else if dataLength == 126 {
dataLength = UInt64(WebSocket.readUint16(buffer, offset: offset)) dataLength = UInt64(WebSocket.readUint16(buffer: buffer, offset: offset))
offset += sizeof(UInt16) offset += sizeof(UInt16)
} }
if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { if bufferLen < offset || UInt64(bufferLen - offset) < dataLength {
@ -635,13 +638,13 @@ public class WebSocket : NSObject, NSStreamDelegate {
dispatch_async(queue) { [weak self] in dispatch_async(queue) { [weak self] in
guard let s = self else { return } guard let s = self else { return }
s.onPong?() s.onPong?()
s.pongDelegate?.websocketDidReceivePong(s) s.pongDelegate?.websocketDidReceivePong(socket: s)
} }
} }
let step = Int(offset+numericCast(len)) let step = Int(offset+numericCast(len))
let extra = bufferLen-step let extra = bufferLen-step
if extra > 0 { if extra > 0 {
processRawMessage((buffer+step), bufferLen: extra) processRawMessage(buffer: (buffer+step), bufferLen: extra)
} }
return return
} }
@ -651,17 +654,17 @@ public class WebSocket : NSObject, NSStreamDelegate {
} }
if isFin == 0 && receivedOpcode == .ContinueFrame && response == nil { if isFin == 0 && receivedOpcode == .ContinueFrame && response == nil {
let errCode = CloseCode.ProtocolError.rawValue let errCode = CloseCode.ProtocolError.rawValue
doDisconnect(errorWithDetail("continue frame before a binary or text frame", code: errCode)) doDisconnect(error: errorWithDetail(detail: "continue frame before a binary or text frame", code: errCode))
writeError(errCode) writeError(code: errCode)
return return
} }
var isNew = false var isNew = false
if response == nil { if response == nil {
if receivedOpcode == .ContinueFrame { if receivedOpcode == .ContinueFrame {
let errCode = CloseCode.ProtocolError.rawValue let errCode = CloseCode.ProtocolError.rawValue
doDisconnect(errorWithDetail("first frame can't be a continue frame", doDisconnect(error: errorWithDetail(detail: "first frame can't be a continue frame",
code: errCode)) code: errCode))
writeError(errCode) writeError(code: errCode)
return return
} }
isNew = true isNew = true
@ -674,9 +677,9 @@ public class WebSocket : NSObject, NSStreamDelegate {
response!.bytesLeft = Int(dataLength) response!.bytesLeft = Int(dataLength)
} else { } else {
let errCode = CloseCode.ProtocolError.rawValue let errCode = CloseCode.ProtocolError.rawValue
doDisconnect(errorWithDetail("second and beyond of fragment message must be a continue frame", doDisconnect(error: errorWithDetail(detail: "second and beyond of fragment message must be a continue frame",
code: errCode)) code: errCode))
writeError(errCode) writeError(code: errCode)
return return
} }
response!.buffer!.append(data) response!.buffer!.append(data)
@ -688,13 +691,13 @@ public class WebSocket : NSObject, NSStreamDelegate {
if isNew { if isNew {
readStack.append(response) readStack.append(response)
} }
processResponse(response) processResponse(response: response)
} }
let step = Int(offset+numericCast(len)) let step = Int(offset+numericCast(len))
let extra = bufferLen-step let extra = bufferLen-step
if extra > 0 { if extra > 0 {
processExtra((buffer+step), bufferLen: extra) processExtra(buffer: (buffer+step), bufferLen: extra)
} }
} }
@ -705,7 +708,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
if bufferLen < 2 { if bufferLen < 2 {
fragBuffer = NSData(bytes: buffer, length: bufferLen) fragBuffer = NSData(bytes: buffer, length: bufferLen)
} else { } else {
processRawMessage(buffer, bufferLen: bufferLen) processRawMessage(buffer: buffer, bufferLen: bufferLen)
} }
} }
@ -714,18 +717,18 @@ public class WebSocket : NSObject, NSStreamDelegate {
if response.isFin && response.bytesLeft <= 0 { if response.isFin && response.bytesLeft <= 0 {
if response.code == .Ping { if response.code == .Ping {
let data = response.buffer! //local copy so it is perverse for writing let data = response.buffer! //local copy so it is perverse for writing
dequeueWrite(data, code: OpCode.Pong) dequeueWrite(data: 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 str == nil {
writeError(CloseCode.Encoding.rawValue) writeError(code: CloseCode.Encoding.rawValue)
return false return false
} }
if canDispatch { if canDispatch {
dispatch_async(queue) { [weak self] in dispatch_async(queue) { [weak self] in
guard let s = self else { return } guard let s = self else { return }
s.onText?(str! as String) s.onText?(str! as String)
s.delegate?.websocketDidReceiveMessage(s, text: str! as String) s.delegate?.websocketDidReceiveMessage(socket: s, text: str! as String)
} }
} }
} else if response.code == .BinaryFrame { } else if response.code == .BinaryFrame {
@ -734,7 +737,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
dispatch_async(queue) { [weak self] in dispatch_async(queue) { [weak self] in
guard let s = self else { return } guard let s = self else { return }
s.onData?(data) s.onData?(data)
s.delegate?.websocketDidReceiveData(s, data: data) s.delegate?.websocketDidReceiveData(socket: s, data: data)
} }
} }
} }
@ -748,15 +751,19 @@ public class WebSocket : NSObject, NSStreamDelegate {
private func errorWithDetail(detail: String, code: UInt16) -> NSError { private func errorWithDetail(detail: String, code: UInt16) -> NSError {
var details = [String: String]() var details = [String: String]()
details[NSLocalizedDescriptionKey] = detail details[NSLocalizedDescriptionKey] = detail
#if swift(>=3)
return NSError(domain: "April 12 build of Swift 3 broke this property", code: Int(code), userInfo: details)
#else
return NSError(domain: WebSocket.ErrorDomain, code: Int(code), userInfo: details) return NSError(domain: WebSocket.ErrorDomain, code: Int(code), userInfo: details)
#endif
} }
///write a an error to the socket ///write a an error to the socket
private func writeError(code: UInt16) { private func writeError(code: UInt16) {
let buf = NSMutableData(capacity: sizeof(UInt16)) let buf = NSMutableData(capacity: sizeof(UInt16))
let buffer = UnsafeMutablePointer<UInt8>(buf!.bytes) let buffer = UnsafeMutablePointer<UInt8>(buf!.bytes)
WebSocket.writeUint16(buffer, offset: 0, value: code) WebSocket.writeUint16(buffer: buffer, offset: 0, value: code)
dequeueWrite(NSData(bytes: buffer, length: sizeof(UInt16)), code: .ConnectionClose) dequeueWrite(data: NSData(bytes: buffer, length: sizeof(UInt16)), code: .ConnectionClose)
} }
///used to write things to the stream ///used to write things to the stream
private func dequeueWrite(data: NSData, code: OpCode, writeCompletion: (() -> ())? = nil) { private func dequeueWrite(data: NSData, code: OpCode, writeCompletion: (() -> ())? = nil) {
@ -773,11 +780,11 @@ public class WebSocket : NSObject, NSStreamDelegate {
buffer[1] = CUnsignedChar(dataLength) buffer[1] = CUnsignedChar(dataLength)
} else if dataLength <= Int(UInt16.max) { } else if dataLength <= Int(UInt16.max) {
buffer[1] = 126 buffer[1] = 126
WebSocket.writeUint16(buffer, offset: offset, value: UInt16(dataLength)) WebSocket.writeUint16(buffer: buffer, offset: offset, value: UInt16(dataLength))
offset += sizeof(UInt16) offset += sizeof(UInt16)
} else { } else {
buffer[1] = 127 buffer[1] = 127
WebSocket.writeUint64(buffer, offset: offset, value: UInt64(dataLength)) WebSocket.writeUint64(buffer: buffer, offset: offset, value: UInt64(dataLength))
offset += sizeof(UInt64) offset += sizeof(UInt64)
} }
buffer[1] |= s.MaskMask buffer[1] |= s.MaskMask
@ -800,9 +807,9 @@ public class WebSocket : NSObject, NSStreamDelegate {
error = streamError error = streamError
} else { } else {
let errCode = InternalErrorCode.OutputStreamWriteError.rawValue let errCode = InternalErrorCode.OutputStreamWriteError.rawValue
error = s.errorWithDetail("output stream error during write", code: errCode) error = s.errorWithDetail(detail: "output stream error during write", code: errCode)
} }
s.doDisconnect(error) s.doDisconnect(error: error)
break break
} else { } else {
total += len total += len
@ -830,7 +837,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
dispatch_async(queue) { [weak self] in dispatch_async(queue) { [weak self] in
guard let s = self else { return } guard let s = self else { return }
s.onDisconnect?(error) s.onDisconnect?(error)
s.delegate?.websocketDidDisconnect(s, error: error) s.delegate?.websocketDidDisconnect(socket: s, error: error)
} }
} }