chore: adds connection mode resolution and source factories#265
Open
tanderson-ld wants to merge 14 commits into
Open
chore: adds connection mode resolution and source factories#265tanderson-ld wants to merge 14 commits into
tanderson-ld wants to merge 14 commits into
Conversation
Implements the four building blocks Phase 3 needs from Stream A: - calculate_poll_delay.dart: pure helper. Given freshness and interval, returns the time remaining in the interval; zero when overdue; full interval when there's no prior freshness or the freshness is in the future (clock skew clamp). - polling_initializer.dart: one-shot Initializer. Calls the injected PollFunction up to 3 times. ChangeSetResult and terminal status results return immediately. Interrupted results retry after a 1s delay. After 3 interrupted attempts the last is escalated to terminalError so the orchestrator stops retrying at this layer. close() interrupts a pending retry delay and yields shutdown. - polling_synchronizer.dart: long-lived Synchronizer. Single- subscription StreamController that polls immediately on subscribe, then schedules subsequent polls via calculatePollDelay over the freshness of the most recent successful result. Interrupted results pass through but do not advance freshness, so a transient failure does not delay the catch-up poll. Injected TimerFactory and now() for deterministic tests. - cache_initializer.dart: Initializer that reads the persistence cache via an injected CachedFlagsReader. Cache hit emits a full ChangeSetResult with persist=false and an empty selector (the cache does not track server-side selector state). Cache miss or reader exception emits a none-type ChangeSetResult so the initializer chain advances. The reader typedef leaves the actual persistence wiring to the orchestrator (Phase C1). PollFunction, DelayFunction, TimerFactory, and CachedFlagsReader are typedefs rather than concrete dependencies so the orchestrator can wire real implementations and tests can inject scripted ones, mirroring the abstraction style established in SDK-2183.
- polling_synchronizer: replace `bool _closed` with `Completer<void> _stoppedSignal` to match the polling initializer and have a single source of truth for closed-ness. Drop the redundant `_controller.isClosed` checks (the signal is set before the controller is closed, so the signal check covers both cases). Replace `Future<void>.microtask(_doPoll)` in onListen with `unawaited(_doPoll())` -- the microtask wrapping was unnecessary; fire-and-forget of an async function is what unawaited expresses. - polling_synchronizer: fix typo in the unexpected-throw message: "raised unexpectedly" -> "raised error unexpectedly". - calculate_poll_delay: split the run-on docstring describing the null-freshness and overdue-freshness cases into two separate sentences for readability. - cache_initializer: reword the awkward parenthetical "(the data came from the cache; writing it back is a no-op)" to "(the data is already cached)".
…king branch 'origin' into ta/SDK-2187/connection-mode-and-resolution
tanderson-ld
commented
May 6, 2026
Contributor
Author
|
Need to bench test to confirm no regressions in connection manager wrt event flushing. |
…tion to drive status reporting
2275df1 to
2f1cd6e
Compare
Contributor
Author
|
Need to investigate broken tests. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default mode and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit d8bce6d. Configure here.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Requirements
Note
Medium Risk
Updates connection-mode APIs across common + Flutter clients (including a new
backgroundmode and resolved offline reasons), which can change runtime connectivity/status behavior for apps relying on previous mode/network handling.Overview
Adds a new
ConnectionMode.backgroundplus aResolvedConnectionModemodel (ResolvedOfflinewithOfflineDetail) so callers can distinguish why the SDK is offline (explicit offline vs network unavailable vs background updates disabled).Refactors
DataSourceManager/LDCommonClientto accept resolved modes and to map offline details to specificDataSourceStates, while extending default data source factories to include a background polling configuration.Introduces FDv2 mode plumbing (
ModeDefinition, built-in modes,SourceFactoryContext, entry→factory builders) and a configurable automatic mode-resolution table (resolveMode+ Flutter default table) that the FlutterConnectionManagernow uses, along with platform-specific defaults for app/network event handling and background-slot selection. Tests are added/updated to cover the new resolution behavior and factories.Reviewed by Cursor Bugbot for commit d9b11ac. Bugbot is set up for automated code reviews on this repo. Configure here.