Repository navigation
feat: Support zero and indefinite initialization waiting - #2024
Conversation
Co-Authored-By: rlamb@launchdarkly.com <4955475+kinyoklion@users.noreply.github.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
|
@cursor review |
|
@launchdarkly/js-client-sdk size report |
|
@launchdarkly/js-sdk-common size report |
Co-Authored-By: rlamb@launchdarkly.com <4955475+kinyoklion@users.noreply.github.com>
|
@launchdarkly/js-client-sdk-common size report |
…n waiting Co-Authored-By: rlamb@launchdarkly.com <4955475+kinyoklion@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- <details><summary>node-server-sdk-dynamodb: 6.4.0</summary> ## [6.4.0](node-server-sdk-dynamodb-v6.3.3...node-server-sdk-dynamodb-v6.4.0) (2026-10-13) ### Features * Update store peer dep floor to 9.14.1 to better support error reporting and recovery ([#2097](#2097)) ([1369fa4](1369fa4)) </details> <details><summary>node-server-sdk-redis: 4.4.0</summary> ## [4.4.0](node-server-sdk-redis-v4.3.3...node-server-sdk-redis-v4.4.0) (2026-10-13) ### Features * Update store peer dep floor to 9.14.1 to better support error reporting and recovery ([#2097](#2097)) ([1369fa4](1369fa4)) </details> <details><summary>openfeature-cloudflare-server: 1.0.8</summary> ## [1.0.8](openfeature-cloudflare-server-v1.0.7...openfeature-cloudflare-server-v1.0.8) (2026-10-13) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/openfeature-js-server-common bumped from 2.0.6 to 2.1.0 </details> <details><summary>openfeature-js-server-common: 2.1.0</summary> ## [2.1.0](openfeature-js-server-common-v2.0.6...openfeature-js-server-common-v2.1.0) (2026-10-13) ### Features * Support zero and indefinite initialization waiting ([#2024](#2024)) ([8bfd257](8bfd257)) </details> <details><summary>openfeature-node-server: 2.1.0</summary> ## [2.1.0](openfeature-node-server-v2.0.12...openfeature-node-server-v2.1.0) (2026-10-13) ### Features * Support zero and indefinite initialization waiting ([#2024](#2024)) ([8bfd257](8bfd257)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/openfeature-js-server-common bumped from 2.0.6 to 2.1.0 </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] > **Overview** > Release Please version bump for five packages: manifests, changelogs, `package.json` versions, and example app dependency pins. > > **`@launchdarkly/openfeature-js-server-common` 2.1.0** (and dependent **`openfeature-node-server` 2.1.0**, **`openfeature-cloudflare-server` 1.0.8**) ship support for **zero** and **`'forever'`** provider initialization timeouts via `initTimeoutSeconds`, in addition to the existing numeric default. Node provider updates its reported `wrapperVersion` to `2.1.0`. > > **`node-server-sdk-dynamodb` 6.4.0** and **`node-server-sdk-redis` 4.4.0** are minor releases documenting a raised **minimum `@launchdarkly/node-server-sdk` peer dependency (≥9.14.1)** for store error reporting and recovery alignment. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 4d72062. 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>
Gives the OpenFeature providers the initialization waiting values the OpenFeature provider spec (OFP) requires, which the numeric-only
initTimeoutSecondscould not express.initTimeoutSeconds: 'forever'waits indefinitely for the LaunchDarkly clientinitTimeoutSeconds: 0waits nowhere and fails initialization unless the client is already ready, so readiness is observed through provider eventsImplementation details
Requirements
Related issues
OFP requirement 4.3.4 requires a value distinct from any duration to request waiting indefinitely, and 4.3.6 requires a zero wait to wait nowhere and fail initialization. Sibling changes for the same requirement: launchdarkly/openfeature-java-server#66, launchdarkly/openfeature-python-server#64, launchdarkly/openfeature-dotnet-server#71, launchdarkly/openfeature-ruby-server#36.
Describe the solution you've provided
BaseProviderConfig.initTimeoutSecondsand the Node provider's constructor parameter are nownumber | 'forever', and zero is no longer coalesced into the default, since??only replacesundefined.waitForInitializationtreats a falsy timeout as no timeout, so zero cannot be passed through: initialization races the pending initialization promise against an immediately rejected one, which succeeds only when the client is already ready.The Cloudflare provider is unaffected because it evaluates from a KV namespace and has no data source to wait for.
Describe alternatives you've considered
number | nullwas used initially for the indefinite case;'forever'reads better at the call site and matches the repository's preference for string unions. Addinginitialized()to the client contract would let the zero case be checked directly, but that is a breaking change to a published interface for behavior the existing promise already expresses.Additional context
Verified with
yarn workspace @launchdarkly/openfeature-js-server-common test(82 tests),yarn workspace @launchdarkly/openfeature-node-server test(29 tests), and lint, format and build checks for both packages.Link to Devin session: https://app.devin.ai/sessions/1fd3fcbfe79f482e8b58be29e8df2ffb
Open in Devin Desktop: https://app.devin.ai/desktop/session/1fd3fcbfe79f482e8b58be29e8df2ffb?variant=devin
Requested by: @kinyoklion
Note
Overview
Extends
initTimeoutSecondson the sharedBaseOpenFeatureProviderand the NodeLaunchDarklyProvidertonumber | 'forever', aligning initialization with the OpenFeature provider spec.'forever'callswaitForInitialization()with no timeout.0no longer falls through to the 10-second default (onlyundefineddoes); initialization races the client’s init promise against an immediate failure so it succeeds only when the client is already ready, otherwise it throws a clear error. Positive timeouts behave as before (default 10 seconds).The Node provider README initialization row documents the new values, and unit tests cover indefinite wait, zero-timeout failure, and zero-timeout success when already ready.
Reviewed by Cursor Bugbot for commit 87e9a23. Bugbot is set up for automated code reviews on this repo. Configure here.