diff --git a/Split/Events/SplitEventsManager.swift b/Split/Events/SplitEventsManager.swift index 5781b3ff..8406866c 100644 --- a/Split/Events/SplitEventsManager.swift +++ b/Split/Events/SplitEventsManager.swift @@ -51,6 +51,7 @@ class DefaultSplitEventsManager: SplitEventsManager { } } + // MARK: Notifiers func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata? = nil) { let event = SplitInternalEventWithMetadata(event, metadata: metadata) @@ -64,7 +65,8 @@ class DefaultSplitEventsManager: SplitEventsManager { func notifyInternalEvent(_ event: SplitInternalEvent) { notifyInternalEvent(event, metadata: nil) } - + + // MARK: Registers func register(event: SplitEventWithMetadata, task: SplitEventActionTask) { let eventName = event.type.toString() processQueue.async { [weak self] in @@ -83,6 +85,7 @@ class DefaultSplitEventsManager: SplitEventsManager { register(event: SplitEventWithMetadata(type: event, metadata: nil), task: task) } + // MARK: Flow func start() { dataAccessQueue.sync { if self.isStarted { diff --git a/Split/Localhost/LocalhostSynchronizer.swift b/Split/Localhost/LocalhostSynchronizer.swift index a7c64234..f9437a7c 100644 --- a/Split/Localhost/LocalhostSynchronizer.swift +++ b/Split/Localhost/LocalhostSynchronizer.swift @@ -74,7 +74,9 @@ class LocalhostSynchronizer: FeatureFlagsSynchronizer { // Update will remove all records before insert new ones _ = self.featureFlagsStorage.update(splitChange: change) - self.eventsManager.notifyInternalEvent(.splitsUpdated, metadata: EventMetadata(type: .FLAGS_UPDATED, data: values.map { $0.name ?? "" } )) + // Notify event + let metadata = EventMetadata(type: .FLAGS_UPDATED, data: values.map { $0.name ?? "" } ) + self.eventsManager.notifyInternalEvent(.splitsUpdated, metadata: metadata) } } } diff --git a/Split/Network/Streaming/SyncSegmentsUpdateWorker.swift b/Split/Network/Streaming/SyncSegmentsUpdateWorker.swift index c8ec78ae..bcedaa11 100644 --- a/Split/Network/Streaming/SyncSegmentsUpdateWorker.swift +++ b/Split/Network/Streaming/SyncSegmentsUpdateWorker.swift @@ -110,7 +110,7 @@ class SegmentsUpdateWorker: UpdateWorker { if segments.count > newSegments.count { mySegmentsStorage.set(SegmentChange(segments: newSegments.asArray()), forKey: key) - synchronizer.notifyUpdate(forKey: key) + synchronizer.notifyUpdate(forKey: key, EventMetadata(type: .SEGMENTS_UPDATED, data: newSegments.asArray() )) telemetryProducer?.recordUpdatesFromSse(type: resource) } } @@ -128,7 +128,7 @@ class SegmentsUpdateWorker: UpdateWorker { if oldSegments.count < newSegments.count { mySegmentsStorage.set(SegmentChange(segments: newSegments.asArray()), forKey: userKey) - synchronizer.notifyUpdate(forKey: userKey) + synchronizer.notifyUpdate(forKey: userKey, EventMetadata(type: .SEGMENTS_UPDATED, data: newSegments.asArray() )) telemetryProducer?.recordUpdatesFromSse(type: .mySegments) } return @@ -171,7 +171,7 @@ class SegmentsUpdateWorker: UpdateWorker { protocol SegmentsSynchronizerWrapper { func fetch(byKey: String, changeNumbers: SegmentsChangeNumber, delay: Int64) - func notifyUpdate(forKey: String) + func notifyUpdate(forKey: String, _ metadata: EventMetadata?) } class MySegmentsSynchronizerWrapper: SegmentsSynchronizerWrapper { @@ -185,12 +185,13 @@ class MySegmentsSynchronizerWrapper: SegmentsSynchronizerWrapper { synchronizer.forceMySegmentsSync(forKey: key, changeNumbers: changeNumbers, delay: delay) } - func notifyUpdate(forKey key: String) { - synchronizer.notifySegmentsUpdated(forKey: key) + func notifyUpdate(forKey key: String, _ metadata: EventMetadata? = nil) { + synchronizer.notifySegmentsUpdated(forKey: key, metadata: metadata) } } class MyLargeSegmentsSynchronizerWrapper: SegmentsSynchronizerWrapper { + private let synchronizer: Synchronizer init(synchronizer: Synchronizer) { @@ -201,8 +202,8 @@ class MyLargeSegmentsSynchronizerWrapper: SegmentsSynchronizerWrapper { synchronizer.forceMySegmentsSync(forKey: key, changeNumbers: changeNumbers, delay: delay) } - func notifyUpdate(forKey key: String) { - synchronizer.notifyLargeSegmentsUpdated(forKey: key) + func notifyUpdate(forKey key: String, _ metadata: EventMetadata? = nil) { + synchronizer.notifyLargeSegmentsUpdated(forKey: key, metadata: metadata) } } diff --git a/Split/Network/Streaming/SyncUpdateWorker.swift b/Split/Network/Streaming/SyncUpdateWorker.swift index bfab4ad8..05513488 100644 --- a/Split/Network/Streaming/SyncUpdateWorker.swift +++ b/Split/Network/Streaming/SyncUpdateWorker.swift @@ -169,14 +169,15 @@ class SplitsUpdateWorker: UpdateWorker { Logger.v("RBS update received: \(change)") - let processedChange = ruleBasedSegmentsChangeProcessor.process(change) + let processedSegments = ruleBasedSegmentsChangeProcessor.process(change) - if ruleBasedSegmentsStorage.update(toAdd: processedChange.toAdd, - toRemove: processedChange.toRemove, - changeNumber: processedChange.changeNumber) { - synchronizer.notifyFeatureFlagsUpdated(flags: []) //TODO: RBS Update + if ruleBasedSegmentsStorage.update(toAdd: processedSegments.toAdd, + toRemove: processedSegments.toRemove, + changeNumber: processedSegments.changeNumber) { + var updatedSegments = (processedSegments.activeSegments + processedSegments.archivedSegments).compactMap(\.name) + synchronizer.notifyFeatureFlagsUpdated(flags: []) //TODO: Make new notify segments updated (new notification method?) } - + telemetryProducer?.recordUpdatesFromSse(type: .splits) return true } catch { diff --git a/Split/Network/Sync/ByKeyFacade.swift b/Split/Network/Sync/ByKeyFacade.swift index 56c54914..36100ad1 100644 --- a/Split/Network/Sync/ByKeyFacade.swift +++ b/Split/Network/Sync/ByKeyFacade.swift @@ -19,8 +19,8 @@ protocol ByKeyRegistry { protocol ByKeySynchronizer { func loadMySegmentsFromCache(forKey: String) func loadAttributesFromCache(forKey: String) - func notifyMySegmentsUpdated(forKey: String) - func notifyMyLargeSegmentsUpdated(forKey: String) + func notifyMySegmentsUpdated(forKey: String, metadata: EventMetadata?) + func notifyMyLargeSegmentsUpdated(forKey: String, metadata: EventMetadata?) func startSync(forKey key: Key) func startPeriodicSync() func stopPeriodicSync() @@ -120,15 +120,15 @@ class DefaultByKeyFacade: ByKeyFacade { byKeyComponents.value(forKey: key)?.mySegmentsSynchronizer.synchronizeMySegments() } - func notifyMySegmentsUpdated(forKey key: String) { + func notifyMySegmentsUpdated(forKey key: String, metadata: EventMetadata?) { doInAll(forMatchingKey: key) { group in - group.eventsManager.notifyInternalEvent(.mySegmentsUpdated) + group.eventsManager.notifyInternalEvent(.mySegmentsUpdated, metadata: metadata) } } - func notifyMyLargeSegmentsUpdated(forKey key: String) { + func notifyMyLargeSegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { doInAll(forMatchingKey: key) { group in - group.eventsManager.notifyInternalEvent(.myLargeSegmentsUpdated) + group.eventsManager.notifyInternalEvent(.myLargeSegmentsUpdated, metadata: metadata) } } diff --git a/Split/Network/Sync/Synchronizer.swift b/Split/Network/Sync/Synchronizer.swift index 8cf8f7ef..86cf16ee 100644 --- a/Split/Network/Sync/Synchronizer.swift +++ b/Split/Network/Sync/Synchronizer.swift @@ -31,8 +31,8 @@ protocol Synchronizer: ImpressionLogger { func stopRecordingTelemetry() func pushEvent(event: EventDTO) func notifyFeatureFlagsUpdated(flags: [String]) - func notifySegmentsUpdated(forKey key: String) - func notifyLargeSegmentsUpdated(forKey key: String) + func notifySegmentsUpdated(forKey key: String, metadata: EventMetadata?) + func notifyLargeSegmentsUpdated(forKey key: String, metadata: EventMetadata?) func notifySplitKilled(flag: String) func pause() func resume() @@ -211,12 +211,12 @@ class DefaultSynchronizer: Synchronizer { featureFlagsSynchronizer.notifyUpdated(flagsList: flags) } - func notifySegmentsUpdated(forKey key: String) { - byKeySynchronizer.notifyMySegmentsUpdated(forKey: key) + func notifySegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { + byKeySynchronizer.notifyMySegmentsUpdated(forKey: key, metadata: metadata) } - func notifyLargeSegmentsUpdated(forKey key: String) { - byKeySynchronizer.notifyMyLargeSegmentsUpdated(forKey: key) + func notifyLargeSegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { + byKeySynchronizer.notifyMyLargeSegmentsUpdated(forKey: key, metadata: metadata) } func notifySplitKilled(flag: String) { diff --git a/SplitTests/Fake/Service/ByKeyFacadeMock.swift b/SplitTests/Fake/Service/ByKeyFacadeMock.swift index 32ea6c63..f56ccd71 100644 --- a/SplitTests/Fake/Service/ByKeyFacadeMock.swift +++ b/SplitTests/Fake/Service/ByKeyFacadeMock.swift @@ -123,12 +123,16 @@ class ByKeyFacadeMock: ByKeyFacade { } var notifyMySegmentsUpdatedCalled = false - func notifyMySegmentsUpdated(forKey key: String) { + var updatedSegmentsMetadataForKey = [String : EventMetadata?]() + func notifyMySegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { + updatedSegmentsMetadataForKey[key] = metadata notifyMySegmentsUpdatedCalled = true } var notifyMyLargeSegmentsUpdatedCalled = false - func notifyMyLargeSegmentsUpdated(forKey key: String) { + var updatedLargeSegmentsMetadataForKey = [String : EventMetadata?]() + func notifyMyLargeSegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { + updatedLargeSegmentsMetadataForKey[key] = metadata notifyMyLargeSegmentsUpdatedCalled = true } diff --git a/SplitTests/Fake/Streaming/SynchronizerSpy.swift b/SplitTests/Fake/Streaming/SynchronizerSpy.swift index 2926de42..4b0141b1 100644 --- a/SplitTests/Fake/Streaming/SynchronizerSpy.swift +++ b/SplitTests/Fake/Streaming/SynchronizerSpy.swift @@ -195,14 +195,18 @@ class SynchronizerSpy: Synchronizer { splitSynchronizer.resume() } - func notifySegmentsUpdated(forKey key: String) { + var updatedSegmentsMetadataForKey = [String : EventMetadata]() + func notifySegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { notifyMySegmentsUpdatedCalled = true - splitSynchronizer.notifySegmentsUpdated(forKey: key) + updatedSegmentsMetadataForKey[key] = metadata + splitSynchronizer.notifySegmentsUpdated(forKey: key, metadata: metadata) } - func notifyLargeSegmentsUpdated(forKey key: String) { + var updatedLargeSegmentsMetadataForKey = [String : EventMetadata]() + func notifyLargeSegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { + updatedLargeSegmentsMetadataForKey[key] = metadata notifyMyLargeSegmentsUpdatedCalled = true - splitSynchronizer.notifyLargeSegmentsUpdated(forKey: key) + splitSynchronizer.notifyLargeSegmentsUpdated(forKey: key, metadata: metadata) } var notifyFeatureFlagsUpdatedCalled = false diff --git a/SplitTests/Fake/Streaming/SynchronizerStub.swift b/SplitTests/Fake/Streaming/SynchronizerStub.swift index 701faeb6..507193ae 100644 --- a/SplitTests/Fake/Streaming/SynchronizerStub.swift +++ b/SplitTests/Fake/Streaming/SynchronizerStub.swift @@ -119,16 +119,20 @@ class SynchronizerStub: Synchronizer { } var notifySegmentsUpdatedForKeyCalled = [String: Bool]() - func notifySegmentsUpdated(forKey key: String) { + var updatedSegmentsMetadataForKey = [String: EventMetadata?]() + func notifySegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { notifySegmentsUpdatedForKeyCalled[key] = true + updatedLargeSegmentsMetadataForKey[key] = metadata if let exp = notifyMySegmentsUpdatedExp[key] { exp.fulfill() } } var notifyLargeSegmentsUpdatedForKeyCalled = [String: Bool]() - func notifyLargeSegmentsUpdated(forKey key: String) { + var updatedLargeSegmentsMetadataForKey = [String: EventMetadata?]() + func notifyLargeSegmentsUpdated(forKey key: String, metadata: EventMetadata? = nil) { notifyLargeSegmentsUpdatedForKeyCalled[key] = true + updatedLargeSegmentsMetadataForKey[key] = metadata if let exp = notifyMyLargeSegmentsUpdatedExp[key] { exp.fulfill() }