Skip to content

Commit babd984

Browse files
authored
chore(DataStore): Add SyncToCloudOperation sequence (#1722)
1 parent 70209ed commit babd984

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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+

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Sync/MutationSync/OutgoingMutationQueue/SyncMutationToCloudOperation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ class SyncMutationToCloudOperation: AsynchronousOperation {
279279
/// - Warning: Must be invoked from a locking context
280280
private func scheduleRetry(advice: RequestRetryAdvice,
281281
withAuthType authType: AWSAuthorizationType? = nil) {
282-
log.verbose("\(#function) scheduling retry for mutation")
282+
log.verbose("\(#function) scheduling retry for mutation \(advice)")
283283
mutationRetryNotifier = MutationRetryNotifier(
284284
advice: advice,
285285
networkReachabilityPublisher: networkReachabilityPublisher

0 commit comments

Comments
 (0)