Skip to content

Commit 2c6ba5f

Browse files
committed
Fix syncing between kmp event and native event
1 parent 0a229ed commit 2c6ba5f

File tree

6 files changed

+87
-35
lines changed

6 files changed

+87
-35
lines changed

sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import io.sentry.kotlin.multiplatform.protocol.SentryException
1010
import io.sentry.kotlin.multiplatform.protocol.SentryId
1111
import io.sentry.kotlin.multiplatform.protocol.User
1212

13-
public actual class SentryEvent actual constructor() : SentryBaseEvent() {
13+
public actual open class SentryEvent actual constructor() : SentryBaseEvent() {
1414
public actual var level: SentryLevel? = null
1515
public actual var message: Message? = null
1616
public actual var logger: String? = null

sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,43 @@ package io.sentry.kotlin.multiplatform.extensions
33
import cocoapods.Sentry.SentryId
44
import io.sentry.kotlin.multiplatform.CocoaSentryEvent
55
import io.sentry.kotlin.multiplatform.SentryEvent
6+
import io.sentry.kotlin.multiplatform.util.applyIfChanged
67

7-
internal fun CocoaSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): CocoaSentryEvent {
8-
kmpEvent.level?.let { level = it.toCocoaSentryLevel() }
9-
kmpEvent.platform?.let { platform = it }
10-
message = kmpEvent.message?.toCocoaMessage()
11-
logger = kmpEvent.logger
12-
fingerprint = kmpEvent.fingerprint
13-
releaseName = kmpEvent.release
14-
environment = kmpEvent.environment
15-
user = kmpEvent.user?.toCocoaUser()
16-
serverName = kmpEvent.serverName
17-
dist = kmpEvent.dist
18-
breadcrumbs = kmpEvent.breadcrumbs.map { it.toCocoaBreadcrumb() }.toMutableList()
19-
tags = kmpEvent.tags.toMutableMap()
20-
eventId = SentryId(kmpEvent.eventId.toString())
8+
/**
9+
* Syncs updated fields from a KMP [SentryEvent] to this [CocoaSentryEvent].
10+
*
11+
* Only the properties modified (e.g., in beforeSend or event processors) are copied.
12+
*
13+
* @param beforeKmpEvent The KMP [SentryEvent] before the changes were applied.
14+
* @param afterKmpEvent The KMP [SentryEvent] after the changes were applied.
15+
* @return The modified [CocoaSentryEvent].
16+
*/
17+
internal fun CocoaSentryEvent.updateFromKmpEventChanges(
18+
beforeKmpEvent: SentryEvent,
19+
afterKmpEvent: SentryEvent
20+
): CocoaSentryEvent {
21+
applyIfChanged(beforeKmpEvent.release, afterKmpEvent.release) { releaseName = it }
22+
applyIfChanged(beforeKmpEvent.dist, afterKmpEvent.dist) { dist = it }
23+
applyIfChanged(beforeKmpEvent.environment, afterKmpEvent.environment) { environment = it }
24+
applyIfChanged(beforeKmpEvent.serverName, afterKmpEvent.serverName) { serverName = it }
25+
applyIfChanged(beforeKmpEvent.platform, afterKmpEvent.platform) {
26+
if (it != null) {
27+
platform = it
28+
}
29+
}
30+
applyIfChanged(beforeKmpEvent.logger, afterKmpEvent.logger) { logger = it }
31+
applyIfChanged(beforeKmpEvent.level, afterKmpEvent.level) {
32+
if (it != null) level = it.toCocoaSentryLevel()
33+
}
34+
applyIfChanged(beforeKmpEvent.message, afterKmpEvent.message) { message = it?.toCocoaMessage() }
35+
applyIfChanged(beforeKmpEvent.fingerprint, afterKmpEvent.fingerprint) { fingerprint = it }
36+
applyIfChanged(beforeKmpEvent.user, afterKmpEvent.user) { user = it?.toCocoaUser() }
37+
applyIfChanged(beforeKmpEvent.breadcrumbs, afterKmpEvent.breadcrumbs) {
38+
breadcrumbs = it.map { it.toCocoaBreadcrumb() }.toMutableList()
39+
}
40+
applyIfChanged(beforeKmpEvent.eventId, afterKmpEvent.eventId) {
41+
eventId = SentryId(it.toString())
42+
}
43+
applyIfChanged(beforeKmpEvent.tags, afterKmpEvent.tags) { tags = it.toMutableMap() }
2144
return this
2245
}

sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions)
2323
kmpOptions.environment?.let {
2424
cocoaOptions.environment = it
2525
}
26-
cocoaOptions.releaseName = kmpOptions.release
26+
kmpOptions.release?.let{
27+
cocoaOptions.releaseName = it
28+
}
2729
cocoaOptions.debug = kmpOptions.debug
2830
cocoaOptions.sessionTrackingIntervalMillis = kmpOptions.sessionTrackingIntervalMillis.convert()
2931
cocoaOptions.enableAutoSessionTracking = kmpOptions.enableAutoSessionTracking
@@ -53,9 +55,15 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions)
5355
if (kmpOptions.beforeSend == null) {
5456
event
5557
} else {
56-
event?.let { SentryEvent(it) }?.let { unwrappedEvent ->
57-
val result = kmpOptions.beforeSend?.invoke(unwrappedEvent)
58-
result?.let { event.applyKmpEvent(it) }
58+
event?.let { cocoaEvent ->
59+
println("before release1: ${cocoaEvent.releaseName}")
60+
val beforeKmpEvent = SentryEvent(cocoaEvent)
61+
val beforeKmpEventCopy = SentryEvent(cocoaEvent)
62+
kmpOptions.beforeSend
63+
?.invoke(beforeKmpEventCopy)
64+
?.let { afterEvent ->
65+
cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterEvent)
66+
}
5967
}
6068
}
6169
}

sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,33 @@ package io.sentry.kotlin.multiplatform.extensions
33
import io.sentry.kotlin.multiplatform.JvmSentryEvent
44
import io.sentry.kotlin.multiplatform.JvmSentryId
55
import io.sentry.kotlin.multiplatform.SentryEvent
6+
import io.sentry.kotlin.multiplatform.util.applyIfChanged
67

7-
internal fun JvmSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): JvmSentryEvent {
8-
level = kmpEvent.level?.toJvmSentryLevel()
9-
message = kmpEvent.message?.toJvmMessage()
10-
logger = kmpEvent.logger
11-
fingerprints = kmpEvent.fingerprint
12-
release = kmpEvent.release
13-
environment = kmpEvent.environment
14-
platform = kmpEvent.platform
15-
user = kmpEvent.user?.toJvmUser()
16-
serverName = kmpEvent.serverName
17-
dist = kmpEvent.dist
18-
breadcrumbs = kmpEvent.breadcrumbs?.map { it.toJvmBreadcrumb() }
19-
eventId = JvmSentryId(kmpEvent.eventId.toString())
20-
tags = kmpEvent.tags
8+
/**
9+
* Syncs updated fields from a KMP [SentryEvent] to this [JvmSentryEvent].
10+
*
11+
* Only the properties modified (e.g., in beforeSend or event processors) are copied.
12+
*
13+
* @param beforeKmpEvent The KMP [SentryEvent] before the changes were applied.
14+
* @param afterKmpEvent The KMP [SentryEvent] after the changes were applied.
15+
* @return The modified [JvmSentryEvent].
16+
*/
17+
internal fun JvmSentryEvent.updateFromKmpEventChanges(
18+
beforeKmpEvent: SentryEvent,
19+
afterKmpEvent: SentryEvent
20+
): JvmSentryEvent {
21+
applyIfChanged(beforeKmpEvent.release, afterKmpEvent.release) { release = it }
22+
applyIfChanged(beforeKmpEvent.dist, afterKmpEvent.dist) { dist = it }
23+
applyIfChanged(beforeKmpEvent.environment, afterKmpEvent.environment) { environment = it }
24+
applyIfChanged(beforeKmpEvent.serverName, afterKmpEvent.serverName) { serverName = it }
25+
applyIfChanged(beforeKmpEvent.platform, afterKmpEvent.platform) { platform = it }
26+
applyIfChanged(beforeKmpEvent.logger, afterKmpEvent.logger) { logger = it }
27+
applyIfChanged(beforeKmpEvent.level, afterKmpEvent.level) { level = it?.toJvmSentryLevel() }
28+
applyIfChanged(beforeKmpEvent.message, afterKmpEvent.message) { message = it?.toJvmMessage() }
29+
applyIfChanged(beforeKmpEvent.fingerprint, afterKmpEvent.fingerprint) { fingerprints = it }
30+
applyIfChanged(beforeKmpEvent.user, afterKmpEvent.user) { user = it?.toJvmUser() }
31+
applyIfChanged(beforeKmpEvent.breadcrumbs, afterKmpEvent.breadcrumbs) { breadcrumbs = it.map { it.toJvmBreadcrumb() } }
32+
applyIfChanged(beforeKmpEvent.eventId, afterKmpEvent.eventId) { eventId = JvmSentryId(it.toString()) }
33+
applyIfChanged(beforeKmpEvent.tags, afterKmpEvent.tags) { tags = it }
2134
return this
2235
}

sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(kmpOptions: SentryOptions) {
4343
if (kmpOptions.beforeSend == null) {
4444
jvmSentryEvent
4545
} else {
46-
kmpOptions.beforeSend?.invoke(SentryEvent(jvmSentryEvent))?.let {
47-
jvmSentryEvent.applyKmpEvent(it)
46+
val beforeKmpEvent = SentryEvent(jvmSentryEvent)
47+
val beforeKmpEventCopy = SentryEvent(jvmSentryEvent)
48+
kmpOptions.beforeSend?.invoke(beforeKmpEventCopy)?.let { afterKmpEvent ->
49+
jvmSentryEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent)
4850
}
4951
}
5052
}
5153
}
54+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.sentry.kotlin.multiplatform.util
2+
3+
internal inline fun <T> applyIfChanged(old: T, new: T, applyNew: (T) -> Unit) {
4+
if (old != new) applyNew(new)
5+
}

0 commit comments

Comments
 (0)