Skip to content

Commit e52c45e

Browse files
Merge pull request #446 from splitio/review-changes
review changes and add fallbacklabel to avoid impression
2 parents c88d787 + 6cf13c9 commit e52c45e

File tree

7 files changed

+24
-44
lines changed

7 files changed

+24
-44
lines changed

src/evaluator/fallbackTreatmentsCalculator/__tests__/fallback-calculator.spec.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,20 +131,4 @@ describe('FallbackTreatmentsCalculator' , () => {
131131
label: 'label by noFallback',
132132
});
133133
});
134-
135-
test('returns undefined label if no label provided', () => {
136-
const config: FallbackTreatmentConfiguration = {
137-
byFlag: {
138-
'featureB': { treatment: 'TREATMENT_B', config: '{ value: 1 }' },
139-
},
140-
};
141-
const calculator = new FallbackTreatmentsCalculator(loggerMock, config);
142-
const result = calculator.resolve('featureB');
143-
144-
expect(result).toEqual({
145-
treatment: 'TREATMENT_B',
146-
config: '{ value: 1 }',
147-
label: '',
148-
});
149-
});
150134
});

src/evaluator/fallbackTreatmentsCalculator/fallbackSanitizer/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FallbackTreatment, Treatment, TreatmentWithConfig } from '../../../../types/splitio';
1+
import { Treatment, TreatmentWithConfig } from '../../../../types/splitio';
22
import { ILogger } from '../../../logger/types';
33
import { isObject, isString } from '../../../utils/lang';
44
import { FallbackDiscardReason } from '../constants';
@@ -12,7 +12,7 @@ export class FallbacksSanitizer {
1212
return name.length <= 100 && !name.includes(' ');
1313
}
1414

