fix(auth): make _notifyAllSubscribers non-blocking to prevent callback deadlocks#2016
fix(auth): make _notifyAllSubscribers non-blocking to prevent callback deadlocks#20167ttp wants to merge 1 commit intosupabase:masterfrom
Conversation
|
@7ttp Thanks for the PR |
|
This PR will re-introduce the SSR OAuth bug that #2039 fixes. The SSR callback is async: client.auth.onAuthStateChange(async (event) => {
await applyServerStorage({...})
}) With this PRs non-blocking approach, applyServerStorage won't complete before serverless functions return, causing the same cookie-setting failure as the original setTimeout issue. We need a different solution that:
Potential approaches:
|
|
hey @mandarini almost forgot about this, |
|
let's park it for now @7ttp ! I want to see how the internal discussion goes!! Thank you for ALL the help!!!!! 💚 |
|
Hows this @7ttp @mandarini ? Thanks |
Summary
Makes
_notifyAllSubscribersnon-blocking by removingawaiton subscriber callbacks. This prevents deadlocks when callbacks perform async operations that require the auth lock.Problem
When a subscriber callback in
onAuthStateChangeperforms async operations likegetUser()orgetSession(), a deadlock occurs:signInWithPassword) acquires lock via_acquireLock()await _notifyAllSubscribers()which awaits all callbacksgetUser()which tries to acquire the same lockgetUser()to wait for current operationgetUser()→ waits for lock → waits for callbackSolution
Remove
async/awaitfrom_notifyAllSubscribers. Callbacks fire synchronously, async callbacks run in background without blocking. Errors still caught and logged.Related
setTimeoutwrapper at one call site (exchangeCodeForSession). This fix makes_notifyAllSubscribersitself non-blocking, fixing all 20+ call sites.onAuthStateChangedoes not trigger intermittently, andrefreshSession/getUserhangs indefinitely supabase#41968