Skip to content

feat: FDv2 contract test wiring, suppressions, and example app, cleanup configuration exports.#1225

Merged
kinyoklion merged 94 commits into
mainfrom
rlamb/fdv2-contract-tests-and-example
Mar 26, 2026
Merged

feat: FDv2 contract test wiring, suppressions, and example app, cleanup configuration exports.#1225
kinyoklion merged 94 commits into
mainfrom
rlamb/fdv2-contract-tests-and-example

Conversation

@kinyoklion

@kinyoklion kinyoklion commented Mar 25, 2026

Copy link
Copy Markdown
Member

Summary

  • Add FDv2 config types (SDKConfigConnectionModeConfig, SDKConfigModeDefinition) to contract-test-utils
  • Translate FDv2 connection mode parameters in ClientEntity — maps initialConnectionMode to ManualModeSwitching and customConnectionModes to connectionModes
  • Add test suppressions file for FDv2-specific endpoint changes
  • Include an interactive FDv2 browser example app with polling/streaming mode switching

Note

Medium Risk
Medium risk because it changes how client-side contract tests and SDK option validation/exports represent FDv2 dataSystem configuration, which can affect initialization and endpoint selection. Most changes are additive/internal, plus a new example workspace and test suppressions.

Overview
FDv2 contract tests now accept and translate FDv2 data-system config. ClientEntity maps new dataSystem.connectionModeConfig inputs into SDK dataSystem options (manual initial mode + custom mode table) and propagates per-entry endpoint overrides into legacy baseUri/streamUri for compatibility; it also adjusts useReport handling.

Internal FDv2 config surface is reorganized/clarified. Platform-default types (PlatformDataSystemDefaults) and internal-only fields (InternalDataSystemOptions including foreground/background modes) are moved to datasource/LDClientDataSystemOptions, with validation and tests updated accordingly, and FDv2 datasource types are re-exported from the browser package.

Adds supporting artifacts. Introduces suppressions_datamode_changes.txt for FDv2-specific contract-test expectation drift, adds a new packages/sdk/browser/example-fdv2 workspace with build/test wiring (Playwright) for interactive FDv2 mode/streaming checks, and updates .gitignore and root package.json workspaces.

Written by Cursor Bugbot for commit f3446bf. This will update automatically on new commits. Configure here.

…xtensions

Add InitializerEntry/SynchronizerEntry types for type-safe mode definitions,
refine protocolHandler validation to use isNullish for version/target fields,
add connectionModes config option, split validator arrays for initializers vs
synchronizers, and extend DataManager with optional streaming/flush methods.
Add applyChanges method to FlagManager and FlagPersistence that handles
full replacement, partial upsert, and no-change persistence in a single
call, designed for the FDv2 data path.
Add SourceFactoryProvider that converts declarative InitializerEntry and
SynchronizerEntry config into concrete initializer factories and
synchronizer slots, with support for per-entry endpoint and interval overrides.
…cycle

Add shared data manager that orchestrates FDv2 connection mode switching,
state debouncing, streaming control, and data source lifecycle management.
Implements the DataManager interface with support for foreground/background
modes, forced/automatic streaming, and flush callbacks.
Conditionally use FDv2DataManagerBase when dataSystem config is present,
falling back to BrowserDataManager for FDv1. Update CI bundle size limits
to account for new FDv2 code paths.
Add FDv2 config types to contract-test-utils, translate FDv2 connection
mode parameters in ClientEntity, add test suppressions for FDv2-specific
endpoint changes, and include an interactive FDv2 browser example app.
- Fix ping handler to use per-entry endpoint-overridden requestor and
  the factory's selector getter (sg) for fresh selectors on each ping
- Extract duplicated streaming base config into shared buildStreamingBase helper
- Restructure SourceFactoryContext to group polling/streaming config into
  nested objects (polling.paths, polling.intervalSeconds, streaming.paths,
  streaming.initialReconnectDelaySeconds)
