From 696153741d340b912774f05bef78145c1eb02822 Mon Sep 17 00:00:00 2001 From: Aaron Silverman Date: Fri, 2 Feb 2024 16:48:57 -0700 Subject: [PATCH 1/2] ability to set configuration request parameters on an already instantiated client --- package.json | 2 +- src/client/eppo-client.spec.ts | 15 ++++++++++++- src/client/eppo-client.ts | 41 +++++++++++++++++++++------------- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 07f836b..118dce8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@eppo/js-client-sdk-common", - "version": "2.1.0", + "version": "2.1.1", "description": "Eppo SDK for client-side JavaScript applications (base for both web and react native)", "main": "dist/index.js", "files": [ diff --git a/src/client/eppo-client.spec.ts b/src/client/eppo-client.spec.ts index d0e8a57..b7163a8 100644 --- a/src/client/eppo-client.spec.ts +++ b/src/client/eppo-client.spec.ts @@ -1160,7 +1160,7 @@ describe('Eppo Client constructed with configuration request parameters', () => mock.teardown(); }); - it('Fetches initial configuration', async () => { + it('Fetches initial configuration with parameters in constructor', async () => { client = new EppoClient(storage, requestConfiguration); client.setIsGracefulFailureMode(false); // no configuration loaded @@ -1172,6 +1172,19 @@ describe('Eppo Client constructed with configuration request parameters', () => expect(variation).toBe('green'); }); + it('Fetches initial configuration with parameters provided later', async () => { + client = new EppoClient(storage); + client.setIsGracefulFailureMode(false); + client.setConfigurationRequestParameters(requestConfiguration); + // no configuration loaded + let variation = client.getAssignment(subjectForGreenVariation, flagKey); + expect(variation).toBeNull(); + // have client fetch configurations + await client.fetchFlagConfigurations(); + variation = client.getAssignment(subjectForGreenVariation, flagKey); + expect(variation).toBe('green'); + }); + it.each([ { pollAfterSuccessfulInitialization: false }, { pollAfterSuccessfulInitialization: true }, diff --git a/src/client/eppo-client.ts b/src/client/eppo-client.ts index f4ae8ce..137c0c8 100644 --- a/src/client/eppo-client.ts +++ b/src/client/eppo-client.ts @@ -115,6 +115,10 @@ export interface IEppoClient { useCustomAssignmentCache(cache: AssignmentCache): void; + setConfigurationRequestParameters( + configurationRequestParameters: ExperimentConfigurationRequestParameters, + ): void; + fetchFlagConfigurations(): void; stopPolling(): void; @@ -141,21 +145,27 @@ export default class EppoClient implements IEppoClient { private isGracefulFailureMode = true; private assignmentCache: AssignmentCache | undefined; private configurationStore: IConfigurationStore; - private configurationRequestConfig: ExperimentConfigurationRequestParameters | undefined; + private configurationRequestParameters: ExperimentConfigurationRequestParameters | undefined; private requestPoller: IPoller | undefined; constructor( configurationStore: IConfigurationStore, - configurationRequestConfig?: ExperimentConfigurationRequestParameters, + configurationRequestParameters?: ExperimentConfigurationRequestParameters, ) { this.configurationStore = configurationStore; - this.configurationRequestConfig = configurationRequestConfig; + this.configurationRequestParameters = configurationRequestParameters; + } + + public setConfigurationRequestParameters( + configurationRequestParameters: ExperimentConfigurationRequestParameters, + ) { + this.configurationRequestParameters = configurationRequestParameters; } public async fetchFlagConfigurations() { - if (!this.configurationRequestConfig) { + if (!this.configurationRequestParameters) { throw new Error( - 'Eppo SDK unable to fetch flag configurations without a request configuration', + 'Eppo SDK unable to fetch flag configurations without a configuration request parameters', ); } @@ -165,13 +175,13 @@ export default class EppoClient implements IEppoClient { } const axiosInstance = axios.create({ - baseURL: this.configurationRequestConfig.baseUrl || DEFAULT_BASE_URL, - timeout: this.configurationRequestConfig.requestTimeoutMs || DEFAULT_REQUEST_TIMEOUT_MS, + baseURL: this.configurationRequestParameters.baseUrl || DEFAULT_BASE_URL, + timeout: this.configurationRequestParameters.requestTimeoutMs || DEFAULT_REQUEST_TIMEOUT_MS, }); const httpClient = new HttpClient(axiosInstance, { - apiKey: this.configurationRequestConfig.apiKey, - sdkName: this.configurationRequestConfig.sdkName, - sdkVersion: this.configurationRequestConfig.sdkVersion, + apiKey: this.configurationRequestParameters.apiKey, + sdkName: this.configurationRequestParameters.sdkName, + sdkVersion: this.configurationRequestParameters.sdkVersion, }); const configurationRequestor = new ExperimentConfigurationRequestor( this.configurationStore, @@ -183,16 +193,17 @@ export default class EppoClient implements IEppoClient { configurationRequestor.fetchAndStoreConfigurations.bind(configurationRequestor), { maxStartRetries: - this.configurationRequestConfig.numInitialRequestRetries ?? + this.configurationRequestParameters.numInitialRequestRetries ?? DEFAULT_INITIAL_CONFIG_REQUEST_RETRIES, maxPollRetries: - this.configurationRequestConfig.numPollRequestRetries ?? + this.configurationRequestParameters.numPollRequestRetries ?? DEFAULT_POLL_CONFIG_REQUEST_RETRIES, pollAfterSuccessfulStart: - this.configurationRequestConfig.pollAfterSuccessfulInitialization ?? false, + this.configurationRequestParameters.pollAfterSuccessfulInitialization ?? false, pollAfterFailedStart: - this.configurationRequestConfig.pollAfterFailedInitialization ?? false, - errorOnFailedStart: this.configurationRequestConfig.throwOnFailedInitialization ?? false, + this.configurationRequestParameters.pollAfterFailedInitialization ?? false, + errorOnFailedStart: + this.configurationRequestParameters.throwOnFailedInitialization ?? false, }, ); From 38efbca531fee6c840f2b78ffb855b7422493a9b Mon Sep 17 00:00:00 2001 From: Aaron Silverman Date: Fri, 2 Feb 2024 17:48:58 -0700 Subject: [PATCH 2/2] feedback from PR --- src/client/eppo-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/eppo-client.ts b/src/client/eppo-client.ts index 137c0c8..99405bc 100644 --- a/src/client/eppo-client.ts +++ b/src/client/eppo-client.ts @@ -165,7 +165,7 @@ export default class EppoClient implements IEppoClient { public async fetchFlagConfigurations() { if (!this.configurationRequestParameters) { throw new Error( - 'Eppo SDK unable to fetch flag configurations without a configuration request parameters', + 'Eppo SDK unable to fetch flag configurations without configuration request parameters', ); }