@@ -24,46 +24,46 @@ import Foundation
24
24
25
25
class SocketParser {
26
26
private static let shredder = SocketParser . PacketShredder ( )
27
-
27
+
28
28
// Translation of socket.io-parser#deconstructPacket
29
29
private class PacketShredder {
30
30
var buf = ContiguousArray < NSData > ( )
31
-
31
+
32
32
func shred( data: AnyObject ) -> AnyObject {
33
33
if let bin = data as? NSData {
34
34
let placeholder = [ " _placeholder " : true , " num " : buf. count]
35
-
35
+
36
36
buf. append ( bin)
37
-
37
+
38
38
return placeholder
39
39
} else if let arr = data as? NSArray {
40
40
var newArr = NSMutableArray ( array: arr)
41
-
41
+
42
42
for i in 0 ..< arr. count {
43
43
newArr [ i] = shred ( arr [ i] )
44
44
}
45
-
45
+
46
46
return newArr
47
47
} else if let dict = data as? NSDictionary {
48
48
var newDict = NSMutableDictionary ( dictionary: dict)
49
-
49
+
50
50
for (key, value) in newDict {
51
51
newDict [ key as! NSCopying ] = shred ( value)
52
52
}
53
-
53
+
54
54
return newDict
55
55
} else {
56
56
return data
57
57
}
58
58
}
59
-
59
+
60
60
func deconstructPacket( packet: SocketPacket ) {
61
61
if packet. data == nil {
62
62
return
63
63
}
64
-
64
+
65
65
var data = packet. data!
66
-
66
+
67
67
for i in 0 ..< data. count {
68
68
if data [ i] is NSArray || data [ i] is NSDictionary {
69
69
data [ i] = shred ( data [ i] )
@@ -72,64 +72,64 @@ class SocketParser {
72
72
buf. append ( bin)
73
73
}
74
74
}
75
-
75
+
76
76
packet. data = data
77
77
packet. binary = buf
78
78
buf. removeAll ( keepCapacity: true )
79
79
}
80
80
}
81
-
81
+
82
82
// Translation of socket.io-client#decodeString
83
83
static func parseString( str: String ) -> SocketPacket ? {
84
84
let arr = Array ( str)
85
85
let type = String ( arr [ 0 ] )
86
-
86
+
87
87
if arr. count == 1 {
88
88
return SocketPacket ( type: SocketPacketType ( str: type) )
89
89
}
90
-
90
+
91
91
var id = nil as Int ?
92
92
var nsp = " "
93
93
var i = 0
94
94
var placeholders = - 1
95
-
95
+
96
96
if type == " 5 " || type == " 6 " {
97
97
var buf = " "
98
-
98
+
99
99
while arr [ ++ i] != " - " {
100
100
buf += String ( arr [ i] )
101
101
if i == arr. count {
102
102
break
103
103
}
104
104
}
105
-
105
+
106
106
if buf. toInt ( ) == nil || arr [ i] != " - " {
107
107
NSLog ( " Error parsing \( str) " )
108
108
return nil
109
109
} else {
110
110
placeholders = buf. toInt ( ) !
111
111
}
112
112
}
113
-
113
+
114
114
if arr [ i + 1 ] == " / " {
115
115
while ++ i < arr. count {
116
116
let c = arr [ i]
117
-
117
+
118
118
if c == " , " {
119
119
break
120
120
}
121
-
121
+
122
122
nsp += String ( c)
123
123
}
124
124
}
125
-
125
+
126
126
if i + 1 >= arr. count {
127
127
return SocketPacket ( type: SocketPacketType ( str: type) ,
128
128
nsp: nsp, placeholders: placeholders, id: id)
129
129
}
130
-
130
+
131
131
let next = String ( arr [ i + 1 ] )
132
-
132
+
133
133
if next. toInt ( ) != nil {
134
134
var c = " "
135
135
while ++ i < arr. count {
@@ -140,78 +140,83 @@ class SocketParser {
140
140
break
141
141
}
142
142
}
143
-
143
+
144
144
id = c. toInt ( )
145
145
}
146
-
147
- if i + 1 < arr. count {
148
- let d = String ( arr [ ++ i... arr. count- 1 ] )
146
+
147
+ if ++ i < arr. count {
148
+ let d = String ( arr [ i... arr. count- 1 ] )
149
149
let noPlaceholders = d [ " ( \\ { \" _placeholder \" :true, \" num \" :( \\ d*) \\ }) " ] ~= " \" ~~$2 \" "
150
-
151
- let data = SocketParser . parseData ( noPlaceholders) as! [ AnyObject ]
152
-
150
+ let data : [ AnyObject ]
151
+
152
+ if let isArr = SocketParser . parseData ( noPlaceholders) as? [ AnyObject ] {
153
+ data = isArr
154
+ } else {
155
+ data = [ noPlaceholders]
156
+ }
157
+
153
158
return SocketPacket ( type: SocketPacketType ( str: type) , data: data,
154
159
nsp: nsp, placeholders: placeholders, id: id)
155
160
}
156
-
161
+
157
162
return nil
158
163
}
159
-
164
+
160
165
// Parses data for events
161
166
static func parseData( data: String ) -> AnyObject ? {
162
167
var err : NSError ?
163
168
let stringData = data. dataUsingEncoding ( NSUTF8StringEncoding, allowLossyConversion: false )
164
169
let parsed : AnyObject ? = NSJSONSerialization . JSONObjectWithData ( stringData!,
165
170
options: NSJSONReadingOptions . AllowFragments, error: & err)
166
-
171
+
167
172
if err != nil {
168
173
// println(err)
169
174
return nil
170
175
}
171
-
176
+
172
177
return parsed
173
178
}
174
-
179
+
175
180
static func parseForEmit( packet: SocketPacket ) {
176
181
shredder. deconstructPacket ( packet)
177
182
}
178
-
183
+
179
184
// Parses messages recieved
180
185
static func parseSocketMessage( stringMessage: String , socket: SocketIOClient ) {
181
186
if stringMessage == " " {
182
187
return
183
188
}
184
-
189
+
185
190
func checkNSP( nsp: String ) -> Bool {
186
191
return nsp == " " && socket. nsp != " / "
187
192
}
188
-
193
+
189
194
let p = parseString ( stringMessage) as SocketPacket !
190
-
195
+
191
196
if p. type == SocketPacketType . EVENT {
192
197
if checkNSP ( p. nsp) {
193
198
return
194
199
}
195
-
200
+
196
201
socket. handleEvent ( p. getEvent ( ) , data: p. data,
197
202
isInternalMessage: false , wantsAck: p. id)
198
203
} else if p. type == SocketPacketType . ACK {
199
204
if checkNSP ( p. nsp) {
200
205
return
201
206
}
202
-
207
+
203
208
socket. handleAck ( p. id!, data: p. data)
204
209
} else if p. type == SocketPacketType . BINARY_EVENT {
205
210
if checkNSP ( p. nsp) {
206
211
return
207
212
}
208
-
213
+
209
214
socket. waitingData. append ( p)
210
215
} else if p. type == SocketPacketType . BINARY_ACK {
211
216
if checkNSP ( p. nsp) {
212
217
return
213
218
}
214
-
219
+
215
220
p. justAck = true
216
221
socket. waitingData. append ( p)
217
222
} else if p. type == SocketPacketType . CONNECT {
@@ -224,27 +229,29 @@ class SocketParser {
224
229
}
225
230
} else if p. type == SocketPacketType . DISCONNECT {
226
231
socket. engineDidForceClose ( " Got Disconnect " )
232
+ } else if p. type == SocketPacketType . ERROR {
233
+ socket. didError ( p. data == nil ? " Error " : p. data!)
227
234
}
228
235
}
229
-
236
+
230
237
// Handles binary data
231
238
static func parseBinaryData( data: NSData , socket: SocketIOClient ) {
232
239
// NSLog(data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros))
233
-
240
+
234
241
if socket. waitingData. count == 0 {
235
242
NSLog ( " Got data when not remaking packet " )
236
243
return
237
244
}
238
-
245
+
239
246
let shouldExecute = socket. waitingData [ 0 ] . addData ( data)
240
-
247
+
241
248
if !shouldExecute {
242
249
return
243
250
}
244
-
251
+
245
252
let packet = socket. waitingData. removeAtIndex ( 0 )
246
253
packet. fillInPlaceholders ( )
247
-
254
+
248
255
if !packet. justAck {
249
256
socket. handleEvent ( packet. getEvent ( ) , data: packet. data,
250
257
wantsAck: packet. id)
0 commit comments