1
+ %% SyncToCloudOperation
2
+ sequenceDiagram
3
+ participant OutgoingMutationQueue
4
+ participant StorageAdapter
5
+ participant ProcessMutationErrorFromCloudOperation
6
+ participant SyncToCloudOperation
7
+ participant API
8
+ participant RequestRetryablePolicy
9
+ participant NetworkReachability
10
+ participant MutationRetryNotifier
11
+ participant Hub
12
+
13
+ OutgoingMutationQueue ->> SyncToCloudOperation : Add SyncToCloudOperation(MutationEvent, authType)
14
+ SyncToCloudOperation ->> SyncToCloudOperation : Create GraphQL request (mutationType, authType)
15
+ SyncToCloudOperation ->> API : API.mutate(request)
16
+
17
+ alt Success
18
+ API ->> SyncToCloudOperation : GraphQL response
19
+ SyncToCloudOperation ->> OutgoingMutationQueue : finish
20
+ OutgoingMutationQueue ->> StorageAdapter : delete MutationEvent
21
+ else Failure
22
+ loop while shouldRetry=true
23
+ API ->> SyncToCloudOperation : GraphQL response
24
+ SyncToCloudOperation ->> RequestRetryablePolicy : getRetryAdviceIfRetryable
25
+ alt NetworkError (notConnected, dnsLookupFailed, cannotConnectToHost, cannotFindHost, timedOut, etc.), HttpStatusError (Retry-After header, 500-599, 429)
26
+ RequestRetryablePolicy ->> RequestRetryablePolicy : retryInterval = 2^attempt * 100 + jitter
27
+ RequestRetryablePolicy ->> SyncToCloudOperation : retryAdvice=(shouldRetry=true, retryInterval)
28
+ SyncToCloudOperation ->> MutationRetryNotifier : schedule next mutation (retryInterval)
29
+ MutationRetryNotifier ->> NetworkReachability : get last network status
30
+ alt NetworkReachability(isOnline=true)
31
+ NetworkReachability ->> MutationRetryNotifier : immediately perform next mutation
32
+ end
33
+ MutationRetryNotifier ->> SyncToCloudOperation : perform next mutation
34
+ SyncToCloudOperation ->> API : API.mutate(request)
35
+ else HttpStatusError (401) / OperationError (AuthError)
36
+ RequestRetryablePolicy ->> SyncToCloudOperation : retry with next auth type immediately
37
+ SyncToCloudOperation ->> API : API.mutate(request, authType[+1])
38
+ else
39
+ RequestRetryablePolicy ->> SyncToCloudOperation : retryAdvice=false
40
+ SyncToCloudOperation ->> OutgoingMutationQueue : finish(result)
41
+ end
42
+ end
43
+ end
44
+
45
+ alt SyncToCloudOperation finish with AppSync error
46
+ OutgoingMutationQueue ->> ProcessMutationErrorFromCloudOperation : process AppSync error
47
+ alt conditional check failed
48
+ ProcessMutationErrorFromCloudOperation ->> Hub : Event: conditionSaveFailed
49
+ ProcessMutationErrorFromCloudOperation ->> OutgoingMutationQueue : finish
50
+ else conflict unhandled
51
+ ProcessMutationErrorFromCloudOperation ->> ProcessMutationErrorFromCloudOperation : ProcessConflictUnhandled()
52
+ else unauthorized , operation disabled , unhandled errorType , unknown
53
+ ProcessMutationErrorFromCloudOperation ->> OutgoingMutationQueue : finish
54
+ end
55
+ end
56
+
0 commit comments