Skip to content

Commit fe02b8e

Browse files
committed
change socketparser into a protocol
1 parent 0c8ff90 commit fe02b8e

File tree

14 files changed

+135
-71
lines changed

14 files changed

+135
-71
lines changed

Socket.IO-Client-Swift.xcodeproj/project.pbxproj

Lines changed: 35 additions & 13 deletions
Large diffs are not rendered by default.

Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "0640"
3+
LastUpgradeVersion = "0720"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "0640"
3+
LastUpgradeVersion = "0720"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-tvOS.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "0710"
3+
LastUpgradeVersion = "0720"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

SocketIO-Mac/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<key>CFBundleExecutable</key>
88
<string>$(EXECUTABLE_NAME)</string>
99
<key>CFBundleIdentifier</key>
10-
<string>io.socket.$(PRODUCT_NAME:rfc1034identifier)</string>
10+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1111
<key>CFBundleInfoDictionaryVersion</key>
1212
<string>6.0</string>
1313
<key>CFBundleName</key>

SocketIO-MacTests/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<key>CFBundleExecutable</key>
88
<string>$(EXECUTABLE_NAME)</string>
99
<key>CFBundleIdentifier</key>
10-
<string>io.socket.$(PRODUCT_NAME:rfc1034identifier)</string>
10+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1111
<key>CFBundleInfoDictionaryVersion</key>
1212
<string>6.0</string>
1313
<key>CFBundleName</key>

SocketIO-MacTests/SocketParserTest.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import XCTest
1010
@testable import SocketIO
1111

