From ff627037a95fc3884e84efd1dca99343f15bdcfc Mon Sep 17 00:00:00 2001 From: Jacek Date: Fri, 31 Oct 2025 11:08:04 -0500 Subject: [PATCH 1/5] feat(clerk-js): Add debug logging to session update when offline --- .../clerk-js/src/core/auth/AuthCookieService.ts | 11 +++++++++++ packages/clerk-js/src/core/clerk.ts | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/packages/clerk-js/src/core/auth/AuthCookieService.ts b/packages/clerk-js/src/core/auth/AuthCookieService.ts index 7237c61c45d..cf94227d426 100644 --- a/packages/clerk-js/src/core/auth/AuthCookieService.ts +++ b/packages/clerk-js/src/core/auth/AuthCookieService.ts @@ -1,3 +1,4 @@ +import { isValidBrowserOnline } from '@clerk/shared/browser'; import type { createClerkEventBus } from '@clerk/shared/clerkEventBus'; import { clerkEvents } from '@clerk/shared/clerkEventBus'; import type { createCookieHandler } from '@clerk/shared/cookie'; @@ -6,6 +7,8 @@ import { is4xxError, isClerkAPIResponseError, isClerkRuntimeError, isNetworkErro import type { Clerk, InstanceType } from '@clerk/shared/types'; import { noop } from '@clerk/shared/utils'; +import { debugLogger } from '@/utils/debug'; + import { clerkMissingDevBrowserJwt } from '../errors'; import { eventBus, events } from '../events'; import type { FapiClient } from '../fapiClient'; @@ -174,6 +177,14 @@ export class AuthCookieService { return; } + if (!token && !isValidBrowserOnline()) { + debugLogger.warn( + 'Removing session cookie while offline', + { sessionId: this.clerk.session?.id }, + 'authCookieService', + ); + } + this.setActiveContextInStorage(); return token ? this.sessionCookie.set(token) : this.sessionCookie.remove(); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 75d2a2b28c7..1d9f44f5258 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1380,6 +1380,13 @@ export class Clerk implements ClerkInterface { // getToken syncs __session and __client_uat to cookies using events.TokenUpdate dispatched event. const token = await newSession?.getToken(); if (!token) { + if (!isValidBrowserOnline()) { + debugLogger.warn( + 'Token is null when setting active session (offline)', + { sessionId: newSession?.id }, + 'clerk', + ); + } eventBus.emit(events.TokenUpdate, { token: null }); } @@ -2380,6 +2387,13 @@ export class Clerk implements ClerkInterface { this.#setAccessors(session); // A client response contains its associated sessions, along with a fresh token, so we dispatch a token update event. + if (!this.session?.lastActiveToken && !isValidBrowserOnline()) { + debugLogger.warn( + 'No last active token when updating client (offline)', + { sessionId: this.session?.id }, + 'clerk', + ); + } eventBus.emit(events.TokenUpdate, { token: this.session?.lastActiveToken }); } From c95a658a8efbea9594642105c423dbac70259c1a Mon Sep 17 00:00:00 2001 From: Jacek Date: Fri, 31 Oct 2025 11:09:06 -0500 Subject: [PATCH 2/5] changeset --- .changeset/every-chefs-mix.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/every-chefs-mix.md diff --git a/.changeset/every-chefs-mix.md b/.changeset/every-chefs-mix.md new file mode 100644 index 00000000000..012b67a0644 --- /dev/null +++ b/.changeset/every-chefs-mix.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Add debug logging to session update flows when browser is offline From 58dc9f231032c9f09ad0f56a2489082b1584a115 Mon Sep 17 00:00:00 2001 From: Jacek Date: Fri, 31 Oct 2025 11:12:54 -0500 Subject: [PATCH 3/5] wip --- packages/clerk-js/src/core/auth/AuthCookieService.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/clerk-js/src/core/auth/AuthCookieService.ts b/packages/clerk-js/src/core/auth/AuthCookieService.ts index cf94227d426..51268dc6bcd 100644 --- a/packages/clerk-js/src/core/auth/AuthCookieService.ts +++ b/packages/clerk-js/src/core/auth/AuthCookieService.ts @@ -178,11 +178,7 @@ export class AuthCookieService { } if (!token && !isValidBrowserOnline()) { - debugLogger.warn( - 'Removing session cookie while offline', - { sessionId: this.clerk.session?.id }, - 'authCookieService', - ); + debugLogger.warn('Removing session cookie (offline)', { sessionId: this.clerk.session?.id }, 'authCookieService'); } this.setActiveContextInStorage(); From 7b5e340bc8954a2ce47c17a287a0bba65a6337c5 Mon Sep 17 00:00:00 2001 From: Jacek Date: Fri, 31 Oct 2025 11:17:25 -0500 Subject: [PATCH 4/5] additional log when fetch fails while offline --- packages/clerk-js/src/core/resources/Base.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/clerk-js/src/core/resources/Base.ts b/packages/clerk-js/src/core/resources/Base.ts index a7d1461aa10..cc1b5db9819 100644 --- a/packages/clerk-js/src/core/resources/Base.ts +++ b/packages/clerk-js/src/core/resources/Base.ts @@ -8,6 +8,8 @@ import type { DeletedObjectJSON, } from '@clerk/shared/types'; +import { debugLogger } from '@/utils/debug'; + import { clerkMissingFapiClientInResources } from '../errors'; import type { FapiClient, FapiRequestInit, FapiResponse, FapiResponseJSON, HTTPMethod } from '../fapiClient'; import { FraudProtection } from '../fraudProtection'; @@ -98,7 +100,14 @@ export abstract class BaseResource { code: 'network_error', }); } else if (!isValidBrowserOnline()) { - console.warn(e); + debugLogger.warn( + 'Network request failed while offline, returning null', + { + method: requestInit.method, + path: requestInit.path, + }, + 'baseResource', + ); return null; } else { throw e; From 8cf67b08a4c128a844f67aafa2fc61cd4b1507c6 Mon Sep 17 00:00:00 2001 From: Jacek Date: Fri, 31 Oct 2025 11:28:15 -0500 Subject: [PATCH 5/5] fix test --- packages/clerk-js/src/core/resources/__tests__/Token.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/clerk-js/src/core/resources/__tests__/Token.test.ts b/packages/clerk-js/src/core/resources/__tests__/Token.test.ts index 066f10b907f..aed2f6f2863 100644 --- a/packages/clerk-js/src/core/resources/__tests__/Token.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/Token.test.ts @@ -2,6 +2,7 @@ import type { InstanceType } from '@clerk/shared/types'; import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest'; import { mockFetch, mockNetworkFailedFetch } from '@/test/core-fixtures'; +import { debugLogger } from '@/utils/debug'; import { SUPPORTED_FAPI_VERSION } from '../../constants'; import { createFapiClient } from '../../fapiClient'; @@ -50,7 +51,7 @@ describe('Token', () => { writable: true, value: false, }); - warnSpy = vi.spyOn(console, 'warn').mockReturnValue(); + warnSpy = vi.spyOn(debugLogger, 'warn').mockReturnValue(); }); afterEach(() => {