From bec6e56f5e406309fe9ea63cb3fc64e14043af1b Mon Sep 17 00:00:00 2001 From: Athira M Date: Fri, 30 May 2025 11:35:57 +0530 Subject: [PATCH 1/7] feat: Process experiment metadata in RC fetch response --- common/api-review/remote-config.api.md | 17 ++++++++++ packages/remote-config/src/api.ts | 1 + .../remote-config/src/client/rest_client.ts | 8 +++-- packages/remote-config/src/public_types.ts | 34 +++++++++++++++++-- packages/remote-config/test/api.test.ts | 12 +++++-- .../test/client/rest_client.test.ts | 24 +++++++++---- .../remote-config/test/remote_config.test.ts | 13 +++++-- 7 files changed, 95 insertions(+), 14 deletions(-) diff --git a/common/api-review/remote-config.api.md b/common/api-review/remote-config.api.md index a9f5131e0bf..29939b3ac5f 100644 --- a/common/api-review/remote-config.api.md +++ b/common/api-review/remote-config.api.md @@ -41,6 +41,7 @@ export function fetchConfig(remoteConfig: RemoteConfig): Promise; export interface FetchResponse { config?: FirebaseRemoteConfigObject; eTag?: string; + experiments?: FirebaseExperimentDescription[]; status: number; templateVersion?: number; } @@ -51,6 +52,22 @@ export type FetchStatus = 'no-fetch-yet' | 'success' | 'failure' | 'throttle'; // @public export type FetchType = 'BASE' | 'REALTIME'; +// @public +export interface FirebaseExperimentDescription { + // (undocumented) + affectedParameterKeys?: string[]; + // (undocumented) + experimentId: string; + // (undocumented) + experimentStartTime: string; + // (undocumented) + timeToLiveMillis: string; + // (undocumented) + triggerTimeoutMillis: string; + // (undocumented) + variantId: string; +} + // @public export interface FirebaseRemoteConfigObject { // (undocumented) diff --git a/packages/remote-config/src/api.ts b/packages/remote-config/src/api.ts index 62dc2697a64..6647db90c41 100644 --- a/packages/remote-config/src/api.ts +++ b/packages/remote-config/src/api.ts @@ -102,6 +102,7 @@ export async function activate(remoteConfig: RemoteConfig): Promise { if ( !lastSuccessfulFetchResponse || !lastSuccessfulFetchResponse.config || + !lastSuccessfulFetchResponse.experiments || !lastSuccessfulFetchResponse.eTag || !lastSuccessfulFetchResponse.templateVersion || lastSuccessfulFetchResponse.eTag === activeConfigEtag diff --git a/packages/remote-config/src/client/rest_client.ts b/packages/remote-config/src/client/rest_client.ts index 42b0cab27c6..d5b0be92c3e 100644 --- a/packages/remote-config/src/client/rest_client.ts +++ b/packages/remote-config/src/client/rest_client.ts @@ -18,7 +18,8 @@ import { CustomSignals, FetchResponse, - FirebaseRemoteConfigObject + FirebaseRemoteConfigObject, + FirebaseExperimentDescription } from '../public_types'; import { RemoteConfigFetchClient, @@ -143,6 +144,7 @@ export class RestClient implements RemoteConfigFetchClient { let config: FirebaseRemoteConfigObject | undefined; let state: string | undefined; let templateVersion: number | undefined; + let experiments: FirebaseExperimentDescription[] | undefined; // JSON parsing throws SyntaxError if the response body isn't a JSON string. // Requesting application/json and checking for a 200 ensures there's JSON data. @@ -158,6 +160,7 @@ export class RestClient implements RemoteConfigFetchClient { config = responseBody['entries']; state = responseBody['state']; templateVersion = responseBody['templateVersion']; + experiments = responseBody['experimentDescriptions']; } // Normalizes based on legacy state. @@ -168,6 +171,7 @@ export class RestClient implements RemoteConfigFetchClient { } else if (state === 'NO_TEMPLATE' || state === 'EMPTY_CONFIG') { // These cases can be fixed remotely, so normalize to safe value. config = {}; + experiments = []; } // Normalize to exception-based control flow for non-success cases. @@ -180,6 +184,6 @@ export class RestClient implements RemoteConfigFetchClient { }); } - return { status, eTag: responseEtag, config, templateVersion }; + return { status, eTag: responseEtag, config, templateVersion, experiments }; } } diff --git a/packages/remote-config/src/public_types.ts b/packages/remote-config/src/public_types.ts index 964726a51f4..f87807c6cc8 100644 --- a/packages/remote-config/src/public_types.ts +++ b/packages/remote-config/src/public_types.ts @@ -59,6 +59,32 @@ export interface FirebaseRemoteConfigObject { [key: string]: string; } +/** + * Defines experiment and variant attached to a config parameter. + */ +export interface FirebaseExperimentDescription { + // A string of max length 22 characters and of format: _exp_ + experimentId: string; + + // The variant of the experiment assigned to the app instance. + variantId: string; + + // When the experiment was started. + experimentStartTime: string; + + // How long the experiment can remain in STANDBY state. Valid range from 1 ms + // to 6 months. + triggerTimeoutMillis: string; + + // How long the experiment can remain in ON state. Valid range from 1 ms to 6 + // months. + timeToLiveMillis: string; + + // A repeated of Remote Config parameter keys that this experiment is + // affecting the value of. + affectedParameterKeys?: string[]; +} + /** * Defines a successful response (200 or 304). * @@ -99,8 +125,12 @@ export interface FetchResponse { */ templateVersion?: number; - // Note: we're not extracting experiment metadata until - // ABT and Analytics have Web SDKs. + /** + * A/B Test and Rollout experiment metadata. + * + *