1212
class SocketParserTest: XCTestCase {
13+
let testSocket = SocketIOClient(socketURL: "")
1314

1415
//Format key: message; namespace-data-binary-id
1516
static let packetTypes: Dictionary<String, (String, [AnyObject], [NSData], Int)> = [
@@ -93,7 +94,7 @@ class SocketParserTest: XCTestCase {
9394

9495
func testInvalidInput() {
9596
let message = "8"
96-
switch SocketParser.parseString(message) {
97+
switch testSocket.parseString(message) {
9798
case .Left(_):
9899
return
99100
case .Right(_):
@@ -111,7 +112,7 @@ class SocketParserTest: XCTestCase {
111112

112113
func validateParseResult(message: String) {
113114
let validValues = SocketParserTest.packetTypes[message]!
114-
let packet = SocketParser.parseString(message)
115+
let packet = testSocket.parseString(message)
115116
let type = message.substringWithRange(Range<String.Index>(start: message.startIndex, end: message.startIndex.advancedBy(1)))
116117
if case let .Right(packet) = packet {
117118
XCTAssertEqual(packet.type, SocketPacket.PacketType(rawValue: Int(type) ?? -1)!)
@@ -128,7 +129,7 @@ class SocketParserTest: XCTestCase {
128129
let keys = Array(SocketParserTest.packetTypes.keys)
129130
measureBlock({
130131
for item in keys.enumerate() {
131-
SocketParser.parseString(item.element)
132+
self.testSocket.parseString(item.element)
132133
}
133134
})
134135
}

SocketIO-iOS/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<key>CFBundleExecutable</key>
88
<string>$(EXECUTABLE_NAME)</string>
99
<key>CFBundleIdentifier</key>
10-
<string>io.socket.$(PRODUCT_NAME:rfc1034identifier)</string>
10+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1111
<key>CFBundleInfoDictionaryVersion</key>
1212
<string>6.0</string>
1313
<key>CFBundleName</key>

SocketIO-iOSTests/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<key>CFBundleExecutable</key>
88
<string>$(EXECUTABLE_NAME)</string>
99
<key>CFBundleIdentifier</key>
10-
<string>io.socket.$(PRODUCT_NAME:rfc1034identifier)</string>
10+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1111
<key>CFBundleInfoDictionaryVersion</key>
1212
<string>6.0</string>
1313
<key>CFBundleName</key>

Source/SocketClientSpec.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// SocketClientSpec.swift
3+
// Socket.IO-Client-Swift
4+
//
5+
// Created by Erik Little on 1/3/16.
6+
//
7+
// Permission is hereby granted, free of charge, to any person obtaining a copy
8+
// of this software and associated documentation files (the "Software"), to deal
9+
// in the Software without restriction, including without limitation the rights
10+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11+
// copies of the Software, and to permit persons to whom the Software is
12+
// furnished to do so, subject to the following conditions:
13+
//
14+
// The above copyright notice and this permission notice shall be included in
15+
// all copies or substantial portions of the Software.
16+
//
17+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23+
// THE SOFTWARE.
24+
25+
import Foundation
26+
27+
protocol SocketClientSpec: class {
28+
var nsp: String { get set }
29+
var waitingData: [SocketPacket] { get set }
30+
31+
func didConnect()
32+
func didDisconnect(reason: String)
33+
func didError(reason: AnyObject)
34+
func handleAck(ack: Int, data: [AnyObject])
35+
func handleEvent(event: String, data: [AnyObject], isInternalMessage: Bool, withAck ack: Int)
36+
func joinNamespace(namespace: String)
37+
}

Source/SocketEngine.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public final class SocketEngine: NSObject, SocketEngineSpec, WebSocketDelegate {
154154

155155
if let data = NSData(base64EncodedString: noPrefix,
156156
options: .IgnoreUnknownCharacters) {
157-
client?.parseBinaryData(data)
157+
client?.parseEngineBinaryData(data)
158158
}
159159

160160
return true
@@ -299,7 +299,7 @@ public final class SocketEngine: NSObject, SocketEngineSpec, WebSocketDelegate {
299299
}
300300

301301
private func handleMessage(message: String) {
302-
client?.parseSocketMessage(message)
302+
client?.parseEngineMessage(message)
303303
}
304304

305305
private func handleNOOP() {
@@ -414,7 +414,7 @@ public final class SocketEngine: NSObject, SocketEngineSpec, WebSocketDelegate {
414414

415415
private func parseEngineData(data: NSData) {
416416
DefaultSocketLogger.Logger.log("Got binary data: %@", type: "SocketEngine", args: data)
417-
client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
417+
client?.parseEngineBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
418418
}
419419

420420
private func parseEngineMessage(message: String, fromPolling: Bool) {

Source/SocketEngineClient.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ import Foundation
2828
@objc public protocol SocketEngineClient {
2929
func didError(reason: AnyObject)
3030
func engineDidClose(reason: String)
31-
func parseSocketMessage(msg: String)
32-
func parseBinaryData(data: NSData)
31+
func parseEngineMessage(msg: String)
32+
func parseEngineBinaryData(data: NSData)
3333
}

Source/SocketIOClient.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
import Foundation
2626

27-
public final class SocketIOClient: NSObject, SocketEngineClient {
27+
public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable {
2828
public let socketURL: String
2929

3030
public private(set) var engine: SocketEngineSpec?
@@ -319,13 +319,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
319319
}
320320

321321
// Called when the socket gets an ack for something it sent
322-
func handleAck(ack: Int, data: AnyObject?) {
322+
func handleAck(ack: Int, data: [AnyObject]) {
323323
guard status == .Connected else {return}
324324

325325
DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "")
326326

327-
ackHandlers.executeAck(ack,
328-
items: (data as? [AnyObject]) ?? (data != nil ? [data!] : []))
327+
ackHandlers.executeAck(ack, items: data)
329328
}
330329

331330
/**
@@ -436,15 +435,16 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
436435
connect()
437436
}
438437

439-
public func parseSocketMessage(msg: String) {
438+
public func parseEngineMessage(msg: String) {
439+
DefaultSocketLogger.Logger.log("Should parse message", type: "SocketIOClient")
440440
dispatch_async(parseQueue) {
441-
SocketParser.parseSocketMessage(msg, socket: self)
441+
self.parseSocketMessage(msg)
442442
}
443443
}
444444

445-
public func parseBinaryData(data: NSData) {
445+
public func parseEngineBinaryData(data: NSData) {
446446
dispatch_async(parseQueue) {
447-
SocketParser.parseBinaryData(data, socket: self)
447+
self.parseBinaryData(data)
448448
}
449449
}
450450

Source/SocketParser.swift renamed to Source/SocketParsable.swift

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// SocketParser.swift
2+
// SocketParsable.swift
33
// Socket.IO-Client-Swift
44
//
55
// Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -22,46 +22,50 @@
2222

2323
import Foundation
2424

25-
class SocketParser {
26-
27-
private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool {
28-
return nsp == socket.nsp
29-
}
25+
protocol SocketParsable: class, SocketClientSpec {
26+
func parseBinaryData(data: NSData)
27+
func parseSocketMessage(message: String)
28+
}
3029

31-
private static func handleConnect(p: SocketPacket, socket: SocketIOClient) {
32-
if p.nsp == "/" && socket.nsp != "/" {
33-
socket.joinNamespace(socket.nsp)
34-
} else if p.nsp != "/" && socket.nsp == "/" {
35-
socket.didConnect()
30+
extension SocketParsable {
31+
private func isCorrectNamespace(nsp: String) -> Bool {
32+
return nsp == self.nsp
33+
}
34+
35+
private func handleConnect(p: SocketPacket) {
36+
if p.nsp == "/" && nsp != "/" {
37+
joinNamespace(nsp)
38+
} else if p.nsp != "/" && nsp == "/" {
39+
didConnect()
3640
} else {
37-
socket.didConnect()
41+
didConnect()
3842
}
3943
}
4044

41-
private static func handlePacket(pack: SocketPacket, withSocket socket: SocketIOClient) {
45+
private func handlePacket(pack: SocketPacket) {
4246
switch pack.type {
43-
case .Event where isCorrectNamespace(pack.nsp, socket):
44-
socket.handleEvent(pack.event, data: pack.args,
47+
case .Event where isCorrectNamespace(pack.nsp):
48+
handleEvent(pack.event, data: pack.args,
4549
isInternalMessage: false, withAck: pack.id)
46-
case .Ack where isCorrectNamespace(pack.nsp, socket):
47-
socket.handleAck(pack.id, data: pack.data)
48-
case .BinaryEvent where isCorrectNamespace(pack.nsp, socket):
49-
socket.waitingData.append(pack)
50-
case .BinaryAck where isCorrectNamespace(pack.nsp, socket):
51-
socket.waitingData.append(pack)
50+
case .Ack where isCorrectNamespace(pack.nsp):
51+
handleAck(pack.id, data: pack.data)
52+
case .BinaryEvent where isCorrectNamespace(pack.nsp):
53+
waitingData.append(pack)
54+
case .BinaryAck where isCorrectNamespace(pack.nsp):
55+
waitingData.append(pack)
5256
case .Connect:
53-
handleConnect(pack, socket: socket)
57+
handleConnect(pack)
5458
case .Disconnect:
55-
socket.didDisconnect("Got Disconnect")
59+
didDisconnect("Got Disconnect")
5660
case .Error:
57-
socket.didError(pack.data)
61+
didError(pack.data)
5862
default:
5963
DefaultSocketLogger.Logger.log("Got invalid packet: %@", type: "SocketParser", args: pack.description)
6064
}
6165
}
6266

6367
/// Parses a messsage from the engine. Returning either a string error or a complete SocketPacket
64-
static func parseString(message: String) -> Either<String, SocketPacket> {
68+
func parseString(message: String) -> Either<String, SocketPacket> {
6569
var parser = SocketStringReader(message: message)
6670

6771
guard let type = SocketPacket.PacketType(rawValue: Int(parser.read(1)) ?? -1) else {
@@ -79,7 +83,7 @@ class SocketParser {
7983
if let holders = Int(parser.readUntilStringOccurence("-")) {
8084
placeholders = holders
8185
} else {
82-
return .Left("Invalid packet")
86+
return .Left("Invalid packet")
8387
}
8488
}
8589

@@ -126,7 +130,7 @@ class SocketParser {
126130
}
127131

128132
// Parses data for events
129-
private static func parseData(data: String) -> Either<String, [AnyObject]> {
133+
private func parseData(data: String) -> Either<String, [AnyObject]> {
130134
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
131135
do {
132136
if let arr = try NSJSONSerialization.JSONObjectWithData(stringData!,
@@ -141,7 +145,7 @@ class SocketParser {
141145
}
142146

143147
// Parses messages recieved
144-
static func parseSocketMessage(message: String, socket: SocketIOClient) {
148+
func parseSocketMessage(message: String) {
145149
guard !message.isEmpty else { return }
146150

147151
DefaultSocketLogger.Logger.log("Parsing %@", type: "SocketParser", args: message)
@@ -151,28 +155,28 @@ class SocketParser {
151155
DefaultSocketLogger.Logger.error("\(err): %@", type: "SocketParser", args: message)
152156
case let .Right(pack):
153157
DefaultSocketLogger.Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description)
154-
handlePacket(pack, withSocket: socket)
158+
handlePacket(pack)
155159
}
156160
}
157161

158-
static func parseBinaryData(data: NSData, socket: SocketIOClient) {
159-
guard !socket.waitingData.isEmpty else {
162+
func parseBinaryData(data: NSData) {
163+
guard !waitingData.isEmpty else {
160164
DefaultSocketLogger.Logger.error("Got data when not remaking packet", type: "SocketParser")
161165
return
162166
}
163167

164168
// Should execute event?
165-
guard socket.waitingData[socket.waitingData.count - 1].addData(data) else {
169+
guard waitingData[waitingData.count - 1].addData(data) else {
166170
return
167171
}
168172

169-
let packet = socket.waitingData.removeLast()
173+
let packet = waitingData.removeLast()
170174

171175
if packet.type != .BinaryAck {
172-
socket.handleEvent(packet.event, data: packet.args ?? [],
176+
handleEvent(packet.event, data: packet.args ?? [],
173177
isInternalMessage: false, withAck: packet.id)
174178
} else {
175-
socket.handleAck(packet.id, data: packet.args)
179+
handleAck(packet.id, data: packet.args)
176180
}
177181
}
178182
}

0 commit comments

Comments
 (0)