in aws-datastore/src/main/java/com/amplifyframework/datastore/syncengine/Orchestrator.java [89:152]
public Orchestrator(
@NonNull final ModelProvider modelProvider,
@NonNull final SchemaRegistry schemaRegistry,
@NonNull final LocalStorageAdapter localStorageAdapter,
@NonNull final AppSync appSync,
@NonNull final DataStoreConfigurationProvider dataStoreConfigurationProvider,
@NonNull final Supplier<State> targetState,
final boolean isSyncRetryEnabled) {
Objects.requireNonNull(schemaRegistry);
Objects.requireNonNull(modelProvider);
Objects.requireNonNull(appSync);
Objects.requireNonNull(localStorageAdapter);
this.mutationOutbox = new PersistentMutationOutbox(localStorageAdapter);
VersionRepository versionRepository = new VersionRepository(localStorageAdapter);
Merger merger = new Merger(mutationOutbox, versionRepository, localStorageAdapter);
SyncTimeRegistry syncTimeRegistry = new SyncTimeRegistry(localStorageAdapter);
ConflictResolver conflictResolver = new ConflictResolver(dataStoreConfigurationProvider, appSync);
this.queryPredicateProvider = new QueryPredicateProvider(dataStoreConfigurationProvider);
this.mutationProcessor = MutationProcessor.builder()
.merger(merger)
.versionRepository(versionRepository)
.schemaRegistry(schemaRegistry)
.mutationOutbox(mutationOutbox)
.appSync(appSync)
.conflictResolver(conflictResolver)
.build();
this.syncProcessor = SyncProcessor.builder()
.modelProvider(modelProvider)
.schemaRegistry(schemaRegistry)
.syncTimeRegistry(syncTimeRegistry)
.appSync(appSync)
.merger(merger)
.dataStoreConfigurationProvider(dataStoreConfigurationProvider)
.queryPredicateProvider(queryPredicateProvider)
.retryHandler(new RetryHandler())
.isSyncRetryEnabled(isSyncRetryEnabled)
.build();
this.subscriptionProcessor = SubscriptionProcessor.builder()
.appSync(appSync)
.modelProvider(modelProvider)
.schemaRegistry(schemaRegistry)
.merger(merger)
.queryPredicateProvider(queryPredicateProvider)
.onFailure(this::onApiSyncFailure)
.build();
this.storageObserver = new StorageObserver(localStorageAdapter, mutationOutbox);
this.currentState = new AtomicReference<>(State.STOPPED);
this.targetState = targetState;
this.disposables = new CompositeDisposable();
// Operation times out after 60 seconds. If there are more than 5 models,
// then 20 seconds are added to the timer per additional model count.
this.adjustedTimeoutSeconds = Math.max(
NETWORK_OP_TIMEOUT_SECONDS,
TIMEOUT_SECONDS_PER_MODEL * Math.max(
modelProvider.models().size(),
modelProvider.modelSchemas().size()
)
);
this.startStopSemaphore = new Semaphore(1);
}