1
1
package statsig
2
2
3
3
import (
4
+ "math/rand"
4
5
"strings"
5
6
)
6
7
8
+ type GCIRSessionReplayTrigger struct {
9
+ Values * []string `json:"values,omitempty"`
10
+ PassesSampling * bool `json:"passes_sampling,omitempty"`
11
+ }
12
+
7
13
type ClientInitializeResponse struct {
8
- FeatureGates map [string ]GateInitializeResponse `json:"feature_gates"`
9
- DynamicConfigs map [string ]ConfigInitializeResponse `json:"dynamic_configs"`
10
- LayerConfigs map [string ]LayerInitializeResponse `json:"layer_configs"`
11
- SdkParams map [string ]string `json:"sdkParams"`
12
- HasUpdates bool `json:"has_updates"`
13
- Generator string `json:"generator"`
14
- EvaluatedKeys map [string ]interface {} `json:"evaluated_keys"`
15
- Time int64 `json:"time"`
16
- SDKInfo SDKInfo `json:"sdkInfo"`
17
- User User `json:"user"`
18
- HashUsed string `json:"hash_used"`
14
+ FeatureGates map [string ]GateInitializeResponse `json:"feature_gates"`
15
+ DynamicConfigs map [string ]ConfigInitializeResponse `json:"dynamic_configs"`
16
+ LayerConfigs map [string ]LayerInitializeResponse `json:"layer_configs"`
17
+ SdkParams map [string ]string `json:"sdkParams"`
18
+ HasUpdates bool `json:"has_updates"`
19
+ Generator string `json:"generator"`
20
+ EvaluatedKeys map [string ]interface {} `json:"evaluated_keys"`
21
+ Time int64 `json:"time"`
22
+ SDKInfo SDKInfo `json:"sdkInfo"`
23
+ User User `json:"user"`
24
+ HashUsed string `json:"hash_used"`
25
+ CanRecordSession * bool `json:"can_record_session,omitempty"`
26
+ SessionRecordingRate * float64 `json:"session_recording_rate,omitempty"`
27
+ RecordingBlocked * bool `json:"recording_blocked,omitempty"`
28
+ PassesSessionRecordingTargeting * bool `json:"passes_session_recording_targeting,omitempty"`
29
+ SessionRecordingEventTriggers * map [string ]GCIRSessionReplayTrigger `json:"session_recording_event_triggers,omitempty"`
30
+ SessionRecordingExposureTriggers * map [string ]GCIRSessionReplayTrigger `json:"session_recording_exposure_triggers,omitempty"`
19
31
}
20
32
21
33
type SDKInfo struct {
@@ -148,7 +160,6 @@ func getClientInitializeResponse(
148
160
}
149
161
return hashedName , result
150
162
}
151
-
152
163
cmabToResponse := func (cmabName string , spec configSpec ) (string , ConfigInitializeResponse ) {
153
164
evalRes := & evalResult {}
154
165
if context .IncludeLocalOverrides || options .Overrides != nil {
@@ -163,11 +174,10 @@ func getClientInitializeResponse(
163
174
hashedName , base := evalResultToBaseResponse (cmabName , evalRes )
164
175
result := ConfigInitializeResponse {
165
176
BaseSpecInitializeResponse : base ,
166
- Value : evalRes .JsonValue ,
177
+ Value : evalRes .JsonValue ,
167
178
}
168
179
return hashedName , result
169
180
}
170
-
171
181
configToResponse := func (configName string , spec configSpec ) (string , ConfigInitializeResponse ) {
172
182
evalRes := & evalResult {}
173
183
hasExpOverride := false
@@ -385,5 +395,62 @@ func getClientInitializeResponse(
385
395
User : * user .getCopyForLogging (),
386
396
HashUsed : hashAlgorithm ,
387
397
}
398
+
399
+ sessionReplayInfo := e .store .getSessionReplayInfo ()
400
+ if sessionReplayInfo == nil {
401
+ return response
402
+ }
403
+
404
+ response .RecordingBlocked = sessionReplayInfo .RecordingBlocked
405
+ canRecord := ! * sessionReplayInfo .RecordingBlocked
406
+ response .CanRecordSession = & canRecord
407
+ if sessionReplayInfo .SamplingRate != nil {
408
+ response .SessionRecordingRate = sessionReplayInfo .SamplingRate
409
+ if rand .Float64 () > * sessionReplayInfo .SamplingRate {
410
+ canRecord = false
411
+ response .CanRecordSession = & canRecord
412
+ }
413
+ }
414
+ if sessionReplayInfo .TargetingGate != nil {
415
+ res := response .FeatureGates [hashName (hashAlgorithm , * sessionReplayInfo .TargetingGate )]
416
+ passesTargeting := res .Value
417
+ if ! passesTargeting {
418
+ canRecord = false
419
+ response .CanRecordSession = & canRecord
420
+ }
421
+ response .PassesSessionRecordingTargeting = & passesTargeting
422
+ }
423
+ if sessionReplayInfo .SessionRecordingEventTriggers != nil {
424
+ resultEventTriggers := make (map [string ]GCIRSessionReplayTrigger )
425
+ for eventName , trigger := range * sessionReplayInfo .SessionRecordingEventTriggers {
426
+ resultEventTrigger := GCIRSessionReplayTrigger {}
427
+ if trigger .Values != nil {
428
+ resultEventTrigger .Values = trigger .Values
429
+ }
430
+ if trigger .SamplingRate != nil {
431
+ passesSampling := rand .Float64 () <= * trigger .SamplingRate
432
+ resultEventTrigger .PassesSampling = & passesSampling
433
+ }
434
+ resultEventTriggers [eventName ] = resultEventTrigger
435
+ }
436
+ response .SessionRecordingEventTriggers = & resultEventTriggers
437
+ }
438
+
439
+ if sessionReplayInfo .SessionRecordingExposureTriggers != nil {
440
+ resultExposureTriggers := make (map [string ]GCIRSessionReplayTrigger )
441
+ for exposureName , trigger := range * sessionReplayInfo .SessionRecordingExposureTriggers {
442
+ resultExposureTrigger := GCIRSessionReplayTrigger {}
443
+ if trigger .Values != nil {
444
+ resultExposureTrigger .Values = trigger .Values
445
+ }
446
+ if trigger .SamplingRate != nil {
447
+ passesSampling := rand .Float64 () <= * trigger .SamplingRate
448
+ resultExposureTrigger .PassesSampling = & passesSampling
449
+ }
450
+ resultExposureTriggers [hashName (hashAlgorithm , exposureName )] = resultExposureTrigger
451
+ }
452
+ response .SessionRecordingExposureTriggers = & resultExposureTriggers
453
+ }
454
+
388
455
return response
389
456
}
0 commit comments