Skip to content

Commit 2d92948

Browse files
authored
Add experimental session replay options to common code (#275)
* add replay options * fix analyze * update * update * update
1 parent b1d03a2 commit 2d92948

File tree

12 files changed

+280
-13
lines changed

12 files changed

+280
-13
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44

55
### Features
66

7+
- Add experimental session replay options to common code ([#275](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/275))
8+
```kotlin
9+
Sentry.init { options ->
10+
// Adjust these values for production
11+
options.experimental.sessionReplay.onErrorSampleRate = 1.0
12+
options.experimental.sessionReplay.sessionSampleRate = 1.0
13+
}
14+
```
715
- Add `Sentry.isEnabled()` API to common code ([#273](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/273))
816

917
### Dependencies

sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
175175
public final fun getEnableAutoSessionTracking ()Z
176176
public final fun getEnableCaptureFailedRequests ()Z
177177
public final fun getEnvironment ()Ljava/lang/String;
178+
public final fun getExperimental ()Lio/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions;
178179
public final fun getFailedRequestStatusCodes ()Ljava/util/List;
179180
public final fun getFailedRequestTargets ()Ljava/util/List;
180181
public final fun getMaxAttachmentSize ()J
@@ -212,6 +213,49 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
212213
public final fun setTracesSampleRate (Ljava/lang/Double;)V
213214
}
214215

216+
public final class io/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions {
217+
public fun <init> ()V
218+
public final fun getSessionReplay ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions;
219+
public final fun setSessionReplay (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;)V
220+
}
221+
222+
public final class io/sentry/kotlin/multiplatform/SentryReplayOptions {
223+
public fun <init> ()V
224+
public fun <init> (Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;)V
225+
public synthetic fun <init> (Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
226+
public final fun component1 ()Ljava/lang/Double;
227+
public final fun component2 ()Ljava/lang/Double;
228+
public final fun component3 ()Z
229+
public final fun component4 ()Z
230+
public final fun component5 ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
231+
public final fun copy (Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;)Lio/sentry/kotlin/multiplatform/SentryReplayOptions;
232+
public static synthetic fun copy$default (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;ILjava/lang/Object;)Lio/sentry/kotlin/multiplatform/SentryReplayOptions;
233+
public fun equals (Ljava/lang/Object;)Z
234+
public final fun getOnErrorSampleRate ()Ljava/lang/Double;
235+
public final fun getQuality ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
236+
public final fun getRedactAllImages ()Z
237+
public final fun getRedactAllText ()Z
238+
public final fun getSessionSampleRate ()Ljava/lang/Double;
239+
public fun hashCode ()I
240+
public final fun setOnErrorSampleRate (Ljava/lang/Double;)V
241+
public final fun setQuality (Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;)V
242+
public final fun setRedactAllImages (Z)V
243+
public final fun setRedactAllText (Z)V
244+
public final fun setSessionSampleRate (Ljava/lang/Double;)V
245+
public fun toString ()Ljava/lang/String;
246+
}
247+
248+
public final class io/sentry/kotlin/multiplatform/SentryReplayOptions$Quality : java/lang/Enum {
249+
public static final field HIGH Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
250+
public static final field LOW Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
251+
public static final field MEDIUM Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
252+
public final fun getBitRate ()I
253+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
254+
public final fun getSizeScale ()F
255+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
256+
public static fun values ()[Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
257+
}
258+
215259
public final class io/sentry/kotlin/multiplatform/protocol/Breadcrumb {
216260
public static final field Companion Lio/sentry/kotlin/multiplatform/protocol/Breadcrumb$Companion;
217261
public fun <init> ()V

sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
172172
public final fun getEnableAutoSessionTracking ()Z
173173
public final fun getEnableCaptureFailedRequests ()Z
174174
public final fun getEnvironment ()Ljava/lang/String;
175+
public final fun getExperimental ()Lio/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions;
175176
public final fun getFailedRequestStatusCodes ()Ljava/util/List;
176177
public final fun getFailedRequestTargets ()Ljava/util/List;
177178
public final fun getMaxAttachmentSize ()J
@@ -209,6 +210,49 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
209210
public final fun setTracesSampleRate (Ljava/lang/Double;)V
210211
}
211212

213+
public final class io/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions {
214+
public fun <init> ()V
215+
public final fun getSessionReplay ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions;
216+
public final fun setSessionReplay (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;)V
217+
}
218+
219+
public final class io/sentry/kotlin/multiplatform/SentryReplayOptions {
220+
public fun <init> ()V
221+
public fun <init> (Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;)V
222+
public synthetic fun <init> (Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
223+
public final fun component1 ()Ljava/lang/Double;
224+
public final fun component2 ()Ljava/lang/Double;
225+
public final fun component3 ()Z
226+
public final fun component4 ()Z
227+
public final fun component5 ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
228+
public final fun copy (Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;)Lio/sentry/kotlin/multiplatform/SentryReplayOptions;
229+
public static synthetic fun copy$default (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;Ljava/lang/Double;Ljava/lang/Double;ZZLio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;ILjava/lang/Object;)Lio/sentry/kotlin/multiplatform/SentryReplayOptions;
230+
public fun equals (Ljava/lang/Object;)Z
231+
public final fun getOnErrorSampleRate ()Ljava/lang/Double;
232+
public final fun getQuality ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
233+
public final fun getRedactAllImages ()Z
234+
public final fun getRedactAllText ()Z
235+
public final fun getSessionSampleRate ()Ljava/lang/Double;
236+
public fun hashCode ()I
237+
public final fun setOnErrorSampleRate (Ljava/lang/Double;)V
238+
public final fun setQuality (Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;)V
239+
public final fun setRedactAllImages (Z)V
240+
public final fun setRedactAllText (Z)V
241+
public final fun setSessionSampleRate (Ljava/lang/Double;)V
242+
public fun toString ()Ljava/lang/String;
243+
}
244+
245+
public final class io/sentry/kotlin/multiplatform/SentryReplayOptions$Quality : java/lang/Enum {
246+
public static final field HIGH Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
247+
public static final field LOW Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
248+
public static final field MEDIUM Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
249+
public final fun getBitRate ()I
250+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
251+
public final fun getSizeScale ()F
252+
public static fun valueOf (Ljava/lang/String;)Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
253+
public static fun values ()[Lio/sentry/kotlin/multiplatform/SentryReplayOptions$Quality;
254+
}
255+
212256
public final class io/sentry/kotlin/multiplatform/protocol/Breadcrumb {
213257
public static final field Companion Lio/sentry/kotlin/multiplatform/protocol/Breadcrumb$Companion;
214258
public fun <init> ()V
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,47 @@
11
package io.sentry.kotlin.multiplatform.extensions
22

33
import io.sentry.android.core.SentryAndroidOptions
4+
import io.sentry.kotlin.multiplatform.JvmSentryReplayQuality
45
import io.sentry.kotlin.multiplatform.SentryOptions
6+
import io.sentry.kotlin.multiplatform.SentryReplayOptions
57
import kotlin.collections.forEach as kForEach
68

7-
internal fun SentryOptions.toAndroidSentryOptionsCallback(): (SentryAndroidOptions) -> Unit = {
9+
internal fun SentryOptions.toAndroidSentryOptionsCallback(): (SentryAndroidOptions) -> Unit = { androidOptions ->
10+
val kmpOptions = this
11+
812
// Apply base options available to all JVM targets
9-
it.applyJvmBaseOptions(this)
13+
androidOptions.applyJvmBaseOptions(kmpOptions)
1014

1115
// Apply Android specific options
12-
it.isAttachScreenshot = this.attachScreenshot
13-
it.isAttachViewHierarchy = this.attachViewHierarchy
14-
it.isAnrEnabled = this.isAnrEnabled
15-
it.anrTimeoutIntervalMillis = this.anrTimeoutIntervalMillis
16+
androidOptions.isAttachScreenshot = kmpOptions.attachScreenshot
17+
androidOptions.isAttachViewHierarchy = kmpOptions.attachViewHierarchy
18+
androidOptions.isAnrEnabled = kmpOptions.isAnrEnabled
19+
androidOptions.anrTimeoutIntervalMillis = kmpOptions.anrTimeoutIntervalMillis
20+
21+
// Replay options
22+
androidOptions.experimental.sessionReplay.redactAllText =
23+
kmpOptions.experimental.sessionReplay.redactAllText
24+
androidOptions.experimental.sessionReplay.redactAllImages =
25+
kmpOptions.experimental.sessionReplay.redactAllImages
26+
androidOptions.experimental.sessionReplay.sessionSampleRate =
27+
kmpOptions.experimental.sessionReplay.sessionSampleRate
28+
androidOptions.experimental.sessionReplay.errorSampleRate =
29+
kmpOptions.experimental.sessionReplay.onErrorSampleRate
30+
androidOptions.experimental.sessionReplay.quality =
31+
kmpOptions.experimental.sessionReplay.quality.toAndroidSentryQuality()
1632

1733
// kForEach solves an issue with linter where it thinks forEach is the Java version
1834
// see here: https://stackoverflow.com/questions/44751469/kotlin-extension-functions-suddenly-require-api-level-24/68897591#68897591
1935
this.sdk?.packages?.kForEach { sdkPackage ->
20-
it.sdkVersion?.addPackage(sdkPackage.name, sdkPackage.version)
36+
androidOptions.sdkVersion?.addPackage(sdkPackage.name, sdkPackage.version)
37+
}
38+
}
39+
40+
internal fun SentryReplayOptions.Quality.toAndroidSentryQuality(): JvmSentryReplayQuality {
41+
val kmpQuality = this
42+
return when (kmpQuality) {
43+
SentryReplayOptions.Quality.LOW -> JvmSentryReplayQuality.LOW
44+
SentryReplayOptions.Quality.MEDIUM -> JvmSentryReplayQuality.MEDIUM
45+
SentryReplayOptions.Quality.HIGH -> JvmSentryReplayQuality.HIGH
2146
}
2247
}

sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import io.sentry.android.core.SentryAndroidOptions
44
import io.sentry.kotlin.multiplatform.extensions.toAndroidSentryOptionsCallback
55
import io.sentry.kotlin.multiplatform.utils.fakeDsn
66
import kotlin.test.assertEquals
7+
import io.sentry.SentryReplayOptions as NativeSentryReplayOptions
78

89
actual interface PlatformOptions : CommonPlatformOptions {
910
val isAnrEnabled: Boolean
1011
val anrTimeoutIntervalMillis: Long
1112
val attachScreenshot: Boolean
1213
val attachViewHierarchy: Boolean
14+
val sessionReplay: NativeSentryReplayOptions
1315
}
1416

1517
class SentryAndroidOptionsWrapper(private val androidOptions: SentryAndroidOptions) :
@@ -62,6 +64,9 @@ class SentryAndroidOptionsWrapper(private val androidOptions: SentryAndroidOptio
6264
override val attachViewHierarchy: Boolean
6365
get() = androidOptions.isAttachViewHierarchy
6466

67+
override val sessionReplay: NativeSentryReplayOptions
68+
get() = androidOptions.experimental.sessionReplay
69+
6570
override fun applyFromOptions(options: SentryOptions) {
6671
options.toAndroidSentryOptionsCallback().invoke(androidOptions)
6772
}
@@ -75,6 +80,11 @@ actual fun PlatformOptions.assertPlatformSpecificOptions(options: SentryOptions)
7580
assertEquals(attachViewHierarchy, options.attachViewHierarchy)
7681
assertEquals(isAnrEnabled, options.isAnrEnabled)
7782
assertEquals(anrTimeoutIntervalMillis, options.anrTimeoutIntervalMillis)
83+
assertEquals(sessionReplay.redactAllText, options.experimental.sessionReplay.redactAllText)
84+
assertEquals(sessionReplay.redactAllImages, options.experimental.sessionReplay.redactAllImages)
85+
assertEquals(sessionReplay.errorSampleRate, options.experimental.sessionReplay.onErrorSampleRate)
86+
assertEquals(sessionReplay.sessionSampleRate, options.experimental.sessionReplay.sessionSampleRate)
87+
assertEquals(sessionReplay.quality.name, options.experimental.sessionReplay.quality.name)
7888
}
7989

8090
actual fun createSentryPlatformOptionsConfiguration(): PlatformOptionsConfiguration = {

sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/TypeAliases.jvm.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import io.sentry.Scope
77
import io.sentry.SentryEvent
88
import io.sentry.SentryLevel
99
import io.sentry.SentryOptions
10+
import io.sentry.SentryReplayOptions
1011
import io.sentry.UserFeedback
1112
import io.sentry.protocol.Contexts
1213
import io.sentry.protocol.Message
@@ -27,3 +28,4 @@ internal typealias JvmSentryEvent = SentryEvent
2728
internal typealias JvmMessage = Message
2829
internal typealias JvmSentryException = SentryException
2930
internal typealias JvmContexts = Contexts
31+
internal typealias JvmSentryReplayQuality = SentryReplayOptions.SentryReplayQuality

sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,27 @@ public open class SentryOptions {
171171
* [Android ANR](https://docs.sentry.io/platforms/android/configuration/app-not-respond/)
172172
*/
173173
public var anrTimeoutIntervalMillis: Long = DEFAULT_ANR_TIMEOUT_INTERVAL_MILLIS
174+
175+
/**
176+
* Experimental options for new features, these options are going to be promoted to SentryOptions
177+
* before GA.
178+
*
179+
* Beware that experimental options can change at any time.
180+
*/
181+
public var experimental: ExperimentalOptions = ExperimentalOptions()
182+
private set
183+
184+
/**
185+
* Experimental options for new features, these options are going to be promoted to SentryOptions
186+
* before GA.
187+
*
188+
* Beware that experimental options can change at any time.
189+
*/
190+
public class ExperimentalOptions {
191+
/**
192+
* Experimental feature. The options for session replay.
193+
* Currently available for **Android** and **iOS**.
194+
*/
195+
public var sessionReplay: SentryReplayOptions = SentryReplayOptions()
196+
}
174197
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.sentry.kotlin.multiplatform
2+
3+
/**
4+
* Configuration options for session replay.
5+
*/
6+
public data class SentryReplayOptions(
7+
/**
8+
* Indicates the percentage in which the replay for the session will be created.
9+
* Specifying 0 means never, 1.0 means always. The value needs to be >= 0.0 and <= 1.0.
10+
*
11+
* The default is null (disabled).
12+
*/
13+
public var sessionSampleRate: Double? = null,
14+
15+
/**
16+
* Indicates the percentage in which a 30 seconds replay will be sent with error events.
17+
* Specifying 0 means never, 1.0 means always. The value needs to be >= 0.0 and <= 1.0.
18+
*
19+
* The default is null (disabled).
20+
*/
21+
public var onErrorSampleRate: Double? = null,
22+
23+
/**
24+
* Redact all text content. Draws a rectangle of text bounds with text color on top.
25+
*
26+
* The default is true.
27+
*/
28+
public var redactAllText: Boolean = true,
29+
30+
/**
31+
* Redact all image content. Draws a rectangle of image bounds with image's dominant color on top.
32+
*
33+
* The default is true.
34+
*/
35+
public var redactAllImages: Boolean = true,
36+
37+
/**
38+
* Defines the quality of the session replay. The higher the quality, the more accurate the replay
39+
* will be, but also more data to transfer and more CPU load, defaults to MEDIUM.
40+
*/
41+
public var quality: Quality = Quality.MEDIUM
42+
) {
43+
/**
44+
* Quality of the session replay.
45+
*/
46+
@Suppress("MagicNumber")
47+
public enum class Quality(
48+
/** The scale related to the window size (in dp) at which the replay will be created. */
49+
public val sizeScale: Float,
50+
/**
51+
* Defines the quality of the session replay. Higher bit rates have better replay quality, but
52+
* also affect the final payload size to transfer, defaults to 40kbps.
53+
*/
54+
public val bitRate: Int
55+
) {
56+
/** Video Scale: 80% Bit Rate: 50.000 */
57+
LOW(0.8f, 50000),
58+
59+
/** Video Scale: 100% Bit Rate: 75.000 */
60+
MEDIUM(1.0f, 75000),
61+
62+
/** Video Scale: 100% Bit Rate: 100.000 */
63+
HIGH(1.0f, 100000)
64+
}
65+
}

sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@ class SentryOptionsTest : BaseSentryTest() {
126126
assertEquals(2000L, options.appHangTimeoutIntervalMillis)
127127
assertTrue(options.isAnrEnabled)
128128
assertEquals(5000L, options.anrTimeoutIntervalMillis)
129+
assertNull(options.experimental.sessionReplay.onErrorSampleRate)
130+
assertNull(options.experimental.sessionReplay.sessionSampleRate)
131+
assertTrue(options.experimental.sessionReplay.redactAllText)
132+
assertTrue(options.experimental.sessionReplay.redactAllImages)
133+
assertEquals(SentryReplayOptions.Quality.MEDIUM, options.experimental.sessionReplay.quality)
129134
}
130135

131136
@Test
@@ -149,6 +154,11 @@ class SentryOptionsTest : BaseSentryTest() {
149154
appHangTimeoutIntervalMillis = 1000L
150155
isAnrEnabled = false
151156
anrTimeoutIntervalMillis = 1000L
157+
experimental.sessionReplay.onErrorSampleRate = 0.5
158+
experimental.sessionReplay.sessionSampleRate = 0.5
159+
experimental.sessionReplay.redactAllText = false
160+
experimental.sessionReplay.redactAllImages = false
161+
experimental.sessionReplay.quality = SentryReplayOptions.Quality.LOW
152162
}
153163

154164
val platformOptions = createPlatformOptions()
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,37 @@
11
package io.sentry.kotlin.multiplatform.extensions
22

3+
import cocoapods.Sentry.SentryReplayOptions
34
import io.sentry.kotlin.multiplatform.CocoaSentryOptions
45
import io.sentry.kotlin.multiplatform.SentryOptions
56

6-
internal fun SentryOptions.toIosOptionsConfiguration(): (CocoaSentryOptions?) -> Unit = {
7-
// Apply base options available to all Cocoa/Apple targets
8-
it?.applyCocoaBaseOptions(this)
7+
internal fun SentryOptions.toIosOptionsConfiguration(): (CocoaSentryOptions?) -> Unit = { options ->
8+
options?.let { cocoaOptions ->
9+
val kmpOptions = this@toIosOptionsConfiguration
910

10-
// Apply iOS specific options
11-
it?.attachScreenshot = this.attachScreenshot
12-
it?.attachViewHierarchy = this.attachViewHierarchy
11+
// Apply base options available to all Cocoa/Apple targets
12+
cocoaOptions.applyCocoaBaseOptions(kmpOptions)
13+
14+
// Apply iOS specific options
15+
cocoaOptions.attachScreenshot = this.attachScreenshot
16+
cocoaOptions.attachViewHierarchy = this.attachViewHierarchy
17+
18+
// Replay options
19+
val replayOptions = SentryReplayOptions(
20+
dictionary = mapOf(
21+
// Setting the onErrorSampleRate like this, using setOnErrorSampleRate
22+
// crashes on compose multiplatform for some unknown reason
23+
"errorSampleRate" to kmpOptions.experimental.sessionReplay.onErrorSampleRate?.toFloat()
24+
)
25+
).apply {
26+
setRedactAllText(kmpOptions.experimental.sessionReplay.redactAllText)
27+
setRedactAllImages(kmpOptions.experimental.sessionReplay.redactAllImages)
28+
kmpOptions.experimental.sessionReplay.sessionSampleRate?.let { setSessionSampleRate(it.toFloat()) }
29+
setQuality(kmpOptions.experimental.sessionReplay.quality.ordinal.toLong())
30+
}
31+
cocoaOptions.experimental().setSessionReplay(replayOptions)
32+
} ?: run {
33+
// Log a warning if options is null
34+
// TODO: Replace with actual logging when a logger is available
35+
println("Warning: CocoaSentryOptions is null, skipping iOS configuration")
36+
}
1337
}

0 commit comments

Comments
 (0)