@@ -2,7 +2,7 @@ import FeatureGates, { FeatureGateEnvironment, Identifiers } from '@atlaskit/fea
2
2
import { AnalyticsClient } from '../../analytics-node-client/src/client.min' ;
3
3
import { AnalyticsClientMapper } from './analytics' ;
4
4
import { ExperimentGates , ExperimentGateValues , Experiments , FeatureGateValues , Features } from './features' ;
5
- import { ClientInitializedErrorType } from '../../analytics' ;
5
+ import { ClientInitializedErrorType , featureGateExposureBoolEvent } from '../../analytics' ;
6
6
import { Logger } from '../../logger' ;
7
7
8
8
export type FeatureFlagClientOptions = {
@@ -18,7 +18,8 @@ export class FeatureFlagClientInitError {
18
18
}
19
19
20
20
export abstract class FeatureFlagClient {
21
- private static analyticsClient : AnalyticsClientMapper ;
21
+ private static analyticsClient : AnalyticsClient ;
22
+ private static analyticsClientMapper : AnalyticsClientMapper ;
22
23
23
24
private static featureGateOverrides : FeatureGateValues ;
24
25
private static experimentValueOverride : ExperimentGateValues ;
@@ -44,7 +45,9 @@ export abstract class FeatureFlagClient {
44
45
}
45
46
46
47
Logger . debug ( `FeatureGates: initializing, target: ${ targetApp } , environment: ${ environment } ` ) ;
47
- this . analyticsClient = new AnalyticsClientMapper ( options . analyticsClient , options . identifiers ) ;
48
+
49
+ this . analyticsClient = options . analyticsClient ;
50
+ this . analyticsClientMapper = new AnalyticsClientMapper ( options . analyticsClient , options . identifiers ) ;
48
51
49
52
try {
50
53
await FeatureGates . initialize (
@@ -53,7 +56,7 @@ export abstract class FeatureFlagClient {
53
56
environment,
54
57
targetApp,
55
58
fetchTimeoutMs : Number . parseInt ( timeout ) ,
56
- analyticsWebClient : Promise . resolve ( this . analyticsClient ) ,
59
+ analyticsWebClient : Promise . resolve ( this . analyticsClientMapper ) ,
57
60
} ,
58
61
options . identifiers ,
59
62
) ;
@@ -159,6 +162,74 @@ export abstract class FeatureFlagClient {
159
162
return gateValue ;
160
163
}
161
164
165
+ static checkGateValueWithInstrumentation ( gate : Features ) : any {
166
+ if ( this . featureGateOverrides . hasOwnProperty ( gate ) ) {
167
+ const value = this . featureGateOverrides [ gate ] ;
168
+ featureGateExposureBoolEvent ( gate , false , value , 3 ) . then ( ( e ) => {
169
+ this . analyticsClient . sendTrackEvent ( e ) ;
170
+ } ) ;
171
+ return value ;
172
+ }
173
+
174
+ let gateValue = false ;
175
+ if ( FeatureGates . initializeCompleted ( ) ) {
176
+ // FeatureGates.checkGate returns false if any errors
177
+ gateValue = FeatureGates . checkGate ( gate ) ;
178
+ featureGateExposureBoolEvent ( gate , true , gateValue , 0 ) . then ( ( e ) => {
179
+ this . analyticsClient . sendTrackEvent ( e ) ;
180
+ } ) ;
181
+ } else {
182
+ featureGateExposureBoolEvent ( gate , false , gateValue , 1 ) . then ( ( e ) => {
183
+ this . analyticsClient . sendTrackEvent ( e ) ;
184
+ } ) ;
185
+ }
186
+
187
+ Logger . debug ( `FeatureGates ${ gate } -> ${ gateValue } ` ) ;
188
+ return gateValue ;
189
+ }
190
+
191
+ static checkExperimentBooleanValueWithInstrumentation ( experiment : Experiments ) : any {
192
+ // unknown experiment name
193
+ if ( ! ExperimentGates . hasOwnProperty ( experiment ) ) {
194
+ featureGateExposureBoolEvent ( experiment , false , false , 2 ) . then ( ( e ) => {
195
+ this . analyticsClient . sendTrackEvent ( e ) ;
196
+ } ) ;
197
+ return undefined ;
198
+ }
199
+
200
+ if ( this . experimentValueOverride . hasOwnProperty ( experiment ) ) {
201
+ const value = this . experimentValueOverride [ experiment ] ;
202
+ featureGateExposureBoolEvent ( experiment , false , value , 3 ) . then ( ( e ) => {
203
+ this . analyticsClient . sendTrackEvent ( e ) ;
204
+ } ) ;
205
+ return value ;
206
+ }
207
+
208
+ const experimentGate = ExperimentGates [ experiment ] ;
209
+ let gateValue = experimentGate . defaultValue ;
210
+ if ( FeatureGates . initializeCompleted ( ) ) {
211
+ gateValue = FeatureGates . getExperimentValue ( experiment , experimentGate . parameter , 'N/A' ) ;
212
+
213
+ if ( gateValue === 'N/A' ) {
214
+ gateValue = experimentGate . defaultValue ;
215
+ featureGateExposureBoolEvent ( experiment , false , gateValue , 4 ) . then ( ( e ) => {
216
+ this . analyticsClient . sendTrackEvent ( e ) ;
217
+ } ) ;
218
+ } else {
219
+ featureGateExposureBoolEvent ( experiment , true , gateValue , 0 ) . then ( ( e ) => {
220
+ this . analyticsClient . sendTrackEvent ( e ) ;
221
+ } ) ;
222
+ }
223
+ } else {
224
+ featureGateExposureBoolEvent ( experiment , false , gateValue , 1 ) . then ( ( e ) => {
225
+ this . analyticsClient . sendTrackEvent ( e ) ;
226
+ } ) ;
227
+ }
228
+
229
+ Logger . debug ( `Experiment ${ experiment } -> ${ gateValue } ` ) ;
230
+ return gateValue ;
231
+ }
232
+
162
233
static dispose ( ) {
163
234
FeatureGates . shutdownStatsig ( ) ;
164
235
}
0 commit comments