-
Notifications
You must be signed in to change notification settings - Fork 12.2k
/
FeatureSwitchResultsHydrator.scala
42 lines (39 loc) · 1.65 KB
/
FeatureSwitchResultsHydrator.scala
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
package com.twitter.tweetypie
package hydrator
import com.twitter.context.thriftscala.Viewer
import com.twitter.featureswitches.FSRecipient
import com.twitter.featureswitches.UserAgent
import com.twitter.featureswitches.v2.FeatureSwitches
import com.twitter.finagle.mtls.authentication.EmptyServiceIdentifier
import com.twitter.strato.callcontext.CallContext
import com.twitter.tweetypie.client_id.ClientIdHelper
import com.twitter.tweetypie.core.ValueState
/**
* Hydrate Feature Switch results in TweetData. We can do this once at the
* start of the hydration pipeline so that the rest of the hydrators can
* use the Feature Switch values.
*/
object FeatureSwitchResultsHydrator {
def apply(
featureSwitchesWithoutExperiments: FeatureSwitches,
clientIdHelper: ClientIdHelper
): TweetDataValueHydrator = ValueHydrator.map { (td, opts) =>
val viewer = TwitterContext().getOrElse(Viewer())
val recipient =
FSRecipient(
userId = viewer.userId,
clientApplicationId = viewer.clientApplicationId,
userAgent = viewer.userAgent.flatMap(UserAgent(_)),
).withCustomFields(
"thrift_client_id" ->
clientIdHelper.effectiveClientIdRoot.getOrElse(ClientIdHelper.UnknownClientId),
"forwarded_service_id" ->
CallContext.forwardedServiceIdentifier
.map(_.toString).getOrElse(EmptyServiceIdentifier),
"safety_level" -> opts.safetyLevel.toString,
"client_app_id_is_defined" -> viewer.clientApplicationId.isDefined.toString,
)
val results = featureSwitchesWithoutExperiments.matchRecipient(recipient)
ValueState.unit(td.copy(featureSwitchResults = Some(results)))
}
}