Skip to content

fix(jsx): cancel in-flight requests and prevent memory leaks in useAsync - #3732

Open
Unnati1007 wants to merge 1 commit into
Karanjot786:mainfrom
Unnati1007:fix/issue-3731-use-async-cleanup
Open

fix(jsx): cancel in-flight requests and prevent memory leaks in useAsync#3732
Unnati1007 wants to merge 1 commit into
Karanjot786:mainfrom
Unnati1007:fix/issue-3731-use-async-cleanup

Conversation

@Unnati1007

Copy link
Copy Markdown
Contributor

Description

This PR fixes memory leaks and race conditions inside the useAsync hook under @termuijs/jsx. An active cleanup step was added to the useEffect block to discard in-flight state updates when dependencies change or when the component unmounts. In addition, the useCallback dependency array was emptied to keep the refetch function identity stable.

Related Issue

Closes #3731

Which package(s)?

@termuijs/jsx

Type of Change

  • 🐛 Bug fix (type:bug)
  • ✨ Feature (type:feature)
  • 📝 Docs (type:docs)
  • 🧪 Tests (type:testing)
  • ♻️ Refactor (type:refactor)
  • 🎨 Design / UX (type:design)
  • ♿ Accessibility (type:accessibility)
  • ⚡ Performance (type:performance)
  • 🔧 DevOps / CI (type:devops)
  • 🔒 Security (type:security)

Checklist

  • ⭐ You starred the repo. The needs-star check blocks your merge otherwise.
  • Tests pass locally: bun vitest run
  • Build passes: bun run build
  • Typecheck passes: bun run typecheck
  • You read CONTRIBUTING.md.
  • Your PR title follows type: short description.
  • Widget state mutators call markDirty() (if your change affects rendering).
  • No new any types without an inline comment explaining why.
  • No unrelated refactors bundled into this PR.

GSSoC 2026 Participation

  • You are a GSSoC 2026 contributor.
  • Your GSSoC profile: https://gssoc.girlscript.org/profile/Unnati1007

Screenshots / Recordings (UI changes)

N/A (This is a non-visual background hooks lifecycle fix).

Notes for the Reviewer

  • Cleaned up active async version identifiers in useEffect's return function to avoid updating state on a destroyed fiber.
  • Discarded stale request triggers by stabilizing the refetch identity across renders.

@github-actions github-actions Bot added type:bug +10 pts. Bug fix. area:jsx @termuijs/jsx and removed type:bug +10 pts. Bug fix. labels Aug 10, 2026
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@Unnati1007, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 19 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: a46ef2d2-e3f1-4998-8f7e-1295f3fd8477

📥 Commits

Reviewing files that changed from the base of the PR and between e4472c9 and 0163117.

📒 Files selected for processing (1)
  • packages/jsx/src/hooks.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Unnati1007

Copy link
Copy Markdown
Contributor Author

@Karanjot786 Please review the PR, do lemme know if any changes needed and merge it under GSSoC'26

@Karanjot786

Copy link
Copy Markdown
Owner

Blocking — cancellation is faked. hooks.ts:769-792 only adds a stale-response version guard; there is no AbortController/AbortSignal, and asyncFn never receives a signal to pass to fetch, so the request runs to completion — same pattern as #2543. Thread a real AbortSignal into asyncFn.

@Karanjot786 Karanjot786 added the quality:needs-work Needs changes before merge. label Aug 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:jsx @termuijs/jsx quality:needs-work Needs changes before merge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(jsx): Stale promise resolutions and lack of cancellation in useAsync hook

2 participants