Skip to content

feat(react-query): add timeout cancellation support to QueriesHydration#1927

Merged
manudeli merged 5 commits intomainfrom
react-query/feat/QueriesHydration-cancel
Mar 18, 2026
Merged

feat(react-query): add timeout cancellation support to QueriesHydration#1927
manudeli merged 5 commits intomainfrom
react-query/feat/QueriesHydration-cancel

Conversation

@manudeli
Copy link
Member

@manudeli manudeli commented Mar 18, 2026

Co-authored by: @saengmotmi

Inspired by #1902 and #1904

Changes

  • Cancel all in-flight queries on any error (timeout, query failure, etc.) via cancelQueries. If queryFn forwards AbortSignal to fetch, the HTTP request is aborted immediately.
  • Fix typo in timeout error message (extra closing parenthesis)
  • Simplify createTimeoutController
  • Add 7 test cases per package (v4/v5), 100% coverage

Overview

PR Checklist

  • I did below actions if need
  1. I read the Contributing Guide
  2. I added documents and tests.

Cancel in-flight queries when timeout occurs, leveraging React Query's
built-in AbortSignal. The `timeout` prop now accepts either a number
(cancel enabled by default) or an object `{ ms, cancel }` for opt-out.

Inspired by #1902 and #1904.

Co-Authored-By: saengmotmi <saengmotmi@users.noreply.github.com>
@coauthors
Copy link

coauthors bot commented Mar 18, 2026

People can be co-author:

Candidate Reasons Count Add this as commit message
@Copilot #1927 (comment) #1927 (comment) #1927 (comment) #1927 (comment) 4 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@manudeli #1927 (comment) #1927 2 Co-authored-by: manudeli <61593290+manudeli@users.noreply.github.com>
@saengmotmi #1927 (comment) 1 Co-authored-by: saengmotmi <35240142+saengmotmi@users.noreply.github.com>
@gwansikk #1927 (review) 1 Co-authored-by: gwansikk <39869096+gwansikk@users.noreply.github.com>

@changeset-bot
Copy link

changeset-bot bot commented Mar 18, 2026

🦋 Changeset detected

Latest commit: cfd0e1f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 6 packages
Name Type
@suspensive/react-query Minor
@suspensive/react-query-4 Minor
@suspensive/react-query-5 Minor
@suspensive/react Minor
@suspensive/jotai Minor
@suspensive/codemods Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel
Copy link
Contributor

vercel bot commented Mar 18, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
suspensive-next-streaming-react-query Ready Ready Preview, Comment Mar 18, 2026 8:15am
v2.suspensive.org Ready Ready Preview, Comment Mar 18, 2026 8:15am
v3.suspensive.org Ready Ready Preview, Comment Mar 18, 2026 8:15am
visualization.suspensive.org Ready Ready Preview, Comment Mar 18, 2026 8:15am

Request Review

@github-actions
Copy link
Contributor

github-actions bot commented Mar 18, 2026

Size Change: +66 B (+0.11%)

Total Size: 60.1 kB

