@@ -82,13 +82,20 @@ public class Phoenix: NSObject, WebSocketDelegate {
8282
8383 /// The queue of messages to send. A message is deleted from it after receiving a response.
8484 private var sendingBuffer : [ ( message: PhoenixMessage ,
85+ date: NSDate ,
8586 responseHandler: ( ( response: PhoenixMessage , error: NSError ? ) -> Void ) ? ) ] = [ ]
8687
88+ /// The sending buffer timeout timer. Used for removing messages with expired response.
89+ private var sendingBufferTimeoutTimer = NSTimer ( )
90+
91+ /// The sending buffer timeout timer interval (in seconds).
92+ public var sendingBufferTimeoutInterval = 10.0
93+
8794 /// The heartbeat timer.
8895 private var heartbeatTimer = NSTimer ( )
8996
9097 /// The heartbeat interval (in seconds).
91- private var heartbeatInterval = 20.0
98+ public var heartbeatInterval = 20.0
9299
93100 /// A Boolean value that indicates a need of auto reconnections.
94101 public var autoReconnect = true
@@ -145,8 +152,18 @@ public class Phoenix: NSObject, WebSocketDelegate {
145152
146153 socket. callbackQueue = phoenixQueue
147154 socket. delegate = self
155+
156+ dispatch_async ( dispatch_get_main_queue ( ) ) {
157+ self . sendingBufferTimeoutTimer. invalidate ( )
158+ self . sendingBufferTimeoutTimer = NSTimer . scheduledTimerWithTimeInterval (
159+ self . sendingBufferTimeoutInterval,
160+ target: self ,
161+ selector: #selector( self . removeExpiredMessages) ,
162+ userInfo: nil ,
163+ repeats: true )
164+ }
148165 }
149-
166+
150167 // MARK: - Connection
151168
152169 /**
@@ -275,7 +292,9 @@ public class Phoenix: NSObject, WebSocketDelegate {
275292
276293 // Add message to the queue if needed
277294 if !self . sendingBuffer. contains ( { $0. message. isEqual ( message) } ) {
278- self . sendingBuffer. append ( ( message: message, responseHandler: responseHandler) )
295+ self . sendingBuffer. append ( ( message: message,
296+ date: NSDate ( ) ,
297+ responseHandler: responseHandler) )
279298 }
280299
281300 let isChannelJoined = self . channels [ message. topic] ? . isJoined ?? false
@@ -323,7 +342,7 @@ public class Phoenix: NSObject, WebSocketDelegate {
323342 responseMessage. payload ? [ " response " ] ? [ " error " ] as? String
324343 ?? " "
325344
326- let errorDescription = " Sending a message failed because : \( errorReason) "
345+ let errorDescription = " Message failed to send : \( errorReason) "
327346
328347 let error = NSError ( domain: " phoenix.message.error " ,
329348 code: 0 ,
@@ -353,8 +372,8 @@ public class Phoenix: NSObject, WebSocketDelegate {
353372
354373 let errorDescription = " Channel is closed by the server because: \( errorReason) "
355374
356- let error = NSError ( domain: " phoenix.message .error " ,
357- code: 0 ,
375+ let error = NSError ( domain: " phoenix.channel .error " ,
376+ code: 1 ,
358377 userInfo: [ NSLocalizedFailureReasonErrorKey: errorReason,
359378 NSLocalizedDescriptionKey: errorDescription] )
360379
@@ -382,6 +401,39 @@ public class Phoenix: NSObject, WebSocketDelegate {
382401 }
383402 }
384403
404+ // MARK: - Removing Expired Messages
405+
406+ /**
407+ Removes messages from sending buffer with expired response timeout.
408+ */
409+ @objc private func removeExpiredMessages( ) {
410+
411+ // Remove expired messages from the sending buffer
412+ for expiredItem in sendingBuffer
413+ where NSDate ( ) . timeIntervalSinceDate ( expiredItem. date) > ( sendingBufferTimeoutInterval / 2 ) {
414+
415+ dispatch_async ( phoenixQueue) {
416+
417+ if let index = self . sendingBuffer. indexOf ( { $0. message. isEqual ( expiredItem. message) } ) {
418+ self . sendingBuffer. removeAtIndex ( index)
419+
420+ dispatch_async ( self . responseQueue) {
421+
422+ let errorReason = " Timeout expired. "
423+ let errorDescription = " Message failed to send: timeout expired. "
424+
425+ let error = NSError ( domain: " phoenix.message.error " ,
426+ code: 2 ,
427+ userInfo: [ NSLocalizedFailureReasonErrorKey: errorReason,
428+ NSLocalizedDescriptionKey: errorDescription] )
429+
430+ expiredItem. responseHandler ? ( response: expiredItem. message, error: error)
431+ }
432+ }
433+ }
434+ }
435+ }
436+
385437 // MARK: - Adding and Removing Listeners
386438
387439 /**
0 commit comments