-
-
Notifications
You must be signed in to change notification settings - Fork 475
Expand file tree
/
Copy pathSentryApollo3Interceptor.kt
More file actions
59 lines (54 loc) · 2.11 KB
/
Copy pathSentryApollo3Interceptor.kt
File metadata and controls
59 lines (54 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package io.sentry.apollo3
import com.apollographql.apollo3.api.ApolloRequest
import com.apollographql.apollo3.api.ApolloResponse
import com.apollographql.apollo3.api.CustomScalarAdapters
import com.apollographql.apollo3.api.Mutation
import com.apollographql.apollo3.api.Operation
import com.apollographql.apollo3.api.Query
import com.apollographql.apollo3.api.Subscription
import com.apollographql.apollo3.api.variables
import com.apollographql.apollo3.interceptor.ApolloInterceptor
import com.apollographql.apollo3.interceptor.ApolloInterceptorChain
import io.sentry.IScopes
import io.sentry.ScopesAdapter
import io.sentry.apollo3.SentryApollo3HttpInterceptor.Companion.SENTRY_APOLLO_3_OPERATION_TYPE
import io.sentry.apollo3.SentryApollo3HttpInterceptor.Companion.SENTRY_APOLLO_3_VARIABLES
import io.sentry.vendor.Base64
import kotlinx.coroutines.flow.Flow
class SentryApollo3Interceptor
@JvmOverloads
constructor(private val scopes: IScopes = ScopesAdapter.getInstance()) : ApolloInterceptor {
override fun <D : Operation.Data> intercept(
request: ApolloRequest<D>,
chain: ApolloInterceptorChain,
): Flow<ApolloResponse<D>> {
val builder =
request
.newBuilder()
.addHttpHeader(
SENTRY_APOLLO_3_OPERATION_TYPE,
Base64.encodeToString(operationType(request).toByteArray(), Base64.NO_WRAP),
)
if (scopes.options.dataCollectionResolver.isGraphqlVariablesWithLegacyAlways) {
request.scalarAdapters?.let {
builder.addHttpHeader(
SENTRY_APOLLO_3_VARIABLES,
Base64.encodeToString(
request.operation.variables(it).valueMap.toString().toByteArray(),
Base64.NO_WRAP,
),
)
}
}
return chain.proceed(builder.build())
}
}
private fun <D : Operation.Data> operationType(apolloRequest: ApolloRequest<D>) =
when (apolloRequest.operation) {
is Query -> "query"
is Mutation -> "mutation"
is Subscription -> "subscription"
else -> apolloRequest.operation.javaClass.simpleName
}
private val <D : Operation.Data> ApolloRequest<D>.scalarAdapters
get() = executionContext[CustomScalarAdapters]