@@ -49,7 +49,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
4949 /// A queue of engine.io messages waiting for POSTing
5050 ///
5151 /// **You should not touch this directly**
52- public var postWait = [ String ] ( )
52+ public var postWait = [ Post ] ( )
5353
5454 /// `true` if there is an outstanding poll. Trying to poll before the first is done will cause socket.io to
5555 /// disconnect us.
@@ -340,15 +340,15 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
340340 if polling {
341341 disconnectPolling ( reason: reason)
342342 } else {
343- sendWebSocketMessage ( " " , withType: . close, withData: [ ] )
343+ sendWebSocketMessage ( " " , withType: . close, withData: [ ] , completion : { } )
344344 closeOutEngine ( reason: reason)
345345 }
346346 }
347347
348348 // We need to take special care when we're polling that we send it ASAP
349349 // Also make sure we're on the emitQueue since we're touching postWait
350350 private func disconnectPolling( reason: String ) {
351- postWait. append ( String ( SocketEnginePacketType . close. rawValue) )
351+ postWait. append ( ( String ( SocketEnginePacketType . close. rawValue) , { } ) )
352352
353353 doRequest ( for: createRequestForPostWithPostWait ( ) ) { _, _, _ in }
354354 closeOutEngine ( reason: reason)
@@ -366,7 +366,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
366366
367367 DefaultSocketLogger . Logger. log ( " Switching to WebSockets " , type: SocketEngine . logType)
368368
369- sendWebSocketMessage ( " " , withType: . upgrade, withData: [ ] )
369+ sendWebSocketMessage ( " " , withType: . upgrade, withData: [ ] , completion : { } )
370370 polling = false
371371 fastUpgrade = false
372372 probing = false
@@ -384,7 +384,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
384384 DefaultSocketLogger . Logger. log ( " Flushing probe wait " , type: SocketEngine . logType)
385385
386386 for waiter in probeWait {
387- write ( waiter. msg, withType: waiter. type, withData: waiter. data)
387+ write ( waiter. msg, withType: waiter. type, withData: waiter. data, completion : waiter . completion )
388388 }
389389
390390 probeWait. removeAll ( keepingCapacity: false )
@@ -398,7 +398,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
398398 guard let ws = self . ws else { return }
399399
400400 for msg in postWait {
401- ws. write ( string: msg)
401+ ws. write ( string: msg. msg , completion : msg . completion )
402402 }
403403
404404 postWait. removeAll ( keepingCapacity: false )
@@ -544,7 +544,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
544544 }
545545
546546 pongsMissed += 1
547- write ( " " , withType: . ping, withData: [ ] )
547+ write ( " " , withType: . ping, withData: [ ] , completion : { } )
548548
549549 engineQueue. asyncAfter ( deadline: . now( ) + . milliseconds( pingInterval) ) { [ weak self, id = self . sid] in
550550 // Make sure not to ping old connections
@@ -600,7 +600,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
600600 DefaultSocketLogger . Logger. log ( " Upgrading transport to WebSockets " , type: SocketEngine . logType)
601601
602602 fastUpgrade = true
603- sendPollMessage ( " " , withType: . noop, withData: [ ] )
603+ sendPollMessage ( " " , withType: . noop, withData: [ ] , completion : { } )
604604 // After this point, we should not send anymore polling messages
605605 }
606606 }
@@ -610,23 +610,27 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
610610 /// - parameter msg: The message to send.
611611 /// - parameter type: The type of this message.
612612 /// - parameter data: Any data that this message has.
613- open func write( _ msg: String , withType type: SocketEnginePacketType , withData data: [ Data ] ) {
613+ /// - parameter completion: Callback called on transport write completion.
614+ open func write( _ msg: String , withType type: SocketEnginePacketType , withData data: [ Data ] , completion: @escaping ( ) -> ( ) ) {
614615 engineQueue. async {
615- guard self . connected else { return }
616+ guard self . connected else {
617+ completion ( )
618+ return
619+ }
616620 guard !self . probing else {
617- self . probeWait. append ( ( msg, type, data) )
621+ self . probeWait. append ( ( msg, type, data, completion ) )
618622
619623 return
620624 }
621625
622626 if self . polling {
623627 DefaultSocketLogger . Logger. log ( " Writing poll: \( msg) has data: \( data. count != 0 ) " ,
624628 type: SocketEngine . logType)
625- self . sendPollMessage ( msg, withType: type, withData: data)
629+ self . sendPollMessage ( msg, withType: type, withData: data, completion : completion )
626630 } else {
627631 DefaultSocketLogger . Logger. log ( " Writing ws: \( msg) has data: \( data. count != 0 ) " ,
628632 type: SocketEngine . logType)
629- self . sendWebSocketMessage ( msg, withType: type, withData: data)
633+ self . sendWebSocketMessage ( msg, withType: type, withData: data, completion : completion )
630634 }
631635 }
632636 }
0 commit comments