- Resolve merge conflict in FDv2DataSource (warn -> debug)
Adapt factory context construction to use nested polling/streaming config
objects and remove selectorGetter from the context (now passed directly
via factory sg parameter).
Account for new FDv2 SourceFactoryProvider and related code paths.
… checks

Push applyChanges down through the flag manager layers so the FDv2 path
no longer routes through FDv1's upsert (which has version checks and
inactive-context guards). FlagStore.applyPartial inserts without version
comparison, and FlagUpdater.applyChanges sets the active context directly
and emits change events.
…er-apply-changes

# Conflicts:
#	packages/shared/sdk-client/src/datasource/fdv2/FDv2DataSource.ts
…er-base

# Conflicts:
#	packages/shared/sdk-client/src/index.ts
Account for new FDv2 applyChanges code in FlagUpdater/FlagStore that
flows into the browser SDK bundle.
@github-actions

Copy link
Copy Markdown
Contributor

@launchdarkly/js-sdk-common size report
This is the brotli compressed size of the ESM build.
Compressed size: 25661 bytes
Compressed size limit: 29000
Uncompressed size: 126143 bytes

@github-actions

github-actions Bot commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

@launchdarkly/js-client-sdk size report
This is the brotli compressed size of the ESM build.
Compressed size: 31371 bytes
Compressed size limit: 34000
Uncompressed size: 111380 bytes

@github-actions

github-actions Bot commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

@launchdarkly/browser size report
This is the brotli compressed size of the ESM build.
Compressed size: 179146 bytes
Compressed size limit: 200000
Uncompressed size: 828569 bytes

@github-actions

github-actions Bot commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

@launchdarkly/js-client-sdk-common size report
This is the brotli compressed size of the ESM build.
Compressed size: 36775 bytes
Compressed size limit: 38000
Uncompressed size: 201898 bytes

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Temporary app for testing FDv2 functionality.

loadEnvFile('.env') fails when built from the repo root via yarn
workspaces. Use import.meta.url to resolve the path relative to the
config file's directory.
@kinyoklion kinyoklion marked this pull request as ready for review March 25, 2026 22:32
@kinyoklion kinyoklion requested a review from a team as a code owner March 25, 2026 22:32
Comment thread packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts Outdated
Comment thread packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts Outdated
Removed the conditional assignment of payloadFilterKey from options.dataSystem.
Comment thread packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts
Comment thread packages/sdk/browser/example-fdv2/package.json Outdated
Comment thread packages/sdk/browser/example-fdv2/e2e/verify.spec.ts
Comment thread packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts Outdated
Comment thread packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts
- Set serviceEndpoints (streaming/polling/events) unconditionally before
  FDv1/FDv2 branching so FDv2 path always has correct endpoints
- Hoist payloadFilter out of connectionModeConfig block to dataSystem level
- Add proper return types to translate functions (InitializerEntry,
  SynchronizerEntry, ModeDefinition) with type guard filters
- Fix example-fdv2 homepage URL in package.json
- Add temporary file comment to example app
Export InitializerEntry, SynchronizerEntry, ModeDefinition,
ManualModeSwitching, FDv2ConnectionMode, and data source entry types
so users and contract tests can properly type connectionModes config.
…oregroundConnectionMode

- Add EAP disclaimer to all public FDv2 types (FDv2ConnectionMode,
  EndpointConfig, data source entries, ModeDefinition, ManualModeSwitching,
  AutomaticModeSwitchingConfig, LDClientDataSystemOptions)
- Remove backgroundConnectionMode from public LDClientDataSystemOptions
- Move PlatformDataSystemDefaults from api/ to internal datasource/
- Add InternalDataSystemOptions extending the public type with
  backgroundConnectionMode and foregroundConnectionMode (both populated
  from platform defaults, not user-configurable)
