11@_implementationOnly import _SentryPrivate
22import Foundation
33
4- protocol SentryItemBatcherDelegate : AnyObject {
5- func capture( itemBatcherData: Data , count: Int )
6- }
7-
84protocol SentryItemBatcherItem : Encodable {
95 var attributes : [ String : SentryAttribute ] { get set }
106 var traceId : SentryId { get set }
117 var body : String { get }
128}
139
14- final class SentryItemBatcher < Item: SentryItemBatcherItem > {
10+ protocol SentryItemBatcherScope {
11+ var replayId : String ? { get }
12+ var propagationContextTraceIdString : String { get }
13+ var span : Span ? { get }
14+ var userObject : User ? { get }
15+ func getContextForKey( _ key: String ) -> [ String : Any ] ?
16+ var attributes : [ String : Any ] { get }
17+ }
18+
19+ protocol SentryItemBatcherProtocol < Item, Scope> : AnyObject {
20+ associatedtype Item : SentryItemBatcherItem
21+ associatedtype Scope : SentryItemBatcherScope
22+
23+ func add( _ item: Item , scope: Scope )
24+ func capture( ) -> TimeInterval
25+ }
26+
27+ extension SentryItemBatcherProtocol { }
28+
29+ final class SentryItemBatcher < Item: SentryItemBatcherItem , Scope: SentryItemBatcherScope > : SentryItemBatcherProtocol {
1530 struct Config {
16- let beforeSendItem : ( ( Item ) -> Item ? ) ?
1731 let environment : String
1832 let releaseName : String ?
1933
2034 let flushTimeout : TimeInterval
2135 let maxItemCount : Int
2236 let maxBufferSizeBytes : Int
2337
38+ let beforeSendItem : ( ( Item ) -> Item ? ) ?
2439 let getInstallationId : ( ) -> String ?
40+
41+ var capturedDataCallback : ( _ data: Data , _ count: Int ) -> Void = { _, _ in }
2542 }
2643
2744 private let config : Config
45+ private let dateProvider : SentryCurrentDateProvider
2846 private let dispatchQueue : SentryDispatchQueueWrapperProtocol
2947
3048 // Every items data is added sepratley. They are flushed together in an envelope.
3149 private var encodedItems : [ Data ] = [ ]
3250 private var encodedItemsSize : Int = 0
3351 private var timerWorkItem : DispatchWorkItem ?
3452
35- /// The delegate to handle captured item batches
36- weak var delegate : SentryItemBatcherDelegate ?
37-
3853 /// Initializes a new SentryItemBatcher.
3954 /// - Parameters:
4055 /// - options: The Sentry configuration options
@@ -49,13 +64,15 @@ final class SentryItemBatcher<Item: SentryItemBatcherItem> {
4964 /// - Note: Items are flushed when either `maxItemCount` or `maxBufferSizeBytes` limit is reached.
5065 @_spi ( Private) public init (
5166 config: Config ,
67+ dateProvider: SentryCurrentDateProvider ,
5268 dispatchQueue: SentryDispatchQueueWrapperProtocol
5369 ) {
5470 self . config = config
71+ self . dateProvider = dateProvider
5572 self . dispatchQueue = dispatchQueue
5673 }
57-
58- func addItem ( _ item: Item , scope: Scope ) {
74+
75+ func add ( _ item: Item , scope: Scope ) {
5976 var item = item
6077 addDefaultAttributes ( to: & item. attributes, scope: scope)
6178 addOSAttributes ( to: & item. attributes, scope: scope)
@@ -83,13 +100,12 @@ final class SentryItemBatcher<Item: SentryItemBatcherItem> {
83100 }
84101
85102 // Captures batched items sync and returns the duration.
86- @discardableResult
87- @_spi ( Private) @objc public func captureItems( ) -> TimeInterval {
88- let startTimeNs = SentryDefaultCurrentDateProvider . getAbsoluteTime ( )
103+ @discardableResult func capture( ) -> TimeInterval {
104+ let startTimeNs = dateProvider. getAbsoluteTime ( )
89105 dispatchQueue. dispatchSync { [ weak self] in
90106 self ? . performCaptureItems ( )
91107 }
92- let endTimeNs = SentryDefaultCurrentDateProvider . getAbsoluteTime ( )
108+ let endTimeNs = dateProvider . getAbsoluteTime ( )
93109 return TimeInterval ( endTimeNs - startTimeNs) / 1_000_000_000.0 // Convert nanoseconds to seconds
94110 }
95111
@@ -231,11 +247,6 @@ final class SentryItemBatcher<Item: SentryItemBatcherItem> {
231247 let payloadData = Data ( " { \" items \" :[ " . utf8) + encodedItems. joined ( separator: Data ( " , " . utf8) ) + Data( " ]} " . utf8)
232248
233249 // Send the payload.
234-
235- guard let delegate else {
236- SentrySDKLog . debug ( " Delegate not set, not capturing items data. " )
237- return
238- }
239- delegate. capture ( itemBatcherData: payloadData, count: encodedItems. count)
250+ config. capturedDataCallback ( payloadData, encodedItems. count)
240251 }
241252}
0 commit comments