From 3984c90a292b36ba6bbb7fcc5be5f16e028c1fea Mon Sep 17 00:00:00 2001 From: nehaprasad-dev Date: Fri, 29 May 2026 16:33:48 +0530 Subject: [PATCH 1/2] feat(browser): default browserSessionIntegration lifecycle to page --- .../suites/sessions/initial-scope/init.js | 1 + .../suites/sessions/page-lifecycle/init.js | 1 - .../suites/sessions/page-lifecycle/test.ts | 4 ++-- .../suites/sessions/route-lifecycle/init.js | 1 + .../suites/sessions/route-lifecycle/test.ts | 2 +- .../suites/sessions/start-session/init.js | 9 +++++++++ .../suites/sessions/user/init.js | 9 +++++++++ packages/browser/src/integrations/browsersession.ts | 10 ++++------ 8 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 dev-packages/browser-integration-tests/suites/sessions/start-session/init.js create mode 100644 dev-packages/browser-integration-tests/suites/sessions/user/init.js diff --git a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js index fc0eb65be166..2be1d55b5782 100644 --- a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js +++ b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js @@ -5,6 +5,7 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '0.1', + integrations: [Sentry.browserSessionIntegration({ lifecycle: 'route' })], initialScope: { user: { id: '1337', diff --git a/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/init.js b/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/init.js index 6452dbf515f9..af2df91a7ceb 100644 --- a/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/init.js +++ b/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/init.js @@ -5,5 +5,4 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '0.1', - integrations: [Sentry.browserSessionIntegration({ lifecycle: 'page' })], }); diff --git a/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/test.ts b/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/test.ts index 869b194031cf..d98c8b377a4c 100644 --- a/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/test.ts +++ b/dev-packages/browser-integration-tests/suites/sessions/page-lifecycle/test.ts @@ -8,7 +8,7 @@ import { waitForSession, } from '../../../utils/helpers'; -sentryTest('starts a session on pageload with page lifecycle.', async ({ getLocalTestUrl, page }) => { +sentryTest('starts a session on pageload with page lifecycle (default).', async ({ getLocalTestUrl, page }) => { const url = await getLocalTestUrl({ testDir: __dirname }); const sessionPromise = waitForSession(page, s => !!s.init && s.status === 'ok'); @@ -32,7 +32,7 @@ sentryTest('starts a session on pageload with page lifecycle.', async ({ getLoca }); sentryTest( - "doesn't start a new session on pushState navigation with page lifecycle.", + "doesn't start a new session on pushState navigation with page lifecycle (default).", async ({ getLocalTestUrl, page }) => { const url = await getLocalTestUrl({ testDir: __dirname }); diff --git a/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/init.js b/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/init.js index af2df91a7ceb..18ea8864bc65 100644 --- a/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/init.js +++ b/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/init.js @@ -5,4 +5,5 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '0.1', + integrations: [Sentry.browserSessionIntegration({ lifecycle: 'route' })], }); diff --git a/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/test.ts b/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/test.ts index 05f10146f3f5..1985ec71196a 100644 --- a/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/test.ts +++ b/dev-packages/browser-integration-tests/suites/sessions/route-lifecycle/test.ts @@ -3,7 +3,7 @@ import { sentryTest } from '../../../utils/fixtures'; import { waitForSession } from '../../../utils/helpers'; sentryTest( - 'should start new sessions on pushState navigation with route lifecycle (default).', + 'should start new sessions on pushState navigation with route lifecycle.', async ({ getLocalTestUrl, page }) => { const url = await getLocalTestUrl({ testDir: __dirname }); diff --git a/dev-packages/browser-integration-tests/suites/sessions/start-session/init.js b/dev-packages/browser-integration-tests/suites/sessions/start-session/init.js new file mode 100644 index 000000000000..18ea8864bc65 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/sessions/start-session/init.js @@ -0,0 +1,9 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '0.1', + integrations: [Sentry.browserSessionIntegration({ lifecycle: 'route' })], +}); diff --git a/dev-packages/browser-integration-tests/suites/sessions/user/init.js b/dev-packages/browser-integration-tests/suites/sessions/user/init.js new file mode 100644 index 000000000000..18ea8864bc65 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/sessions/user/init.js @@ -0,0 +1,9 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '0.1', + integrations: [Sentry.browserSessionIntegration({ lifecycle: 'route' })], +}); diff --git a/packages/browser/src/integrations/browsersession.ts b/packages/browser/src/integrations/browsersession.ts index c386ef1fcb00..247c64dfe7ba 100644 --- a/packages/browser/src/integrations/browsersession.ts +++ b/packages/browser/src/integrations/browsersession.ts @@ -7,13 +7,11 @@ interface BrowserSessionOptions { /** * Controls the session lifecycle - when new sessions are created. * - * - `'route'`: A session is created on page load and on every navigation. - * This is the default behavior. * - `'page'`: A session is created once when the page is loaded. Session is not - * updated on navigation. This is useful for webviews or single-page apps where - * URL changes should not trigger new sessions. + * updated on navigation. This is the default behavior. + * - `'route'`: A session is created on page load and on every navigation. * - * @default 'route' + * @default 'page' */ lifecycle?: 'route' | 'page'; } @@ -25,7 +23,7 @@ interface BrowserSessionOptions { * Note: In order for session tracking to work, you need to set up Releases: https://docs.sentry.io/product/releases/ */ export const browserSessionIntegration = defineIntegration((options: BrowserSessionOptions = {}) => { - const lifecycle = options.lifecycle ?? 'route'; + const lifecycle = options.lifecycle ?? 'page'; return { name: 'BrowserSession' as const, From 3941f54d81f667793fe8d98ae4ce579e5b2b5015 Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Tue, 21 Jul 2026 15:43:42 +0200 Subject: [PATCH 2/2] update unit tests --- packages/browser/test/integrations/browsersession.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/browser/test/integrations/browsersession.test.ts b/packages/browser/test/integrations/browsersession.test.ts index 7d42fb7e3715..3a2c289e99db 100644 --- a/packages/browser/test/integrations/browsersession.test.ts +++ b/packages/browser/test/integrations/browsersession.test.ts @@ -147,8 +147,7 @@ describe('browserSessionIntegration', () => { }); it('does not re-send the navigation session when navigation happens before the deferred initial capture', () => { - // Default lifecycle is 'route', which also registers the navigation handler. - setupBrowserSession(); + setupBrowserSession({ lifecycle: 'route' }); // The initial capture is deferred, so nothing is sent synchronously. expect(SentryCore.captureSession).not.toHaveBeenCalled(); @@ -165,7 +164,7 @@ describe('browserSessionIntegration', () => { }); it('still captures a session on navigation that happens after the initial capture', () => { - setupBrowserSession(); + setupBrowserSession({ lifecycle: 'route' }); vi.runAllTimers(); expect(SentryCore.captureSession).toHaveBeenCalledTimes(1);