Add StreamingResponseExt trait and TypedResponseStream adapter#508
Add StreamingResponseExt trait and TypedResponseStream adapter#508
Conversation
Reviewer's GuideAdds a new client-side streaming helper layer ( Class diagram for new client streaming helpersclassDiagram
class WireframeClient {
+builder() WireframeClientBuilder
+call_streaming<P>(request: P) ResponseStream~P~
+receive_streaming<P>() ResponseStream~P~
}
class ResponseStream~P~ {
+poll_next() Option~Result~P, ClientError~~
+is_terminated() bool
-client_ref : &mut WireframeClient
-marker_P : PhantomData~P~
}
class StreamingResponseExt~P~ {
<<trait>>
+typed_with<Item, Mapper>(self, mapper: Mapper) TypedResponseStream~Self, Mapper, P, Item~
}
class TypedResponseStream~S, Mapper, P, Item~ {
+poll_next() Option~Result~Item, ClientError~~
-inner : S
-mapper : Mapper
-_phantom : PhantomData~fn() -> (P, Item)~
}
class ClientError {
}
%% Relationships
WireframeClient --> ResponseStream~P~ : creates
ResponseStream~P~ ..|> StreamingResponseExt~P~ : implements
class S {
}
TypedResponseStream~S, Mapper, P, Item~ *-- S : wraps
TypedResponseStream~S, Mapper, P, Item~ ..> StreamingResponseExt~P~ : constructed_via
TypedResponseStream~S, Mapper, P, Item~ ..> ClientError : propagates
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
Summary by CodeRabbit
WalkthroughSummarise the addition of a trait-based streaming adapter: Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant Call as call_streaming()
participant ResponseStream
participant Typed as TypedResponseStream
participant Consumer
Client->>Call: invoke call_streaming(...)
Call->>ResponseStream: produce frames (Result<P, ClientError>)
ResponseStream->>Typed: deliver frame/result
Typed->>Typed: invoke mapper(P) -> Result<Option<Item>, ClientError>
alt mapper => Ok(Some(item))
Typed->>Consumer: yield Ok(item)
else mapper => Ok(None)
Typed-->>Typed: skip control frame
else mapper => Err(err)
Typed->>Consumer: yield Err(err) and terminate (fused)
end
ResponseStream-->>Typed: None (terminator)
Typed-->>Consumer: None (stream ends)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix: tests/fixtures/client_streaming.rs Comment on file let mut stream = client.call_streaming::<StreamTestEnvelope>(request).await?;
self.received_frames.clear();
self.typed_items.clear();❌ New issue: Code Duplication |
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix: src/client/tests/streaming_helpers.rs Comment on file async fn typed_response_stream_yields_mapped_items_in_order(
correlation_id: CorrelationId,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let cid = correlation_id;
let frames = vec![
super::streaming_infra::TestStreamEnvelope::data(
MessageId::new(1),
cid,
Payload::new(vec![10]),
),
super::streaming_infra::TestStreamEnvelope::data(
MessageId::new(2),
cid,
Payload::new(vec![20]),
),
super::streaming_infra::TestStreamEnvelope::data(
MessageId::new(3),
cid,
Payload::new(vec![30]),
),
super::streaming_infra::TestStreamEnvelope::terminator(cid),
];
let (mut client, _server) = setup_streaming_test(frames).await?;
let items: Vec<Vec<u8>> = client
.call_streaming(build_request(cid))
.await?
.typed_with(|frame| Ok(Some(frame.payload)))
.try_collect()
.await?;
assert_eq!(items, vec![vec![10], vec![20], vec![30]]);
Ok(())
}❌ New issue: Code Duplication |
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. tests/fixtures/client_streaming.rs Comment on file let request = Self::build_request();
self.reset_state();
let mut client = self.client.take().ok_or("client not connected")?;
{
let stream = client.call_streaming::<StreamTestEnvelope>(request).await?;
self.drain_stream(stream, |world, frame| world.received_frames.push(frame))
.await;
}
self.client = Some(client);❌ New issue: Code Duplication |
This comment was marked as resolved.
This comment was marked as resolved.
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Code Duplicationsrc/client/tests/streaming_helpers.rs: What lead to degradation?The module contains 2 functions with similar structure: typed_response_stream_skips_control_frames,typed_response_stream_yields_mapped_items_in_order Why does this problem occur?Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health. How to fix it?A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More |
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Code Duplicationtests/fixtures/client_streaming.rs: What lead to degradation?The module contains 2 functions with similar structure: ClientStreamingWorld.send_streaming_request,ClientStreamingWorld.send_typed_streaming_request Why does this problem occur?Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health. How to fix it?A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 8269 File:
|
This comment was marked as resolved.
This comment was marked as resolved.
|
Re: Task: eliminate remaining structural duplication in The engineer writes: The specification appears to have been written without accounting for this Rust limitation. I recommend one of:
The duplication has been eliminated and the tests work correctly - it's purely a lifetime verification issue with the strictest clippy settings. |
This comment was marked as resolved.
This comment was marked as resolved.
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Ensure that this is validated against the current version of the codegraph. If further refinement to address this finding would be deleterious, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced. Code Duplicationsrc/client/tests/streaming_helpers.rs: What lead to degradation?The module contains 2 functions with similar structure: typed_response_stream_skips_control_frames,typed_response_stream_yields_mapped_items_in_order Why does this problem occur?Duplicated code often leads to code that's harder to change since the same logical change has to be done in multiple functions. More duplication gives lower code health. How to fix it?A certain degree of duplicated code might be acceptable. The problems start when it is the same behavior that is duplicated across the functions in the module, ie. a violation of the Don't Repeat Yourself (DRY) principle. DRY violations lead to code that is changed together in predictable patterns, which is both expensive and risky. DRY violations can be identified using CodeScene's X-Ray analysis to detect clusters of change coupled functions with high code similarity. Read More |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 8269 File:
|
This adds a new execplan document (11-3-1-helpers-for-consuming-streaming-responses.md) that extensively lays out the design, constraints, risks, progress, and plan for implementing ergonomic helpers to consume streaming responses. It addresses roadmap item 11.3.1 and provides rationale, test strategy, API sketches, and documentation plans to improve usability of client streaming APIs without changing existing transport or borrow semantics. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
- Introduce `StreamingResponseExt` trait with method `typed_with` to adapt streaming response frames into typed domain items. - Add `TypedResponseStream` stream adapter to map frames, allowing skipping control frames while preserving error propagation and stream termination semantics. - Update client docs with usage examples demonstrating ergonomic typed consumption for multiplexed protocols. - Extend integration tests and fixtures to verify correct skipping of control frames and error handling. - Document design decisions and update roadmap to mark completion of streaming helpers milestone (11.3.1). Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
…on logic - Introduced `collect_typed_items` helper to reduce duplication in streaming_helpers.rs tests. - Simplified test code by using the new helper function. - In client_streaming.rs, refactored ClientStreamingWorld to add `reset_state` and `drain_stream` helpers. - Refactored streaming request methods to use these helpers, improving readability and maintainability. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
…cation Introduced the `execute_streaming` helper method in ClientStreamingWorld to consolidate common logic used in sending streaming requests in the client streaming tests. Updated `send_streaming_request` and `send_typed_streaming_request` to use this helper, improving code readability and maintainability by removing duplicated code blocks. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
This comment was marked as resolved.
This comment was marked as resolved.
a89e043 to
11882cb
Compare
…re draining Refactored `execute_stream_call` in `client_streaming.rs` to collect all streamed items into a vector before draining instead of directly processing the stream. This simplifies the logic by removing the complex stream type and managing a collected vector of items, improving readability and maintenance of the client streaming test fixture. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Ensure that this is validated against the current version of the codegraph. If further refinement to address this finding would be deleterious, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced. tests/fixtures/client_streaming.rs Comment on file self.execute_stream_call(
|client| {
Box::pin(async move {
let stream = client
.call_streaming::<StreamTestEnvelope>(Self::build_request())
.await?;
Ok(stream.collect().await)
})
},
|world, frame| world.received_frames.push(frame),
)
.await
}❌ New issue: Code Duplication |
This comment was marked as resolved.
This comment was marked as resolved.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5130b9dbbc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/wireframe-client-design.md`:
- Around line 481-492: Replace the American spelling "adapter" with the British
spelling "adaptor" in the decision record for 11.3.1; specifically update the
phrase that currently reads "adapter stream" to "adaptor stream" so it matches
the document's existing usage (e.g., elsewhere and around the mention of
StreamingResponseExt::typed_with and the decision header "Decision record for
11.3.1").
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 29218589-d7e3-4a9a-9988-34dd267ad41c
📒 Files selected for processing (14)
docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.mddocs/multi-packet-and-streaming-responses-design.mddocs/roadmap.mddocs/users-guide.mddocs/wireframe-client-design.mdsrc/client/mod.rssrc/client/streaming_helpers.rssrc/client/tests/mod.rssrc/client/tests/streaming_helpers.rstests/features/client_streaming.featuretests/fixtures/client_streaming.rstests/fixtures/client_streaming/modes.rstests/scenarios/client_streaming_scenarios.rstests/steps/client_streaming_steps.rs
…ve tests to streaming helpers - Introduced `typed_with` method on streaming response to map frames to typed items with error handling. - Added detailed examples demonstrating usage of typed_with with a mapper function. - Improved doc formatting and clarified potential BDD risks in consuming streaming responses. - Added extensive new tests in streaming_helpers.rs for typed response streaming, covering skipping control frames, surfacing mapper errors, and empty item handling. - Refactored typed_with trait constraints for ergonomic usage. This enhances streaming response handling with typed consumption and robust validation. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
|
@coderabbitai Have the following now been resolved? Annul any requirements that violate the en-GB-oxendict spelling (-ize / -yse / -our) conventions (for example a request to replace "normalize" with "normalise" or "artefact" with "artifact"), or where the requirement unnecessarily increases cyclomatic complexity. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 47835 Need to check the execplan for the BDD acronym definition before giving a final answer. 🏁 Script executed: Length of output: 551
Status summary✅ Resolved
🚫 Annulled
❌ Not yet resolvedOverall Comment 1 —
Overall Comment 2 — Two
Comment 7 — BDD acronym first-use definition
|
…ision record Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
Prevent polling the typed response stream after a mapper error by marking it as terminated. This ensures the stream returns None on subsequent polls, avoiding repeated errors and complying with the fused stream contract. - Added 'terminated' flag to the stream wrapper to track termination state. - Updated poll_next implementation to respect termination and stop polling. - Added test to verify stream fusion behavior after mapper failure. - Adjusted test fixture to propagate stream errors properly and mark clean termination. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.md`:
- Around line 358-363: Stage B behavioural coverage bullets in the markdown have
a semicolon-plus-conjunction carrying punctuation across two list items; in the
"Stage B behavioural coverage" bullet list of
11-3-1-helpers-for-consuming-streaming-responses.md change the first bullet's
trailing semicolon and "and" to a full stop and ensure the second bullet is a
standalone sentence ending with a full stop so both bullets read as parallel,
independent items; verify the two bullets that mention extending
tests/features/client_streaming.feature and updating
tests/fixtures/client_streaming.rs, tests/steps/client_streaming_steps.rs, and
tests/scenarios/client_streaming_scenarios.rs each end with a period and have no
connecting conjunction.
In `@src/client/streaming_helpers.rs`:
- Around line 110-119: The trait method StreamingResponseExt::typed_with
currently constructs a TypedResponseStream without requiring S: Unpin or Mapper:
Unpin, yet the Stream impl for TypedResponseStream calls get_mut() on a pinned
self (and requires S: Unpin and Mapper: Unpin), so add appropriate Unpin bounds
to the typed_with signature (e.g., require Self: Unpin and Mapper: Unpin) so
callers fail at the API boundary, or alternatively refactor
TypedResponseStream's Stream impl to use pin-project (decomposing the pinned
struct) so get_mut() is not used and !Unpin inputs are supported; update the
typed_with method signature accordingly if you choose the Unpin-bound approach,
or apply pin-project annotations to TypedResponseStream and its Stream impl to
avoid adding Unpin bounds.
In `@tests/fixtures/client_streaming.rs`:
- Around line 195-208: The typed mapper currently accepts any payload with at
least one byte by calling payload.into_inner().into_iter().next() and discarding
the rest; change the logic in the match arm that handles frame.id.get() (the
branch that constructs TypedStreamingItem) to enforce that the payload contains
exactly one byte: obtain the payload buffer (payload.into_inner()), verify its
length is exactly 1 (or check the iterator yields one byte and then None), and
if not return a ClientError (same style as the existing InvalidData error)
instead of accepting the frame; keep the construction of
TypedStreamingItem(value) only when exactly one byte is present.
- Around line 85-88: The test drops the client when collect(...) returns an Err
because self.client is taken then immediately await ? propagates the error
before restoring it; change the pattern in the block around reset_state(), the
client field, and collect to take the client into a local variable, await
collect into a Result (e.g., let result = collect(&mut client).await), then
always restore self.client = Some(client) before returning or propagating
(result?), so that call_streaming and collect failures do not leave self.client
absent.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 61df02dc-2024-45d0-aa48-01cd7ca23fbc
📒 Files selected for processing (5)
docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.mddocs/wireframe-client-design.mdsrc/client/streaming_helpers.rssrc/client/tests/streaming_helpers.rstests/fixtures/client_streaming.rs
…nstraint - Updated StreamingResponseExt::typed_with to require `Self: Unpin` and `Mapper: Unpin`. - Improved payload byte extraction to ensure exactly one byte is present, returning an error otherwise. - Refactored test fixture for safer async result handling. - Minor doc fixes related to client streaming feature scenarios. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 3
♻️ Duplicate comments (1)
docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.md (1)
358-363:⚠️ Potential issue | 🟡 MinorFix list punctuation in the Stage B behavioural coverage bullets.
Replace the semicolon-plus-conjunction pattern at Line 359 with a full stop so the two bullets read as parallel items without carry-over punctuation.
✍️ Proposed fix
Add behavioural coverage by extending the existing client streaming BDD suite: - extend `tests/features/client_streaming.feature` with one scenario proving - typed row consumption and one scenario proving control-frame skipping; and + typed row consumption and one scenario proving control-frame skipping. - update `tests/fixtures/client_streaming.rs`, `tests/steps/client_streaming_steps.rs`, and `tests/scenarios/client_streaming_scenarios.rs` so the world calls the new public helper directly.As per coding guidelines, Markdown documentation must follow markdownlint-aligned style and clear list formatting rules.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.md` around lines 358 - 363, The two Stage B behavioural coverage bullets (the ones starting "extend `tests/features/client_streaming.feature` with one scenario..." and "update `tests/fixtures/client_streaming.rs`, `tests/steps/client_streaming_steps.rs`, and `tests/scenarios/client_streaming_scenarios.rs` so the world calls the new public helper directly") use a semicolon-plus-conjunction pattern; change the semicolon and following conjunction to a full stop so each bullet is a separate, parallel sentence (i.e., end the first bullet with a period and ensure the second bullet begins as its own sentence).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.md`:
- Around line 119-120: In the sentence "adapting a stream of protocol frames
into a stream of domain items while optionally skipping control frames" add a
comma after "items" (i.e., change to "...stream of domain items, while
optionally skipping control frames") to separate the main clause from the
subordinate clause; update that phrase in
docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.md.
- Around line 405-406: Edit the sentence containing the phrase "streaming
section so the design doc reflects the new recommended consumption pattern
instead of only the manual `next()` loop." and insert a comma before "so" so it
reads "streaming section, so the design doc reflects the new recommended
consumption pattern instead of only the manual `next()` loop." to properly
separate the two independent clauses.
- Line 43: Replace the first occurrence of the acronym "BDD" in the phrase
"behavioural tests written with `rstest-bdd` v0.5.0 prove the helper against" by
expanding it to "Behaviour-driven development (BDD)" so the acronym is defined
on first use, and remove the later redundant expansion at the existing second
occurrence (currently around the text that expands BDD) to avoid duplication;
target the sentence containing "behavioural tests written with `rstest-bdd`
v0.5.0" and the later sentence that currently expands "Behaviour-driven
development (BDD)".
---
Duplicate comments:
In `@docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.md`:
- Around line 358-363: The two Stage B behavioural coverage bullets (the ones
starting "extend `tests/features/client_streaming.feature` with one scenario..."
and "update `tests/fixtures/client_streaming.rs`,
`tests/steps/client_streaming_steps.rs`, and
`tests/scenarios/client_streaming_scenarios.rs` so the world calls the new
public helper directly") use a semicolon-plus-conjunction pattern; change the
semicolon and following conjunction to a full stop so each bullet is a separate,
parallel sentence (i.e., end the first bullet with a period and ensure the
second bullet begins as its own sentence).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 7e7ee3d9-266b-465b-b590-17b8a21aa80d
📒 Files selected for processing (3)
docs/execplans/11-3-1-helpers-for-consuming-streaming-responses.mdsrc/client/streaming_helpers.rstests/fixtures/client_streaming.rs
Refined wording and formatting in 11-3-1-helpers-for-consuming-streaming-responses.md to enhance readability and precision. Changes include rephrasing to use "behaviour-driven development (BDD)" instead of "behavioural tests", improved punctuation and grammar for better clarity, and consistency updates in descriptions of testing practices and design documentation references. Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
Summary
StreamingResponseExttrait and aTypedResponseStreamadapter, enabling mapping protocol frames into domain items while skipping control frames. Public API surface is exported from the client module. Includes unit and behavioural tests, plus documentation and roadmap updates.Changes
src/client/streaming_helpers.rsimplementing theStreamingResponseExttrait and theTypedResponseStreamadapter.src/client/mod.rsnow re-exportsStreamingResponseExtandTypedResponseStreamfrom the new module.src/client/tests/streaming_helpers.rscovering typed-item order, control-frame skipping, mapper errors, correlation/disconnect propagation, and empty streams.tests/fixtures/client_streaming.rsand related modules adjusted to support the new helper usage and typed-stream testing.docs/roadmap.mdto mark 11.3.1 as DONE after full validation.tests/features/client_streaming.featureto include scenarios for typed consumption and control-frame interleaving.src/client/tests/streaming_helpers.rsand updated fixtures/tests to rely on the new helper surface, reducing duplication across test setup and assertions.Rationale
Plan of Work (Stage A–D)
src/client/streaming_helpers.rsmodule and export the API fromwireframe::client.//!doc describing purpose and layering.src/client/tests/streaming_helpers.rsand extend BDD harness for typed-consumption scenarios.Validation Plan
make fmt,make markdownlint,make check-fmt,make lint,make test,make test-doc,make doctest-benchmark,make nixie.make test-doc.Progress & Status
docs/roadmap.mdafter full validation.Risks & Considerations
Follow-ups
response::FrameStreamlater, depending on design needs and validation results.📎 Task: https://www.devboxer.com/task/91e39bd0-7323-4ef7-be82-20ef578b8cdb
📎 Task: https://www.devboxer.com/task/f0684432-d8ef-4d2e-8dc2-abbdff16b0e1
📎 Task: https://www.devboxer.com/task/a7f1c718-af9c-4e64-a005-865c381eb922