Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package io.sentry.kotlin.multiplatform

import cocoapods.Sentry.SentrySDK
import io.sentry.kotlin.multiplatform.extensions.toCocoaBreadcrumb
import io.sentry.kotlin.multiplatform.extensions.toCocoaUser
import io.sentry.kotlin.multiplatform.extensions.toCocoaUserFeedback
import io.sentry.kotlin.multiplatform.nsexception.asNSException
import io.sentry.kotlin.multiplatform.protocol.Breadcrumb
import io.sentry.kotlin.multiplatform.protocol.SentryId
import io.sentry.kotlin.multiplatform.protocol.User
import io.sentry.kotlin.multiplatform.protocol.UserFeedback
import platform.Foundation.NSError
import platform.Foundation.NSException
Expand Down Expand Up @@ -50,6 +54,14 @@ internal actual object SentryBridge {
SentrySDK.configureScope(configureScopeCallback(scopeCallback))
}

actual fun addBreadcrumb(breadcrumb: Breadcrumb) {
SentrySDK.addBreadcrumb(breadcrumb.toCocoaBreadcrumb())
}

actual fun setUser(user: User?) {
SentrySDK.setUser(user?.toCocoaUser())
}

actual fun close() {
SentrySDK.close()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) {
this.debug = options.debug
this.sessionTrackingIntervalMillis = options.sessionTrackingIntervalMillis.convert()
this.enableAutoSessionTracking = options.enableAutoSessionTracking
this.maxAttachmentSize = options.maxAttachmentSize.convert()
this.maxBreadcrumbs = options.maxBreadcrumbs.convert()
this.beforeSend = { event ->
dropKotlinCrashEvent(event as NSExceptionSentryEvent?) as SentryEvent?

Expand All @@ -53,6 +55,6 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) {
PrivateSentrySDKOnly.setSdkName(options.sdk.name, options.sdk.version)
this.beforeBreadcrumb = { cocoaBreadcrumb ->
cocoaBreadcrumb?.toKmpBreadcrumb()
.apply { this?.let { options.beforeBreadcrumb?.invoke(it) } }?.toCocoaBreadcrumb()
?.let { options.beforeBreadcrumb?.invoke(it) }?.toCocoaBreadcrumb()
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package io.sentry.kotlin.multiplatform

import io.sentry.Sentry
import io.sentry.kotlin.multiplatform.extensions.toJvmBreadcrumb
import io.sentry.kotlin.multiplatform.extensions.toJvmUser
import io.sentry.kotlin.multiplatform.extensions.toJvmUserFeedback
import io.sentry.kotlin.multiplatform.protocol.Breadcrumb
import io.sentry.kotlin.multiplatform.protocol.SentryId
import io.sentry.kotlin.multiplatform.protocol.User
import io.sentry.kotlin.multiplatform.protocol.UserFeedback

internal expect fun initSentry(context: Context? = null, configuration: OptionsConfiguration)
Expand Down Expand Up @@ -45,6 +49,14 @@ internal actual object SentryBridge {
Sentry.configureScope(configureScopeCallback(scopeCallback))
}

actual fun addBreadcrumb(breadcrumb: Breadcrumb) {
Sentry.addBreadcrumb(breadcrumb.toJvmBreadcrumb())
}

actual fun setUser(user: User?) {
Sentry.setUser(user?.toJvmUser())
}

actual fun close() {
Sentry.close()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(options: SentryOptions) {
this.isDebug = options.debug
this.sessionTrackingIntervalMillis = options.sessionTrackingIntervalMillis
this.isEnableAutoSessionTracking = options.enableAutoSessionTracking
this.maxAttachmentSize = options.maxAttachmentSize
this.maxBreadcrumbs = options.maxBreadcrumbs
this.setBeforeBreadcrumb { jvmBreadcrumb, _ ->
jvmBreadcrumb
.toKmpBreadcrumb()
.apply { options.beforeBreadcrumb?.invoke(this) }
.toJvmBreadcrumb()
options.beforeBreadcrumb?.invoke(jvmBreadcrumb.toKmpBreadcrumb())?.toJvmBreadcrumb()
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.sentry.kotlin.multiplatform

import io.sentry.kotlin.multiplatform.protocol.Breadcrumb
import io.sentry.kotlin.multiplatform.protocol.SentryId
import io.sentry.kotlin.multiplatform.protocol.User
import io.sentry.kotlin.multiplatform.protocol.UserFeedback

internal expect object SentryBridge {
Expand All @@ -21,5 +23,9 @@ internal expect object SentryBridge {

fun captureUserFeedback(userFeedback: UserFeedback)

fun addBreadcrumb(breadcrumb: Breadcrumb)

fun setUser(user: User?)

fun close()
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.sentry.kotlin.multiplatform

import io.sentry.kotlin.multiplatform.protocol.Breadcrumb
import io.sentry.kotlin.multiplatform.protocol.SentryId
import io.sentry.kotlin.multiplatform.protocol.User
import io.sentry.kotlin.multiplatform.protocol.UserFeedback

typealias ScopeCallback = (Scope) -> Unit
Expand Down Expand Up @@ -87,6 +89,24 @@ object Sentry {
SentryBridge.configureScope(scopeCallback)
}

/**
* Adds a breadcrumb to the current Scope.
*
* @param breadcrumb The breadcrumb to add.
*/
fun addBreadcrumb(breadcrumb: Breadcrumb) {
SentryBridge.addBreadcrumb(breadcrumb)
}

/**
* Sets the user to the current scope.
*
* @param user The user to set.
*/
fun setUser(user: User?) {
SentryBridge.setUser(user)
}

/**
* Throws a RuntimeException, useful for testing.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,14 @@ open class SentryOptions {
var attachScreenshot = false

/** Hook that is triggered before a breadcrumb is sent to Sentry */
var beforeBreadcrumb: ((Breadcrumb) -> Breadcrumb)? = null
var beforeBreadcrumb: ((Breadcrumb) -> Breadcrumb?)? = null

/** Information about the Sentry SDK that generated this event. */
var sdk: SdkVersion = SdkVersion(BuildKonfig.SENTRY_KOTLIN_MULTIPLATFORM_SDK_NAME, BuildKonfig.VERSION_NAME)

/** This variable controls the total amount of breadcrumbs that should be captured. Default is 100. */
var maxBreadcrumbs = 100

/** This variable controls the max attachment size in bytes */
var maxAttachmentSize: Long = 20 * 1024 * 1024
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,24 @@ class SentryOptionsTest {

assertEquals(expectedBreadcrumb, modifiedBreadcrumb)
}

@Test
fun `Breadcrumb can be dropped via beforeBreadcrumb hook`() {
val options = SentryOptions()

fun mockInit(configuration: (SentryOptions) -> Unit) {
configuration.invoke(options)
}

mockInit {
it.beforeBreadcrumb = { breadcrumb ->
breadcrumb.message = "message"
null
}
}

val modifiedBreadcrumb = options.beforeBreadcrumb?.invoke(Breadcrumb())

assertEquals(null, modifiedBreadcrumb)
}
}