Filename Size Change
packages/react-query-4/dist/QueriesHydration.cjs 1.66 kB +18 B (+1.1%)
packages/react-query-4/dist/QueriesHydration.mjs 1.56 kB +15 B (+0.97%)
packages/react-query-5/dist/QueriesHydration.cjs 1.66 kB +18 B (+1.1%)
packages/react-query-5/dist/QueriesHydration.mjs 1.56 kB +15 B (+0.97%)
ℹ️ View Unchanged
Filename Size
packages/jotai/dist/Atom.cjs 317 B
packages/jotai/dist/Atom.mjs 249 B
packages/jotai/dist/AtomValue.cjs 305 B
packages/jotai/dist/AtomValue.mjs 236 B
packages/jotai/dist/index.cjs 174 B
packages/jotai/dist/index.mjs 88 B
packages/jotai/dist/SetAtom.cjs 303 B
packages/jotai/dist/SetAtom.mjs 234 B
packages/next/dist/index.cjs 305 B
packages/next/dist/index.mjs 250 B
packages/next/dist/react-******.cjs 268 B
packages/next/dist/react-******.mjs 213 B
packages/react-query-4/dist/createGetQueryClient.cjs 1.09 kB
packages/react-query-4/dist/createGetQueryClient.mjs 1.01 kB
packages/react-query-4/dist/index.cjs 446 B
packages/react-query-4/dist/index.mjs 298 B
packages/react-query-4/dist/infiniteQueryOptions.cjs 357 B
packages/react-query-4/dist/infiniteQueryOptions.mjs 292 B
packages/react-query-4/dist/IsFetching.cjs 491 B
packages/react-query-4/dist/IsFetching.mjs 413 B
packages/react-query-4/dist/Mutation.cjs 412 B
packages/react-query-4/dist/Mutation.mjs 332 B
packages/react-query-4/dist/mutationOptions.cjs 187 B
packages/react-query-4/dist/mutationOptions.mjs 134 B
packages/react-query-4/dist/PrefetchInfiniteQuery.cjs 463 B
packages/react-query-4/dist/PrefetchInfiniteQuery.mjs 387 B
packages/react-query-4/dist/PrefetchQuery.cjs 453 B
packages/react-query-4/dist/PrefetchQuery.mjs 379 B
packages/react-query-4/dist/QueryClientConsumer.cjs 353 B
packages/react-query-4/dist/QueryClientConsumer.mjs 277 B
packages/react-query-4/dist/queryOptions.cjs 353 B
packages/react-query-4/dist/queryOptions.mjs 286 B
packages/react-query-4/dist/SuspenseInfiniteQuery.cjs 668 B
packages/react-query-4/dist/SuspenseInfiniteQuery.mjs 580 B
packages/react-query-4/dist/SuspenseQueries.cjs 569 B
packages/react-query-4/dist/SuspenseQueries.mjs 483 B
packages/react-query-4/dist/SuspenseQuery.cjs 654 B
packages/react-query-4/dist/SuspenseQuery.mjs 568 B
packages/react-query-4/dist/usePrefetchInfiniteQuery.cjs 462 B
packages/react-query-4/dist/usePrefetchInfiniteQuery.mjs 395 B
packages/react-query-4/dist/usePrefetchQuery.cjs 452 B
packages/react-query-4/dist/usePrefetchQuery.mjs 388 B
packages/react-query-4/dist/useSuspenseInfiniteQuery.cjs 375 B
packages/react-query-4/dist/useSuspenseInfiniteQuery.mjs 305 B
packages/react-query-4/dist/useSuspenseQueries.cjs 368 B
packages/react-query-4/dist/useSuspenseQueries.mjs 299 B
packages/react-query-4/dist/useSuspenseQuery.cjs 365 B
packages/react-query-4/dist/useSuspenseQuery.mjs 298 B
packages/react-query-5/dist/createGetQueryClient.cjs 1.09 kB
packages/react-query-5/dist/createGetQueryClient.mjs 1.01 kB
packages/react-query-5/dist/index.cjs 438 B
packages/react-query-5/dist/index.mjs 294 B
packages/react-query-5/dist/infiniteQueryOptions.cjs 352 B
packages/react-query-5/dist/infiniteQueryOptions.mjs 286 B
packages/react-query-5/dist/IsFetching.cjs 445 B
packages/react-query-5/dist/IsFetching.mjs 366 B
packages/react-query-5/dist/Mutation.cjs 412 B
packages/react-query-5/dist/Mutation.mjs 332 B
packages/react-query-5/dist/mutationOptions.cjs 350 B
packages/react-query-5/dist/mutationOptions.mjs 284 B
packages/react-query-5/dist/PrefetchInfiniteQuery.cjs 466 B
packages/react-query-5/dist/PrefetchInfiniteQuery.mjs 391 B
packages/react-query-5/dist/PrefetchQuery.cjs 459 B
packages/react-query-5/dist/PrefetchQuery.mjs 383 B
packages/react-query-5/dist/QueryClientConsumer.cjs 351 B
packages/react-query-5/dist/QueryClientConsumer.mjs 276 B
packages/react-query-5/dist/queryOptions.cjs 347 B
packages/react-query-5/dist/queryOptions.mjs 281 B
packages/react-query-5/dist/SuspenseInfiniteQuery.cjs 668 B
packages/react-query-5/dist/SuspenseInfiniteQuery.mjs 580 B
packages/react-query-5/dist/SuspenseQueries.cjs 585 B
packages/react-query-5/dist/SuspenseQueries.mjs 498 B
packages/react-query-5/dist/SuspenseQuery.cjs 645 B
packages/react-query-5/dist/SuspenseQuery.mjs 558 B
packages/react-query-5/dist/usePrefetchInfiniteQuery.cjs 367 B
packages/react-query-5/dist/usePrefetchInfiniteQuery.mjs 300 B
packages/react-query-5/dist/usePrefetchQuery.cjs 364 B
packages/react-query-5/dist/usePrefetchQuery.mjs 294 B
packages/react-query-5/dist/useSuspenseInfiniteQuery.cjs 368 B
packages/react-query-5/dist/useSuspenseInfiniteQuery.mjs 299 B
packages/react-query-5/dist/useSuspenseQueries.cjs 363 B
packages/react-query-5/dist/useSuspenseQueries.mjs 294 B
packages/react-query-5/dist/useSuspenseQuery.cjs 359 B
packages/react-query-5/dist/useSuspenseQuery.mjs 292 B
packages/react-query/dist/index.cjs 383 B
packages/react-query/dist/index.mjs 201 B
packages/react-query/dist/v4.cjs 383 B
packages/react-query/dist/v4.mjs 201 B
packages/react-query/dist/v5.cjs 383 B
packages/react-query/dist/v5.mjs 201 B
packages/react/dist/ClientOnly.cjs 606 B
packages/react/dist/ClientOnly.mjs 536 B
packages/react/dist/DefaultProps.cjs 968 B
packages/react/dist/DefaultProps.mjs 901 B
packages/react/dist/Delay.cjs 985 B
packages/react/dist/Delay.mjs 906 B
packages/react/dist/ErrorBoundary.cjs 2.1 kB
packages/react/dist/ErrorBoundary.mjs 2.04 kB
packages/react/dist/ErrorBoundaryGroup.cjs 1.11 kB
packages/react/dist/ErrorBoundaryGroup.mjs 1.04 kB
packages/react/dist/index.cjs 342 B
packages/react/dist/index.mjs 229 B
packages/react/dist/lazy.cjs 2.04 kB
packages/react/dist/lazy.mjs 1.98 kB
packages/react/dist/Suspense.cjs 801 B
packages/react/dist/Suspense.mjs 716 B
packages/react/dist/useIsClient.cjs 295 B
packages/react/dist/useIsClient.mjs 233 B

compressed-size-action

…e without timeout

Refactor the QueriesHydration component to ensure that queries are canceled when they fail due to errors, even if a timeout is not specified. The timeout handling has been simplified to accept only a number, removing the previous object structure. This change enhances the reliability of query cancellation in error scenarios.
…ng in QueriesHydration

Refactor the QueriesHydration component to consistently clear the timeoutController in both the catch block and the finally block. This change improves the reliability of query cancellation during error scenarios, ensuring that resources are properly released.
Refactor the QueriesHydration component to ensure the timeoutController is only created when a valid timeout value is provided. This change enhances the clarity of the timeout logic and ensures that the function signature for createTimeoutController only accepts a number, improving type safety.
Updated versioning for react-query packages to minor.
@manudeli manudeli requested a review from gwansikk March 18, 2026 08:19
@manudeli
Copy link
Member Author

@saengmotmi, could you review this Pull Request, please?

@saengmotmi
Copy link
Contributor

saengmotmi commented Mar 18, 2026

@manudeli I think it's much simple 👍

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds broader query-cancellation behavior to QueriesHydration so that any server-side fetch error (including timeout) triggers React Query cancellation for the provided query list, and extends test coverage for both v4 and v5 packages.

Changes:

  • Simplifies timeout controller creation and fixes the timeout error message formatting.
  • Cancels hydration queries via queryClient.cancelQueries(...) on any error path.
  • Adds multiple test cases verifying cancellation behavior (timeout, non-timeout error, skipSsrOnError modes) in both v4 and v5.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
packages/react-query-5/src/QueriesHydration.tsx Cancels queries on error and simplifies timeout controller creation/message.
packages/react-query-5/src/QueriesHydration.spec.tsx Adds tests asserting query cancellation across timeout/error/success cases.
packages/react-query-4/src/QueriesHydration.tsx Mirrors v5 behavior changes for cancellation + timeout controller simplification.
packages/react-query-4/src/QueriesHydration.spec.tsx Mirrors v5 test additions for v4 package.
.changeset/gorgeous-snails-beg.md Declares a minor release for affected packages.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

timeoutController?.clear()
} catch {
timeoutController?.clear()
queries.forEach((query) => void queryClient.cancelQueries(query))
timeoutController?.clear()
} catch {
timeoutController?.clear()
queries.forEach((query) => void queryClient.cancelQueries(query))
children: <div>children</div>,
})

// Promise.all waits for all, so timeout cancels all queries in the list
children: <div>children</div>,
})

// Promise.all waits for all, so timeout cancels all queries in the list
Copy link
Collaborator

@gwansikk gwansikk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

go go!

@manudeli manudeli merged commit 34607e4 into main Mar 18, 2026
20 checks passed
@manudeli manudeli deleted the react-query/feat/QueriesHydration-cancel branch March 18, 2026 12:18
manudeli pushed a commit that referenced this pull request Mar 19, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @suspensive/react-query@3.20.0

### Minor Changes

- [#1927](#1927)
[`34607e4`](34607e4)
Thanks [@manudeli](https://github.com/manudeli)! - feat(react-query):
add timeout cancellation support to QueriesHydration

### Patch Changes

- Updated dependencies
\[[`34607e4`](34607e4)]:
    -   @suspensive/react-query-4@3.20.0
    -   @suspensive/react-query-5@3.20.0

## @suspensive/react-query-4@3.20.0

### Minor Changes

- [#1927](#1927)
[`34607e4`](34607e4)
Thanks [@manudeli](https://github.com/manudeli)! - feat(react-query):
add timeout cancellation support to QueriesHydration

## @suspensive/react-query-5@3.20.0

### Minor Changes

- [#1927](#1927)
[`34607e4`](34607e4)
Thanks [@manudeli](https://github.com/manudeli)! - feat(react-query):
add timeout cancellation support to QueriesHydration

## @suspensive/codemods@3.20.0



## @suspensive/jotai@3.20.0



## @suspensive/react@3.20.0

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants