Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IOS-3069 Added P2PStatusStorage + Migrated to Actor model #1780

Merged
merged 2 commits into from
Jul 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Anytype.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1295,6 +1295,7 @@
3D8D41BE2743D32000F8EBF3 /* EditorScreenData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D8D41BD2743D32000F8EBF3 /* EditorScreenData.swift */; };
3D929B2B263302160063F1BE /* TypographyExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D929B2A263302160063F1BE /* TypographyExample.swift */; };
3D929B2F263307700063F1BE /* AnytypeFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D929B2E263307700063F1BE /* AnytypeFont.swift */; };
3D92E9A52C41219B00A1998C /* P2PStatusStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D92E9A42C41219B00A1998C /* P2PStatusStorage.swift */; };
3D932D5726317EFC00C7D1EA /* CommonViews+Pickers+File+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D932D5326317EFB00C7D1EA /* CommonViews+Pickers+File+UIKit.swift */; };
3D932D5826317EFC00C7D1EA /* BaseFilePickerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D932D5426317EFB00C7D1EA /* BaseFilePickerViewModel.swift */; };
3D932D5926317EFC00C7D1EA /* FilePickerResultInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D932D5526317EFB00C7D1EA /* FilePickerResultInformation.swift */; };
Expand Down Expand Up @@ -3117,6 +3118,7 @@
3D8D41BD2743D32000F8EBF3 /* EditorScreenData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorScreenData.swift; sourceTree = "<group>"; };
3D929B2A263302160063F1BE /* TypographyExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypographyExample.swift; sourceTree = "<group>"; };
3D929B2E263307700063F1BE /* AnytypeFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnytypeFont.swift; sourceTree = "<group>"; };
3D92E9A42C41219B00A1998C /* P2PStatusStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = P2PStatusStorage.swift; sourceTree = "<group>"; };
3D932D5326317EFB00C7D1EA /* CommonViews+Pickers+File+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CommonViews+Pickers+File+UIKit.swift"; sourceTree = "<group>"; };
3D932D5426317EFB00C7D1EA /* BaseFilePickerViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseFilePickerViewModel.swift; sourceTree = "<group>"; };
3D932D5526317EFB00C7D1EA /* FilePickerResultInformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilePickerResultInformation.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3865,6 +3867,7 @@
038FB5C822D8F321002B90B8 /* ServiceLayer */ = {
isa = PBXGroup;
children = (
3D92E9A32C41218600A1998C /* P2PStatus */,
3DA116FA2C357A2500D071CE /* SyncStatus */,
2AB9E1D82C2D599D00D9FE49 /* AppVersionService */,
2AFFFB9D2927B02500A487E1 /* Account */,
Expand Down Expand Up @@ -9082,6 +9085,14 @@
path = Example;
sourceTree = "<group>";
};
3D92E9A32C41218600A1998C /* P2PStatus */ = {
isa = PBXGroup;
children = (
3D92E9A42C41219B00A1998C /* P2PStatusStorage.swift */,
);
path = P2PStatus;
sourceTree = "<group>";
};
3D932D4A26317E9200C7D1EA /* Buttons */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -11963,6 +11974,7 @@
2AE1558C2A31BB220049C387 /* ListWidgetStyle.swift in Sources */,
0A74E50023A90EF000B6C406 /* NotificationExtension.swift in Sources */,
2AE5C71F29B72B8100A92C12 /* WidgetSourceSearchInteractor.swift in Sources */,
3D92E9A52C41219B00A1998C /* P2PStatusStorage.swift in Sources */,
3D6F2D752B87A00B00AA667B /* PasteboardBlockServiceProtocol.swift in Sources */,
5356072926E61E2E001464A4 /* UnsupportedBlockContentConfiguration.swift in Sources */,
1215E8B426A860ED0089AF7E /* AppConfiguratorProtocol.swift in Sources */,
Expand Down
14 changes: 9 additions & 5 deletions Anytype/Sources/Models/Documents/Document/BaseDocument.swift
Original file line number Diff line number Diff line change
Expand Up @@ -221,13 +221,17 @@ final class BaseDocument: BaseDocumentProtocol {
setupSubscriptions()
triggerSync(updates: [.general])
}

@MainActor
private func setupSubscriptions() {
syncStatusStorage.statusPublisher(spaceId: spaceId).sink { [weak self] info in
ignatovv marked this conversation as resolved.
Show resolved Hide resolved
guard let info else { return }
self?.syncStatusSubject.send(info.status)
}.store(in: &subscriptions)
Task { @MainActor in
let syncStatusPublisher = await syncStatusStorage.statusPublisher(spaceId: spaceId).sink { [weak self] info in
guard let info else { return }
self?.syncStatusSubject.send(info.status)
}

syncStatusPublisher.store(in: &subscriptions)
}

accountParticipantsStorage.canEditPublisher(spaceId: spaceId).sink { [weak self] canEdit in
self?.participantIsEditor = canEdit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,8 @@ final class MiddlewareEventConverter {
.notificationSend,
.notificationUpdate,
.payloadBroadcast,
.spaceSyncStatusUpdate,
.p2PStatusUpdate,
.spaceSyncStatusUpdate, // Implemented in `SyncStatusStorage`
.p2PStatusUpdate, // Implemented in `P2PStatusStorage`
.membershipUpdate: // Implemented in `MembershipStatusStorage`
return nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ final class SyncStatusInfoViewModel: ObservableObject {
@Published var syncStatusInfo: SyncStatusInfo?

init(spaceId: String) {
syncStatusStorage.statusPublisher(spaceId: spaceId).assign(to: &$syncStatusInfo)
Task { @MainActor in
await syncStatusStorage.statusPublisher(spaceId: spaceId).assign(to: &$syncStatusInfo)
}
}

}
5 changes: 3 additions & 2 deletions Anytype/Sources/ServiceLayer/Auth/LoginStateService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,11 @@ final class LoginStateService: LoginStateServiceProtocol {
await accountParticipantsStorage.startSubscription()
await activeSpaceParticipantStorage.startSubscription()
await participantSpacesStorage.startSubscription()
await syncStatusStorage.startSubscription()
storeKitService.startListenForTransactions()
syncStatusStorage.startSubscription()

Task {
// Time-heavy operation
await membershipStatusStorage.startSubscription()
}
}
Expand All @@ -91,7 +92,7 @@ final class LoginStateService: LoginStateServiceProtocol {
await activeSpaceParticipantStorage.stopSubscription()
await participantSpacesStorage.stopSubscription()
await membershipStatusStorage.stopSubscriptionAndClean()
await syncStatusStorage.stopSubscriptionAndClean()
storeKitService.stopListenForTransactions()
syncStatusStorage.stopSubscriptionAndClean()
}
}
56 changes: 56 additions & 0 deletions Anytype/Sources/ServiceLayer/P2PStatus/P2PStatusStorage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import Combine
import Services
import AnytypeCore
import ProtobufMessages


protocol P2PStatusStorageProtocol {
func statusPublisher(spaceId: String) async -> AnyPublisher<P2PStatusInfo?, Never>

func startSubscription() async
func stopSubscriptionAndClean() async
}

actor P2PStatusStorage: P2PStatusStorageProtocol {
@Published private var _update: P2PStatusInfo?
private var updatePublisher: AnyPublisher<P2PStatusInfo?, Never> { $_update.eraseToAnyPublisher() }
private var subscription: AnyCancellable?

private var defaultValues = [String: P2PStatusInfo]()

init() { }

func statusPublisher(spaceId: String) -> AnyPublisher<P2PStatusInfo?, Never> {
updatePublisher
.filter { $0?.spaceID == spaceId}
.merge(with: Just(defaultValues[spaceId]))
.eraseToAnyPublisher()
}

func startSubscription() {
anytypeAssert(subscription.isNil, "Non nil subscription in P2PStatusStorage")
subscription = EventBunchSubscribtion.default.addHandler { [weak self] events in
await self?.handle(events: events)
}
}

func stopSubscriptionAndClean() {
anytypeAssert(subscription.isNotNil, "Nil subscription in P2PStatusStorage")
subscription = nil
_update = nil
}

// MARK: - Private

private func handle(events: EventsBunch) {
for event in events.middlewareEvents {
switch event.value {
case .p2PStatusUpdate(let update):
defaultValues[update.spaceID] = update
_update = update
default:
break
}
}
}
}
20 changes: 9 additions & 11 deletions Anytype/Sources/ServiceLayer/SyncStatus/SyncStatusStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,19 @@ import ProtobufMessages


protocol SyncStatusStorageProtocol {
func statusPublisher(spaceId: String) -> AnyPublisher<SyncStatusInfo?, Never>
func statusPublisher(spaceId: String) async -> AnyPublisher<SyncStatusInfo?, Never>
ignatovv marked this conversation as resolved.
Show resolved Hide resolved

func startSubscription()
func stopSubscriptionAndClean()
func startSubscription() async
func stopSubscriptionAndClean() async
}

final class SyncStatusStorage: SyncStatusStorageProtocol {
@Published private var _update: Anytype_Event.Space.SyncStatus.Update?
private var updatePublisher: AnyPublisher<Anytype_Event.Space.SyncStatus.Update?, Never> { $_update.eraseToAnyPublisher() }
actor SyncStatusStorage: SyncStatusStorageProtocol {
@Published private var _update: SyncStatusInfo?
private var updatePublisher: AnyPublisher<SyncStatusInfo?, Never> { $_update.eraseToAnyPublisher() }
private var subscription: AnyCancellable?

private var defaultValues = [String: SyncStatusInfo]()

nonisolated init() { }

func statusPublisher(spaceId: String) -> AnyPublisher<SyncStatusInfo?, Never> {
updatePublisher
.filter { $0?.id == spaceId}
Expand All @@ -28,14 +26,14 @@ final class SyncStatusStorage: SyncStatusStorageProtocol {
}

func startSubscription() {
anytypeAssert(subscription.isNil, "Non nil subscription in SyncStatusStorage")
subscription = EventBunchSubscribtion.default.addHandler { [weak self] events in
Task { @MainActor [weak self] in
self?.handle(events: events)
}
await self?.handle(events: events)
}
}

func stopSubscriptionAndClean() {
anytypeAssert(subscription.isNotNil, "Nil subscription in SyncStatusStorage")
subscription = nil
_update = nil
}
Expand Down
5 changes: 5 additions & 0 deletions Modules/Services/Sources/Models/Aliases.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
import SwiftProtobuf
import ProtobufMessages

public typealias BlockFields = [String : Google_Protobuf_Value]

public typealias SyncStatus = Anytype_Event.Space.Status
public typealias SyncStatusInfo = Anytype_Event.Space.SyncStatus.Update
public typealias P2PStatusInfo = Anytype_Event.P2PStatus.Update
4 changes: 0 additions & 4 deletions Modules/Services/Sources/Models/SyncStatus.swift

This file was deleted.

Loading