Skip to content

fix(auth): stop beforeAuthStateChanged from holding the app unstable - #3770

Open
armando-navarro wants to merge 1 commit into
angular:mainfrom
armando-navarro:a30-before-auth-state-changed
Open

armando-navarro wants to merge 1 commit into
angular:mainfrom
armando-navarro:a30-before-auth-state-changed

Conversation

@armando-navarro

Copy link
Copy Markdown
Collaborator

Fixes #3748

Restores beforeAuthStateChanged: { blockUntilFirst: false }, which #3590 added and #3613 dropped without comment.

Changes

  • @angular/fire/auth wraps beforeAuthStateChanged with blockUntilFirst set to true, so registering the hook adds a pending task that clears only when the callback first runs. Firebase runs this callback only on a sign-in or sign-out, so for a visitor who does neither, the app never becomes stable.
    • In the browser, ApplicationRef.whenStable() never resolves.
    • When the hook is also registered on the server, ng build fails during route extraction, and a server that renders per request never responds.
  • With the override, the callback still runs inside Angular's zone and injection context, and its returned promise still reaches Firebase, so a rejection still cancels the sign-in.
    • One other difference: a call outside an injection context now logs its per-call warning only at the verbose log level, as onMessage does.
  • Adding more injector safety #3590 added the override with the note "beforeAuthStateChanged should not block". zone log verbosity #3613 removed it at the spot where it added log-level overrides, and none of the issues zone log verbosity #3613 fixed involve this function, so the removal looks accidental.
  • docs/auth.md and the sample keep importing beforeAuthStateChanged from firebase/auth until a release carries this fix.

Verification

On an Angular 21.2 server-rendered app, comparing 21.0.0-rc.1 with a build of this branch:

  • Hook registered on the server: ng build on rc.1 fails after 34 seconds with Routes extraction was aborted. TimeoutError. With this branch it succeeds.
  • Hook registered on the server only while answering a request, with every route rendered per request: each request to rc.1 got no response within 60 seconds. With this branch, each returned a server-rendered page in under 30 milliseconds.
  • The cookie sync from docs/auth.md, which registers the hook only in the browser: on rc.1 the app did not become stable within 10 seconds. With this branch it became stable after 25 milliseconds.
  • npm run test:node: 331 specs, 0 failures. npm run test:chrome-headless: 107 passed, 48 skipped.

AngularFire wrapped beforeAuthStateChanged so that registering the
hook added a pending task, cleared only when the callback first runs.
Firebase runs that callback only on a sign-in or sign-out, so for a
visitor who does neither the app never became stable. Registered on
the server, it failed ng build during route extraction and left
server-rendered requests without a response.

This restores the blockUntilFirst: false override from angular#3590, which
angular#3613 dropped without comment while adding log-level overrides next
to it. The callback still runs inside Angular's zone and injection
context, and its returned promise still reaches Firebase, so a
rejection still cancels the sign-in. A call outside an injection
context now logs its per-call warning only at the verbose level, as
onMessage does.

Fixes angular#3748
@armando-navarro armando-navarro added bump: patch comp: auth Authentication (src/auth). comp: build/pipeline Build, bundling, packaging, release pipeline. comp: ssr Server-side rendering, hydration, @angular/ssr interop. comp: zones Change detection / zone.js / zoneless. type: bug Defect: expected behavior doesn't happen. labels Sep 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bump: patch comp: auth Authentication (src/auth). comp: build/pipeline Build, bundling, packaging, release pipeline. comp: ssr Server-side rendering, hydration, @angular/ssr interop. comp: zones Change detection / zone.js / zoneless. type: bug Defect: expected behavior doesn't happen.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

beforeAuthStateChanged imported from @angular/fire/auth makes ng build fail during route extraction

1 participant