15-
private static isValidTreatment(t?: Treatment | FallbackTreatment): boolean {
15+
private static isValidTreatment(t?: Treatment | TreatmentWithConfig): boolean {
1616
const treatment = isObject(t) ? (t as TreatmentWithConfig).treatment : t;
1717

1818
if (!isString(treatment) || treatment.length > 100) {
@@ -21,7 +21,7 @@ export class FallbacksSanitizer {
2121
return FallbacksSanitizer.pattern.test(treatment);
2222
}
2323

24-
static sanitizeGlobal(logger: ILogger, treatment?: string | FallbackTreatment): string | FallbackTreatment | undefined {
24+
static sanitizeGlobal(logger: ILogger, treatment?: Treatment | TreatmentWithConfig): Treatment | TreatmentWithConfig | undefined {
2525
if (!this.isValidTreatment(treatment)) {
2626
logger.error(
2727
`Fallback treatments - Discarded fallback: ${FallbackDiscardReason.Treatment}`
@@ -33,9 +33,9 @@ export class FallbacksSanitizer {
3333

3434
static sanitizeByFlag(
3535
logger: ILogger,
36-
byFlagFallbacks: Record<string, string | FallbackTreatment>
37-
): Record<string, string | FallbackTreatment> {
38-
const sanitizedByFlag: Record<string, string | FallbackTreatment> = {};
36+
byFlagFallbacks: Record<string, Treatment | TreatmentWithConfig>
37+
): Record<string, Treatment | TreatmentWithConfig> {
38+
const sanitizedByFlag: Record<string, Treatment | TreatmentWithConfig> = {};
3939

4040
const entries = Object.keys(byFlagFallbacks);
4141
entries.forEach((flag) => {

src/evaluator/fallbackTreatmentsCalculator/index.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import { FallbackTreatmentConfiguration, FallbackTreatment } from '../../../types/splitio';
1+
import { FallbackTreatmentConfiguration, Treatment, TreatmentWithConfig } from '../../../types/splitio';
22
import { FallbacksSanitizer } from './fallbackSanitizer';
33
import { CONTROL } from '../../utils/constants';
44
import { isString } from '../../utils/lang';
55
import { ILogger } from '../../logger/types';
66

77
export type IFallbackTreatmentsCalculator = {
8-
resolve(flagName: string, label?: string): FallbackTreatment & { label?: string };
8+
resolve(flagName: string, label: string): TreatmentWithConfig & { label: string };
99
}
1010

11+
export const FALLBACK_PREFIX = 'fallback - ';
12+
1113
export class FallbackTreatmentsCalculator implements IFallbackTreatmentsCalculator {
12-
private readonly labelPrefix = 'fallback - ';
1314
private readonly fallbacks: FallbackTreatmentConfiguration;
1415

1516
constructor(logger: ILogger, fallbacks?: FallbackTreatmentConfiguration) {
@@ -21,7 +22,7 @@ export class FallbackTreatmentsCalculator implements IFallbackTreatmentsCalculat
2122
};
2223
}
2324

24-
resolve(flagName: string, label?: string): FallbackTreatment & { label?: string } {
25+
resolve(flagName: string, label: string): TreatmentWithConfig & { label: string } {
2526
const treatment = this.fallbacks.byFlag?.[flagName];
2627
if (treatment) {
2728
return this.copyWithLabel(treatment, label);
@@ -38,24 +39,19 @@ export class FallbackTreatmentsCalculator implements IFallbackTreatmentsCalculat
3839
};
3940
}
4041

41-
private copyWithLabel(fallback: string | FallbackTreatment, label?: string): FallbackTreatment & { label: string } {
42+
private copyWithLabel(fallback: Treatment | TreatmentWithConfig, label: string): TreatmentWithConfig & { label: string } {
4243
if (isString(fallback)) {
4344
return {
4445
treatment: fallback,
4546
config: null,
46-
label: this.resolveLabel(label),
47+
label: `${FALLBACK_PREFIX}${label}`,
4748
};
4849
}
4950

5051
return {
5152
treatment: fallback.treatment,
5253
config: fallback.config,
53-
label: this.resolveLabel(label),
54+
label: `${FALLBACK_PREFIX}${label}`,
5455
};
5556
}
56-
57-
private resolveLabel(label?: string): string {
58-
return label ? `${this.labelPrefix}${label}` : '';
59-
}
60-
6157
}

src/sdkClient/client.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,16 @@ export function clientFactory(params: ISdkFactoryContext): SplitIO.IClient | Spl
145145

146146
const { changeNumber, impressionsDisabled } = evaluation;
147147
let { treatment, label, config = null } = evaluation;
148-
log.info(IMPRESSION, [featureFlagName, matchingKey, treatment, label]);
149148

150149
if (treatment === CONTROL) {
151150
const fallbackTreatment = fallbackTreatmentsCalculator.resolve(featureFlagName, label);
152151
treatment = fallbackTreatment.treatment;
153-
label = fallbackTreatment.label ? fallbackTreatment.label : label;
152+
label = fallbackTreatment.label;
154153
config = fallbackTreatment.config;
155154
}
156155

156+
log.info(IMPRESSION, [featureFlagName, matchingKey, treatment, label]);
157+
157158
if (validateSplitExistence(log, readinessManager, featureFlagName, label, invokingMethodName)) {
158159
log.info(IMPRESSION_QUEUEING);
159160
queue.push({

src/utils/inputValidation/splitExistence.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SPLIT_NOT_FOUND } from '../labels';
1+
import { FALLBACK_SPLIT_NOT_FOUND, SPLIT_NOT_FOUND } from '../labels';
22
import { IReadinessManager } from '../../readiness/types';
33
import { ILogger } from '../../logger/types';
44
import { WARN_NOT_EXISTENT_SPLIT } from '../../logger/constants';
@@ -9,7 +9,7 @@ import { WARN_NOT_EXISTENT_SPLIT } from '../../logger/constants';
99
*/
1010
export function validateSplitExistence(log: ILogger, readinessManager: IReadinessManager, splitName: string, labelOrSplitObj: any, method: string): boolean {
1111
if (readinessManager.isReady()) { // Only if it's ready we validate this, otherwise it may just be that the SDK is not ready yet.
12-
if (labelOrSplitObj === SPLIT_NOT_FOUND || labelOrSplitObj == null) {
12+
if (labelOrSplitObj === SPLIT_NOT_FOUND || labelOrSplitObj == null || labelOrSplitObj === FALLBACK_SPLIT_NOT_FOUND) {
1313
log.warn(WARN_NOT_EXISTENT_SPLIT, [method, splitName]);
1414
return false;
1515
}

src/utils/labels/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { FALLBACK_PREFIX } from '../../evaluator/fallbackTreatmentsCalculator';
2+
13
export const SPLIT_KILLED = 'killed';
24
export const NO_CONDITION_MATCH = 'default rule';
35
export const SPLIT_NOT_FOUND = 'definition not found';
@@ -7,3 +9,4 @@ export const SPLIT_ARCHIVED = 'archived';
79
export const NOT_IN_SPLIT = 'not in split';
810
export const UNSUPPORTED_MATCHER_TYPE = 'targeting rule type unsupported by sdk';
911
export const PREREQUISITES_NOT_MET = 'prerequisites not met';
12+
export const FALLBACK_SPLIT_NOT_FOUND = FALLBACK_PREFIX + SPLIT_NOT_FOUND;

types/splitio.d.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,17 +1232,13 @@ declare namespace SplitIO {
12321232
* User consent status.
12331233
*/
12341234
type ConsentStatus = 'GRANTED' | 'DECLINED' | 'UNKNOWN';
1235-
/**
1236-
* Fallback treatment can be either a string (Treatment) or an object with treatment and config (TreatmentWithConfig).
1237-
*/
1238-
type FallbackTreatment = TreatmentWithConfig;
12391235
/**
12401236
* Fallback treatments to be used when the SDK is not ready or the flag is not found.
12411237
*/
12421238
type FallbackTreatmentConfiguration = {
1243-
global?: string | FallbackTreatment,
1239+
global?: Treatment | TreatmentWithConfig,
12441240
byFlag?: {
1245-
[key: string]: string | FallbackTreatment
1241+
[featureFlagName: string]: Treatment | TreatmentWithConfig
12461242
}
12471243
}
12481244
/**

0 commit comments

Comments
 (0)