- Export FDv2 configuration types from browser SDK common.ts
@kinyoklion kinyoklion changed the title feat: FDv2 contract test wiring, suppressions, and example app feat: FDv2 contract test wiring, suppressions, and example app, cleanup configuration exports. Mar 26, 2026
Comment thread packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts
…connectionModeConfig

Check for options.dataSystem presence (not just connectionModeConfig)
so the SDK activates FDv2 even when the test harness sends
{ useDefaultDataSystem: true } without custom connection modes.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

@kinyoklion kinyoklion merged commit c67c5f6 into main Mar 26, 2026
45 checks passed
@kinyoklion kinyoklion deleted the rlamb/fdv2-contract-tests-and-example branch March 26, 2026 22:57
@github-actions github-actions Bot mentioned this pull request Mar 25, 2026
joker23 pushed a commit that referenced this pull request Apr 14, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>akamai-edgeworker-sdk-common: 2.0.18</summary>

##
[2.0.18](akamai-edgeworker-sdk-common-v2.0.17...akamai-edgeworker-sdk-common-v2.0.18)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-server-sdk-common bumped from ^2.18.3 to ^2.18.4
</details>

<details><summary>akamai-server-base-sdk: 3.0.19</summary>

##
[3.0.19](akamai-server-base-sdk-v3.0.18...akamai-server-base-sdk-v3.0.19)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
* @launchdarkly/akamai-edgeworker-sdk-common bumped from ^2.0.17 to
^2.0.18
    * @launchdarkly/js-server-sdk-common bumped from ^2.18.3 to ^2.18.4
</details>

<details><summary>akamai-server-edgekv-sdk: 1.4.21</summary>

##
[1.4.21](akamai-server-edgekv-sdk-v1.4.20...akamai-server-edgekv-sdk-v1.4.21)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
* @launchdarkly/akamai-edgeworker-sdk-common bumped from ^2.0.17 to
^2.0.18
    * @launchdarkly/js-server-sdk-common bumped from ^2.18.3 to ^2.18.4
</details>

<details><summary>browser: 0.1.14</summary>

##
[0.1.14](browser-v0.1.13...browser-v0.1.14)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-client-sdk bumped from 4.4.1 to 4.5.0
</details>

<details><summary>browser-telemetry: 1.0.30</summary>

##
[1.0.30](browser-telemetry-v1.0.29...browser-telemetry-v1.0.30)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/js-client-sdk bumped from 4.4.1 to 4.5.0
</details>

<details><summary>cloudflare-server-sdk: 2.7.18</summary>

##
[2.7.18](cloudflare-server-sdk-v2.7.17...cloudflare-server-sdk-v2.7.18)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
* @launchdarkly/js-server-sdk-common-edge bumped from 2.6.16 to 2.6.17
</details>

<details><summary>fastly-server-sdk: 0.2.10</summary>

##
[0.2.10](fastly-server-sdk-v0.2.9...fastly-server-sdk-v0.2.10)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-server-sdk-common bumped from 2.18.3 to 2.18.4
</details>

<details><summary>jest: 1.0.9</summary>

##
[1.0.9](jest-v1.0.8...jest-v1.0.9)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
* @launchdarkly/react-native-client-sdk bumped from ~10.15.1 to ~10.15.2
</details>

<details><summary>js-client-sdk: 4.5.0</summary>

##
[4.5.0](js-client-sdk-v4.4.1...js-client-sdk-v4.5.0)
(2026-04-14)


### Features

