[PR #8760] fix(client)!: restructure session fetch architecture #25096

Open
opened 2026-04-15 22:43:24 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/better-auth/better-auth/pull/8760
Author: @gustavovalverde
Created: 3/24/2026
Status: 🔄 Open

Base: mainHead: fix/client-session-stable-reference


📝 Commits (4)

  • 547dfef fix(client): preserve stable session references
  • 0032efb test(client): clarify post-focus fetch regression
  • 8482afe fix(client)!: restructure session fetch architecture
  • bd1f80a chore: add changeset for session fetch restructure

📊 Changes

9 files changed (+551 additions, -800 deletions)

View changed files

.changeset/restructure-session-fetch.md (+12 -0)
packages/better-auth/src/client/equality.test.ts (+141 -0)
packages/better-auth/src/client/equality.ts (+57 -0)
📝 packages/better-auth/src/client/index.ts (+1 -0)
📝 packages/better-auth/src/client/query.test.ts (+67 -0)
📝 packages/better-auth/src/client/query.ts (+32 -6)
📝 packages/better-auth/src/client/session-atom.ts (+155 -11)
📝 packages/better-auth/src/client/session-refresh.test.ts (+66 -688)
📝 packages/better-auth/src/client/session-refresh.ts (+20 -95)

📄 Description

Summary

Replaces the dual-path session fetch (useAuthQuery signal-driven + fetchSessionWithRefresh direct) with a single unified fetchSession() owned by the session atom. This eliminates the double-fetch on every window focus event and preserves stable object references across refetches.

Root cause

The client had two independent fetch paths for session data that didn't coordinate:

  • Path A (useAuthQuery): subscribed to $sessionSignal, fetched on every flip
  • Path B (fetchSessionWithRefresh): fetched directly on focus/poll/online events, then flipped $sessionSignal, triggering Path A to fire a second fetch

Bugs fixed

  • Double-fetch on every window focus event
  • Stale closure: refresh manager captured atom state before async fetch, potentially overwriting newer data
  • Destructive .off() cleanup in useAuthQuery killed ALL atom subscribers instead of just one
  • Reference instability causing unnecessary React re-renders on identical session data

BREAKING CHANGE: SessionRefreshOptions no longer accepts sessionAtom or $fetch; normalizeSessionResponse is no longer exported.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/better-auth/better-auth/pull/8760 **Author:** [@gustavovalverde](https://github.com/gustavovalverde) **Created:** 3/24/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `fix/client-session-stable-reference` --- ### 📝 Commits (4) - [`547dfef`](https://github.com/better-auth/better-auth/commit/547dfef047d98707b826a888e3219a2f648ac442) fix(client): preserve stable session references - [`0032efb`](https://github.com/better-auth/better-auth/commit/0032efbfdc4d755cada02dfe9643dea2751e09b3) test(client): clarify post-focus fetch regression - [`8482afe`](https://github.com/better-auth/better-auth/commit/8482afeb1f1dcb3b2214383a5dd13f4837290e35) fix(client)!: restructure session fetch architecture - [`bd1f80a`](https://github.com/better-auth/better-auth/commit/bd1f80ac4e1b29e82ad0e2c19ab44ccc60c95950) chore: add changeset for session fetch restructure ### 📊 Changes **9 files changed** (+551 additions, -800 deletions) <details> <summary>View changed files</summary> ➕ `.changeset/restructure-session-fetch.md` (+12 -0) ➕ `packages/better-auth/src/client/equality.test.ts` (+141 -0) ➕ `packages/better-auth/src/client/equality.ts` (+57 -0) 📝 `packages/better-auth/src/client/index.ts` (+1 -0) 📝 `packages/better-auth/src/client/query.test.ts` (+67 -0) 📝 `packages/better-auth/src/client/query.ts` (+32 -6) 📝 `packages/better-auth/src/client/session-atom.ts` (+155 -11) 📝 `packages/better-auth/src/client/session-refresh.test.ts` (+66 -688) 📝 `packages/better-auth/src/client/session-refresh.ts` (+20 -95) </details> ### 📄 Description ## Summary Replaces the dual-path session fetch (useAuthQuery signal-driven + fetchSessionWithRefresh direct) with a single unified `fetchSession()` owned by the session atom. This eliminates the double-fetch on every window focus event and preserves stable object references across refetches. ### Root cause The client had two independent fetch paths for session data that didn't coordinate: - **Path A** (`useAuthQuery`): subscribed to `$sessionSignal`, fetched on every flip - **Path B** (`fetchSessionWithRefresh`): fetched directly on focus/poll/online events, then flipped `$sessionSignal`, triggering Path A to fire a second fetch ### Bugs fixed - Double-fetch on every window focus event - Stale closure: refresh manager captured atom state before async fetch, potentially overwriting newer data - Destructive `.off()` cleanup in `useAuthQuery` killed ALL atom subscribers instead of just one - Reference instability causing unnecessary React re-renders on identical session data BREAKING CHANGE: `SessionRefreshOptions` no longer accepts `sessionAtom` or `$fetch`; `normalizeSessionResponse` is no longer exported. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-15 22:43:24 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#25096