Compare commits

...

1 Commits

Author SHA1 Message Date
Michael Law 63d2cac4c1 fix: Subscription message handling - serial queue and stop after failed event 2022-02-16 16:03:28 -05:00
2 changed files with 15 additions and 7 deletions

View File

@ -32,6 +32,7 @@ extension AppSyncSubscriptionConnection {
let connectionError = error as? ConnectionProviderError let connectionError = error as? ConnectionProviderError
else { else {
subscriptionItem.subscriptionEventHandler(.failed(error), subscriptionItem) subscriptionItem.subscriptionEventHandler(.failed(error), subscriptionItem)
connectionProvider?.removeListener(identifier: subscriptionItem.identifier)
return return
} }
@ -43,6 +44,7 @@ extension AppSyncSubscriptionConnection {
} }
} else { } else {
subscriptionItem.subscriptionEventHandler(.failed(error), subscriptionItem) subscriptionItem.subscriptionEventHandler(.failed(error), subscriptionItem)
connectionProvider?.removeListener(identifier: subscriptionItem.identifier)
} }
} }

View File

@ -28,6 +28,10 @@ public class AppSyncSubscriptionConnection: SubscriptionConnection, RetryableCon
/// Retry logic to handle /// Retry logic to handle
var retryHandler: ConnectionRetryHandler? var retryHandler: ConnectionRetryHandler?
let serialQueue = DispatchQueue(
label: "com.amazonaws.AppSyncSubscriptionConnection.serialQueue"
)
public init(provider: ConnectionProvider) { public init(provider: ConnectionProvider) {
self.connectionProvider = provider self.connectionProvider = provider
} }
@ -84,13 +88,15 @@ public class AppSyncSubscriptionConnection: SubscriptionConnection, RetryableCon
AppSyncLogger.debug("[AppSyncSubscriptionConnection] \(#function): Self is nil, listener is not called.") AppSyncLogger.debug("[AppSyncSubscriptionConnection] \(#function): Self is nil, listener is not called.")
return return
} }
switch event { self.serialQueue.async {
case .connection(let state): switch event {
self.handleConnectionEvent(connectionState: state) case .connection(let state):
case .data(let response): self.handleConnectionEvent(connectionState: state)
self.handleDataEvent(response: response) case .data(let response):
case .error(let error): self.handleDataEvent(response: response)
self.handleError(error: error) case .error(let error):
self.handleError(error: error)
}
} }
} }
} }