Only defined for 200 responses. + */ + experiments?: FirebaseExperimentDescription[]; } /** diff --git a/packages/remote-config/test/api.test.ts b/packages/remote-config/test/api.test.ts index f38b4ca0bee..6c6b6a9db2b 100644 --- a/packages/remote-config/test/api.test.ts +++ b/packages/remote-config/test/api.test.ts @@ -68,7 +68,14 @@ describe('Remote Config API', () => { status: 200, eTag: 'asdf', config: { 'foobar': 'hello world' }, - templateVersion: 1 + templateVersion: 1, + experiments: [{ + experimentId: "_exp_1", + variantId : "1", + experimentStartTime : "2025-04-06T14:13:57.597Z", + triggerTimeoutMillis : "15552000000", + timeToLiveMillis : "15552000000" + }] }; let fetchStub: sinon.SinonStub; @@ -106,7 +113,8 @@ describe('Remote Config API', () => { Promise.resolve({ entries: response.config, state: 'OK', - templateVersion: response.templateVersion + templateVersion: response.templateVersion, + experimentDescriptions: response.experiments, }) } as Response) ); diff --git a/packages/remote-config/test/client/rest_client.test.ts b/packages/remote-config/test/client/rest_client.test.ts index bda6fbce01a..7d7d7dd5b36 100644 --- a/packages/remote-config/test/client/rest_client.test.ts +++ b/packages/remote-config/test/client/rest_client.test.ts @@ -78,7 +78,14 @@ describe('RestClient', () => { eTag: 'etag', state: 'UPDATE', entries: { color: 'sparkling' }, - templateVersion: 1 + templateVersion: 1, + experimentDescriptions: [{ + experimentId: "_exp_1", + variantId : "1", + experimentStartTime : "2025-04-06T14:13:57.597Z", + triggerTimeoutMillis : "15552000000", + timeToLiveMillis : "15552000000" + }] }; fetchStub.returns( @@ -90,7 +97,8 @@ describe('RestClient', () => { Promise.resolve({ entries: expectedResponse.entries, state: expectedResponse.state, - templateVersion: expectedResponse.templateVersion + templateVersion: expectedResponse.templateVersion, + experimentDescriptions: expectedResponse.experimentDescriptions }) } as Response) ); @@ -101,7 +109,8 @@ describe('RestClient', () => { status: expectedResponse.status, eTag: expectedResponse.eTag, config: expectedResponse.entries, - templateVersion: expectedResponse.templateVersion + templateVersion: expectedResponse.templateVersion, + experiments: expectedResponse.experimentDescriptions }); }); @@ -191,7 +200,8 @@ describe('RestClient', () => { status: 304, eTag: 'response-etag', config: undefined, - templateVersion: undefined + templateVersion: undefined, + experiments: undefined }); }); @@ -230,7 +240,8 @@ describe('RestClient', () => { status: 304, eTag: 'etag', config: undefined, - templateVersion: undefined + templateVersion: undefined, + experiments: undefined }); }); @@ -248,7 +259,8 @@ describe('RestClient', () => { status: 200, eTag: 'etag', config: {}, - templateVersion: undefined + templateVersion: undefined, + experiments: [] }); } }); diff --git a/packages/remote-config/test/remote_config.test.ts b/packages/remote-config/test/remote_config.test.ts index 1cc6b62717e..1494667740f 100644 --- a/packages/remote-config/test/remote_config.test.ts +++ b/packages/remote-config/test/remote_config.test.ts @@ -391,6 +391,13 @@ describe('RemoteConfig', () => { const CONFIG = { key: 'val' }; const NEW_ETAG = 'new_etag'; const TEMPLATE_VERSION = 1; + const EXPERIMENTS = [{ + "experimentId" : "_exp_1", + "variantId" : "1", + "experimentStartTime" : "2025-04-06T14:13:57.597Z", + "triggerTimeoutMillis" : "15552000000", + "timeToLiveMillis" : "15552000000" + }]; let getLastSuccessfulFetchResponseStub: sinon.SinonStub; let getActiveConfigEtagStub: sinon.SinonStub; @@ -456,7 +463,8 @@ describe('RemoteConfig', () => { Promise.resolve({ config: CONFIG, eTag: NEW_ETAG, - templateVersion: TEMPLATE_VERSION + templateVersion: TEMPLATE_VERSION, + experiments: EXPERIMENTS }) ); getActiveConfigEtagStub.returns(Promise.resolve(ETAG)); @@ -476,7 +484,8 @@ describe('RemoteConfig', () => { Promise.resolve({ config: CONFIG, eTag: NEW_ETAG, - templateVersion: TEMPLATE_VERSION + templateVersion: TEMPLATE_VERSION, + experiments: EXPERIMENTS }) ); getActiveConfigEtagStub.returns(Promise.resolve()); From ee703b9a362e8b4c6a77b52cf549ef00f3e3b94c Mon Sep 17 00:00:00 2001 From: Athira M Date: Sat, 19 Jul 2025 08:18:43 +0530 Subject: [PATCH 2/7] [Fix] Storage cache is not updating when there are no experiments in response --- packages/remote-config/src/api.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/remote-config/src/api.ts b/packages/remote-config/src/api.ts index 6647db90c41..62dc2697a64 100644 --- a/packages/remote-config/src/api.ts +++ b/packages/remote-config/src/api.ts @@ -102,7 +102,6 @@ export async function activate(remoteConfig: RemoteConfig): Promise { if ( !lastSuccessfulFetchResponse || !lastSuccessfulFetchResponse.config || - !lastSuccessfulFetchResponse.experiments || !lastSuccessfulFetchResponse.eTag || !lastSuccessfulFetchResponse.templateVersion || lastSuccessfulFetchResponse.eTag === activeConfigEtag From 7c67f85fcc0f9670e7dc3b3e386a484045655096 Mon Sep 17 00:00:00 2001 From: Athira M Date: Thu, 25 Sep 2025 11:13:37 +0530 Subject: [PATCH 3/7] Add result of running yarn docgen:all --- docs-devsite/_toc.yaml | 2 + docs-devsite/remote-config.fetchresponse.md | 13 ++++ ...te-config.firebaseexperimentdescription.md | 78 +++++++++++++++++++ docs-devsite/remote-config.md | 1 + packages/remote-config/src/public_types.ts | 2 +- packages/remote-config/test/api.test.ts | 18 +++-- .../test/client/rest_client.test.ts | 16 ++-- .../remote-config/test/remote_config.test.ts | 16 ++-- 8 files changed, 123 insertions(+), 23 deletions(-) create mode 100644 docs-devsite/remote-config.firebaseexperimentdescription.md diff --git a/docs-devsite/_toc.yaml b/docs-devsite/_toc.yaml index 364d5b992c9..14611a7639d 100644 --- a/docs-devsite/_toc.yaml +++ b/docs-devsite/_toc.yaml @@ -649,6 +649,8 @@ toc: path: /docs/reference/js/remote-config.customsignals.md - title: FetchResponse path: /docs/reference/js/remote-config.fetchresponse.md + - title: FirebaseExperimentDescription + path: /docs/reference/js/remote-config.firebaseexperimentdescription.md - title: FirebaseRemoteConfigObject path: /docs/reference/js/remote-config.firebaseremoteconfigobject.md - title: RemoteConfig diff --git a/docs-devsite/remote-config.fetchresponse.md b/docs-devsite/remote-config.fetchresponse.md index 1955dd47492..e43c5c6b30b 100644 --- a/docs-devsite/remote-config.fetchresponse.md +++ b/docs-devsite/remote-config.fetchresponse.md @@ -26,6 +26,7 @@ export interface FetchResponse | --- | --- | --- | | [config](./remote-config.fetchresponse.md#fetchresponseconfig) | [FirebaseRemoteConfigObject](./remote-config.firebaseremoteconfigobject.md#firebaseremoteconfigobject_interface) | Defines the map of parameters returned as "entries" in the fetch response body.

Only defined for 200 responses. | | [eTag](./remote-config.fetchresponse.md#fetchresponseetag) | string | Defines the ETag response header value.

Only defined for 200 and 304 responses. | +| [experiments](./remote-config.fetchresponse.md#fetchresponseexperiments) | [FirebaseExperimentDescription](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescription_interface)\[\] | A/B Test and Rollout experiment metadata.

Only defined for 200 responses. | | [status](./remote-config.fetchresponse.md#fetchresponsestatus) | number | The HTTP status, which is useful for differentiating success responses with data from those without.

The Remote Config client is modeled after the native Fetch interface, so HTTP status is first-class.

Disambiguation: the fetch response returns a legacy "state" value that is redundant with the HTTP status code. The former is normalized into the latter. | | [templateVersion](./remote-config.fetchresponse.md#fetchresponsetemplateversion) | number | The version number of the config template fetched from the server. | @@ -53,6 +54,18 @@ Defines the ETag response header value. eTag?: string; ``` +## FetchResponse.experiments + +A/B Test and Rollout experiment metadata. + +

Only defined for 200 responses. + +Signature: + +```typescript +experiments?: FirebaseExperimentDescription[]; +``` + ## FetchResponse.status The HTTP status, which is useful for differentiating success responses with data from those without. diff --git a/docs-devsite/remote-config.firebaseexperimentdescription.md b/docs-devsite/remote-config.firebaseexperimentdescription.md new file mode 100644 index 00000000000..24c70690a2d --- /dev/null +++ b/docs-devsite/remote-config.firebaseexperimentdescription.md @@ -0,0 +1,78 @@ +Project: /docs/reference/js/_project.yaml +Book: /docs/reference/_book.yaml +page_type: reference + +{% comment %} +DO NOT EDIT THIS FILE! +This is generated by the JS SDK team, and any local changes will be +overwritten. Changes should be made in the source code at +https://github.com/firebase/firebase-js-sdk +{% endcomment %} + +# FirebaseExperimentDescription interface +Defines experiment and variant attached to a config parameter. + +Signature: + +```typescript +export interface FirebaseExperimentDescription +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [affectedParameterKeys](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionaffectedparameterkeys) | string\[\] | | +| [experimentId](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionexperimentid) | string | | +| [experimentStartTime](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionexperimentstarttime) | string | | +| [timeToLiveMillis](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptiontimetolivemillis) | string | | +| [triggerTimeoutMillis](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptiontriggertimeoutmillis) | string | | +| [variantId](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionvariantid) | string | | + +## FirebaseExperimentDescription.affectedParameterKeys + +Signature: + +```typescript +affectedParameterKeys?: string[]; +``` + +## FirebaseExperimentDescription.experimentId + +Signature: + +```typescript +experimentId: string; +``` + +## FirebaseExperimentDescription.experimentStartTime + +Signature: + +```typescript +experimentStartTime: string; +``` + +## FirebaseExperimentDescription.timeToLiveMillis + +Signature: + +```typescript +timeToLiveMillis: string; +``` + +## FirebaseExperimentDescription.triggerTimeoutMillis + +Signature: + +```typescript +triggerTimeoutMillis: string; +``` + +## FirebaseExperimentDescription.variantId + +Signature: + +```typescript +variantId: string; +``` diff --git a/docs-devsite/remote-config.md b/docs-devsite/remote-config.md index c9f803abf16..c3b5e4b5bf8 100644 --- a/docs-devsite/remote-config.md +++ b/docs-devsite/remote-config.md @@ -42,6 +42,7 @@ The Firebase Remote Config Web SDK. This SDK does not work in a Node.js environm | [ConfigUpdateObserver](./remote-config.configupdateobserver.md#configupdateobserver_interface) | Observer interface for receiving real-time Remote Config update notifications.NOTE: Although an complete callback can be provided, it will never be called because the ConfigUpdate stream is never-ending. | | [CustomSignals](./remote-config.customsignals.md#customsignals_interface) | Defines the type for representing custom signals and their values.

The values in CustomSignals must be one of the following types:

  • string
  • number
  • null
| | [FetchResponse](./remote-config.fetchresponse.md#fetchresponse_interface) | Defines a successful response (200 or 304).

Modeled after the native Response interface, but simplified for Remote Config's use case. | +| [FirebaseExperimentDescription](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescription_interface) | Defines experiment and variant attached to a config parameter. | | [FirebaseRemoteConfigObject](./remote-config.firebaseremoteconfigobject.md#firebaseremoteconfigobject_interface) | Defines a self-descriptive reference for config key-value pairs. | | [RemoteConfig](./remote-config.remoteconfig.md#remoteconfig_interface) | The Firebase Remote Config service interface. | | [RemoteConfigOptions](./remote-config.remoteconfigoptions.md#remoteconfigoptions_interface) | Options for Remote Config initialization. | diff --git a/packages/remote-config/src/public_types.ts b/packages/remote-config/src/public_types.ts index f87807c6cc8..7f8da56d91d 100644 --- a/packages/remote-config/src/public_types.ts +++ b/packages/remote-config/src/public_types.ts @@ -127,7 +127,7 @@ export interface FetchResponse { /** * A/B Test and Rollout experiment metadata. - * + * *

Only defined for 200 responses. */ experiments?: FirebaseExperimentDescription[]; diff --git a/packages/remote-config/test/api.test.ts b/packages/remote-config/test/api.test.ts index 6c6b6a9db2b..54679199a8e 100644 --- a/packages/remote-config/test/api.test.ts +++ b/packages/remote-config/test/api.test.ts @@ -69,13 +69,15 @@ describe('Remote Config API', () => { eTag: 'asdf', config: { 'foobar': 'hello world' }, templateVersion: 1, - experiments: [{ - experimentId: "_exp_1", - variantId : "1", - experimentStartTime : "2025-04-06T14:13:57.597Z", - triggerTimeoutMillis : "15552000000", - timeToLiveMillis : "15552000000" - }] + experiments: [ + { + experimentId: '_exp_1', + variantId: '1', + experimentStartTime: '2025-04-06T14:13:57.597Z', + triggerTimeoutMillis: '15552000000', + timeToLiveMillis: '15552000000' + } + ] }; let fetchStub: sinon.SinonStub; @@ -114,7 +116,7 @@ describe('Remote Config API', () => { entries: response.config, state: 'OK', templateVersion: response.templateVersion, - experimentDescriptions: response.experiments, + experimentDescriptions: response.experiments }) } as Response) ); diff --git a/packages/remote-config/test/client/rest_client.test.ts b/packages/remote-config/test/client/rest_client.test.ts index 7d7d7dd5b36..d2284c4f8c9 100644 --- a/packages/remote-config/test/client/rest_client.test.ts +++ b/packages/remote-config/test/client/rest_client.test.ts @@ -79,13 +79,15 @@ describe('RestClient', () => { state: 'UPDATE', entries: { color: 'sparkling' }, templateVersion: 1, - experimentDescriptions: [{ - experimentId: "_exp_1", - variantId : "1", - experimentStartTime : "2025-04-06T14:13:57.597Z", - triggerTimeoutMillis : "15552000000", - timeToLiveMillis : "15552000000" - }] + experimentDescriptions: [ + { + experimentId: '_exp_1', + variantId: '1', + experimentStartTime: '2025-04-06T14:13:57.597Z', + triggerTimeoutMillis: '15552000000', + timeToLiveMillis: '15552000000' + } + ] }; fetchStub.returns( diff --git a/packages/remote-config/test/remote_config.test.ts b/packages/remote-config/test/remote_config.test.ts index 1494667740f..44c105079b9 100644 --- a/packages/remote-config/test/remote_config.test.ts +++ b/packages/remote-config/test/remote_config.test.ts @@ -391,13 +391,15 @@ describe('RemoteConfig', () => { const CONFIG = { key: 'val' }; const NEW_ETAG = 'new_etag'; const TEMPLATE_VERSION = 1; - const EXPERIMENTS = [{ - "experimentId" : "_exp_1", - "variantId" : "1", - "experimentStartTime" : "2025-04-06T14:13:57.597Z", - "triggerTimeoutMillis" : "15552000000", - "timeToLiveMillis" : "15552000000" - }]; + const EXPERIMENTS = [ + { + 'experimentId': '_exp_1', + 'variantId': '1', + 'experimentStartTime': '2025-04-06T14:13:57.597Z', + 'triggerTimeoutMillis': '15552000000', + 'timeToLiveMillis': '15552000000' + } + ]; let getLastSuccessfulFetchResponseStub: sinon.SinonStub; let getActiveConfigEtagStub: sinon.SinonStub; From b2896365b07755bd0adea0608d966f46fd12c3c0 Mon Sep 17 00:00:00 2001 From: Athira M Date: Thu, 25 Sep 2025 23:02:43 +0530 Subject: [PATCH 4/7] Address review comments --- common/api-review/remote-config.api.md | 17 +--- docs-devsite/_toc.yaml | 2 - docs-devsite/remote-config.fetchresponse.md | 4 +- ...te-config.firebaseexperimentdescription.md | 78 ------------------- docs-devsite/remote-config.md | 3 +- docs-devsite/remote-config.remoteconfig.md | 2 +- .../remote-config/src/client/rest_client.ts | 27 ++++++- packages/remote-config/src/public_types.ts | 31 +------- 8 files changed, 35 insertions(+), 129 deletions(-) delete mode 100644 docs-devsite/remote-config.firebaseexperimentdescription.md diff --git a/common/api-review/remote-config.api.md b/common/api-review/remote-config.api.md index 29939b3ac5f..58639bfca5f 100644 --- a/common/api-review/remote-config.api.md +++ b/common/api-review/remote-config.api.md @@ -41,6 +41,7 @@ export function fetchConfig(remoteConfig: RemoteConfig): Promise; export interface FetchResponse { config?: FirebaseRemoteConfigObject; eTag?: string; + // Warning: (ae-forgotten-export) The symbol "FirebaseExperimentDescription" needs to be exported by the entry point index.d.ts experiments?: FirebaseExperimentDescription[]; status: number; templateVersion?: number; @@ -52,22 +53,6 @@ export type FetchStatus = 'no-fetch-yet' | 'success' | 'failure' | 'throttle'; // @public export type FetchType = 'BASE' | 'REALTIME'; -// @public -export interface FirebaseExperimentDescription { - // (undocumented) - affectedParameterKeys?: string[]; - // (undocumented) - experimentId: string; - // (undocumented) - experimentStartTime: string; - // (undocumented) - timeToLiveMillis: string; - // (undocumented) - triggerTimeoutMillis: string; - // (undocumented) - variantId: string; -} - // @public export interface FirebaseRemoteConfigObject { // (undocumented) diff --git a/docs-devsite/_toc.yaml b/docs-devsite/_toc.yaml index 14611a7639d..364d5b992c9 100644 --- a/docs-devsite/_toc.yaml +++ b/docs-devsite/_toc.yaml @@ -649,8 +649,6 @@ toc: path: /docs/reference/js/remote-config.customsignals.md - title: FetchResponse path: /docs/reference/js/remote-config.fetchresponse.md - - title: FirebaseExperimentDescription - path: /docs/reference/js/remote-config.firebaseexperimentdescription.md - title: FirebaseRemoteConfigObject path: /docs/reference/js/remote-config.firebaseremoteconfigobject.md - title: RemoteConfig diff --git a/docs-devsite/remote-config.fetchresponse.md b/docs-devsite/remote-config.fetchresponse.md index e43c5c6b30b..615eba4789f 100644 --- a/docs-devsite/remote-config.fetchresponse.md +++ b/docs-devsite/remote-config.fetchresponse.md @@ -26,7 +26,7 @@ export interface FetchResponse | --- | --- | --- | | [config](./remote-config.fetchresponse.md#fetchresponseconfig) | [FirebaseRemoteConfigObject](./remote-config.firebaseremoteconfigobject.md#firebaseremoteconfigobject_interface) | Defines the map of parameters returned as "entries" in the fetch response body.

Only defined for 200 responses. | | [eTag](./remote-config.fetchresponse.md#fetchresponseetag) | string | Defines the ETag response header value.

Only defined for 200 and 304 responses. | -| [experiments](./remote-config.fetchresponse.md#fetchresponseexperiments) | [FirebaseExperimentDescription](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescription_interface)\[\] | A/B Test and Rollout experiment metadata.

Only defined for 200 responses. | +| [experiments](./remote-config.fetchresponse.md#fetchresponseexperiments) | FirebaseExperimentDescription\[\] | A/B Test and Rollout experiment metadata. | | [status](./remote-config.fetchresponse.md#fetchresponsestatus) | number | The HTTP status, which is useful for differentiating success responses with data from those without.

The Remote Config client is modeled after the native Fetch interface, so HTTP status is first-class.

Disambiguation: the fetch response returns a legacy "state" value that is redundant with the HTTP status code. The former is normalized into the latter. | | [templateVersion](./remote-config.fetchresponse.md#fetchresponsetemplateversion) | number | The version number of the config template fetched from the server. | @@ -58,7 +58,7 @@ eTag?: string; A/B Test and Rollout experiment metadata. -

Only defined for 200 responses. +Only defined for 200 responses. Signature: diff --git a/docs-devsite/remote-config.firebaseexperimentdescription.md b/docs-devsite/remote-config.firebaseexperimentdescription.md deleted file mode 100644 index 24c70690a2d..00000000000 --- a/docs-devsite/remote-config.firebaseexperimentdescription.md +++ /dev/null @@ -1,78 +0,0 @@ -Project: /docs/reference/js/_project.yaml -Book: /docs/reference/_book.yaml -page_type: reference - -{% comment %} -DO NOT EDIT THIS FILE! -This is generated by the JS SDK team, and any local changes will be -overwritten. Changes should be made in the source code at -https://github.com/firebase/firebase-js-sdk -{% endcomment %} - -# FirebaseExperimentDescription interface -Defines experiment and variant attached to a config parameter. - -Signature: - -```typescript -export interface FirebaseExperimentDescription -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [affectedParameterKeys](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionaffectedparameterkeys) | string\[\] | | -| [experimentId](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionexperimentid) | string | | -| [experimentStartTime](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionexperimentstarttime) | string | | -| [timeToLiveMillis](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptiontimetolivemillis) | string | | -| [triggerTimeoutMillis](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptiontriggertimeoutmillis) | string | | -| [variantId](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionvariantid) | string | | - -## FirebaseExperimentDescription.affectedParameterKeys - -Signature: - -```typescript -affectedParameterKeys?: string[]; -``` - -## FirebaseExperimentDescription.experimentId - -Signature: - -```typescript -experimentId: string; -``` - -## FirebaseExperimentDescription.experimentStartTime - -Signature: - -```typescript -experimentStartTime: string; -``` - -## FirebaseExperimentDescription.timeToLiveMillis - -Signature: - -```typescript -timeToLiveMillis: string; -``` - -## FirebaseExperimentDescription.triggerTimeoutMillis - -Signature: - -```typescript -triggerTimeoutMillis: string; -``` - -## FirebaseExperimentDescription.variantId - -Signature: - -```typescript -variantId: string; -``` diff --git a/docs-devsite/remote-config.md b/docs-devsite/remote-config.md index c3b5e4b5bf8..0c85a761fe5 100644 --- a/docs-devsite/remote-config.md +++ b/docs-devsite/remote-config.md @@ -42,9 +42,8 @@ The Firebase Remote Config Web SDK. This SDK does not work in a Node.js environm | [ConfigUpdateObserver](./remote-config.configupdateobserver.md#configupdateobserver_interface) | Observer interface for receiving real-time Remote Config update notifications.NOTE: Although an complete callback can be provided, it will never be called because the ConfigUpdate stream is never-ending. | | [CustomSignals](./remote-config.customsignals.md#customsignals_interface) | Defines the type for representing custom signals and their values.

The values in CustomSignals must be one of the following types:

  • string
  • number
  • null
| | [FetchResponse](./remote-config.fetchresponse.md#fetchresponse_interface) | Defines a successful response (200 or 304).

Modeled after the native Response interface, but simplified for Remote Config's use case. | -| [FirebaseExperimentDescription](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescription_interface) | Defines experiment and variant attached to a config parameter. | | [FirebaseRemoteConfigObject](./remote-config.firebaseremoteconfigobject.md#firebaseremoteconfigobject_interface) | Defines a self-descriptive reference for config key-value pairs. | -| [RemoteConfig](./remote-config.remoteconfig.md#remoteconfig_interface) | The Firebase Remote Config service interface. | +| [RemoteConfig](./remote-config.remoteconfig.md#remoteconfig_interface) | /\*\* The Firebase Remote Config service interface. | | [RemoteConfigOptions](./remote-config.remoteconfigoptions.md#remoteconfigoptions_interface) | Options for Remote Config initialization. | | [RemoteConfigSettings](./remote-config.remoteconfigsettings.md#remoteconfigsettings_interface) | Defines configuration options for the Remote Config SDK. | | [Value](./remote-config.value.md#value_interface) | Wraps a value with metadata and type-safe getters. | diff --git a/docs-devsite/remote-config.remoteconfig.md b/docs-devsite/remote-config.remoteconfig.md index 3f4f0688b13..643166ef3a2 100644 --- a/docs-devsite/remote-config.remoteconfig.md +++ b/docs-devsite/remote-config.remoteconfig.md @@ -10,7 +10,7 @@ https://github.com/firebase/firebase-js-sdk {% endcomment %} # RemoteConfig interface -The Firebase Remote Config service interface. +/\*\* The Firebase Remote Config service interface. Signature: diff --git a/packages/remote-config/src/client/rest_client.ts b/packages/remote-config/src/client/rest_client.ts index d5b0be92c3e..035fa93d18a 100644 --- a/packages/remote-config/src/client/rest_client.ts +++ b/packages/remote-config/src/client/rest_client.ts @@ -19,7 +19,6 @@ import { CustomSignals, FetchResponse, FirebaseRemoteConfigObject, - FirebaseExperimentDescription } from '../public_types'; import { RemoteConfigFetchClient, @@ -49,6 +48,32 @@ interface FetchRequestBody { /* eslint-enable camelcase */ } +/** + * Defines experiment and variant attached to a config parameter. + */ +export interface FirebaseExperimentDescription { + // A string of max length 22 characters and of format: _exp_ + experimentId: string; + + // The variant of the experiment assigned to the app instance. + variantId: string; + + // When the experiment was started. + experimentStartTime: string; + + // How long the experiment can remain in STANDBY state. Valid range from 1 ms + // to 6 months. + triggerTimeoutMillis: string; + + // How long the experiment can remain in ON state. Valid range from 1 ms to 6 + // months. + timeToLiveMillis: string; + + // A repeated of Remote Config parameter keys that this experiment is + // affecting the value of. + affectedParameterKeys?: string[]; +} + /** * Implements the Client abstraction for the Remote Config REST API. */ diff --git a/packages/remote-config/src/public_types.ts b/packages/remote-config/src/public_types.ts index 7f8da56d91d..2013a09a807 100644 --- a/packages/remote-config/src/public_types.ts +++ b/packages/remote-config/src/public_types.ts @@ -16,6 +16,9 @@ */ import { FirebaseApp, FirebaseError } from '@firebase/app'; +import { FirebaseExperimentDescription } from './client/rest_client'; + +/** /** * The Firebase Remote Config service interface. @@ -59,32 +62,6 @@ export interface FirebaseRemoteConfigObject { [key: string]: string; } -/** - * Defines experiment and variant attached to a config parameter. - */ -export interface FirebaseExperimentDescription { - // A string of max length 22 characters and of format: _exp_ - experimentId: string; - - // The variant of the experiment assigned to the app instance. - variantId: string; - - // When the experiment was started. - experimentStartTime: string; - - // How long the experiment can remain in STANDBY state. Valid range from 1 ms - // to 6 months. - triggerTimeoutMillis: string; - - // How long the experiment can remain in ON state. Valid range from 1 ms to 6 - // months. - timeToLiveMillis: string; - - // A repeated of Remote Config parameter keys that this experiment is - // affecting the value of. - affectedParameterKeys?: string[]; -} - /** * Defines a successful response (200 or 304). * @@ -128,7 +105,7 @@ export interface FetchResponse { /** * A/B Test and Rollout experiment metadata. * - *

Only defined for 200 responses. + * @remarks Only defined for 200 responses. */ experiments?: FirebaseExperimentDescription[]; } From d3e0838b0554d33ce12fc173edcbc7d425a67ac5 Mon Sep 17 00:00:00 2001 From: Athira M Date: Thu, 25 Sep 2025 23:05:24 +0530 Subject: [PATCH 5/7] Fix yarn format failures --- packages/remote-config/src/client/rest_client.ts | 2 +- packages/remote-config/src/public_types.ts | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/remote-config/src/client/rest_client.ts b/packages/remote-config/src/client/rest_client.ts index 035fa93d18a..804261349f5 100644 --- a/packages/remote-config/src/client/rest_client.ts +++ b/packages/remote-config/src/client/rest_client.ts @@ -18,7 +18,7 @@ import { CustomSignals, FetchResponse, - FirebaseRemoteConfigObject, + FirebaseRemoteConfigObject } from '../public_types'; import { RemoteConfigFetchClient, diff --git a/packages/remote-config/src/public_types.ts b/packages/remote-config/src/public_types.ts index 2013a09a807..dfde983baab 100644 --- a/packages/remote-config/src/public_types.ts +++ b/packages/remote-config/src/public_types.ts @@ -18,8 +18,6 @@ import { FirebaseApp, FirebaseError } from '@firebase/app'; import { FirebaseExperimentDescription } from './client/rest_client'; -/** - /** * The Firebase Remote Config service interface. * From aa7751e7c3e35ea724edef7ea26b02f89f8bc35c Mon Sep 17 00:00:00 2001 From: Athira M Date: Thu, 25 Sep 2025 23:23:49 +0530 Subject: [PATCH 6/7] yarn docgen changes added --- docs-devsite/remote-config.md | 2 +- docs-devsite/remote-config.remoteconfig.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-devsite/remote-config.md b/docs-devsite/remote-config.md index 0c85a761fe5..c9f803abf16 100644 --- a/docs-devsite/remote-config.md +++ b/docs-devsite/remote-config.md @@ -43,7 +43,7 @@ The Firebase Remote Config Web SDK. This SDK does not work in a Node.js environm | [CustomSignals](./remote-config.customsignals.md#customsignals_interface) | Defines the type for representing custom signals and their values.

The values in CustomSignals must be one of the following types:

  • string
  • number
  • null
| | [FetchResponse](./remote-config.fetchresponse.md#fetchresponse_interface) | Defines a successful response (200 or 304).

Modeled after the native Response interface, but simplified for Remote Config's use case. | | [FirebaseRemoteConfigObject](./remote-config.firebaseremoteconfigobject.md#firebaseremoteconfigobject_interface) | Defines a self-descriptive reference for config key-value pairs. | -| [RemoteConfig](./remote-config.remoteconfig.md#remoteconfig_interface) | /\*\* The Firebase Remote Config service interface. | +| [RemoteConfig](./remote-config.remoteconfig.md#remoteconfig_interface) | The Firebase Remote Config service interface. | | [RemoteConfigOptions](./remote-config.remoteconfigoptions.md#remoteconfigoptions_interface) | Options for Remote Config initialization. | | [RemoteConfigSettings](./remote-config.remoteconfigsettings.md#remoteconfigsettings_interface) | Defines configuration options for the Remote Config SDK. | | [Value](./remote-config.value.md#value_interface) | Wraps a value with metadata and type-safe getters. | diff --git a/docs-devsite/remote-config.remoteconfig.md b/docs-devsite/remote-config.remoteconfig.md index 643166ef3a2..3f4f0688b13 100644 --- a/docs-devsite/remote-config.remoteconfig.md +++ b/docs-devsite/remote-config.remoteconfig.md @@ -10,7 +10,7 @@ https://github.com/firebase/firebase-js-sdk {% endcomment %} # RemoteConfig interface -/\*\* The Firebase Remote Config service interface. +The Firebase Remote Config service interface. Signature: From 19c0fd6eb3eb0c2672e2b03cf171f4740cf7a07b Mon Sep 17 00:00:00 2001 From: Athira M Date: Fri, 26 Sep 2025 06:29:58 +0530 Subject: [PATCH 7/7] Export firebaseExperimentDescription --- common/api-review/remote-config.api.md | 17 +++- docs-devsite/_toc.yaml | 2 + docs-devsite/remote-config.fetchresponse.md | 2 +- ...te-config.firebaseexperimentdescription.md | 78 +++++++++++++++++++ docs-devsite/remote-config.md | 1 + .../remote-config/src/client/rest_client.ts | 29 +------ packages/remote-config/src/public_types.ts | 29 ++++++- 7 files changed, 128 insertions(+), 30 deletions(-) create mode 100644 docs-devsite/remote-config.firebaseexperimentdescription.md diff --git a/common/api-review/remote-config.api.md b/common/api-review/remote-config.api.md index 58639bfca5f..29939b3ac5f 100644 --- a/common/api-review/remote-config.api.md +++ b/common/api-review/remote-config.api.md @@ -41,7 +41,6 @@ export function fetchConfig(remoteConfig: RemoteConfig): Promise; export interface FetchResponse { config?: FirebaseRemoteConfigObject; eTag?: string; - // Warning: (ae-forgotten-export) The symbol "FirebaseExperimentDescription" needs to be exported by the entry point index.d.ts experiments?: FirebaseExperimentDescription[]; status: number; templateVersion?: number; @@ -53,6 +52,22 @@ export type FetchStatus = 'no-fetch-yet' | 'success' | 'failure' | 'throttle'; // @public export type FetchType = 'BASE' | 'REALTIME'; +// @public +export interface FirebaseExperimentDescription { + // (undocumented) + affectedParameterKeys?: string[]; + // (undocumented) + experimentId: string; + // (undocumented) + experimentStartTime: string; + // (undocumented) + timeToLiveMillis: string; + // (undocumented) + triggerTimeoutMillis: string; + // (undocumented) + variantId: string; +} + // @public export interface FirebaseRemoteConfigObject { // (undocumented) diff --git a/docs-devsite/_toc.yaml b/docs-devsite/_toc.yaml index 364d5b992c9..14611a7639d 100644 --- a/docs-devsite/_toc.yaml +++ b/docs-devsite/_toc.yaml @@ -649,6 +649,8 @@ toc: path: /docs/reference/js/remote-config.customsignals.md - title: FetchResponse path: /docs/reference/js/remote-config.fetchresponse.md + - title: FirebaseExperimentDescription + path: /docs/reference/js/remote-config.firebaseexperimentdescription.md - title: FirebaseRemoteConfigObject path: /docs/reference/js/remote-config.firebaseremoteconfigobject.md - title: RemoteConfig diff --git a/docs-devsite/remote-config.fetchresponse.md b/docs-devsite/remote-config.fetchresponse.md index 615eba4789f..a2b94047132 100644 --- a/docs-devsite/remote-config.fetchresponse.md +++ b/docs-devsite/remote-config.fetchresponse.md @@ -26,7 +26,7 @@ export interface FetchResponse | --- | --- | --- | | [config](./remote-config.fetchresponse.md#fetchresponseconfig) | [FirebaseRemoteConfigObject](./remote-config.firebaseremoteconfigobject.md#firebaseremoteconfigobject_interface) | Defines the map of parameters returned as "entries" in the fetch response body.

Only defined for 200 responses. | | [eTag](./remote-config.fetchresponse.md#fetchresponseetag) | string | Defines the ETag response header value.

Only defined for 200 and 304 responses. | -| [experiments](./remote-config.fetchresponse.md#fetchresponseexperiments) | FirebaseExperimentDescription\[\] | A/B Test and Rollout experiment metadata. | +| [experiments](./remote-config.fetchresponse.md#fetchresponseexperiments) | [FirebaseExperimentDescription](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescription_interface)\[\] | A/B Test and Rollout experiment metadata. | | [status](./remote-config.fetchresponse.md#fetchresponsestatus) | number | The HTTP status, which is useful for differentiating success responses with data from those without.

The Remote Config client is modeled after the native Fetch interface, so HTTP status is first-class.

Disambiguation: the fetch response returns a legacy "state" value that is redundant with the HTTP status code. The former is normalized into the latter. | | [templateVersion](./remote-config.fetchresponse.md#fetchresponsetemplateversion) | number | The version number of the config template fetched from the server. | diff --git a/docs-devsite/remote-config.firebaseexperimentdescription.md b/docs-devsite/remote-config.firebaseexperimentdescription.md new file mode 100644 index 00000000000..24c70690a2d --- /dev/null +++ b/docs-devsite/remote-config.firebaseexperimentdescription.md @@ -0,0 +1,78 @@ +Project: /docs/reference/js/_project.yaml +Book: /docs/reference/_book.yaml +page_type: reference + +{% comment %} +DO NOT EDIT THIS FILE! +This is generated by the JS SDK team, and any local changes will be +overwritten. Changes should be made in the source code at +https://github.com/firebase/firebase-js-sdk +{% endcomment %} + +# FirebaseExperimentDescription interface +Defines experiment and variant attached to a config parameter. + +Signature: + +```typescript +export interface FirebaseExperimentDescription +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [affectedParameterKeys](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionaffectedparameterkeys) | string\[\] | | +| [experimentId](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionexperimentid) | string | | +| [experimentStartTime](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionexperimentstarttime) | string | | +| [timeToLiveMillis](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptiontimetolivemillis) | string | | +| [triggerTimeoutMillis](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptiontriggertimeoutmillis) | string | | +| [variantId](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescriptionvariantid) | string | | + +## FirebaseExperimentDescription.affectedParameterKeys + +Signature: + +```typescript +affectedParameterKeys?: string[]; +``` + +## FirebaseExperimentDescription.experimentId + +Signature: + +```typescript +experimentId: string; +``` + +## FirebaseExperimentDescription.experimentStartTime + +Signature: + +```typescript +experimentStartTime: string; +``` + +## FirebaseExperimentDescription.timeToLiveMillis + +Signature: + +```typescript +timeToLiveMillis: string; +``` + +## FirebaseExperimentDescription.triggerTimeoutMillis + +Signature: + +```typescript +triggerTimeoutMillis: string; +``` + +## FirebaseExperimentDescription.variantId + +Signature: + +```typescript +variantId: string; +``` diff --git a/docs-devsite/remote-config.md b/docs-devsite/remote-config.md index c9f803abf16..c3b5e4b5bf8 100644 --- a/docs-devsite/remote-config.md +++ b/docs-devsite/remote-config.md @@ -42,6 +42,7 @@ The Firebase Remote Config Web SDK. This SDK does not work in a Node.js environm | [ConfigUpdateObserver](./remote-config.configupdateobserver.md#configupdateobserver_interface) | Observer interface for receiving real-time Remote Config update notifications.NOTE: Although an complete callback can be provided, it will never be called because the ConfigUpdate stream is never-ending. | | [CustomSignals](./remote-config.customsignals.md#customsignals_interface) | Defines the type for representing custom signals and their values.

The values in CustomSignals must be one of the following types:

  • string
  • number
  • null
| | [FetchResponse](./remote-config.fetchresponse.md#fetchresponse_interface) | Defines a successful response (200 or 304).

Modeled after the native Response interface, but simplified for Remote Config's use case. | +| [FirebaseExperimentDescription](./remote-config.firebaseexperimentdescription.md#firebaseexperimentdescription_interface) | Defines experiment and variant attached to a config parameter. | | [FirebaseRemoteConfigObject](./remote-config.firebaseremoteconfigobject.md#firebaseremoteconfigobject_interface) | Defines a self-descriptive reference for config key-value pairs. | | [RemoteConfig](./remote-config.remoteconfig.md#remoteconfig_interface) | The Firebase Remote Config service interface. | | [RemoteConfigOptions](./remote-config.remoteconfigoptions.md#remoteconfigoptions_interface) | Options for Remote Config initialization. | diff --git a/packages/remote-config/src/client/rest_client.ts b/packages/remote-config/src/client/rest_client.ts index 804261349f5..d5b0be92c3e 100644 --- a/packages/remote-config/src/client/rest_client.ts +++ b/packages/remote-config/src/client/rest_client.ts @@ -18,7 +18,8 @@ import { CustomSignals, FetchResponse, - FirebaseRemoteConfigObject + FirebaseRemoteConfigObject, + FirebaseExperimentDescription } from '../public_types'; import { RemoteConfigFetchClient, @@ -48,32 +49,6 @@ interface FetchRequestBody { /* eslint-enable camelcase */ } -/** - * Defines experiment and variant attached to a config parameter. - */ -export interface FirebaseExperimentDescription { - // A string of max length 22 characters and of format: _exp_ - experimentId: string; - - // The variant of the experiment assigned to the app instance. - variantId: string; - - // When the experiment was started. - experimentStartTime: string; - - // How long the experiment can remain in STANDBY state. Valid range from 1 ms - // to 6 months. - triggerTimeoutMillis: string; - - // How long the experiment can remain in ON state. Valid range from 1 ms to 6 - // months. - timeToLiveMillis: string; - - // A repeated of Remote Config parameter keys that this experiment is - // affecting the value of. - affectedParameterKeys?: string[]; -} - /** * Implements the Client abstraction for the Remote Config REST API. */ diff --git a/packages/remote-config/src/public_types.ts b/packages/remote-config/src/public_types.ts index dfde983baab..015e510973a 100644 --- a/packages/remote-config/src/public_types.ts +++ b/packages/remote-config/src/public_types.ts @@ -16,7 +16,6 @@ */ import { FirebaseApp, FirebaseError } from '@firebase/app'; -import { FirebaseExperimentDescription } from './client/rest_client'; /** * The Firebase Remote Config service interface. @@ -60,6 +59,34 @@ export interface FirebaseRemoteConfigObject { [key: string]: string; } +/** + * Defines experiment and variant attached to a config parameter. + * + * @public + */ +export interface FirebaseExperimentDescription { + // A string of max length 22 characters and of format: _exp_ + experimentId: string; + + // The variant of the experiment assigned to the app instance. + variantId: string; + + // When the experiment was started. + experimentStartTime: string; + + // How long the experiment can remain in STANDBY state. Valid range from 1 ms + // to 6 months. + triggerTimeoutMillis: string; + + // How long the experiment can remain in ON state. Valid range from 1 ms to 6 + // months. + timeToLiveMillis: string; + + // A repeated of Remote Config parameter keys that this experiment is + // affecting the value of. + affectedParameterKeys?: string[]; +} + /** * Defines a successful response (200 or 304). *