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