Skip to content

Commit 6605107

Browse files
committed
Fetch and store precomputed flags
1 parent 97b3531 commit 6605107

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

src/api-endpoints.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { BASE_URL as DEFAULT_BASE_URL, UFC_ENDPOINT, BANDIT_ENDPOINT } from './constants';
1+
import {
2+
BASE_URL as DEFAULT_BASE_URL,
3+
UFC_ENDPOINT,
4+
BANDIT_ENDPOINT,
5+
PRECOMPUTED_FLAGS_ENDPOINT,
6+
} from './constants';
27
import { IQueryParams } from './http-client';
38

49
interface IApiEndpointsParams {
@@ -27,4 +32,8 @@ export default class ApiEndpoints {
2732
banditParametersEndpoint(): URL {
2833
return this.endpoint(BANDIT_ENDPOINT);
2934
}
35+
36+
precomputedFlagsEndpoint(): URL {
37+
return this.endpoint(PRECOMPUTED_FLAGS_ENDPOINT);
38+
}
3039
}

src/configuration-requestor.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { IConfigurationStore } from './configuration-store/configuration-store';
22
import { IHttpClient } from './http-client';
3-
import { BanditVariation, BanditParameters, Flag, Environment } from './interfaces';
3+
import {
4+
BanditVariation,
5+
BanditParameters,
6+
Flag,
7+
Environment,
8+
PrecomputedFlag,
9+
} from './interfaces';
410

5-
type Entry = Flag | BanditVariation[] | BanditParameters;
11+
type Entry = Flag | BanditVariation[] | BanditParameters | PrecomputedFlag;
612

713
// Requests AND stores flag configurations
814
export default class ConfigurationRequestor {
@@ -12,6 +18,7 @@ export default class ConfigurationRequestor {
1218
private readonly banditVariationConfigurationStore: IConfigurationStore<
1319
BanditVariation[]
1420
> | null,
21+
private readonly precomputedFlagStore: IConfigurationStore<PrecomputedFlag>,
1522
private readonly banditModelConfigurationStore: IConfigurationStore<BanditParameters> | null,
1623
) {}
1724

@@ -91,4 +98,17 @@ export default class ConfigurationRequestor {
9198
});
9299
return banditVariationsByFlagKey;
93100
}
101+
102+
async fetchAndStorePrecomputedFlags(): Promise<void> {
103+
const precomputedResponse = await this.httpClient.getPrecomputedFlags();
104+
if (!precomputedResponse?.flags) {
105+
return;
106+
}
107+
108+
await this.hydrateConfigurationStore(this.precomputedFlagStore, {
109+
entries: precomputedResponse.flags,
110+
environment: precomputedResponse.environment,
111+
createdAt: precomputedResponse.createdAt,
112+
});
113+
}
94114
}

src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export const DEFAULT_POLL_CONFIG_REQUEST_RETRIES = 7;
77
export const BASE_URL = 'https://fscdn.eppo.cloud/api';
88
export const UFC_ENDPOINT = '/flag-config/v1/config';
99
export const BANDIT_ENDPOINT = '/flag-config/v1/bandits';
10+
export const PRECOMPUTED_FLAGS_ENDPOINT = '/flag-config/v1/precomputed';
1011
export const SESSION_ASSIGNMENT_CONFIG_LOADED = 'eppo-session-assignment-config-loaded';
1112
export const NULL_SENTINEL = 'EPPO_NULL';
1213
// number of logging events that may be queued while waiting for initialization

src/http-client.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export interface IPrecomputedFlagsResponse {
4545
export interface IHttpClient {
4646
getUniversalFlagConfiguration(): Promise<IUniversalFlagConfigResponse | undefined>;
4747
getBanditParameters(): Promise<IBanditParametersResponse | undefined>;
48+
getPrecomputedFlags(): Promise<IPrecomputedFlagsResponse | undefined>;
4849
rawGet<T>(url: URL): Promise<T | undefined>;
4950
}
5051

@@ -61,6 +62,11 @@ export default class FetchHttpClient implements IHttpClient {
6162
return await this.rawGet<IBanditParametersResponse>(url);
6263
}
6364

65+
async getPrecomputedFlags(): Promise<IPrecomputedFlagsResponse | undefined> {
66+
const url = this.apiEndpoints.precomputedFlagsEndpoint();
67+
return await this.rawGet<IPrecomputedFlagsResponse>(url);
68+
}
69+
6470
async rawGet<T>(url: URL): Promise<T | undefined> {
6571
try {
6672
// Canonical implementation of abortable fetch for interrupting when request takes longer than desired.

0 commit comments

Comments
 (0)