* add retry logic to FDv2 polling initializer
([#1230](#1230))
([fe8bd37](fe8bd37))
* expose setConnectionMode on browser SDK
([#1232](#1232))
([9019808](9019808))
* FDv2 contract test wiring, suppressions, and example app, cleanup
configuration exports.
([#1225](#1225))
([c67c5f6](c67c5f6))
* wire FDv2 data manager into BrowserClient
([#1222](#1222))
([0b855f0](0b855f0))


### Bug Fixes

* FDv2 - Support dynamic reconnect URL for streaming. Handle 'error'
event types for SSE.
([#1252](#1252))
([4ef6cdd](4ef6cdd))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-client-sdk-common bumped from 1.23.0 to 1.24.0
</details>

<details><summary>js-client-sdk-common: 1.24.0</summary>

##
[1.24.0](js-client-sdk-common-v1.23.0...js-client-sdk-common-v1.24.0)
(2026-04-14)


### Features

* add retry logic to FDv2 polling initializer
([#1230](#1230))
([fe8bd37](fe8bd37))
* expose setConnectionMode on browser SDK
([#1232](#1232))
([9019808](9019808))
* FDv2 contract test wiring, suppressions, and example app, cleanup
configuration exports.
([#1225](#1225))
([c67c5f6](c67c5f6))
* FDv2DataManagerBase for mode switching and data source lifecycle
([#1210](#1210))
([8f8051c](8f8051c))
* support per-mode FDv1 fallback configuration
([#1246](#1246))
([9956bce](9956bce))
* wire FDv2 data manager into BrowserClient
([#1222](#1222))
([0b855f0](0b855f0))


### Bug Fixes

* FDv2 - Support dynamic reconnect URL for streaming. Handle 'error'
event types for SSE.
([#1252](#1252))
([4ef6cdd](4ef6cdd))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-sdk-common bumped from 2.24.0 to 2.24.1
</details>

<details><summary>js-sdk-common: 2.24.1</summary>

##
[2.24.1](js-sdk-common-v2.24.0...js-sdk-common-v2.24.1)
(2026-04-14)


### Bug Fixes

* FDv2 - Support dynamic reconnect URL for streaming. Handle 'error'
event types for SSE.
([#1252](#1252))
([4ef6cdd](4ef6cdd))
</details>

<details><summary>js-server-sdk-common: 2.18.4</summary>

##
[2.18.4](js-server-sdk-common-v2.18.3...js-server-sdk-common-v2.18.4)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-sdk-common bumped from 2.24.0 to 2.24.1
</details>

<details><summary>js-server-sdk-common-edge: 2.6.17</summary>

##
[2.6.17](js-server-sdk-common-edge-v2.6.16...js-server-sdk-common-edge-v2.6.17)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-server-sdk-common bumped from 2.18.3 to 2.18.4
</details>

<details><summary>node-server-sdk: 9.10.11</summary>

##
[9.10.11](node-server-sdk-v9.10.10...node-server-sdk-v9.10.11)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-server-sdk-common bumped from 2.18.3 to 2.18.4
</details>

<details><summary>node-server-sdk-dynamodb: 6.2.23</summary>

##
[6.2.23](node-server-sdk-dynamodb-v6.2.22...node-server-sdk-dynamodb-v6.2.23)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/node-server-sdk bumped from 9.10.10 to 9.10.11
  * peerDependencies
    * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.10.11
</details>

<details><summary>node-server-sdk-otel: 1.3.11</summary>

##
[1.3.11](node-server-sdk-otel-v1.3.10...node-server-sdk-otel-v1.3.11)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/node-server-sdk bumped from 9.10.10 to 9.10.11
  * peerDependencies
    * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.10.11
</details>

<details><summary>node-server-sdk-redis: 4.2.23</summary>

##
[4.2.23](node-server-sdk-redis-v4.2.22...node-server-sdk-redis-v4.2.23)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/node-server-sdk bumped from 9.10.10 to 9.10.11
  * peerDependencies
    * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.10.11
</details>

<details><summary>react-native-client-sdk: 10.15.2</summary>

##
[10.15.2](react-native-client-sdk-v10.15.1...react-native-client-sdk-v10.15.2)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-client-sdk-common bumped from 1.23.0 to 1.24.0
</details>

<details><summary>react-sdk: 0.2.0</summary>

##
[0.2.0](react-sdk-v0.1.1...react-sdk-v0.2.0)
(2026-04-14)


### Features

* adding isomorphic provider to bridge client and server
([#1218](#1218))
([d766f39](d766f39))
* support static client component rendering
([#1227](#1227))
([6b3a100](6b3a100))


### Bug Fixes

* adding wrapper name for react client
([#1199](#1199))
([f92a8f9](f92a8f9))
* **deps:** update dependency next to v16.2.3 [security]
([#1263](#1263))
([10f582a](10f582a))
* **react-sdk:** double evaluation on client side init
([#1229](#1229))
([6a4c42f](6a4c42f))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-client-sdk bumped from ^4.4.1 to ^4.5.0
    * @launchdarkly/js-server-sdk-common bumped from ^2.18.3 to ^2.18.4
</details>

<details><summary>server-sdk-ai: 0.16.8</summary>

##
[0.16.8](server-sdk-ai-v0.16.7...server-sdk-ai-v0.16.8)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/js-server-sdk-common bumped from 2.18.3 to 2.18.4
  * peerDependencies
    * @launchdarkly/js-server-sdk-common bumped from 2.x to 2.18.4
</details>

<details><summary>server-sdk-ai-langchain: 0.5.4</summary>

##
[0.5.4](server-sdk-ai-langchain-v0.5.3...server-sdk-ai-langchain-v0.5.4)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/server-sdk-ai bumped from ^0.16.7 to ^0.16.8
  * peerDependencies
* @launchdarkly/server-sdk-ai bumped from ^0.15.0 || ^0.16.0 to ^0.16.8
</details>

<details><summary>server-sdk-ai-openai: 0.5.4</summary>

##
[0.5.4](server-sdk-ai-openai-v0.5.3...server-sdk-ai-openai-v0.5.4)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/js-server-sdk-common bumped from 2.18.3 to 2.18.4
    * @launchdarkly/server-sdk-ai bumped from ^0.16.7 to ^0.16.8
  * peerDependencies
* @launchdarkly/server-sdk-ai bumped from ^0.15.0 || ^0.16.0 to ^0.16.8
</details>

<details><summary>server-sdk-ai-vercel: 0.5.4</summary>

##
[0.5.4](server-sdk-ai-vercel-v0.5.3...server-sdk-ai-vercel-v0.5.4)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @launchdarkly/server-sdk-ai bumped from ^0.16.7 to ^0.16.8
  * peerDependencies
* @launchdarkly/server-sdk-ai bumped from ^0.15.0 || ^0.16.0 to ^0.16.8
</details>

<details><summary>shopify-oxygen-sdk: 0.1.8</summary>

##
[0.1.8](shopify-oxygen-sdk-v0.1.7...shopify-oxygen-sdk-v0.1.8)
(2026-04-14)


### Bug Fixes

* **shopify:** standardizing the pre-release banner
([#1268](#1268))
([82adddb](82adddb))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/js-server-sdk-common bumped from 2.18.3 to 2.18.4
</details>

<details><summary>vercel-server-sdk: 1.3.43</summary>

##
[1.3.43](vercel-server-sdk-v1.3.42...vercel-server-sdk-v1.3.43)
(2026-04-14)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
* @launchdarkly/js-server-sdk-common-edge bumped from 2.6.16 to 2.6.17
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Primarily automated version/changelog updates across many packages;
the only functional change in-code is updating embedded SDK/version
identifiers, which is low risk but could affect user-agent/wrapper
reporting.
> 
> **Overview**
> Bumps versions and publishes release metadata across the monorepo
(manifest, `package.json`s, and changelogs), including `js-client-sdk`
`4.5.0`, `react-sdk` `0.2.0`, and multiple server/edge/provider
packages.
> 
> Updates embedded `x-release-please-version` constants used for SDK
identification (e.g., `BrowserInfo`, `NodeInfo`, edge platform info) and
updates the React client default `wrapperVersion` to `0.2.0` for
telemetry/user-agent reporting.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
a09a298. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants