Skip to content

Commit a946943

Browse files
author
Valery Bashkatov
committed
1.0.1: Added removing of messages with expired response timeout.
1 parent 7096a18 commit a946943

File tree

3 files changed

+61
-9
lines changed

3 files changed

+61
-9
lines changed

Phoenix.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@
288288
);
289289
INFOPLIST_FILE = Sources/Info.plist;
290290
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
291-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
291+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
292292
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
293293
PRODUCT_BUNDLE_IDENTIFIER = org.bashkatov.valery.Phoenix;
294294
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -314,7 +314,7 @@
314314
);
315315
INFOPLIST_FILE = Sources/Info.plist;
316316
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
317-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
317+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
318318
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
319319
PRODUCT_BUNDLE_IDENTIFIER = org.bashkatov.valery.Phoenix;
320320
PRODUCT_NAME = "$(TARGET_NAME)";

Sources/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<key>CFBundlePackageType</key>
1616
<string>FMWK</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>1.0.0</string>
18+
<string>1.0.1</string>
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>

Sources/Phoenix.swift

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)