diff --git a/src/dtos/types.ts b/src/dtos/types.ts index b2fc6068..94f24113 100644 --- a/src/dtos/types.ts +++ b/src/dtos/types.ts @@ -219,6 +219,7 @@ export interface IDefinition extends TargetingEntity { trafficTypeName: string; sets?: string[]; impressionsDisabled?: boolean; + version?: number; prerequisites?: null | { n: string, ts: string[] diff --git a/src/evaluator/index.ts b/src/evaluator/index.ts index 18f69b4c..87f04dde 100644 --- a/src/evaluator/index.ts +++ b/src/evaluator/index.ts @@ -159,7 +159,7 @@ function getEvaluation( // If the storage is async and the evaluated flag uses segments or dependencies, evaluation is thenable if (thenable(evaluation)) { return evaluation.then(result => { - result.changeNumber = definition.changeNumber; + result.changeNumber = definition.version || definition.changeNumber; result.config = definition.configurations && definition.configurations[result.treatment] || null; // @ts-expect-error impressionsDisabled is not exposed in the public typings yet. result.impressionsDisabled = options?.impressionsDisabled || definition.impressionsDisabled; @@ -167,7 +167,7 @@ function getEvaluation( return result; }); } else { - evaluation.changeNumber = definition.changeNumber; + evaluation.changeNumber = definition.version || definition.changeNumber; evaluation.config = definition.configurations && definition.configurations[evaluation.treatment] || null; // @ts-expect-error impressionsDisabled is not exposed in the public typings yet. evaluation.impressionsDisabled = options?.impressionsDisabled || definition.impressionsDisabled; @@ -236,7 +236,7 @@ function getDefaultTreatment( treatment: definition.defaultTreatment, label: NO_CONDITION_MATCH, // "default rule" config: definition.configurations && definition.configurations[definition.defaultTreatment] || null, - changeNumber: definition.changeNumber + changeNumber: definition.version || definition.changeNumber }; } diff --git a/src/sync/polling/fetchers/__tests__/configsFetcher.spec.ts b/src/sync/polling/fetchers/__tests__/configsFetcher.spec.ts index 8ea9e469..f355b6d5 100644 --- a/src/sync/polling/fetchers/__tests__/configsFetcher.spec.ts +++ b/src/sync/polling/fetchers/__tests__/configsFetcher.spec.ts @@ -8,6 +8,7 @@ const INPUT: IConfigsResponse = { name: 'SomeConfig1', variants: [{ name: 'v1', definition: { prop1: true, prop2: 123 } }, { name: 'v2', definition: { prop1: false, prop2: 456 } }], changeNumber: 0, + version: 1, targeting: { default: 'v2', conditions: [{ partitions: [{ variant: 'v1', size: 100 }], label: 'main condition', matchers: [{ type: 'IS_EQUAL_TO', data: { type: 'NUMBER', number: 42 }, attribute: 'age' }, { type: 'WHITELIST', data: { strings: ['a', 'b', 'c'] }, attribute: 'favoriteCharacter' }] }] } }], }; @@ -19,6 +20,7 @@ const EXPECTED_OUTPUT: IDefinitionChangesResponse = { d: [{ name: 'SomeConfig1', changeNumber: 0, + version: 1, status: 'ACTIVE', killed: false, defaultTreatment: 'v2', diff --git a/src/sync/polling/fetchers/configsFetcher.ts b/src/sync/polling/fetchers/configsFetcher.ts index f5e485de..9926ea54 100644 --- a/src/sync/polling/fetchers/configsFetcher.ts +++ b/src/sync/polling/fetchers/configsFetcher.ts @@ -132,7 +132,8 @@ function convertConfigToDefinition(config: IConfig): IDefinition { return { name: config.name, - changeNumber: config.changeNumber || 0, + version: config.version, + changeNumber: config.changeNumber, status: 'ACTIVE', conditions, killed: false, diff --git a/src/sync/submitters/types.ts b/src/sync/submitters/types.ts index 57e8bfd5..9042210b 100644 --- a/src/sync/submitters/types.ts +++ b/src/sync/submitters/types.ts @@ -12,7 +12,7 @@ type ImpressionPayload = { t: string; /** Timestamp */ m: number; - /** Change number */ + /** Version */ c: number; /** Rule label */ r?: string;