@@ -21,6 +21,8 @@ final public class AWSGraphQLSubscriptionOperation<R: Decodable>: GraphQLSubscri
21
21
var subscriptionItem : SubscriptionItem ?
22
22
var apiAuthProviderFactory : APIAuthProviderFactory
23
23
24
+ private let subscriptionQueue = DispatchQueue ( label: " AWSGraphQLSubscriptionOperation.subscriptionQueue " )
25
+
24
26
init ( request: GraphQLOperationRequest < R > ,
25
27
pluginConfig: AWSAPICategoryPluginConfiguration ,
26
28
subscriptionConnectionFactory: SubscriptionConnectionFactory ,
@@ -42,11 +44,14 @@ final public class AWSGraphQLSubscriptionOperation<R: Decodable>: GraphQLSubscri
42
44
}
43
45
44
46
override public func cancel( ) {
45
- if let subscriptionItem = subscriptionItem, let subscriptionConnection = subscriptionConnection {
46
- subscriptionConnection. unsubscribe ( item: subscriptionItem)
47
- let subscriptionEvent = SubscriptionEvent< GraphQLResponse< R>>. connection( . disconnected)
48
- dispatchInProcess ( data: subscriptionEvent)
47
+ subscriptionQueue. sync {
48
+ if let subscriptionItem = subscriptionItem, let subscriptionConnection = subscriptionConnection {
49
+ subscriptionConnection. unsubscribe ( item: subscriptionItem)
50
+ let subscriptionEvent = SubscriptionEvent< GraphQLResponse< R>>. connection( . disconnected)
51
+ dispatchInProcess ( data: subscriptionEvent)
52
+ }
49
53
}
54
+
50
55
super. cancel ( )
51
56
dispatch ( result: . successfulVoid)
52
57
finish ( )
@@ -90,27 +95,28 @@ final public class AWSGraphQLSubscriptionOperation<R: Decodable>: GraphQLSubscri
90
95
let pluginOptions = request. options. pluginOptions as? AWSPluginOptions
91
96
92
97
// Retrieve the subscription connection
93
- do {
94
- subscriptionConnection = try subscriptionConnectionFactory
95
- . getOrCreateConnection ( for: endpointConfig,
96
- authService: authService,
97
- authType: pluginOptions? . authType,
98
- apiAuthProviderFactory: apiAuthProviderFactory)
99
- } catch {
100
- let error = APIError . operationError ( " Unable to get connection for api \( endpointConfig. name) " , " " , error)
101
- dispatch ( result: . failure( error) )
102
- finish ( )
103
- return
98
+ subscriptionQueue. sync {
99
+ do {
100
+ subscriptionConnection = try subscriptionConnectionFactory
101
+ . getOrCreateConnection ( for: endpointConfig,
102
+ authService: authService,
103
+ authType: pluginOptions? . authType,
104
+ apiAuthProviderFactory: apiAuthProviderFactory)
105
+ } catch {
106
+ let error = APIError . operationError ( " Unable to get connection for api \( endpointConfig. name) " , " " , error)
107
+ dispatch ( result: . failure( error) )
108
+ finish ( )
109
+ return
110
+ }
111
+
112
+ // Create subscription
113
+
114
+ subscriptionItem = subscriptionConnection? . subscribe ( requestString: request. document,
115
+ variables: request. variables,
116
+ eventHandler: { [ weak self] event, _ in
117
+ self ? . onAsyncSubscriptionEvent ( event: event)
118
+ } )
104
119
}
105
-
106
- // Create subscription
107
-
108
- subscriptionItem = subscriptionConnection? . subscribe ( requestString: request. document,
109
- variables: request. variables,
110
- eventHandler: { [ weak self] event, _ in
111
- self ? . onAsyncSubscriptionEvent ( event: event)
112
- } )
113
-
114
120
}
115
121
116
122
private func onAsyncSubscriptionEvent( event: SubscriptionItemEvent ) {
0 commit comments