update for latest swift 3
This commit is contained in:
parent
9f8db42584
commit
e2db1a086d
@ -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])
|
||||||
|
|||||||
@ -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])
|
||||||
|
|||||||
@ -39,7 +39,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)testOffSyntax {
|
- (void)testOffSyntax {
|
||||||
[self.socket off:@"test"];
|
[self.socket offWithEvent:@"test"];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -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, "/")
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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()) {
|
||||||
|
|||||||
@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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)})
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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: [])
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user