Skip to content

Commit 2c9bc07

Browse files
authored
feat: Pass instance of DataStoreConfiguration through Datastore (#383)
1 parent a787029 commit 2c9bc07

16 files changed

+92
-40
lines changed

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/AWSDataStorePlugin.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin {
7070
public func configure(using configuration: Any) throws {
7171
modelRegistration.registerModels(registry: ModelRegistry.self)
7272
resolveSyncEnabled()
73-
try resolveStorageEngine()
73+
try resolveStorageEngine(dataStoreConfiguration: self.configuration)
7474

7575
try storageEngine.setUp(models: ModelRegistry.models)
7676

@@ -92,20 +92,20 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin {
9292
if #available(iOS 13.0, *) {
9393
self.dataStorePublisher = DataStorePublisher()
9494
}
95-
try resolveStorageEngine()
95+
try resolveStorageEngine(dataStoreConfiguration: configuration)
9696
try storageEngine.setUp(models: ModelRegistry.models)
9797
storageEngine.startSync()
9898
} catch {
9999
log.error(error: error)
100100
}
101101
}
102102

103-
func resolveStorageEngine() throws {
103+
func resolveStorageEngine(dataStoreConfiguration: DataStoreConfiguration) throws {
104104
guard storageEngine == nil else {
105105
return
106106
}
107107

108-
storageEngine = try StorageEngine(isSyncEnabled: isSyncEnabled)
108+
storageEngine = try StorageEngine(isSyncEnabled: isSyncEnabled, dataStoreConfiguration: dataStoreConfiguration)
109109
if #available(iOS 13.0, *) {
110110
setupStorageSink()
111111
}

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Storage/StorageEngine.swift

+12-6
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ import AWSPluginsCore
1313
final class StorageEngine: StorageEngineBehavior {
1414
// TODO: Make this private once we get a mutation flow that passes the type of mutation as needed
1515
let storageAdapter: StorageEngineAdapter
16-
16+
private let dataStoreConfiguration: DataStoreConfiguration
1717
private var syncEngine: RemoteSyncEngineBehavior?
18-
1918
private weak var api: APICategoryGraphQLBehavior?
2019

2120
var iSyncEngineSink: Any?
@@ -62,25 +61,32 @@ final class StorageEngine: StorageEngineBehavior {
6261
// Internal initializer used for testing, to allow lazy initialization of the SyncEngine. Note that the provided
6362
// storageAdapter must have already been set up with system models
6463
init(storageAdapter: StorageEngineAdapter,
64+
dataStoreConfiguration: DataStoreConfiguration,
6565
syncEngine: RemoteSyncEngineBehavior?) {
6666
self.storageAdapter = storageAdapter
67+
self.dataStoreConfiguration = dataStoreConfiguration
6768
self.syncEngine = syncEngine
6869
}
6970

70-
convenience init(isSyncEnabled: Bool) throws {
71+
convenience init(isSyncEnabled: Bool, dataStoreConfiguration: DataStoreConfiguration) throws {
7172
let key = kCFBundleNameKey as String
7273
let databaseName = Bundle.main.object(forInfoDictionaryKey: key) as? String
7374
let storageAdapter = try SQLiteStorageEngineAdapter(databaseName: databaseName ?? "app")
7475

7576
try storageAdapter.setUp(models: StorageEngine.systemModels)
7677
if #available(iOS 13.0, *) {
77-
let syncEngine = isSyncEnabled ? try? RemoteSyncEngine(storageAdapter: storageAdapter) : nil
78-
self.init(storageAdapter: storageAdapter, syncEngine: syncEngine)
78+
let syncEngine = isSyncEnabled ? try? RemoteSyncEngine(storageAdapter: storageAdapter,
79+
dataStoreConfiguration: dataStoreConfiguration) : nil
80+
self.init(storageAdapter: storageAdapter,
81+
dataStoreConfiguration: dataStoreConfiguration,
82+
syncEngine: syncEngine)
7983
self.storageEnginePublisher = PassthroughSubject<StorageEngineEvent, DataStoreError>()
8084
sinkEngineSink = syncEngine?.publisher.sink(receiveCompletion: onReceiveCompletion(receiveCompletion:),
8185
receiveValue: onReceive(receiveValue:))
8286
} else {
83-
self.init(storageAdapter: storageAdapter, syncEngine: nil)
87+
self.init(storageAdapter: storageAdapter,
88+
dataStoreConfiguration: dataStoreConfiguration,
89+
syncEngine: nil)
8490
}
8591
}
8692

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Sync/InitialSync/InitialSyncOperation.swift

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ final class InitialSyncOperation: AsynchronousOperation {
1515
private weak var api: APICategoryGraphQLBehavior?
1616
private weak var reconciliationQueue: IncomingEventReconciliationQueue?
1717
private weak var storageAdapter: StorageEngineAdapter?
18+
private let dataStoreConfiguration: DataStoreConfiguration
1819

1920
private let modelType: Model.Type
2021
private let completion: AWSInitialSyncOrchestrator.SyncOperationResultHandler
@@ -25,11 +26,13 @@ final class InitialSyncOperation: AsynchronousOperation {
2526
api: APICategoryGraphQLBehavior?,
2627
reconciliationQueue: IncomingEventReconciliationQueue?,
2728
storageAdapter: StorageEngineAdapter?,
29+
dataStoreConfiguration: DataStoreConfiguration,
2830
completion: @escaping AWSInitialSyncOrchestrator.SyncOperationResultHandler) {
2931
self.modelType = modelType
3032
self.api = api
3133
self.reconciliationQueue = reconciliationQueue
3234
self.storageAdapter = storageAdapter
35+
self.dataStoreConfiguration = dataStoreConfiguration
3336
self.completion = completion
3437
}
3538

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Sync/InitialSync/InitialSyncOrchestrator.swift

+9-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@ protocol InitialSyncOrchestrator {
1515
// For testing
1616
@available(iOS 13.0, *)
1717
typealias InitialSyncOrchestratorFactory =
18-
(APICategoryGraphQLBehavior?, IncomingEventReconciliationQueue?, StorageEngineAdapter?) -> InitialSyncOrchestrator
18+
(DataStoreConfiguration,
19+
APICategoryGraphQLBehavior?,
20+
IncomingEventReconciliationQueue?,
21+
StorageEngineAdapter?) -> InitialSyncOrchestrator
1922

2023
@available(iOS 13.0, *)
2124
final class AWSInitialSyncOrchestrator: InitialSyncOrchestrator {
2225
typealias SyncOperationResult = Result<Void, DataStoreError>
2326
typealias SyncOperationResultHandler = (SyncOperationResult) -> Void
2427

28+
private let dataStoreConfiguration: DataStoreConfiguration
2529
private weak var api: APICategoryGraphQLBehavior?
2630
private weak var reconciliationQueue: IncomingEventReconciliationQueue?
2731
private weak var storageAdapter: StorageEngineAdapter?
@@ -34,9 +38,11 @@ final class AWSInitialSyncOrchestrator: InitialSyncOrchestrator {
3438
// interdependencies
3539
private let syncOperationQueue: OperationQueue
3640

37-
init(api: APICategoryGraphQLBehavior?,
41+
init(dataStoreConfiguration: DataStoreConfiguration,
42+
api: APICategoryGraphQLBehavior?,
3843
reconciliationQueue: IncomingEventReconciliationQueue?,
3944
storageAdapter: StorageEngineAdapter?) {
45+
self.dataStoreConfiguration = dataStoreConfiguration
4046
self.api = api
4147
self.reconciliationQueue = reconciliationQueue
4248
self.storageAdapter = storageAdapter
@@ -91,6 +97,7 @@ final class AWSInitialSyncOrchestrator: InitialSyncOrchestrator {
9197
api: api,
9298
reconciliationQueue: reconciliationQueue,
9399
storageAdapter: storageAdapter,
100+
dataStoreConfiguration: dataStoreConfiguration,
94101
completion: syncOperationCompletion)
95102

96103
syncOperationQueue.addOperation(initialSyncForModel)

AmplifyPlugins/DataStore/AWSDataStoreCategoryPlugin/Sync/RemoteSyncEngine.swift

+11-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior {
1414

1515
weak var storageAdapter: StorageEngineAdapter?
1616

17+
private var dataStoreConfiguration: DataStoreConfiguration
18+
1719
// Assigned at `start`
1820
weak var api: APICategoryGraphQLBehavior?
1921

@@ -54,6 +56,7 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior {
5456
/// MutationEvents, sync metadata, and conflict resolution metadata. Immediately initializes the incoming mutation
5557
/// queue so it can begin accepting incoming mutations from DataStore.
5658
convenience init(storageAdapter: StorageEngineAdapter,
59+
dataStoreConfiguration: DataStoreConfiguration,
5760
outgoingMutationQueue: OutgoingMutationQueueBehavior? = nil,
5861
initialSyncOrchestratorFactory: InitialSyncOrchestratorFactory? = nil,
5962
reconciliationQueueFactory: IncomingEventReconciliationQueueFactory? = nil,
@@ -66,13 +69,14 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior {
6669
let reconciliationQueueFactory = reconciliationQueueFactory ??
6770
AWSIncomingEventReconciliationQueue.init(modelTypes:api:storageAdapter:)
6871
let initialSyncOrchestratorFactory = initialSyncOrchestratorFactory ??
69-
AWSInitialSyncOrchestrator.init(api:reconciliationQueue:storageAdapter:)
72+
AWSInitialSyncOrchestrator.init(dataStoreConfiguration:api:reconciliationQueue:storageAdapter:)
7073
let stateMachine = stateMachine ?? StateMachine(initialState: .notStarted,
7174
resolver: RemoteSyncEngine.Resolver.resolve(currentState:action:))
7275
let requestRetryablePolicy = requestRetryablePolicy ?? RequestRetryablePolicy()
7376

7477

7578
self.init(storageAdapter: storageAdapter,
79+
dataStoreConfiguration: dataStoreConfiguration,
7680
outgoingMutationQueue: outgoingMutationQueue,
7781
mutationEventIngester: mutationDatabaseAdapter,
7882
mutationEventPublisher: awsMutationEventPublisher,
@@ -84,6 +88,7 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior {
8488
}
8589

8690
init(storageAdapter: StorageEngineAdapter,
91+
dataStoreConfiguration: DataStoreConfiguration,
8792
outgoingMutationQueue: OutgoingMutationQueueBehavior,
8893
mutationEventIngester: MutationEventIngester,
8994
mutationEventPublisher: MutationEventPublisher,
@@ -93,6 +98,7 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior {
9398
networkReachabilityPublisher: AnyPublisher<ReachabilityUpdate, Never>?,
9499
requestRetryablePolicy: RequestRetryablePolicy) {
95100
self.storageAdapter = storageAdapter
101+
self.dataStoreConfiguration = dataStoreConfiguration
96102
self.mutationEventIngester = mutationEventIngester
97103
self.mutationEventPublisher = mutationEventPublisher
98104
self.outgoingMutationQueue = outgoingMutationQueue
@@ -221,7 +227,10 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior {
221227
private func performInitialSync() {
222228
log.debug(#function)
223229

224-
let initialSyncOrchestrator = initialSyncOrchestratorFactory(api, reconciliationQueue, storageAdapter)
230+
let initialSyncOrchestrator = initialSyncOrchestratorFactory(dataStoreConfiguration,
231+
api,
232+
reconciliationQueue,
233+
storageAdapter)
225234

226235
// Hold a reference so we can `reset` while initial sync is in process
227236
self.initialSyncOrchestrator = initialSyncOrchestrator

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/APICategoryDependencyTests.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ extension APICategoryDependencyTests {
6767
storageAdapter = try SQLiteStorageEngineAdapter(connection: connection)
6868
try storageAdapter.setUp(models: StorageEngine.systemModels)
6969

70-
let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter)
70+
let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter,
71+
dataStoreConfiguration: .default)
7172
let storageEngine = StorageEngine(storageAdapter: storageAdapter,
73+
dataStoreConfiguration: .default,
7274
syncEngine: syncEngine)
7375

7476
let dataStorePublisher = DataStorePublisher()

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/InitialSync/InitialSyncOperationTests.swift

+14-7
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ class InitialSyncOperationTests: XCTestCase {
4747
modelType: MockSynced.self,
4848
api: apiPlugin,
4949
reconciliationQueue: reconciliationQueue,
50-
storageAdapter: storageAdapter) { _ in }
50+
storageAdapter: storageAdapter,
51+
dataStoreConfiguration: .default) { _ in }
5152

5253
operation.main()
5354

@@ -81,7 +82,8 @@ class InitialSyncOperationTests: XCTestCase {
8182
modelType: MockSynced.self,
8283
api: apiPlugin,
8384
reconciliationQueue: reconciliationQueue,
84-
storageAdapter: storageAdapter) { _ in }
85+
storageAdapter: storageAdapter,
86+
dataStoreConfiguration: .default) { _ in }
8587

8688
operation.main()
8789

@@ -114,7 +116,8 @@ class InitialSyncOperationTests: XCTestCase {
114116
modelType: MockSynced.self,
115117
api: apiPlugin,
116118
reconciliationQueue: reconciliationQueue,
117-
storageAdapter: storageAdapter) { _ in
119+
storageAdapter: storageAdapter,
120+
dataStoreConfiguration: .default) { _ in
118121
syncCallbackReceived.fulfill()
119122
}
120123

@@ -155,7 +158,8 @@ class InitialSyncOperationTests: XCTestCase {
155158
modelType: MockSynced.self,
156159
api: apiPlugin,
157160
reconciliationQueue: reconciliationQueue,
158-
storageAdapter: storageAdapter) { _ in }
161+
storageAdapter: storageAdapter,
162+
dataStoreConfiguration: .default) { _ in }
159163

160164
operation.main()
161165

@@ -203,7 +207,8 @@ class InitialSyncOperationTests: XCTestCase {
203207
modelType: MockSynced.self,
204208
api: apiPlugin,
205209
reconciliationQueue: reconciliationQueue,
206-
storageAdapter: storageAdapter) { _ in }
210+
storageAdapter: storageAdapter,
211+
dataStoreConfiguration: .default) { _ in }
207212

208213
operation.main()
209214

@@ -237,7 +242,8 @@ class InitialSyncOperationTests: XCTestCase {
237242
modelType: MockSynced.self,
238243
api: apiPlugin,
239244
reconciliationQueue: reconciliationQueue,
240-
storageAdapter: storageAdapter) { _ in
245+
storageAdapter: storageAdapter,
246+
dataStoreConfiguration: .default) { _ in
241247
syncCallbackReceived.fulfill()
242248
}
243249

@@ -297,7 +303,8 @@ class InitialSyncOperationTests: XCTestCase {
297303
modelType: MockSynced.self,
298304
api: apiPlugin,
299305
reconciliationQueue: reconciliationQueue,
300-
storageAdapter: storageAdapter) {_ in }
306+
storageAdapter: storageAdapter,
307+
dataStoreConfiguration: .default) {_ in }
301308

302309
operation.main()
303310

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/InitialSync/InitialSyncOrchestratorTests.swift

+6-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ class InitialSyncOrchestratorTests: XCTestCase {
4343
let reconciliationQueue = MockReconciliationQueue()
4444

4545
let orchestrator: InitialSyncOrchestrator =
46-
AWSInitialSyncOrchestrator(api: apiPlugin,
46+
AWSInitialSyncOrchestrator(dataStoreConfiguration: .default,
47+
api: apiPlugin,
4748
reconciliationQueue: reconciliationQueue,
4849
storageAdapter: storageAdapter)
4950

@@ -88,7 +89,8 @@ class InitialSyncOrchestratorTests: XCTestCase {
8889
let reconciliationQueue = MockReconciliationQueue()
8990

9091
let orchestrator: InitialSyncOrchestrator =
91-
AWSInitialSyncOrchestrator(api: apiPlugin,
92+
AWSInitialSyncOrchestrator(dataStoreConfiguration: .default,
93+
api: apiPlugin,
9294
reconciliationQueue: reconciliationQueue,
9395
storageAdapter: storageAdapter)
9496

@@ -139,7 +141,8 @@ class InitialSyncOrchestratorTests: XCTestCase {
139141
let reconciliationQueue = MockReconciliationQueue()
140142

141143
let orchestrator: InitialSyncOrchestrator =
142-
AWSInitialSyncOrchestrator(api: apiPlugin,
144+
AWSInitialSyncOrchestrator(dataStoreConfiguration: .default,
145+
api: apiPlugin,
143146
reconciliationQueue: reconciliationQueue,
144147
storageAdapter: storageAdapter)
145148

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/LocalSubscriptionTests.swift

+10-8
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,18 @@ class LocalSubscriptionTests: XCTestCase {
3636
stateMachine = MockStateMachine(initialState: .notStarted, resolver: RemoteSyncEngine.Resolver.resolve(currentState:action:))
3737

3838
let syncEngine = RemoteSyncEngine(storageAdapter: storageAdapter,
39-
outgoingMutationQueue: outgoingMutationQueue,
40-
mutationEventIngester: mutationDatabaseAdapter,
41-
mutationEventPublisher: awsMutationEventPublisher,
42-
initialSyncOrchestratorFactory: NoOpInitialSyncOrchestrator.factory,
43-
reconciliationQueueFactory: MockAWSIncomingEventReconciliationQueue.factory,
44-
stateMachine: stateMachine,
45-
networkReachabilityPublisher: nil,
46-
requestRetryablePolicy: MockRequestRetryablePolicy())
39+
dataStoreConfiguration: .default,
40+
outgoingMutationQueue: outgoingMutationQueue,
41+
mutationEventIngester: mutationDatabaseAdapter,
42+
mutationEventPublisher: awsMutationEventPublisher,
43+
initialSyncOrchestratorFactory: NoOpInitialSyncOrchestrator.factory,
44+
reconciliationQueueFactory: MockAWSIncomingEventReconciliationQueue.factory,
45+
stateMachine: stateMachine,
46+
networkReachabilityPublisher: nil,
47+
requestRetryablePolicy: MockRequestRetryablePolicy())
4748

4849
storageEngine = StorageEngine(storageAdapter: storageAdapter,
50+
dataStoreConfiguration: .default,
4951
syncEngine: syncEngine)
5052
} catch {
5153
XCTFail(String(describing: error))

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/MutationQueue/AWSMutationEventIngesterTests.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ class AWSMutationEventIngesterTests: XCTestCase {
3737
storageAdapter = try SQLiteStorageEngineAdapter(connection: connection)
3838
try storageAdapter.setUp(models: StorageEngine.systemModels)
3939

40-
let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter)
40+
let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter,
41+
dataStoreConfiguration: .default)
4142

4243
let storageEngine = StorageEngine(storageAdapter: storageAdapter,
44+
dataStoreConfiguration: .default,
4345
syncEngine: syncEngine)
4446

4547
let publisher = DataStorePublisher()

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/RemoteSync/RemoteSyncAPIInvocationTests.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ class RemoteSyncAPIInvocationTests: XCTestCase {
4040
storageAdapter = try SQLiteStorageEngineAdapter(connection: connection)
4141
try storageAdapter.setUp(models: StorageEngine.systemModels)
4242

43-
let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter)
43+
let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter,
44+
dataStoreConfiguration: .default)
4445
storageEngine = StorageEngine(storageAdapter: storageAdapter,
46+
dataStoreConfiguration: .default,
4547
syncEngine: syncEngine)
4648
} catch {
4749
XCTFail(String(describing: error))

AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Sync/RemoteSyncEngineTests.swift

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class RemoteSyncEngineTests: XCTestCase {
3131
mockRequestRetryablePolicy = MockRequestRetryablePolicy()
3232
do {
3333
remoteSyncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter,
34+
dataStoreConfiguration: .default,
3435
outgoingMutationQueue: mockOutgoingMutationQueue,
3536
initialSyncOrchestratorFactory: MockAWSInitialSyncOrchestrator.factory,
3637
reconciliationQueueFactory: MockAWSIncomingEventReconciliationQueue.factory,

0 commit comments

Comments
 (0)