Skip to content

Commit 6027c32

Browse files
polling bandits only when needed
1 parent 8858011 commit 6027c32

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

src/configuration-requestor.ts

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ type Entry = Flag | BanditVariation[] | BanditParameters;
1212

1313
// Requests AND stores flag configurations
1414
export default class ConfigurationRequestor {
15+
private banditModelVersions: string[] = [];
16+
1517
constructor(
1618
private readonly httpClient: IHttpClient,
1719
private readonly flagConfigurationStore: IConfigurationStore<Flag>,
@@ -34,13 +36,13 @@ export default class ConfigurationRequestor {
3436
format: configResponse.format,
3537
});
3638

37-
const flagsHaveBandits = Object.keys(configResponse.bandits ?? {}).length > 0;
39+
const flagsHaveBandits = Object.keys(configResponse.banditReferences ?? {}).length > 0;
3840
const banditStoresProvided = Boolean(
3941
this.banditVariationConfigurationStore && this.banditModelConfigurationStore,
4042
);
4143
if (flagsHaveBandits && banditStoresProvided) {
4244
// Map bandit flag associations by flag key for quick lookup (instead of bandit key as provided by the UFC)
43-
const banditVariations = this.indexBanditVariationsByFlagKey(configResponse.bandits);
45+
const banditVariations = this.indexBanditVariationsByFlagKey(configResponse.banditReferences);
4446

4547
await hydrateConfigurationStore(this.banditVariationConfigurationStore, {
4648
entries: banditVariations,
@@ -49,26 +51,34 @@ export default class ConfigurationRequestor {
4951
format: configResponse.format,
5052
});
5153

52-
if (this.requiresBanditModelConfigurationStoreUpdate(configResponse.banditReferences)) {
54+
if (!this.banditModelConfigurationStore) {
55+
throw new Error('Bandit parameters fetched but no bandit configuration store provided');
56+
}
57+
if (
58+
this.requiresBanditModelConfigurationStoreUpdate(
59+
this.banditModelVersions,
60+
configResponse.banditReferences,
61+
)
62+
) {
5363
const banditResponse = await this.httpClient.getBanditParameters();
5464
if (banditResponse?.bandits) {
55-
if (!this.banditModelConfigurationStore) {
56-
throw new Error('Bandit parameters fetched but no bandit configuration store provided');
57-
}
58-
5965
await hydrateConfigurationStore(this.banditModelConfigurationStore, {
6066
entries: banditResponse.bandits,
6167
environment: configResponse.environment,
6268
createdAt: configResponse.createdAt,
6369
format: configResponse.format,});
70+
71+
this.setBanditModelVersions(
72+
this.getLoadedBanditModelVersionsFromStore(this.banditModelConfigurationStore),
73+
);
6474
}
6575
}
6676
}
6777
}
6878

69-
private getLoadedBanditModelVersions(
79+
private getLoadedBanditModelVersionsFromStore(
7080
banditModelConfigurationStore: IConfigurationStore<BanditParameters> | null,
71-
) {
81+
): string[] {
7282
if (banditModelConfigurationStore === null) {
7383
return [];
7484
}
@@ -77,22 +87,20 @@ export default class ConfigurationRequestor {
7787
);
7888
}
7989

90+
private setBanditModelVersions(modelVersions: string[]) {
91+
this.banditModelVersions = modelVersions;
92+
}
93+
8094
private requiresBanditModelConfigurationStoreUpdate(
95+
currentBanditModelVersions: string[],
8196
banditReferences: Record<string, BanditReference>,
8297
): boolean {
83-
if (!this.banditModelConfigurationStore) {
84-
throw new Error('Bandit parameters fetched but no bandit configuration store provided');
85-
}
8698
const referencedModelVersions = Object.values(banditReferences).map(
8799
(banditReference: BanditReference) => banditReference.modelVersion,
88100
);
89101

90-
const banditModelVersionsInStore = this.getLoadedBanditModelVersions(
91-
this.banditModelConfigurationStore,
92-
);
93-
94102
referencedModelVersions.forEach((modelVersion) => {
95-
if (!banditModelVersionsInStore.includes(modelVersion)) {
103+
if (!currentBanditModelVersions.includes(modelVersion)) {
96104
return false;
97105
}
98106
});
@@ -101,11 +109,11 @@ export default class ConfigurationRequestor {
101109
}
102110

103111
private indexBanditVariationsByFlagKey(
104-
banditVariationsByBanditKey: Record<string, BanditVariation[]>,
112+
banditVariationsByBanditKey: Record<string, BanditReference>,
105113
): Record<string, BanditVariation[]> {
106114
const banditVariationsByFlagKey: Record<string, BanditVariation[]> = {};
107-
Object.values(banditVariationsByBanditKey).forEach((banditVariations) => {
108-
banditVariations.forEach((banditVariation) => {
115+
Object.values(banditVariationsByBanditKey).forEach((banditReference) => {
116+
banditReference.flagVariations.forEach((banditVariation) => {
109117
let banditVariations = banditVariationsByFlagKey[banditVariation.flagKey];
110118
if (!banditVariations) {
111119
banditVariations = [];

src/interfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export interface BanditVariation {
103103

104104
export interface BanditReference {
105105
modelVersion: string;
106-
flagVariation: BanditVariation[];
106+
flagVariations: BanditVariation[];
107107
}
108108

109109
export interface BanditParameters {

0 commit comments

Comments
 (0)