diff --git a/.changeset/strong-schools-shine.md b/.changeset/strong-schools-shine.md new file mode 100644 index 00000000000..e0f0d7d1555 --- /dev/null +++ b/.changeset/strong-schools-shine.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Fixing redirect behavior when signing out from a multisession app with multple singed in accounts diff --git a/packages/clerk-js/src/core/__tests__/clerk.test.ts b/packages/clerk-js/src/core/__tests__/clerk.test.ts index f26a547947d..c0a59b39366 100644 --- a/packages/clerk-js/src/core/__tests__/clerk.test.ts +++ b/packages/clerk-js/src/core/__tests__/clerk.test.ts @@ -809,6 +809,42 @@ describe('Clerk singleton', () => { expect(sut.navigate).toHaveBeenCalledWith('/after-sign-out'); }); }); + + it('properly restores auth state from remaining sessions after multisession sign-out', async () => { + const mockClient = { + signedInSessions: [mockSession1, mockSession2], + sessions: [mockSession1, mockSession2], + destroy: mockClientDestroy, + lastActiveSessionId: '1', + }; + + mockSession1.remove = jest.fn().mockImplementation(() => { + mockClient.signedInSessions = mockClient.signedInSessions.filter(s => s.id !== '1'); + mockClient.sessions = mockClient.sessions.filter(s => s.id !== '1'); + return Promise.resolve(mockSession1); + }); + + mockClientFetch.mockReturnValue(Promise.resolve(mockClient)); + + const sut = new Clerk(productionPublishableKey); + sut.navigate = jest.fn(); + await sut.load(); + + expect(sut.session).toBe(mockSession1); + expect(sut.isSignedIn).toBe(true); + + await sut.signOut({ sessionId: '1' }); + + await waitFor(() => { + expect(mockSession1.remove).toHaveBeenCalled(); + expect(mockClientDestroy).not.toHaveBeenCalled(); + expect(sut.navigate).toHaveBeenCalledWith('/'); + }); + + expect(mockClient.lastActiveSessionId).toBe('2'); + expect(sut.session).toBe(mockSession2); + expect(sut.isSignedIn).toBe(true); + }); }); describe('.navigate(to)', () => { diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index b90343e8806..8c7db311286 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -531,8 +531,33 @@ export class Clerk implements ClerkInterface { await session?.remove(); + if (this.client && this.client.signedInSessions.length > 0) { + const nextSession = this.client.signedInSessions[0]; + if (nextSession) { + this.client.lastActiveSessionId = nextSession.id; + this.#setAccessors(nextSession); + this.#emit(); + } + } + if (shouldSignOutCurrent) { - await executeSignOut(); + const tracker = createBeforeUnloadTracker(this.#options.standardBrowser); + + eventBus.emit(events.UserSignOut, null); + + await tracker.track(async () => { + if (signOutCallback) { + await signOutCallback(); + } else { + await this.navigate(redirectUrl); + } + }); + + if (tracker.isUnloading()) { + return; + } + + await onAfterSetActive(); } };