parent
baff2c58ca
commit
ee3a40b597
|
@ -37,6 +37,8 @@ public final class ProfileManager: ObservableObject {
|
||||||
|
|
||||||
private let repository: any ProfileRepository
|
private let repository: any ProfileRepository
|
||||||
|
|
||||||
|
private let backupRepository: (any ProfileRepository)?
|
||||||
|
|
||||||
private let remoteRepository: (any ProfileRepository)?
|
private let remoteRepository: (any ProfileRepository)?
|
||||||
|
|
||||||
@Published
|
@Published
|
||||||
|
@ -59,6 +61,7 @@ public final class ProfileManager: ObservableObject {
|
||||||
// for testing/previews
|
// for testing/previews
|
||||||
public init(profiles: [Profile]) {
|
public init(profiles: [Profile]) {
|
||||||
repository = InMemoryProfileRepository(profiles: profiles)
|
repository = InMemoryProfileRepository(profiles: profiles)
|
||||||
|
backupRepository = nil
|
||||||
remoteRepository = nil
|
remoteRepository = nil
|
||||||
self.profiles = []
|
self.profiles = []
|
||||||
allProfiles = profiles.reduce(into: [:]) {
|
allProfiles = profiles.reduce(into: [:]) {
|
||||||
|
@ -71,8 +74,13 @@ public final class ProfileManager: ObservableObject {
|
||||||
subscriptions = []
|
subscriptions = []
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(repository: any ProfileRepository, remoteRepository: (any ProfileRepository)?) {
|
public init(
|
||||||
|
repository: any ProfileRepository,
|
||||||
|
backupRepository: (any ProfileRepository)? = nil,
|
||||||
|
remoteRepository: (any ProfileRepository)?
|
||||||
|
) {
|
||||||
self.repository = repository
|
self.repository = repository
|
||||||
|
self.backupRepository = backupRepository
|
||||||
self.remoteRepository = remoteRepository
|
self.remoteRepository = remoteRepository
|
||||||
profiles = []
|
profiles = []
|
||||||
allProfiles = [:]
|
allProfiles = [:]
|
||||||
|
@ -118,6 +126,12 @@ extension ProfileManager {
|
||||||
if existingProfile == nil || profile != existingProfile {
|
if existingProfile == nil || profile != existingProfile {
|
||||||
try await repository.saveProfile(profile)
|
try await repository.saveProfile(profile)
|
||||||
|
|
||||||
|
if let backupRepository {
|
||||||
|
Task.detached {
|
||||||
|
try? await backupRepository.saveProfile(profile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
allProfiles[profile.id] = profile
|
allProfiles[profile.id] = profile
|
||||||
didChange.send(.save(profile))
|
didChange.send(.save(profile))
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -49,8 +49,6 @@ extension AppContext {
|
||||||
|
|
||||||
extension ProfileManager {
|
extension ProfileManager {
|
||||||
static let shared: ProfileManager = {
|
static let shared: ProfileManager = {
|
||||||
let repository = localProfileRepository
|
|
||||||
|
|
||||||
let remoteStore = CoreDataPersistentStore(
|
let remoteStore = CoreDataPersistentStore(
|
||||||
logger: .default,
|
logger: .default,
|
||||||
containerName: Constants.shared.containers.remote,
|
containerName: Constants.shared.containers.remote,
|
||||||
|
@ -68,7 +66,11 @@ extension ProfileManager {
|
||||||
return .ignore
|
return .ignore
|
||||||
}
|
}
|
||||||
|
|
||||||
return ProfileManager(repository: repository, remoteRepository: remoteRepository)
|
return ProfileManager(
|
||||||
|
repository: mainProfileRepository,
|
||||||
|
backupRepository: backupProfileRepository,
|
||||||
|
remoteRepository: remoteRepository
|
||||||
|
)
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +160,51 @@ extension Tunnel {
|
||||||
}
|
}
|
||||||
|
|
||||||
private extension ProfileManager {
|
private extension ProfileManager {
|
||||||
static let localProfileRepository: ProfileRepository = {
|
static var mainProfileRepository: ProfileRepository {
|
||||||
|
coreDataProfileRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
static var backupProfileRepository: ProfileRepository? {
|
||||||
|
nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
extension Tunnel {
|
||||||
|
static let shared = Tunnel(
|
||||||
|
strategy: ProfileManager.neStrategy
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private extension ProfileManager {
|
||||||
|
static var mainProfileRepository: ProfileRepository {
|
||||||
|
neProfileRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
static var backupProfileRepository: ProfileRepository? {
|
||||||
|
coreDataProfileRepository
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private extension ProfileManager {
|
||||||
|
static let neProfileRepository: ProfileRepository = {
|
||||||
|
NEProfileRepository(repository: neStrategy) {
|
||||||
|
ProfileManager.sharedTitle($0)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
static let neStrategy: NETunnelStrategy = {
|
||||||
|
NETunnelStrategy(
|
||||||
|
bundleIdentifier: BundleConfiguration.mainString(for: .tunnelId),
|
||||||
|
coder: Registry.sharedProtocolCoder,
|
||||||
|
environment: .shared
|
||||||
|
)
|
||||||
|
}()
|
||||||
|
|
||||||
|
static let coreDataProfileRepository: ProfileRepository = {
|
||||||
let store = CoreDataPersistentStore(
|
let store = CoreDataPersistentStore(
|
||||||
logger: .default,
|
logger: .default,
|
||||||
containerName: Constants.shared.containers.local,
|
containerName: Constants.shared.containers.local,
|
||||||
|
@ -178,32 +224,6 @@ private extension ProfileManager {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
extension Tunnel {
|
|
||||||
static let shared = Tunnel(
|
|
||||||
strategy: ProfileManager.neStrategy
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension ProfileManager {
|
|
||||||
static let localProfileRepository: ProfileRepository = {
|
|
||||||
NEProfileRepository(repository: neStrategy) {
|
|
||||||
ProfileManager.sharedTitle($0)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
static let neStrategy: NETunnelStrategy = {
|
|
||||||
NETunnelStrategy(
|
|
||||||
bundleIdentifier: BundleConfiguration.mainString(for: .tunnelId),
|
|
||||||
coder: Registry.sharedProtocolCoder,
|
|
||||||
environment: .shared
|
|
||||||
)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// MARK: -
|
// MARK: -
|
||||||
|
|
||||||
// FIXME: #705, store providers to Core Data
|
// FIXME: #705, store providers to Core Data
|
||||||
|
|
Loading…
Reference in New Issue