@@ -40,31 +40,21 @@ import Foundation
40
40
///
41
41
/// **NOTE**: The client is not thread/queue safe, all interaction with the socket should be done on the `manager.handleQueue`
42
42
///
43
- open class SocketIOClient : NSObject , SocketIOClientSpec {
43
+ open class SocketIOClient : NSObject , SocketIOClientSpec {
44
44
// MARK: Properties
45
45
46
46
/// The namespace that this socket is currently connected to.
47
47
///
48
48
/// **Must** start with a `/`.
49
- @objc
50
49
public let nsp : String
51
50
52
- /// The session id of this client.
53
- @objc
54
- public var sid : String {
55
- guard let engine = manager? . engine else { return " " }
56
-
57
- return nsp == " / " ? engine. sid : " \( nsp) # \( engine. sid) "
58
- }
59
-
60
51
/// A handler that will be called on any event.
61
52
public private( set) var anyHandler : ( ( SocketAnyEvent ) -> ( ) ) ?
62
53
63
54
/// The array of handlers for this socket.
64
55
public private( set) var handlers = [ SocketEventHandler] ( )
65
56
66
57
/// The manager for this socket.
67
- @objc
68
58
public private( set) weak var manager : SocketManagerSpec ?
69
59
70
60
/// A view into this socket where emits do not check for binary data.
@@ -76,17 +66,18 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
76
66
/// ```
77
67
///
78
68
/// **NOTE**: It is not safe to hold on to this view beyond the life of the socket.
79
- @objc
80
69
public private( set) lazy var rawEmitView = SocketRawView ( socket: self )
81
70
82
71
/// The status of this client.
83
- @objc
84
72
public private( set) var status = SocketIOStatus . notConnected {
85
73
didSet {
86
74
handleClientEvent ( . statusChange, data: [ status, status. rawValue] )
87
75
}
88
76
}
89
77
78
+ /// The id of this socket.io connect. This is different from the sid of the engine.io connection.
79
+ public private( set) var sid : String ?
80
+
90
81
let ackHandlers = SocketAckManager ( )
91
82
92
83
private( set) var currentAck = - 1
@@ -99,7 +90,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
99
90
///
100
91
/// - parameter manager: The manager for this socket.
101
92
/// - parameter nsp: The namespace of the socket.
102
- @objc
103
93
public init ( manager: SocketManagerSpec , nsp: String ) {
104
94
self . manager = manager
105
95
self . nsp = nsp
@@ -117,7 +107,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
117
107
/// Connect to the server. The same as calling `connect(timeoutAfter:withHandler:)` with a timeout of 0.
118
108
///
119
109
/// Only call after adding your event listeners, unless you know what you're doing.
120
- @objc
121
110
open func connect( ) {
122
111
connect ( timeoutAfter: 0 , withHandler: nil )
123
112
}
@@ -129,7 +118,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
129
118
/// - parameter timeoutAfter: The number of seconds after which if we are not connected we assume the connection
130
119
/// has failed. Pass 0 to never timeout.
131
120
/// - parameter handler: The handler to call when the client fails to connect.
132
- @objc
133
121
open func connect( timeoutAfter: Double , withHandler handler: ( ( ) -> ( ) ) ? ) {
134
122
assert ( timeoutAfter >= 0 , " Invalid timeout: \( timeoutAfter) " )
135
123
@@ -142,13 +130,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
142
130
143
131
joinNamespace ( )
144
132
145
- if manager. status == . connected && nsp == " / " {
146
- // We might not get a connect event for the default nsp, fire immediately
147
- didConnect ( toNamespace: nsp)
148
-
149
- return
150
- }
151
-
152
133
guard timeoutAfter != 0 else { return }
153
134
154
135
manager. handleQueue. asyncAfter ( deadline: DispatchTime . now ( ) + timeoutAfter) { [ weak self] in
@@ -171,14 +152,15 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
171
152
/// then this is only called when the client connects to that namespace.
172
153
///
173
154
/// - parameter toNamespace: The namespace that was connected to.
174
- open func didConnect( toNamespace namespace: String ) {
155
+ open func didConnect( toNamespace namespace: String , payload : [ String : Any ] ? ) {
175
156
guard status != . connected else { return }
176
157
177
158
DefaultSocketLogger . Logger. log ( " Socket connected " , type: logType)
178
159
179
160
status = . connected
161
+ sid = payload ? [ " sid " ] as? String
180
162
181
- handleClientEvent ( . connect, data: [ namespace] )
163
+ handleClientEvent ( . connect, data: payload == nil ? [ namespace] : [ namespace , payload! ] )
182
164
}
183
165
184
166
/// Called when the client has disconnected from socket.io.
@@ -190,6 +172,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
190
172
DefaultSocketLogger . Logger. log ( " Disconnected: \( reason) " , type: logType)
191
173
192
174
status = . disconnected
175
+ sid = " "
193
176
194
177
handleClientEvent ( . disconnect, data: [ reason] )
195
178
}
@@ -198,7 +181,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
198
181
///
199
182
/// This will cause the socket to leave the namespace it is associated to, as well as remove itself from the
200
183
/// `manager`.
201
- @objc
202
184
open func disconnect( ) {
203
185
DefaultSocketLogger . Logger. log ( " Closing socket " , type: logType)
204
186
@@ -215,7 +197,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
215
197
/// - parameter completion: Callback called on transport write completion.
216
198
open func emit( _ event: String , _ items: SocketData ... , completion: ( ( ) -> ( ) ) ? = nil ) {
217
199
do {
218
- try emit ( event, with : items. map ( { try $0. socketRepresentation ( ) } ) , completion: completion)
200
+ emit ( [ event] + ( try items. map ( { try $0. socketRepresentation ( ) } ) ) , completion: completion)
219
201
} catch {
220
202
DefaultSocketLogger . Logger. error ( " Error creating socketRepresentation for emit: \( event) , \( items) " ,
221
203
type: logType)
@@ -224,25 +206,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
224
206
}
225
207
}
226
208
227
- /// Same as emit, but meant for Objective-C
228
- ///
229
- /// - parameter event: The event to send.
230
- /// - parameter items: The items to send with this event. Send an empty array to send no data.
231
- @objc
232
- open func emit( _ event: String , with items: [ Any ] ) {
233
- emit ( [ event] + items)
234
- }
235
-
236
- /// Same as emit, but meant for Objective-C
237
- ///
238
- /// - parameter event: The event to send.
239
- /// - parameter items: The items to send with this event. Send an empty array to send no data.
240
- /// - parameter completion: Callback called on transport write completion.
241
- @objc
242
- open func emit( _ event: String , with items: [ Any ] , completion: ( ( ) -> ( ) ) ? = nil ) {
243
- emit ( [ event] + items, completion: completion)
244
- }
245
-
246
209
/// Sends a message to the server, requesting an ack.
247
210
///
248
211
/// **NOTE**: It is up to the server send an ack back, just calling this method does not mean the server will ack.
@@ -264,7 +227,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
264
227
/// - returns: An `OnAckCallback`. You must call the `timingOut(after:)` method before the event will be sent.
265
228
open func emitWithAck( _ event: String , _ items: SocketData ... ) -> OnAckCallback {
266
229
do {
267
- return emitWithAck ( event, with : try items. map ( { try $0. socketRepresentation ( ) } ) )
230
+ return createOnAck ( [ event] + ( try items. map ( { try $0. socketRepresentation ( ) } ) ) )
268
231
} catch {
269
232
DefaultSocketLogger . Logger. error ( " Error creating socketRepresentation for emit: \( event) , \( items) " ,
270
233
type: logType)
@@ -275,27 +238,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
275
238
}
276
239
}
277
240
278
- /// Same as emitWithAck, but for Objective-C
279
- ///
280
- /// **NOTE**: It is up to the server send an ack back, just calling this method does not mean the server will ack.
281
- /// Check that your server's api will ack the event being sent.
282
- ///
283
- /// Example:
284
- ///
285
- /// ```swift
286
- /// socket.emitWithAck("myEvent", with: [1]).timingOut(after: 1) {data in
287
- /// ...
288
- /// }
289
- /// ```
290
- ///
291
- /// - parameter event: The event to send.
292
- /// - parameter items: The items to send with this event. Use `[]` to send nothing.
293
- /// - returns: An `OnAckCallback`. You must call the `timingOut(after:)` method before the event will be sent.
294
- @objc
295
- open func emitWithAck( _ event: String , with items: [ Any ] ) -> OnAckCallback {
296
- return createOnAck ( [ event] + items)
297
- }
298
-
299
241
func emit( _ data: [ Any ] ,
300
242
ack: Int ? = nil ,
301
243
binary: Bool = true ,
@@ -338,7 +280,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
338
280
///
339
281
/// - parameter ack: The number for this ack.
340
282
/// - parameter data: The data sent back with this ack.
341
- @objc
342
283
open func handleAck( _ ack: Int , data: [ Any ] ) {
343
284
guard status == . connected else { return }
344
285
@@ -361,7 +302,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
361
302
/// - parameter data: The data that was sent with this event.
362
303
/// - parameter isInternalMessage: Whether this event was sent internally. If `true` it is always sent to handlers.
363
304
/// - parameter ack: If > 0 then this event expects to get an ack back from the client.
364
- @objc
365
305
open func handleEvent( _ event: String , data: [ Any ] , isInternalMessage: Bool , withAck ack: Int = - 1 ) {
366
306
guard status == . connected || isInternalMessage else { return }
367
307
@@ -387,7 +327,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
387
327
case . ack, . binaryAck:
388
328
handleAck ( packet. id, data: packet. data)
389
329
case . connect:
390
- didConnect ( toNamespace: nsp)
330
+ didConnect ( toNamespace: nsp, payload : packet . data . isEmpty ? nil : packet . data [ 0 ] as? [ String : Any ] )
391
331
case . disconnect:
392
332
didDisconnect ( reason: " Got Disconnect " )
393
333
case . error:
@@ -396,13 +336,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
396
336
}
397
337
398
338
/// Call when you wish to leave a namespace and disconnect this socket.
399
- @objc
400
339
open func leaveNamespace( ) {
401
340
manager? . disconnectSocket ( self )
402
341
}
403
342
404
343
/// Joins `nsp`.
405
- @objc
406
344
open func joinNamespace( ) {
407
345
DefaultSocketLogger . Logger. log ( " Joining namespace \( nsp) " , type: logType)
408
346
@@ -423,7 +361,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
423
361
/// If you wish to remove a specific event, call the `off(id:)` with the UUID received from its `on` call.
424
362
///
425
363
/// - parameter event: The event to remove handlers for.
426
- @objc
427
364
open func off( _ event: String ) {
428
365
DefaultSocketLogger . Logger. log ( " Removing handler for event: \( event) " , type: logType)
429
366
@@ -435,7 +372,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
435
372
/// If you want to remove all events for an event, call the off `off(_:)` method with the event name.
436
373
///
437
374
/// - parameter id: The UUID of the handler you wish to remove.
438
- @objc
439
375
open func off( id: UUID ) {
440
376
DefaultSocketLogger . Logger. log ( " Removing handler with id: \( id) " , type: logType)
441
377
@@ -447,7 +383,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
447
383
/// - parameter event: The event name for this handler.
448
384
/// - parameter callback: The callback that will execute when this event is received.
449
385
/// - returns: A unique id for the handler that can be used to remove it.
450
- @objc
451
386
@discardableResult
452
387
open func on( _ event: String , callback: @escaping NormalCallback ) -> UUID {
453
388
DefaultSocketLogger . Logger. log ( " Adding handler for event: \( event) " , type: logType)
@@ -491,7 +426,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
491
426
/// - parameter event: The event name for this handler.
492
427
/// - parameter callback: The callback that will execute when this event is received.
493
428
/// - returns: A unique id for the handler that can be used to remove it.
494
- @objc
495
429
@discardableResult
496
430
open func once( _ event: String , callback: @escaping NormalCallback ) -> UUID {
497
431
DefaultSocketLogger . Logger. log ( " Adding once handler for event: \( event) " , type: logType)
@@ -512,20 +446,17 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
512
446
/// Adds a handler that will be called on every event.
513
447
///
514
448
/// - parameter handler: The callback that will execute whenever an event is received.
515
- @objc
516
449
open func onAny( _ handler: @escaping ( SocketAnyEvent ) -> ( ) ) {
517
450
anyHandler = handler
518
451
}
519
452
520
453
/// Tries to reconnect to the server.
521
- @objc
522
454
@available ( * , unavailable, message: " Call the manager's reconnect method " )
523
455
open func reconnect( ) { }
524
456
525
457
/// Removes all handlers.
526
458
///
527
459
/// Can be used after disconnecting to break any potential remaining retain cycles.
528
- @objc
529
460
open func removeAllHandlers( ) {
530
461
handlers. removeAll ( keepingCapacity: false )
531
462
}
@@ -534,7 +465,6 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
534
465
/// Called when the manager detects a broken connection, or when a manual reconnect is triggered.
535
466
///
536
467
/// - parameter reason: The reason this socket is reconnecting.
537
- @objc
538
468
open func setReconnecting( reason: String ) {
539
469
status = . connecting
540
470
0 commit comments