fix(react): prevent double resume in React StrictMode#11509
Open
jacobwisniewski wants to merge 3 commits intovercel:mainfrom
Open
fix(react): prevent double resume in React StrictMode#11509jacobwisniewski wants to merge 3 commits intovercel:mainfrom
jacobwisniewski wants to merge 3 commits intovercel:mainfrom
Conversation
763f0a4 to
7e31534
Compare
lgrammel
reviewed
Jan 7, 2026
Collaborator
|
please add a patch changeset |
Collaborator
|
for future PRs please try to follow our PR description template |
Add a ref guard to prevent resumeStream() from being called twice when React StrictMode double-invokes effects during development. This fixes an issue where refreshing the page mid-stream would cause duplicate stream requests, leading to: - Duplicated/repeated text in the UI - Multiple concurrent stream consumers - Inconsistent message state The fix adds a hasResumedRef that tracks whether resume has already been attempted, preventing the second invocation from making another request. Fixes vercel#9610
7420ac1 to
806d9d4
Compare
Author
Done!
Will do! |
lgrammel
reviewed
Jan 8, 2026
Comment on lines
+113
to
120
| const hasResumedRef = useRef(false); | ||
|
|
||
| useEffect(() => { | ||
| if (resume) { | ||
| if (resume && !hasResumedRef.current) { | ||
| hasResumedRef.current = true; | ||
| chatRef.current.resumeStream(); | ||
| } | ||
| }, [resume, chatRef]); |
Collaborator
There was a problem hiding this comment.
does the ref need to be reset to false? maybe i missing something here, want to make sure this works on the several resumes not just the 1st one
1 task
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.
Background
When using
useChatwithresume: true, refreshing the page mid-stream causes duplicate stream requests because React StrictMode runs effects twice (mount → unmount → mount). The current implementation has no protection against this:This leads to:
onDatacallbacks being called twice per server writeSummary
This PR adds a ref guard to prevent
resumeStream()from being called twice when React StrictMode double-invokes effects during development.Add a
hasResumedRefthat tracks whether resume has already been attempted:Testing
Added a test case that renders the component in
<React.StrictMode>and verifies only one resume request is made despite effects running twice.Related Issues
Fixes #9610