diff --git a/Split/Api/SplitClient.swift b/Split/Api/SplitClient.swift index ff4df2005..b563f9a36 100644 --- a/Split/Api/SplitClient.swift +++ b/Split/Api/SplitClient.swift @@ -8,8 +8,6 @@ import Foundation -public typealias SplitAction = () -> Void - @objc public protocol SplitClient { // MARK: Evaluation feature diff --git a/Split/Events/SplitEvent.swift b/Split/Events/SplitEvent.swift index d2561e2d9..ab79de4e2 100644 --- a/Split/Events/SplitEvent.swift +++ b/Split/Events/SplitEvent.swift @@ -7,22 +7,69 @@ import Foundation +// All events (internal & external) support metadata. +// Internal errors are propagated to the customer as events "(.sdkError)". The error info will travel as the event metadata. + +@objcMembers public class SplitEventWithMetadata: NSObject { + let type: SplitEvent + let metadata: SplitMetadata? + + @objc public init(type: SplitEvent, metadata: SplitMetadata? = nil) { + self.type = type + self.metadata = metadata + } + + public override func isEqual(_ object: Any?) -> Bool { + guard let other = object as? SplitEventWithMetadata else { return false } + return self.type == other.type + } +} + @objc public enum SplitEvent: Int { case sdkReady case sdkReadyTimedOut case sdkReadyFromCache case sdkUpdated + case sdkError public func toString() -> String { switch self { - case .sdkReady: - return "SDK_READY" - case .sdkUpdated: - return "SDK_UPDATE" - case .sdkReadyTimedOut: - return "SDK_READY_TIMED_OUT" - case .sdkReadyFromCache: - return "SDK_READY_FROM_CACHE" + case .sdkReady: + return "SDK_READY" + case .sdkUpdated: + return "SDK_UPDATE" + case .sdkReadyTimedOut: + return "SDK_READY_TIMED_OUT" + case .sdkReadyFromCache: + return "SDK_READY_FROM_CACHE" + case .sdkError: + return "SDK_ERROR" } } } + +@objc public class SplitMetadata: NSObject { + var type: SplitMetadataType + var data: String = "" + + init(type: SplitMetadataType, data: String) { + self.type = type + self.data = data + } +} + +enum SplitMetadataType: Int { + case FEATURE_FLAGS_SYNC_ERROR + case SEGMENTS_SYNC_ERROR + + public func toString() -> String { + switch self { + case .FEATURE_FLAGS_SYNC_ERROR: + return "FEATURE_FLAGS_SYNC_ERROR" + case .SEGMENTS_SYNC_ERROR: + return "SEGMENTS_SYNC_ERROR" + + } + } +} + diff --git a/Split/Events/SplitEventActionTask.swift b/Split/Events/SplitEventActionTask.swift index be1368d04..301305581 100644 --- a/Split/Events/SplitEventActionTask.swift +++ b/Split/Events/SplitEventActionTask.swift @@ -7,10 +7,17 @@ import Foundation +public typealias SplitAction = () -> Void +public typealias SplitActionWithMetadata = (_ metadata: SplitMetadata?) -> Void + class SplitEventActionTask: SplitEventTask { + // Private private var eventHandler: SplitAction? + private var eventHandlerWithMetadata: SplitActionWithMetadata? private var queue: DispatchQueue? + + // Public var event: SplitEvent var runInBackground: Bool = false var factory: SplitFactory diff --git a/Split/Events/SplitInternalEvent.swift b/Split/Events/SplitInternalEvent.swift index 4c9521204..e4ad78b74 100644 --- a/Split/Events/SplitInternalEvent.swift +++ b/Split/Events/SplitInternalEvent.swift @@ -7,6 +7,20 @@ import Foundation +struct SplitInternalEventWithMetadata { + let type: SplitInternalEvent + let metadata: SplitMetadata? + + init(_ type: SplitInternalEvent, metadata: SplitMetadata? = nil) { + self.type = type + self.metadata = metadata + } + + static func == (lhs: SplitInternalEventWithMetadata, rhs: SplitInternalEventWithMetadata) -> Bool { + return lhs.type == rhs.type + } +} + enum SplitInternalEvent { case mySegmentsUpdated case myLargeSegmentsUpdated diff --git a/SplitTests/Integration/Recorder/TelemetryTest.swift b/SplitTests/Integration/Recorder/TelemetryTest.swift index a766a21f6..28ba9d8c8 100644 --- a/SplitTests/Integration/Recorder/TelemetryTest.swift +++ b/SplitTests/Integration/Recorder/TelemetryTest.swift @@ -167,6 +167,7 @@ class TelemetryTest: XCTestCase { XCTAssertEqual(0, sum(latenciesAfter.treatmentsWithConfig)) XCTAssertEqual(0, sum(latenciesAfter.track)) + let semaphore = DispatchSemaphore(value: 0) client.destroy(completion: { _ = semaphore.signal()